diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..541f92c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +# Add any directories, files, or patterns you don't want to be tracked by version control \ No newline at end of file diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..e69de29 diff --git a/api/.htaccess b/api/.htaccess new file mode 100644 index 0000000..abf6332 --- /dev/null +++ b/api/.htaccess @@ -0,0 +1,12 @@ +ErrorDocument 404 index.php + +# SetEnv CI_ENV production + + + RewriteEngine On + RewriteCond %{REQUEST_URI} ^/system.* + RewriteRule ^(.*)$ index.php?/$1 [L] + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^(.+)$ index.php?/$1 [L] + diff --git a/api/README.MD b/api/README.MD new file mode 100644 index 0000000..55abdfc --- /dev/null +++ b/api/README.MD @@ -0,0 +1,206 @@ +Esta e uma tradução do Readme do projeto [CodeIgniter Rest Server](https://github.com/chriskacerguis/codeigniter-restserver/) +de [Chris Kacerguis](https://github.com/chriskacerguis) + +A tradução foi feita por [Daniel Coder](https://github.com/netofire) nesse fork [aqui](https://github.com/netofire/codeigniter-restserver/blob/master/README_pt_BR.MD) + +# CodeIgniter Rest Server + +Implementação completa de um servidor RESTful para CodeIgniter usando uma biblioteca, um arquivo config e um controller. + +## Requisitos + +1. PHP 5.4+ +2. CodeIgniter 3.0+ + +_Nota: para suporte à versão 1.7.x baixe a v2.2 da aba de Downloads_ + +## Atualização importante na vs. 4.0.0 + +Note que a versão 4.0.0 está em andamento, e é considerada uma versão "breaking change". Como o CI 3.1.0 agora tem suporte nativo ao Composer, esta biblioteca está sendo criada baseada no composer. + +Dê uma olhada no branch "development" e veja o que está acontecendo. + +## Instalação + +Arraste os arquivos **application/libraries/Format.php** e **application/libraries/REST_Controller.php** para dentro do diretório da sua aplicação. Para usar `require_once` no topo dos seus controllers pra carregá-los dentro do escopo. Adicionalmente, copie o arquivo **rest.php** de **application/config** para o diretório de configuração de sua aplicação. + +## Tratando Requisições + +Quando seu controller extende de `REST_Controller`, os nomes dos métodos vão ser sufixados com o método HTTP usado para acessar a requisição. Se você está fazendo uma chamada HTTP `GET` para `/books`, por exemplo, será chamado o método `Books#index_get()`. + +Isso permite a você implementar uma interface RESTful facilmente: + +```php +class Books extends REST_Controller +{ + public function index_get() + { + // Display all books + } + + public function index_post() + { + // Create a new book + } +} +``` + +`REST_Controller` também suporta os métodos `PUT` e `DELETE`, permitindo a você implementar uma real interface RESTful. + + +Acessar parâmetros também é fácil. Apenas use o nome do método HTTP como um método: + +```php +$this->get('blah'); // parâmetro GET +$this->post('blah'); // parâmetro POST +$this->put('blah'); // parâmetro PUT +``` + +A especificação HTTP para requisições do tipo DELETE impede o uso de parâmetros. Para estas requisições, você pode adicionar itens à URL: + +```php +public function index_delete($id) +{ + $this->response([ + 'returned from delete:' => $id, + ]); +} +``` + +Se parâmetros de consulta (query strings) são passados através da URL, independentemente de ser de uma requisição GET, podem ser obtidos através do método `query`: + +```php +$this->query('blah'); // Query param +``` + +## Content Types + +`REST_Controller` suporta vários tipos de formato request/response, incluindo XML, JSON and PHP serializado. Por padrão, a classe vai checar a URL e procurar por um formato seja como uma extensão ou um segmento separado. + +Isso significa que suas URLs podem ser assim: +``` +http://example.com/books.json +http://example.com/books?format=json +``` + +Isso pode ser ruim de trabalhar junto com segmentos URI, então, a recomendado usar um cabeçalho HTTP `Accept`: + +```bash +$ curl -H "Accept: application/json" http://example.com +``` + +Qualquer resposta (response) que você faça na classe (veja [responses](#responses) para mais detalhes) serão serializadas no formato solicitado. + +## Respostas (responses) + +A classe provê um método `response()` que permite retornar os dados no formato solicitado pelo usuário. + +Retornar um objeto / array / string / etc é simples: + +```php +public function index_get() +{ + $this->response($this->db->get('books')->result()); +} +``` + +Isto automaticamente vai retornar uma resposta `HTTP 200 OK`. Você pode especificar o status HTTP no segundo parâmetro: + +```php +public function index_post() + { + // ...cria um novo livro + $this->response($book, 201); // Envia HTTP 201 Created + } +``` + +Se você não especificar um código de resposta e o resultado retornado for avaliado como `== FALSE` (um array ou string vazia, por exemplo), o código de resposta será automaticamente setado para `404 Not Found`: + +```php +$this->response([]); // HTTP 404 Not Found +``` + +## Suporte multi-idioma + +Se sua aplicação utiliza arquivos de idioma para dar suporte a múltiplas localidades, a classe `REST_Controller` vai automaticamente analisar o cabeçalho HTTP `Accept-Language` e prover os idiomas(s) nas actions. Esta informação pode ser encontrada no objeto `$this->response->lang`: + +```php +public function __construct() +{ + parent::__construct(); + + if (is_array($this->response->lang)) + { + $this->load->language('application', $this->response->lang[0]); + } + else + { + $this->load->language('application', $this->response->lang); + } +} +``` + +## Autenticação + +Esta classe também implementa suporte para autenticação básica via HTTP e/ou a autenticação digest HTTP (mais segura). + +Você pode habilitar a autenticação básica setando `$config['rest_auth']` para `'basic'`. A diretiva `$config['rest_valid_logiVns']` serve para você setar os usernames e passwords habilitados a acessar seu sistema. A classe vai automaticamente enviar todos os cabeçalhos corretos pra abrir o diálogo de autenticação: + +```php +$config['rest_valid_logins'] = ['username' => 'password', 'outra_pessoa' => 'seguro123']; +``` + +Habilitar a autenticação do tipo 'digest' é igualmente simples. Configure os logins permitidos no arquivo de config, como acima e sete `$config['rest_auth']` para `'digest'`. A classe vai automaticamente enviar os cabeçalhos para habilitar a autenticação 'digest'. + +Se você está amarrando esta biblioteca em um endpoint AJAX, onde os clientes autenticam com sessões PHP, você provavelmente não vai gostar nem da autenticação básica nem da 'digest'. Neste caso, você pode dizer para a biblioteca REST qual variável de sessão PHP deve ser checada. Se a variável existir, o usuário está autorizado. É responsabilidade da sua aplicação setar tal variável. Vocẽ pode definir a variável em ``$config['auth_source']``. Então, dizer à biblioteca para usar uma variável de sessão, setando ``$config['rest_auth']`` para ``session``. + +Todos os três métodos de autenticação podem ficar mais seguros usando uma lista de IPs permitidos. Se você habilitar `$config['rest_ip_whitelist_enabled']` no seu arquivo de configuração, você pode setar uma lista de IPs permitidos. + +Qualquer cliente conectando à sua API será verificado usando o array de IPs. Se eles estiverem na lista, terão o acesso permitido. Caso contrário, não. A lista de Ips é uma string separada por vírgulas: + +```php +$config['rest_ip_whitelist'] = '123.456.789.0, 987.654.32.1'; +``` + +Seus IPs locais (`127.0.0.1` e `0.0.0.0`) são permitidos por padrão. + +## Chaves de API + +Em adição aos métodos de autenticação acima, a classe `REST_Controller` também suporta o uso de chaves API. Habilitar é simples. Habilite no seu arquivo **config/rest.php**: + +```php +$config['rest_enable_keys'] = TRUE; +``` + +Você vai precisar criar uma tabela de banco de dados para armazenar e acessar as chaves. `REST_Controller` vai automaticamente assumir que você possui uma tabela como esta: + +```sql +CREATE TABLE `keys` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `key` VARCHAR(40) NOT NULL, + `level` INT(2) NOT NULL, + `ignore_limits` TINYINT(1) NOT NULL DEFAULT '0', + `date_created` INT(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +``` + +A classe vai procurar por um cabeçalho HTTP com a chave da API a cada requisição. Uma chave inválida ou ausente irá resultar em um erro `HTTP 403 Forbidden`. + +Por padrão, o HTTP será `X-API-KEY`. Isto pode ser configurado no arquivo **config/rest.php**. + +```bash +$ curl -X POST -H "X-API-KEY: sua_chave_aqui" http://example.com/books +``` + +## Outra Documentação / Tutoriais + +* [NetTuts: Working with RESTful Services in CodeIgniter](http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/) + +## Contribuições + +Este projeto foi originalmente escrito por Phil Sturgeon, no entanto o seu envolvimento foi excluído visto que ele não estava mais usando-o. A partir de 20/11/2013 o desenvolvimento e suporte são feitos por Chris Kacerguis. + +Pull Requests são as melhores maneiras de consertar bugs e adicionar ferramentas. Eu sei que muitos de vocês usam, então por favor, contribua se você tem melhorias a serem feitas, e eu continuarei a realizar versões com o passar do tempo. + +[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://raw.githubusercontent.com/chriskacerguis/codeigniter-restserver/master/LICENSE) diff --git a/api/application/.htaccess b/api/application/.htaccess new file mode 100644 index 0000000..6c63ed4 --- /dev/null +++ b/api/application/.htaccess @@ -0,0 +1,6 @@ + + Require all denied + + + Deny from all + \ No newline at end of file diff --git a/api/application/cache/.htaccess b/api/application/cache/.htaccess new file mode 100644 index 0000000..6c63ed4 --- /dev/null +++ b/api/application/cache/.htaccess @@ -0,0 +1,6 @@ + + Require all denied + + + Deny from all + \ No newline at end of file diff --git a/api/application/cache/index.html b/api/application/cache/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/application/cache/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/config/autoload.php b/api/application/config/autoload.php new file mode 100644 index 0000000..ca068cd --- /dev/null +++ b/api/application/config/autoload.php @@ -0,0 +1,135 @@ + 'ua'); +*/ +$autoload['libraries'] = array('database', 'JWT'); + +/* +| ------------------------------------------------------------------- +| 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'); + +/* +| ------------------------------------------------------------------- +| 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(); diff --git a/api/application/config/config.php b/api/application/config/config.php new file mode 100644 index 0000000..f2dbc7a --- /dev/null +++ b/api/application/config/config.php @@ -0,0 +1,514 @@ +]+$/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/ +| +| 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. +| +| 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['allow_get_array'] = TRUE; +$config['enable_query_strings'] = FALSE; +$config['controller_trigger'] = 'c'; +$config['function_trigger'] = 'm'; +$config['directory_trigger'] = 'd'; + +/* +|-------------------------------------------------------------------------- +| 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'] = 'rodrigo'; + +/* +|-------------------------------------------------------------------------- +| 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'] = 'database'; +$config['sess_cookie_name'] = 'ci_session'; +$config['sess_expiration'] = 7200; +$config['sess_save_path'] = 'ci_sessions'; +$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. +| +| This is particularly useful for portability between UNIX-based OSes, +| (usually \n) and Windows (\r\n). +| +*/ +$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'; +date_default_timezone_set('Asia/Kolkata'); + +/* +|-------------------------------------------------------------------------- +| 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/api/application/config/constants.php b/api/application/config/constants.php new file mode 100644 index 0000000..0ec317d --- /dev/null +++ b/api/application/config/constants.php @@ -0,0 +1,170 @@ + md5 +defined('ENCR_PASSWORD') OR define('ENCR_PASSWORD','e99a18c428cb38d5f260853678922e03'); +//end of encripted password \ No newline at end of file diff --git a/api/application/config/database.php b/api/application/config/database.php new file mode 100644 index 0000000..f8df5be --- /dev/null +++ b/api/application/config/database.php @@ -0,0 +1,96 @@ +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' => 'apollodec.com', + 'username' => 'apollod4_DEV', + 'password' => 'apollo1234', + 'database' => 'apollod4_ApolloDECDev', + '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/api/application/config/doctypes.php b/api/application/config/doctypes.php new file mode 100644 index 0000000..59a7991 --- /dev/null +++ b/api/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/api/application/config/foreign_chars.php b/api/application/config/foreign_chars.php new file mode 100644 index 0000000..ac406e3 --- /dev/null +++ b/api/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/api/application/config/hooks.php b/api/application/config/hooks.php new file mode 100644 index 0000000..a8f38a5 --- /dev/null +++ b/api/application/config/hooks.php @@ -0,0 +1,13 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/config/memcached.php b/api/application/config/memcached.php new file mode 100644 index 0000000..5c23b39 --- /dev/null +++ b/api/application/config/memcached.php @@ -0,0 +1,19 @@ + array( + 'hostname' => '127.0.0.1', + 'port' => '11211', + 'weight' => '1', + ), +); diff --git a/api/application/config/migration.php b/api/application/config/migration.php new file mode 100644 index 0000000..4b585a6 --- /dev/null +++ b/api/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/api/application/config/mimes.php b/api/application/config/mimes.php new file mode 100644 index 0000000..0176533 --- /dev/null +++ b/api/application/config/mimes.php @@ -0,0 +1,183 @@ + 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', + '7zip' => array('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/api/application/config/profiler.php b/api/application/config/profiler.php new file mode 100644 index 0000000..3db22e3 --- /dev/null +++ b/api/application/config/profiler.php @@ -0,0 +1,14 @@ +function($username, $password) +| In other cases override the function _perform_library_auth in your controller +| +| For digest authentication the library function should return already a stored +| md5(username:restrealm:password) for that username +| +| e.g: md5('admin:REST API:1234') = '1e957ebc35631ab22d5bd6526bd14ea2' +| +*/ +$config['auth_library_class'] = ''; +$config['auth_library_function'] = ''; + +/* +|-------------------------------------------------------------------------- +| Override auth types for specific class/method +|-------------------------------------------------------------------------- +| +| Set specific authentication types for methods within a class (controller) +| +| Set as many config entries as needed. Any methods not set will use the default 'rest_auth' config value. +| +| e.g: +| +| $config['auth_override_class_method']['deals']['view'] = 'none'; +| $config['auth_override_class_method']['deals']['insert'] = 'digest'; +| $config['auth_override_class_method']['accounts']['user'] = 'basic'; +| $config['auth_override_class_method']['dashboard']['*'] = 'none|digest|basic'; +| +| Here 'deals', 'accounts' and 'dashboard' are controller names, 'view', 'insert' and 'user' are methods within. An asterisk may also be used to specify an authentication method for an entire classes methods. Ex: $config['auth_override_class_method']['dashboard']['*'] = 'basic'; (NOTE: leave off the '_get' or '_post' from the end of the method name) +| Acceptable values are; 'none', 'digest' and 'basic'. +| +*/ +$config['auth_override_class_method']['autenticador']['*'] = 'none'; +// $config['auth_override_class_method']['deals']['insert'] = 'digest'; +// $config['auth_override_class_method']['accounts']['user'] = 'basic'; +// $config['auth_override_class_method']['dashboard']['*'] = 'basic'; + + +// ---Uncomment list line for the wildard unit test +// $config['auth_override_class_method']['wildcard_test_cases']['*'] = 'basic'; + +/* +|-------------------------------------------------------------------------- +| Override auth types for specfic 'class/method/HTTP method' +|-------------------------------------------------------------------------- +| +| example: +| +| $config['auth_override_class_method_http']['deals']['view']['get'] = 'none'; +| $config['auth_override_class_method_http']['deals']['insert']['post'] = 'none'; +| $config['auth_override_class_method_http']['deals']['*']['options'] = 'none'; +*/ + +// ---Uncomment list line for the wildard unit test +// $config['auth_override_class_method_http']['wildcard_test_cases']['*']['options'] = 'basic'; + +/* +|-------------------------------------------------------------------------- +| REST Login Usernames +|-------------------------------------------------------------------------- +| +| Array of usernames and passwords for login, if ldap is configured this is ignored +| +*/ +$config['rest_valid_logins'] = ['admin' => '1234']; + +/* +|-------------------------------------------------------------------------- +| Global IP Whitelisting +|-------------------------------------------------------------------------- +| +| Limit connections to your REST server to whitelisted IP addresses +| +| Usage: +| 1. Set to TRUE and select an auth option for extreme security (client's IP +| address must be in whitelist and they must also log in) +| 2. Set to TRUE with auth set to FALSE to allow whitelisted IPs access with no login +| 3. Set to FALSE but set 'auth_override_class_method' to 'whitelist' to +| restrict certain methods to IPs in your whitelist +| +*/ +$config['rest_ip_whitelist_enabled'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| REST IP Whitelist +|-------------------------------------------------------------------------- +| +| Limit connections to your REST server with a comma separated +| list of IP addresses +| +| e.g: '123.456.789.0, 987.654.32.1' +| +| 127.0.0.1 and 0.0.0.0 are allowed by default +| +*/ +$config['rest_ip_whitelist'] = ''; + +/* +|-------------------------------------------------------------------------- +| Global IP Blacklisting +|-------------------------------------------------------------------------- +| +| Prevent connections to the REST server from blacklisted IP addresses +| +| Usage: +| 1. Set to TRUE and add any IP address to 'rest_ip_blacklist' +| +*/ +$config['rest_ip_blacklist_enabled'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| REST IP Blacklist +|-------------------------------------------------------------------------- +| +| Prevent connections from the following IP addresses +| +| e.g: '123.456.789.0, 987.654.32.1' +| +*/ +$config['rest_ip_blacklist'] = ''; + +/* +|-------------------------------------------------------------------------- +| REST Database Group +|-------------------------------------------------------------------------- +| +| Connect to a database group for keys, logging, etc. It will only connect +| if you have any of these features enabled +| +*/ +$config['rest_database_group'] = 'default'; + +/* +|-------------------------------------------------------------------------- +| REST API Keys Table Name +|-------------------------------------------------------------------------- +| +| The table name in your database that stores API keys +| +*/ +$config['rest_keys_table'] = 'keys'; + +/* +|-------------------------------------------------------------------------- +| REST Enable Keys +|-------------------------------------------------------------------------- +| +| When set to TRUE, the REST API will look for a column name called 'key'. +| If no key is provided, the request will result in an error. To override the +| column name see 'rest_key_column' +| +| Default table schema: +| CREATE TABLE `keys` ( +| `id` INT(11) NOT NULL AUTO_INCREMENT, +| `user_id` INT(11) NOT NULL, +| `key` VARCHAR(40) NOT NULL, +| `level` INT(2) NOT NULL, +| `ignore_limits` TINYINT(1) NOT NULL DEFAULT '0', +| `is_private_key` TINYINT(1) NOT NULL DEFAULT '0', +| `ip_addresses` TEXT NULL DEFAULT NULL, +| `date_created` INT(11) NOT NULL, +| PRIMARY KEY (`id`) +| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +| +*/ +$config['rest_enable_keys'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| REST Table Key Column Name +|-------------------------------------------------------------------------- +| +| If not using the default table schema in 'rest_enable_keys', specify the +| column name to match e.g. my_key +| +*/ +$config['rest_key_column'] = 'key'; + +/* +|-------------------------------------------------------------------------- +| REST API Limits method +|-------------------------------------------------------------------------- +| +| Specify the method used to limit the API calls +| +| Available methods are : +| $config['rest_limits_method'] = 'IP_ADDRESS'; // Put a limit per ip address +| $config['rest_limits_method'] = 'API_KEY'; // Put a limit per api key +| $config['rest_limits_method'] = 'METHOD_NAME'; // Put a limit on method calls +| $config['rest_limits_method'] = 'ROUTED_URL'; // Put a limit on the routed URL +| +*/ +$config['rest_limits_method'] = 'ROUTED_URL'; + +/* +|-------------------------------------------------------------------------- +| REST Key Length +|-------------------------------------------------------------------------- +| +| Length of the created keys. Check your default database schema on the +| maximum length allowed +| +| Note: The maximum length is 40 +| +*/ +$config['rest_key_length'] = 40; + +/* +|-------------------------------------------------------------------------- +| REST API Key Variable +|-------------------------------------------------------------------------- +| +| Custom header to specify the API key + +| Note: Custom headers with the X- prefix are deprecated as of +| 2012/06/12. See RFC 6648 specification for more details +| +*/ +$config['rest_key_name'] = 'X-API-KEY'; + +/* +|-------------------------------------------------------------------------- +| REST Enable Logging +|-------------------------------------------------------------------------- +| +| When set to TRUE, the REST API will log actions based on the column names 'key', 'date', +| 'time' and 'ip_address'. This is a general rule that can be overridden in the +| $this->method array for each controller +| +| Default table schema: +| CREATE TABLE `logs` ( +| `id` INT(11) NOT NULL AUTO_INCREMENT, +| `uri` VARCHAR(255) NOT NULL, +| `method` VARCHAR(6) NOT NULL, +| `params` TEXT DEFAULT NULL, +| `api_key` VARCHAR(40) NOT NULL, +| `ip_address` VARCHAR(45) NOT NULL, +| `time` INT(11) NOT NULL, +| `rtime` FLOAT DEFAULT NULL, +| `authorized` VARCHAR(1) NOT NULL, +| `response_code` smallint(3) DEFAULT '0', +| PRIMARY KEY (`id`) +| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +| +*/ +$config['rest_enable_logging'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| REST API Logs Table Name +|-------------------------------------------------------------------------- +| +| If not using the default table schema in 'rest_enable_logging', specify the +| table name to match e.g. my_logs +| +*/ +$config['rest_logs_table'] = 'logs'; + +/* +|-------------------------------------------------------------------------- +| REST Method Access Control +|-------------------------------------------------------------------------- +| When set to TRUE, the REST API will check the access table to see if +| the API key can access that controller. 'rest_enable_keys' must be enabled +| to use this +| +| Default table schema: +| CREATE TABLE `access` ( +| `id` INT(11) unsigned NOT NULL AUTO_INCREMENT, +| `key` VARCHAR(40) NOT NULL DEFAULT '', +| `all_access` TINYINT(1) NOT NULL DEFAULT '0', +| `controller` VARCHAR(50) NOT NULL DEFAULT '', +| `date_created` DATETIME DEFAULT NULL, +| `date_modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, +| PRIMARY KEY (`id`) +| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +| +*/ +$config['rest_enable_access'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| REST API Access Table Name +|-------------------------------------------------------------------------- +| +| If not using the default table schema in 'rest_enable_access', specify the +| table name to match e.g. my_access +| +*/ +$config['rest_access_table'] = 'access'; + +/* +|-------------------------------------------------------------------------- +| REST API Param Log Format +|-------------------------------------------------------------------------- +| +| When set to TRUE, the REST API log parameters will be stored in the database as JSON +| Set to FALSE to log as serialized PHP +| +*/ +$config['rest_logs_json_params'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| REST Enable Limits +|-------------------------------------------------------------------------- +| +| When set to TRUE, the REST API will count the number of uses of each method +| by an API key each hour. This is a general rule that can be overridden in the +| $this->method array in each controller +| +| Default table schema: +| CREATE TABLE `limits` ( +| `id` INT(11) NOT NULL AUTO_INCREMENT, +| `uri` VARCHAR(255) NOT NULL, +| `count` INT(10) NOT NULL, +| `hour_started` INT(11) NOT NULL, +| `api_key` VARCHAR(40) NOT NULL, +| PRIMARY KEY (`id`) +| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +| +| To specify the limits within the controller's __construct() method, add per-method +| limits with: +| +| $this->method['METHOD_NAME']['limit'] = [NUM_REQUESTS_PER_HOUR]; +| +| See application/controllers/api/example.php for examples +*/ +$config['rest_enable_limits'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| REST API Limits Table Name +|-------------------------------------------------------------------------- +| +| If not using the default table schema in 'rest_enable_limits', specify the +| table name to match e.g. my_limits +| +*/ +$config['rest_limits_table'] = 'limits'; + +/* +|-------------------------------------------------------------------------- +| REST Ignore HTTP Accept +|-------------------------------------------------------------------------- +| +| Set to TRUE to ignore the HTTP Accept and speed up each request a little. +| Only do this if you are using the $this->rest_format or /format/xml in URLs +| +*/ +$config['rest_ignore_http_accept'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| REST AJAX Only +|-------------------------------------------------------------------------- +| +| Set to TRUE to allow AJAX requests only. Set to FALSE to accept HTTP requests +| +| Note: If set to TRUE and the request is not AJAX, a 505 response with the +| error message 'Only AJAX requests are accepted.' will be returned. +| +| Hint: This is good for production environments +| +*/ +$config['rest_ajax_only'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| REST Language File +|-------------------------------------------------------------------------- +| +| Language file to load from the language directory +| +*/ +$config['rest_language'] = 'portuguese-brazilian'; + +/* +|-------------------------------------------------------------------------- +| CORS Check +|-------------------------------------------------------------------------- +| +| Set to TRUE to enable Cross-Origin Resource Sharing (CORS). Useful if you +| are hosting your API on a different domain from the application that +| will access it through a browser +| +*/ +$config['check_cors'] = true; + +/* +|-------------------------------------------------------------------------- +| CORS Allowable Headers +|-------------------------------------------------------------------------- +| +| If using CORS checks, set the allowable headers here +| +*/ +$config['allowed_cors_headers'] = [ + 'Origin', + 'X-Requested-With', + 'Content-Type', + 'Accept', + 'Access-Control-Request-Method', + 'Authorization' +]; + +/* +|-------------------------------------------------------------------------- +| CORS Allowable Methods +|-------------------------------------------------------------------------- +| +| If using CORS checks, you can set the methods you want to be allowed +| +*/ +$config['allowed_cors_methods'] = [ + 'GET', + 'POST', + 'OPTIONS', + 'PUT', + 'PATCH', + 'DELETE' +]; + +/* +|-------------------------------------------------------------------------- +| CORS Allow Any Domain +|-------------------------------------------------------------------------- +| +| Set to TRUE to enable Cross-Origin Resource Sharing (CORS) from any +| source domain +| +*/ +$config['allow_any_cors_domain'] = true; + +/* +|-------------------------------------------------------------------------- +| CORS Allowable Domains +|-------------------------------------------------------------------------- +| +| Used if $config['check_cors'] is set to TRUE and $config['allow_any_cors_domain'] +| is set to FALSE. Set all the allowable domains within the array +| +| e.g. $config['allowed_origins'] = ['http://www.example.com', 'https://spa.example.com'] +| +*/ +$config['allowed_cors_origins'] = []; diff --git a/api/application/config/routes.php b/api/application/config/routes.php new file mode 100644 index 0000000..15ed7b0 --- /dev/null +++ b/api/application/config/routes.php @@ -0,0 +1,264 @@ + my_controller/index +| my-controller/my-method -> my_controller/my_method +*/ +$route['default_controller'] = 'welcome'; +$route['404_override'] = ''; +$route['translate_uri_dashes'] = TRUE; + +/* +| ------------------------------------------------------------------------- +| Sample REST API Routes +| ------------------------------------------------------------------------- +*/ +$route['autenticadors'] = 'autenticador/index'; // Example 4 +$route['login'] = 'Login_Controller/login'; +// Forget password +$route['forgetlogin'] = 'Forget_Controller/forgetlogin'; +// branch +$route['getMasterBranchDetails'] = 'Employee_Controller/getMasterBranchDetails'; +$route['addBranchDetails'] = 'Branch_Controller/addBranchDetails'; +$route['getBranchDetails'] = 'Branch_Controller/getBranchDetails'; +$route['updateBranchDetails'] = 'Branch_Controller/updateBranchDetails'; +// staff +$route['employee'] = 'Employee_Controller/employee'; +$route['getEmployeeList'] = 'Employee_Controller/getEmployeeList'; +$route['getRoleDetails'] = 'Employee_Controller/getRoleDetails'; +$route['chkEmpExistDetail'] = 'Employee_Controller/check_exist'; +$route['insertEmployee'] = 'Employee_Controller/addEmployee'; +$route['chkUpdateEmpExistDetail'] = 'Employee_Controller/check_update_exist'; +$route['updateEmpExistDetail'] = 'Employee_Controller/updateEmployee'; +$route['getEmpBranchDetails'] = 'Employee_Controller/getEmpBranchDetails'; +$route['updateEmpBranchDetail'] = 'Employee_Controller/updateEmpBranchDetail'; +$route['updateEmpImgExistDetail'] = 'Employee_Controller/updateEmployeeImage'; +$route['insertEmployeeImage'] = 'Employee_Controller/addEmployeeImage'; +$route['employeeGetProf'] = 'Employee_Controller/employeeGetProf'; +$route['addEmpBranchDetail'] = 'Employee_Controller/addEmpBranchDetail'; +// call tracking +$route['getTrackingLeadDetails'] = 'Call_Tracking_Controller/getTrackingLeadDetails'; +$route['addLeadTrackingDetails'] = 'Call_Tracking_Controller/addLeadTrackingDetails'; +$route['getTrackingDetails'] = 'Call_Tracking_Controller/getTrackingDetails'; +$route['updateFollowupDetails'] = 'Call_Tracking_Controller/updateFollowupDetails'; +$route['loadFollowupDetails'] = 'Call_Tracking_Controller/loadFollowupDetails'; +$route['getRecentLeadDetails'] = 'Call_Tracking_Controller/getRecentLeadDetails'; +$route['getRecentCloseDetails'] = 'Call_Tracking_Controller/getRecentCloseDetails'; +$route['getRecentPendingDetails'] = 'Call_Tracking_Controller/getRecentPendingDetails'; +$route['callAsImportantFlag'] = 'Call_Tracking_Controller/callAsImportantFlag'; + + + +// university +$route['insertUniversity'] = 'University_Controller/insertUniversity'; +$route['getUniversity'] = 'University_Controller/getUniversity'; +$route['chkUnivIdExistDetail'] = 'University_Controller/chkUnivIdExistDetail'; +$route['updateUniversityDetail'] = 'University_Controller/updateUniversityDetail'; +//course +$route['getCourseDetails'] = 'Course_Controller/getCourseDetails'; +$route['addCourseDetails'] = 'Course_Controller/addCourseDetails'; +$route['updateCourseDetails'] = 'Course_Controller/updateCourseDetails'; +$route['getCourseUnivFeesDetails'] = 'Course_Controller/getCourseUnivFeesDetails'; + +// activity +$route['addActivityDetails'] = 'University_Controller/addActivityDetails'; +$route['getActivityDetails'] = 'University_Controller/getActivityDetails'; +$route['updateActivityDetails'] = 'University_Controller/updateActivityDetails'; + +$route['changePassword'] = 'Login_Controller/changePassword'; + +// student +$route['insertStudent'] = 'Student_Controller/addStudent'; +$route['getStudentUniversity'] = 'Student_Controller/getStudentUniversity'; +$route['getCourseBatchForUniv'] = 'Student_Controller/getCourseBatch'; +$route['chkStudentExistDetail'] = 'Student_Controller/chkStudentExistDetail'; +$route['getStudentList'] = 'Student_Controller/getStudentList'; +$route['updateStudentExistDetail'] = 'Student_Controller/updateStudentExistDetail'; +$route['chkUpdateStuExistDetail'] = 'Student_Controller/chkUpdateStuExistDetail'; +$route['getStudentCourseList'] = 'Student_Controller/getStudentCourseList'; +$route['getStudentCourseDetails'] = 'Student_Controller/getStudentCourseDetails'; +$route['updateStudentCourseDetail'] = 'Student_Controller/updateStudentCourseDetail'; +$route['insertStudentCourse'] = 'Student_Controller/insertStudentCourse'; +$route['insertStudentImg'] = 'Student_Controller/insertStudentImg'; +$route['updateStudentImgDetails'] = 'Student_Controller/updateStudentImgDetails'; +$route['getBranchListDetails'] = 'Student_Controller/getBranchListDetails'; +$route['getBranchActiveStatusforStuAdd'] = 'Student_Controller/getBranchActiveStatusforStuAdd'; +$route['getExistingStudentDetails'] = 'Student_Controller/getExistingStudentDetails'; +$route['addStudentEntrollDocDetails'] = 'Student_Controller/addStudentEntrollDocDetails'; +$route['getListofStuDocDetails'] = 'Student_Controller/getListofStuDocDetails'; +$route['deleteStuDocDetails'] = 'Student_Controller/deleteStuDocDetails'; +$route['getListofStuPendingDocDetails'] = 'Student_Controller/getListofStuPendingDocDetails'; +$route['addStudentEnrollPendingDocDetails'] = 'Student_Controller/addStudentEnrollPendingDocDetails'; +$route['deleteDocPendingDetails'] = 'Student_Controller/deleteDocPendingDetails'; + +//batch +$route['addBatchDetails'] = 'Batch_Controller/addBatchDetails'; +$route['updateBatchDetails'] = 'Batch_Controller/updateBatchDetails'; +$route['getBatchDetails'] = 'Batch_Controller/getBatchDetails'; +$route['updateBatchDefault'] = 'Batch_Controller/updateBatchDefault'; + +/*Announcement*/ +$route['addAnnouncementDetails'] = 'Announcement_Controller/addAnnouncementDetails'; +$route['getAnnouncementDetails'] = 'Announcement_Controller/getAnnouncementDetails'; +$route['updateAnnouncementDetails'] = 'Announcement_Controller/updateAnnouncementDetails'; + +// dash board +$route['getDashboardCallTrack'] = 'Call_Tracking_Controller/getDashboardCallTrack'; +$route['getTotalStudent'] = 'Dashboard_Controller/getTotalStudent'; +$route['getTotalEmployee'] = 'Dashboard_Controller/getTotalEmployee'; +$route['getTotalUsers'] = 'Dashboard_Controller/getTotalUsers'; + +/*login page announcement*/ +$route['getLoginAnnouncementDetails'] = 'Login_Controller/getLoginAnnouncementDetails'; +/* status */ +$route['addStatusDetails'] = 'Status_Controller/addStatusDetails'; +$route['getStatusDetails'] = 'Status_Controller/getStatusDetails'; +$route['updateStatusDetails'] = 'Status_Controller/updateStatusDetails'; +$route['getBranchListStatusUpdate'] = 'Status_Controller/getBranchListStatusUpdate'; +$route['getBranchStatusList'] = 'Status_Controller/getBranchStatusList'; +/*get student list for fees update*/ +$route['getStudentListFees'] = 'Fees_Status_Controller/getStudentList'; +/*get student fees structure for fees update*/ +$route['getStudentFeesStructure'] = 'Fees_Status_Controller/getFeesStructure'; +$route['getStudentFeesAssign'] = 'Fees_Status_Controller/getFeesStructureAssign'; +$route['setFeesForStudent'] = 'Fees_Status_Controller/setFeesForStudent'; + +/*update fees details for student*/ +$route['updateFeesDetails'] = 'Fees_Status_Controller/updateFeesDetails'; +$route['getUniversityCourseForFees'] = 'Fees_Status_Controller/getUniversityCourseForFees'; +/* + * get default activity details + * */ +$route['getDefaultActivityDetails'] = 'University_Controller/getDefaultActivityDetails'; +$route['updateDefaultActivityDetails'] = 'University_Controller/updateDefaultActivityDetails'; +// statu updation details studymaterial, answerbooklet, application, certification +$route['getUniveCourseBratch'] = 'StatusUpdation_Controller/getUniveCourseBratch'; +$route['getSearchAutoDetails'] = 'StatusUpdation_Controller/getSearchDetails'; +$route['getSemYearForCourse'] = 'StatusUpdation_Controller/getSemYearForCourse'; +$route['updateStudentMaterialStatus'] = 'StatusUpdation_Controller/updateStudentMaterialStatus'; +$route['updateAnswerBookLetStatus'] = 'StatusUpdation_Controller/updateAnswerBookLetStatus'; +$route['getCertificateList'] = 'StatusUpdation_Controller/getCertificateList'; +$route['updateCertificationStatus'] = 'StatusUpdation_Controller/updateCertificationStatus'; +$route['updateApplicationStatus'] = 'StatusUpdation_Controller/updateApplicationStatus'; +$route['getStatusListForUpdate'] = 'StatusUpdation_Controller/getStatusListForUpdate'; +$route['getPrevStatusDetailsForStu'] = 'StatusUpdation_Controller/getPrevStatusDetailsForStu'; + +/*get student view details*/ +$route['getStudentBasicInfo'] = 'StudentView_Controller/getStudentInfo'; + + +/*get certificate Details*/ +$route['getCertificateDetails'] = 'Certificate_Controller/getCertificateDetails'; +$route['addCertificateDetails'] = 'Certificate_Controller/addCertificateDetails'; +$route['updateCertificateDetails'] = 'Certificate_Controller/updateCertificateDetails'; +/* + * Day Book + * */ +$route['deleteDayBookDetails'] = 'DayBook_Controller/deleteDayBookDetails'; +$route['updateDayBookDetails'] = 'DayBook_Controller/updateDayBookDetails'; +$route['getDayBookDetails'] = 'DayBook_Controller/getDayBookDetails'; +$route['getDayBookApprovalDetails'] = 'DayBook_Controller/getDayBookApprovalDetails'; +$route['getIncomeExpenseTypeState'] = 'DayBook_Controller/getIncomeExpenseTypeState'; +$route['addDayBook'] = 'DayBook_Controller/adddaybook'; +$route['updateDayBookStatusAdmin'] = 'DayBook_Controller/updateDayBookStatusAdmin'; +$route['getDayBookDetailsSuperAdmin'] = 'DayBook_Controller/getDayBookDetailsSuperAdmin'; +$route['empDayBookModuleAccessChk'] = 'DayBook_Controller/empDayBookModuleAccessChk'; +$route['deleteDayBookFeePayableDetails'] = 'DayBook_Controller/deleteDayBookFeePayableDetails'; + +/* * day book master * */ +$route['getDayBookMasterDetails'] = 'DayBookMaster_Controller/getDayBookMasterDetails'; +$route['addDaybookMasterDetails'] = 'DayBookMaster_Controller/addDaybookMasterDetails'; +$route['updateDayBookMasterDetails'] = 'DayBookMaster_Controller/updateDayBookMasterDetails'; + +/** This is for CRONE JOB*/ +$route['sendStudentNotification'] = 'Fees_Status_Controller/sendStudentNotification'; + + +/* + * SMS send + * */ +$route['getUniveCourseBratchBroadCast'] = 'Broadcast_Controller/getUniveCourseBatch'; +$route['getStuListForBroadcast'] = 'Broadcast_Controller/getStuListForBrodcast'; +$route['sendSMSStudentApi'] = 'Broadcast_Controller/sendSMSStudentApi'; + +$route['getCronCall'] = 'Broadcast_Controller/getCronCall'; +$route['getSMSSendReportList'] = 'Broadcast_Controller/getSMSSendReportList'; +$route['getSMSGroupDetails'] = 'Broadcast_Controller/getSMSGroupDetails'; + +//center + +$route['addCenterDetails'] = 'Center_Controller/addCenterDetails'; +$route['updateCenterDetails'] = 'Center_Controller/updateCenterDetails'; +$route['getCenterDetails'] = 'Center_Controller/getCenterDetails'; + +//subject +$route['getSubjectDetails'] = 'Subject_Controller/getSubjectDetails'; +$route['updateSubjectDetails'] = 'Subject_Controller/updateSubjectDetails'; +$route['addSubjectDetails'] = 'Subject_Controller/addSubjectDetails'; + +// session mater +$route['addSessionMaterDetails'] = 'SessionMater_Controller/addSessionMaterDetails'; +$route['getSessionMaterDetails'] = 'SessionMater_Controller/getSessionMaterDetails'; +$route['updateSessionMaterDetails'] = 'SessionMater_Controller/updateSessionMaterDetails'; + +// session schedule +$route['addSessionScheduleDetails'] = 'SessionSchedule_Controller/addSessionScheduleDetails'; +$route['getSessionScheduleDetails'] = 'SessionSchedule_Controller/getSessionScheduleDetails'; +$route['updateSessionScheduleDetails'] = 'SessionSchedule_Controller/updateSessionScheduleDetails'; + +// halltickets +$route['getCourseSubjectDetails'] = 'HallTickets_Controller/getCourseSubjectDetails'; + +//Reports +$route['reportstatus'] = 'Report/status'; +$route['reportbatchlist'] = 'Report/batch'; +$route['reportmstatus'] = 'Report/mstatus'; +$route['reportcert_status'] = 'Report/cert_status'; +$route['reportmark_cert_status'] = 'Report/markcert_status'; +$route['reportexpense'] = 'Report/expense'; + diff --git a/api/application/config/smileys.php b/api/application/config/smileys.php new file mode 100644 index 0000000..abf9a89 --- /dev/null +++ b/api/application/config/smileys.php @@ -0,0 +1,64 @@ + 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/api/application/config/user_agents.php b/api/application/config/user_agents.php new file mode 100644 index 0000000..798086b --- /dev/null +++ b/api/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' => 'Spartan', + '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/api/application/controllers/Announcement_Controller.php b/api/application/controllers/Announcement_Controller.php new file mode 100644 index 0000000..3bdf0b7 --- /dev/null +++ b/api/application/controllers/Announcement_Controller.php @@ -0,0 +1,134 @@ +methods['addAnnouncementDetails_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['addAnnouncementDetails_post']['limit'] = 100; // 100 requests per hour per user/key + $this->methods['addAnnouncementDetails_delete']['limit'] = 50; // 50 requests per hour per user/key + $this->methods['getAnnouncementDetails_post']['limit'] = 500; // 50 requests per hour per user/key + $this->methods['updateAnnouncementDetails_post']['limit'] = 500; + // load the model + $this->load->model('Announcement_model', 'announcement_model'); + + } + + /* + * This method used to add Announcement Details + * created by Surendiran + * */ + + public function addAnnouncementDetails_post() + { + $details['Heading'] = $this->post('Heading'); + $details['Description'] = $this->post('description'); + $details['CreatedBy'] = $this->post('createdBy'); + $details['IsActive'] = $this->post('status'); + $announcementDetails = $this->announcement_model->addAnnouncement($details);// Check if the users data store contains users (in case the database result returns NULL) + if ($announcementDetails) + { + $announcementDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($announcementDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + /* + * get Announcement Details + * created by Surendiran + * */ + public function getAnnouncementDetails_post() + { + $requestedBy = $this->post('requestedBy'); + + $getAnnouncement = $this->announcement_model->getAnnouncement(); + + if ($getAnnouncement) + { + $getAnnouncement['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getAnnouncement, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + /* + * update Announcement Details + * created by Surendiran + * */ + public function updateAnnouncementDetails_post() + { + $updateID = $this->post('updateID'); + // $details['ID'] = $this->post('ID'); + $details['Heading'] = $this->post('Heading'); + $details['Description'] = $this->post('description'); + $details['IsActive'] = $this->post('status'); + $details['UpdatedBy'] = $this->post('createdBy'); + $date = date('Y-m-d H:i:s'); + $details['UpdatedOn'] = $date; + $announcementDetails = $this->announcement_model->updateAnnouncement($details,$updateID);// Check if the users data store contains users (in case the database result returns NULL) + + if ($announcementDetails) + { + $announcementDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($announcementDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } +} \ No newline at end of file diff --git a/api/application/controllers/Autenticador.php b/api/application/controllers/Autenticador.php new file mode 100644 index 0000000..69c76cf --- /dev/null +++ b/api/application/controllers/Autenticador.php @@ -0,0 +1,70 @@ +post('email'); + $password = $this->post('password'); + + $this->db->where('email', $email); + // $this->db->where('password', $password); + $usuario = $this->db->get('tbl_users')->first_row(); + + if ($usuario) { + $key = $this->config->item('encryption_key'); + + $token = $this->jwt->encode(array( + 'id'=>$usuario->email, + 'nome'=>$usuario->email, + 'email'=>$usuario->email, + 'admin'=>TRUE, + 'iat'=> strtotime("now"), + 'exp'=> strtotime("+2 hours") + ), $key); + + $message = ['token' => $token]; + $this->set_response($message, REST_Controller::HTTP_ACCEPTED); + } + else + { + // Set the response and exit + $this->response([ + 'status' => FALSE, + 'message' => 'Usuario ou senha errados' + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function sair_get() + { + try { + $key = $this->config->item('encryption_key'); + $token = $this->input->get_request_header('Authorization'); + $token = str_replace('Bearer ','',$token); + $token = $this->jwt->decode($token, $key); + } catch (Exception $e) { + $token = FALSE; + $erro = 'Erro: '.$e->getMessage(); + } + if ($token == FALSE) { + $this->response([ + 'status' => FALSE, + 'message' => $erro + ], REST_Controller::HTTP_UNAUTHORIZED); + } + else{ + $this->set_response([ + 'status' => TRUE, + 'message' => $token->nome.' saiu com sucesso'], REST_Controller::HTTP_OK); + } + + } +} + +/* End of file Autenticador.php */ +/* Location: ./application/controllers/Autenticador.php */ diff --git a/api/application/controllers/Batch_Controller.php b/api/application/controllers/Batch_Controller.php new file mode 100644 index 0000000..348b13d --- /dev/null +++ b/api/application/controllers/Batch_Controller.php @@ -0,0 +1,160 @@ +methods['addBatchDetails_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['addBatchDetails_post']['limit'] = 100; // 100 requests per hour per user/key + $this->methods['addBatchDetails_delete']['limit'] = 50; // 50 requests per hour per user/key + $this->methods['getBatchDetails_post']['limit'] = 500; // 50 requests per hour per user/key + $this->methods['updateBatchDetails_post']['limit'] = 500;// 500 requests per hour per user/key + $this->methods['updateBatchDefault_post']['limit'] = 500;// 500 requests per hour per user/key + + // load the model + $this->load->model('Batch_model', 'batch_model'); + + } + + /* + * This method used to add batch details + * created by srk + * */ + + public function addBatchDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['BatchCode'] = $this->post('batchcode'); + $details['BatchName'] = $this->post('batcheName'); + $details['BatchDate'] = $this->post('batcheDate'); + $details['UniversityID'] = $this->post('universityName'); + $details['CreatedBy'] = $this->post('createdBy'); + $details['IsActive'] = $this->post('status'); + $details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + + $batchDetails = $this->batch_model->addBatch($details);// Check if the users data store contains users (in case the database result returns NULL) + if ($batchDetails) + { + $batchDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($batchDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get Batch details + * created by srk + * */ + public function getBatchDetails_post() + { + $requestedBy = $this->post('requestedBy'); + $getBatch = $this->batch_model->getBatch($requestedBy); + if ($getBatch) + { + $getBatch['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getBatch, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * update the batch details + * created by srk + * */ + public function updateBatchDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['BatchCode'] = $this->post('batchCode'); + $details['BatchName'] = $this->post('batchName'); + $details['BatchDate'] = $this->post('batchDate'); + $details['IsActive'] = $this->post('status'); + $details['UpdatedBy'] = $this->post('updatedBy'); + $details['UpdatedOn'] = $now->format("Y-m-d H:i:s"); + + // print_r( $details['UpdatedOn']) + //exit(); + $updateDetails = $this->batch_model->updateBatch($details);// Check if the users data store contains users (in case the database result returns NULL) + + if ($updateDetails) + { + $updateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * update the default batch details + * created by kms + * */ + public function updateBatchDefault_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['BatchCode'] = $this->post('batchCode'); + $details['UniversityID'] = $this->post('universityID'); + $details['IsDefault'] = $this->post('IsDefault'); + $details['UpdatedBy'] = $this->post('updatedBy'); + $details['UpdatedOn'] = $now->format("Y-m-d H:i:s"); + + $updateDetails = $this->batch_model->updateDefaultBatch($details);// Check if the users data store contains users (in case the database result returns NULL) + + if ($updateDetails) + { + $updateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + +} diff --git a/api/application/controllers/Branch_Controller.php b/api/application/controllers/Branch_Controller.php new file mode 100644 index 0000000..e81191f --- /dev/null +++ b/api/application/controllers/Branch_Controller.php @@ -0,0 +1,162 @@ +methods['addBranchDetails_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['addBranchDetails_post']['limit'] = 100; // 100 requests per hour per user/key + $this->methods['addBranchDetails_delete']['limit'] = 50; // 50 requests per hour per user/key + $this->methods['getBranchDetails_post']['limit'] = 500; // 50 requests per hour per user/key + $this->methods['updateBranchDetails_post']['limit'] = 500; + // load the model + $this->load->model('Branch_model', 'branch_model'); + + } + + /* + * This method used to add branch details + * created by kms + * */ + + public function addBranchDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['BranchCode'] = $this->post('branchCode'); + $details['BranchName'] = $this->post('branchName'); + // $details['LogoPath'] = $this->post('logo'); + $details['MobileNumber'] = $this->post('primaryPhone'); + $details['AlternateNumber'] = $this->post('secondaryPhone'); + $details['LandlineNumber'] = $this->post('landLine'); + $details['Address'] = $this->post('address'); + $details['EmailID'] = $this->post('email'); + $details['CreatedBy'] = $this->post('createdBy'); + $details['IsActive'] = $this->post('status') == "true" ? 1 : 0; + $details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + + $imageStat = $this->post('imageStatus'); + + $imagename = $imageStat == 1 ? $_FILES['logo']['name'] : ''; + $size = $imageStat == 1 ? $_FILES['logo']['size'] : ''; + $imageSource = $imageStat == 1 ? $_FILES['logo']['tmp_name'] : ''; + + $branchDetails = $this->branch_model->addBranch($details, $imageSource);// Check if the users data store contains users (in case the database result returns NULL) + if ($branchDetails) + { + $branchDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($branchDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get branch details + * created by kms + * */ + public function getBranchDetails_post() + { + $requestedBy = $this->post('requestedBy'); + $getBranch = $this->branch_model->getBranch($requestedBy); + + if ($getBranch) + { + $getBranch['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getBranch, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * update the branch details + * created by kms + * */ + public function updateBranchDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $branchCode = $this->post('branchCode'); + $details['BranchName'] = $this->post('branchName'); + $details['LogoPath'] = $this->post('logo'); + $details['MobileNumber'] = $this->post('primaryPhone'); + $details['AlternateNumber'] = $this->post('secondaryPhone'); + $details['LandlineNumber'] = $this->post('landLine'); + $details['Address'] = $this->post('address'); + $details['EmailID'] = $this->post('email'); + $details['IsActive'] = $this->post('status') == "true" ? 1 : 0; + $details['UpdatedBy'] = $this->post('createdBy'); + $details['UpdatedOn'] = $now->format("Y-m-d H:i:s"); + + $imageStat = $this->post('imageStatus'); + + $imagename = $imageStat == 1 ? $_FILES['logoEdit']['name'] : ''; + $size = $imageStat == 1 ? $_FILES['logoEdit']['size'] : ''; + $imageSource = $imageStat == 1 ? $_FILES['logoEdit']['tmp_name'] : ''; + + $updateDetails = $this->branch_model->updateBranch($details,$branchCode, $imageSource, $imageStat );// Check if the users data store contains users (in case the database result returns NULL) + if ($updateDetails) + { + $updateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + +} \ No newline at end of file diff --git a/api/application/controllers/Broadcast_Controller.php b/api/application/controllers/Broadcast_Controller.php new file mode 100644 index 0000000..573ad4a --- /dev/null +++ b/api/application/controllers/Broadcast_Controller.php @@ -0,0 +1,183 @@ +methods['getUniversity_post']['limit'] = 100; + $this->methods['chkUnivIdExistDetail_post']['limit'] = 100; + // load the broadcast model + $this->load->model('Broadcast_model', 'broadcast_model'); + } + + // get University, Course, Branch Detailss + public function getUniveCourseBatch_post() { + $reqData = $this->post('data'); + $loginUserId = $reqData['localUserID']; + $loginUserBranchId = $reqData['localBranchID']; + $loginUserType = $reqData['localType']; + $getUniversityListDetails = $this->broadcast_model->get_university_course_batch();// Check if the employee exist + if ($getUniversityListDetails) + { + $getUniversityListDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getUniversityListDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // ger Result fot searched keyword details + public function getStuListForBrodcast_post() { + $reqSearchData = $this->post('data'); + $reqData = $this->post('requestDetails'); + // print_r($reqSearchData);exit(); + + $getSearchDetails = $this->broadcast_model->get_search_result($reqSearchData, $reqData);// Check if the employee exist + if ($getSearchDetails) + { + $getSearchDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getSearchDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function sendSMSStudentApi_post() { + $reqData = $this->post('data'); + $reqDetails = $this->post('requestDetails'); + $msg = $this->post('msg'); + $time = date('Y-m-d H:i:s'); + $dateTime = $time; + $count = count($reqData); + for($i=0; $i < $count; $i++) { + $data[] = array( + 'StudentID' => $reqData[$i]['StudentID'] + ); + } + + $sendMsgDetails = $this->broadcast_model->send_msg_students($data, $msg, $reqDetails);// Check if the employee exist + if ($sendMsgDetails) + { + $sendMsgDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($sendMsgDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function getSMSGroupDetails_post() { + $reqData = $this->post('data'); + $reqDataBy = $this->post('localReqDetails'); + // print_r($reqData);exit(); + $getMegDetails = $this->broadcast_model->getSMSGroupDetails($reqData);// Check if the employee exist + if ($getMegDetails) + { + $getMegDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getMegDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function getSMSSendReportList_post(){ + + $reqData = $this->post('data'); + $reqDataBy = $this->post('localReqDetails'); + // $time = date('Y-m-d H:i:s'); + // $dateTime = $time; + // $date1 = $dateTime; + // $date2 = $dateTime; + + $getMegCronDetails = $this->broadcast_model->getSmsSendBetweenDate($reqData, $reqDataBy);// Check if the employee exist + if ($getMegCronDetails) + { + $getMegCronDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getMegCronDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function getCronCall_get() { + $getMegCronDetails = $this->broadcast_model->getCronUpdate();// Check if the employee exist + // echo $getMegCronDetails;exit(); + if($getMegCronDetails){ + echo $getMegCronDetails; + }else { + + } + // if ($getMegCronDetails) + // { + // $getMegCronDetails['status'] = REST_Controller::HTTP_OK; + // // Set the response and exit + // $this->response($getMegCronDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + // } + // else + // { + // // Set the response and exit + // $this->response([ + // 'message' => 'No list were found', + // 'status' => REST_Controller::HTTP_NOT_FOUND + // ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + // } + } +} diff --git a/api/application/controllers/Call_Tracking_Controller.php b/api/application/controllers/Call_Tracking_Controller.php new file mode 100644 index 0000000..bb94f8b --- /dev/null +++ b/api/application/controllers/Call_Tracking_Controller.php @@ -0,0 +1,406 @@ +methods['getTrackingLeadDetails_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['getTrackingLeadDetails_post']['limit'] = 1000; // 100 requests per hour per user/key + $this->methods['getTrackingLeadDetails_delete']['limit'] = 50; // 50 requests per hour per user/key + $this->methods['addTrackingDetails_post']['limit'] = 1000; // 50 requests per hour per user/key + $this->methods['getTrackingDetails_post']['limit'] = 1000; // 50 requests per hour per user/key + $this->methods['updateFollowupDetails_post']['limit'] = 1000; // 50 requests per hour per user/key + $this->methods['loadFollowupDetails_post']['limit'] = 1000; // 50 requests per hour per user/key + $this->methods['getDashboardCallTrack_post']['limit'] = 1000; // 50 requests per hour per user/key + $this->methods['getRecentLeadDetails_post']['limit'] = 1000; // 50 requests per hour per user/key + $this->methods['getRecentCloseDetails_post']['limit'] = 1000; // 50 requests per hour per user/key + $this->methods['getRecentPendingDetails_post']['limit'] = 1000; // 50 requests per hour per user/key + $this->methods['callAsImportantFlag_post']['limit'] = 1000; // 50 requests per hour per user/key + + + // load the model + $this->load->model('Calltracking_model', 'Calltracking_model'); + + } + + /* + * get lead details with mobile number + * created by kms + * */ + public function getTrackingLeadDetails_post() + { + $requestedBy = $this->post('requestedBy'); + $mobileNumber = $this->post('mobileNumber'); + $branchID = $this->post('branchID'); + $loginType = $this->post('userType'); + $getLeadDetails = $this->Calltracking_model->getLeadDetails($requestedBy,$mobileNumber,$branchID,$loginType); + + if ($getLeadDetails) + { + $getLeadDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getLeadDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + /* + * add tracking lead details + * created by kms + * */ + + public function addLeadTrackingDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + //store lead details + $lead_details['LeadName'] = $this->post('studentName'); + $lead_details['MobileNumber'] = $this->post('mobileNumber'); + $lead_details['IsNewEnquiry'] = $this->post('enquiryStatus'); + $lead_details['CreatedBy'] = $this->post('createdBy'); + $lead_details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + + //store tracking details + $tracking_details['University'] = $this->post('universityID'); + $tracking_details['Course'] = $this->post('courseName'); + $tracking_details['ActivityStatus'] = $this->post('activity'); + $tracking_details['AssignedTo'] = $this->post('assignedTo'); + $tracking_details['StatusCode'] = $this->post('status'); + $tracking_details['ReferredBy'] = $this->post('referedBy'); + $tracking_details['AlternateMobile'] = $this->post('alterMobile'); + $tracking_details['Address'] = $this->post('address'); + $tracking_details['CreatedBy'] = $this->post('createdBy'); + $tracking_details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + $tracking_details['UpdatedOn'] = $now->format('Y-m-d H:i:s'); + $tracking_details['CreatedBranch'] = $this->post('branchId'); + //store tracking followup details + $tracking_followup_details['FollowupOn'] = $this->post('date'); + $tracking_followup_details['FollowupComments'] = $this->post('comments'); + $tracking_followup_details['CreatedBy'] = $this->post('createdBy'); + $tracking_followup_details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + + + + $leadDetails = $this->Calltracking_model->addleadDetails($lead_details,$tracking_details,$tracking_followup_details);// Check if the users data store contains users (in case the database result returns NULL) + if ($leadDetails) + { + $leadDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($leadDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get tracking details + * created by kms + * */ + public function getTrackingDetails_post() + { + $search['requestedBy'] = $this->post('requestedBy'); + $search['requestedDept'] = $this->post('requestedDept'); + // $search['branchID'] = $this->post('branchId'); + $search['searchDate'] = $this->post('searchDate'); + $search['CreatedBranch'] = $this->post('branchId'); + // $search['searchMobileNumber'] = $this->post('searchMobileNumber'); + // $search['searchName']= $this->post('searchName'); + $getTrackedDetails = $this->Calltracking_model->getTrackingDetails($search); + + if ($getTrackedDetails) + { + $getTrackedDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getTrackedDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * update tracking followup details + * created by kms + * */ + public function updateFollowupDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + + //store followup details for update + $update_followup_details['TrackingID'] = $this->post('trackingID'); + $update_followup_details['UpdatedBy'] = $this->post('updatedBy'); + $update_followup_details['StatusCode'] = $this->post('status'); + $update_followup_details['AssignedTo'] = $this->post('assignedTo'); + $update_followup_details['UpdatedOn'] = $now->format('Y-m-d H:i:s'); + $update_followup_details['CreatedBranch'] = $this->post('branchId'); + $update_followup_details['Address'] = $this->post('address'); + $update_followup_details['AlternateMobile'] = $this->post('alternateMobile'); + $update_followup_details['ReferredBy'] = $this->post('referredBy'); + // store followup details for insert + $followup_details['TrackingID'] = $this->post('trackingID'); + $followup_details['FollowupOn'] = $this->post('date'); + $followup_details['CreatedBy'] = $this->post('updatedBy'); + $followup_details['FollowupComments'] = $this->post('comments'); + $followup_details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + + + + + $updateDetails = $this->Calltracking_model->updateFollowupDetails($update_followup_details,$followup_details);// Check if the users data store contains users (in case the database result returns NULL) + if ($updateDetails) + { + $updateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + /* + * load followup details + * created by kms + * */ + + public function loadFollowupDetails_post() + { + $get_details['TrackingID'] = $this->post('trackingID'); + $get_details['UpdatedBy'] = $this->post('updatedBy'); + $get_details['CreatedBranch'] = $this->post('branchId'); + $get_details['requestedDept'] = $this->post('requestedDept'); + + $getLoadDetails = $this->Calltracking_model->getLoadFollowupDetails($get_details); + + if ($getLoadDetails) + { + $getLoadDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getLoadDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get dash board call track details + * created by kms + * */ + + public function getDashboardCallTrack_post() + { + $search['requestedBy'] = $this->post('requestedBy'); + $search['BranchID'] = $this->post('branchId'); + $search['requestedDept'] = $this->post('requestedDept'); + + $getdashBoardCallDetails = $this->Calltracking_model->getDashboardTrackingDetails($search); + if ($getdashBoardCallDetails) + { + $getdashBoardCallDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getdashBoardCallDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get recent call lead details + * created by kms + * */ + + public function getRecentLeadDetails_post() + { + $search['requestedBy'] = $this->post('requestedBy'); + $search['requestedDept'] = $this->post('requestedDept'); + $search['loadDate'] = $this->post('loadDate'); + $search['CreatedBranch'] = $this->post('branchId'); + // $search['searchDate'] = $this->post('searchDate'); + // $search['searchMobileNumber'] = $this->post('searchMobileNumber'); + // $search['searchName']= $this->post('searchName'); + $getRecentLeadDetails = $this->Calltracking_model->getRecentleadDetails($search); + + if ($getRecentLeadDetails) + { + $getRecentLeadDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getRecentLeadDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get recent close details + * created by kms + * */ + public function getRecentCloseDetails_post() + { + $search['requestedBy'] = $this->post('requestedBy'); + $search['requestedDept'] = $this->post('requestedDept'); + $search['loadDate'] = $this->post('loadDate'); + $search['CreatedBranch'] = $this->post('branchId'); + // $search['searchDate'] = $this->post('searchDate'); + // $search['searchMobileNumber'] = $this->post('searchMobileNumber'); + // $search['searchName']= $this->post('searchName'); + $getRecentCloseDetails = $this->Calltracking_model->getRecentCloseDetails($search); + + if ($getRecentCloseDetails) + { + $getRecentCloseDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getRecentCloseDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + /* + * get recent pending details + * created by kms + * */ + public function getRecentPendingDetails_post() + { + $search['requestedBy'] = $this->post('requestedBy'); + $search['requestedDept'] = $this->post('requestedDept'); + $search['loadDate'] = $this->post('loadDate'); + $search['CreatedBranch'] = $this->post('branchId'); + // $search['searchDate'] = $this->post('searchDate'); + // $search['searchMobileNumber'] = $this->post('searchMobileNumber'); + // $search['searchName']= $this->post('searchName'); + $getRecentPendingDetails = $this->Calltracking_model->getRecentPendingDetails($search); + + if ($getRecentPendingDetails) + { + $getRecentPendingDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getRecentPendingDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * mark as important for call + * created by kms + * */ + public function callAsImportantFlag_post(){ + $trackID = $this->post('trackId'); + $flagStatus = $this->post('flag'); + $updateFlag = $this->Calltracking_model->updateFlagStatus($trackID,$flagStatus); + + if ($updateFlag) + { + $updateFlag['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateFlag, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + + + +} \ No newline at end of file diff --git a/api/application/controllers/Center_Controller.php b/api/application/controllers/Center_Controller.php new file mode 100644 index 0000000..8b000cd --- /dev/null +++ b/api/application/controllers/Center_Controller.php @@ -0,0 +1,134 @@ +methods['addCenterDetails_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['addCenterDetails_post']['limit'] = 100; // 100 requests per hour per user/key + $this->methods['addCenterDetails_delete']['limit'] = 50; // 50 requests per hour per user/key + $this->methods['getCenterDetails_post']['limit'] = 500; // 50 requests per hour per user/key + $this->methods['updateCenterDetails_post']['limit'] = 500;// 500 requests per hour per user/key + + // load the model + $this->load->model('Center_model', 'center_model'); + + } + + /* + * Add Center details + * created by srk + * */ + + public function addCenterDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['CenterCode'] = $this->post('CenterCode'); + $details['CenterName'] = $this->post('CenterName'); + $details['CenterAddress'] = $this->post('Address'); + $details['Comments'] = $this->post('Comments'); + $details['CreatedBy'] = $this->post('createdBy'); + $details['IsActive'] = $this->post('status'); + $details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + + $centerDetails = $this->center_model->addCenter($details);// Check if the users data store contains users (in case the database result returns NULL) + if ($centerDetails) + { + $centerDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($centerDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get Batch details + * created by srk + */ + public function getCenterDetails_post() + { + $requestedBy = $this->post('requestedBy'); + $getCenter = $this->center_model->getCenter($requestedBy); + // print_r($getCenter); + // die; + if ($getCenter) + { + $getCenter['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getCenter, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * update Center details + * created by srk + */ + public function updateCenterDetails_post() + { + + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['CenterCode'] = $this->post('CenterCode'); + $details['CenterName'] = $this->post('CenterName'); + $details['CenterAddress'] = $this->post('Address'); + $details['Comments'] = $this->post('Comments'); + $CenterID=$this->post('CenterID'); + $details['IsActive'] = $this->post('status'); + $details['UpdateBy'] = $this->post('updateBy'); + $details['UpdateOn'] = $now->format("Y-m-d H:i:s"); + + + $updateDetails = $this->center_model->updateCenter($details,$CenterID);// Check if the users data store contains users (in case the database result returns NULL) + + if ($updateDetails) + { + $updateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + + + + + +} diff --git a/api/application/controllers/Certificate_Controller.php b/api/application/controllers/Certificate_Controller.php new file mode 100644 index 0000000..fc65c97 --- /dev/null +++ b/api/application/controllers/Certificate_Controller.php @@ -0,0 +1,138 @@ +methods['addCertificateDetails_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['addCertificateDetails_post']['limit'] = 100; // 100 requests per hour per user/key + $this->methods['addCertificateDetails_delete']['limit'] = 50; // 50 requests per hour per user/key + $this->methods['getCertificateDetails_post']['limit'] = 500; // 50 requests per hour per user/key + $this->methods['updateCertificateDetails_post']['limit'] = 500; + // load the model + $this->load->model('Certificate_model', 'certificate_model'); + + } + + /* + * This method used to add Certificate details + * created by Surendiran + * */ + + public function addCertificateDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['CertificateName'] = $this->post('certificateName'); + $details['CreatedBy'] = $this->post('createdBy'); + $details['IsActive'] = $this->post('status'); + $details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + $certificateDetails = $this->certificate_model->addcertificate($details);// Check if the users data store contains users (in case the database result returns NULL) + if ($certificateDetails) + { + $certificateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($certificateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + + /* + * get Certificate details + * created by Surendiran + * */ + public function getCertificateDetails_post() + { + $requestedBy = $this->post('requestedBy'); + $getCertificate = $this->certificate_model->getCertificate($requestedBy); + + if ($getCertificate) + { + $getCertificate['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getCertificate, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + /* + * update the Certificate details + * created by Surendiran + * */ + public function updateCertificateDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $updateID = $this->post('updateID'); + $details['CertificateName'] = $this->post('certificateName'); + $details['IsActive'] = $this->post('status'); + $details['UpdatedBy'] = $this->post('updatedBy'); + $details['UpdatedOn'] = $now->format("Y-m-d H:i:s"); + $certificateDetails = $this->certificate_model->update($details,$updateID);// Check if the users data store contains users (in case the database result returns NULL) + + if ($certificateDetails) + + { + $certificateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($certificateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } +} \ No newline at end of file diff --git a/api/application/controllers/Course_Controller.php b/api/application/controllers/Course_Controller.php new file mode 100644 index 0000000..fc35a4d --- /dev/null +++ b/api/application/controllers/Course_Controller.php @@ -0,0 +1,192 @@ +methods['addCourseDetails_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['addCourseDetails_post']['limit'] = 100; // 100 requests per hour per user/key + $this->methods['addCourseDetails_delete']['limit'] = 500; // 50 requests per hour per user/key + $this->methods['getCourseDetails_post']['limit'] = 1500; // 50 requests per hour per user/key + $this->methods['updateCourseDetails_post']['limit'] = 500; + // load the model + $this->load->model('Course_model', 'course_model'); + + } + + /* + * This method used to add Course details + * created by kms + * */ + + public function addCourseDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['CourseCode'] = $this->post('courseCode'); + $details['CourseName'] = $this->post('courseName'); + $details['UniversityID'] = $this->post('universityName'); + $details['Specilization1'] = $this->post('specilization1'); + $details['Specilization2'] = $this->post('specilization2'); + + //$details['FeesType'] = $this->post('feesType'); + $details['PC'] = $this->post('provFess'); + $details['DC'] = $this->post('degreeAmount'); + $details['TC'] = $this->post('transferAmount'); + $details['MC'] = $this->post('migrationAmount'); + $details['OtherFees'] = $this->post('otherAmount'); + $details['CreatedBy'] = $this->post('createdBy'); + $details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + $details['IsActive'] = $this->post('status'); + $jsonRegularFeesData=$this->post('regularFeesAmounts'); + $jsonLateralFeesData=$this->post('lateralFeesAmounts'); + $jsonSemFeesData=$this->post('semFeesAmounts'); + // push regular,lateral fees into same array + if($jsonRegularFeesData['FeesAmount'] != 0 AND $jsonRegularFeesData['FeesAmount'] != '' AND $jsonRegularFeesData['FeesAmount'] != 'undefined'){ + array_push($jsonSemFeesData,$jsonRegularFeesData); + } + if($jsonLateralFeesData['FeesAmount'] != 0 AND $jsonLateralFeesData['FeesAmount'] != '' AND $jsonLateralFeesData['FeesAmount'] != 'undefined'){ + array_push($jsonSemFeesData,$jsonLateralFeesData); + } + // get subject details + $subjectDetails=$this->post('subjects'); + + $courseDetails = $this->course_model->addCourse($details,$jsonSemFeesData,$subjectDetails);// Check if the users data store contains users (in case the database result returns NULL) + if ($courseDetails) + { + $courseDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($courseDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get course details + * created by kms + * */ + public function getCourseDetails_post() + { + $requestedBy = $this->post('requestedBy'); + $getCourse = $this->course_model->getCourse($requestedBy); + + if ($getCourse) + { + $getCourse['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getCourse, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + public function getCourseUnivFeesDetails_post() { + $requestedBy = $this->post('requestedBy'); + $getCourseUnivFee = $this->course_model->getCourseUnivFeesTypes($requestedBy); + + if ($getCourseUnivFee) + { + $getCourseUnivFee['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getCourseUnivFee, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + /* + * update the course details + * created by kms + * */ + public function updateCourseDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['CourseID'] = $this->post('courseID'); + $details['CourseCode'] = $this->post('courseCode'); + $details['CourseName'] = $this->post('courseName'); + $details['UniversityID'] = $this->post('universityID'); + $details['Specilization1'] = $this->post('specilization1'); + $details['Specilization2'] = $this->post('specilization2'); + $details['IsActive'] = $this->post('status'); + $details['PC'] = $this->post('provFess'); + $details['DC'] = $this->post('degreeAmount'); + $details['TC'] = $this->post('transferAmount'); + $details['MC'] = $this->post('migrationAmount'); + $details['OtherFees'] = $this->post('otherAmount'); + $details['UpdatedBy'] = $this->post('updatedBy'); + $details['UpdatedOn'] = $now->format('Y-m-d H:i:s'); + $existCourseID = $this->post('existCourseID'); + $jsonRegularFeesData=$this->post('regularFeesAmounts'); + $jsonLateralFeesData=$this->post('lateralFeesAmounts'); + $jsonSemFeesData=$this->post('semFeesAmounts'); + // push regular,lateral fees into same array + if($jsonRegularFeesData != '' AND $jsonRegularFeesData != null AND $jsonRegularFeesData != 'undefined'){ + array_push($jsonSemFeesData,$jsonRegularFeesData); + + } + if($jsonLateralFeesData != '' AND $jsonLateralFeesData != null AND $jsonLateralFeesData != 'undefined'){ + array_push($jsonSemFeesData,$jsonLateralFeesData); + + } + + // update course subject details + $subjectDetails['UniversityID'] = $this->post('universityID'); + $subjectDetails['CourseID'] = $this->post('courseID'); + $subjectDetails['Subjects'] = $this->post('subjects'); + $subjectDetails['UpdatedBy'] = $this->post('updatedBy'); + $subjectDetails['UpdatedOn'] = $now->format('Y-m-d H:i:s'); + + $updateDetails = $this->course_model->updateCourse($details,$jsonSemFeesData,$subjectDetails);// Check if the users data store contains users (in case the database result returns NULL) + if ($updateDetails) + { + $updateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + +} \ No newline at end of file diff --git a/api/application/controllers/Dashboard_Controller.php b/api/application/controllers/Dashboard_Controller.php new file mode 100644 index 0000000..30cd7d1 --- /dev/null +++ b/api/application/controllers/Dashboard_Controller.php @@ -0,0 +1,92 @@ +load->model('Dashboard_model', 'dashboard_model'); + } + + public function getTotalUsers_post() { + $data = $this->post('data'); + $totalUsers = $this->dashboard_model->get_total_users( $data );// Check if the employee exist + if ($totalUsers) { + $totalUsers['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($totalUsers, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function getTotalStudent_post() { + $data = $this->post('data'); + $totalStudents = $this->dashboard_model->get_total_students( $data );// Check if the employee exist + if ($totalStudents) { + $totalStudents['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($totalStudents, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function getTotalEmployee_post() { + $data = $this->post('data'); + $totalEmployee = $this->dashboard_model->get_total_employee( $data );// Check if the employee exist + if ($totalEmployee) { + $totalEmployee['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($totalEmployee, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } +} diff --git a/api/application/controllers/DayBookMaster_Controller.php b/api/application/controllers/DayBookMaster_Controller.php new file mode 100644 index 0000000..5704dc8 --- /dev/null +++ b/api/application/controllers/DayBookMaster_Controller.php @@ -0,0 +1,134 @@ +methods['addDaybookMasterDetails_post']['limit'] = 100; // 50 requests per hour per user/key + $this->methods['getDayBookMasterDetails_post']['limit'] = 500; // 50 requests per hour per user/key + $this->methods['updateDayBookMasterDetails_post']['limit'] = 500; + // load the model + $this->load->model('DaybookMaster_model', 'daybookmaster_model'); + + } + + /* + * This method used to get day book master details + * created by kms + * */ + + public function addDaybookMasterDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['TypeID'] = $this->post('type'); + $details['TypeName'] = $this->post('name'); + $details['IsActive'] = $this->post('status'); + $details['CreatedBy'] = $this->post('createdBy'); + $details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + $addDetails = $this->daybookmaster_model->addDetails($details);// Check if the users data store contains users (in case the database result returns NULL) + if ($addDetails) + { + $addDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($addDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * This method used to get day book master details + * created by kms + * */ + public function getDayBookMasterDetails_post() + { + $requestedBy = $this->post('requestedBy'); + $getdetails = $this->daybookmaster_model->getDayBookDetails($requestedBy); + + if ($getdetails) + { + $getdetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getdetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + /* + * update the day book details + * created by kms + * */ + public function updateDayBookMasterDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['ID'] = $this->post('ID'); + $details['TypeName'] = $this->post('TypeName'); + $details['TypeID'] = $this->post('TypeID'); + $details['IsActive'] = $this->post('status'); + $details['UpdatedBy'] = $this->post('updatedBy'); + $details['UpdatedOn'] = $now->format("Y-m-d H:i:s"); + $updateDetails = $this->daybookmaster_model->updateDayBook($details);// Check if the users data store contains users (in case the database result returns NULL) + + if ($updateDetails) + + { + $updateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + + +} \ No newline at end of file diff --git a/api/application/controllers/DayBook_Controller.php b/api/application/controllers/DayBook_Controller.php new file mode 100644 index 0000000..9407434 --- /dev/null +++ b/api/application/controllers/DayBook_Controller.php @@ -0,0 +1,292 @@ +load->model('DayBook_model', 'daybook_model'); + } + + //get income expese type, name details + public function getIncomeExpenseTypeState_post() { + $reqData = $this->post('data'); + $getIncomeExpenseTypeState = $this->daybook_model->get_Income_Expense_typeState();// Check if the employee exist + if ($getIncomeExpenseTypeState) + { + $getIncomeExpenseTypeState['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getIncomeExpenseTypeState, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + + public function empDayBookModuleAccessChk_post() { + $reqDataBy = $this->post('localReqDetails'); + // print_r($reqDataBy);exit(); + $empDayBkAccessChk = $this->daybook_model->emp_day_book_AccessChk($reqDataBy);// Check if the employee exist + if ($empDayBkAccessChk) + { + $empDayBkAccessChk['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($empDayBkAccessChk, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + + // {"data":{"date":"22-12-2017"},"localReqDetails":{"localUserID":"137","localBranchID":"001","localType":"R002","localOn":"2017-12-22T12:45:19.688Z","status":"active"}} + + // get all daybook details + public function getDayBookDetails_post() { + $reqData = $this->post('data'); + $reqDataBy = $this->post('localReqDetails'); + $getDayBookDetails = $this->daybook_model->get_Daybook_Details_List($reqData, $reqDataBy);// Check if the employee exist + if ($getDayBookDetails) + { + $getDayBookDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getDayBookDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + + public function getDayBookApprovalDetails_post() { + $reqData = $this->post('data'); + $reqDataBy = $this->post('localReqDetails'); + $getDayBookApprovalDetails = $this->daybook_model->get_Daybook_Approval_Details_List($reqData, $reqDataBy);// Check if the employee exist + if ($getDayBookApprovalDetails) + { + $getDayBookApprovalDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getDayBookApprovalDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function deleteDayBookDetails_post() { + $reqData = $this->post('data'); + $reqbyData = $this->post('localReqDetails'); + $deletedayBookDetails = $this->daybook_model->delete_dayBookDetails($reqData);// Check if the employee exist + if ($deletedayBookDetails) + { + $deletedayBookDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($deletedayBookDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function deleteDayBookFeePayableDetails_post() { + $reqData = $this->post('data'); + $reqbyData = $this->post('requestDetails'); + + // print_r($reqbyData);exit(); + $deletedayBookFeePayableDetails = $this->daybook_model->delete_dayBookFeePayableDetails($reqData);// Check if the employee exist + if ($deletedayBookFeePayableDetails) + { + $deletedayBookFeePayableDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($deletedayBookFeePayableDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function updateDayBookDetails_post() { + $reqData = $this->post('data'); + $reqbyData = $this->post('localReqDetails'); + + $updateFor = $reqData['id']; + $req['Type'] = $reqData['type']; + $req['Amount'] = $reqData['amount']; + $req['Description'] = $reqData['description']; + $req['UpdatedBy'] = $reqbyData['localUserID']; + $req['PaidTo'] = $reqData['paidTo']; + $req['PaidDescription'] = $reqData['description_paid']; + $req['VoucherNumber'] = $reqData['voucherNumber']; + $req['BranchCode'] = $reqData['branch']; + $req['Name'] = $reqData['name']; + $date = date('Y-m-d H:i:s'); + $req['UpdatedOn'] = $date; + $updatedayBookDetails = $this->daybook_model->update_dayBookDetails($req , $updateFor);// Check if the employee exist + if ($updatedayBookDetails) + { + $updatedayBookDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updatedayBookDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // add details daybook + public function adddaybook_post() { + + $reqData = $this->post('data'); + $reqbyData = $this->post('localReqDetails'); + + $req['Name'] = $reqData['name']; + $req['Type'] = $reqData['type']; + $req['Amount'] = $reqData['amount']; + // $d = new DateTime($reqData['date']); + $req['Date'] = $reqData['date']; + $req['Status'] = $reqData['status']; + $req['Description'] = $reqData['description']; + $req['BranchCode'] = $reqbyData['localBranchID']; + $req['CreatedBy'] = $reqbyData['localUserID']; + $req['PaidTo'] = $reqData['paidTo']; + $req['PaidDescription'] = $reqData['description_paid']; + $req['VoucherNumber'] = $reqData['voucherNumber']; + $date = date('Y-m-d H:i:s'); + $req['CreatedOn'] = $date; + // print_r($req);exit(); + $addDayBookDetails = $this->daybook_model->add_dayBook($req);// Check if the employee exist + if ($addDayBookDetails) + { + $addDayBookDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($addDayBookDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function updateDayBookStatusAdmin_post() { + + $reqData = $this->post('data'); + $reqDetails = $this->post('requestDetails'); + + $time = date('Y-m-d H:i:s'); + $dateTime = $time; + + $count = count($reqData); + + for($i=0; $i < $count; $i++) { + $data[] = array( + 'ID' => $reqData[$i]['dabookListId'], + 'Approval_By' => $reqDetails['localUserID'], + 'Status' => $reqData[$i]['ListCodeStatus'], + 'Approval_Comments' => $reqData[$i]['comments'], + 'UpdatedBy' => $reqDetails['localUserID'], + 'UpdatedOn' => $dateTime, + ); + } + + $updateStatusAdminDetails = $this->daybook_model->update_status_admin($data);// Check if the employee exist + if ($updateStatusAdminDetails) + { + $updateStatusAdminDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateStatusAdminDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + public function getDayBookDetailsSuperAdmin_post() { + $reqData = $this->post('data'); + $reqDataBy = $this->post('localReqDetails'); + $getDayBookDetails = $this->daybook_model->get_Daybook_Details_List_superAdmin($reqData, $reqDataBy);// Check if the employee exist + if ($getDayBookDetails) + { + $getDayBookDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getDayBookDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + +} diff --git a/api/application/controllers/Employee_Controller.php b/api/application/controllers/Employee_Controller.php new file mode 100644 index 0000000..8c2c53e --- /dev/null +++ b/api/application/controllers/Employee_Controller.php @@ -0,0 +1,506 @@ +methods['employee_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['employee_post']['limit'] = 100; // 100 requests per hour per user/key + $this->methods['employee_delete']['limit'] = 50; // 50 requests per hour per user/key + + $this->methods['getRoleDetails_post']['limit'] = 100; + $this->methods['getMasterBranchDetails_post']['limit'] = 100; + $this->methods['addEmployee_post']['limit'] = 100; + $this->methods['check_exist_post']['limit'] = 100; + $this->methods['check_update_exist_post']['limit'] = 100; + $this->methods['updateEmployee_post']['limit'] = 100; + $this->methods['updateEmpBranchDetail_post']['limit'] = 100; + // load the employee model + $this->load->model('Employee_model', 'employee_model'); + } + + // get login employee profile details + public function employeeGetProf_post() { + $empLoginID = $this->post('employeeLoginID'); + $employeeDetails = $this->employee_model->get_emp_prof_detail( $empLoginID );// Check if the employee exist + if ($employeeDetails) + { + $employeeDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($employeeDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + //This method used to get employee Details + public function employee_post() + { + $empLoginID = $this->post('employeeLoginID'); + $employeeDetails = $this->employee_model->get_emp_detail( $empLoginID );// Check if the employee exist + if ($employeeDetails) + { + $employeeDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($employeeDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // get all employee details + public function getEmployeeList_post() { + $reqData = $this->post('data'); + $loginUserId = $reqData['localUserID']; + $loginUserBranchId = $reqData['localBranchID']; + $loginUserType = $reqData['localType']; + $employeeListDetails = $this->employee_model->get_employee_list( $loginUserId, $loginUserBranchId, $loginUserType );// Check if the employee exist + if ($employeeListDetails) + { + $employeeListDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($employeeListDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // get role details + public function getRoleDetails_post() { + $reqRoleID = $this->post('reqRoleID'); + $resRoleDetails = $this->employee_model->get_req_role_detail( $reqRoleID );// Check if the employee exist + if ($resRoleDetails) + { + $resRoleDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($resRoleDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // get branch details + public function getMasterBranchDetails_post () { + $reqRoleID = $this->post('reqRoleID'); + $reqUserID = $this->post('reqUserID'); + $resMasterBranchDetails = $this->employee_model->get_req_master_branch_detail( $reqRoleID, $reqUserID );// Check if the employee exist + if ($resMasterBranchDetails) + { + $resMasterBranchDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($resMasterBranchDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // check exist values details + public function check_exist_post() { + $data = $this->post('data'); + $checkData = $this->post('check'); + $checkRes = $this->employee_model->check_exist( $data, $checkData );// Check if the employee exist + if ($checkRes) + { + $checkRes['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($checkRes, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // add employee without image + public function addEmployee_post() { + $data = $this->post('data'); + + $createdBy = $this->post('createdBy'); + + $imagename = ''; + $size = ''; + $imageSource = ''; + + $req['StaffID'] = $data['employeeId']; + $req['Firstname'] = $data['firstname']; + $req['Lastname'] = $data['lastname']; + $req['Fathername'] = $data['fathername']; + $req['EmailID'] = $data['emailId']; + $req['MotherName'] = $data['mothername']; + $req['MobileNumber'] = $data['primaryPhone']; + $req['AlternateNumber'] = $data['secondaryPhone']; + $req['Gender'] = $data['gender']; + $req['DOB'] = $data['dateofbirth']; + // $req['DOB'] = $data['dateofbirth']; + $req['PresentAddress'] = $data['address2']; + $req['PermanentAddress'] = $data['address1']; + $req['AadharNumber'] = $data['aadharNumber']; + $req['OtherID'] = $data['otherId']; + $req['OtherIDDetails'] = $data['otherIdDetails']; + $req['Qualification'] = $data['qualificaion']; + $req['BranchCode'] = $data['homeBranch']; + $req['IsActive'] = $data['switchsetting']; + + $req['FinanceModuleAccess'] = $data['finaceModuleAccess']; + + $req['DOJ'] = $data['dateofjoining']; + $req['JobResponsibility'] = $data['jobResponsibility']; + // $req['DOJ'] = $data['dateofjoining']; + $req['ListCode'] = $data['role']; + $req['CreatedBy'] = $createdBy; + // print_r($req);exit(); + $employeeAdd = $this->employee_model->add_employee( $req, $createdBy, $imagename, $imageSource, $size );// Check if the employee exist + if ($employeeAdd) + { + $employeeAdd['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($employeeAdd, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // add employee with image + public function addEmployeeImage_post() { + // print_r($this->post('idProof'));exit(); + $imagename = $_FILES['idProof']['name']; + + $size = $_FILES['idProof']['size']; + + $imageSource = $_FILES['idProof']['tmp_name']; + // echo $size;exit(); + $data= $this->post('data'); + $createdBy= $this->post('createdBy'); + $temp = json_decode($data, true); + + $req['StaffID'] = $temp['employeeId']; + $req['Firstname'] = $temp['firstname']; + $req['Lastname'] = $temp['lastname']; + $req['Fathername'] = $temp['fathername']; + $req['EmailID'] = $temp['emailId']; + $req['MotherName'] = $temp['mothername']; + $req['MobileNumber'] = $temp['primaryPhone']; + $req['AlternateNumber'] = $temp['secondaryPhone']; + $req['Gender'] = $temp['gender']; + $req['DOB'] = $temp['dateofbirth']; + // $req['DOB'] = $data['dateofbirth']; + $req['PresentAddress'] = $temp['address2']; + $req['PermanentAddress'] = $temp['address1']; + $req['AadharNumber'] = $temp['aadharNumber']; + $req['OtherID'] = $temp['otherId']; + $req['OtherIDDetails'] = $temp['otherIdDetails']; + $req['Qualification'] = $temp['qualificaion']; + $req['BranchCode'] = $temp['homeBranch']; + $req['IsActive'] = $temp['switchsetting']; + + $req['FinanceModuleAccess'] = $temp['finaceModuleAccess']; + + $req['DOJ'] = $temp['dateofjoining']; + $req['JobResponsibility'] = $temp['jobResponsibility']; + // $req['DOJ'] = $data['dateofjoining']; + $req['ListCode'] = $temp['role']; + $req['CreatedBy'] = $createdBy; + + $employeeAdd = $this->employee_model->add_employee( $req, $createdBy, $imagename, $imageSource, $size );// Check if the employee exist + if ($employeeAdd) + { + $employeeAdd['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($employeeAdd, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function check_update_exist_post() { + $exceptId = $this->post('exceptId'); + $datas = $this->post('datas'); + $checkFor = $this->post('check'); + + $checkRes = $this->employee_model->check_update_exist( $exceptId, $datas, $checkFor );// Check if the employee exist + if ($checkRes) + { + $checkRes['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($checkRes, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + + // update employee with image + public function updateEmployeeImage_post() { + + $imagename = $_FILES['idProof']['name']; + $size = $_FILES['idProof']['size']; + $imageSource = $_FILES['idProof']['tmp_name']; + + $temp= $this->post('data'); + $createdBy= $this->post('createdBy'); + $data = json_decode($temp, true); + + $updatedBy = $this->post('updatedBy'); + $updateStaff = $data['StaffID']; + + $req['Firstname'] = $data['Firstname']; + $req['Lastname'] = $data['Lastname']; + $req['Fathername'] = $data['Fathername']; + $req['EmailID'] = $data['EmailID']; + $req['MotherName'] = $data['MotherName']; + $req['MobileNumber'] = $data['MobileNumber']; + $req['AlternateNumber'] = $data['AlternateNumber']; + $req['Gender'] = $data['Gender']; + // $req['DOB'] = date('d-m-Y', strtotime($data['DOB']) ); + $req['DOB'] = $data['DOB']; + $req['PresentAddress'] = $data['PresentAddress']; + $req['PermanentAddress'] = $data['PermanentAddress']; + $req['AadharNumber'] = $data['AadharNumber']; + $req['OtherID'] = $data['OtherID']; + $req['OtherIDDetails'] = $data['OtherIDDetails']; + $req['Qualification'] = $data['Qualification']; + // $req['JobResponsibility'] = $data['JobResponsibility']; + $req['ProfilePicPath'] = $data['ProfilePicPath']; + // $req['BranchCode'] = $data['BranchCode']; + $req['IsActive'] = $data['IsActive']; + // $req['DOJ'] = date('d-m-Y', strtotime($data['DOJ']) ); + $req['DOJ'] = $data['DOJ']; + // $req['ListCode'] = $data['ListCode']; + $req['UpdatedBy'] = $updatedBy; + $date = date('Y-m-d H:i:s'); + $req['UpdatedOn'] = $date; + // print_r($req);exit(); + $employeeUpdate = $this->employee_model->update_employee( $req, $updateStaff, $imagename, $imageSource, $size );// Check if the employee exist + if ($employeeUpdate) + { + $employeeUpdate['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($employeeUpdate, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // update employee details without image + public function updateEmployee_post () { + $data = $this->post('data'); + $updatedBy = $this->post('updatedBy'); + $updateStaff = $data['StaffID']; + + $imagename = ''; + $size = ''; + $imageSource = ''; + + $req['Firstname'] = $data['Firstname']; + $req['Lastname'] = $data['Lastname']; + $req['Fathername'] = $data['Fathername']; + $req['EmailID'] = $data['EmailID']; + $req['MotherName'] = $data['MotherName']; + $req['MobileNumber'] = $data['MobileNumber']; + $req['AlternateNumber'] = $data['AlternateNumber']; + $req['Gender'] = $data['Gender']; + // $req['DOB'] = date('d-m-Y', strtotime($data['DOB']) ); + $req['DOB'] = $data['DOB']; + $req['PresentAddress'] = $data['PresentAddress']; + $req['PermanentAddress'] = $data['PermanentAddress']; + $req['AadharNumber'] = $data['AadharNumber']; + $req['OtherID'] = $data['OtherID']; + $req['OtherIDDetails'] = $data['OtherIDDetails']; + $req['Qualification'] = $data['Qualification']; + // $req['ProfilePicPath'] = $data['ProfilePicPath']; + // $req['JobResponsibility'] = $data['JobResponsibility']; + // $req['BranchCode'] = $data['BranchCode']; + $req['IsActive'] = $data['IsActive']; + // $req['DOJ'] = date('d-m-Y', strtotime($data['DOJ']) ); + $req['DOJ'] = $data['DOJ']; + // $req['ListCode'] = $data['ListCode']; + $req['UpdatedBy'] = $updatedBy; + $date = date('Y-m-d H:i:s'); + $req['UpdatedOn'] = $date; + // print_r($req);exit(); + $employeeUpdate = $this->employee_model->update_employee( $req, $updateStaff, $imagename, $imageSource, $size );// Check if the employee exist + if ($employeeUpdate) + { + $employeeUpdate['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($employeeUpdate, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + + // get employee branch details + public function getEmpBranchDetails_post() { + $staffID = $this->post('staffID'); + $employeeBranch = $this->employee_model->get_employee_branch( $staffID );// Check if the employee exist + if ($employeeBranch) + { + $employeeBranch['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($employeeBranch, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function addEmpBranchDetail_post() { + $req['StaffID'] = $this->post('empFor'); + $req['BranchCode'] = $this->post('updateBranch'); + $req['ListCode'] = $this->post('updateRole'); + $req['JobResponsibility'] = $this->post('JobResponsibility'); + + $req['FinanceModuleAccess'] = $this->post('FinanceModuleAccess') == 1 ? '1' : '0'; + $req['CreatedBy'] = $this->post('updateBy'); + $date = date('Y-m-d H:i:s'); + $req['IsActive'] = '1'; + $req['UpdatedOn'] = $date; + + $addEmpBranch = $this->employee_model->add_employee_branch( $req );// Check if the employee exist + if ($addEmpBranch) + { + $addEmpBranch['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($addEmpBranch, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // update employee branch + public function updateEmpBranchDetail_post() { + // exit(); + $req['StaffID'] = $this->post('empFor'); + $req['BranchCode'] = $this->post('updateBranch'); + $req['ListCode'] = $this->post('updateRole'); + $req['JobResponsibility'] = $this->post('JobResponsibility'); + $req['HomeBranch'] = $this->post('HomeBranch'); + + $req['FinanceModuleAccess'] = $this->post('FinanceModuleAccess') == 1 ? '1' : '0'; + $req['IsActive'] = $this->post('IsActive') == 1 ? '1' : '0'; + // echo $req['FinanceModuleAccess'];exit(); + $req['UpdatedBy'] = $this->post('updateBy'); + $date = date('Y-m-d H:i:s'); + $req['UpdatedOn'] = $date; + + $updateFor = $this->post('ID'); + + $updateBranch = $this->employee_model->upate_employee_branch( $updateFor, $req );// Check if the employee exist + if ($updateBranch) + { + $updateBranch['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateBranch, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } +} diff --git a/api/application/controllers/Fees_Status_Controller.php b/api/application/controllers/Fees_Status_Controller.php new file mode 100644 index 0000000..782a303 --- /dev/null +++ b/api/application/controllers/Fees_Status_Controller.php @@ -0,0 +1,295 @@ +methods['getStudentList_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['getStudentList_post']['limit'] = 1000; // 1000 requests per hour per user/key + $this->methods['getStudentList_delete']['limit'] = 50; // 50 requests per hour per user/key + $this->methods['getFeesStructure_post']['limit'] = 1000; // 1000 requests per hour per user/key + $this->methods['updateFeesDetails_post']['limit'] = 1000; // 1000 requests per hour per user/key + $this->methods['getUniversityCourseForFees_post']['limit'] = 1000; // 1000 requests per hour per user/key + $this->methods['getFeesStructureAssign_post']['limit'] = 1000; // 1000 requests per hour per user/key + $this->methods['setFeesForStudent_post']['limit'] = 1000; // 1000 requests per hour per user/key + // $this->methods['sendStudentNotification_post']['limit'] = 2000; // 2000 requests per hour per user/key + + + // load the model + $this->load->model('Fees_status_model', 'Fees_model'); + + } + + + + /* + * get student list for fees update + * created by kms + * */ + public function getStudentList_post() + { + $search['requestedBy'] = $this->post('requestedtBy'); + $search['Firstname'] = $this->post('studentName'); + $search['MobileNumber'] = $this->post('mobileNumber'); + $search['UniversityID'] = $this->post('university'); + $search['CourseID'] = $this->post('course'); + $search['requestedDept'] = $this->post('requestedDept'); + $search['requestedBranch'] = $this->post('branchId'); + $getStudentDetails = $this->Fees_model->getStudentList($search); + if ($getStudentDetails) + { + $getStudentDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStudentDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + /* + * get student fees structure + * created by kms + * */ + public function getFeesStructure_post() + { + $student['ID'] = $this->post('ID'); + $student['requestedBy'] = $this->post('requestedtBy'); + $student['CourseID'] = $this->post('courseID'); + $student['StudentID'] = $this->post('studentID'); + $getStudentFeesDetails = $this->Fees_model->getStudentFeesStructure($student); + if ($getStudentFeesDetails) + { + $getStudentFeesDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStudentFeesDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * update fees details for student + * created by kms + * */ + + + public function updateFeesDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + /*for track purpose*/ + + /* $trackDetails['MobileNumber'] = $this->post('mobileNumber'); + $trackDetails['LeadName'] = $this->post('studentName'); + $trackDetails['University'] = $this->post('university'); + $trackDetails['Course'] = $this->post('course'); + $trackDetails['StatusCode'] = $this->post('statusCode'); + $trackDetails['FollowupOn'] = $now->format('d-m-Y'); + $trackDetails['FollowupComments'] = $this->post('commentsForStudent'); + $trackDetails['CreatedBy'] = $this->post('createdBy'); + $trackDetails['CreatedOn'] = $now->format('Y-m-d H:i:s');*/ + + /*track array end*/ + + $detailsChild['StudentID'] = $this->post('studID'); + $detailsChild['FeesId'] = $this->post('feesID'); + $detailsChild['ReceiptNo'] = $this->post('billNO'); + $detailsChild['BillDate'] = $this->post('billDate'); + $detailsChild['BillAmount'] = $this->post('billAmount'); + $detailsChild['ModeOfPayment'] = $this->post('modeOfPayment'); + $detailsChild['CommentsForStudent'] = $this->post('commentsForStudent'); + $detailsChild['InternalComments'] = $this->post('internalComments'); + $detailsChild['CreatedBy'] = $this->post('createdBy'); + $detailsChild['CreatedOn'] = $now->format('Y-m-d H:i:s'); + $detailsChild['UpdatedBy'] = $this->post('requestedBranch'); + $updateDetails = $this->Fees_model->updateFees($detailsChild,$this->post('courseID'));// Check if the users data store contains users (in case the database result returns NULL) + if ($updateDetails) + { + $updateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + /* + * get university and course details for fees update + * created by kms + * */ + public function getUniversityCourseForFees_post() + { + $getUnivDetails = $this->Fees_model->getUniversityDetails(); + if ($getUnivDetails) + { + $getUnivDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getUnivDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + /* + * get student set fees details + * created by kms + * */ + /* + * get student fees structure + * created by kms + * */ + public function getFeesStructureAssign_post() + { + $student['ID'] = $this->post('ID'); + $student['requestedBy'] = $this->post('requestedtBy'); + $student['CourseID'] = $this->post('courseID'); + $student['StudentID'] = $this->post('studentID'); + $getStudentFeesDetails = $this->Fees_model->getFeesStructureAssign($student); + if ($getStudentFeesDetails) + { + $getStudentFeesDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStudentFeesDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * set fees for student + * created by kms + * */ + public function setFeesForStudent_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['StudentID'] = $this->post('studID'); + $details['CourseID'] = $this->post('courseID'); + $details['FeesType'] = $this->post('feesID'); + $details['CourseFees'] = $this->post('courseAmount'); + $details['SessionName'] = $this->post('session'); + $details['ToSessionName'] = $this->post('sessionTo'); + $details['RollNo'] = $this->post('rollNo'); + $details['STFOrWR'] = $this->post('STFWR'); + $details['Waiver'] = $this->post('waiver'); + $details['Others'] = $this->post('other'); + $details['CreatedBy'] = $this->post('createdBy'); + $details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + $details['BatchCode'] = $this->post('batchCode'); + + $jsonInstallmenData = $this->post('installmentItems'); + + $updateDetails = $this->Fees_model->setFees($details,$jsonInstallmenData);// Check if the users data store contains users (in case the database result returns NULL) + if ($updateDetails) + { + $updateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * send notification for student + * created by kms + * */ + public function sendStudentNotification_get(){ + + $sendMessage = $this->Fees_model->studentNotification(); + + if ($sendMessage) + { + echo "Success"; + /* $this->response([ + 'message' => 'Done!', + 'status' => REST_Controller::HTTP_OK + ], REST_Controller::HTTP_OK); // NOT_FOUND (404) being the HTTP response code*/ + } + else + { + // Set the response and exit + /* $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code*/ + } + + } + + + + +} \ No newline at end of file diff --git a/api/application/controllers/Forget_Controller.php b/api/application/controllers/Forget_Controller.php new file mode 100644 index 0000000..3da21f7 --- /dev/null +++ b/api/application/controllers/Forget_Controller.php @@ -0,0 +1,82 @@ +methods['forgetlogin_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['forgetlogin_post']['limit'] = 500; // 500 requests per hour per user/key + + $this->methods['forgetlogin_delete']['limit'] = 50; // 50 requests per hour per user/key + + $this->load->model('Forgot_model', 'forgot_model'); + + } + + + public function forgetlogin_post() + { + //$userMobile = $this->post('userMobile'); + $details['MobileNumber'] = $this->post('userMobile'); + // $details['Password'] = $this->post('password'); + + + function generateRandomString($length = 8) { + $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $charactersLength = strlen($characters); + $randomString = ''; + for ($i = 0; $i < $length; $i++) { + $randomString .= $characters[rand(0, $charactersLength - 1)]; + } + return $randomString; + } + $password= generateRandomString(); + $details['Password'] = md5($password); + + $loginDetails = $this->forgot_model->forget($details, $password);// Check if the users data store contains users (in case the database result returns NULL) + if ($loginDetails) + { + $loginDetails['status'] = REST_Controller::HTTP_OK; + //Set the response and exit + $this->response($loginDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + + } + + + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + +} + diff --git a/api/application/controllers/HallTickets_Controller.php b/api/application/controllers/HallTickets_Controller.php new file mode 100644 index 0000000..9a26ca5 --- /dev/null +++ b/api/application/controllers/HallTickets_Controller.php @@ -0,0 +1,76 @@ +methods['getCourseSubjectDetails_post']['limit'] = 500; // 500 requests per hour per user/key + + // load the model + $this->load->model('Hallticket_model', 'Hallticket_model'); + + } + + + + /* + * get student list for fees update + * created by kms + * */ + public function getStudentList_post() + { + $search['requestedBy'] = $this->post('requestedtBy'); + $search['Firstname'] = $this->post('studentName'); + $search['MobileNumber'] = $this->post('mobileNumber'); + $search['UniversityID'] = $this->post('university'); + $search['CourseID'] = $this->post('course'); + $search['requestedDept'] = $this->post('requestedDept'); + $search['requestedBranch'] = $this->post('branchId'); + $getStudentDetails = $this->Fees_model->getStudentList($search); + if ($getStudentDetails) + { + $getStudentDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStudentDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + +} \ No newline at end of file diff --git a/api/application/controllers/Login_Controller.php b/api/application/controllers/Login_Controller.php new file mode 100644 index 0000000..d7d9655 --- /dev/null +++ b/api/application/controllers/Login_Controller.php @@ -0,0 +1,120 @@ +methods['login_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['login_post']['limit'] = 100; // 100 requests per hour per user/key + $this->methods['login_delete']['limit'] = 50; // 50 requests per hour per user/key + $this->load->model('Login_model', 'login_model'); + $this->load->model('Announcement_model', 'announcement_model'); + + } + + //This method used to get Login + + public function login_post() + { + $userMobile = $this->post('userMobile'); + $password = $this->post('password'); + + + $loginDetails = $this->login_model->login( $userMobile, $password);// Check if the users data store contains users (in case the database result returns NULL) + if ($loginDetails) + { + $LoginDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($loginDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // change old password + public function changePassword_post() { + $oldPassword = $this->post('oldPassword'); + $newPassword = $this->post('newPassword'); + $userId = $this->post('UserId'); + // echo $oldPassword; + // echo $newPassword; + // echo $userId; + // exit(); + $date = date('Y-m-d H:i:s'); + $updateOn = $date; + $changePassword = $this->login_model->change_Password( $userId, $newPassword, $oldPassword, $updateOn);// Check if the users data store contains users (in case the database result returns NULL) + if ($changePassword) + { + $changePassword['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($changePassword, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No record were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + /* + * get Announcement Details + * created by Surendiran + * */ + public function getLoginAnnouncementDetails_post() + { + $requestedBy = $this->post('requestedBy'); + + + $getAnnouncement = $this->announcement_model->getLoginAnnouncement(); + + if ($getAnnouncement) + { + $getAnnouncement['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getAnnouncement, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + +} + \ No newline at end of file diff --git a/api/application/controllers/Report.php b/api/application/controllers/Report.php new file mode 100644 index 0000000..3171b2a --- /dev/null +++ b/api/application/controllers/Report.php @@ -0,0 +1,191 @@ +load->model('Reports_model', 'report_model'); + + } + + + + + public function status_post() + { + $bat = $this->post('bname'); + $br = $this->post('brname'); + $u = $this->post('univ'); + $getStatus = $this->report_model->status($bat,$br,$u); + //print_r($getStatus); + if ($getStatus) + { + $getStatus['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStatus, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + public function mstatus_post() + { + $bat = $this->post('bname'); + $br = $this->post('brname'); + $u = $this->post('univ'); + $getStatus = $this->report_model->mstatus($bat,$br,$u); + //print_r($getStatus); + if ($getStatus) + { + $getStatus['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStatus, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + public function cert_status_post() + { + $bat = $this->post('bname'); + $br = $this->post('brname'); + $u = $this->post('univ'); + $getStatus = $this->report_model->certificate_status($bat,$br,$u); + //print_r($getStatus); + if ($getStatus) + { + $getStatus['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStatus, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + public function markcert_status_post() + { + $bat = $this->post('bname'); + $br = $this->post('brname'); + $u = $this->post('univ'); + $from = $this->post('from'); + $to = $this->post('to'); + $getStatus = $this->report_model->mark_cert_status($bat,$br,$u,$from,$to); + //print_r($getStatus); + if ($getStatus) + { + $getStatus['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStatus, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + public function expense_post() + { + + $from = $this->post('from'); + $to = $this->post('to'); + $getStatus = $this->report_model->expense($from,$to); + //print_r($getStatus); + if ($getStatus) + { + $getStatus['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStatus, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + public function batch_post() + { + + $getStatus = $this->report_model->batch(); + //print_r($getStatus); + if ($getStatus) + { + $getStatus['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStatus, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + + + + + +} \ No newline at end of file diff --git a/api/application/controllers/Rest_server.php b/api/application/controllers/Rest_server.php new file mode 100644 index 0000000..5d44f92 --- /dev/null +++ b/api/application/controllers/Rest_server.php @@ -0,0 +1,13 @@ +load->helper('url'); + + $this->load->view('rest_server'); + } +} diff --git a/api/application/controllers/SessionMater_Controller.php b/api/application/controllers/SessionMater_Controller.php new file mode 100644 index 0000000..5fd2eab --- /dev/null +++ b/api/application/controllers/SessionMater_Controller.php @@ -0,0 +1,120 @@ +methods['addSessionMaterDetails_post']['limit'] = 100; // 50 requests per hour per user/key + $this->methods['getSessionMaterDetails_post']['limit'] = 500; // 50 requests per hour per user/key + $this->methods['updateSessionMaterDetails_post']['limit'] = 500;// 500 requests per hour per user/key + // load the model + $this->load->model('SeesionMaster_model', 'sessionM_model'); + + } + + /* + * This method used to add session master details + * created by kms + * */ + + public function addSessionMaterDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['SessionName'] = $this->post('sessionName'); + $details['SessionDate'] = $this->post('sessionDate'); + $details['CreatedBy'] = $this->post('createdBy'); + $details['IsActive'] = $this->post('status'); + $details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + $university['UniversityID'] = $this->post('universityName'); + + $sessionDetails = $this->sessionM_model->addSession($details,$university);// Check if the users data store contains users (in case the database result returns NULL) + if ($sessionDetails) + { + $sessionDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($sessionDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get session master details + * created by kms + * */ + public function getSessionMaterDetails_post() + { + $requestedBy = $this->post('requestedBy'); + $getSession = $this->sessionM_model->getSession($requestedBy); + if ($getSession) + { + $getSession['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getSession, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * update the session master details + * created by kms + * */ + public function updateSessionMaterDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['SessionID'] = $this->post('sessionID'); + $details['SessionDate'] = $this->post('sessionDate'); + $details['SessionName'] = $this->post('sessionName'); + $details['IsActive'] = $this->post('status'); + $universityDetails['University'] = $this->post('university'); + $details['UpdatedBy'] = $this->post('updatedBy'); + $details['UpdatedOn'] = $now->format("Y-m-d H:i:s"); + $updateDetails = $this->sessionM_model->updateSession($details,$universityDetails);// Check if the users data store contains users (in case the database result returns NULL) + + if ($updateDetails) + { + $updateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + +} \ No newline at end of file diff --git a/api/application/controllers/SessionSchedule_Controller.php b/api/application/controllers/SessionSchedule_Controller.php new file mode 100644 index 0000000..6ea11b8 --- /dev/null +++ b/api/application/controllers/SessionSchedule_Controller.php @@ -0,0 +1,119 @@ +methods['addSessionScheduleDetails_post']['limit'] = 100; // 50 requests per hour per user/key + $this->methods['getSessionScheduleDetails_post']['limit'] = 500; // 50 requests per hour per user/key + $this->methods['updateSessionMaterDetails_post']['limit'] = 500;// 500 requests per hour per user/key + // load the model + $this->load->model('SeesionSchedule_model', 'sessionSC_model'); + + } + + /* + * This method used to add session Schedule details + * created by kms + * */ + + public function addSessionScheduleDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['SessionID'] = $this->post('sessionID'); + $details['SCDate'] = $this->post('date'); + $details['CreatedBy'] = $this->post('createdBy'); + $details['IsActive'] = $this->post('status'); + $details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + $Timings['Timings'] = $this->post('timings'); + $sessionDetails = $this->sessionSC_model->addSessionScheduel($details,$Timings);// Check if the users data store contains users (in case the database result returns NULL) + if ($sessionDetails) + { + $sessionDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($sessionDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get session Schedule details + * created by kms + * */ + public function getSessionScheduleDetails_post() + { + $requestedBy = $this->post('requestedBy'); + $getSession = $this->sessionSC_model->getSessionSchedule($requestedBy); + if ($getSession) + { + $getSession['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getSession, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * update the session Schedule details + * created by kms + * */ + public function updateSessionScheduleDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['SCID'] = $this->post('scheduleID'); + $details['SessionID'] = $this->post('sessionID'); + $details['SCDate'] = $this->post('date'); + $details['IsActive'] = $this->post('status'); + $details['UpdatedBy'] = $this->post('updatedBy'); + $details['UpdatedOn'] = $now->format("Y-m-d H:i:s"); + $Timings['Timings'] = $this->post('timings'); + $updateDetails = $this->sessionSC_model->updateSessionSchedule($details,$Timings);// Check if the users data store contains users (in case the database result returns NULL) + + if ($updateDetails) + { + $updateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + + } \ No newline at end of file diff --git a/api/application/controllers/StatusUpdation_Controller.php b/api/application/controllers/StatusUpdation_Controller.php new file mode 100644 index 0000000..d4b31b5 --- /dev/null +++ b/api/application/controllers/StatusUpdation_Controller.php @@ -0,0 +1,348 @@ +methods['getUniversity_post']['limit'] = 100; + $this->methods['chkUnivIdExistDetail_post']['limit'] = 100; + // load the university model + $this->load->model('StatusUpdation_model', 'statusupdation_model'); + } + + // get University, Course, Branch Detailss + public function getUniveCourseBratch_post() { + $reqData = $this->post('data'); + $loginUserId = $reqData['localUserID']; + $loginUserBranchId = $reqData['localBranchID']; + $loginUserType = $reqData['localType']; + $getUniversityListDetails = $this->statusupdation_model->get_university_course_batch();// Check if the employee exist + if ($getUniversityListDetails) + { + $getUniversityListDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getUniversityListDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // ger Result fot searched keyword details + public function getSearchDetails_post() { + $reqSearchData = $this->post('data'); + $reqData = $this->post('requestDetails'); + // print_r($reqSearchData);exit(); + + $getSearchDetails = $this->statusupdation_model->get_search_result($reqSearchData, $reqData);// Check if the employee exist + if ($getSearchDetails) + { + $getSearchDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getSearchDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // get Sem/year for the respective course + public function getSemYearForCourse_post() { + $reqData = $this->post('data'); + $stuFor = $this->post('stuFor'); + + $getSemYeatList = $this->statusupdation_model->get_semyear_result($reqData, $stuFor);// Check if the employee exist + if ($getSemYeatList) + { + $getSemYeatList['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getSemYeatList, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + + // update the study material Status + public function updateStudentMaterialStatus_post() { + $reqData = $this->post('data'); + $reqDetails = $this->post('requestDetails'); + + $time = date('Y-m-d H:i:s'); + $dateTime = $time; + + $count = count($reqData); + // echo $reqDetails['localUserID'];exit(); + + for($i=0; $i < $count; $i++) { + $data[] = array( + 'StudentID' => $reqData[$i]['StudentID'], + 'CourseID' => $reqData[$i]['CourseID'], + 'BranchCode' => $reqData[$i]['BranchCode'], + 'ListCode' => $reqData[$i]['ListCode'], + 'SDate' => $reqData[$i]['SDate'], + 'Coursedetail' => $reqData[$i]['Coursedetail'], + 'Comments' => $reqData[$i]['Comments'], + 'Sem' => $reqData[$i]['Sem'], + 'CreatedBy' => $reqDetails['localUserID'], + 'CreatedOn' => $dateTime, + ); + } + + $updateStudentMaterialSta = $this->statusupdation_model->update_semyear($data);// Check if the employee exist + if ($updateStudentMaterialSta) + { + $updateStudentMaterialSta['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateStudentMaterialSta, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // update Answer booklet status + public function updateAnswerBookLetStatus_post() { + $reqData = $this->post('data'); + $reqDetails = $this->post('requestDetails'); + + $time = date('Y-m-d H:i:s'); + $dateTime = $time; + + $count = count($reqData); + // echo $reqDetails['localUserID'];exit(); + + for($i=0; $i < $count; $i++) { + $data[] = array( + 'StudentID' => $reqData[$i]['StudentID'], + 'CourseID' => $reqData[$i]['CourseID'], + 'BranchCode' => $reqData[$i]['BranchCode'], + 'ListCode' => $reqData[$i]['ListCode'], + 'AnsDate' => $reqData[$i]['SDate'], + 'Coursedetail' => $reqData[$i]['Coursedetail'], + 'Comments' => $reqData[$i]['Comments'], + 'Sem' => $reqData[$i]['Sem'], + 'CreatedBy' => $reqDetails['localUserID'], + 'CreatedOn' => $dateTime, + ); + } + + $updateAnswerBookletStat = $this->statusupdation_model->update_answerbooklet($data,$reqDetails);// Check if the employee exist + if ($updateAnswerBookletStat) + { + $updateAnswerBookletStat['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateAnswerBookletStat, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // get certification type list + public function getCertificateList_post() { + $reqData = $this->post('data'); + + $certificateList = $this->statusupdation_model->get_certificate_list();// Check if the employee exist + if ($certificateList) + { + $certificateList['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($certificateList, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + + // update certification status + public function updateCertificationStatus_post() { + $reqData = $this->post('data'); + $reqDetails = $this->post('requestDetails'); + + $time = date('Y-m-d H:i:s'); + $dateTime = $time; + + $count = count($reqData); + // echo $reqDetails['localUserID'];exit(); + + for($i=0; $i < $count; $i++) { + $data[] = array( + 'StudentID' => $reqData[$i]['StudentID'], + 'CourseID' => $reqData[$i]['CourseID'], + 'BranchCode' => $reqData[$i]['BranchCode'], + 'ListCode' => $reqData[$i]['ListCode'], + 'CDate' => $reqData[$i]['SDate'], + 'Coursedetail' => $reqData[$i]['Coursedetail'], + 'Comments' => $reqData[$i]['Comments'], + 'Sem' => $reqData[$i]['Sem'], + 'CreatedBy' => $reqDetails['localUserID'], + 'CreatedOn' => $dateTime, + // 'CertificationType' => $reqData[$i]['CertificateType'], + 'CertificationType' => 'MARK CARD', + 'CertificationNo' =>$reqData[$i]['CertificateNumber'], + ); + } + + $updateCertificateStatus = $this->statusupdation_model->update_certificateStatus($data);// Check if the employee exist + if ($updateCertificateStatus) + { + $updateCertificateStatus['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateCertificateStatus, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // update application status + public function updateApplicationStatus_post() { + $reqData = $this->post('data'); + $reqDetails = $this->post('requestDetails'); + + $time = date('Y-m-d H:i:s'); + $dateTime = $time; + + $count = count($reqData); + // echo $reqDetails['localUserID'];exit(); + + for($i=0; $i < $count; $i++) { + $data[] = array( + 'StudentID' => $reqData[$i]['StudentID'], + 'CourseID' => $reqData[$i]['CourseID'], + 'BranchCode' => $reqData[$i]['BranchCode'], + 'ListCode' => $reqData[$i]['ListCode'], + 'AppDate' => $reqData[$i]['SDate'], + 'Comments' => $reqData[$i]['Comments'], + 'CreatedBy' => $reqDetails['localUserID'], + 'CreatedOn' => $dateTime, + 'CertificationType' => $reqData[$i]['CertificateType'], + 'CertificationNo' =>$reqData[$i]['CertificateNumber'], + ); + } + + $updateApplicationStatus = $this->statusupdation_model->update_applicationStatus($data,$reqDetails);// Check if the employee exist + if ($updateApplicationStatus) + { + $updateApplicationStatus['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateApplicationStatus, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // get Status list based on the required activity + public function getStatusListForUpdate_post() { + $reqData = $this->post('data'); + $reqDetails = $this->post('statusFor'); + + $getStatusList = $this->statusupdation_model->get_status_list($reqData);// Check if the employee exist + if ($getStatusList) + { + $getStatusList['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStatusList, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function getPrevStatusDetailsForStu_post() { + $reqData = $this->post('data'); + $reqDetailsFor = $this->post('statusFor'); + $reqDetails = $this->post('getDetailsFor'); + + $getPrevStatusList = $this->statusupdation_model->get_prev_status_list($reqDetailsFor, $reqDetails);// Check if the employee exist + if ($getPrevStatusList) + { + $getPrevStatusList['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getPrevStatusList, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + +} diff --git a/api/application/controllers/Status_Controller.php b/api/application/controllers/Status_Controller.php new file mode 100644 index 0000000..54880a4 --- /dev/null +++ b/api/application/controllers/Status_Controller.php @@ -0,0 +1,180 @@ +methods['addStatusDetails_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['addStatusDetails_post']['limit'] = 100; // 100 requests per hour per user/key + $this->methods['addStatusDetails_delete']['limit'] = 50; // 50 requests per hour per user/key + $this->methods['getStatusDetails_post']['limit'] = 500; // 50 requests per hour per user/key + $this->methods['updateStatusDetails_post']['limit'] = 500; + // load the model + $this->load->model('Status_model', 'status_model'); + + } + + /* + * This method used to add status details + * created by Surendiran + * */ + + public function addStatusDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['ListName'] = $this->post('statusName'); + $details['ListGroup'] = "1"; + $details['CreatedBy'] = $this->post('createdBy'); + $details['IsActive'] = $this->post('status'); + $details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + $statusDetails = $this->status_model->addstatus($details);// Check if the users data store contains users (in case the database result returns NULL) + if ($statusDetails) + { + $statusDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($statusDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get status details + * created by Surendiran + * */ + public function getStatusDetails_post() + { + $requestedBy = $this->post('requestedBy'); + $getStatus = $this->status_model->getStatus($requestedBy); + + if ($getStatus) + { + $getStatus['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStatus, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + /* + * update the status details + * created by Surendiran + * */ + public function updateStatusDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $ListCode = $this->post('ListCode'); + $details['ListName'] = $this->post('ListName'); + $details['IsActive'] = $this->post('status'); + $details['UpdatedBy'] = $this->post('updatedBy'); + $details['UpdatedOn'] = $now->format("Y-m-d H:i:s"); + $statusDetails = $this->status_model->update($details,$ListCode);// Check if the users data store contains users (in case the database result returns NULL) + + if ($statusDetails) + + { + $statusDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($statusDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + public function getBranchListStatusUpdate_post() { + $requestedBy = $this->post('requestedBy'); + + $getStatusBranchList = $this->status_model->getStatusBranchList($requestedBy); + if ($getStatusBranchList) + { + $getStatusBranchList['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getStatusBranchList, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function getBranchStatusList_post() { + $requestedBy = $this->post('requestedBy'); + $branchCode = $this->post('branchCode'); + + $getBranchStatusList = $this->status_model->getBranchStatusList($branchCode); + if ($getBranchStatusList) + { + $getBranchStatusList['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getBranchStatusList, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + +} \ No newline at end of file diff --git a/api/application/controllers/StudentView_Controller.php b/api/application/controllers/StudentView_Controller.php new file mode 100644 index 0000000..0f99520 --- /dev/null +++ b/api/application/controllers/StudentView_Controller.php @@ -0,0 +1,63 @@ +methods['getStudentInfo_post']['limit'] = 500; + // load the employee model + $this->load->model('Studentview_model', 'studentview_model'); + + } + + /* + *get student basic info + * created by kms + * */ + public function getStudentInfo_post() + { + $requestedBy = $this->post('requestedBy'); + $requestedFrom = $this->post('requestedFrom'); + + $studentListDetails = $this->studentview_model->getStudentInfo($requestedBy,$requestedFrom);// Check if the employee exist + if ($studentListDetails) { + $studentListDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentListDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } else { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } +} diff --git a/api/application/controllers/Student_Controller.php b/api/application/controllers/Student_Controller.php new file mode 100644 index 0000000..207f2a1 --- /dev/null +++ b/api/application/controllers/Student_Controller.php @@ -0,0 +1,781 @@ +methods['addStudent_post']['limit'] = 100; + // load the employee model + $this->load->model('Student_model', 'student_model'); + + } + + // list of branch for admin student add screen + public function getBranchListDetails_post() { + $reqData = $this->post('data'); + $branchListDetails = $this->student_model->get_branch_list();// Get Branch list + if ($branchListDetails) + { + $branchListDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($branchListDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // check the branch active for add a new student + public function getBranchActiveStatusforStuAdd_post() { + $reqData = $this->post('data'); + $branchId = $reqData['localBranchID']; + // print_r($reqData);exit(); + $checkBranchActiveStatis = $this->student_model->getBranchActiveStatusforStuAdd($branchId);// Get Branch list + if ($checkBranchActiveStatis) + { + $checkBranchActiveStatis['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($checkBranchActiveStatis, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function getStudentList_post() { + $reqData = $this->post('data'); + $searchReqData = $this->post('search'); + $loginUserId = $reqData['localUserID']; + $loginUserBranchId = $reqData['localBranchID']; + $loginUserType = $reqData['localType']; + + $studentListDetails = $this->student_model->get_student_list( $loginUserId, $loginUserBranchId, $loginUserType, $searchReqData);// Check if the employee exist + if ($studentListDetails) + { + $studentListDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentListDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + + public function getStudentUniversity_post() { + $reqData = $this->post('data'); + $loginUserId = $reqData['localUserID']; + $loginUserBranchId = $reqData['localBranchID']; + $loginUserType = $reqData['localType']; + $getUniversityListDetails = $this->student_model->get_university_list();// Check if the employee exist + if ($getUniversityListDetails) + { + $getUniversityListDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getUniversityListDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function getStudentCourseList_post() { + $studentID = $this->post('studentID'); + $reqData = $this->post('updatedBy'); + $studentCourse = $this->student_model->get_student_course_list( $studentID, $reqData );// Check if the employee exist + if ($studentCourse) + { + $studentCourse['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentCourse, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function getStudentCourseDetails_post() { + $studentCourseID = $this->post('studentcourseId'); + $studentCourse = $this->student_model->get_student_course( $studentCourseID );// Check if the employee exist + if ($studentCourse) + { + $studentCourse['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentCourse, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function chkUpdateStuExistDetail_post() { + $exceptId = $this->post('exceptId'); + $datas = $this->post('datas'); + $checkFor = $this->post('check'); + + $checkRes = $this->student_model->check_update_exist( $exceptId, $datas, $checkFor );// Check if the employee exist + if ($checkRes) + { + $checkRes['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($checkRes, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function updateStudentCourseDetail_post() { + $data = $this->post('data'); + $updatedBy = $this->post('updatedBy'); + $id = $data['ID']; + + $req['StudentID'] = $data['StudentID']; + $req['UniversityID'] = $data['UniversityID']; + $req['CourseID'] = $data['CourseID']; + $req['SessionID'] = $data['SessionID']; + $req['DOJ'] = $data['DOJ']; + $req['IsActive'] = $data['IsActive']; + $req['BranchID'] = $data['BranchID']; + $req['EnrollmentID'] = $data['EnrollmentID']; + $req['Specilization1'] = $data['Specilization1']; + $req['Specilization2'] = $data['Specilization2']; + $req['DeactiveComments'] = $data['IsActive'] == 1 ? '': $data['DeactiveComments']; + $req['UpdatedBy'] = $updatedBy; + $date = date('Y-m-d H:i:s'); + $req['UpdatedOn'] = $date; + + $studentCourseUpdate = $this->student_model->update_student_course( $req, $id ); + if ($studentCourseUpdate) + { + $studentCourseUpdate['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentCourseUpdate, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // get student entrollment document details + public function getListofStuDocDetails_post() { + $StudentID = $this->post('exceptId'); + $localdata = $this->post('localData'); + + $studentDocDetails = $this->student_model->getStudent_doc_details($StudentID); + if ($studentDocDetails) + { + $studentDocDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentDocDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function deleteStuDocDetails_post() { + $StudentID = $this->post('exceptId'); + $docEntryId = $this->post('docDetailsID'); + $localdata = $this->post('localData'); + + $stuDocDeleteDetails = $this->student_model->deleteStu_doc_details($StudentID, $docEntryId); + if ($stuDocDeleteDetails) + { + $stuDocDeleteDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($stuDocDeleteDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + + public function addStudentEntrollDocDetails_post() { + // echo $this->post('stuDocProof_Status');exit(); + $docName = $_FILES['stuDocProof']['name'] ; + $docsize = $_FILES['stuDocProof']['size'] ; + $docSource = $_FILES['stuDocProof']['tmp_name']; + + + $temp= $this->post('data'); + $data = json_decode($temp, true); + $updatedBy = $this->post('updatedBy'); + $studentId = $this->post('studentID'); + + $doc_upload_status = $this->post('stuDocProof_Status'); + + $req['doc_name'] = $docName; + $req['doc_size'] = $docsize; + $req['doc_source'] = $docSource; + + $req['document_type_name'] = $data['documentName']; + $req['document_status'] = ''; + $req['document_comments'] = $data['documentComments']; + + $req['student_id'] = $studentId; + + $req['CreatedBy'] = $updatedBy; + $date = date('Y-m-d H:i:s'); + $req['CreatedOn'] = $date; + + $studentEntrollDocAdd = $this->student_model->student_entroll_doc_add( $req, $doc_upload_status);// Check if the employee exist + if ($studentEntrollDocAdd) + { + $studentEntrollDocAdd['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentEntrollDocAdd, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + // print_r($temp); + // echo $docName, $studentId, $data['documentName']; + // exit(); + + } + + // get student pending enrollment document details + public function getListofStuPendingDocDetails_post() { + $StudentID = $this->post('exceptId'); + $localdata = $this->post('localData'); + $studentPendingDocDetails = $this->student_model->getStudent_PendingDoc_Details($StudentID); + if ($studentPendingDocDetails) + { + $studentPendingDocDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentPendingDocDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function addStudentEnrollPendingDocDetails_post() { + $updateDetails = $this->post('updateDetails'); + $localdata = $this->post('localData'); + + $reqData['StudentID'] = $updateDetails['student']; + $reqData['Details'] = $updateDetails['doc_Details']; + $reqData['Status'] = $updateDetails['checkTracking']; + $reqData['CreatedBy'] = $localdata['localUserID']; + $date = date('Y-m-d H:i:s'); + $reqData['CreatedOn'] = $date; + + $addStudentPendingDocDetails = $this->student_model->addStu_PendingDoc_Details($reqData,$localdata); + + if ($addStudentPendingDocDetails) + { + $addStudentPendingDocDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($addStudentPendingDocDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // delete pending enrollment document details + public function deleteDocPendingDetails_post() { + $expID = $this->post('exceptId'); + $localData = $this->post('localData'); + // echo $expID; + // print_r($localData);exit(); + $stuEnrollPendingDocDeleteDetails = $this->student_model->deleteStu_entrollPending_doc_details($expID); + if ($stuEnrollPendingDocDeleteDetails) + { + $stuEnrollPendingDocDeleteDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($stuEnrollPendingDocDeleteDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function updateStudentImgDetails_post() { + + $imagename = $_FILES['idStuUpProof']['name']; + $size = $_FILES['idStuUpProof']['size']; + $imageSource = $_FILES['idStuUpProof']['tmp_name']; + + $temp= $this->post('data'); + $data = json_decode($temp, true); + + $updatedBy = $this->post('updatedBy'); + $updateStudent = $data['StudentID']; + + $req['MobileNumber'] = $data['MobileNumber']; + $req['Firstname'] = $data['Firstname']; + $req['Lastname'] = $data['Lastname']; + $req['Fathername'] = $data['Fathername']; + $req['EmailID'] = $data['EmailID']; + $req['MotherName'] = $data['MotherName']; + + $req['AlternateNumber'] = $data['AlternateNumber']; + $req['Gender'] = $data['Gender']; + $req['DOB'] = $data['DOB']; + $req['PresentAddress'] = $data['PresentAddress']; + $req['PermanentAddress'] = $data['PermanentAddress']; + $req['AadharNumber'] = $data['AadharNumber']; + $req['OtherID'] = $data['OtherID']; + $req['OtherIDDetails'] = $data['OtherIDDetails']; + $req['Qualification'] = $data['Qualification']; + + $req['PreQualification'] = $data['PreQualification']; + $req['Caste'] = $data['Caste']; + $req['Category'] = $data['Category']; + $req['Religion'] = $data['Religion']; + $req['Nationality'] = $data['Nationality']; + $req['Occupation'] = $data['Occupation']; + $req['Designation'] = $data['Designation']; + $req['Companyname'] = $data['Companyname']; + $req['ReferredBy'] = $data['ReferredBy']; + $req['ReferersMobileNumber'] = $data['ReferersMobileNumber']; + $req['ProfilePicPath'] = $data['ProfilePicPath']; + $req['Comments'] = $data['Comments']; + $req['DeactiveComments'] = $data['IsActive'] == 1 ? '': $data['DeactiveComments']; + + $req['IsActive'] = $data['IsActive']; + $req['LoginAccess'] = $data['LoginAccess'] == 1 ? "1" : "0"; + + $req['UpdatedBy'] = $updatedBy; + $date = date('Y-m-d H:i:s'); + $req['UpdatedOn'] = $date; + $studentUpdate = $this->student_model->update_student( $req, $updateStudent, $imagename, $imageSource, $size );// Check if the employee exist + if ($studentUpdate) + { + $studentUpdate['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentUpdate, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + public function updateStudentExistDetail_post(){ + $data = $this->post('data'); + $updatedBy = $this->post('updatedBy'); + $updateStudent = $data['StudentID']; + + $imagename = ''; + $size = ''; + $imageSource = ''; + + $req['MobileNumber'] = $data['MobileNumber']; + $req['Firstname'] = $data['Firstname']; + $req['Lastname'] = $data['Lastname']; + $req['Fathername'] = $data['Fathername']; + $req['EmailID'] = $data['EmailID']; + $req['MotherName'] = $data['MotherName']; + + $req['AlternateNumber'] = $data['AlternateNumber']; + $req['Gender'] = $data['Gender']; + $req['DOB'] = $data['DOB']; + $req['PresentAddress'] = $data['PresentAddress']; + $req['PermanentAddress'] = $data['PermanentAddress']; + $req['AadharNumber'] = $data['AadharNumber']; + $req['OtherID'] = $data['OtherID']; + $req['OtherIDDetails'] = $data['OtherIDDetails']; + $req['Qualification'] = $data['Qualification']; + + $req['PreQualification'] = $data['PreQualification']; + $req['Caste'] = $data['Caste']; + $req['Category'] = $data['Category']; + $req['Religion'] = $data['Religion']; + $req['Nationality'] = $data['Nationality']; + $req['Occupation'] = $data['Occupation']; + $req['Designation'] = $data['Designation']; + $req['Companyname'] = $data['Companyname']; + $req['ReferredBy'] = $data['ReferredBy']; + $req['ReferersMobileNumber'] = $data['ReferersMobileNumber']; + $req['ProfilePicPath'] = $data['ProfilePicPath']; + $req['Comments'] = $data['Comments']; + $req['DeactiveComments'] = $data['IsActive'] == 1 ? '': $data['DeactiveComments']; + + + $req['IsActive'] = $data['IsActive'] == 1 ? "1" : "0"; + $req['LoginAccess'] = $data['LoginAccess'] == 1 ? "1" : "0"; + + $req['UpdatedBy'] = $updatedBy; + $date = date('Y-m-d H:i:s'); + $req['UpdatedOn'] = $date; + + $studentUpdate = $this->student_model->update_student( $req, $updateStudent, $imagename, $imageSource, $size );// Check if the employee exist + if ($studentUpdate) + { + $studentUpdate['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentUpdate, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function getCourseBatch_post() { + $data = $this->post('data'); + $getCourseBatchListDetails = $this->student_model->get_courseBatch_list($data);// Check if the employee exist + if ($getCourseBatchListDetails) + { + $getCourseBatchListDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getCourseBatchListDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function chkStudentExistDetail_post() { + $data = $this->post('data'); + $checkData = $this->post('check'); + $checkRes = $this->student_model->check_exist( $data, $checkData );// Check if the employee exist + if ($checkRes) + { + $checkRes['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($checkRes, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + + public function getExistingStudentDetails_post() { + $data = $this->post('data'); + $reqDetails = $this->post('check'); + $checkExisRes = $this->student_model->get_exist_stu_details( $data, $reqDetails );// Check if the employee exist + if ($checkExisRes) + { + $checkExisRes['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($checkExisRes, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // add new course for student + public function insertStudentCourse_post(){ + + $addStudent = $this->post('addStudent'); + $coursedata = $this->post('coursedata'); + $createdBy = $this->post('createdBy'); + $createdBranch = $this->post('loginBranch'); + + $reqCourse['StudentID'] = $addStudent; + $reqCourse['UniversityID'] = $coursedata['university']; + $reqCourse['CourseID'] = $coursedata['course']; + $reqCourse['SessionID'] = $coursedata['batch']; + $reqCourse['DOJ'] = $coursedata['dateofjoining']; + $reqCourse['EnrollmentID'] = $coursedata['enrollmentid']; + + $reqCourse['Specilization1'] = $coursedata['specilization1']; + $reqCourse['Specilization2'] = $coursedata['specilization2']; + + $reqCourse['BranchID'] = $createdBranch; + $reqCourse['IsActive'] = '1'; + $reqCourse['CreatedBy'] = $createdBy; + $date = date('Y-m-d H:i:s'); + $reqCourse['CreatedOn'] = $date; +// print_r($reqCourse);exit(); + $studentAddCourse = $this->student_model->add_student_course( $addStudent , $reqCourse);// Check if the employee exist + if ($studentAddCourse) + { + $studentAddCourse['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentAddCourse, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + public function insertStudentImg_post() { + // print_r($this->post('idProof'));exit(); + $imagename = $_FILES['idStuProof']['name']; + $size = $_FILES['idStuProof']['size']; + $imageSource = $_FILES['idStuProof']['tmp_name']; + // echo $size;exit(); + $temp = $this->post('data'); + $tempBranch = $this->post('coursedata'); + $data = json_decode($temp, true); + $coursedata = json_decode($tempBranch, true); + + $createdBy = $this->post('createdBy'); + $createdBranch = $this->post('loginBranch'); + + $req['Firstname'] = $data['firstname']; + $req['Lastname'] = $data['lastname']; + $req['Fathername'] = $data['fathername']; + $req['EmailID'] = $data['emailId']; + $req['MotherName'] = $data['mothername']; + $req['MobileNumber'] = $data['primaryPhone']; + $req['AlternateNumber'] = $data['secondaryPhone']; + $req['Gender'] = $data['gender']; + $req['DOB'] = $data['dateofbirth']; + $req['PresentAddress'] = $data['address2']; + $req['PermanentAddress'] = $data['address1']; + $req['AadharNumber'] = $data['aadharNumber']; + $req['OtherID'] = $data['otherId']; + $req['OtherIDDetails'] = $data['otherIdDetails']; + $req['Caste'] = $data['caste']; + $req['Category'] = $data['category']; + $req['Religion'] = $data['religion']; + $req['Nationality'] = $data['nationality']; + $req['Occupation'] = $data['occupation']; + $req['Designation'] = $data['designation']; + $req['Companyname'] = $data['companyname']; + $req['ReferredBy'] = $data['referredby']; + $req['ReferersMobileNumber'] = $data['referredmobilenumber']; + $req['PreQualification'] = $data['prequalification']; + $req['IsActive'] = $data['switchsetting']; + $req['Comments'] = $data['Comments']; + $req['BranchCode'] = $createdBranch; + + $req['DeactiveComments'] = $data['switchsetting'] == 1 ? '': $data['DeactiveComments']; + + $req['CreatedBy'] = $createdBy; + $date = date('Y-m-d H:i:s'); + $req['CreatedOn'] = $date; + + $reqCourse['UniversityID'] = $coursedata['university']; + $reqCourse['CourseID'] = $coursedata['course']; + $reqCourse['SessionID'] = $coursedata['batch']; + $reqCourse['DOJ'] = $coursedata['dateofjoining']; + $reqCourse['BranchID'] = $createdBranch; + $reqCourse['IsActive'] = $data['switchsetting']; + $reqCourse['EnrollmentID'] = $coursedata['enrollmentid']; + + $reqCourse['Specilization1'] = $coursedata['specilization1']; + $reqCourse['Specilization2'] = $coursedata['specilization2']; + + $reqCourse['CreatedBy'] = $createdBy; + $date = date('Y-m-d H:i:s'); + $reqCourse['CreatedOn'] = $date; + + $studentAdd = $this->student_model->add_student( $req , $reqCourse, $imagename, $imageSource, $size);// Check if the employee exist + if ($studentAdd) { + $studentAdd['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentAdd, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } else { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + // add student + public function addStudent_post() { + + + $imagename = ''; + $size = ''; + $imageSource = ''; + + $data = $this->post('data'); + $coursedata = $this->post('coursedata'); + $createdBy = $this->post('createdBy'); + $createdBranch = $this->post('loginBranch'); + + $req['Firstname'] = $data['firstname']; + $req['Lastname'] = $data['lastname']; + $req['Fathername'] = $data['fathername']; + $req['EmailID'] = $data['emailId']; + $req['MotherName'] = $data['mothername']; + $req['MobileNumber'] = $data['primaryPhone']; + $req['AlternateNumber'] = $data['secondaryPhone']; + $req['Gender'] = $data['gender']; + $req['DOB'] = $data['dateofbirth']; + $req['PresentAddress'] = $data['address2']; + $req['PermanentAddress'] = $data['address1']; + $req['AadharNumber'] = $data['aadharNumber']; + $req['OtherID'] = $data['otherId']; + $req['OtherIDDetails'] = $data['otherIdDetails']; + $req['Caste'] = $data['caste']; + $req['Category'] = $data['category']; + $req['Religion'] = $data['religion']; + $req['Nationality'] = $data['nationality']; + $req['Occupation'] = $data['occupation']; + $req['Designation'] = $data['designation']; + $req['Companyname'] = $data['companyname']; + $req['ReferredBy'] = $data['referredby']; + $req['ReferersMobileNumber'] = $data['referredmobilenumber']; + $req['PreQualification'] = $data['prequalification']; + $req['IsActive'] = $data['switchsetting']; + $req['Comments'] = $data['Comments']; + $req['BranchCode'] = $createdBranch; + + $req['DeactiveComments'] = $data['switchsetting'] == 1 ? '': $data['DeactiveComments']; + + $req['CreatedBy'] = $createdBy; + $date = date('Y-m-d H:i:s'); + $req['CreatedOn'] = $date; + + $reqCourse['UniversityID'] = $coursedata['university']; + $reqCourse['CourseID'] = $coursedata['course']; + $reqCourse['SessionID'] = $coursedata['batch']; + $reqCourse['DOJ'] = $coursedata['dateofjoining']; + $reqCourse['BranchID'] = $createdBranch; + $reqCourse['IsActive'] = $data['switchsetting']; + $reqCourse['EnrollmentID'] = $coursedata['enrollmentid']; + + $reqCourse['Specilization1'] = $coursedata['specilization1']; + $reqCourse['Specilization2'] = $coursedata['specilization2']; + + $reqCourse['CreatedBy'] = $createdBy; + $date = date('Y-m-d H:i:s'); + $reqCourse['CreatedOn'] = $date; + + + $studentAdd = $this->student_model->add_student( $req , $reqCourse, $imagename, $imageSource, $size);// Check if the employee exist + if ($studentAdd) { + $studentAdd['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($studentAdd, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } else { + // Set the response and exit + $this->response([ + 'message' => 'No users were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + +} diff --git a/api/application/controllers/Subject_Controller.php b/api/application/controllers/Subject_Controller.php new file mode 100644 index 0000000..0ed2291 --- /dev/null +++ b/api/application/controllers/Subject_Controller.php @@ -0,0 +1,134 @@ +methods['addSubjectDetails_get']['limit'] = 500; // 500 requests per hour per user/key + $this->methods['addSubjectDetails_post']['limit'] = 100; // 100 requests per hour per user/key + $this->methods['addSubjectDetails_delete']['limit'] = 50; // 50 requests per hour per user/key + $this->methods['getSubjectDetails_post']['limit'] = 500; // 50 requests per hour per user/key + $this->methods['updateSubjectDetails_post']['limit'] = 500;// 500 requests per hour per user/key + + // load the model + $this->load->model('Subject_model', 'subject_model'); + + } + + /* + * This method used to add Subject details + * + * */ + + public function addSubjectDetails_post() + { + + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['SubjectCode'] = $this->post('SubjectCode'); + $details['SubjectName'] = $this->post('SubjectName'); + $details['IsActive'] = $this->post('Status'); + $details['CreatedBy'] = $this->post('createdBy'); + $details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + + $subjectDetails = $this->subject_model->addSubject($details);// Check if the users data store contains users (in case the database result returns NULL) + + if ($subjectDetails) + { + $subjectDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($subjectDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get Subject details + * + * */ + public function getSubjectDetails_post() + { + $requestedBy = $this->post('requestedBy'); + + $getSubject = $this->subject_model->getSubject($requestedBy); + + + + if ($getSubject) + { + $getSubject['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getSubject, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * update Subject details + * + * */ + public function updateSubjectDetails_post() + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['SubjectCode'] = $this->post('SubjectCode'); + $details['SubjectName'] = $this->post('SubjectName'); + $SubjectID = $this->post('SubjectID'); + $details['IsActive'] = $this->post('Status'); + $details['UpdatedBy'] = $this->post('updatedBy'); + $details['UpdatedOn'] = $now->format('Y-m-d H:i:s'); + + // print_r($SubjectID);die(); + + + $updateDetails = $this->subject_model->updateSubject($details,$SubjectID);// Check if the users data store contains users (in case the database result returns NULL) + // print_r($details,$SubjectID);die(); + if ($updateDetails) + + { + $updateDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + + + + +} \ No newline at end of file diff --git a/api/application/controllers/Teste.php b/api/application/controllers/Teste.php new file mode 100644 index 0000000..f394f4d --- /dev/null +++ b/api/application/controllers/Teste.php @@ -0,0 +1,64 @@ +db->where('email', $email); + $this->db->where('senha', $senha); + $usuario = $this->db->get('admin')->first_row(); + + $key = $this->config->item('encryption_key'); + $exp = strtotime("-2 hours"); + $iat = strtotime("now"); + $nbf = strtotime("+3 hours"); + $token = $this->jwt->encode(array( + 'id'=>$usuario->id, + 'name'=>$usuario->nome, + 'admin'=>true, + 'iat'=>$iat, + 'exp'=>$exp + ), $key); + echo "
";
+    echo $token;
+    echo "

"; + echo 'time: '.time(); + echo "
"; + echo 'iate: '.$iat; + echo "
"; + echo 'nbf : '.$nbf; + echo "
"; + echo 'exp : '.$exp; + echo "

"; + echo "
"; + + // if ($iat > time()) { + // echo 'Não é possível lidar com token antes de ' . date(DateTime::ISO8601, time()); + // echo "
"; + // } + if (time() >= $exp) { + echo "Expired token"; + echo "
"; + } + + + echo "
";
+    print_r ($usuario);
+    echo "
"; + echo "
"; + var_dump( $this->jwt->decode($token,$key) ); + echo "
"; + } + + public function sair(){ + $this->session->sess_destroy(); + redirect('','refresh'); + } +} + +/* End of file Teste.php */ +/* Location: ./application/controllers/Teste.php */ \ No newline at end of file diff --git a/api/application/controllers/University_Controller.php b/api/application/controllers/University_Controller.php new file mode 100644 index 0000000..a2ec438 --- /dev/null +++ b/api/application/controllers/University_Controller.php @@ -0,0 +1,298 @@ +methods['getUniversity_post']['limit'] = 100; + $this->methods['chkUnivIdExistDetail_post']['limit'] = 100; + $this->methods['getDefaultActivityDetails_post']['limit'] = 100; + $this->methods['updateDefaultActivityDetails_post']['limit'] = 100; + + // load the university model + $this->load->model('University_model', 'university_model'); + } + + // get university details + public function getUniversity_post() { + $reqData = $this->post('data'); + $loginUserId = $reqData['localUserID']; + $loginUserBranchId = $reqData['localBranchID']; + $loginUserType = $reqData['localType']; + $getUniversityListDetails = $this->university_model->get_university_list();// Check if the employee exist + if ($getUniversityListDetails) + { + $getUniversityListDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getUniversityListDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + + //update university details + public function updateUniversityDetail_post() { + + $reqData = $this->post('data'); + $req['UpdatedBy'] = $this->post('updatedBy'); + $date = date('Y-m-d H:i:s'); + $req['UpdatedOn'] = $date; + $req['UniversityName']= $reqData['UniversityName']; + $req['UniversityShortName']= $reqData['UniversityShortName']; + $req['MobileNumber']= $reqData['MobileNumber']; + $req['EmailID']= $reqData['EmailID']; + $req['Address']= $reqData['Address']; + $req['IsActive']= $reqData['IsActive']; + + $updateFor = $reqData['UniversityID']; + + $updateUniversityDetail = $this->university_model->update_university_details($updateFor, $req);// Check if the employee exist + if ($updateUniversityDetail) + { + $updateUniversityDetail['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($updateUniversityDetail, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + + // check university details exist + public function chkUnivIdExistDetail_post() { + + $data = $this->post('data'); + $check = $this->post('check'); + + $checkUnivExist = $this->university_model->check_Univ_Exist($data, $check);// Check if the employee exist + if ($checkUnivExist) + { + $checkUnivExist['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($checkUnivExist, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + + // insert university details + public function insertUniversity_post() { + $reqData = $this->post('data'); + $req['CreatedBy'] = $this->post('createdBy'); + $date = date('Y-m-d H:i:s'); + $req['CreatedOn'] = $date; + $req['UniversityName']= $reqData['UniversityName']; + $req['UniversityShortName']= $reqData['UniversityShortName']; + $req['MobileNumber']= $reqData['MobileNumber']; + $req['EmailID']= $reqData['EmailID']; + $req['Address']= $reqData['Address']; + $req['IsActive']= $reqData['switchsetting']; + $req['UniversityID']= $reqData['UniversityID']; + + $insertUniv = $this->university_model->insert_Univ($req);// Check if the employee exist + if ($insertUniv) + { + $insertUniv['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($insertUniv, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'No list were found', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + } + + /* + * add activity details + * created Surendiran + * */ + + public function addActivityDetails_post() { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['ActivityID'] = $this->post('activityID'); + $details['ActivityName'] = $this->post('activityName'); + $details['Description'] = $this->post('description'); + $details['CreatedBy'] = $this->post('createdBy'); + $details['CreatedOn'] = $now->format('Y-m-d H:i:s'); + $details['IsActive'] = $this->post('status'); + $jsonData=$this->post('activityStatus'); + $activityDetails = $this->university_model->addActivity($details,$jsonData);// Check if the users data store contains users (in case the database result returns NULL) + if ($activityDetails) { + $activityDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($activityDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } else + { // Set the response and exit + $this->response([ 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + /* + * get activity details + * created by Surendiran + * */ + public function getActivityDetails_post() + { + $requestedBy = $this->post('requestedBy'); + $getActivity = $this->university_model->getActivity($requestedBy); + if ($getActivity) + { + $getActivity['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getActivity, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + + /* + * update activity details + * created by Surendiran + * */ + public function updateActivityDetails_post() + { + + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['ActivityID'] = $this->post('activityID'); + $details['ActivityName'] = $this->post('activityName'); + $details['Description'] = $this->post('description'); + $details['IsActive'] = $this->post('status'); + $details['UpdatedBy'] = $this->post('updatedBy'); + $details['UpdatedOn'] = $now->format('Y-m-d H:i:s'); + $jsonData=$this->post('activityStatus'); + $activityDetails = $this->university_model->updateActivity($details,$jsonData);// Check if the users data store contains users (in case the database result returns NULL) + + if ($activityDetails) + { + $activityDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($activityDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + /* + * get default activity details + * created by kms + * */ + public function getDefaultActivityDetails_post() + { + $requestedBy = $this->post('requestedBy'); + $getDefaultActivity = $this->university_model->getDefaultActivity($requestedBy); + if ($getDefaultActivity) + { + $getDefaultActivity['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($getDefaultActivity, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { // Set the response and exit + $this->response([ + 'message' => 'No records found!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + } + /* + * update default activity status + * created by kms + * */ + + public function updateDefaultActivityDetails_post() + { + + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $details['StudentActivityCode'] = $this->post('activityID'); + $details['StatusCode'] = $this->post('activityName'); + //$details['IsActive'] = $this->post('status'); + $details['UpdatedBy'] = $this->post('updatedBy'); + $details['UpdatedOn'] = $now->format('Y-m-d H:i:s'); + $jsonData=$this->post('activityStatus'); + $activityDetails = $this->university_model->updateDefaultActivity($details,$jsonData);// Check if the users data store contains users (in case the database result returns NULL) + + if ($activityDetails) + { + $activityDetails['status'] = REST_Controller::HTTP_OK; + // Set the response and exit + $this->response($activityDetails, REST_Controller::HTTP_OK); // OK (200) being the HTTP response code + } + else + { + // Set the response and exit + $this->response([ + 'message' => 'Something went wrong.please try again!', + 'status' => REST_Controller::HTTP_NOT_FOUND + ], REST_Controller::HTTP_NOT_FOUND); // NOT_FOUND (404) being the HTTP response code + } + + + } + + +} diff --git a/api/application/controllers/Welcome.php b/api/application/controllers/Welcome.php new file mode 100644 index 0000000..59818c7 --- /dev/null +++ b/api/application/controllers/Welcome.php @@ -0,0 +1,27 @@ + + * @see https://codeigniter.com/user_guide/general/urls.html + */ + public function index() + { + $this->load->helper('url'); + + $this->load->view('welcome_message'); + } +} diff --git a/api/application/controllers/index.html b/api/application/controllers/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/application/controllers/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/core/MY_Controller.php b/api/application/core/MY_Controller.php new file mode 100644 index 0000000..6c1e6d8 --- /dev/null +++ b/api/application/core/MY_Controller.php @@ -0,0 +1,41 @@ +config->item('encryption_key'); + $token = $this->input->get_request_header('Authorization'); + $token = str_replace('Bearer ','',$token); + $token = $this->jwt->decode($token, $key); + $this->userdata = $token; + } catch (Exception $e) { + $token = FALSE; + $erro = 'Erro: '.$e->getMessage(); + } + if ($token == FALSE && $this->debug == false) { + $this->response([ + 'status' => FALSE, + 'message' => $erro + ], REST_Controller::HTTP_UNAUTHORIZED); + } + } + +} + +/* End of file MY_Controller.php */ +/* Location: ./application/core/MY_Controller.php */ diff --git a/api/application/core/index.html b/api/application/core/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/application/core/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

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

Directory access is forbidden.

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

Directory access is forbidden.

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

Directory access is forbidden.

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

Directory access is forbidden.

+ + + diff --git a/api/application/language/bulgarian/rest_controller_lang.php b/api/application/language/bulgarian/rest_controller_lang.php new file mode 100644 index 0000000..4ba134d --- /dev/null +++ b/api/application/language/bulgarian/rest_controller_lang.php @@ -0,0 +1,18 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/dutch/rest_controller_lang.php b/api/application/language/dutch/rest_controller_lang.php new file mode 100644 index 0000000..182ca61 --- /dev/null +++ b/api/application/language/dutch/rest_controller_lang.php @@ -0,0 +1,16 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/english/rest_controller_lang.php b/api/application/language/english/rest_controller_lang.php new file mode 100644 index 0000000..06bf4b9 --- /dev/null +++ b/api/application/language/english/rest_controller_lang.php @@ -0,0 +1,18 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/french/rest_controller_lang.php b/api/application/language/french/rest_controller_lang.php new file mode 100644 index 0000000..f8c0d13 --- /dev/null +++ b/api/application/language/french/rest_controller_lang.php @@ -0,0 +1,18 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/german/rest_controller_lang.php b/api/application/language/german/rest_controller_lang.php new file mode 100644 index 0000000..4230c3c --- /dev/null +++ b/api/application/language/german/rest_controller_lang.php @@ -0,0 +1,18 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

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

Directory access is forbidden.

+ + + diff --git a/api/application/language/indonesia/rest_controller_lang.php b/api/application/language/indonesia/rest_controller_lang.php new file mode 100644 index 0000000..771c683 --- /dev/null +++ b/api/application/language/indonesia/rest_controller_lang.php @@ -0,0 +1,18 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/italian/rest_controller_lang.php b/api/application/language/italian/rest_controller_lang.php new file mode 100644 index 0000000..783f16a --- /dev/null +++ b/api/application/language/italian/rest_controller_lang.php @@ -0,0 +1,16 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/portuguese-brazilian/rest_controller_lang.php b/api/application/language/portuguese-brazilian/rest_controller_lang.php new file mode 100644 index 0000000..84dc9e0 --- /dev/null +++ b/api/application/language/portuguese-brazilian/rest_controller_lang.php @@ -0,0 +1,18 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/romanian/rest_controller_lang.php b/api/application/language/romanian/rest_controller_lang.php new file mode 100644 index 0000000..f151d52 --- /dev/null +++ b/api/application/language/romanian/rest_controller_lang.php @@ -0,0 +1,18 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/serbian_cyr/rest_controller_lang.php b/api/application/language/serbian_cyr/rest_controller_lang.php new file mode 100644 index 0000000..4d249c4 --- /dev/null +++ b/api/application/language/serbian_cyr/rest_controller_lang.php @@ -0,0 +1,18 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/serbian_lat/rest_controller_lang.php b/api/application/language/serbian_lat/rest_controller_lang.php new file mode 100644 index 0000000..057ab93 --- /dev/null +++ b/api/application/language/serbian_lat/rest_controller_lang.php @@ -0,0 +1,18 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/simplified-chinese/rest_controller_lang.php b/api/application/language/simplified-chinese/rest_controller_lang.php new file mode 100644 index 0000000..f32e9e7 --- /dev/null +++ b/api/application/language/simplified-chinese/rest_controller_lang.php @@ -0,0 +1,18 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/spanish/rest_controller_lang.php b/api/application/language/spanish/rest_controller_lang.php new file mode 100644 index 0000000..2ca8105 --- /dev/null +++ b/api/application/language/spanish/rest_controller_lang.php @@ -0,0 +1,18 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/traditional-chinese/rest_controller_lang.php b/api/application/language/traditional-chinese/rest_controller_lang.php new file mode 100644 index 0000000..b1f80ca --- /dev/null +++ b/api/application/language/traditional-chinese/rest_controller_lang.php @@ -0,0 +1,18 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/application/language/turkish/rest_controller_lang.php b/api/application/language/turkish/rest_controller_lang.php new file mode 100644 index 0000000..589b28c --- /dev/null +++ b/api/application/language/turkish/rest_controller_lang.php @@ -0,0 +1,18 @@ +_CI = &get_instance(); + + // Load the inflector helper + $this->_CI->load->helper('inflector'); + + // If the provided data is already formatted we should probably convert it to an array + if ($from_type !== NULL) + { + if (method_exists($this, '_from_'.$from_type)) + { + $data = call_user_func([$this, '_from_'.$from_type], $data); + } + else + { + throw new Exception('Format class does not support conversion from "'.$from_type.'".'); + } + } + + // Set the member variable to the data passed + $this->_data = $data; + } + + /** + * Create an instance of the format class + * e.g: echo $this->format->factory(['foo' => 'bar'])->to_csv(); + * + * @param mixed $data Data to convert/parse + * @param string $from_type Type to convert from e.g. json, csv, html + * + * @return object Instance of the format class + */ + public function factory($data, $from_type = NULL) + { + // $class = __CLASS__; + // return new $class(); + + return new static($data, $from_type); + } + + // FORMATTING OUTPUT --------------------------------------------------------- + + /** + * Format data as an array + * + * @param mixed|NULL $data Optional data to pass, so as to override the data passed + * to the constructor + * @return array Data parsed as an array; otherwise, an empty array + */ + public function to_array($data = NULL) + { + // If no data is passed as a parameter, then use the data passed + // via the constructor + if ($data === NULL && func_num_args() === 0) + { + $data = $this->_data; + } + + // Cast as an array if not already + if (is_array($data) === FALSE) + { + $data = (array) $data; + } + + $array = []; + foreach ((array) $data as $key => $value) + { + if (is_object($value) === TRUE || is_array($value) === TRUE) + { + $array[$key] = $this->to_array($value); + } + else + { + $array[$key] = $value; + } + } + + return $array; + } + + /** + * Format data as XML + * + * @param mixed|NULL $data Optional data to pass, so as to override the data passed + * to the constructor + * @param NULL $structure + * @param string $basenode + * @return mixed + */ + public function to_xml($data = NULL, $structure = NULL, $basenode = 'xml') + { + if ($data === NULL && func_num_args() === 0) + { + $data = $this->_data; + } + + if ($structure === NULL) + { + $structure = simplexml_load_string("<$basenode />"); + } + + // Force it to be something useful + if (is_array($data) === FALSE && is_object($data) === FALSE) + { + $data = (array) $data; + } + + foreach ($data as $key => $value) + { + + //change false/true to 0/1 + if (is_bool($value)) + { + $value = (int) $value; + } + + // no numeric keys in our xml please! + if (is_numeric($key)) + { + // make string key... + $key = (singular($basenode) != $basenode) ? singular($basenode) : 'item'; + } + + // replace anything not alpha numeric + $key = preg_replace('/[^a-z_\-0-9]/i', '', $key); + + if ($key === '_attributes' && (is_array($value) || is_object($value))) + { + $attributes = $value; + if (is_object($attributes)) + { + $attributes = get_object_vars($attributes); + } + + foreach ($attributes as $attribute_name => $attribute_value) + { + $structure->addAttribute($attribute_name, $attribute_value); + } + } + // if there is another array found recursively call this function + elseif (is_array($value) || is_object($value)) + { + $node = $structure->addChild($key); + + // recursive call. + $this->to_xml($value, $node, $key); + } + else + { + // add single node. + $value = htmlspecialchars(html_entity_decode($value, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, 'UTF-8'); + + $structure->addChild($key, $value); + } + } + + return $structure->asXML(); + } + + /** + * Format data as HTML + * + * @param mixed|NULL $data Optional data to pass, so as to override the data passed + * to the constructor + * @return mixed + */ + public function to_html($data = NULL) + { + // If no data is passed as a parameter, then use the data passed + // via the constructor + if ($data === NULL && func_num_args() === 0) + { + $data = $this->_data; + } + + // Cast as an array if not already + if (is_array($data) === FALSE) + { + $data = (array) $data; + } + + // Check if it's a multi-dimensional array + if (isset($data[0]) && count($data) !== count($data, COUNT_RECURSIVE)) + { + // Multi-dimensional array + $headings = array_keys($data[0]); + } + else + { + // Single array + $headings = array_keys($data); + $data = [$data]; + } + + // Load the table library + $this->_CI->load->library('table'); + + $this->_CI->table->set_heading($headings); + + foreach ($data as $row) + { + // Suppressing the "array to string conversion" notice + // Keep the "evil" @ here + $row = @array_map('strval', $row); + + $this->_CI->table->add_row($row); + } + + return $this->_CI->table->generate(); + } + + /** + * @link http://www.metashock.de/2014/02/create-csv-file-in-memory-php/ + * @param mixed|NULL $data Optional data to pass, so as to override the data passed + * to the constructor + * @param string $delimiter The optional delimiter parameter sets the field + * delimiter (one character only). NULL will use the default value (,) + * @param string $enclosure The optional enclosure parameter sets the field + * enclosure (one character only). NULL will use the default value (") + * @return string A csv string + */ + public function to_csv($data = NULL, $delimiter = ',', $enclosure = '"') + { + // Use a threshold of 1 MB (1024 * 1024) + $handle = fopen('php://temp/maxmemory:1048576', 'w'); + if ($handle === FALSE) + { + return NULL; + } + + // If no data is passed as a parameter, then use the data passed + // via the constructor + if ($data === NULL && func_num_args() === 0) + { + $data = $this->_data; + } + + // If NULL, then set as the default delimiter + if ($delimiter === NULL) + { + $delimiter = ','; + } + + // If NULL, then set as the default enclosure + if ($enclosure === NULL) + { + $enclosure = '"'; + } + + // Cast as an array if not already + if (is_array($data) === FALSE) + { + $data = (array) $data; + } + + // Check if it's a multi-dimensional array + if (isset($data[0]) && count($data) !== count($data, COUNT_RECURSIVE)) + { + // Multi-dimensional array + $headings = array_keys($data[0]); + } + else + { + // Single array + $headings = array_keys($data); + $data = [$data]; + } + + // Apply the headings + fputcsv($handle, $headings, $delimiter, $enclosure); + + foreach ($data as $record) + { + // If the record is not an array, then break. This is because the 2nd param of + // fputcsv() should be an array + if (is_array($record) === FALSE) + { + break; + } + + // Suppressing the "array to string conversion" notice. + // Keep the "evil" @ here. + $record = @ array_map('strval', $record); + + // Returns the length of the string written or FALSE + fputcsv($handle, $record, $delimiter, $enclosure); + } + + // Reset the file pointer + rewind($handle); + + // Retrieve the csv contents + $csv = stream_get_contents($handle); + + // Close the handle + fclose($handle); + + return $csv; + } + + /** + * Encode data as json + * + * @param mixed|NULL $data Optional data to pass, so as to override the data passed + * to the constructor + * @return string Json representation of a value + */ + public function to_json($data = NULL) + { + // If no data is passed as a parameter, then use the data passed + // via the constructor + if ($data === NULL && func_num_args() === 0) + { + $data = $this->_data; + } + + // Get the callback parameter (if set) + $callback = $this->_CI->input->get('callback'); + + if (empty($callback) === TRUE) + { + return json_encode($data); + } + + // We only honour a jsonp callback which are valid javascript identifiers + elseif (preg_match('/^[a-z_\$][a-z0-9\$_]*(\.[a-z_\$][a-z0-9\$_]*)*$/i', $callback)) + { + // Return the data as encoded json with a callback + return $callback.'('.json_encode($data).');'; + } + + // An invalid jsonp callback function provided. + // Though I don't believe this should be hardcoded here + $data['warning'] = 'INVALID JSONP CALLBACK: '.$callback; + + return json_encode($data); + } + + /** + * Encode data as a serialized array + * + * @param mixed|NULL $data Optional data to pass, so as to override the data passed + * to the constructor + * @return string Serialized data + */ + public function to_serialized($data = NULL) + { + // If no data is passed as a parameter, then use the data passed + // via the constructor + if ($data === NULL && func_num_args() === 0) + { + $data = $this->_data; + } + + return serialize($data); + } + + /** + * Format data using a PHP structure + * + * @param mixed|NULL $data Optional data to pass, so as to override the data passed + * to the constructor + * @return mixed String representation of a variable + */ + public function to_php($data = NULL) + { + // If no data is passed as a parameter, then use the data passed + // via the constructor + if ($data === NULL && func_num_args() === 0) + { + $data = $this->_data; + } + + return var_export($data, TRUE); + } + + // INTERNAL FUNCTIONS + + /** + * @param string $data XML string + * @return array XML element object; otherwise, empty array + */ + protected function _from_xml($data) + { + return $data ? (array) simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA) : []; + } + + /** + * @param string $data CSV string + * @param string $delimiter The optional delimiter parameter sets the field + * delimiter (one character only). NULL will use the default value (,) + * @param string $enclosure The optional enclosure parameter sets the field + * enclosure (one character only). NULL will use the default value (") + * @return array A multi-dimensional array with the outer array being the number of rows + * and the inner arrays the individual fields + */ + protected function _from_csv($data, $delimiter = ',', $enclosure = '"') + { + // If NULL, then set as the default delimiter + if ($delimiter === NULL) + { + $delimiter = ','; + } + + // If NULL, then set as the default enclosure + if ($enclosure === NULL) + { + $enclosure = '"'; + } + + return str_getcsv($data, $delimiter, $enclosure); + } + + /** + * @param string $data Encoded json string + * @return mixed Decoded json string with leading and trailing whitespace removed + */ + protected function _from_json($data) + { + return json_decode(trim($data)); + } + + /** + * @param string $data Data to unserialize + * @return mixed Unserialized data + */ + protected function _from_serialize($data) + { + return unserialize(trim($data)); + } + + /** + * @param string $data Data to trim leading and trailing whitespace + * @return string Data with leading and trailing whitespace removed + */ + protected function _from_php($data) + { + return trim($data); + } +} diff --git a/api/application/libraries/JWT.php b/api/application/libraries/JWT.php new file mode 100644 index 0000000..f84f4f9 --- /dev/null +++ b/api/application/libraries/JWT.php @@ -0,0 +1,194 @@ + + * @minor changes for codeigniter + */ +class JWT +{ + public static $timestamp = null; + + /** + * @param string $jwt The JWT + * @param string|null $key The secret key + * @param bool $verify Don't skip verification process + * + * @return object The JWT's payload as a PHP object + */ + public function decode($jwt, $key = null, $verify = true) + { + $timestamp = is_null(static::$timestamp) ? time() : static::$timestamp; + + $tks = explode('.', $jwt); + if (count($tks) != 3) { + throw new UnexpectedValueException('Wrong number of segments'); + } + list($headb64, $payloadb64, $cryptob64) = $tks; + if (null === ($header = $this->jsonDecode($this->urlsafeB64Decode($headb64))) + ) { + throw new UnexpectedValueException('Invalid segment encoding'); + } + if (null === $payload = $this->jsonDecode($this->urlsafeB64Decode($payloadb64)) + ) { + throw new UnexpectedValueException('Invalid segment encoding'); + } + $sig = $this->urlsafeB64Decode($cryptob64); + if ($verify) { + if (empty($header->alg)) { + throw new DomainException('Empty algorithm'); + } + if ($sig != $this->sign("$headb64.$payloadb64", $key, $header->alg)) { + throw new UnexpectedValueException('Signature verification failed'); + } + } + + // Check if the nbf if it is defined. This is the time that the + // token can actually be used. If it's not yet that time, abort. + if (isset($payload->nbf) && $payload->nbf > $timestamp) { + throw new UnexpectedValueException( + 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->nbf) + ); + } + + // Check that this token has been created before 'now'. This prevents + // using tokens that have been created for later use (and haven't + // correctly used the nbf claim). + if (isset($payload->iat) && $payload->iat > $timestamp) { + throw new UnexpectedValueException( + 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->iat) + ); + } + // Check if this token has expired. + if (isset($payload->exp) && $timestamp >= $payload->exp) { + throw new UnexpectedValueException('Expired token'); + } + + return $payload; + } + + /** + * @param object|array $payload PHP object or array + * @param string $key The secret key + * @param string $algo The signing algorithm + * + * @return string A JWT + */ + public function encode($payload, $key, $algo = 'HS256') + { + $header = array('typ' => 'jwt', 'alg' => $algo); + + $segments = array(); + $segments[] = $this->urlsafeB64Encode($this->jsonEncode($header)); + $segments[] = $this->urlsafeB64Encode($this->jsonEncode($payload)); + $signing_input = implode('.', $segments); + + $signature = $this->sign($signing_input, $key, $algo); + $segments[] = $this->urlsafeB64Encode($signature); + + return implode('.', $segments); + } + + /** + * @param string $msg The message to sign + * @param string $key The secret key + * @param string $method The signing algorithm + * + * @return string An encrypted message + */ + public function sign($msg, $key, $method = 'HS256') + { + $methods = array( + 'HS256' => 'sha256', + 'HS384' => 'sha384', + 'HS512' => 'sha512', + ); + if (empty($methods[$method])) { + throw new DomainException('Algorithm not supported'); + } + return hash_hmac($methods[$method], $msg, $key, true); + } + + /** + * @param string $input JSON string + * + * @return object Object representation of JSON string + */ + public function jsonDecode($input) + { + $obj = json_decode($input); + if (function_exists('json_last_error') && $errno = json_last_error()) { + $this->handleJsonError($errno); + } + else if ($obj === null && $input !== 'null') { + throw new DomainException('Null result with non-null input'); + } + return $obj; + } + + /** + * @param object|array $input A PHP object or array + * + * @return string JSON representation of the PHP object or array + */ + public function jsonEncode($input) + { + $json = json_encode($input); + if (function_exists('json_last_error') && $errno = json_last_error()) { + $this->handleJsonError($errno); + } + else if ($json === 'null' && $input !== null) { + throw new DomainException('Null result with non-null input'); + } + return $json; + } + + /** + * @param string $input A base64 encoded string + * + * @return string A decoded string + */ + public function urlsafeB64Decode($input) + { + $remainder = strlen($input) % 4; + if ($remainder) { + $padlen = 4 - $remainder; + $input .= str_repeat('=', $padlen); + } + return base64_decode(strtr($input, '-_', '+/')); + } + + /** + * @param string $input Anything really + * + * @return string The base64 encode of what you passed in + */ + public function urlsafeB64Encode($input) + { + return str_replace('=', '', strtr(base64_encode($input), '+/', '-_')); + } + + /** + * @param int $errno An error number from json_last_error() + * + * @return void + */ + private function handleJsonError($errno) + { + $messages = array( + JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', + JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', + JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON' + ); + throw new DomainException(isset($messages[$errno]) + ? $messages[$errno] + : 'Unknown JSON error: ' . $errno + ); + } + +} + diff --git a/api/application/libraries/REST_Controller.php b/api/application/libraries/REST_Controller.php new file mode 100644 index 0000000..de6ae6c --- /dev/null +++ b/api/application/libraries/REST_Controller.php @@ -0,0 +1,2257 @@ + 'application/json', + 'array' => 'application/json', + 'csv' => 'application/csv', + 'html' => 'text/html', + 'jsonp' => 'application/javascript', + 'php' => 'text/plain', + 'serialized' => 'application/vnd.php.serialized', + 'xml' => 'application/xml' + ]; + + /** + * Information about the current API user + * + * @var object + */ + protected $_apiuser; + + /** + * Whether or not to perform a CORS check and apply CORS headers to the request + * + * @var bool + */ + protected $check_cors = NULL; + + /** + * Enable XSS flag + * Determines whether the XSS filter is always active when + * GET, OPTIONS, HEAD, POST, PUT, DELETE and PATCH data is encountered + * Set automatically based on config setting + * + * @var bool + */ + protected $_enable_xss = FALSE; + + /** + * HTTP status codes and their respective description + * Note: Only the widely used HTTP status codes are used + * + * @var array + * @link http://www.restapitutorial.com/httpstatuscodes.html + */ + protected $http_status_codes = [ + self::HTTP_OK => 'OK', + self::HTTP_CREATED => 'CREATED', + self::HTTP_NO_CONTENT => 'NO CONTENT', + self::HTTP_NOT_MODIFIED => 'NOT MODIFIED', + self::HTTP_BAD_REQUEST => 'BAD REQUEST', + self::HTTP_UNAUTHORIZED => 'UNAUTHORIZED', + self::HTTP_FORBIDDEN => 'FORBIDDEN', + self::HTTP_NOT_FOUND => 'NOT FOUND', + self::HTTP_METHOD_NOT_ALLOWED => 'METHOD NOT ALLOWED', + self::HTTP_NOT_ACCEPTABLE => 'NOT ACCEPTABLE', + self::HTTP_CONFLICT => 'CONFLICT', + self::HTTP_INTERNAL_SERVER_ERROR => 'INTERNAL SERVER ERROR', + self::HTTP_NOT_IMPLEMENTED => 'NOT IMPLEMENTED' + ]; + + /** + * Extend this function to apply additional checking early on in the process + * + * @access protected + * @return void + */ + protected function early_checks() + { + } + + /** + * Constructor for the REST API + * + * @access public + * @param string $config Configuration filename minus the file extension + * e.g: my_rest.php is passed as 'my_rest' + */ + public function __construct($config = 'rest') + { + parent::__construct(); + + $this->preflight_checks(); + + // Set the default value of global xss filtering. Same approach as CodeIgniter 3 + $this->_enable_xss = ($this->config->item('global_xss_filtering') === TRUE); + + // Don't try to parse template variables like {elapsed_time} and {memory_usage} + // when output is displayed for not damaging data accidentally + $this->output->parse_exec_vars = FALSE; + + // Start the timer for how long the request takes + $this->_start_rtime = microtime(TRUE); + + // Load the rest.php configuration file + $this->load->config($config); + + // At present the library is bundled with REST_Controller 2.5+, but will eventually be part of CodeIgniter (no citation) + $this->load->library('format'); + + // Determine supported output formats from configuration + $supported_formats = $this->config->item('rest_supported_formats'); + + // Validate the configuration setting output formats + if (empty($supported_formats)) + { + $supported_formats = []; + } + + if ( ! is_array($supported_formats)) + { + $supported_formats = [$supported_formats]; + } + + // Add silently the default output format if it is missing + $default_format = $this->_get_default_output_format(); + if (!in_array($default_format, $supported_formats)) + { + $supported_formats[] = $default_format; + } + + // Now update $this->_supported_formats + $this->_supported_formats = array_intersect_key($this->_supported_formats, array_flip($supported_formats)); + + // Get the language + $language = $this->config->item('rest_language'); + if ($language === NULL) + { + $language = 'english'; + } + + // Load the language file + $this->lang->load('rest_controller', $language); + + // Initialise the response, request and rest objects + $this->request = new stdClass(); + $this->response = new stdClass(); + $this->rest = new stdClass(); + + // Check to see if the current IP address is blacklisted + if ($this->config->item('rest_ip_blacklist_enabled') === TRUE) + { + $this->_check_blacklist_auth(); + } + + // Determine whether the connection is HTTPS + $this->request->ssl = is_https(); + + // How is this request being made? GET, POST, PATCH, DELETE, INSERT, PUT, HEAD or OPTIONS + $this->request->method = $this->_detect_method(); + + // Check for CORS access request + $check_cors = $this->config->item('check_cors'); + if ($check_cors === TRUE) + { + $this->_check_cors(); + } + + // Create an argument container if it doesn't exist e.g. _get_args + if (isset($this->{'_'.$this->request->method.'_args'}) === FALSE) + { + $this->{'_'.$this->request->method.'_args'} = []; + } + + // Set up the query parameters + $this->_parse_query(); + + // Set up the GET variables + $this->_get_args = array_merge($this->_get_args, $this->uri->ruri_to_assoc()); + + // Try to find a format for the request (means we have a request body) + $this->request->format = $this->_detect_input_format(); + + // Not all methods have a body attached with them + $this->request->body = NULL; + + $this->{'_parse_' . $this->request->method}(); + + // Now we know all about our request, let's try and parse the body if it exists + if ($this->request->format && $this->request->body) + { + $this->request->body = $this->format->factory($this->request->body, $this->request->format)->to_array(); + // Assign payload arguments to proper method container + $this->{'_'.$this->request->method.'_args'} = $this->request->body; + } + + //get header vars + $this->_head_args = $this->input->request_headers(); + + // Merge both for one mega-args variable + $this->_args = array_merge( + $this->_get_args, + $this->_options_args, + $this->_patch_args, + $this->_head_args, + $this->_put_args, + $this->_post_args, + $this->_delete_args, + $this->{'_'.$this->request->method.'_args'} + ); + + // Which format should the data be returned in? + $this->response->format = $this->_detect_output_format(); + + // Which language should the data be returned in? + $this->response->lang = $this->_detect_lang(); + + // Extend this function to apply additional checking early on in the process + $this->early_checks(); + + // Load DB if its enabled + if ($this->config->item('rest_database_group') && ($this->config->item('rest_enable_keys') || $this->config->item('rest_enable_logging'))) + { + $this->rest->db = $this->load->database($this->config->item('rest_database_group'), TRUE); + } + + // Use whatever database is in use (isset returns FALSE) + elseif (property_exists($this, 'db')) + { + $this->rest->db = $this->db; + } + + // Check if there is a specific auth type for the current class/method + // _auth_override_check could exit so we need $this->rest->db initialized before + $this->auth_override = $this->_auth_override_check(); + + // Checking for keys? GET TO WorK! + // Skip keys test for $config['auth_override_class_method']['class'['method'] = 'none' + if ($this->config->item('rest_enable_keys') && $this->auth_override !== TRUE) + { + $this->_allow = $this->_detect_api_key(); + } + + // Only allow ajax requests + if ($this->input->is_ajax_request() === FALSE && $this->config->item('rest_ajax_only')) + { + // Display an error response + $this->response([ + $this->config->item('rest_status_field_name') => FALSE, + $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_ajax_only') + ], self::HTTP_NOT_ACCEPTABLE); + } + + // When there is no specific override for the current class/method, use the default auth value set in the config + if ($this->auth_override === FALSE && + (! ($this->config->item('rest_enable_keys') && $this->_allow === TRUE) || + ($this->config->item('allow_auth_and_keys') === TRUE && $this->_allow === TRUE))) + { + $rest_auth = strtolower($this->config->item('rest_auth')); + switch ($rest_auth) + { + case 'basic': + $this->_prepare_basic_auth(); + break; + case 'digest': + $this->_prepare_digest_auth(); + break; + case 'session': + $this->_check_php_session(); + break; + } + if ($this->config->item('rest_ip_whitelist_enabled') === TRUE) + { + $this->_check_whitelist_auth(); + } + } + } + + /** + * Deconstructor + * + * @author Chris Kacerguis + * @access public + * @return void + */ + public function __destruct() + { + // Get the current timestamp + $this->_end_rtime = microtime(TRUE); + + // Log the loading time to the log table + if ($this->config->item('rest_enable_logging') === TRUE) + { + $this->_log_access_time(); + } + } + + /** + * Checks to see if we have everything we need to run this library. + * + * @access protected + * @@throws Exception + */ + protected function preflight_checks() + { + // Check to see if PHP is equal to or greater than 5.4.x + if (is_php('5.4') === FALSE) + { + // CodeIgniter 3 is recommended for v5.4 or above + throw new Exception('Using PHP v'.PHP_VERSION.', though PHP v5.4 or greater is required'); + } + + // Check to see if this is CI 3.x + if (explode('.', CI_VERSION, 2)[0] < 3) + { + throw new Exception('REST Server requires CodeIgniter 3.x'); + } + } + + /** + * Requests are not made to methods directly, the request will be for + * an "object". This simply maps the object and method to the correct + * Controller method + * + * @access public + * @param string $object_called + * @param array $arguments The arguments passed to the controller method + */ + public function _remap($object_called, $arguments = []) + { + // Should we answer if not over SSL? + if ($this->config->item('force_https') && $this->request->ssl === FALSE) + { + $this->response([ + $this->config->item('rest_status_field_name') => FALSE, + $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_unsupported') + ], self::HTTP_FORBIDDEN); + } + + // Remove the supported format from the function name e.g. index.json => index + $object_called = preg_replace('/^(.*)\.(?:'.implode('|', array_keys($this->_supported_formats)).')$/', '$1', $object_called); + + $controller_method = $object_called.'_'.$this->request->method; + // Does this method exist? If not, try executing an index method + if (!method_exists($this, $controller_method)) { + $controller_method = "index_" . $this->request->method; + array_unshift($arguments, $object_called); + } + + // Do we want to log this method (if allowed by config)? + $log_method = ! (isset($this->methods[$controller_method]['log']) && $this->methods[$controller_method]['log'] === FALSE); + + // Use keys for this method? + $use_key = ! (isset($this->methods[$controller_method]['key']) && $this->methods[$controller_method]['key'] === FALSE); + + // They provided a key, but it wasn't valid, so get them out of here + if ($this->config->item('rest_enable_keys') && $use_key && $this->_allow === FALSE) + { + if ($this->config->item('rest_enable_logging') && $log_method) + { + $this->_log_request(); + } + + // fix cross site to option request error + if($this->request->method == 'options') { + exit; + } + + $this->response([ + $this->config->item('rest_status_field_name') => FALSE, + $this->config->item('rest_message_field_name') => sprintf($this->lang->line('text_rest_invalid_api_key'), $this->rest->key) + ], self::HTTP_FORBIDDEN); + } + + // Check to see if this key has access to the requested controller + if ($this->config->item('rest_enable_keys') && $use_key && empty($this->rest->key) === FALSE && $this->_check_access() === FALSE) + { + if ($this->config->item('rest_enable_logging') && $log_method) + { + $this->_log_request(); + } + + $this->response([ + $this->config->item('rest_status_field_name') => FALSE, + $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_api_key_unauthorized') + ], self::HTTP_UNAUTHORIZED); + } + + // Sure it exists, but can they do anything with it? + if (! method_exists($this, $controller_method)) + { + $this->response([ + $this->config->item('rest_status_field_name') => FALSE, + $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_unknown_method') + ], self::HTTP_METHOD_NOT_ALLOWED); + } + + // Doing key related stuff? Can only do it if they have a key right? + if ($this->config->item('rest_enable_keys') && empty($this->rest->key) === FALSE) + { + // Check the limit + if ($this->config->item('rest_enable_limits') && $this->_check_limit($controller_method) === FALSE) + { + $response = [$this->config->item('rest_status_field_name') => FALSE, $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_api_key_time_limit')]; + $this->response($response, self::HTTP_UNAUTHORIZED); + } + + // If no level is set use 0, they probably aren't using permissions + $level = isset($this->methods[$controller_method]['level']) ? $this->methods[$controller_method]['level'] : 0; + + // If no level is set, or it is lower than/equal to the key's level + $authorized = $level <= $this->rest->level; + // IM TELLIN! + if ($this->config->item('rest_enable_logging') && $log_method) + { + $this->_log_request($authorized); + } + if($authorized === FALSE) + { + // They don't have good enough perms + $response = [$this->config->item('rest_status_field_name') => FALSE, $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_api_key_permissions')]; + $this->response($response, self::HTTP_UNAUTHORIZED); + } + } + + //check request limit by ip without login + elseif ($this->config->item('rest_limits_method') == "IP_ADDRESS" && $this->config->item('rest_enable_limits') && $this->_check_limit($controller_method) === FALSE) + { + $response = [$this->config->item('rest_status_field_name') => FALSE, $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_ip_address_time_limit')]; + $this->response($response, self::HTTP_UNAUTHORIZED); + } + + // No key stuff, but record that stuff is happening + elseif ($this->config->item('rest_enable_logging') && $log_method) + { + $this->_log_request($authorized = TRUE); + } + + // Call the controller method and passed arguments + try + { + call_user_func_array([$this, $controller_method], $arguments); + } + catch (Exception $ex) + { + // If the method doesn't exist, then the error will be caught and an error response shown + $_error = &load_class('Exceptions', 'core'); + $_error->show_exception($ex); + } + } + + /** + * Takes mixed data and optionally a status code, then creates the response + * + * @access public + * @param array|NULL $data Data to output to the user + * @param int|NULL $http_code HTTP status code + * @param bool $continue TRUE to flush the response to the client and continue + * running the script; otherwise, exit + */ + public function response($data = NULL, $http_code = NULL, $continue = FALSE) + { + ob_start(); + // If the HTTP status is not NULL, then cast as an integer + if ($http_code !== NULL) + { + // So as to be safe later on in the process + $http_code = (int) $http_code; + } + + // Set the output as NULL by default + $output = NULL; + + // If data is NULL and no HTTP status code provided, then display, error and exit + if ($data === NULL && $http_code === NULL) + { + $http_code = self::HTTP_NOT_FOUND; + } + + // If data is not NULL and a HTTP status code provided, then continue + elseif ($data !== NULL) + { + // If the format method exists, call and return the output in that format + if (method_exists($this->format, 'to_' . $this->response->format)) + { + // Set the format header + $this->output->set_content_type($this->_supported_formats[$this->response->format], strtolower($this->config->item('charset'))); + $output = $this->format->factory($data)->{'to_' . $this->response->format}(); + + // An array must be parsed as a string, so as not to cause an array to string error + // Json is the most appropriate form for such a datatype + if ($this->response->format === 'array') + { + $output = $this->format->factory($output)->{'to_json'}(); + } + } + else + { + // If an array or object, then parse as a json, so as to be a 'string' + if (is_array($data) || is_object($data)) + { + $data = $this->format->factory($data)->{'to_json'}(); + } + + // Format is not supported, so output the raw data as a string + $output = $data; + } + } + + // If not greater than zero, then set the HTTP status code as 200 by default + // Though perhaps 500 should be set instead, for the developer not passing a + // correct HTTP status code + $http_code > 0 || $http_code = self::HTTP_OK; + + $this->output->set_status_header($http_code); + + // JC: Log response code only if rest logging enabled + if ($this->config->item('rest_enable_logging') === TRUE) + { + $this->_log_response_code($http_code); + } + + // Output the data + $this->output->set_output($output); + + if ($continue === FALSE) + { + // Display the data and exit execution + $this->output->_display(); + exit; + } + else + { + ob_end_flush(); + } + + // Otherwise dump the output automatically + } + + /** + * Takes mixed data and optionally a status code, then creates the response + * within the buffers of the Output class. The response is sent to the client + * lately by the framework, after the current controller's method termination. + * All the hooks after the controller's method termination are executable + * + * @access public + * @param array|NULL $data Data to output to the user + * @param int|NULL $http_code HTTP status code + */ + public function set_response($data = NULL, $http_code = NULL) + { + $this->response($data, $http_code, TRUE); + } + + /** + * Get the input format e.g. json or xml + * + * @access protected + * @return string|NULL Supported input format; otherwise, NULL + */ + protected function _detect_input_format() + { + // Get the CONTENT-TYPE value from the SERVER variable + $content_type = $this->input->server('CONTENT_TYPE'); + + if (empty($content_type) === FALSE) + { + // If a semi-colon exists in the string, then explode by ; and get the value of where + // the current array pointer resides. This will generally be the first element of the array + $content_type = (strpos($content_type, ';') !== FALSE ? current(explode(';', $content_type)) : $content_type); + + // Check all formats against the CONTENT-TYPE header + foreach ($this->_supported_formats as $type => $mime) + { + // $type = format e.g. csv + // $mime = mime type e.g. application/csv + + // If both the mime types match, then return the format + if ($content_type === $mime) + { + return $type; + } + } + } + + return NULL; + } + + /** + * Gets the default format from the configuration. Fallbacks to 'json' + * if the corresponding configuration option $config['rest_default_format'] + * is missing or is empty + * + * @access protected + * @return string The default supported input format + */ + protected function _get_default_output_format() + { + $default_format = (string) $this->config->item('rest_default_format'); + return $default_format === '' ? 'json' : $default_format; + } + + /** + * Detect which format should be used to output the data + * + * @access protected + * @return mixed|NULL|string Output format + */ + protected function _detect_output_format() + { + // Concatenate formats to a regex pattern e.g. \.(csv|json|xml) + $pattern = '/\.('.implode('|', array_keys($this->_supported_formats)).')($|\/)/'; + $matches = []; + + // Check if a file extension is used e.g. http://example.com/api/index.json?param1=param2 + if (preg_match($pattern, $this->uri->uri_string(), $matches)) + { + return $matches[1]; + } + + // Get the format parameter named as 'format' + if (isset($this->_get_args['format'])) + { + $format = strtolower($this->_get_args['format']); + + if (isset($this->_supported_formats[$format]) === TRUE) + { + return $format; + } + } + + // Get the HTTP_ACCEPT server variable + $http_accept = $this->input->server('HTTP_ACCEPT'); + + // Otherwise, check the HTTP_ACCEPT server variable + if ($this->config->item('rest_ignore_http_accept') === FALSE && $http_accept !== NULL) + { + // Check all formats against the HTTP_ACCEPT header + foreach (array_keys($this->_supported_formats) as $format) + { + // Has this format been requested? + if (strpos($http_accept, $format) !== FALSE) + { + if ($format !== 'html' && $format !== 'xml') + { + // If not HTML or XML assume it's correct + return $format; + } + elseif ($format === 'html' && strpos($http_accept, 'xml') === FALSE) + { + // HTML or XML have shown up as a match + // If it is truly HTML, it wont want any XML + return $format; + } + else if ($format === 'xml' && strpos($http_accept, 'html') === FALSE) + { + // If it is truly XML, it wont want any HTML + return $format; + } + } + } + } + + // Check if the controller has a default format + if (empty($this->rest_format) === FALSE) + { + return $this->rest_format; + } + + // Obtain the default format from the configuration + return $this->_get_default_output_format(); + } + + /** + * Get the HTTP request string e.g. get or post + * + * @access protected + * @return string|NULL Supported request method as a lowercase string; otherwise, NULL if not supported + */ + protected function _detect_method() + { + // Declare a variable to store the method + $method = NULL; + + // Determine whether the 'enable_emulate_request' setting is enabled + if ($this->config->item('enable_emulate_request') === TRUE) + { + $method = $this->input->post('_method'); + if ($method === NULL) + { + $method = $this->input->server('HTTP_X_HTTP_METHOD_OVERRIDE'); + } + + $method = strtolower($method); + } + + if (empty($method)) + { + // Get the request method as a lowercase string + $method = $this->input->method(); + } + + return in_array($method, $this->allowed_http_methods) && method_exists($this, '_parse_' . $method) ? $method : 'get'; + } + + /** + * See if the user has provided an API key + * + * @access protected + * @return bool + */ + protected function _detect_api_key() + { + // Get the api key name variable set in the rest config file + $api_key_variable = $this->config->item('rest_key_name'); + + // Work out the name of the SERVER entry based on config + $key_name = 'HTTP_' . strtoupper(str_replace('-', '_', $api_key_variable)); + + $this->rest->key = NULL; + $this->rest->level = NULL; + $this->rest->user_id = NULL; + $this->rest->ignore_limits = FALSE; + + // Find the key from server or arguments + if (($key = isset($this->_args[$api_key_variable]) ? $this->_args[$api_key_variable] : $this->input->server($key_name))) + { + if ( ! ($row = $this->rest->db->where($this->config->item('rest_key_column'), $key)->get($this->config->item('rest_keys_table'))->row())) + { + return FALSE; + } + + $this->rest->key = $row->{$this->config->item('rest_key_column')}; + + isset($row->user_id) && $this->rest->user_id = $row->user_id; + isset($row->level) && $this->rest->level = $row->level; + isset($row->ignore_limits) && $this->rest->ignore_limits = $row->ignore_limits; + + $this->_apiuser = $row; + + /* + * If "is private key" is enabled, compare the ip address with the list + * of valid ip addresses stored in the database + */ + if (empty($row->is_private_key) === FALSE) + { + // Check for a list of valid ip addresses + if (isset($row->ip_addresses)) + { + // multiple ip addresses must be separated using a comma, explode and loop + $list_ip_addresses = explode(',', $row->ip_addresses); + $found_address = FALSE; + + foreach ($list_ip_addresses as $ip_address) + { + if ($this->input->ip_address() === trim($ip_address)) + { + // there is a match, set the the value to TRUE and break out of the loop + $found_address = TRUE; + break; + } + } + + return $found_address; + } + else + { + // There should be at least one IP address for this private key + return FALSE; + } + } + + return TRUE; + } + + // No key has been sent + return FALSE; + } + + /** + * Preferred return language + * + * @access protected + * @return string|NULL The language code + */ + protected function _detect_lang() + { + $lang = $this->input->server('HTTP_ACCEPT_LANGUAGE'); + if ($lang === NULL) + { + return NULL; + } + + // It appears more than one language has been sent using a comma delimiter + if (strpos($lang, ',') !== FALSE) + { + $langs = explode(',', $lang); + + $return_langs = []; + foreach ($langs as $lang) + { + // Remove weight and trim leading and trailing whitespace + list($lang) = explode(';', $lang); + $return_langs[] = trim($lang); + } + + return $return_langs; + } + + // Otherwise simply return as a string + return $lang; + } + + /** + * Add the request to the log table + * + * @access protected + * @param bool $authorized TRUE the user is authorized; otherwise, FALSE + * @return bool TRUE the data was inserted; otherwise, FALSE + */ + protected function _log_request($authorized = FALSE) + { + // Insert the request into the log table + $is_inserted = $this->rest->db + ->insert( + $this->config->item('rest_logs_table'), [ + 'uri' => $this->uri->uri_string(), + 'method' => $this->request->method, + 'params' => $this->_args ? ($this->config->item('rest_logs_json_params') === TRUE ? json_encode($this->_args) : serialize($this->_args)) : NULL, + 'api_key' => isset($this->rest->key) ? $this->rest->key : '', + 'ip_address' => $this->input->ip_address(), + 'time' => time(), + 'authorized' => $authorized + ]); + + // Get the last insert id to update at a later stage of the request + $this->_insert_id = $this->rest->db->insert_id(); + + return $is_inserted; + } + + /** + * Check if the requests to a controller method exceed a limit + * + * @access protected + * @param string $controller_method The method being called + * @return bool TRUE the call limit is below the threshold; otherwise, FALSE + */ + protected function _check_limit($controller_method) + { + // They are special, or it might not even have a limit + if (empty($this->rest->ignore_limits) === FALSE) + { + // Everything is fine + return TRUE; + } + + $api_key = isset($this->rest->key) ? $this->rest->key : ''; + + switch ($this->config->item('rest_limits_method')) + { + case 'IP_ADDRESS': + $limited_uri = 'ip-address:' .$this->input->ip_address(); + $api_key = $this->input->ip_address(); + break; + + case 'API_KEY': + $limited_uri = 'api-key:' . $api_key; + break; + + case 'METHOD_NAME': + $limited_uri = 'method-name:' . $controller_method; + break; + + case 'ROUTED_URL': + default: + $limited_uri = $this->uri->ruri_string(); + if (strpos(strrev($limited_uri), strrev($this->response->format)) === 0) + { + $limited_uri = substr($limited_uri,0, -strlen($this->response->format) - 1); + } + $limited_uri = 'uri:'.$limited_uri.':'.$this->request->method; // It's good to differentiate GET from PUT + break; + } + + if (isset($this->methods[$controller_method]['limit']) === FALSE ) + { + // Everything is fine + return TRUE; + } + + // How many times can you get to this method in a defined time_limit (default: 1 hour)? + $limit = $this->methods[$controller_method]['limit']; + + $time_limit = (isset($this->methods[$controller_method]['time']) ? $this->methods[$controller_method]['time'] : 3600); // 3600 = 60 * 60 + + // Get data about a keys' usage and limit to one row + $result = $this->rest->db + ->where('uri', $limited_uri) + ->where('api_key', $api_key) + ->get($this->config->item('rest_limits_table')) + ->row(); + + // No calls have been made for this key + if ($result === NULL) + { + // Create a new row for the following key + $this->rest->db->insert($this->config->item('rest_limits_table'), [ + 'uri' => $limited_uri, + 'api_key' =>$api_key, + 'count' => 1, + 'hour_started' => time() + ]); + } + + // Been a time limit (or by default an hour) since they called + elseif ($result->hour_started < (time() - $time_limit)) + { + // Reset the started period and count + $this->rest->db + ->where('uri', $limited_uri) + ->where('api_key', $api_key) + ->set('hour_started', time()) + ->set('count', 1) + ->update($this->config->item('rest_limits_table')); + } + + // They have called within the hour, so lets update + else + { + // The limit has been exceeded + if ($result->count >= $limit) + { + return FALSE; + } + + // Increase the count by one + $this->rest->db + ->where('uri', $limited_uri) + ->where('api_key', $api_key) + ->set('count', 'count + 1', FALSE) + ->update($this->config->item('rest_limits_table')); + } + + return TRUE; + } + + /** + * Check if there is a specific auth type set for the current class/method/HTTP-method being called + * + * @access protected + * @return bool + */ + protected function _auth_override_check() + { + // Assign the class/method auth type override array from the config + $auth_override_class_method = $this->config->item('auth_override_class_method'); + + // Check to see if the override array is even populated + if ( ! empty($auth_override_class_method)) + { + // Check for wildcard flag for rules for classes + if ( ! empty($auth_override_class_method[$this->router->class]['*'])) // Check for class overrides + { + // No auth override found, prepare nothing but send back a TRUE override flag + if ($auth_override_class_method[$this->router->class]['*'] === 'none') + { + return TRUE; + } + + // Basic auth override found, prepare basic + if ($auth_override_class_method[$this->router->class]['*'] === 'basic') + { + $this->_prepare_basic_auth(); + + return TRUE; + } + + // Digest auth override found, prepare digest + if ($auth_override_class_method[$this->router->class]['*'] === 'digest') + { + $this->_prepare_digest_auth(); + + return TRUE; + } + + // Session auth override found, check session + if ($auth_override_class_method[$this->router->class]['*'] === 'session') + { + $this->_check_php_session(); + + return TRUE; + } + + // Whitelist auth override found, check client's ip against config whitelist + if ($auth_override_class_method[$this->router->class]['*'] === 'whitelist') + { + $this->_check_whitelist_auth(); + + return TRUE; + } + } + + // Check to see if there's an override value set for the current class/method being called + if ( ! empty($auth_override_class_method[$this->router->class][$this->router->method])) + { + // None auth override found, prepare nothing but send back a TRUE override flag + if ($auth_override_class_method[$this->router->class][$this->router->method] === 'none') + { + return TRUE; + } + + // Basic auth override found, prepare basic + if ($auth_override_class_method[$this->router->class][$this->router->method] === 'basic') + { + $this->_prepare_basic_auth(); + + return TRUE; + } + + // Digest auth override found, prepare digest + if ($auth_override_class_method[$this->router->class][$this->router->method] === 'digest') + { + $this->_prepare_digest_auth(); + + return TRUE; + } + + // Session auth override found, check session + if ($auth_override_class_method[$this->router->class][$this->router->method] === 'session') + { + $this->_check_php_session(); + + return TRUE; + } + + // Whitelist auth override found, check client's ip against config whitelist + if ($auth_override_class_method[$this->router->class][$this->router->method] === 'whitelist') + { + $this->_check_whitelist_auth(); + + return TRUE; + } + } + } + + // Assign the class/method/HTTP-method auth type override array from the config + $auth_override_class_method_http = $this->config->item('auth_override_class_method_http'); + + // Check to see if the override array is even populated + if ( ! empty($auth_override_class_method_http)) + { + // check for wildcard flag for rules for classes + if ( ! empty($auth_override_class_method_http[$this->router->class]['*'][$this->request->method])) + { + // None auth override found, prepare nothing but send back a TRUE override flag + if ($auth_override_class_method_http[$this->router->class]['*'][$this->request->method] === 'none') + { + return TRUE; + } + + // Basic auth override found, prepare basic + if ($auth_override_class_method_http[$this->router->class]['*'][$this->request->method] === 'basic') + { + $this->_prepare_basic_auth(); + + return TRUE; + } + + // Digest auth override found, prepare digest + if ($auth_override_class_method_http[$this->router->class]['*'][$this->request->method] === 'digest') + { + $this->_prepare_digest_auth(); + + return TRUE; + } + + // Session auth override found, check session + if ($auth_override_class_method_http[$this->router->class]['*'][$this->request->method] === 'session') + { + $this->_check_php_session(); + + return TRUE; + } + + // Whitelist auth override found, check client's ip against config whitelist + if ($auth_override_class_method_http[$this->router->class]['*'][$this->request->method] === 'whitelist') + { + $this->_check_whitelist_auth(); + + return TRUE; + } + } + + // Check to see if there's an override value set for the current class/method/HTTP-method being called + if ( ! empty($auth_override_class_method_http[$this->router->class][$this->router->method][$this->request->method])) + { + // None auth override found, prepare nothing but send back a TRUE override flag + if ($auth_override_class_method_http[$this->router->class][$this->router->method][$this->request->method] === 'none') + { + return TRUE; + } + + // Basic auth override found, prepare basic + if ($auth_override_class_method_http[$this->router->class][$this->router->method][$this->request->method] === 'basic') + { + $this->_prepare_basic_auth(); + + return TRUE; + } + + // Digest auth override found, prepare digest + if ($auth_override_class_method_http[$this->router->class][$this->router->method][$this->request->method] === 'digest') + { + $this->_prepare_digest_auth(); + + return TRUE; + } + + // Session auth override found, check session + if ($auth_override_class_method_http[$this->router->class][$this->router->method][$this->request->method] === 'session') + { + $this->_check_php_session(); + + return TRUE; + } + + // Whitelist auth override found, check client's ip against config whitelist + if ($auth_override_class_method_http[$this->router->class][$this->router->method][$this->request->method] === 'whitelist') + { + $this->_check_whitelist_auth(); + + return TRUE; + } + } + } + return FALSE; + } + + /** + * Parse the GET request arguments + * + * @access protected + * @return void + */ + protected function _parse_get() + { + // Merge both the URI segments and query parameters + $this->_get_args = array_merge($this->_get_args, $this->_query_args); + } + + /** + * Parse the POST request arguments + * + * @access protected + * @return void + */ + protected function _parse_post() + { + $this->_post_args = $_POST; + + if ($this->request->format) + { + $this->request->body = $this->input->raw_input_stream; + } + } + + /** + * Parse the PUT request arguments + * + * @access protected + * @return void + */ + protected function _parse_put() + { + if ($this->request->format) + { + $this->request->body = $this->input->raw_input_stream; + if ($this->request->format === 'json') + { + $this->_put_args = json_decode($this->input->raw_input_stream); + } + } + else if ($this->input->method() === 'put') + { + // If no filetype is provided, then there are probably just arguments + $this->_put_args = $this->input->input_stream(); + } + } + + /** + * Parse the HEAD request arguments + * + * @access protected + * @return void + */ + protected function _parse_head() + { + // Parse the HEAD variables + parse_str(parse_url($this->input->server('REQUEST_URI'), PHP_URL_QUERY), $head); + + // Merge both the URI segments and HEAD params + $this->_head_args = array_merge($this->_head_args, $head); + } + + /** + * Parse the OPTIONS request arguments + * + * @access protected + * @return void + */ + protected function _parse_options() + { + // Parse the OPTIONS variables + parse_str(parse_url($this->input->server('REQUEST_URI'), PHP_URL_QUERY), $options); + + // Merge both the URI segments and OPTIONS params + $this->_options_args = array_merge($this->_options_args, $options); + } + + /** + * Parse the PATCH request arguments + * + * @access protected + * @return void + */ + protected function _parse_patch() + { + // It might be a HTTP body + if ($this->request->format) + { + $this->request->body = $this->input->raw_input_stream; + } + else if ($this->input->method() === 'patch') + { + // If no filetype is provided, then there are probably just arguments + $this->_patch_args = $this->input->input_stream(); + } + } + + /** + * Parse the DELETE request arguments + * + * @access protected + * @return void + */ + protected function _parse_delete() + { + // These should exist if a DELETE request + if ($this->input->method() === 'delete') + { + $this->_delete_args = $this->input->input_stream(); + } + } + + /** + * Parse the query parameters + * + * @access protected + * @return void + */ + protected function _parse_query() + { + $this->_query_args = $this->input->get(); + } + + // INPUT FUNCTION -------------------------------------------------------------- + + /** + * Retrieve a value from a GET request + * + * @access public + * @param NULL $key Key to retrieve from the GET request + * If NULL an array of arguments is returned + * @param NULL $xss_clean Whether to apply XSS filtering + * @return array|string|NULL Value from the GET request; otherwise, NULL + */ + public function get($key = NULL, $xss_clean = NULL) + { + if ($key === NULL) + { + return $this->_get_args; + } + + return isset($this->_get_args[$key]) ? $this->_xss_clean($this->_get_args[$key], $xss_clean) : NULL; + } + + /** + * Retrieve a value from a OPTIONS request + * + * @access public + * @param NULL $key Key to retrieve from the OPTIONS request. + * If NULL an array of arguments is returned + * @param NULL $xss_clean Whether to apply XSS filtering + * @return array|string|NULL Value from the OPTIONS request; otherwise, NULL + */ + public function options($key = NULL, $xss_clean = NULL) + { + if ($key === NULL) + { + return $this->_options_args; + } + + return isset($this->_options_args[$key]) ? $this->_xss_clean($this->_options_args[$key], $xss_clean) : NULL; + } + + /** + * Retrieve a value from a HEAD request + * + * @access public + * @param NULL $key Key to retrieve from the HEAD request + * If NULL an array of arguments is returned + * @param NULL $xss_clean Whether to apply XSS filtering + * @return array|string|NULL Value from the HEAD request; otherwise, NULL + */ + public function head($key = NULL, $xss_clean = NULL) + { + if ($key === NULL) + { + return $this->_head_args; + } + + return isset($this->_head_args[$key]) ? $this->_xss_clean($this->_head_args[$key], $xss_clean) : NULL; + } + + /** + * Retrieve a value from a POST request + * + * @access public + * @param NULL $key Key to retrieve from the POST request + * If NULL an array of arguments is returned + * @param NULL $xss_clean Whether to apply XSS filtering + * @return array|string|NULL Value from the POST request; otherwise, NULL + */ + public function post($key = NULL, $xss_clean = NULL) + { + if ($key === NULL) + { + return $this->_post_args; + } + + return isset($this->_post_args[$key]) ? $this->_xss_clean($this->_post_args[$key], $xss_clean) : NULL; + } + + /** + * Retrieve a value from a PUT request + * + * @access public + * @param NULL $key Key to retrieve from the PUT request + * If NULL an array of arguments is returned + * @param NULL $xss_clean Whether to apply XSS filtering + * @return array|string|NULL Value from the PUT request; otherwise, NULL + */ + public function put($key = NULL, $xss_clean = NULL) + { + if ($key === NULL) + { + return $this->_put_args; + } + + return isset($this->_put_args[$key]) ? $this->_xss_clean($this->_put_args[$key], $xss_clean) : NULL; + } + + /** + * Retrieve a value from a DELETE request + * + * @access public + * @param NULL $key Key to retrieve from the DELETE request + * If NULL an array of arguments is returned + * @param NULL $xss_clean Whether to apply XSS filtering + * @return array|string|NULL Value from the DELETE request; otherwise, NULL + */ + public function delete($key = NULL, $xss_clean = NULL) + { + if ($key === NULL) + { + return $this->_delete_args; + } + + return isset($this->_delete_args[$key]) ? $this->_xss_clean($this->_delete_args[$key], $xss_clean) : NULL; + } + + /** + * Retrieve a value from a PATCH request + * + * @access public + * @param NULL $key Key to retrieve from the PATCH request + * If NULL an array of arguments is returned + * @param NULL $xss_clean Whether to apply XSS filtering + * @return array|string|NULL Value from the PATCH request; otherwise, NULL + */ + public function patch($key = NULL, $xss_clean = NULL) + { + if ($key === NULL) + { + return $this->_patch_args; + } + + return isset($this->_patch_args[$key]) ? $this->_xss_clean($this->_patch_args[$key], $xss_clean) : NULL; + } + + /** + * Retrieve a value from the query parameters + * + * @access public + * @param NULL $key Key to retrieve from the query parameters + * If NULL an array of arguments is returned + * @param NULL $xss_clean Whether to apply XSS filtering + * @return array|string|NULL Value from the query parameters; otherwise, NULL + */ + public function query($key = NULL, $xss_clean = NULL) + { + if ($key === NULL) + { + return $this->_query_args; + } + + return isset($this->_query_args[$key]) ? $this->_xss_clean($this->_query_args[$key], $xss_clean) : NULL; + } + + /** + * Sanitizes data so that Cross Site Scripting Hacks can be + * prevented + * + * @access protected + * @param string $value Input data + * @param bool $xss_clean Whether to apply XSS filtering + * @return string + */ + protected function _xss_clean($value, $xss_clean) + { + is_bool($xss_clean) || $xss_clean = $this->_enable_xss; + + return $xss_clean === TRUE ? $this->security->xss_clean($value) : $value; + } + + /** + * Retrieve the validation errors + * + * @access public + * @return array + */ + public function validation_errors() + { + $string = strip_tags($this->form_validation->error_string()); + + return explode(PHP_EOL, trim($string, PHP_EOL)); + } + + // SECURITY FUNCTIONS --------------------------------------------------------- + + /** + * Perform LDAP Authentication + * + * @access protected + * @param string $username The username to validate + * @param string $password The password to validate + * @return bool + */ + protected function _perform_ldap_auth($username = '', $password = NULL) + { + if (empty($username)) + { + log_message('debug', 'LDAP Auth: failure, empty username'); + return FALSE; + } + + log_message('debug', 'LDAP Auth: Loading configuration'); + + $this->config->load('ldap.php', TRUE); + + $ldap = [ + 'timeout' => $this->config->item('timeout', 'ldap'), + 'host' => $this->config->item('server', 'ldap'), + 'port' => $this->config->item('port', 'ldap'), + 'rdn' => $this->config->item('binduser', 'ldap'), + 'pass' => $this->config->item('bindpw', 'ldap'), + 'basedn' => $this->config->item('basedn', 'ldap'), + ]; + + log_message('debug', 'LDAP Auth: Connect to ' . (isset($ldaphost) ? $ldaphost : '[ldap not configured]')); + + // Connect to the ldap server + $ldapconn = ldap_connect($ldap['host'], $ldap['port']); + if ($ldapconn) + { + log_message('debug', 'Setting timeout to '.$ldap['timeout'].' seconds'); + + ldap_set_option($ldapconn, LDAP_OPT_NETWORK_TIMEOUT, $ldap['timeout']); + + log_message('debug', 'LDAP Auth: Binding to '.$ldap['host'].' with dn '.$ldap['rdn']); + + // Binding to the ldap server + $ldapbind = ldap_bind($ldapconn, $ldap['rdn'], $ldap['pass']); + + // Verify the binding + if ($ldapbind === FALSE) + { + log_message('error', 'LDAP Auth: bind was unsuccessful'); + return FALSE; + } + + log_message('debug', 'LDAP Auth: bind successful'); + } + + // Search for user + if (($res_id = ldap_search($ldapconn, $ldap['basedn'], "uid=$username")) === FALSE) + { + log_message('error', 'LDAP Auth: User '.$username.' not found in search'); + return FALSE; + } + + if (ldap_count_entries($ldapconn, $res_id) !== 1) + { + log_message('error', 'LDAP Auth: Failure, username '.$username.'found more than once'); + return FALSE; + } + + if (($entry_id = ldap_first_entry($ldapconn, $res_id)) === FALSE) + { + log_message('error', 'LDAP Auth: Failure, entry of search result could not be fetched'); + return FALSE; + } + + if (($user_dn = ldap_get_dn($ldapconn, $entry_id)) === FALSE) + { + log_message('error', 'LDAP Auth: Failure, user-dn could not be fetched'); + return FALSE; + } + + // User found, could not authenticate as user + if (($link_id = ldap_bind($ldapconn, $user_dn, $password)) === FALSE) + { + log_message('error', 'LDAP Auth: Failure, username/password did not match: ' . $user_dn); + return FALSE; + } + + log_message('debug', 'LDAP Auth: Success '.$user_dn.' authenticated successfully'); + + $this->_user_ldap_dn = $user_dn; + + ldap_close($ldapconn); + + return TRUE; + } + + /** + * Perform Library Authentication - Override this function to change the way the library is called + * + * @access protected + * @param string $username The username to validate + * @param string $password The password to validate + * @return bool + */ + protected function _perform_library_auth($username = '', $password = NULL) + { + if (empty($username)) + { + log_message('error', 'Library Auth: Failure, empty username'); + return FALSE; + } + + $auth_library_class = strtolower($this->config->item('auth_library_class')); + $auth_library_function = strtolower($this->config->item('auth_library_function')); + + if (empty($auth_library_class)) + { + log_message('debug', 'Library Auth: Failure, empty auth_library_class'); + return FALSE; + } + + if (empty($auth_library_function)) + { + log_message('debug', 'Library Auth: Failure, empty auth_library_function'); + return FALSE; + } + + if (is_callable([$auth_library_class, $auth_library_function]) === FALSE) + { + $this->load->library($auth_library_class); + } + + return $this->{$auth_library_class}->$auth_library_function($username, $password); + } + + /** + * Check if the user is logged in + * + * @access protected + * @param string $username The user's name + * @param bool|string $password The user's password + * @return bool + */ + protected function _check_login($username = NULL, $password = FALSE) + { + if (empty($username)) + { + return FALSE; + } + + $auth_source = strtolower($this->config->item('auth_source')); + $rest_auth = strtolower($this->config->item('rest_auth')); + $valid_logins = $this->config->item('rest_valid_logins'); + + if ( ! $this->config->item('auth_source') && $rest_auth === 'digest') + { + // For digest we do not have a password passed as argument + return md5($username.':'.$this->config->item('rest_realm').':'.(isset($valid_logins[$username]) ? $valid_logins[$username] : '')); + } + + if ($password === FALSE) + { + return FALSE; + } + + if ($auth_source === 'ldap') + { + log_message('debug', "Performing LDAP authentication for $username"); + + return $this->_perform_ldap_auth($username, $password); + } + + if ($auth_source === 'library') + { + log_message('debug', "Performing Library authentication for $username"); + + return $this->_perform_library_auth($username, $password); + } + + if (array_key_exists($username, $valid_logins) === FALSE) + { + return FALSE; + } + + if ($valid_logins[$username] !== $password) + { + return FALSE; + } + + return TRUE; + } + + /** + * Check to see if the user is logged in with a PHP session key + * + * @access protected + * @return void + */ + protected function _check_php_session() + { + // Get the auth_source config item + $key = $this->config->item('auth_source'); + + // If falsy, then the user isn't logged in + if ( ! $this->session->userdata($key)) + { + // Display an error response + $this->response([ + $this->config->item('rest_status_field_name') => FALSE, + $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_unauthorized') + ], self::HTTP_UNAUTHORIZED); + } + } + + /** + * Prepares for basic authentication + * + * @access protected + * @return void + */ + protected function _prepare_basic_auth() + { + // If whitelist is enabled it has the first chance to kick them out + if ($this->config->item('rest_ip_whitelist_enabled')) + { + $this->_check_whitelist_auth(); + } + + // Returns NULL if the SERVER variables PHP_AUTH_USER and HTTP_AUTHENTICATION don't exist + $username = $this->input->server('PHP_AUTH_USER'); + $http_auth = $this->input->server('HTTP_AUTHENTICATION'); + + $password = NULL; + if ($username !== NULL) + { + $password = $this->input->server('PHP_AUTH_PW'); + } + elseif ($http_auth !== NULL) + { + // If the authentication header is set as basic, then extract the username and password from + // HTTP_AUTHORIZATION e.g. my_username:my_password. This is passed in the .htaccess file + if (strpos(strtolower($http_auth), 'basic') === 0) + { + // Search online for HTTP_AUTHORIZATION workaround to explain what this is doing + list($username, $password) = explode(':', base64_decode(substr($this->input->server('HTTP_AUTHORIZATION'), 6))); + } + } + + // Check if the user is logged into the system + if ($this->_check_login($username, $password) === FALSE) + { + $this->_force_login(); + } + } + + /** + * Prepares for digest authentication + * + * @access protected + * @return void + */ + protected function _prepare_digest_auth() + { + // If whitelist is enabled it has the first chance to kick them out + if ($this->config->item('rest_ip_whitelist_enabled')) + { + $this->_check_whitelist_auth(); + } + + // We need to test which server authentication variable to use, + // because the PHP ISAPI module in IIS acts different from CGI + $digest_string = $this->input->server('PHP_AUTH_DIGEST'); + if ($digest_string === NULL) + { + $digest_string = $this->input->server('HTTP_AUTHORIZATION'); + } + + $unique_id = uniqid(); + + // The $_SESSION['error_prompted'] variable is used to ask the password + // again if none given or if the user enters wrong auth information + if (empty($digest_string)) + { + $this->_force_login($unique_id); + } + + // We need to retrieve authentication data from the $digest_string variable + $matches = []; + preg_match_all('@(username|nonce|uri|nc|cnonce|qop|response)=[\'"]?([^\'",]+)@', $digest_string, $matches); + $digest = (empty($matches[1]) || empty($matches[2])) ? [] : array_combine($matches[1], $matches[2]); + + // For digest authentication the library function should return already stored md5(username:restrealm:password) for that username see rest.php::auth_library_function config + $username = $this->_check_login($digest['username'], TRUE); + if (array_key_exists('username', $digest) === FALSE || $username === FALSE) + { + $this->_force_login($unique_id); + } + + $md5 = md5(strtoupper($this->request->method).':'.$digest['uri']); + $valid_response = md5($username.':'.$digest['nonce'].':'.$digest['nc'].':'.$digest['cnonce'].':'.$digest['qop'].':'.$md5); + + // Check if the string don't compare (case-insensitive) + if (strcasecmp($digest['response'], $valid_response) !== 0) + { + // Display an error response + $this->response([ + $this->config->item('rest_status_field_name') => FALSE, + $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_invalid_credentials') + ], self::HTTP_UNAUTHORIZED); + } + } + + /** + * Checks if the client's ip is in the 'rest_ip_blacklist' config and generates a 401 response + * + * @access protected + * @return void + */ + protected function _check_blacklist_auth() + { + // Match an ip address in a blacklist e.g. 127.0.0.0, 0.0.0.0 + $pattern = sprintf('/(?:,\s*|^)\Q%s\E(?=,\s*|$)/m', $this->input->ip_address()); + + // Returns 1, 0 or FALSE (on error only). Therefore implicitly convert 1 to TRUE + if (preg_match($pattern, $this->config->item('rest_ip_blacklist'))) + { + // Display an error response + $this->response([ + $this->config->item('rest_status_field_name') => FALSE, + $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_ip_denied') + ], self::HTTP_UNAUTHORIZED); + } + } + + /** + * Check if the client's ip is in the 'rest_ip_whitelist' config and generates a 401 response + * + * @access protected + * @return void + */ + protected function _check_whitelist_auth() + { + $whitelist = explode(',', $this->config->item('rest_ip_whitelist')); + + array_push($whitelist, '127.0.0.1', '0.0.0.0'); + + foreach ($whitelist as &$ip) + { + // As $ip is a reference, trim leading and trailing whitespace, then store the new value + // using the reference + $ip = trim($ip); + } + + if (in_array($this->input->ip_address(), $whitelist) === FALSE) + { + $this->response([ + $this->config->item('rest_status_field_name') => FALSE, + $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_ip_unauthorized') + ], self::HTTP_UNAUTHORIZED); + } + } + + /** + * Force logging in by setting the WWW-Authenticate header + * + * @access protected + * @param string $nonce A server-specified data string which should be uniquely generated + * each time + * @return void + */ + protected function _force_login($nonce = '') + { + $rest_auth = $this->config->item('rest_auth'); + $rest_realm = $this->config->item('rest_realm'); + if (strtolower($rest_auth) === 'basic') + { + // See http://tools.ietf.org/html/rfc2617#page-5 + header('WWW-Authenticate: Basic realm="'.$rest_realm.'"'); + } + elseif (strtolower($rest_auth) === 'digest') + { + // See http://tools.ietf.org/html/rfc2617#page-18 + header( + 'WWW-Authenticate: Digest realm="'.$rest_realm + .'", qop="auth", nonce="'.$nonce + .'", opaque="' . md5($rest_realm).'"'); + } + + // Display an error response + $this->response([ + $this->config->item('rest_status_field_name') => FALSE, + $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_unauthorized') + ], self::HTTP_UNAUTHORIZED); + } + + /** + * Updates the log table with the total access time + * + * @access protected + * @author Chris Kacerguis + * @return bool TRUE log table updated; otherwise, FALSE + */ + protected function _log_access_time() + { + $payload['rtime'] = $this->_end_rtime - $this->_start_rtime; + + return $this->rest->db->update( + $this->config->item('rest_logs_table'), $payload, [ + 'id' => $this->_insert_id + ]); + } + + /** + * Updates the log table with HTTP response code + * + * @access protected + * @author Justin Chen + * @param $http_code int HTTP status code + * @return bool TRUE log table updated; otherwise, FALSE + */ + protected function _log_response_code($http_code) + { + $payload['response_code'] = $http_code; + + return $this->rest->db->update( + $this->config->item('rest_logs_table'), $payload, [ + 'id' => $this->_insert_id + ]); + } + + /** + * Check to see if the API key has access to the controller and methods + * + * @access protected + * @return bool TRUE the API key has access; otherwise, FALSE + */ + protected function _check_access() + { + // If we don't want to check access, just return TRUE + if ($this->config->item('rest_enable_access') === FALSE) + { + return TRUE; + } + + //check if the key has all_access + $accessRow = $this->rest->db + ->where('key', $this->rest->key) + ->get($this->config->item('rest_access_table'))->row_array(); + + if (!empty($accessRow) && !empty($accessRow['all_access'])) + { + return TRUE; + } + + // Fetch controller based on path and controller name + $controller = implode( + '/', [ + $this->router->directory, + $this->router->class + ]); + + // Remove any double slashes for safety + $controller = str_replace('//', '/', $controller); + + // Query the access table and get the number of results + return $this->rest->db + ->where('key', $this->rest->key) + ->where('controller', $controller) + ->get($this->config->item('rest_access_table')) + ->num_rows() > 0; + } + + /** + * Checks allowed domains, and adds appropriate headers for HTTP access control (CORS) + * + * @access protected + * @return void + */ + protected function _check_cors() + { + // Convert the config items into strings + $allowed_headers = implode(' ,', $this->config->item('allowed_cors_headers')); + $allowed_methods = implode(' ,', $this->config->item('allowed_cors_methods')); + + // If we want to allow any domain to access the API + if ($this->config->item('allow_any_cors_domain') === TRUE) + { + header('Access-Control-Allow-Origin: *'); + header('Access-Control-Allow-Headers: '.$allowed_headers); + header('Access-Control-Allow-Methods: '.$allowed_methods); + } + else + { + // We're going to allow only certain domains access + // Store the HTTP Origin header + $origin = $this->input->server('HTTP_ORIGIN'); + if ($origin === NULL) + { + $origin = ''; + } + + // If the origin domain is in the allowed_cors_origins list, then add the Access Control headers + if (in_array($origin, $this->config->item('allowed_cors_origins'))) + { + header('Access-Control-Allow-Origin: '.$origin); + header('Access-Control-Allow-Headers: '.$allowed_headers); + header('Access-Control-Allow-Methods: '.$allowed_methods); + } + } + + // If the request HTTP method is 'OPTIONS', kill the response and send it to the client + if ($this->input->method() === 'options') + { + exit; + } + } +} diff --git a/api/application/libraries/index.html b/api/application/libraries/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/application/libraries/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

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

Directory access is forbidden.

+ + + diff --git a/api/application/models/Admin_model.php b/api/application/models/Admin_model.php new file mode 100644 index 0000000..01a9277 --- /dev/null +++ b/api/application/models/Admin_model.php @@ -0,0 +1,67 @@ +db->count_all($tabela); + } + + public function getAll_usuarios($tipo) + { + $this->db->select('*'); + $this->db->from('usuarios'); + $this->db->join('tipo_usuario', 'tipo_usuario.id = usuarios.id_tipo'); + $this->db->where('tipo_usuario.descricao',$tipo); + return $this->db->count_all_results(); + } + + public function getUsuariosInscritos() + { + $this->db->select('DISTINCT(`id_usuario`)'); + $this->db->from('eventos_usuario'); + return $this->db->get()->num_rows(); + } + + public function getEventos($id = null) + { + $this->db->select('DISTINCT(e.id), e.descricao, e.vagas, e.inscritos, e.palestrante, e.sala, e.titulo, a.descricao as area, h.descricao as horario, d.descricao as data, t.descricao as tipo, c.descricao as campus'); + $this->db->from('eventos e'); + $this->db->join('areas a', 'a.id = e.id_area', 'inner'); + $this->db->join('horario h', 'h.id = e.id_horario', 'inner'); + $this->db->join('dia d', 'd.id = e.id_data', 'inner'); + $this->db->join('tipo_evento t', 't.id = e.id_tipo', 'inner'); + $this->db->join('campus c', 'c.id = e.id_unidade', 'inner'); + if ( $id != null ){ + $this->db->where('e.id', $id); + return $this->db->get('eventos')->first_row(); + } else { + return $this->db->get('eventos')->result(); + } + + } + + public function getTotalCurso($curso) + { + $this->db->select('DISTINCT(u.id)'); + $this->db->from('usuarios u'); + $this->db->join('cursos c', 'c.id = u.id_curso', 'inner'); + $this->db->where('c.descricao', $curso); + return $this->db->count_all_results(); + } + + public function lista_usuarios_evento($id_evento) + { + $this->db->select('DISTINCT(b.cpf),b.nome, b.email, b.id as id_usuario, a.presenca, a.id_evento as id_evento'); + $this->db->from('eventos_usuario a'); + $this->db->join('usuarios b','b.id = a.id_usuario','inner'); + $this->db->where('a.id_evento', $id_evento); + $this->db->order_by('nome','ASC'); + $query = $this->db->get(); + return $query->result(); + } +} + +/* End of file Admin_model.php */ +/* Location: ./application/models/Admin_model.php */ diff --git a/api/application/models/Announcement_model.php b/api/application/models/Announcement_model.php new file mode 100644 index 0000000..346ebc9 --- /dev/null +++ b/api/application/models/Announcement_model.php @@ -0,0 +1,104 @@ +db->insert(ANNOUNCEMENT, $arrayDetails); + if($this->db->affected_rows() == '1'){ + + $result['AnnouncementStatus'] = true; + $result['message'] = "Successfully Announcement details added"; + } + + else { + $result['AnnouncementStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + return $result; + + } + public function getAnnouncement() + { + $this->db->select('Heading,description,CreatedOn,IsActive,ID'); + $this->db->order_by('CreatedOn','DESC'); + $announcementDetails = $this->db->get(ANNOUNCEMENT); + + if($announcementDetails->result()){ + + $result['AnnouncementStatus'] = true; + $result['details'] = $announcementDetails->result(); + } + else { + $result['AnnouncementStatus'] = false; + $result['message'] = "No records found!"; + } + + return $result; + + } + + /* + * update announcement details + * created by Surendiran + * */ + + public function updateAnnouncement($arrayDetails=null,$updateID=null) + { + $this->db->where('ID',$updateID); + $updateStatus=$this->db->update(ANNOUNCEMENT, $arrayDetails); + + if($updateStatus){ + + $result['AnnouncementStatus'] = true; + $result['message'] = "Successfully Announcement details updated"; + } + + else { + $result['AnnouncementStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + + } + return $result; + + } + + /* + * get announcement details + * created by Surendiran + * */ + public function getLoginAnnouncement() + { + $this->db->select('Heading,description'); + $this->db->from(ANNOUNCEMENT); + $this->db->where('IsActive',1); + $this->db->order_by('CreatedOn','DESC'); + $announcementDetails = $this->db->get(); + if($announcementDetails->result()){ + $result['AnnouncementStatus'] = true; + $result['details'] = $announcementDetails->result(); + } + else { + $result['AnnouncementStatus'] = false; + $result['message'] = "No records found!"; + } + return $result; + } + +} \ No newline at end of file diff --git a/api/application/models/Batch_model.php b/api/application/models/Batch_model.php new file mode 100644 index 0000000..9353c76 --- /dev/null +++ b/api/application/models/Batch_model.php @@ -0,0 +1,141 @@ +db->select('BatchCode'); + $this->db->where('BatchCode', $arrayDetails['BatchCode']); + if($this->db->get(BATCH)->first_row()){ + $result['batchStatus'] = false; + $result['message'] = "This batch code is already exist."; + } else { + $this->db->insert(BATCH, $arrayDetails); + if ($this->db->affected_rows() == '1') { + + $result['batchStatus'] = true; + $result['message'] = "Successfully Batch details added"; + } else { + $result['batchStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + return $result; + + } + + + /* + * Get batch details + * parama id + * created by srk + * */ + + public function getBatch() + { + $this->db->select('CU.BatchCode,CU.BatchName,CU.IsActive,CU.BatchDate,CU.IsDefault,US.UniversityID,US.UniversityName'); + $this->db->from(BATCH.' as CU'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = CU.UniversityID'); + $this->db->order_by('CU.CreatedOn','DESC'); + $batchDetails = $this->db->get(); + + if($batchDetails->result()){ + + $result['batchStatus'] = true; + $result['details'] = $batchDetails->result(); + } + else { + $result['batchStatus'] = false; + $result['message'] = "No records found!"; + } + + $result['universityDetails'] = $this->getUniversityDetails(); + + return $result; + + } + + /* + * update batch details + * created by Srk + * */ + public function updateBatch($arrayDetails=null) + { + $this->db->where('BatchCode',$arrayDetails['BatchCode']); + $upateStatus=$this->db->update(BATCH, $arrayDetails); + if($upateStatus){ + + $result['batchStatus'] = true; + $result['message'] = "Successfully Batch details updated"; + } + + else { + $result['batchStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + + } + + + return $result; + + } + /* + * Get university details + * created by Srk + * */ + public function getUniversityDetails()//doubt + { + $this->db->select('UniversityID,UniversityName'); + $this->db->order_by('UniversityID','ASC'); + $this->db->where('IsActive','1'); + // $this->db->where_not_in('ID', $id); + $universityDetails = $this->db->get(UNIVERSITY); + return $universityDetails->result(); + } + /* + * update default batch + * created by kms + * */ + + public function updateDefaultBatch($details=null){ + + $setDefaultBatch['IsDefault']=false; + $setDefaultBatch['UpdatedBy'] = $details['UpdatedBy']; + $setDefaultBatch['UpdatedOn'] = $details['UpdatedOn']; + // $this->db->where('BatchCode',$details['BatchCode']); + $this->db->where('UniversityID',$details['UniversityID']); + $upateStatus=$this->db->update(BATCH, $setDefaultBatch); + if($upateStatus){ + $this->db->where('BatchCode',$details['BatchCode']); + $this->db->where('UniversityID',$details['UniversityID']); + $upateAfterStatus=$this->db->update(BATCH, $details); + $result['batchStatus'] = true; + $result['message'] = "Successfully Batch details updated"; + } + + else { + $result['batchStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + + } + return $result; + + } + + + +} \ No newline at end of file diff --git a/api/application/models/Branch_model.php b/api/application/models/Branch_model.php new file mode 100644 index 0000000..97976bc --- /dev/null +++ b/api/application/models/Branch_model.php @@ -0,0 +1,136 @@ + upload_image($imageSource, $target); + $imageNameDb = $getUploadStatus['imageName']; + $arrayDetails['LogoPath'] = $getUploadStatus == true ? "logo/".$imageNameDb : ''; +// print_r($arrayDetails['IsActive']);exit(); + $this->db->select('BranchCode'); + $this->db->where('BranchCode', $arrayDetails['BranchCode']); + if($this->db->get(BRANCH)->first_row()){ + $result['BranchStatus'] = false; + $result['message'] = "This branch code is already exist!"; + } else { + $this->db->select('BranchName'); + $this->db->where('BranchName', $arrayDetails['BranchName']); + if($this->db->get(BRANCH)->first_row()){ + $result['BranchStatus'] = false; + $result['message'] = "This branch name is already exist!"; + } else{ + $this->db->insert(BRANCH, $arrayDetails); + if($this->db->affected_rows() == '1'){ + + $result['branchStatus'] = true; + $result['message'] = "Successfully branch details added"; + } + + else { + $result['branchStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + + } + + + + return $result; + + } + /* + * get branch details + * parama id + * created by kms + * */ + + public function getBranch() + { + $this->db->select('BranchCode,BranchName,LogoPath,MobileNumber,AlternateNumber,LandlineNumber,Address,EmailID,CreatedOn,IsActive'); + $this->db->order_by('CreatedOn','DESC'); + $branchDetails = $this->db->get(BRANCH); + + if($branchDetails->result()){ + + $result['branchStatus'] = true; + $result['details'] = $branchDetails->result(); + } + else { + $result['branchStatus'] = false; + $result['message'] = "No records found!"; + } + + return $result; + + } + /* + * update branch details + * created by kms + * */ + + public function updateBranch($arrayDetails=null,$branchCode=null, $imageSource, $imageStat) + { + if( $imageStat == 1 ) { + $target = "../images/logo/"; + $getUploadStatus = $this-> upload_image($imageSource, $target); + $imageNameDb = $getUploadStatus['imageName']; + $arrayDetails['LogoPath'] = $getUploadStatus == true ? "logo/".$imageNameDb : null; + } else { + + } + +// print_r($arrayDetails['IsActive']);exit(); + + $this->db->where('BranchCode',$branchCode); + $upateStatus=$this->db->update(BRANCH, $arrayDetails); + if($upateStatus){ + $result['branchStatus'] = true; + $result['message'] = "Successfully branch details updated"; + } + + else { + $result['branchStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + + } + + + return $result; + + } + + // image upload in taget path + public function upload_image( $imageSource, $target ) { + $key2 = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 12); + $new_regNo = "Dri_" . $key2 . "." . 'jpeg'; + $targetPlace = $target . $new_regNo; + // echo $targetPlace;exit(); + if(!move_uploaded_file($imageSource , $targetPlace)) + { + return $result['status'] = false; + } else { + $result['status'] = true; + $result['imageName'] = $new_regNo; + return $result; + } + } + + +} \ No newline at end of file diff --git a/api/application/models/Broadcast_model.php b/api/application/models/Broadcast_model.php new file mode 100644 index 0000000..d7bad9c --- /dev/null +++ b/api/application/models/Broadcast_model.php @@ -0,0 +1,366 @@ +db->query($subQuery); + $results['searchResult'] = true; + $results['search_result_details'] = $queryDetails->result(); + } else if ($University != '' && $Course != '' && $Batch == '' ) { + $subQuery = "SELECT S.* , SC.ID as UNI_ID, SC.CourseID , C.CourseName , C.CourseCode, U.UniversityName + FROM ".STUDENTS." as S LEFT JOIN ".STUDENTCOURSE." as SC ON SC.StudentID = S.StudentID + LEFT JOIN ".UNIVERSITY." as U ON SC.UniversityID = U.UniversityID LEFT JOIN ".COURSE." as C ON + SC.CourseID = C.CourseID + WHERE + SC.CourseID = '$Course' AND SC.UniversityID = '$University' + AND S.IsActive = '1' + AND SC.IsActive = '1'"; + $queryDetails = $this->db->query($subQuery); + $results['searchResult'] = true; + $results['search_result_details'] = $queryDetails->result(); + } else if ( $University != '' && $Course == '' && $Batch != '' ) { + $subQuery = "SELECT S.* , SC.ID as UNI_ID, SC.CourseID , C.CourseName ,C.CourseCode, U.UniversityName + FROM ".STUDENTS." as S LEFT JOIN ".STUDENTCOURSE." as SC ON SC.StudentID = S.StudentID + LEFT JOIN ".UNIVERSITY." as U ON SC.UniversityID = U.UniversityID LEFT JOIN ".COURSE." as C ON + SC.CourseID = C.CourseID + LEFT JOIN ".STUDENTS_FEES_STATUS." as SFS ON SFS.StudentID = SC.StudentID + WHERE SFS.CourseID = SC.CourseID AND + SFS.BatchCode = '$Batch' AND SC.UniversityID = '$University' + AND S.IsActive = '1' + AND SC.IsActive = '1'"; + $queryDetails = $this->db->query($subQuery); + $results['searchResult'] = true; + $results['search_result_details'] = $queryDetails->result(); + } else if ( $University != '' && $Course != '' && $Batch != '' ) { + $subQuery = "SELECT S.* , SC.ID as UNI_ID, SC.CourseID , C.CourseName , C.CourseCode, U.UniversityName + FROM ".STUDENTS." as S LEFT JOIN ".STUDENTCOURSE." as SC ON SC.StudentID = S.StudentID + LEFT JOIN ".UNIVERSITY." as U ON SC.UniversityID = U.UniversityID LEFT JOIN ".COURSE." as C ON + SC.CourseID = C.CourseID + LEFT JOIN ".STUDENTS_FEES_STATUS." as SFS ON SFS.StudentID = SC.StudentID + WHERE SFS.CourseID = SC.CourseID AND + SFS.BatchCode = '$Batch' AND SC.CourseID = '$Course' AND SC.UniversityID = '$University' + AND S.IsActive = '1' + AND SC.IsActive = '1'"; + // AND S.BranchCode = '$branch' + // SC.UniversityID LIKE '%$University%' + // AND SC.CourseID LIKE '%$Course%' + // AND SC.BatchCode LIKE '%$Batch%' + $queryDetails = $this->db->query($subQuery); + $results['searchResult'] = true; + $results['search_result_details'] = $queryDetails->result(); + } + // $subQuery = "SELECT S.* , SC.CourseID , C.CourseName , U.UniversityName + // FROM ".STUDENTS." as S LEFT JOIN ".STUDENTCOURSE." as SC ON SC.StudentID = S.StudentID + // LEFT JOIN ".UNIVERSITY." as U ON SC.UniversityID = U.UniversityID LEFT JOIN ".COURSE." as C ON + // SC.CourseID = C.CourseID + // WHERE + // SC.UniversityID LIKE '%$University%' + // AND SC.CourseID LIKE '%$Course%' + // AND SC.BatchCode LIKE '%$Batch%' + // AND S.IsActive = '1' + // AND SC.IsActive = '1'"; + + // $queryDetails = $this->db->query($subQuery); + // $results['searchResult'] = true; + // $results['search_result_details'] = $queryDetails->result(); + + return $results; + } + + // get list of universities, course, batch + public function get_university_course_batch() { + $this->db->select('t1.UniversityID, t1.UniversityName'); + $this->db->order_by('CreatedOn', 'DESC'); + $this->db->from(''.UNIVERSITY. ' as t1'); + $this->db->where('IsActive', 1); + // $this->db->join('' . COURSE . ' as t2', 't2.UniversityID = t1.UniversityID', 'LEFT'); + $univDetails = $this->db->get(); + $universityDetails = $univDetails->result(); + $endResult = []; + foreach($universityDetails as $clip){ + // University Details + $resultArr['UniversityID'] = $clip->UniversityID; + $resultArr['UniversityName'] = $clip->UniversityName; + + // Course Details + $this->db->select('t2.CourseID, t2.CourseName'); + $this->db->from(''.COURSE. ' as t2'); + $this->db->where('t2.UniversityID', $clip->UniversityID); + $this->db->where('t2.IsActive', 1); + $courDetails = $this->db->get(); + $courseDetails = $courDetails->result(); + $resultArr['Course'] =$courseDetails; + + // Batch Details + $this->db->select('t3.BatchName, t3.BatchCode'); + $this->db->from(''.BATCH. ' as t3'); + $this->db->where('t3.UniversityID', $clip->UniversityID); + $this->db->where('t3.IsActive', 1); + $batDetails = $this->db->get(); + $batchDetails = $batDetails->result(); + $resultArr['Batch'] =$batchDetails; + array_push($endResult, $resultArr); + } + $results['univList'] = true; + $results['university_details'] = $endResult; + return $results; + } + + public function getSMSGroupDetails($reqData) { + $querys = "SELECT t1.*, t2.DeliveredStatus, t2.DeliveredOn FROM T_BroadcastStatus as t1 + LEFT JOIN T_BroadcastDeliveryCron as t2 ON t2.MsgId = t1.MsgId + WHERE t1.MsgGroup = '$reqData' ORDER BY t1.CreatedOn DESC"; + + $smsSendGroupDetails = $this->db->query($querys); + $smsSendGroupDetailsList = $smsSendGroupDetails->result(); + $results['smsSendGroupDetailsListStatus'] = true; + $results['smsSendGroupDetailsList'] = $smsSendGroupDetailsList; + return $results; + } + + public function getSmsSendBetweenDate($reqData, $reqDataBy) { + + if($reqData['date'] != '' && $reqData['dateTo'] != '') { + $d = new DateTime($reqData['date']); + $dTo = new DateTime($reqData['dateTo']); + $fromDate = $d->format('Y-m-d'); + $toDate = $dTo->format('Y-m-d'); + + // $querys = "SELECT t1.*, t2.* FROM T_BroadcastStatus as t1 + // LEFT JOIN T_BroadcastDeliveryCron as t2 ON t2.MsgId = t1.MsgId + // WHERE STR_TO_DATE(t1.CreatedOn, '%Y-%m-%d') BETWEEN '$fromDate' + // AND '$toDate' ORDER BY t1.CreatedOn DESC"; + + $querys = "SELECT t1.*, COUNT(t1.MsgGroup) as MSG_SEND_CNT FROM T_BroadcastStatus as t1 + LEFT JOIN T_BroadcastDeliveryCron as t2 ON t2.MsgId = t1.MsgId + WHERE STR_TO_DATE(t1.CreatedOn, '%Y-%m-%d') BETWEEN '$fromDate' + AND '$toDate' GROUP BY t1.MsgGroup ORDER BY t1.CreatedOn DESC"; + + $smsSendDetails = $this->db->query($querys); + $smsSendDetailsList = $smsSendDetails->result(); + $results['smsSendDetailsListStatus'] = true; + $results['smsSendDetailsList'] = $smsSendDetailsList; + + } else { + // $d = new DateTime($d1); + // $dTo = new DateTime($d2); + // $fromDate = $d->format('Y-m-d'); + // $toDate = $dTo->format('Y-m-d'); + + // $querys = "SELECT t1.*, t2.* FROM T_BroadcastStatus as t1 + // LEFT JOIN T_BroadcastDeliveryCron as t2 ON t2.MsgId = t1.MsgId + // WHERE STR_TO_DATE(t1.CreatedOn, '%Y-%m-%d') BETWEEN '$fromDate' + // AND '$toDate' ORDER BY t1.CreatedOn DESC"; + + $querys = "SELECT t1.*, COUNT(t1.MsgGroup) FROM T_BroadcastStatus as t1 + LEFT JOIN T_BroadcastDeliveryCron as t2 ON t2.MsgId = t1.MsgId + GROUP BY t1.MsgGroup ORDER BY t1.CreatedOn DESC"; + + $smsSendDetails = $this->db->query($querys); + $smsSendDetailsList = $smsSendDetails->result(); + $results['smsSendDetailsListStatus'] = true; + $results['smsSendDetailsList'] = $smsSendDetailsList; + $results['smsSendDetailsListStatus'] = true; + $results['smsSendDetailsList'] = $smsSendDetailsList; + } + return $results; + } + + + public function send_msg_students($arr, $msg, $reqDetails) { + $msg_body = $msg['content']; + $sender = $reqDetails['localUserID']; + $mesg = "$msg_body"; + // $mesg = "Status Update : check - check check."; + // $mesg = "Check"; + $resp = $this->smssend($arr, $mesg); + // echo $resp ;exit(); + $arrss = explode('
', $resp); + // Array + // ( + // [0] => MsgID + // [1] => 4fad03cf13734a869307b19fcc293570 + // [2] => 919942080003 + // [3] => 201801191700328088 + // [4] => success + // ) + $time = date('Y-m-d H:i:s'); + $dateTime = $time; + $msgGroup = date('YmdHis'); + + for($i=0, $c = count($arrss) ; $i< $c; $i++){ + // echo $arrss[$i];exit(); + if( $arrss[$i] === '') { + break; + } else { + $a = explode(':', $arrss[$i]); + $msgIdState = $a[0]; + $msgId = $a[1]; + $msgNumb = $a[2]; + $msgStatus = $a[4]; + $data[] = array( + 'MsgId' => $msgId, + 'MobileNumber' => $msgNumb, + 'MsgBody' => $mesg, + 'Status' => $msgStatus, + 'CreatedOn' => $dateTime, + 'CreatedBy' => $sender, + 'MsgGroup' => $msgGroup + ); + continue; + } + } + $this->db->insert_batch('T_BroadcastStatus', $data); + if ($this->db->affected_rows() >= 1) { + $result['msgStatus'] = true; + $result['message'] = "Successfully Messages Sended!!"; + } else { + $result['msgStatus'] = false; + $result['message'] = "error!!"; + } + // print_r($data); + // exit(); + // $msgID = $arrss[1]; + // $msgSendTime = $arrss[2]; + // $msgDeleveredNum = $arrss[3]; + // $msgSendStatus = $arrss[3]; + + // print_r($data);exit(); + return $result; + } + + // self function for getting registered mobile for sms + public function get_registered_mobile($num) { + $this->db->select('MobileNumber'); + $this->db->from(STUDENTS); + $this->db->where('StudentID', $num); + $roleDetails = $this->db->get()->first_row(); + return $roleDetails->MobileNumber; + } + + // http://www.24x7sms.com/downloads/24X7SMS_http_API2.0.pdf + // API Key : xegCdYUIMf3 + + // Your new password for logging into Apollo student portal is (Password). Please change the password as soon as you login. + // This is the template to be used. + + public function smssend($arr, $msg) + { + $number =array(); + foreach($arr as $ar){ + $mobi = $this->get_registered_mobile($ar['StudentID']); + array_push($number, "91$mobi"); + } + $mobile = implode(',', $number); + // $message ="Your new password for logging into Apollo student portal is SAMPLE. Please change the password as soon as you login."; + // $mobile = "91$mobile"; + + $message = urlencode($msg); + // echo $mobile , $message; + $ch=curl_init(); + curl_setopt($ch,CURLOPT_URL,"https://smsapi.24x7sms.com/api_2.0/SendSMS.aspx?APIKEY=xegCdYUIMf3&MobileNo=".$mobile."&SenderID=APOLLO&Message=".$message."&ServiceName=PROMOTIONAL_HIGH"); + + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + $output =curl_exec($ch); + + // print_r($output);exit(); + curl_close($ch); + return $output; + } + + public function getCronUpdate() { + $date2 = date('Y-m-d'); + + $quw = "SELECT * FROM T_BroadcastDeliveryCron ORDER BY id DESC LIMIT 1"; + $myext = $this->db->query($quw)->first_row(); + // print_r($this->db->query($quw)->first_row());exit(); + if($myext){ + if($myext->CreatedOn){ + $arrsss = explode(' ', $myext->CreatedOn); + } + $date1 = $myext->CreatedOn != '' ? $arrsss[0] : $date2; + } else { + $date1 = $date2; + } + + $ch=curl_init(); + curl_setopt($ch,CURLOPT_URL,"https://smsapi.24x7sms.com/api_2.0/GetReports.aspx?APIKEY=xegCdYUIMf3&StartDate=".$date1."&EndDate=".$date2.""); + + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + $output =curl_exec($ch); +// print_r($output);exit(); + curl_close($ch); + + $arrss = explode('
', $output); + array_pop($arrss); + // Array + // ( + // [0] => MsgID + // [1] => 4fad03cf13734a869307b19fcc293570 + // [2] => 919942080003 + // [3] => 201801191700328088 + // [4] => success + // ) + $time = date('Y-m-d H:i:s'); + $dateTime = $time; + $c = count($arrss); + for($i=0 ; $i < $c; $i++){ + // echo $arrss[$i];exit(); + if( $i == $c-1) { + break; + } else { + $a = explode('|', $arrss[$i]); + $msgId = $a[0]; + $msgNumb = $a[1]; + $delvStatus = $a[2]; + $delvOn = $a[3]; + $qury1 = "SELECT * FROM T_BroadcastDeliveryCron WHERE MsgId = '$msgId'"; + $choe = $this->db->query($qury1)->first_row(); + + if($this->db->query($qury1)->first_row()){ + $qury2 = "UPDATE T_BroadcastDeliveryCron SET DeliveredStatus = '$delvStatus', DeliveredOn = '$delvOn' WHERE MsgId = '$msgId'"; + + $choe2 = $this->db->query($qury2); + // continue; + } else { + $qury3 = " INSERT INTO T_BroadcastDeliveryCron (MsgId, MobileNumber, DeliveredStatus, DeliveredOn, CreatedOn) VALUES('$msgId', '$msgNumb', '$delvStatus', '$delvOn', '$dateTime')"; + + $choe3 = $this->db->query($qury3); + // continue; + } + } + } + return 'records updated!!'; + } + +} \ No newline at end of file diff --git a/api/application/models/Calltracking_model.php b/api/application/models/Calltracking_model.php new file mode 100644 index 0000000..93cb063 --- /dev/null +++ b/api/application/models/Calltracking_model.php @@ -0,0 +1,1273 @@ +db->select('LD.LeadID,LD.LeadName,LD.MobileNumber,LD.IsNewEnquiry,LT.ActivityStatus,LT.AssignedTo,LT.StatusCode,LT.University,LT.Course,LT.AlternateMobile,LT.Address'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->where('LD.MobileNumber',$mobileNumber); + $leadDet=$this->db->get()->last_row(); + $result_array = []; + if($leadDet){ + $result_array['existLeadDetails']=$leadDet; + } + else{ + $this->db->select('ST.MobileNumber,ST.Firstname,ST.AlternateNumber,ST.PresentAddress,US.UniversityName,CU.CourseName'); + $this->db->from(STUDENTS.' as ST'); + $this->db->join(STUDENTCOURSE.' as STC', 'ST.StudentID = STC.StudentID'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = STC.UniversityID'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = STC.CourseID'); + $this->db->where('ST.MobileNumber',$mobileNumber); + $enrolledStudDet=$this->db->get()->last_row(); + if($enrolledStudDet) { + $leadDet['LeadName'] = $enrolledStudDet->Firstname; + $leadDet['MobileNumber'] = $enrolledStudDet->MobileNumber; + $leadDet['IsNewEnquiry'] = "1"; + $leadDet['University'] = $enrolledStudDet->UniversityName; + $leadDet['Course'] = $enrolledStudDet->CourseName; + $leadDet['ActivityStatus'] = ""; + $leadDet['AssignedTo'] = ""; + $leadDet['StatusCode'] = ""; + $leadDet['AlternateMobile'] = $enrolledStudDet->AlternateNumber; + $leadDet['Address'] = $enrolledStudDet->PresentAddress; + $result_array['existLeadDetails'] = $leadDet; + } + else{ + $leadDet['LeadName'] = ""; + $leadDet['MobileNumber'] = ""; + $leadDet['IsNewEnquiry'] = "1"; + $leadDet['University'] = ""; + $leadDet['Course'] = ""; + $leadDet['ActivityStatus'] = ""; + $leadDet['AssignedTo'] = ""; + $leadDet['StatusCode'] = ""; + $leadDet['AlternateMobile'] = ""; + $leadDet['Address'] = ""; + $result_array['existLeadDetails'] = $leadDet; + } + } + // store lead,university and course details in comman array + //$result_array['universityDetails']=$this->getUniversityDetails(); + $result_array['activityDetails']=$this->getActivityDetails($mobileNumber); + // $result_array['statusDetails']=$this->getStatus(); + $result_array['staffDetails']=$this->getStaff("1",$branchID,$userType,$requestedBy); + return $result_array; + + } + + /* + * get university details + * created by kms + * */ + public function getUniversityDetails() + { + $this->db->select('UniversityID,UniversityName'); + $this->db->where('IsActive','1'); + $this->db->order_by('UniversityID','ASC'); + $unviversityDetails = $this->db->get(UNIVERSITY); + + if($unviversityDetails->result()){ + $result_university = array(); + foreach ($unviversityDetails->result() as $row) + { + $university_array['universityStatus'] = true; + $university_array['universityID'] = $row->UniversityID; + $university_array['universityName'] = $row->UniversityName; + $university_array['courseDetails']= $this->getCourseDetails($row->UniversityID); + $result_university[]=$university_array; + } + } + else { + $university_array['universityStatus'] = false; + $university_array['message'] = "No records found!"; + $university_array['universityID'] = ""; + $university_array['universityName'] = ""; + $university_array['courseDetails']= ""; + $result_university[]=$university_array; + } + + + return $result_university; + + } + /* + * get course details + * @params university id + * created by kms + * */ + public function getCourseDetails($universityID=null) + { + $this->db->select('CourseID,CourseName'); + $this->db->where('UniversityID',$universityID); + $this->db->where('IsActive','1'); + $this->db->order_by('CourseID','ASC'); + $courseDetails = $this->db->get(COURSE); + return $courseDetails->result(); + } + + /* + * get activity details + * created by kms + * */ + + public function getActivityDetails($mobileNo=null) + { + $this->db->distinct(); + $this->db->select('LT.ActivityStatus,LT.ActivityStatus'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'LT.StatusCode = PLD.ListCode'); + $this->db->where('PLD.ListName !=','CLOSE'); + $this->db->where('LD.MobileNumber',$mobileNo); + $getExistActivity=$this->db->get(); + $existArrayActivity=array(); + if($getExistActivity->result()){ + foreach ($getExistActivity->result() as $ActRow){ + + array_push($existArrayActivity,$ActRow->ActivityStatus); + } + + + } + else{ + $existArrayActivity=array(); + } + + $this->db->select('ActivityID,ActivityName'); + $this->db->where('IsActive','1'); + if($existArrayActivity){ + $this->db->where_not_in('ActivityID',$existArrayActivity); + } + $this->db->order_by('ActivityID','ASC'); + $activity = $this->db->get(ACTIVITY); + if($activity->result()){ + $result_activity = array(); + foreach ($activity->result() as $row) + { + $activity_array['activityStatus'] = true; + $activity_array['activityID'] = $row->ActivityID; + $activity_array['activityName'] = $row->ActivityName; + $activity_array['activityStatus']= $this->getStatus($row->ActivityID); + $result_activity[]=$activity_array; + } + + } + else{ + $activity_array['activityStatus'] = false; + $activity_array['activityID'] = ""; + $activity_array['activityName'] = "No activity"; + $activity_array['activityStatus']= ""; + $result_activity[]=$activity_array; + + } + + return $result_activity; + } + + /* + * get activity status details + * created by kms + * */ + + public function getStatus($activityID=null) + { + $this->db->select('AVS.StatusID,PLD.ListCode,PLD.ListName'); + $this->db->from(ACTIVITY_STATUS .' as AVS'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'PLD.ListCode = AVS.StatusName'); + $this->db->where('AVS.ActivityID',$activityID); + $this->db->where('AVS.IsActive','1'); + $this->db->where('PLD.IsActive','1'); + $status = $this->db->get(); + return $status->result(); + } + + /* + * get staff details + * created by kms + * + * */ + + public function getStaff($status=null,$branchID=null,$userType=null,$requestedBy) + { + if($userType != SUPER_ADMIN){ + + $this->db->select('LO.ID,ST.StaffID,ST.Firstname'); + $this->db->from(LOGIN.' as LO'); + $this->db->join(STAFF_BRANCH.' as STB', 'STB.StaffID = LO.StaffID'); + $this->db->join(STAFF.' as ST', 'ST.StaffID = LO.StaffID'); + $this->db->join(BRANCH.' as BR', 'BR.BranchCode = STB.BranchCode'); + $this->db->where('ST.IsActive',$status); + $this->db->where('BR.IsActive',$status); + if($userType== ADMIN){ + $this->db->where('STB.BranchCode',$branchID); + $this->db->where('LO.ListCode !=',SUPER_ADMIN); + } + if($userType== EMPLOYEE){ + $this->db->where('STB.BranchCode',$branchID); + $this->db->where('LO.ID',$requestedBy); + } + $staffDetails=$this->db->get(); + if($staffDetails){ + $result_staff = array(); + foreach ($staffDetails->result() as $row) + { + $university_array['loginId'] = $row->ID; + $university_array['staffName'] = $row->Firstname.'-'.$row->StaffID; + $result_staff[]=$university_array; + } + + } + else{ + $result_staff[]=""; + } + } + else{ + $this->db->select('BR.BranchCode,BR.BranchName'); + $this->db->from(BRANCH.' as BR'); + $this->db->where('BR.IsActive',$status); + $branchDetails=$this->db->get(); + + if($branchDetails->result()){ + foreach ($branchDetails->result() as $branchRow){ + $branch_array['BranchCode'] = $branchRow->BranchCode; + $branch_array['BranchName'] = $branchRow->BranchName.'-'.$branchRow->BranchCode; + $branch_array['staffDetails'] = $this->superAdminBranch($branchRow->BranchCode,$status); + $result_staff[]=$branch_array; + } + + } + else{ + $result_staff[]=""; + } + + + } + + return $result_staff; + } + + /* + * get staff details based on branch id + * created by kms + * */ + public function superAdminBranch($branchID,$status){ + + $this->db->select('LO.ID,ST.StaffID,ST.Firstname'); + $this->db->from(LOGIN.' as LO'); + $this->db->join(STAFF_BRANCH.' as STB', 'STB.StaffID = LO.StaffID'); + $this->db->join(STAFF.' as ST', 'ST.StaffID = LO.StaffID'); + $this->db->where('ST.IsActive',$status); + $this->db->where('STB.BranchCode',$branchID); + $staffDetails=$this->db->get(); + if($staffDetails){ + $result_staff = array(); + foreach ($staffDetails->result() as $row) + { + $university_array['loginId'] = $row->ID; + $university_array['staffName'] = $row->Firstname.'-'.$row->StaffID; + $result_staff[]=$university_array; + } + + } + else{ + $result_staff[]=""; + } + + return $result_staff; + + } + + + /* + * add lead details + * created by kms + * */ + + public function addleadDetails($lead_Details=null,$track_Details=null,$followup_Details=null) + { + $this->db->insert(LEAD_DETAILS, $lead_Details); + // this if for insert lead details + if($this->db->affected_rows() == '1'){ + // get and store insert id from db + $track_Details['LeadID']=$this->db->insert_id(); + $this->db->insert(LEAD_TRACKING, $track_Details); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $followup_Details['TrackingID']=$this->db->insert_id(); + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $followup_Details); + // this if for insert follow up details + if($this->db->affected_rows() == '1'){ + $result['leadStatus'] = true; + $result['message'] = "Successfully lead details added"; + } + else{ + $result['leadStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + } + else{ + $result['leadStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + } + + else { + $result['leadStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + return $result; + + } + + /* + * get all tracked details + * created by kms + * */ + + public function getTrackingDetails($search=null) + { + $this->db->select('LTF.FollowupOn,LD.LeadID,LD.LeadName,LD.MobileNumber,LD.IsNewEnquiry,LT.TrackingID,LT.ActivityStatus,LT.AssignedTo,LT.StatusCode,LT.University,LT.Course,LT.AlternateMobile,LT.Address,LT.Flag,ST.StaffID,ST.Firstname,PLD1.ListCode as statusListCode,PLD1.ListName as statusListName,AV.ActivityID,AV.ActivityName'); + $this->db->from(LEAD_TRACKING_FOLLOWUP.' as LTF'); + $this->db->join(LEAD_TRACKING.' as LT','LT.TrackingID=LTF.TrackingID'); + $this->db->join(LEAD_DETAILS.' as LD', 'LT.LeadID = LD.LeadID'); + $this->db->join(LOGIN.' as LO', 'LO.ID = LT.AssignedTo'); + $this->db->join(STAFF.' as ST', 'ST.StaffID = LO.StaffID'); + $this->db->join(ACTIVITY.' as AV', 'AV.ActivityID = LT.ActivityStatus'); + $this->db->join(PICK_LIST_DETAILS.' as PLD1', 'PLD1.ListCode = LT.StatusCode'); + $this->db->where('LTF.IsActive', '1'); + if($search['CreatedBranch'] !='All' AND $search['requestedDept'] != EMPLOYEE){ + $this->db->where('LT.CreatedBranch', $search['CreatedBranch']); + + } + if ($search['requestedDept'] == EMPLOYEE){ + + $this->db->where('LT.AssignedTo', $search['requestedBy']); + $this->db->where('LT.CreatedBranch', $search['CreatedBranch']); + + } + if($search['searchDate']!='' OR $search['searchDate']!=null){ + /* if(sizeof($search['searchDate']) == '1'){ + $this->db->where('LTF.FollowupOn <= ', $search['searchDate'][0]); + $this->db->where('PLD1.ListName !=', 'CLOSE'); + + }*/ + + $this->db->where_in('LTF.FollowupOn', $search['searchDate']); + $this->db->order_by('LTF.FollowupOn','DESC'); + $this->db->group_by('LT.TrackingID'); + + } + else{ + $this->db->order_by('LTF.FollowupOn','DESC'); + $this->db->group_by('LT.TrackingID'); + } + + // $this->db->group_by('LD.MobileNumber'); + $leadDet=$this->db->get(); + + if($this->db->affected_rows()==0){ + $result_array['trackingStatus']=false; + $result_array['trackingDetails']=""; + } + else{ + if($leadDet){ + $result_array = array(); + $result_array['trackingStatus']=true; + + foreach ($leadDet->result() as $row) + { + + $tracking_array["LeadID"]=$row->LeadID; + $tracking_array["LeadName"]=$row->LeadName; + $tracking_array["MobileNumber"]=$row->MobileNumber; + $tracking_array["IsNewEnquiry"]=$row->IsNewEnquiry; + $tracking_array["Flag"]=$row->Flag; + $tracking_array["TrackingID"]=$row->TrackingID; + $tracking_array["ActivityStatus"]=$row->ActivityStatus; + $tracking_array["AssignedTo"]=$row->AssignedTo; + $tracking_array["Firstname"]=$row->Firstname; + $tracking_array["StatusCode"]=$row->StatusCode; + $tracking_array["statusName"]=$row->statusListName; + $tracking_array["UniversityName"]=$row->University; + $tracking_array["CourseName"]=$row->Course; + $tracking_array["ActivityID"]=$row->ActivityID; + $tracking_array["ActivityName"]=$row->ActivityName; + $tracking_array["AlternateMobile"]=$row->AlternateMobile; + $tracking_array["Address"]=$row->Address; + // $tracking_array["followupDetails"]=$this->getTrackingFollowup($row->TrackingID); + // $followupDetails=$this->getTrackingFollowup($row->TrackingID); + + // $tracking_array["followupDetails"]=$followupDetails[0]->FollowupOn; + $tracking_array["followupDetails"]=$row->FollowupOn; + $result[]=$tracking_array; + + + } + $result_array['trackingDetails']=$result; + // $result_array['statusDetails']=$this->getStatus(); + + + } + } + $result_array['pendingTrackingDetails'] = $this->getPrevPendingTrackingDetails($search); + + + return $result_array; + + } + + public function getPrevPendingTrackingDetails($search=null) + { + $this->db->select('LTF.FollowupOn,LD.LeadID,LD.LeadName,LD.MobileNumber,LD.IsNewEnquiry,LT.TrackingID,LT.ActivityStatus,LT.AssignedTo,LT.StatusCode,LT.University,LT.Course,LT.AlternateMobile,LT.Address,LT.Flag,ST.StaffID,ST.Firstname,PLD1.ListCode as statusListCode,PLD1.ListName as statusListName,AV.ActivityID,AV.ActivityName'); + $this->db->from(LEAD_TRACKING_FOLLOWUP.' as LTF'); + $this->db->join(LEAD_TRACKING.' as LT','LT.TrackingID=LTF.TrackingID'); + $this->db->join(LEAD_DETAILS.' as LD', 'LT.LeadID = LD.LeadID'); + $this->db->join(LOGIN.' as LO', 'LO.ID = LT.AssignedTo'); + $this->db->join(STAFF.' as ST', 'ST.StaffID = LO.StaffID'); + $this->db->join(ACTIVITY.' as AV', 'AV.ActivityID = LT.ActivityStatus'); + $this->db->join(PICK_LIST_DETAILS.' as PLD1', 'PLD1.ListCode = LT.StatusCode'); + $this->db->where('LTF.IsActive', '1'); + if($search['CreatedBranch'] !='All' AND $search['requestedDept'] != EMPLOYEE){ + $this->db->where('LT.CreatedBranch', $search['CreatedBranch']); + + } + if ($search['requestedDept'] == EMPLOYEE){ + + $this->db->where('LT.AssignedTo', $search['requestedBy']); + $this->db->where('LT.CreatedBranch', $search['CreatedBranch']); + + } + if(($search['searchDate']!='' OR $search['searchDate']!=null) AND sizeof($search['searchDate']) == '1'){ + + // $this->db->where('LTF.FollowupOn <= ', $search['searchDate'][0]); + $this->db->where('PLD1.ListName !=', 'CLOSE'); + $leadDet=$this->db->get(); + + if($leadDet->result()){ + + $result_array['trackingStatus']=true; + + foreach ($leadDet->result() as $row) + { + + $tracking_array["LeadID"]=$row->LeadID; + $tracking_array["LeadName"]=$row->LeadName; + $tracking_array["MobileNumber"]=$row->MobileNumber; + $tracking_array["IsNewEnquiry"]=$row->IsNewEnquiry; + $tracking_array["Flag"]=$row->Flag; + $tracking_array["TrackingID"]=$row->TrackingID; + $tracking_array["ActivityStatus"]=$row->ActivityStatus; + $tracking_array["AssignedTo"]=$row->AssignedTo; + $tracking_array["Firstname"]=$row->Firstname; + $tracking_array["StatusCode"]=$row->StatusCode; + $tracking_array["statusName"]=$row->statusListName; + $tracking_array["UniversityName"]=$row->University; + $tracking_array["CourseName"]=$row->Course; + $tracking_array["ActivityID"]=$row->ActivityID; + $tracking_array["ActivityName"]=$row->ActivityName; + $tracking_array["AlternateMobile"]=$row->AlternateMobile; + $tracking_array["Address"]=$row->Address; + // $tracking_array["followupDetails"]=$this->getTrackingFollowup($row->TrackingID); + // $followupDetails=$this->getTrackingFollowup($row->TrackingID); + + // $tracking_array["followupDetails"]=$followupDetails[0]->FollowupOn; + $tracking_array["followupDetails"]=$row->FollowupOn; + $result[]=$tracking_array; + + + } + $result_array['trackingDetails']=$result; + + + } + else{ + $result_array['trackingStatus']=false; + } + } + else{ + $result_array['trackingStatus']=false; + } + + + + + + return $result_array; + + + + + } + /* + * get never closed tracking list by current date + * created by kms + * */ + + + /* + * get tracking followup Details + * @params tracking id + * created by kms + * */ + + public function getTrackingFollowup($trackingId=null) + { + $this->db->select('LTF.InteractionId,LTF.TrackingID,LTF.FollowupOn,LTF.FollowupComments,DATE_FORMAT(LTF.CreatedOn, "%d-%m-%Y %h:%i %p") AS CreatedOn,ST.FirstName'); + + $this->db->from(LEAD_TRACKING_FOLLOWUP.' as LTF'); + $this->db->join(LOGIN.' as LO', 'LO.ID = LTF.CreatedBy'); + $this->db->join(STAFF.' as ST', 'ST.StaffID = LO.StaffID'); + $this->db->where('TrackingID',$trackingId); + $this->db->order_by('InteractionId','DESC'); + $trackingDetails = $this->db->get(); + return $trackingDetails->result(); + } + + /* + * update followup details + * created by kms + * */ + + public function updateFollowupDetails($updateDetails=null,$insertDetails=null) + { + $deactivateStatus['IsActive']=false; + $this->db->where('TrackingID',$updateDetails['TrackingID']); + $this->db->update(LEAD_TRACKING_FOLLOWUP, $deactivateStatus); + if($this->db->affected_rows() > '0') { + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $insertDetails); + // this if for insert follow up details + if ($this->db->affected_rows() == '1') { + $this->db->where('TrackingID', $updateDetails['TrackingID']); + $upateStatus = $this->db->update(LEAD_TRACKING, $updateDetails); + $result['followupStatus'] = true; + $result['trackingID'] = $updateDetails['TrackingID']; + $result['message'] = "Successfully followup details updated"; + } else { + $result['followupStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + else{ + $activateStatus['IsActive']=true; + $this->db->where('TrackingID',$updateDetails['TrackingID']); + $this->db->update(LEAD_TRACKING_FOLLOWUP, $activateStatus); + $result['followupStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + + + return $result; + + } + + + /* + * get tracking information when page is loading + * created by kms + * */ + + + public function getLoadFollowupDetails($trackingID) + { + $this->db->select('LD.LeadID,LD.LeadName,LD.MobileNumber,LD.IsNewEnquiry,LT.TrackingID,LT.ActivityStatus,LT.AssignedTo,LT.CreatedBranch,BR.BranchName,LT.StatusCode,LT.University,LT.Course,LT.AlternateMobile,LT.Address,LT.ReferredBy,ST.StaffID,ST.Firstname,PLD1.ListCode as statusListCode,PLD1.ListName as statusListName,AV.ActivityID,AV.ActivityName'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->join(LOGIN.' as LO', 'LO.ID = LT.AssignedTo'); + $this->db->join(STAFF.' as ST', 'ST.StaffID = LO.StaffID'); + $this->db->join(ACTIVITY.' as AV', 'AV.ActivityID = LT.ActivityStatus'); + $this->db->join(PICK_LIST_DETAILS.' as PLD1', 'PLD1.ListCode = LT.StatusCode'); + $this->db->join(BRANCH.' as BR', 'BR.BranchCode = LT.CreatedBranch'); + + $this->db->where('LT.TrackingID',$trackingID['TrackingID']); + if($trackingID['CreatedBranch'] !='All' AND $trackingID['requestedDept'] != EMPLOYEE){ + $this->db->where('LT.CreatedBranch', $trackingID['CreatedBranch']); + + } + if ($trackingID['requestedDept'] == EMPLOYEE){ + + $this->db->where('LT.AssignedTo', $trackingID['UpdatedBy']); + $this->db->where('LT.CreatedBranch', $trackingID['CreatedBranch']); + + } + + $leadDet=$this->db->get(); + + if($leadDet){ + $result_array = array(); + $result_array['followupStatus']=true; + + foreach ($leadDet->result() as $row) + { + $activityID = $row->ActivityStatus; + $tracking_array["LeadID"]=$row->LeadID; + $tracking_array["LeadName"]=$row->LeadName; + $tracking_array["MobileNumber"]=$row->MobileNumber; + $tracking_array["IsNewEnquiry"]=$row->IsNewEnquiry; + $tracking_array["TrackingID"]=$row->TrackingID; + $tracking_array["ActivityStatus"]=$row->ActivityStatus; + $tracking_array["AssignedTo"]=$row->AssignedTo; + $tracking_array["CreatedBranch"]=$row->CreatedBranch; + $tracking_array["CreatedBranchName"]=$row->BranchName; + $tracking_array["Firstname"]=$row->Firstname; + $tracking_array["StaffID"]=$row->StaffID; + $tracking_array["StatusCode"]=$row->StatusCode; + $tracking_array["statusName"]=$row->statusListName; + $tracking_array["UniversityName"]=$row->University; + $tracking_array["CourseName"]=$row->Course; + $tracking_array["ActivityID"]=$row->ActivityID; + $tracking_array["ActivityName"]=$row->ActivityName; + $tracking_array["AlternateMobile"]=$row->AlternateMobile; + $tracking_array["Address"]=$row->Address; + $tracking_array["ReferredBy"]=$row->ReferredBy; + $tracking_array["followupDetails"]=$this->getTrackingFollowup($row->TrackingID); + $tracking_array["collectTrackedID"]=$this->getStudentTrackedID($row->MobileNumber,$trackingID['CreatedBranch'],$trackingID['requestedDept'],$trackingID['UpdatedBy']); + + $result[]=$tracking_array; + + + } + $result_array['trackingDetails']=$result; + $result_array['statusDetails']=$this->getStatus($activityID); + $result_array['staffDetails']=$this->getStaff("1",$trackingID['CreatedBranch'],$trackingID['requestedDept'],$trackingID['UpdatedBy']); + + + $result_array['trackingDetails']=$result; + + } + else{ + $result_array['followupStatus']=false; + $result_array['trackingDetails']=""; + } + + + return $result_array; + + } + + /* + * get student tracked id + * @params mobile number + * created by kms + * */ + public function getStudentTrackedID($stuMobile=null,$branchId=null,$reqDept=null,$updatedBy=null) + { + $this->db->distinct(); + $this->db->select('LT.TrackingID,LT.LeadID,AV.ActivityID,AV.ActivityName,PLD.ListName'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->join(ACTIVITY.' as AV', 'AV.ActivityID = LT.ActivityStatus'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'PLD.ListCode = LT.StatusCode'); + $this->db->where('LD.MobileNumber',$stuMobile); + + if($branchId !='All' AND $reqDept != EMPLOYEE){ + $this->db->where('LT.CreatedBranch', $branchId); + + } + if ($reqDept == EMPLOYEE){ + + $this->db->where('LT.AssignedTo', $updatedBy); + $this->db->where('LT.CreatedBranch', $branchId); + + + } + + $this->db->order_by('LT.TrackingID','ASC'); + $studeTrackID = $this->db->get(); + return $studeTrackID->result(); + } + /* + * used to get dash board call track details + * created by kms + * */ + public function getDashboardTrackingDetails($serach=null) + { + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $todayFollowupDate=$now->format('d-m-Y'); + + $todayDateTime=$now->format('Y-m-d'); + + + + // $follouwpDetails=$this->todayFollowupDetails($todayFollowupDate,CLOSE,'1'); + $follouwpDetails=$this->todayFollowUp($todayFollowupDate,$serach); + if($follouwpDetails){ + $result_array['todayStatus']=true; + $result_array['todayFolloupDetails']=$follouwpDetails; + } + else{ + $result_array['todayStatus']=false; + $result_array['todayFolloupDetails']=""; + + } + // $follouwpPendingDetails=$this->todayFollowupDetails($todayFollowupDate,CLOSE,'2'); + $follouwpPendingDetails=$this->tillPendingTrackingDetails(CLOSE,$serach); + + if($follouwpPendingDetails){ + $result_array['todayPendingStatus']=true; + $result_array['PendingFolloupDetails']=$follouwpPendingDetails; + } + else{ + $result_array['todayPendingStatus']=false; + $result_array['PendingFolloupDetails']=""; + + } + // $todayLeadDetails=$this->todayFollowupDetails($todayDateTime,OPEN,'3'); + $todayLeadDetails=$this->todayCreatedLead($todayDateTime,$serach); + if($todayLeadDetails){ + $result_array['todayLeadStatus']=true; + $result_array['todayLeadDetails']=$todayLeadDetails; + } + else{ + $result_array['todayLeadStatus']=false; + $result_array['todayLeadDetails']=""; + + } + + return $result_array; + + } + + /* + * get dash board today followupdetails + * created by kms + * */ + public function todayFollowUp($todayDate,$search=null){ + $this->db->distinct(); + $this->db->select('LD.LeadName,LD.MobileNumber,LT.TrackingID,LT.LeadID,AV.ActivityID,AV.ActivityName,LTF.FollowupOn,LT.StatusCode,PLD1.ListName as statusListName'); + $this->db->from(LEAD_TRACKING_FOLLOWUP.' as LTF'); + $this->db->join(LEAD_TRACKING.' as LT','LT.TrackingID=LTF.TrackingID'); + $this->db->join(LEAD_DETAILS.' as LD', 'LT.LeadID = LD.LeadID'); + $this->db->join(LOGIN.' as LO', 'LO.ID = LT.AssignedTo'); + $this->db->join(STAFF.' as ST', 'ST.StaffID = LO.StaffID'); + $this->db->join(ACTIVITY.' as AV', 'AV.ActivityID = LT.ActivityStatus'); + $this->db->join(PICK_LIST_DETAILS.' as PLD1', 'PLD1.ListCode = LT.StatusCode'); + if($search['BranchID'] !='All' AND $search['requestedDept'] != EMPLOYEE){ + $this->db->where('LT.CreatedBranch', $search['BranchID']); + + } + if ($search['requestedDept'] == EMPLOYEE){ + + $this->db->where('LT.AssignedTo', $search['requestedBy']); + $this->db->where('LT.CreatedBranch', $search['BranchID']); + + } + $this->db->where('LTF.FollowupOn',$todayDate); + $trackDetails=$this->db->get(); + + if($trackDetails->result()){ + foreach ($trackDetails->result() as $row1) + { + + $tracking_array["LeadID"]=$row1->LeadID; + $tracking_array["LeadName"]=$row1->LeadName; + $tracking_array["MobileNumber"]=$row1->MobileNumber; + $tracking_array["TrackingID"]=$row1->TrackingID; + $tracking_array["FollowupOn"]=$row1->FollowupOn; + $tracking_array["StatusCode"]=$row1->StatusCode; + $tracking_array["statusName"]=$row1->statusListName; + $tracking_array["ActivityID"]=$row1->ActivityID; + $tracking_array["ActivityName"]=$row1->ActivityName; + $result[]=$tracking_array; + + } + $result_array['trackingDetails']=$result; + return $result_array; + } + else { + return false; + } + + } + /* + * get today lead details + * created by kms + * */ + public function todayCreatedLead($todayDate,$search=null){ + $this->db->distinct(); + $this->db->select('LD.LeadName,LD.MobileNumber,LT.TrackingID,LT.LeadID,AV.ActivityID,AV.ActivityName,LTF.FollowupOn,LT.StatusCode,PLD1.ListName as statusListName'); + $this->db->from(LEAD_TRACKING_FOLLOWUP.' as LTF'); + $this->db->join(LEAD_TRACKING.' as LT','LT.TrackingID=LTF.TrackingID'); + $this->db->join(LEAD_DETAILS.' as LD', 'LT.LeadID = LD.LeadID'); + $this->db->join(LOGIN.' as LO', 'LO.ID = LT.AssignedTo'); + $this->db->join(STAFF.' as ST', 'ST.StaffID = LO.StaffID'); + $this->db->join(ACTIVITY.' as AV', 'AV.ActivityID = LT.ActivityStatus'); + $this->db->join(PICK_LIST_DETAILS.' as PLD1', 'PLD1.ListCode = LT.StatusCode'); + $this->db->where('LTF.IsActive', '1'); + if($search['BranchID'] !='All' AND $search['requestedDept'] != EMPLOYEE){ + $this->db->where('LT.CreatedBranch', $search['BranchID']); + + } + if ($search['requestedDept'] == EMPLOYEE){ + + $this->db->where('LT.AssignedTo', $search['requestedBy']); + $this->db->where('LT.CreatedBranch', $search['BranchID']); + + } + $this->db->like('LD.CreatedOn', $todayDate, 'after'); + $trackDetails=$this->db->get(); + + if($trackDetails->result()){ + foreach ($trackDetails->result() as $row1) + { + + $tracking_array["LeadID"]=$row1->LeadID; + $tracking_array["LeadName"]=$row1->LeadName; + $tracking_array["MobileNumber"]=$row1->MobileNumber; + $tracking_array["TrackingID"]=$row1->TrackingID; + $tracking_array["FollowupOn"]=$row1->FollowupOn; + $tracking_array["StatusCode"]=$row1->StatusCode; + $tracking_array["statusName"]=$row1->statusListName; + $tracking_array["ActivityID"]=$row1->ActivityID; + $tracking_array["ActivityName"]=$row1->ActivityName; + $result[]=$tracking_array; + + } + $result_array['trackingDetails']=$result; + return $result_array; + } + else { + return false; + } + } + + /* + * get till pending tracking details + * created by kms + * */ + public function tillPendingTrackingDetails($status,$search=null){ + $this->db->distinct(); + $this->db->select('LD.LeadName,LD.MobileNumber,LT.TrackingID,LT.LeadID,AV.ActivityID,AV.ActivityName,LTF.FollowupOn,LT.StatusCode,PLD1.ListName as statusListName'); + $this->db->from(LEAD_TRACKING_FOLLOWUP.' as LTF'); + $this->db->join(LEAD_TRACKING.' as LT','LT.TrackingID=LTF.TrackingID'); + $this->db->join(LEAD_DETAILS.' as LD', 'LT.LeadID = LD.LeadID'); + $this->db->join(LOGIN.' as LO', 'LO.ID = LT.AssignedTo'); + $this->db->join(STAFF.' as ST', 'ST.StaffID = LO.StaffID'); + $this->db->join(ACTIVITY.' as AV', 'AV.ActivityID = LT.ActivityStatus'); + $this->db->join(PICK_LIST_DETAILS.' as PLD1', 'PLD1.ListCode = LT.StatusCode'); + $this->db->where('LTF.IsActive', '1'); + $this->db->where('PLD1.ListName !=', $status); + if($search['BranchID'] !='All' AND $search['requestedDept'] != EMPLOYEE){ + $this->db->where('LT.CreatedBranch', $search['BranchID']); + + } + if ($search['requestedDept'] == EMPLOYEE){ + + $this->db->where('LT.AssignedTo', $search['requestedBy']); + $this->db->where('LT.CreatedBranch', $search['BranchID']); + + } + $trackDetails=$this->db->get(); + + if($trackDetails->result()){ + foreach ($trackDetails->result() as $row1) + { + + $tracking_array["LeadID"]=$row1->LeadID; + $tracking_array["LeadName"]=$row1->LeadName; + $tracking_array["MobileNumber"]=$row1->MobileNumber; + $tracking_array["TrackingID"]=$row1->TrackingID; + $tracking_array["FollowupOn"]=$row1->FollowupOn; + $tracking_array["StatusCode"]=$row1->StatusCode; + $tracking_array["statusName"]=$row1->statusListName; + $tracking_array["ActivityID"]=$row1->ActivityID; + $tracking_array["ActivityName"]=$row1->ActivityName; + $result[]=$tracking_array; + + } + $result_array['trackingDetails']=$result; + return $result_array; + } + else { + return false; + } + } + + + /* + * get date wise followup details + * @params date and status and check status + * */ + public function todayFollowupDetails($todayDate=null,$status=null,$check=null) + { + $this->db->distinct(); + $this->db->select('LT.TrackingID'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->from(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->order_by('LT.TrackingID','ASC'); + /* if($check!='3'){ + $this->db->where('LT.StatusCode !=',$status); + } + else if($check=='2'){ + $this->db->where('LT.StatusCode !=',$status); + }*/ + if($check=='3'){ + $this->db->like('LD.CreatedOn', $todayDate, 'after'); + } + + $leadDetails=$this->db->get(); + if($leadDetails->result()){ + $result_array = array(); + foreach ($leadDetails->result() as $row){ + $this->db->select('LTF.TrackingID,LTF.InteractionId'); + $this->db->from(LEAD_TRACKING_FOLLOWUP.' as LTF'); + $this->db->where('LTF.TrackingID',$row->TrackingID); + $lastFollowpID=$this->db->get()->last_row(); + // get last followup details date wise + $this->db->distinct(); + $this->db->select('LD.LeadName,LD.MobileNumber,LT.TrackingID,LT.LeadID,AV.ActivityID,AV.ActivityName,LTF.FollowupOn,LT.StatusCode,PLD1.ListName as statusListName'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->join(LEAD_TRACKING_FOLLOWUP.' as LTF', 'LTF.TrackingID = LT.TrackingID'); + $this->db->join(ACTIVITY.' as AV', 'AV.ActivityID = LT.ActivityStatus'); + $this->db->join(PICK_LIST_DETAILS.' as PLD1', 'PLD1.ListCode = LT.StatusCode'); + $this->db->where('LTF.InteractionId',$lastFollowpID->InteractionId); + + // check today date based follwup details + if($check=='1'){ + $this->db->where('LTF.FollowupOn',$todayDate); + // $this->db->where('LT.StatusCode !=',$status); + } + // check today date based pending followp details + /* else if($check=='2'){ + // $this->db->where('LTF.FollowupOn >',$todayDate); + $this->db->where('LT.StatusCode !=',$status); + }*/ + else if($check=='3'){ + $this->db->like('LD.CreatedOn', $todayDate, 'after'); + } + $trackDetails=$this->db->get(); + + if($trackDetails->result()){ + foreach ($trackDetails->result() as $row1) + { + + $tracking_array["LeadID"]=$row1->LeadID; + $tracking_array["LeadName"]=$row1->LeadName; + $tracking_array["MobileNumber"]=$row1->MobileNumber; + $tracking_array["TrackingID"]=$row1->TrackingID; + $tracking_array["FollowupOn"]=$row1->FollowupOn; + $tracking_array["StatusCode"]=$row1->StatusCode; + $tracking_array["statusName"]=$row1->statusListName; + $tracking_array["ActivityID"]=$row1->ActivityID; + $tracking_array["ActivityName"]=$row1->ActivityName; + $result[]=$tracking_array; + + } + $result_array['trackingDetails']=$result; + } + + + } + + return $result_array; + + } + + else{ + return false; + } + + } + + + /* + * get all followup details + * created by kms + * */ + + public function getDashboardFollowupDetails($search=null) + { + $this->db->distinct(); + $this->db->select('LT.TrackingID'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->from(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->order_by('LT.TrackingID','ASC'); + $leadDetails=$this->db->get(); + if($leadDetails->result()){ + foreach ($leadDetails->result() as $row){ + $this->db->select('LTF.TrackingID,LTF.InteractionId'); + $this->db->from(LEAD_TRACKING_FOLLOWUP.' as LTF'); + $this->db->where('LTF.TrackingID',$row->TrackingID); + $lastFollowpID=$this->db->get()->last_row(); + // get last followup details date wise + $this->db->distinct(); + $this->db->select('DATE_FORMAT(LTF.CreatedOn, "%d-%m-%Y") AS CreatedOn,LD.LeadName,LD.MobileNumber,LT.TrackingID,LT.LeadID,AV.ActivityID,AV.ActivityName,LTF.FollowupOn,LT.StatusCode,PLD1.ListName as statusListName'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->join(LEAD_TRACKING_FOLLOWUP.' as LTF', 'LTF.TrackingID = LT.TrackingID'); + $this->db->join(ACTIVITY.' as AV', 'AV.ActivityID = LT.ActivityStatus'); + $this->db->join(PICK_LIST_DETAILS.' as PLD1', 'PLD1.ListCode = LT.StatusCode'); + $this->db->where('LTF.InteractionId',$lastFollowpID->InteractionId); + + $result[]=$this->db->get()->result(); + + } + $result_array['details']=$result; + $result_array['followupStatus']=true; + + return $result_array; + + } + + else{ + $result_array['details']=""; + $result_array['followupStatus']=false; + } + return $result_array; + + } + /* + * get recent lead details + * params: date + * created by kms + * */ + + public function getRecentleadDetails($search=null) + { + + $this->db->select('LD.LeadID,LD.LeadName,LD.MobileNumber,LD.IsNewEnquiry,LT.TrackingID,LT.ActivityStatus,LT.AssignedTo,LT.StatusCode,LT.University,LT.Course,LT.AlternateMobile,LT.Address,LT.Flag,ST.StaffID,ST.Firstname,PLD1.ListCode as statusListCode,PLD1.ListName as statusListName,AV.ActivityID,AV.ActivityName,DATE_FORMAT(LT.CreatedOn, "%d-%m-%Y") AS CreatedOn,DATE_FORMAT(LT.UpdatedOn, "%d-%m-%Y") AS UpdatedOn'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->join(LOGIN.' as LO', 'LO.ID = LT.AssignedTo'); + $this->db->join(STAFF.' as ST', 'ST.StaffID = LO.StaffID'); + $this->db->join(ACTIVITY.' as AV', 'AV.ActivityID = LT.ActivityStatus'); + $this->db->join(PICK_LIST_DETAILS.' as PLD1', 'PLD1.ListCode = LT.StatusCode'); + if($search['loadDate'] !='' ) { + $this->db->like('LD.CreatedOn', $search['loadDate'], 'after'); + } + if($search['CreatedBranch'] !='All'){ + $this->db->where('LT.CreatedBranch', $search['CreatedBranch']); + + } + $this->db->order_by('LT.TrackingID', 'DESC'); + $leadDet=$this->db->get(); + if($this->db->affected_rows()==0){ + $result_array['trackingStatus']=false; + $result_array['trackingDetails']=""; + } + else{ + if($leadDet){ + $result_array = array(); + $result_array['trackingStatus']=true; + + foreach ($leadDet->result() as $row) + { + + $tracking_array["LeadID"]=$row->LeadID; + $tracking_array["LeadName"]=$row->LeadName; + $tracking_array["MobileNumber"]=$row->MobileNumber; + $tracking_array["IsNewEnquiry"]=$row->IsNewEnquiry; + $tracking_array["TrackingID"]=$row->TrackingID; + $tracking_array["Flag"]=$row->Flag; + $tracking_array["ActivityStatus"]=$row->ActivityStatus; + $tracking_array["AssignedTo"]=$row->AssignedTo; + $tracking_array["Firstname"]=$row->Firstname; + $tracking_array["StatusCode"]=$row->StatusCode; + $tracking_array["statusName"]=$row->statusListName; + $tracking_array["UniversityName"]=$row->University; + $tracking_array["CourseName"]=$row->Course; + $tracking_array["ActivityID"]=$row->ActivityID; + $tracking_array["ActivityName"]=$row->ActivityName; + $tracking_array["AlternateMobile"]=$row->AlternateMobile; + $tracking_array["Address"]=$row->Address; + $tracking_array["CreatedOn"]=$row->CreatedOn; + $tracking_array["UpdatedOn"]=$row->UpdatedOn; + // $tracking_array["followupDetails"]=$this->getTrackingFollowup($row->TrackingID); + $followupDetails=$this->getTrackingFollowup($row->TrackingID); + + $tracking_array["followupDetails"]=$followupDetails[0]->FollowupOn; + $result[]=$tracking_array; + + + } + $result_array['trackingDetails']=$result; + // $result_array['statusDetails']=$this->getStatus(); + $result_array['trackingDetails']=$result; + + } + } + return $result_array; + + } + /* + * get recent track close details + * created by kms + * */ + public function getRecentCloseDetails($search=null) + { + $this->db->select('LD.LeadID,LD.LeadName,LD.MobileNumber,LD.IsNewEnquiry,LT.TrackingID,LT.ActivityStatus,LT.AssignedTo,LT.StatusCode,LT.University,LT.Course,LT.AlternateMobile,LT.Address,LT.Flag,ST.StaffID,ST.Firstname,PLD1.ListCode as statusListCode,PLD1.ListName as statusListName,AV.ActivityID,AV.ActivityName,DATE_FORMAT(LT.CreatedOn, "%d-%m-%Y") AS CreatedOn,DATE_FORMAT(LT.UpdatedOn, "%d-%m-%Y") AS UpdatedOn'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->join(LOGIN.' as LO', 'LO.ID = LT.AssignedTo'); + $this->db->join(STAFF.' as ST', 'ST.StaffID = LO.StaffID'); + $this->db->join(ACTIVITY.' as AV', 'AV.ActivityID = LT.ActivityStatus'); + $this->db->join(PICK_LIST_DETAILS.' as PLD1', 'PLD1.ListCode = LT.StatusCode'); + if($search['loadDate'] !='' ) { + $this->db->like('LT.UpdatedOn', $search['loadDate'], 'after'); + } + if($search['CreatedBranch'] !='All'){ + $this->db->where('LT.CreatedBranch', $search['CreatedBranch']); + + } + $this->db->like('PLD1.ListName', 'CLOSE', 'after'); + $this->db->order_by('LT.TrackingID', 'DESC'); + $leadDet=$this->db->get(); + if($this->db->affected_rows()==0){ + $result_array['trackingStatus']=false; + $result_array['trackingDetails']=""; + } + else{ + if($leadDet){ + $result_array = array(); + $result_array['trackingStatus']=true; + + foreach ($leadDet->result() as $row) + { + + $tracking_array["LeadID"]=$row->LeadID; + $tracking_array["LeadName"]=$row->LeadName; + $tracking_array["MobileNumber"]=$row->MobileNumber; + $tracking_array["IsNewEnquiry"]=$row->IsNewEnquiry; + $tracking_array["TrackingID"]=$row->TrackingID; + $tracking_array["Flag"]=$row->Flag; + $tracking_array["ActivityStatus"]=$row->ActivityStatus; + $tracking_array["AssignedTo"]=$row->AssignedTo; + $tracking_array["Firstname"]=$row->Firstname; + $tracking_array["StatusCode"]=$row->StatusCode; + $tracking_array["statusName"]=$row->statusListName; + $tracking_array["UniversityName"]=$row->University; + $tracking_array["CourseName"]=$row->Course; + $tracking_array["ActivityID"]=$row->ActivityID; + $tracking_array["ActivityName"]=$row->ActivityName; + $tracking_array["AlternateMobile"]=$row->AlternateMobile; + $tracking_array["Address"]=$row->Address; + $tracking_array["CreatedOn"]=$row->CreatedOn; + $tracking_array["UpdatedOn"]=$row->UpdatedOn; + // $tracking_array["followupDetails"]=$this->getTrackingFollowup($row->TrackingID); + $followupDetails=$this->getTrackingFollowup($row->TrackingID); + + $tracking_array["followupDetails"]=$followupDetails[0]->FollowupOn; + $result[]=$tracking_array; + + + } + $result_array['trackingDetails']=$result; + // $result_array['statusDetails']=$this->getStatus(); + $result_array['trackingDetails']=$result; + + } + } + return $result_array; + + } + /* + * get recent pending details + * created by kms + * */ + public function getRecentPendingDetails($search=null) + { + $this->db->select('LD.LeadID,LD.LeadName,LD.MobileNumber,LD.IsNewEnquiry,LT.TrackingID,LT.ActivityStatus,LT.AssignedTo,LT.StatusCode,LT.University,LT.Course,LT.AlternateMobile,LT.Address,LT.Flag,ST.StaffID,ST.Firstname,PLD1.ListCode as statusListCode,PLD1.ListName as statusListName,AV.ActivityID,AV.ActivityName,DATE_FORMAT(LT.CreatedOn, "%d-%m-%Y") AS CreatedOn,DATE_FORMAT(LT.UpdatedOn, "%d-%m-%Y") AS UpdatedOn'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->join(LOGIN.' as LO', 'LO.ID = LT.AssignedTo'); + $this->db->join(STAFF.' as ST', 'ST.StaffID = LO.StaffID'); + $this->db->join(ACTIVITY.' as AV', 'AV.ActivityID = LT.ActivityStatus'); + $this->db->join(PICK_LIST_DETAILS.' as PLD1', 'PLD1.ListCode = LT.StatusCode'); + if($search['loadDate'] !='' ){ + $this->db->like('LT.UpdatedOn', $search['loadDate'], 'after'); + + } + if($search['CreatedBranch'] !='All'){ + $this->db->where('LT.CreatedBranch', $search['CreatedBranch']); + + } + $this->db->where('PLD1.ListName !=', 'CLOSE'); + $this->db->order_by('LT.TrackingID', 'DESC'); + $leadDet=$this->db->get(); + if($this->db->affected_rows()==0){ + $result_array['trackingStatus']=false; + $result_array['trackingDetails']=""; + } + else{ + if($leadDet){ + $result_array = array(); + $result_array['trackingStatus']=true; + + foreach ($leadDet->result() as $row) + { + + $tracking_array["LeadID"]=$row->LeadID; + $tracking_array["LeadName"]=$row->LeadName; + $tracking_array["MobileNumber"]=$row->MobileNumber; + $tracking_array["IsNewEnquiry"]=$row->IsNewEnquiry; + $tracking_array["TrackingID"]=$row->TrackingID; + $tracking_array["Flag"]=$row->Flag; + $tracking_array["ActivityStatus"]=$row->ActivityStatus; + $tracking_array["AssignedTo"]=$row->AssignedTo; + $tracking_array["Firstname"]=$row->Firstname; + $tracking_array["StatusCode"]=$row->StatusCode; + $tracking_array["statusName"]=$row->statusListName; + $tracking_array["UniversityName"]=$row->University; + $tracking_array["CourseName"]=$row->Course; + $tracking_array["ActivityID"]=$row->ActivityID; + $tracking_array["ActivityName"]=$row->ActivityName; + $tracking_array["AlternateMobile"]=$row->AlternateMobile; + $tracking_array["Address"]=$row->Address; + $tracking_array["CreatedOn"]=$row->CreatedOn; + $tracking_array["UpdatedOn"]=$row->UpdatedOn; + // $tracking_array["followupDetails"]=$this->getTrackingFollowup($row->TrackingID); + $followupDetails=$this->getTrackingFollowup($row->TrackingID); + + $tracking_array["followupDetails"]=$followupDetails[0]->FollowupOn; + $result[]=$tracking_array; + + + } + $result_array['trackingDetails']=$result; + // $result_array['statusDetails']=$this->getStatus(); + $result_array['trackingDetails']=$result; + + } + } + return $result_array; + + } + /* + * update call track as important + * created by kms + * */ + public function updateFlagStatus($trackID=null,$flagStatus=null){ + $updateDetails['Flag']= $flagStatus; + $this->db->where('TrackingID',$trackID); + $this->db->update(LEAD_TRACKING, $updateDetails); + if($this->db->affected_rows() > '0') { + $result['updatedStatus']=true; + + } + else{ + $result['updatedStatus']=false; + + } + return $result; + + } + +} \ No newline at end of file diff --git a/api/application/models/Center_model.php b/api/application/models/Center_model.php new file mode 100644 index 0000000..02d085d --- /dev/null +++ b/api/application/models/Center_model.php @@ -0,0 +1,110 @@ +db->select('CenterCode'); + $this->db->where('CenterCode', $arrayDetails['CenterCode']); + if($this->db->get(CENTER)->first_row()){ + $result['centerStatus'] = false; + $result['message'] = "This center Code is already exist!"; + } else { + $this->db->insert(CENTER, $arrayDetails); + if ($this->db->affected_rows() == '1') { + + $result['centerStatus'] = true; + $result['message'] = "Successfully center details added"; + } else { + $result['centerStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + return $result; + + } + + + /* + * Get center details + * created by srk + */ + + + + public function getCenter() + { + $this->db->select('*'); + $this->db->order_by('CreatedOn','DESC'); + $centerDetails = $this->db->get(CENTER); + // print_r($centerDetails); + // die; + + if($centerDetails->result()){ + + $result['centerStatus'] = true; + $result['details'] = $centerDetails->result(); + } + else { + $result['centerStatus'] = false; + $result['message'] = "No records found!"; + } + + return $result; + + } + + /* + * update Center details + * created by Srk + */ + public function updateCenter($arrayDetails=null,$CenterID=null) + { + + $this->db->select('CenterCode'); + $this->db->where('CenterCode',$arrayDetails['CenterCode']); + //$this->db->where('SubjectCode !=', $arrayDetails['SubjectCode']); + $this->db->where('CenterCode !=',$arrayDetails['CenterCode']); + if($this->db->get(CENTER)->first_row()){ + $result['centerStatus']=false; + $result['message']= " This Center code already exist"; + } + else{ + $this->db->where('CenterID',$CenterID); + $updateStatus=$this->db->update(CENTER, $arrayDetails); + if($updateStatus){ + + $result['centerStatus'] = true; + $result['message'] = "Successfully Center details updated"; + } + + else { + $result['centerStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + + } + } + + + return $result; + + } + + + + +} \ No newline at end of file diff --git a/api/application/models/Certificate_model.php b/api/application/models/Certificate_model.php new file mode 100644 index 0000000..807e15c --- /dev/null +++ b/api/application/models/Certificate_model.php @@ -0,0 +1,107 @@ +db->select('CertificateName'); + $this->db->where('CertificateName', $arrayDetails['CertificateName']); + if($this->db->get(CERTIFICATION_MASTER)->first_row()){ + $result['certificateStatus'] = false; + $result['message'] = "Certificate name is already exist!"; + } else { + $this->db->insert(CERTIFICATION_MASTER, $arrayDetails); + if($this->db->affected_rows() == '1'){ + $result['certificateStatus'] = true; + $result['message'] = "Successfully Certificate name is added"; + } + else { + $result['certificateStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + } + + + + + + return $result; + + } + /* + * get Certificate details + * parama id + * created by Surendiran + * */ + public function getCertificate() + { + $this->db->select('CertificationID,CertificateName,CreatedOn,IsActive'); + $this->db->order_by('CertificationID','DESC'); + $certificateDetails = $this->db->get(CERTIFICATION_MASTER); + if($certificateDetails->result()){ + + $result['certificateStatus'] = true; + $result['details'] = $certificateDetails->result(); + } + else { + $result['certificateStatus'] = false; + $result['message'] = "No records found!"; + } + + return $result; + + } + + + /* + * update Certificate details + * created by Surendiran + * */ + + public function update($arrayDetails=null,$CertificationID=null) + { + $this->db->select('CertificateName'); + + $this->db->where('CertificateName', $arrayDetails['CertificateName']); + $this->db->where_not_in('CertificationID', $CertificationID); + if($this->db->get(CERTIFICATION_MASTER)->first_row()){ + $result['certificateStatus'] = false; + $result['message'] = "Certificate name is already exist!"; + } else { + $this->db->where('CertificationID',$CertificationID); + $this->db->update(CERTIFICATION_MASTER, $arrayDetails); + if($this->db->affected_rows() == '1'){ + $result['certificateStatus'] = true; + $result['message'] = "Successfully Certificate name is updated"; + } + else { + $result['certificateStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + } + + + + return $result; + + } + +} + + + diff --git a/api/application/models/Course_model.php b/api/application/models/Course_model.php new file mode 100644 index 0000000..3b91345 --- /dev/null +++ b/api/application/models/Course_model.php @@ -0,0 +1,373 @@ +db->select('CourseCode'); + $this->db->where('CourseCode', $arrayDetails['CourseCode']); + $this->db->where('UniversityID', $arrayDetails['UniversityID']); + if($this->db->get(COURSE)->first_row()){ + $result['courseStatus'] = false; + $result['message'] = "This course id is already exist in same university"; + } else { + $this->db->insert(COURSE, $arrayDetails); + if ($this->db->affected_rows() == '1') { + $insert_id = $this->db->insert_id(); + if($jsonSemFeesData){ + foreach($jsonSemFeesData as $row){ + + $insertFeesArray['CourseID'] =$insert_id; + $insertFeesArray['ProgramType'] =$row['program']; + $insertFeesArray['FeesType'] =$row['FeesType']; + $insertFeesArray['FeesAmount'] =$row['FeesAmount']; + $insertFeesArray['Sem_Year'] =$row['programName']; + $insertFeesArray['UpdatedOn'] =$arrayDetails['CreatedOn']; + $insertFeesArray['UpdatedBy'] =$arrayDetails['CreatedBy']; + $this->db->insert(COURSE_FEES, $insertFeesArray); + } + + if($subjectDetails){ + $this->insertCourseSubjects($arrayDetails,$insert_id,$subjectDetails); + } + + $result['courseStatus'] = true; + $result['message'] = "Successfully course details added"; + } + else{ + $this -> db -> where('CourseCode', $arrayDetails['CourseCode']); + $this -> db -> delete('COURSE'); + $result['courseStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + + } else { + $result['courseStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + return $result; + + } + + + /* + * get branch details + * parama id + * created by kms + * */ + + public function getCourse() + { + $this->db->select('CU.CourseID,CU.CourseCode,CU.CourseName,CU.FeesType,CU.Specilization1,CU.Specilization2,CU.PC,CU.DC,CU.TC,CU.MC,CU.OtherFees,CU.IsActive,US.UniversityID,US.UniversityName'); + $this->db->from(COURSE.' as CU'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = CU.UniversityID'); + $this->db->order_by('CU.CreatedOn','DESC'); + $courseDetails = $this->db->get(); + + if($courseDetails->result()){ + + $result['courseStatus'] = true; + + foreach ($courseDetails->result() as $row){ + $fetchData['CourseID']=$row->CourseID; + $fetchData['CourseCode']=$row->CourseCode; + $fetchData['CourseName']=$row->CourseName; + $fetchData['FeesType']=$row->FeesType; + $fetchData['Specilization1']=$row->Specilization1; + $fetchData['Specilization2']=$row->Specilization2; + $fetchData['PC']=$row->PC; + $fetchData['DC']=$row->DC; + $fetchData['TC']=$row->TC; + $fetchData['MC']=$row->MC; + $fetchData['OtherFees']=$row->OtherFees; + $fetchData['IsActive']=$row->IsActive; + $fetchData['UniversityID']=$row->UniversityID; + $fetchData['UniversityName']=$row->UniversityName; + $fetchData['feesStructures'] = $this->getCourseFeesDetails($row->CourseID); + $fetchData['existSubjects'] = $this->getExistCourseSubjectDetails($row->CourseID); + // print_r($fetchData);exit(); + $storeCourseArray[]=$fetchData; + } + $result['details'] = $storeCourseArray; + // print_r($storeCourseArray);exit(); + } + else { + $result['courseStatus'] = false; + $result['message'] = "No records found!"; + } + + // print_r($result);exit(); + return $result; + + } + + public function getCourseUnivFeesTypes() { + $result['universityDetails'] = $this->getUniversityDetails(); + $result['feesDetails'] = $this->getFeesDetails(); + $result['subjectetails'] = $this->getSubjectDetails(); + $result['courseStatus'] = true; + return $result; + } + + /* + * update course details + * created by kms + * */ + public function updateCourse($arrayDetails=null,$jsonData=null,$subjectDetails=null) + { + $this->db->select('CourseCode'); + $this->db->where('CourseCode', $arrayDetails['CourseCode']); + $this->db->where('UniversityID', $arrayDetails['UniversityID']); + $this->db->where('CourseID !=', $arrayDetails['CourseID']); + if($this->db->get(COURSE)->first_row()){ + $result['courseStatus'] = false; + $result['message'] = "This course id is already exist in same university"; + } + else{ + $this->db->where('CourseID',$arrayDetails['CourseID']); + $upateStatus=$this->db->update(COURSE, $arrayDetails); + if($upateStatus) { + + if ($jsonData) { + foreach ($jsonData as $row) { + $feesID = $row['ID']; + + $updateFeesArray['CourseID'] = $arrayDetails['CourseID']; + $updateFeesArray['FeesAmount'] = $row['FeesAmount']; + $updateFeesArray['Sem_Year'] = $row['programName']; + $updateFeesArray['UpdatedOn'] = $arrayDetails['UpdatedOn']; + $updateFeesArray['UpdatedBy'] = $arrayDetails['UpdatedBy']; + + $updateFeesArray['ProgramType'] =$row['program']; + $updateFeesArray['FeesType'] =$row['FeesType']; + if($feesID!='' OR $feesID!=null){ + $this->db->where('ID', $feesID); + $this->db->update(COURSE_FEES, $updateFeesArray); + } + else{ + $this->db->insert(COURSE_FEES, $updateFeesArray); + } + + } + // update course subject details + $this->updateCourseSubjcetDetails($subjectDetails); + + + $result['courseStatus'] = true; + $result['message'] = "Successfully course details updated"; + } + } + + else { + $result['courseStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + + } + } + + + + return $result; + + } + /* + * get university details + * created by kms + * */ + public function getUniversityDetails() + { + $this->db->select('UniversityID,UniversityName'); + $this->db->order_by('UniversityID','ASC'); + $this->db->where('IsActive','1'); + $universityDetails = $this->db->get(UNIVERSITY); + return $universityDetails->result(); + } + /* + * get fees details + * created by kms + * */ + public function getFeesDetails() + { + + $this->db->select('ListCode,ListName'); + $this->db->order_by('ListCode','ASC'); + $this->db->where('IsActive','1'); + $this->db->where('ListGroup','3'); + $feesDetails = $this->db->get(PICK_LIST_DETAILS); + + if($feesDetails){ + $result_fees = array(); + foreach ($feesDetails->result() as $row) + { + $list_array['ListCode'] = $row->ListCode; + $list_array['ListName'] = $row->ListName; + if($row->ListCode=='F001'){ + $list_array['programType']=$this->getFeesProgram('4'); + + } + else if($row->ListCode=='F002'){ + $list_array['programType']=$this->getFeesProgram('5'); + } + else{ + $list_array['programType']=""; + } + $result_fees[]=$list_array; + } + + } + else{ + $result_fees[]=""; + } + return $result_fees; + } + /* + * get fees type + * created by kms + * */ + public function getFeesProgram($programType=null) + { + $this->db->select('ListCode,ListName'); + $this->db->order_by('ListCode','ASC'); + $this->db->where('IsActive','1'); + $this->db->where('ListGroup',$programType); + $feesDetails = $this->db->get(PICK_LIST_DETAILS); + return $feesDetails->result(); + } + + /* + * get course fees details + * created by kms + * */ + + public function getCourseFeesDetails($courseID=null){ + + $this->db->select('ID,CourseID,ProgramType,FeesAmount,Sem_Year,PLD.ListName as programName'); + $this->db->order_by('ID','ASC'); + $this->db->where('CourseID',$courseID); + $this->db->from(COURSE_FEES.' as CF'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'PLD.ListCode = CF.ProgramType'); + $feesDetails = $this->db->get(); + return $feesDetails->result(); + } + + /* + * get subject details + * created by kms + * */ + public function getSubjectDetails(){ + $this->db->select('SubjectID,SubjectCode,SubjectName'); + $this->db->order_by('SubjectID','DESC'); + $this->db->where('IsActive','1'); + $subjectDetails = $this->db->get(SUBJECTMASTER); + return $subjectDetails->result(); + } + + /* + *Insert course sujects + * created by kms + * */ + public function insertCourseSubjects($details=null,$courseID=null,$subjects=null){ + $insertSubject['UniversityID'] = $details['UniversityID']; + $insertSubject['CourseID'] = $courseID; + if ($subjects){ + foreach ($subjects as $row){ + $insertSubject['SubjectID'] = $row['SubjectID']; + $insertSubject['IsActive'] = true; + $insertSubject['CreatedBy'] = $details['CreatedBy']; + $insertSubject['CreatedOn'] = $details['CreatedOn']; + $this->db->insert(COURSESUBJECT, $insertSubject); + + } + } + return true; + } + + /* + * get exist Course subject details + * created by kms + * */ + public function getExistCourseSubjectDetails($courseID=null){ + $this->db->select('CSU.SubjectID,SM.SubjectCode,SM.SubjectName'); + $this->db->order_by('CSID','ASC'); + $this->db->where('CSU.CourseID',$courseID); + $this->db->where('CSU.IsActive','1'); + // $this->db->where('SM.IsActive','1'); + $this->db->from(COURSESUBJECT.' as CSU'); + $this->db->join(SUBJECTMASTER.' as SM', 'SM.SubjectID = CSU.SubjectID'); + $subDetails = $this->db->get(); + return $subDetails->result(); + } + + /* + * update course subject details + * created by kms + * */ + public function updateCourseSubjcetDetails($sujects=null){ + $deactiveStatus['IsActive']=false; + $deactiveStatus['UpdatedBy']=$sujects['UpdatedBy']; + $deactiveStatus['UpdatedOn']=$sujects['UpdatedOn']; + $this->db->where('CourseID ',$sujects['CourseID']); + $this->db->where('UniversityID ',$sujects['UniversityID']); + $updateCourseSubjectDeactive = $this->db->update(COURSESUBJECT, $deactiveStatus); + + if($updateCourseSubjectDeactive){ + + if($sujects['Subjects']){ + + foreach ($sujects['Subjects'] as $srow){ + $this->db->select('CSID'); + $this->db->where('CourseID',$sujects['CourseID']); + $this->db->where('UniversityID',$sujects['UniversityID']); + $this->db->where('SubjectID',$srow); + if($this->db->get(COURSESUBJECT)->first_row()){ + $existStatusUpdate['IsActive']=true; + $existStatusUpdate['UpdatedBy']=$sujects['UpdatedBy']; + $existStatusUpdate['UpdatedOn']=$sujects['UpdatedOn']; + $this->db->where('CourseID',$sujects['CourseID']); + $this->db->where('UniversityID',$sujects['UniversityID']); + $this->db->where('SubjectID',$srow); + $this->db->update(COURSESUBJECT, $existStatusUpdate); + } + else{ + $update_array["UniversityID"]=$sujects['UniversityID']; + $update_array["CourseID"]=$sujects['CourseID']; + $update_array["SubjectID"]=$srow; + + $update_array["IsActive"]=true; + $update_array["CreatedBy"]=$sujects['UpdatedBy']; + $update_array["CreatedOn"]=$sujects['UpdatedOn']; + $this->db->insert(COURSESUBJECT, $update_array); + + } + + } + } + /* else{ + $activateStatus['IsActive']=true; + $this->db->where('CourseID ',$sujects['CourseID']); + $this->db->where('UniversityID ',$sujects['UniversityID']); + $this->db->update(COURSESUBJECT, $activateStatus); + + }*/ + + } + + return true; + } + +} \ No newline at end of file diff --git a/api/application/models/Dashboard_model.php b/api/application/models/Dashboard_model.php new file mode 100644 index 0000000..94b5af7 --- /dev/null +++ b/api/application/models/Dashboard_model.php @@ -0,0 +1,74 @@ +db->query($sql1); + $sql2 = "SELECT * from ".STAFF.""; + $count2 = $this->db->query($sql2); + + if( $count2->num_rows() > 0) { + $result['status'] = true; + $result['total_student'] = $count1->num_rows(); + $result['total_staff'] = $count2->num_rows(); + $result['message'] = "Total Number of Users"; + } else { + $result['status'] = true; + $result['total_student'] = $count1->num_rows(); + $result['total_staff'] = $count2->num_rows(); + $result['message'] = "No student Users"; + } + return $result; + } + + // get total number of students + public function get_total_students($data) { + // print_r($data);exit(); + $sql = "SELECT * from ".STUDENTS.""; + $count = $this->db->query($sql); + if( $count->num_rows() > 0) { + $result['status'] = true; + $result['total_student'] = $count->num_rows(); + $result['message'] = "Total Number of Students"; + } else { + $result['status'] = true; + $result['total_student'] = $count->num_rows(); + $result['message'] = "No student exist"; + } + return $result; + } + + // get total number of employees + public function get_total_employee($data) { + // print_r($data);exit(); + $sql = "SELECT * from ".STAFF.""; + $count = $this->db->query($sql); + if( $count->num_rows() > 0) { + $result['status'] = true; + $result['total_employee'] = $count->num_rows(); + $result['message'] = "Total Number of Employee"; + } else { + $result['status'] = true; + $result['total_employee'] = $count->num_rows(); + $result['message'] = "No Employee exist"; + } + return $result; + } + + +} \ No newline at end of file diff --git a/api/application/models/DayBook_model.php b/api/application/models/DayBook_model.php new file mode 100644 index 0000000..ed51135 --- /dev/null +++ b/api/application/models/DayBook_model.php @@ -0,0 +1,568 @@ +db->select('t1.ListCode, t1.ListName'); + $this->db->from(''.PICK_LIST_DETAILS. ' as t1'); + $this->db->where('t1.ListGroup', 10); + // $this->db->join('' . COURSE . ' as t2', 't2.UniversityID = t1.UniversityID', 'LEFT'); + $typeDetails = $this->db->get(); + $typeStateDetails = $typeDetails->result(); + // TypeName details + $this->db->select('t2.TypeName, t2.TypeID, t2.ID'); + $this->db->from(''.INCOMEOUTCOMEMASTER. ' as t2'); + $this->db->where('t2.IsActive', 1); + + $typeNaDetails = $this->db->get(); + $typeNameDetails = $typeNaDetails->result(); + + $results['typeNameStatus'] = true; + $results['typeList'] = $typeStateDetails; + $results['typeNameList'] = $typeNameDetails; + return $results; + } + + + public function emp_day_book_AccessChk($arr) { + $id = $arr['localUserID']; + $sql1 = "SELECT t1.FinanceModuleAccess FROM ".STAFF." as t1 LEFT JOIN ".LOGIN." as t2 ON t2.StaffID = t1.StaffID WHERE t2.id = $id"; + // update branch to staff_branch table + $dayBookAccDetails = $this->db->query($sql1); + $dayBkAcesDetail = $dayBookAccDetails->result(); + $result['dayBkAccessChkStatus'] = true; + $result['dayBkAccessChk_Value'] = $dayBkAcesDetail[0]->FinanceModuleAccess; + // echo $result['dayBkAccessChk_Value'];exit(); + return $result; + } + + // get the daybook details list + public function get_Daybook_Details_List($reqData, $reqDataBy) { + + if($reqData['date'] != '' && $reqData['dateTo'] != '') { + // $this->db->select('t1.*, t2.ListName, t3.TypeName'); + // $this->db->from(''.DAYBOOKMASTER. ' as t1'); + // $this->db->join('' . PICK_LIST_DETAILS . ' as t2', 't2.ListCode = t1.Name', 'LEFT'); + // $this->db->join('' . INCOMEOUTCOMEMASTER . ' as t3', 't3.ID = t1.Type', 'LEFT'); + + $d = new DateTime($reqData['date']); + $dTo = new DateTime($reqData['dateTo']); + $fromDate = $d->format('Y-m-d'); + $toDate = $dTo->format('Y-m-d'); + $reqpayType = $reqDataBy['localBranchID']; + + $querys = "SELECT t1.ID as ORDER_ID, t1.*, t2.ListName, t3.TypeName , t5.Firstname as Approved_by_name FROM ".DAYBOOKMASTER." as t1 LEFT JOIN ".PICK_LIST_DETAILS." as t2 ON t2.ListCode = t1.Name LEFT JOIN ".INCOMEOUTCOMEMASTER." as t3 ON t3.ID = t1.Type + LEFT JOIN ".LOGIN." as t4 ON t4.ID = t1.Approval_By LEFT JOIN ".STAFF." as t5 ON t5.StaffID = t4.StaffID + WHERE STR_TO_DATE(t1.Date, '%d-%m-%Y') BETWEEN '$fromDate' + AND '$toDate' AND t1.BranchCode = '$reqpayType' ORDER BY ORDER_ID DESC"; +// echo $querys;exit(); + // $this->db->where(' STR_TO_DATE(t1.Date, %d-%m-%Y) >=', $fromDate); + // $this->db->where(' STR_TO_DATE(t1.Date, %d-%m-%Y) >=', $toDate); + // $this->db->where('t1.Date', $reqData['date']); + // $this->db->order_by('CreatedOn', 'DESC'); + // $this->db->where('t1.BranchCode', $reqDataBy['localBranchID']); + + } else { + // $this->db->select('t1.*, t2.ListName, t3.TypeName'); + // $this->db->from(''.DAYBOOKMASTER. ' as t1'); + // $this->db->join('' . PICK_LIST_DETAILS . ' as t2', 't2.ListCode = t1.Name', 'LEFT'); + // $this->db->join('' . INCOMEOUTCOMEMASTER . ' as t3', 't3.ID = t1.Type', 'LEFT'); + // // $this->db->where('t1.Date', $reqData['date']); + // $this->db->order_by('CreatedOn', 'DESC'); + // $this->db->where('t1.BranchCode', $reqDataBy['localBranchID']); + $reqpayType = $reqDataBy['localBranchID']; + $querys = "SELECT t1.ID as ORDER_ID, t1.*, t2.ListName, t3.TypeName, t5.Firstname as Approved_by_name FROM ".DAYBOOKMASTER." as t1 LEFT JOIN ".PICK_LIST_DETAILS." as t2 ON t2.ListCode = t1.Name LEFT JOIN ".INCOMEOUTCOMEMASTER." as t3 ON t3.ID = t1.Type + LEFT JOIN ".LOGIN." as t4 ON t4.ID = t1.Approval_By LEFT JOIN ".STAFF." as t5 ON t5.StaffID = t4.StaffID + WHERE t1.BranchCode = '$reqpayType' ORDER BY ORDER_ID DESC"; + + } + + // $this->db->join('' . COURSE . ' as t2', 't2.UniversityID = t1.UniversityID', 'LEFT'); + $dayBookDetails = $this->db->query($querys); + $dayBookDetailsList = $dayBookDetails->result(); + $results['dayBookListStatus'] = true; + $results['dayBookListDetails'] = $dayBookDetailsList; + return $results; + } + + public function get_Daybook_Approval_Details_List($reqData, $reqDataBy) { + if($reqData['date'] != '' && $reqData['dateTo'] != '') { + $d = new DateTime($reqData['date']); + $dTo = new DateTime($reqData['dateTo']); + $fromDate = $d->format('Y-m-d'); + $toDate = $dTo->format('Y-m-d'); + $reqpayType = $reqDataBy['localBranchID']; + + $querys = "SELECT t1.ID as ORDER_ID, t1.*, t2.ListName, t3.TypeName , t5.Firstname as Approved_by_name FROM ".DAYBOOKMASTER." as t1 LEFT JOIN ".PICK_LIST_DETAILS." as t2 ON t2.ListCode = t1.Name LEFT JOIN ".INCOMEOUTCOMEMASTER." as t3 ON t3.ID = t1.Type + LEFT JOIN ".LOGIN." as t4 ON t4.ID = t1.Approval_By LEFT JOIN ".STAFF." as t5 ON t5.StaffID = t4.StaffID + WHERE STR_TO_DATE(t1.Date, '%d-%m-%Y') BETWEEN '$fromDate' + AND '$toDate' AND t1.BranchCode = '$reqpayType' AND t1.Status NOT IN ('Approved', 'Cancel') ORDER BY ORDER_ID DESC"; + } + else { $reqpayType = $reqDataBy['localBranchID']; + $querys = "SELECT t1.ID as ORDER_ID, t1.*, t2.ListName, t3.TypeName, t5.Firstname as Approved_by_name FROM ".DAYBOOKMASTER." as t1 LEFT JOIN ".PICK_LIST_DETAILS." as t2 ON t2.ListCode = t1.Name LEFT JOIN ".INCOMEOUTCOMEMASTER." as t3 ON t3.ID = t1.Type + LEFT JOIN ".LOGIN." as t4 ON t4.ID = t1.Approval_By LEFT JOIN ".STAFF." as t5 ON t5.StaffID = t4.StaffID + WHERE t1.BranchCode = '$reqpayType' AND t1.Status NOT IN ('Approved', 'Cancel') ORDER BY ORDER_ID DESC"; + + } + $dayBookDetails = $this->db->query($querys); + $dayBookDetailsList = $dayBookDetails->result(); + $results['dayBookListStatus'] = true; + $results['dayBookListDetails'] = $dayBookDetailsList; + return $results; + } + + // delete the daybook details + public function delete_dayBookDetails($id) { + // echo $id;exit(); + + $mysql = "SELECT * FROM ".DAYBOOKMASTER." WHERE ID = '$id'"; + $deleteDetails = $this->db->query($mysql); + $deleteDataDetails = $deleteDetails->result(); + $branch = $deleteDataDetails[0]->BranchCode; + + $sql = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND ID < '$id') + ORDER BY ID DESC + LIMIT 1 "; + + $currBalance = 0; + $latestUpdate = $this->db->query($sql); + $latestUpdateDetails = $latestUpdate->result(); + $currBalance = $latestUpdateDetails[0]->Balance; + $currID = $latestUpdateDetails[0]->ID; + + // $sql1 = " DELETE FROM ".DAYBOOKMASTER." WHERE ID ='$id'"; + $sql1 = "UPDATE ".DAYBOOKMASTER." SET Status ='Cancel' WHERE ID ='$id'"; + + // update branch to staff_branch table + if ($this->db->query($sql1) == '1') { + + $sql2 = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND ID > '$currID') + ORDER BY ID ASC"; + $latestUpdate2 = $this->db->query($sql2); + $latestUpdateDetails2 = $latestUpdate2->result(); + + foreach( $latestUpdateDetails2 as $clip){ + if($clip->Name == 'I002' && ($clip->Status == "Pending" || $clip->Status == "Approved" || $clip->Status == "approved" || $clip->Status == "pending")) { + //Income + $currBalance = $currBalance + $clip->Amount; + }else if ($clip->Name == 'I001' && ($clip->Status == "Pending" || $clip->Status == "Approved" || $clip->Status == "approved" || $clip->Status == "pending")) { + //Expense + $currBalance = $currBalance - $clip->Amount; + } else { + } + $updateSql = "UPDATE ".DAYBOOKMASTER." SET Balance ='$currBalance' WHERE ID = '$clip->ID'"; + $this->db->query($updateSql); + } + + $result['deletedStatus'] = true; + $result['message'] = "Entry is Deleted"; + + } else { + $result['deletedStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + // print_r($latestUpdateDetails);exit(); + return $result; + } + + // delete the daybook fees entry details + public function delete_dayBookFeePayableDetails($id) { + $this->db->select('FeesPaymentID, BranchCode'); + $this->db->from(DAYBOOKMASTER); + $this->db->where('ID', $id); + $typeDetails = $this->db->get(); + $typeStateDetails = $typeDetails->result(); + $getID = $typeStateDetails[0]->FeesPaymentID; + $branch = $typeStateDetails[0]->BranchCode; + // echo $id;exit(); + try { + $sql1 = " DELETE FROM ".STUDENTS_FEES_PAID." WHERE ID ='$getID'"; + $this->db->query($sql1); + } catch(Exception $e) { + echo 'error'; + } finally { + $sql = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND ID < '$id') + ORDER BY ID DESC + LIMIT 1 "; + + $currBalance = 0; + $currID = $id; + $latestUpdate = $this->db->query($sql); + $latestUpdateDetails = $latestUpdate->result(); + If(is_array($latestUpdateDetails) && count($latestUpdateDetails)>0) + { + $currBalance = $latestUpdateDetails[0]->Balance; + $currID = $latestUpdateDetails[0]->ID; + }else{ + } + // $sql1 = " DELETE FROM ".DAYBOOKMASTER." WHERE FeesPaymentID ='$getID'"; + // $sql1 = " DELETE FROM ".DAYBOOKMASTER." WHERE FeesPaymentID ='$getID'"; + $sql1 = "UPDATE ".DAYBOOKMASTER." SET Status ='Cancel' WHERE FeesPaymentID ='$getID'"; + + // update branch to staff_branch table + if ($this->db->query($sql1) == '1') { + + $sql2 = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND ID > '$currID') + ORDER BY ID ASC"; + $latestUpdate2 = $this->db->query($sql2); + $latestUpdateDetails2 = $latestUpdate2->result(); + + foreach( $latestUpdateDetails2 as $clip){ + if($clip->Name == 'I002' && ($clip->Status == "Pending" || $clip->Status == "Approved" || $clip->Status == "approved" || $clip->Status == "pending")) { + //Income + $currBalance = $currBalance + $clip->Amount; + }else if ($clip->Name == 'I001' && ($clip->Status == "Pending" || $clip->Status == "Approved" || $clip->Status == "approved" || $clip->Status == "pending")) { + //Expense + $currBalance = $currBalance - $clip->Amount; + } else { + } + $updateSql = "UPDATE ".DAYBOOKMASTER." SET Balance ='$currBalance' WHERE ID = '$clip->ID'"; + $this->db->query($updateSql); + } + + $result['deletedStatus'] = true; + $result['message'] = "Entry is Deleted"; + } else { + $result['deletedStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + return $result; + } + + // update existing daybook details + public function update_dayBookDetails($Arr, $upFor) { + + $branch = $Arr['BranchCode']; + $sql = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND ID < '$upFor') + ORDER BY ID DESC + LIMIT 1 "; + $prevBalance = 0; + $latestUpdate = $this->db->query($sql); + $latestUpdateDetails = $latestUpdate->result(); + If(is_array($latestUpdateDetails) && count($latestUpdateDetails)>0) + { + $prevBalance = $latestUpdateDetails[0]->Balance; + }else{ + } + + if($Arr['Name'] == 'I002') { + //Income + $Arr['Balance'] = $prevBalance + $Arr['Amount']; + }else if ($Arr['Name'] == 'I001') { + //Expense + $Arr['Balance'] = $prevBalance - $Arr['Amount']; + } else { + $Arr['Balance'] = 0; + } + + $this->db->where('ID', $upFor); + $this->db->update(DAYBOOKMASTER, $Arr); + if ($this->db->affected_rows() == '1') { + + $currBalance = 0; + $sql1 = "SELECT * FROM ".DAYBOOKMASTER." WHERE BranchCode = '$branch' AND ID = '$upFor'"; + $latestUpdate1 = $this->db->query($sql1); + $latestUpdateDetails1 = $latestUpdate1->result(); + $currBalance = $latestUpdateDetails1[0]->Balance; + + $sql2 = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND ID > '$upFor') + ORDER BY ID ASC"; + $latestUpdate2 = $this->db->query($sql2); + $latestUpdateDetails2 = $latestUpdate2->result(); + + foreach( $latestUpdateDetails2 as $clip){ + if($clip->Name == 'I002' && ($clip->Status == "Pending" || $clip->Status == "Approved" || $clip->Status == "approved" || $clip->Status == "pending")) { + //Income + $currBalance = $currBalance + $clip->Amount; + }else if ($clip->Name == 'I001' && ($clip->Status == "Pending" || $clip->Status == "Approved" || $clip->Status == "approved" || $clip->Status == "pending")) { + //Expense + $currBalance = $currBalance - $clip->Amount; + } else { + } + $updateSql = "UPDATE ".DAYBOOKMASTER." SET Balance ='$currBalance' WHERE ID = '$clip->ID'"; + $this->db->query($updateSql); + } + $result['updateDetailsStatus'] = true; + $result['message'] = "Successfully Details Updated"; + } else { + $result['updateDetailsStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + return $result; + } + + // add dayBook + public function add_dayBook($Arr) + { + $voucherNo = $Arr['VoucherNumber']; + $sqlCheck = "SELECT * FROM ".DAYBOOKMASTER." WHERE VoucherNumber = '$voucherNo'"; + // print_r($this->db->query($sqlCheck));exit(); + $checkAdd = $this->db->query($sqlCheck); + $checkAddDetails = $checkAdd->result(); + if(count( $checkAddDetails ) > 0){ + $result['addDayBookStatus'] = false; + $result['message'] = "This Voucher Number Already Exist."; + }else{ + $branch = $Arr['BranchCode']; + $sql = "SELECT * FROM ".DAYBOOKMASTER." WHERE BranchCode = '$branch' + ORDER BY ID DESC + LIMIT 1"; + $prevBalance = 0; + $latestUpdate = $this->db->query($sql); + $latestUpdateDetails = $latestUpdate->result(); + + If(is_array($latestUpdateDetails) && count($latestUpdateDetails)>0) + { + $prevBalance = $latestUpdateDetails[0]->Balance; + }else{ + } + + if($Arr['Name'] == 'I002') { + //Income + $Arr['Balance'] = $prevBalance + $Arr['Amount']; + }else if ($Arr['Name'] == 'I001') { + //Expense + $Arr['Balance'] = $prevBalance - $Arr['Amount']; + } else { + $Arr['Balance'] = 0; + } + + $this->db->insert(DAYBOOKMASTER, $Arr); + if ($this->db->affected_rows() == '1') { + $result['addDayBookStatus'] = true; + $result['message'] = "Successfully DayBook Details Added"; + } else { + $result['addDayBookStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } +} + + return $result; + } + + // approve/reject status updation for the daybook expense details + public function update_status_admin($arr) { + + $Approval_By = $arr[0]['Approval_By']; + $Approval_Comments = $arr[0]['Approval_Comments']; + $UpdatedBy = $arr[0]['UpdatedBy']; + $UpdatedOn = $arr[0]['UpdatedOn']; + $status = $arr[0]['Status']; + // $number = array(); + // foreach($arr as $ar){ + // array_push($number, $ar['ID']); + // } + // $updateFor = implode(',', $number); + $updateFor = $arr[0]['ID']; + if( $status == "Pending" || $status == "Approved" || $status == "approved" || $status == "pending"){ + + $mysql = "SELECT * FROM ".DAYBOOKMASTER." WHERE ID = '$updateFor'"; + $updateDetails = $this->db->query($mysql); + $updateDataDetails = $updateDetails->result(); + $branch = $updateDataDetails[0]->BranchCode; + $Amount = 0; + $Amount = $updateDataDetails[0]->Amount; + + $sql = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND ID < '$updateFor') + ORDER BY ID DESC + LIMIT 1 "; + + $currBalance = 0; + $latestUpdate = $this->db->query($sql); + $latestUpdateDetails = $latestUpdate->result(); + if($updateDataDetails[0]->Name == 'I002' ) { + //Income + $currBalance = $latestUpdateDetails[0]->Balance + $Amount; + }else if ($updateDataDetails[0]->Name == 'I001') { + //Expense + $currBalance = $latestUpdateDetails[0]->Balance - $Amount; + } else { + } + // $currBalance = $latestUpdateDetails[0]->Balance + $Amount; + + $sql = "UPDATE ".DAYBOOKMASTER." + SET Status = '$status', Approval_By = '$Approval_By' , + Approval_Comments = '$Approval_Comments', UpdatedBy = '$UpdatedBy' , UpdatedOn = '$UpdatedOn' , Balance = '$currBalance' + WHERE id = '$updateFor' "; + $mBranchDetails = $this->db->query($sql); + // echo $mBranchDetails; + // echo $this->db->affected_rows(); exit(); + if ($this->db->affected_rows() >= 1) { + $sql2 = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND ID > '$updateFor') + ORDER BY ID ASC"; + $latestUpdate2 = $this->db->query($sql2); + $latestUpdateDetails2 = $latestUpdate2->result(); + foreach( $latestUpdateDetails2 as $clip){ + if($clip->Name == 'I002' && ($clip->Status == "Pending" || $clip->Status == "Approved" || $clip->Status == "approved" || $clip->Status == "pending")) { + //Income + $currBalance = $currBalance + $clip->Amount; + }else if ($clip->Name == 'I001' && ($clip->Status == "Pending" || $clip->Status == "Approved" || $clip->Status == "approved" || $clip->Status == "pending")) { + //Expense + $currBalance = $currBalance - $clip->Amount; + } else { + } + $updateSql = "UPDATE ".DAYBOOKMASTER." SET Balance ='$currBalance' WHERE ID = '$clip->ID'"; + $this->db->query($updateSql); + } + $result['addStatus'] = true; + $result['message'] = "Successfully Details Updated"; + } else { + $result['addStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } else if( $status == "Rejected" || $status == "rejected" ) { + $mysql = "SELECT * FROM ".DAYBOOKMASTER." WHERE ID = '$updateFor'"; + $updateDetails = $this->db->query($mysql); + $updateDataDetails = $updateDetails->result(); + $branch = $updateDataDetails[0]->BranchCode; + $Amount = 0; + $Amount = $updateDataDetails[0]->Amount; + if($updateDataDetails[0]->PaymentStatus === '1' || $updateDataDetails[0]->PaymentStatus === '0'){ + + + $sql = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND ID < '$updateFor') + ORDER BY ID DESC + LIMIT 1 "; + + $currBalance = 0; + $latestUpdate = $this->db->query($sql); + $latestUpdateDetails = $latestUpdate->result(); + $currBalance = $latestUpdateDetails[0]->Balance; + + $sql = "UPDATE ".DAYBOOKMASTER." + SET Status = '$status', Approval_By = '$Approval_By' , + Approval_Comments = '$Approval_Comments', UpdatedBy = '$UpdatedBy' , UpdatedOn = '$UpdatedOn' , Balance = '$currBalance' + WHERE id = '$updateFor' "; + $mBranchDetails = $this->db->query($sql); + // echo $mBranchDetails; + // echo $this->db->affected_rows(); exit(); + if ($this->db->affected_rows() >= 1) { + $sql2 = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND ID > '$updateFor') + ORDER BY ID ASC"; + $latestUpdate2 = $this->db->query($sql2); + $latestUpdateDetails2 = $latestUpdate2->result(); + foreach( $latestUpdateDetails2 as $clip){ + if($clip->Name == 'I002' && ($clip->Status == "Pending" || $clip->Status == "Approved" || $clip->Status == "approved" || $clip->Status == "pending")) { + //Income + $currBalance = $currBalance + $clip->Amount; + }else if ($clip->Name == 'I001' && ($clip->Status == "Pending" || $clip->Status == "Approved" || $clip->Status == "approved" || $clip->Status == "pending")) { + //Expense + $currBalance = $currBalance - $clip->Amount; + } else { + } + $updateSql = "UPDATE ".DAYBOOKMASTER." SET Balance ='$currBalance' WHERE ID = '$clip->ID'"; + $this->db->query($updateSql); + } + $result['addStatus'] = true; + $result['message'] = "Successfully Details Updated"; + } else { + $result['addStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + // else if($updateDataDetails[0]->PaymentStatus === '0') { + // $currentVoucheNumber = $updateDataDetails[0]->VoucherNumber; + // $mySql = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND VoucherNumber = '$currentVoucheNumber') + // ORDER BY ID ASC + // LIMIT 1 "; + // $mySqlUpdate = $this->db->query($mySql); + // $mySqlUpdateDetails = $mySqlUpdate->result(); + // $mySqlUpdateDetailsID = $mySqlUpdateDetails[0]->ID; + + // $sql = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND ID < '$mySqlUpdateDetailsID') + // ORDER BY ID DESC + // LIMIT 1 "; + // $currBalance = 0; + // $latestUpdate = $this->db->query($sql); + // $latestUpdateDetails = $latestUpdate->result(); + // If(is_array($latestUpdateDetails) && count($latestUpdateDetails)>0) + // { + // $currBalance = $latestUpdateDetails[0]->Balance; + // }else{ + // } + // $sql = "UPDATE ".DAYBOOKMASTER." + // SET Status = '$status', Approval_By = '$Approval_By' , + // Approval_Comments = '$Approval_Comments', UpdatedBy = '$UpdatedBy' , UpdatedOn = '$UpdatedOn' , Balance = '$currBalance' + // WHERE VoucherNumber = '$currentVoucheNumber' "; + // $mBranchDetails = $this->db->query($sql); + // if ($this->db->affected_rows() >= 1) { + // $sql2 = "SELECT * FROM ".DAYBOOKMASTER." WHERE (BranchCode = '$branch' AND ID > '$updateFor') + // ORDER BY ID ASC"; + // $latestUpdate2 = $this->db->query($sql2); + // $latestUpdateDetails2 = $latestUpdate2->result(); + // foreach( $latestUpdateDetails2 as $clip){ + // if($clip->Name == 'I002' && ($clip->Status == "Pending" || $clip->Status == "Approved" || $clip->Status == "approved" || $clip->Status == "pending")) { + // //Income + // $currBalance = $currBalance + $clip->Amount; + // }else if ($clip->Name == 'I001' && ($clip->Status == "Pending" || $clip->Status == "Approved" || $clip->Status == "approved" || $clip->Status == "pending")) { + // //Expense + // $currBalance = $currBalance - $clip->Amount; + // } else { + // } + // $updateSql = "UPDATE ".DAYBOOKMASTER." SET Balance ='$currBalance' WHERE ID = '$clip->ID'"; + // $this->db->query($updateSql); + // } + // $result['addStatus'] = true; + // $result['message'] = "Successfully Details Updated"; + // } else { + // $result['addStatus'] = false; + // $result['message'] = "Something went wrong.please try again"; + // } + + // } + } + return $result; + } + + // daybook full details for super admin view + public function get_Daybook_Details_List_superAdmin($reqData, $reqDataBy){ + + if($reqData['date'] != '' && $reqData['dateTo'] != '') { + $this->db->select('t1.*, t2.ListName, t3.TypeName, t4.BranchName, t6.Firstname as Approved_by_name '); + $this->db->from(''.DAYBOOKMASTER. ' as t1'); + $this->db->join('' . PICK_LIST_DETAILS . ' as t2', 't2.ListCode = t1.Name', 'LEFT'); + $this->db->join('' . INCOMEOUTCOMEMASTER . ' as t3', 't3.ID = t1.Type', 'LEFT'); + $this->db->join('' . BRANCH . ' as t4', 't4.BranchCode = t1.BranchCode', 'LEFT'); + $this->db->join('' . LOGIN . ' as t5', 't5.ID = t1.Approval_By', 'LEFT'); + $this->db->join('' . STAFF . ' as t6', 't6.StaffID = t5.StaffID', 'LEFT'); + $this->db->where('t1.Date >=', $reqData['date']); + $this->db->where('t1.Date <=', $reqData['dateTo']); + $this->db->order_by('CreatedOn', 'DESC'); + // $this->db->join('' . COURSE . ' as t2', 't2.UniversityID = t1.UniversityID', 'LEFT'); + $dayBookDetails = $this->db->get(); + $dayBookDetailsList = $dayBookDetails->result(); + } else { + $this->db->select('t1.*, t2.ListName, t3.TypeName, t4.BranchName, t6.Firstname as Approved_by_name '); + $this->db->from(''.DAYBOOKMASTER. ' as t1'); + $this->db->join('' . PICK_LIST_DETAILS . ' as t2', 't2.ListCode = t1.Name', 'LEFT'); + $this->db->join('' . INCOMEOUTCOMEMASTER . ' as t3', 't3.ID = t1.Type', 'LEFT'); + $this->db->join('' . BRANCH . ' as t4', 't4.BranchCode = t1.BranchCode', 'LEFT'); + $this->db->join('' . LOGIN . ' as t5', 't5.ID = t1.Approval_By', 'LEFT'); + $this->db->join('' . STAFF . ' as t6', 't6.StaffID = t5.StaffID', 'LEFT'); + // $this->db->where('t1.Date', $reqData['date']); + $this->db->order_by('CreatedOn', 'DESC'); + // $this->db->join('' . COURSE . ' as t2', 't2.UniversityID = t1.UniversityID', 'LEFT'); + $dayBookDetails = $this->db->get(); + $dayBookDetailsList = $dayBookDetails->result(); + } + + $results['dayBookListStatus'] = true; + $results['dayBookListDetails'] = $dayBookDetailsList; + return $results; + } +} \ No newline at end of file diff --git a/api/application/models/DaybookMaster_model.php b/api/application/models/DaybookMaster_model.php new file mode 100644 index 0000000..5f17816 --- /dev/null +++ b/api/application/models/DaybookMaster_model.php @@ -0,0 +1,116 @@ +db->select('TypeName'); + $this->db->where('TypeName', $arrayDetails['TypeName']); + $this->db->where('TypeID', $arrayDetails['TypeID']); + if($this->db->get(INCOMEOUTCOMEMASTER)->first_row()){ + $result['addStatus'] = false; + $result['message'] = "Name is already exist!"; + } else { + $this->db->insert(INCOMEOUTCOMEMASTER, $arrayDetails); + if($this->db->affected_rows() == '1'){ + $result['addStatus'] = true; + $result['message'] = "Successfully Day Book Master Details Added"; + } + else { + $result['addStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + } + + + + + return $result; + + } + + + + /* + * get day book details + * created by kms + * */ + + public function getDayBookDetails($requestedBy=null) + { + $this->db->select('IOM.ID,IOM.TypeName,IOM.TypeID,IOM.IsActive,PLD.ListName'); + + $this->db->from(INCOMEOUTCOMEMASTER .' as IOM'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'PLD.ListCode = IOM.TypeID'); + $this->db->order_by('IOM.ID','DESC'); + $details = $this->db->get(); + if($details->result()){ + + $result['daybookStatus'] = true; + $result['details'] = $details->result(); + } + else { + $result['daybookStatus'] = false; + $result['message'] = "No records found!"; + } + $result['getDayBooktype'] = $this->getDayBookType('10'); + + return $result; + + } + /* + * get day book type + * created by kms + * */ + public function getDayBookType($typeID=null){ + $this->db->select('ListCode,ListName'); + $this->db->where('ListGroup', $typeID); + $typeDetails=$this->db->get(PICK_LIST_DETAILS); + return $typeDetails->result(); + } + /* + * update day book details + * created by kms + * */ + + public function updateDayBook($arrayDetails=null) + { + $this->db->select('TypeName'); + $this->db->where('TypeName', $arrayDetails['TypeName']); + $this->db->where('TypeID', $arrayDetails['TypeID']); + $this->db->where_not_in('ID', $arrayDetails['ID']); + if($this->db->get(INCOMEOUTCOMEMASTER)->first_row()){ + $result['updateStatus'] = false; + $result['message'] = "Name is already exist!"; + } else { + $this->db->where('ID',$arrayDetails['ID']); + $this->db->update(INCOMEOUTCOMEMASTER, $arrayDetails); + if($this->db->affected_rows() == '1'){ + $result['updateStatus'] = true; + $result['message'] = "Successfully Day Book Details Updated"; + } + else { + $result['updateStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + } + + return $result; + + } + +} \ No newline at end of file diff --git a/api/application/models/Employee_model.php b/api/application/models/Employee_model.php new file mode 100644 index 0000000..73b4bb1 --- /dev/null +++ b/api/application/models/Employee_model.php @@ -0,0 +1,815 @@ +db->select('StaffID'); + $this->db->from(LOGIN); + $this->db->where('ID', $empLoginID); + $loginEmpDetail = $this->db->get()->first_row(); + if ($loginEmpDetail) { + $EmpId = $loginEmpDetail->StaffID; + $this->db->select('t1.*'); + $this->db->from('' . STAFF . ' as t1'); + $this->db->where('t1.StaffID', $EmpId); + // $this->db->join('T_StaffDetails as t2', 't1.StaffID = t2.StaffID', 'LEFT'); + $responseDetails = $this->db->get()->first_row(); + $result['empStatus'] = true; + // print_r($responseDetails->ListCode);exit(); + + if ($responseDetails->ListCode == SUPER_ADMIN) { + // print_r($result['details']->ListCode);exit(); + // get branch details for super admin + $responseDetails->BranchCode = 'All'; + $result['details'] = $responseDetails; + // print_r($result['details']);exit(); + $this->db->select('t3.BranchCode, t3.BranchName'); + $this->db->from('' . STAFF_BRANCH . ' as t2'); + $this->db->where('t2.StaffID', $EmpId); + $this->db->where('t2.IsActive', 1); + $this->db->join('' . BRANCH . ' as t3', 't2.BranchCode = t3.BranchCode', 'LEFT'); + $this->db->where('t3.IsActive', 1); + // $this->db->join('T_StaffDetails as t2', 't1.StaffID = t2.StaffID', 'LEFT'); + $branchDetails = $this->db->get(); + $getArrs = $branchDetails->result(); + $SS['BranchCode'] = 'All'; + $SS['BranchName'] = 'All'; + + array_push($getArrs, $SS); + // print_r($getArrs);exit(); + $result['branchStatus'] = true; + $result['branch_details'] = $getArrs; + $result['work_State'] = 'Super Admin'; + + } else { + // get branch details for admin & staff + $result['details'] = $responseDetails; + $this->db->select('t3.BranchCode, t3.BranchName, '); + $this->db->from('' . STAFF_BRANCH . ' as t2'); + $this->db->where('t2.StaffID', $EmpId); + $this->db->where('t2.IsActive', 1); + $this->db->join('' . BRANCH . ' as t3', 't2.BranchCode = t3.BranchCode', 'LEFT'); + $this->db->where('t3.IsActive', 1); + // $this->db->join('T_StaffDetails as t2', 't1.StaffID = t2.StaffID', 'LEFT'); + $branchDetails = $this->db->get(); + $result['branchStatus'] = true; + $result['work_State'] = $responseDetails->ListCode == ADMIN ? 'Admin' : 'Staff'; + $result['branch_details'] = $branchDetails->result(); + } + } else { + $result['empStatus'] = false; + $result['message'] = "Something Went Wrong, Please try Again !!"; + } + return $result; + } + + // get single employee details + public function get_emp_detail($empLoginID = null) + { + $this->db->select('StaffID,ListCode'); + $this->db->from(LOGIN); + $this->db->where('ID', $empLoginID); + $loginEmpDetail = $this->db->get()->first_row(); + if ($loginEmpDetail) { + $EmpId = $loginEmpDetail->StaffID; + if($loginEmpDetail->ListCode != STUDENT){ + $this->db->select('t1.*'); + $this->db->from('' . STAFF . ' as t1'); + $this->db->where('t1.StaffID', $EmpId); + // $this->db->join('T_StaffDetails as t2', 't1.StaffID = t2.StaffID', 'LEFT'); + $responseDetails = $this->db->get()->first_row(); + $result['empStatus'] = true; + // print_r($result['details']);exit(); + + if ($responseDetails->ListCode == SUPER_ADMIN) { + // print_r($result['details']->ListCode);exit(); + // get branch details for super admin + $responseDetails->BranchCode = 'All'; + $result['details'] = $responseDetails; + // print_r($result['details']);exit(); + $this->db->select('t3.BranchCode, t3.BranchName'); + $this->db->from('' . STAFF_BRANCH . ' as t2'); + $this->db->where('t2.StaffID', $EmpId); + $this->db->where('t2.IsActive', 1); + $this->db->join('' . BRANCH . ' as t3', 't2.BranchCode = t3.BranchCode', 'LEFT'); + $this->db->where('t3.IsActive', 1); + // $this->db->join('T_StaffDetails as t2', 't1.StaffID = t2.StaffID', 'LEFT'); + $branchDetails = $this->db->get(); + $getArrs = $branchDetails->result(); + $SS['BranchCode'] = 'All'; + $SS['BranchName'] = 'All'; + array_push($getArrs, $SS); + // print_r($getArrs);exit(); + $result['branchStatus'] = true; + $result['branch_details'] = $getArrs; + + } else { + // get branch details for admin & staff + $result['details'] = $responseDetails; + $this->db->select('t3.BranchCode, t3.BranchName, t2.ListCode , t4.ListName, t2.FinanceModuleAccess'); + $this->db->from('' . STAFF_BRANCH . ' as t2'); + $this->db->where('t2.StaffID', $EmpId); + $this->db->where('t2.IsActive', 1); + $this->db->order_by('t2.CreatedOn', 'ACS'); + $this->db->join('' . BRANCH . ' as t3', 't2.BranchCode = t3.BranchCode', 'LEFT'); + $this->db->join('' . PICK_LIST_DETAILS . ' as t4', 't4.ListCode = t2.ListCode', 'LEFT'); + // $this->db->where('t3.IsActive', 1);STAFF_BRANCH + // $this->db->join('T_StaffDetails as t2', 't1.StaffID = t2.StaffID', 'LEFT'); + $branchDetails = $this->db->get(); + $result['branchStatus'] = true; + $result['branch_details'] = $branchDetails->result(); + } + } + elseif ($loginEmpDetail->ListCode == STUDENT){ + $this->db->select('ST.*'); + $this->db->from('' . STUDENTS . ' as ST'); + $this->db->where('ST.StudentID', $EmpId); + // $this->db->join('T_StaffDetails as t2', 't1.StaffID = t2.StaffID', 'LEFT'); + $responseDetails = $this->db->get()->first_row(); + $result['empStatus'] = true; + $result['details'] = $responseDetails; + $result['branch_details'] = ""; + + } + + } else { + $result['empStatus'] = false; + $result['message'] = "Something Went Wrong, Please try Again !!"; + } + return $result; + + } + + // get employee list based on login user + public function get_employee_list($loginUserId, $loginUserBranchId, $loginUserType) + { + // echo $loginUserId, $loginUserBranchId, $loginUserType; exit(); + if ($loginUserType == SUPER_ADMIN) { + // list for super admin + if ($loginUserBranchId == 'All') { + // for getting all branch details + $staffId = $this->selfGetEmpId($loginUserId); + $this->db->select('t1.*'); + $this->db->order_by('t1.CreatedOn', 'DESC'); + $this->db->from('' . STAFF . ' as t1'); + // $this->db->join('' . STAFF_BRANCH . ' as t3', 't3.StaffID = t1.StaffID', 'LEFT'); + // not for SuperAdmin and Student Role code + $this->db->where_not_in('t1.StaffID', $staffId); + // $this->db->group_by('t3.StaffID'); + // $this->db->where('BranchCode', $loginUserBranchId); + $empDetails = $this->db->get(); + $checkArr = $empDetails->result(); + if (count($checkArr) > 0) { + $results['employeeList'] = true; + $results['employees_details'] = $empDetails->result(); + } else { + $results['employeeList'] = false; + $results['message'] = 'No record found'; + } + } else { + $staffId = $this->selfGetEmpId($loginUserId); + $this->db->select('t2.*'); + $this->db->from('' . STAFF_BRANCH . ' as t1'); + + $this->db->join('' . STAFF . ' as t2', 't2.StaffID = t1.StaffID', 'LEFT'); + + // not for SuperAdmin and Student Role code + $this->db->where_not_in('t1.StaffID', $staffId); + $this->db->group_by('t1.StaffID'); + $this->db->where('t1.BranchCode', $loginUserBranchId); + $this->db->where('t1.ListCode', EMPLOYEE); + $this->db->order_by('t1.CreatedOn', 'DESC'); + $empDetails = $this->db->get(); + $checkArr = $empDetails->result(); + if (count($checkArr) > 0) { + $results['employeeList'] = true; + $results['employees_details'] = $empDetails->result(); + } else { + $results['employeeList'] = false; + $results['message'] = 'No record found'; + } + + } + + } else if ($loginUserType == ADMIN) { + // list for admin + $staffId = $this->selfGetEmpId($loginUserId); + $this->db->select('t2.*'); + $this->db->from('' . STAFF_BRANCH . ' as t1'); + + $this->db->join('' . STAFF . ' as t2', 't2.StaffID = t1.StaffID', 'LEFT'); + + // not for SuperAdmin and Student Role code + $this->db->where_not_in('t1.StaffID', $staffId); + $this->db->group_by('t1.StaffID'); + $this->db->where('t1.BranchCode', $loginUserBranchId); + $this->db->where('t1.ListCode', EMPLOYEE); + $this->db->order_by('t1.CreatedOn', 'DESC'); + $empDetails = $this->db->get(); + $checkArr = $empDetails->result(); + if (count($checkArr) > 0) { + $results['employeeList'] = true; + $results['employees_details'] = $empDetails->result(); + } else { + $results['employeeList'] = false; + } + } else { + $results['employeeList'] = false; + } + return $results; + } + + // get role details based on login user + public function get_req_role_detail($reqRoleId) + { + // echo $reqRoleId;exit(); + if ($reqRoleId == SUPER_ADMIN) { + // res for SuperAdmin + $this->db->select('ListCode, ListName'); + $this->db->from(PICK_LIST_DETAILS); + // not for SuperAdmin and Student Role code + $this->db->where_not_in('ListCode', $reqRoleId); + $this->db->where_not_in('ListCode', 'R001'); + // end : not for SuperAdmin and Student Role code + $this->db->where('ListGroup', 0); + $this->db->where('IsActive', 1); + $roleDetails = $this->db->get(); + $result['RoleDetailStatus'] = true; + $result['role_details'] = $roleDetails->result(); + } else { + // res for Admin + $this->db->select('ListCode, ListName'); + $this->db->from(PICK_LIST_DETAILS); + // not for SuperAdmin and Admin and Student Role code + $this->db->where_not_in('ListCode', $reqRoleId); + $this->db->where_not_in('ListCode', 'R001'); + $this->db->where_not_in('ListCode', 'R004'); + // end : not for SuperAdmin and Admin and Student Role code + $this->db->where('ListGroup', 0); + $this->db->where('IsActive', 1); + $roleDetails = $this->db->get(); + $result['RoleDetailStatus'] = true; + $result['role_details'] = $roleDetails->result(); + } + return $result; + } + + // get branch details based on login user + public function get_req_master_branch_detail($reqRoleId, $reqUserID) + { + if ($reqRoleId == SUPER_ADMIN) { + // res for SuperAdmin + $this->db->select('BranchCode, BranchName'); + $this->db->from(BRANCH); + $this->db->where('IsActive', 1); + $mBranchDetails = $this->db->get(); + $results['MeasterBranchDetailStatus'] = true; + $results['branch_details'] = $mBranchDetails->result(); + } else { + // res for Admin + $staffId = $this->selfGetEmpId($reqUserID); + $subQuery = "SELECT t1.BranchCode, t1.BranchName + FROM T_BranchMaster as t1 + LEFT JOIN T_Staff_BranchAccess as t2 ON t2.StaffID = '$staffId' + WHERE t2.BranchCode = t1.BranchCode + AND t1.IsActive = 1 + AND t2.IsActive = 1"; + $mBranchDetails = $this->db->query($subQuery); + $results['MeasterBranchDetailStatus'] = true; + $results['branch_details'] = $mBranchDetails->result(); + } + return $results; + + } + + // check exist + public function check_exist($data, $checkData) + { + if ($checkData == 'employeeId') { + // check for employee id + $this->db->select('*'); + $this->db->from(STAFF); + $this->db->where('StaffID', $data); + if ($this->db->get()->first_row()) { + $result['existEmpId'] = true; + $result['message'] = "This Employee ID is already exist!"; + } else { + $result['existEmpId'] = false; + } + + } else if ($checkData == 'mobileNumber') { + // check for mobile number + $this->db->select('*'); + $this->db->from(LOGIN); + $this->db->where('MobileNumber', $data); + if ($this->db->get()->first_row()) { + $result['existMobile'] = true; + $result['message'] = "This Mobile Number is already exist!"; + } else { + $result['existMobile'] = false; + } + + } else if ($checkData == 'emailId') { + // check for email id + $this->db->select('*'); + $this->db->from(STAFF); + $this->db->where('EmailID', $data); + if ($this->db->get()->first_row()) { + $result['existEmailId'] = true; + $result['message'] = "This EmailId is already exist!"; + } else { + $result['existEmailId'] = false; + } + } else { + } + return $result; + } + + // add employee + public function add_employee($empArr, $createdBy, $imageName, $imageSource, $imageSize) + { + // print_r($empArr);exit(); + if( $imageSource == '') { // add employee without image + $imageNameDb = 'default.jpeg'; + $empArr['ProfilePicPath'] = "employee/".$imageNameDb; + $this->db->insert(STAFF, $empArr); + if ($this->db->affected_rows() == '1') { + $branchArr['StaffID'] = $empArr['StaffID']; + $branchArr['BranchCode'] = $empArr['BranchCode']; + $branchArr['IsActive'] = $empArr['IsActive']; + $branchArr['CreatedBy'] = $createdBy; + $branchArr['ListCode'] = $empArr['ListCode']; + $branchArr['JobResponsibility'] = $empArr['JobResponsibility']; + $branchArr['FinanceModuleAccess'] = $empArr['FinanceModuleAccess']; + $branchArr['HomeBranch'] = 1; + $this->db->insert(STAFF_BRANCH, $branchArr); + if ($this->db->affected_rows() == '1') { + $loginArr['StaffID'] = $empArr['StaffID']; + $loginArr['ListCode'] = $empArr['ListCode']; + // $loginArr['MobileNumber'] = $empArr['MobileNumber']; + $loginArr['MobileNumber'] = $empArr['StaffID']; + $loginArr['EmailId'] = $empArr['EmailID']; + $loginArr['IsActive'] = $empArr['IsActive']; + $loginArr['CreatedBy'] = $createdBy; + $loginArr['Password'] = ENCR_PASSWORD; + $this->db->insert(LOGIN, $loginArr); + if ($this->db->affected_rows() == '1') { + $result['addEmpStatus'] = true; + $result['message'] = "Successfully employee details added"; + } else { + $result['addEmpStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } else { + $result['addEmpStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } else { + $result['addEmpStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } else { // add employee with image + $target = "../images/employee/"; + $getUploadStatus = $this->upload_image($imageSource, $imageSize, $target); + $imageNameDb = $getUploadStatus['status'] == true ? $getUploadStatus['imageName'] : $getUploadStatus['imageName'] = 'default.jpeg'; + $empArr['ProfilePicPath'] = "employee/".$imageNameDb; + $this->db->insert(STAFF, $empArr); + if ($this->db->affected_rows() == '1') { + $branchArr['StaffID'] = $empArr['StaffID']; + $branchArr['BranchCode'] = $empArr['BranchCode']; + $branchArr['IsActive'] = $empArr['IsActive']; + $branchArr['CreatedBy'] = $createdBy; + $branchArr['ListCode'] = $empArr['ListCode']; + $branchArr['JobResponsibility'] = $empArr['JobResponsibility']; + $branchArr['FinanceModuleAccess'] = $empArr['FinanceModuleAccess']; + $branchArr['HomeBranch'] = 1; + $this->db->insert(STAFF_BRANCH, $branchArr); + if ($this->db->affected_rows() == '1') { + $loginArr['StaffID'] = $empArr['StaffID']; + $loginArr['ListCode'] = $empArr['ListCode']; + // $loginArr['MobileNumber'] = $empArr['MobileNumber']; + $loginArr['MobileNumber'] = $empArr['StaffID']; + $loginArr['EmailId'] = $empArr['EmailID']; + $loginArr['IsActive'] = $empArr['IsActive']; + $loginArr['CreatedBy'] = $createdBy; + $loginArr['Password'] = ENCR_PASSWORD; + $this->db->insert(LOGIN, $loginArr); + if ($this->db->affected_rows() == '1') { + $result['addEmpStatus'] = true; + $result['message'] = "Successfully employee details added"; + } else { + $result['addEmpStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } else { + $result['addEmpStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } else { + $result['addEmpStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + return $result; + } + + // check existing data while update + public function check_update_exist($exceptId, $datas, $checkFor) + { + if ($checkFor == 'mobileNumber') { + // check update for mobile number + $this->db->select('*'); + $this->db->from(LOGIN); + $this->db->where('MobileNumber', $datas); + $this->db->where_not_in('StaffID', $exceptId); + if ($this->db->get()->first_row()) { + $result['existMobile'] = true; + $this->db->select('MobileNumber'); + $this->db->from(STAFF); + $this->db->where('StaffID', $exceptId); + $result['resetValue'] = $this->db->get()->first_row(); + $result['message'] = "This Mobile Number is already exist!"; + } else { + $result['existMobile'] = false; + } + + } else if ($checkFor == 'emailId') { + // check update for email + $this->db->select('*'); + $this->db->from(STAFF); + $this->db->where('EmailID', $datas); + $this->db->where_not_in('StaffID', $exceptId); + if ($this->db->get()->first_row()) { + $result['existEmailId'] = true; + $this->db->select('EmailID'); + $this->db->from(STAFF); + $this->db->where('StaffID', $exceptId); + $result['resetValue'] = $this->db->get()->first_row(); + $result['message'] = "This EmailId is already exist!"; + } else { + $result['existEmailId'] = false; + } + } else { + } + return $result; + } + + // update employee personal details + public function update_employee($empArr, $updateFor, $imageName, $imageSource, $imageSize) + { + if( $imageSource == '') { // update Employee without image + // $this->db->select('*'); + // $this->db->from(STAFF); + // $this->db->where('MobileNumber', $empArr['MobileNumber']); + // $this->db->where_not_in('StaffID', $updateFor); + // if ($this->db->get()->first_row()) { + // $result['updateEmpStatus'] = false; + // $result['message'] = "This Mobile Number Already Exist"; + // }else { + $this->db->select('*'); + $this->db->from(LOGIN); + $this->db->where('MobileNumber', $updateFor); + $this->db->where_not_in('StaffID', $updateFor); + if($this->db->get()->first_row()) { + $result['updateEmpStatus'] = false; + $result['message'] = "This Mobile Number Already Exist"; + } else { + $this->db->where('StaffID', $updateFor); + $this->db->update(STAFF, $empArr); + if ($this->db->affected_rows() == '1') { + $mobile = $empArr['MobileNumber']; + $email = $empArr['EmailID']; + $active = $empArr['IsActive']; + $updatedBy = $empArr['UpdatedBy']; + $updatedOn = $empArr['UpdatedOn']; + $sql = "UPDATE ".LOGIN." SET EmailId='$email', IsActive='$active', UpdatedBy='$updatedBy', UpdatedOn='$updatedOn' WHERE StaffID='$updateFor'"; + if($this->db->query($sql) == '1'){ + $result['updateEmpStatus'] = true; + $result['message'] = "Successfully employee details Updated"; + } else { + $result['updateEmpStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } else { + $result['updateEmpStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + // } + } + else { // update employee with image + + // $this->db->select('*'); + // $this->db->from(STAFF); + // $this->db->where('MobileNumber', $empArr['MobileNumber']); + // $this->db->where_not_in('StaffID', $updateFor); + // if ($this->db->get()->first_row()) { + // $result['updateEmpStatus'] = false; + // $result['message'] = "This Mobile Number Already Exist"; + // }else { + $this->db->select('*'); + $this->db->from(LOGIN); + $this->db->where('MobileNumber', $empArr['MobileNumber']); + $this->db->where_not_in('StaffID', $updateFor); + if($this->db->get()->first_row()) { + $result['updateEmpStatus'] = false; + $result['message'] = "This Mobile Number Already Exist"; + } else { + $target = "../images/employee/"; + $getUploadStatus = $this->upload_image($imageSource, $imageSize, $target); + $imageNameDb = $getUploadStatus['status'] == true ? $getUploadStatus['imageName'] : $getUploadStatus['imageName'] = 'default.jpeg'; + $empArr['ProfilePicPath'] = "employee/".$imageNameDb; + $this->db->select('ProfilePicPath'); + $this->db->from(STAFF); + $this->db->where('StaffID', $updateFor); + $roleDetails = $this->db->get()->first_row(); + // echo $roleDetails->ProfilePicPath; + // exit(); + if( $roleDetails->ProfilePicPath != '' && $roleDetails->ProfilePicPath != 'employee/default.jpeg'){ + unlink('../images/'.$roleDetails->ProfilePicPath); + } else { + } + $this->db->where('StaffID', $updateFor); + $this->db->update(STAFF, $empArr); + if ($this->db->affected_rows() == '1') { + $mobile = $empArr['MobileNumber']; + $email = $empArr['EmailID']; + $active = $empArr['IsActive']; + $updatedBy = $empArr['UpdatedBy']; + $updatedOn = $empArr['UpdatedOn']; + $sql = "UPDATE ".LOGIN." SET EmailId='$email', IsActive='$active', UpdatedBy='$updatedBy', UpdatedOn='$updatedOn' WHERE StaffID='$updateFor'"; + if($this->db->query($sql) == '1'){ + $result['updateEmpStatus'] = true; + $result['message'] = "Successfully employee details Updated"; + } else { + $result['updateEmpStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } else { + $result['updateEmpStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + // } + } + return $result; + } + + // get employee branch details + public function get_employee_branch($staffId) + { + // $this->db->select('t3.ListCode, t3.ListName, t4.JobResponsibility, t4.FinanceModuleAccess'); + // $this->db->from('' . PICK_LIST_DETAILS . ' as t3'); + // $this->db->join('' . STAFF . ' as t4', 't4.ListCode = t3.ListCode', 'LEFT'); + // $this->db->where('t4.StaffID', $staffId); + // $roleDetails = $this->db->get(); + // $checkArr = $roleDetails->result(); + // if (count($checkArr) > 0) { + $this->db->select('t1.*, t2.BranchName, t3.ListName'); + $this->db->from('' . STAFF_BRANCH . ' as t1'); + $this->db->join('' . BRANCH . ' as t2', 't2.BranchCode = t1.BranchCode', 'LEFT'); + $this->db->join('' . PICK_LIST_DETAILS . ' as t3', 't3.ListCode = t1.ListCode', 'LEFT'); + $this->db->where('t1.StaffID', $staffId); + // $this->db->where('t2.IsActive', 1); + // $this->db->where('t1.IsActive', 1); + $branchDetails = $this->db->get(); + $branchArr = $branchDetails->result(); + if( count($branchArr) > 0 ) { + $result['empBranchDetails'] = true; + $result['branch_details'] = $branchArr; + } else { + $result['empBranchDetails'] = false; + $result['message'] = "No Employee Branch Details"; + } + // } else { + // $result['empBranchDetails'] = false; + // } + // print_r($result);exit(); + return $result; + } + + public function get_branch_code($name) { + $this->db->select('BranchCode'); + $this->db->from(BRANCH); + $this->db->where('BranchName', $name); + $roleDetails = $this->db->get()->first_row(); + return $roleDetails->BranchCode; + } + + + public function add_employee_branch($req) { + $staffID = $req['StaffID']; + $BranchCode = $req['BranchCode']; + $this->db->select('*'); + $this->db->from(STAFF_BRANCH); + $this->db->where('StaffID', $staffID); + $this->db->where('BranchCode', $BranchCode); + $roleDetails = $this->db->get()->first_row(); + if(count($roleDetails) > 0) { + $result['addEmpbranchStatus'] = false; + $result['message'] = "Already Employee Exist for this Branch."; + } else { + $req['HomeBranch'] = 0; + $this->db->insert(STAFF_BRANCH, $req); + if ($this->db->affected_rows() == '1') { + $result['addEmpbranchStatus'] = true; + $result['message'] = "Successfully employee branch details Added"; + + } else { + $result['addEmpbranchStatus'] = false; + $result['message'] = "Something went wrong."; + } + } + return $result; + } + + + // update employee branch details + public function upate_employee_branch($updateFor, $req) + { + // print_r($req); + // echo $updateFor;exit(); + $staffID = $req['StaffID']; + $BranchCode = $req['BranchCode']; + $this->db->select('*'); + $this->db->from(STAFF_BRANCH); + $this->db->where('ID', $updateFor); + $this->db->where_not_in('BranchCode', $BranchCode); + $roleDetails = $this->db->get()->first_row(); + // print_r($roleDetails);exit(); + if(count($roleDetails) > 0) { + $result['updateEmpbranchStatus'] = false; + $result['message'] = "Already Employee Exist for this Branch."; + } else { + if($req['HomeBranch'] == 1) { + $this->db->where('ID', $updateFor); + $this->db->update( STAFF_BRANCH , $req); + if ($this->db->affected_rows() == '1') { + $listCode = $req['ListCode']; + $empFor = $req['StaffID']; + $branchCode = $req['BranchCode']; + $roleResponsibility = $req['JobResponsibility']; + $FinanceModuleAccess = $req['FinanceModuleAccess']; + $sql = "UPDATE ".LOGIN." SET ListCode ='$listCode' WHERE StaffID='$empFor'"; + if ($this->db->query($sql) == '1') { + $sql1 = "UPDATE ".STAFF." SET BranchCode='$branchCode', JobResponsibility='$roleResponsibility', FinanceModuleAccess= '$FinanceModuleAccess' WHERE StaffID='$empFor'"; + if ($this->db->query($sql1) == '1') { + $result['updateEmpbranchStatus'] = true; + $result['message'] = "Successfully employee branch details Updated"; + } else { + $result['updateEmpbranchStatus'] = false; + $result['message'] = "Something Went Wrong."; + } + } else { + $result['updateEmpbranchStatus'] = false; + $result['message'] = "Something Went Wrong."; + } + } else { + $result['updateEmpbranchStatus'] = false; + $result['message'] = "Something Went Wrong."; + } + } else { + $this->db->where('ID', $updateFor); + $this->db->update( STAFF_BRANCH , $req); + if ($this->db->affected_rows() == '1') { + $result['updateEmpbranchStatus'] = true; + $result['message'] = "Successfully employee branch details Updated"; + } else { + $result['updateEmpbranchStatus'] = false; + $result['message'] = "Something Went Wrong."; + } + } + } + return $result; + // $this->db->where('StaffID', $empFor); + // $this->db->update($req['StaffID'] , $req); + // // update role to staff table + // if ($this->db->affected_rows() == '1') { + // $this->db->where('StaffID', $empFor); + // $this->db->update(LOGIN, $req); + // // echo $this->db->affected_rows();exit(); + // // update role to login table + // if ($this->db->affected_rows() == '1') { + // // $branchCode = $this->get_branch_code($reqBanch['BranchCode'][0]); + // $branchCode = $reqBanch['BranchCode'][0]; + // $roleResponsibility = $reqJOBRES['JobResponsibility']; + // $sql = "UPDATE ".STAFF." SET BranchCode='$branchCode', JobResponsibility='$roleResponsibility', FinanceModuleAccess=$FinanceModuleAccess WHERE StaffID='$empFor'"; + // // update branch to staff table + // if ($this->db->query($sql) == '1') { + // $this->db->where('StaffID', $empFor); + // $this->db->delete(STAFF_BRANCH); + // foreach($reqBanch['BranchCode'] as $something) { + // // $branchCode = $this->get_branch_code($something); + // $branchCode = $something; + // $sql1 = "INSERT INTO ".STAFF_BRANCH." (StaffID, BranchCode, IsActive, CreatedBy, CreatedOn, UpdatedBy, UpdatedOn) + // VALUES ('$empFor', '$branchCode', '1','$createby', '$createon', '$createby', '$createon')"; + // // update branch to staff_branch table + // if ($this->db->query($sql1) == '1') { + // $result['updateEmpbranchStatus'] = true; + // $result['message'] = "Successfully employee branch details Updated"; + // } else { + // $result['updateEmpbranchStatus'] = false; + // $result['message'] = "Something went wrong.please try again"; + // } + // } + // } else { + // $result['updateEmpbranchStatus'] = false; + // $result['message'] = "Something went wrong.please try again"; + // } + // } else { + // $result['updateEmpbranchStatus'] = false; + // $result['message'] = "Something went wrong.please try again"; + // } + // } else { + // $result['updateEmpbranchStatus'] = false; + // $result['message'] = "Something went wrong.please try again"; + // } + // return $result; + + // } else { + // $this->db->where('StaffID', $empFor); + // $this->db->update(STAFF, $req); + // // update role to staff table + // if ($this->db->affected_rows() == '1') { + // $this->db->where('StaffID', $empFor); + // $this->db->update(LOGIN, $req); + // // echo $this->db->affected_rows();exit(); + // // update role to login table + // if ($this->db->affected_rows() == '1') { + // // $branchCode = $this->get_branch_code($reqBanch['BranchCode'][0]); + // $branchCode = $reqBanch['BranchCode'][0]; + // $roleResponsibility = $reqJOBRES['JobResponsibility']; + // $sql = "UPDATE ".STAFF." SET BranchCode='$branchCode', JobResponsibility='$roleResponsibility', FinanceModuleAccess=$FinanceModuleAccess WHERE StaffID='$empFor'"; + // // update branch to staff table + // if ($this->db->query($sql) == '1') { + // $this->db->where('StaffID', $empFor); + // $this->db->delete(STAFF_BRANCH); + // $sql1 = "INSERT INTO ".STAFF_BRANCH." (StaffID, BranchCode, IsActive, CreatedBy, CreatedOn) + // VALUES ('$empFor', '$branchCode', '1','$createby', '$createon')"; + // // update branch to staff_branch table + // if ($this->db->query($sql1) == '1') { + // $result['updateEmpbranchStatus'] = true; + // $result['message'] = "Successfully employee branch details Updated"; + // } else { + // $result['updateEmpbranchStatus'] = false; + // $result['message'] = "Something went wrong.please try again"; + // } + // } else { + // $result['updateEmpbranchStatus'] = false; + // $result['message'] = "Something went wrong.please try again"; + // } + // } else { + // $result['updateEmpbranchStatus'] = false; + // $result['message'] = "Something went wrong.please try again"; + // } + // } else { + // $result['updateEmpbranchStatus'] = false; + // $result['message'] = "Something went wrong.please try again"; + // } + // return $result; + // } + + } + + public function selfGetEmpId($sID) + { + $this->db->select('StaffID'); + $this->db->from(LOGIN); + $this->db->where('ID', $sID); + $roleDetails = $this->db->get()->first_row(); + return $roleDetails->StaffID; + } + + // image upload in taget path + public function upload_image( $imageSource, $size, $target ) { + $key2 = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 12); + $new_regNo = "Dri_" . $key2 . "." . 'jpeg'; + $targetPlace = $target . $new_regNo; + // echo $targetPlace;exit(); + if(!move_uploaded_file($imageSource , $targetPlace)) + { + return $result['status'] = false; + } else { + $result['status'] = true; + $result['imageName'] = $new_regNo; + return $result; + } + } +} \ No newline at end of file diff --git a/api/application/models/Fees_status_model.php b/api/application/models/Fees_status_model.php new file mode 100644 index 0000000..67a82e0 --- /dev/null +++ b/api/application/models/Fees_status_model.php @@ -0,0 +1,1763 @@ +db->select('ST.StudentID,ST.MobileNumber,ST.Firstname,ST.Fathername,ST.EmailID,STC.ID,US.UniversityID,US.UniversityName,CU.CourseID,CU.CourseName'); + $this->db->from(STUDENTS.' as ST'); + $this->db->join(STUDENTCOURSE.' as STC', 'STC.StudentID = ST.StudentID'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = STC.CourseID'); + // $this->db->join(SESSIONMASTER.' as SM', 'SM.SessionID = STC.SessionID'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = CU.UniversityID'); + $this->db->where('ST.IsActive','1'); + $this->db->where('STC.IsActive','1'); + if($search['requestedBranch']!='All'){ + $this->db->where('STC.BranchID',$search['requestedBranch']); + } + if($search['MobileNumber']!=''){ + $this->db->where('ST.MobileNumber',$search['MobileNumber']); + } + if($search['Firstname']!=''){ + $this->db->like('ST.Firstname',$search['Firstname'],'after'); + } + if($search['UniversityID']!=''){ + $this->db->where('STC.UniversityID',$search['UniversityID']); + } + if($search['CourseID']!=''){ + $this->db->where('STC.CourseID',$search['CourseID']); + } + /* if($search['MobileNumber']!='' AND $search['Firstname']==''){ + $this->db->where('ST.MobileNumber',$search['MobileNumber']); + } + else if($search['MobileNumber']=='' AND $search['Firstname']!=''){ + $this->db->where('ST.Firstname',$search['Firstname']); + } + else if($search['MobileNumber']!='' AND $search['Firstname']!=''){ + $this->db->where('ST.MobileNumber',$search['MobileNumber']); + $this->db->where('ST.Firstname',$search['Firstname']); + }*/ + $searchDetails = $this->db->get(); + + if($searchDetails->result()) { + $result_array['studentStatus'] = true; + $result_array['details'] = $searchDetails->result(); + + + } + else{ + $result_array['studentStatus'] = false; + $result_array['details'] = "No records found!"; + } + } + else{ + $result_array['studentStatus'] = false; + $result_array['details'] = "No records found!"; + } + + return $result_array; + + } + + /* + * get student fees structure for fees update + * @params student ID + * created by kms + * */ + public function getStudentFeesStructure($student=null){ + $this->db->select('CF.ID,CF.Sem_Year,CF.ProgramType,SFS.FeesID,SFS.CourseID,SFS.CourseFees,SFS.STFOrWR,SFS.Waiver,SFS.Others,SFS.RollNo,CU.PC,CU.TC,CU.DC,CU.MC,CU.OtherFees,SM.SessionName as SessionName,SM1.SessionName as ToSessionName,BA.BatchCode,BA.BatchName'); + $this->db->from(STUDENTS_FEES_STATUS.' as SFS'); + $this->db->join(SESSIONMASTER.' as SM', 'SM.SessionID = SFS.SessionName'); + $this->db->join(SESSIONMASTER.' as SM1', 'SM1.SessionID = SFS.ToSessionName','left'); + $this->db->join(BATCH.' as BA', 'BA.BatchCode = SFS.BatchCode'); + $this->db->join(COURSE_FEES.' as CF', 'CF.ID = SFS.FeesType'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = CF.CourseID'); + $this->db->where('SFS.CourseID',$student['CourseID']); + $this->db->where('SFS.StudentID',$student['StudentID']); + $enrolledFeesDetails = $this->db->get(); + if($enrolledFeesDetails->result()){ + $result_array['feesStatus']=true; + foreach ($enrolledFeesDetails->result() as $row) { + $fetchData['ID'] = $row->ID; + $fetchData['FeesID'] = $row->FeesID; + $fetchData['CourseID'] = $row->CourseID; + $fetchData['Sem_Year'] = $row->Sem_Year; + $fetchData['ProgramType'] = $row->ProgramType; + $fetchData['ActualFees'] = $row->CourseFees; + $fetchData['STFOrWR'] = $row->STFOrWR; + $fetchData['Waiver'] = $row->Waiver; + $fetchData['Others'] = $row->Others; + $fetchData['SessionName'] = $row->SessionName; + $fetchData['BatchName'] = $row->BatchName; + if($row->ToSessionName=='' OR $row->ToSessionName==null){ + $fetchData['ToSessionName'] = "Not Applicable"; + } + else{ + $fetchData['ToSessionName'] = $row->ToSessionName; + } + + $fetchData['RollNo'] = $row->RollNo; + $fetchData['PayableFees']=$row->CourseFees+$row->STFOrWR+$row->Others-$row->Waiver; + + $this->db->select('ifnull(SUM((BillAmount)),0) as PaidBillAmount'); + $this->db->where('FeesId',$row->FeesID); + $paidBillAmount = $this->db->get(STUDENTS_FEES_PAID)->result(); + if($paidBillAmount[0]->PaidBillAmount > $fetchData['PayableFees']){ + $fetchData['BalanceAmount']=0; + + } + else{ + $fetchData['BalanceAmount']=$fetchData['PayableFees'] - $paidBillAmount[0]->PaidBillAmount; + } + $fetchData['PC'] = $row->PC; + $fetchData['TC'] = $row->TC; + $fetchData['DC'] = $row->DC; + $fetchData['MC'] = $row->MC; + $fetchData['OtherFees'] = $row->OtherFees; + + $CourseFeesArray[]=$fetchData; + } + + $getDefaultCourseFees = $this->getDefaultCourseFees($student); + if($getDefaultCourseFees!=false){ + $result_array['feesDetails']=array_merge($CourseFeesArray,$getDefaultCourseFees); + } + else{ + $result_array['feesDetails']=$CourseFeesArray; + } + + + // $result_array['getFeesUpdateStatus']=$this->getFeesUpdateStatus(FEESUPDATE); + $result_array['getExistStudentFeesDetails']=$this->existStudentFeesDetails($student); + + } + else{ + $result_array['feesStatus']=false; + $result_array['message']="This student don't have fees details"; + + } + return $result_array; + + } + /* + * get fees update status + * created by kms + * */ + + public function getFeesUpdateStatus($feesID=null) + { + $this->db->select('PLD.ListCode,PLD.ListName'); + $this->db->from(DEFAULTACTIVITY.' as DA'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'PLD.ListCode = DA.StatusCode'); + $this->db->where('StudentActivityCode',$feesID); + $this->db->where('DA.IsActive','1'); + $this->db->where('PLD.IsActive','1'); + $this->db->order_by('ListCode','ASC'); + $status = $this->db->get(); + return $status->result(); + } + /* + * get default course fees for bill + * creted by kms + * */ + public function getDefaultCourseFees($student=null) + { + $serachArray = ["PC","TC","DC","MC","OTHER"]; + + $this->db->select('SFS.FeesID,SFS.FeesType,SFS.CourseID,SFS.CourseFees,SFS.STFOrWR,SFS.Waiver,SFS.Others,SFS.SessionName,SFS.RollNo,CU.PC,CU.TC,CU.DC,CU.MC,CU.OtherFees'); + $this->db->from(STUDENTS_FEES_STATUS . ' as SFS'); + //$this->db->join(COURSE_FEES.' as CF', 'CF.ID = SFS.FeesType'); + $this->db->join(COURSE . ' as CU', 'CU.CourseID = SFS.CourseID'); + $this->db->where('SFS.CourseID', $student['CourseID']); + $this->db->where('SFS.StudentID', $student['StudentID']); + $this->db->where_in('SFS.FeesType', $serachArray); + $enrolledFeesDetails = $this->db->get(); + + if ($enrolledFeesDetails->result()) { + $result_array['feesStatus'] = true; + foreach ($enrolledFeesDetails->result() as $row) { + $fetchData['ID'] = $row->FeesType; + $fetchData['FeesID'] = $row->FeesID; + $fetchData['CourseID'] = $row->CourseID; + $fetchData['Sem_Year'] = $row->FeesType; + $fetchData['ProgramType'] = $row->FeesType; + $fetchData['ActualFees'] = $row->CourseFees; + $fetchData['STFOrWR'] = $row->STFOrWR; + $fetchData['Waiver'] = $row->Waiver; + $fetchData['Others'] = $row->Others; + $fetchData['SessionName'] = "Not Applicable"; + $fetchData['ToSessionName'] = "Not Applicable"; + $fetchData['BatchName'] = "Not Applicable"; + $fetchData['RollNo'] = $row->RollNo; + $fetchData['PayableFees'] = $row->CourseFees + $row->STFOrWR + $row->Others - $row->Waiver; + + $this->db->select('ifnull(SUM((BillAmount)),0) as PaidBillAmount'); + $this->db->where('FeesId', $row->FeesID); + $paidBillAmount = $this->db->get(STUDENTS_FEES_PAID)->result(); + if ($paidBillAmount[0]->PaidBillAmount > $fetchData['PayableFees']) { + $fetchData['BalanceAmount'] = 0; + + } else { + $fetchData['BalanceAmount'] = $fetchData['PayableFees'] - $paidBillAmount[0]->PaidBillAmount; + } + $fetchData['PC'] = $row->PC; + $fetchData['TC'] = $row->TC; + $fetchData['DC'] = $row->DC; + $fetchData['MC'] = $row->MC; + $fetchData['OtherFees'] = $row->OtherFees; + + $CourseFeesArray[] = $fetchData; + } + + return $CourseFeesArray; + + } + else{ + return false; + + } + } + /* + * get exist student fees details + * created by kms + * */ + + public function existStudentFeesDetails($student=null){ + $serachArray=[WAIVER,REFERRAL]; + + $this->db->distinct(); + $this->db->select('SFS.FeesID,SFS.FeesType,SFS.RollNo,ifnull(SFS.CourseFees,0) as CourseFees,ifnull(SFS.STFOrWR,0) as STFOrWR,ifnull(SFS.Waiver,0) as Waiver,ifnull(SFS.Others,0) as Others,ST.Firstname,ST.MobileNumber,ST.Fathername,CU.CourseName,CU.CourseID,CF.Sem_Year,STC.EnrollmentID,US.UniversityName,US.UniversityShortName,SM.SessionName,SM1.SessionName as ToSessionName,CF.ProgramType,BA.BatchCode,BA.BatchName'); + $this->db->from(STUDENTS_FEES_PAID.' as SFP'); + $this->db->join(STUDENTS_FEES_STATUS.' as SFS','SFP.FeesId = SFS.FeesID'); + $this->db->join(SESSIONMASTER.' as SM', 'SM.SessionID = SFS.SessionName'); + $this->db->join(SESSIONMASTER.' as SM1', 'SM1.SessionID = SFS.ToSessionName','left'); + $this->db->join(BATCH.' as BA', 'BA.BatchCode = SFS.BatchCode'); + $this->db->join(STUDENTS.' as ST', 'ST.StudentID = SFS.StudentID'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = SFS.CourseID'); + $this->db->join(COURSE_FEES.' as CF', 'CF.ID = SFS.FeesType'); + $this->db->join(STUDENTCOURSE.' as STC', 'STC.CourseID = SFS.CourseID'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = STC.UniversityID'); + $this->db->where('SFS.CourseID', $student['CourseID']); + $this->db->where('SFS.StudentID', $student['StudentID']); + $this->db->where('STC.StudentID', $student['StudentID']); + $this->db->where('SFP.StudentID', $student['StudentID']); + $this->db->order_by('SFP.ID', 'DESC'); + $getFeeDetails = $this->db->get(); + if($getFeeDetails->result()){ + foreach ($getFeeDetails->result() as $feeRow){ + $storePaidDetails['FeesID'] = $feeRow->FeesID; + $storePaidDetails['FeesName'] = $feeRow->Sem_Year; + $storePaidDetails['CourseFees'] = $feeRow->CourseFees; + $storePaidDetails['ProgramType'] = $feeRow->ProgramType; + $storePaidDetails['SessionName'] = $feeRow->SessionName; + if($feeRow->ToSessionName=='' OR $feeRow->ToSessionName==null){ + $storePaidDetails['ToSessionName'] = "Not Applicable"; + } + else{ + $storePaidDetails['ToSessionName'] = $feeRow->ToSessionName; + } + $storePaidDetails['BatchName'] = $feeRow->BatchName; + + $storePaidDetails['RollNo'] = $feeRow->RollNo; + $storePaidDetails['STFOrWR'] = $feeRow->STFOrWR; + $storePaidDetails['Waiver'] = $feeRow->Waiver; + $storePaidDetails['Others'] = $feeRow->Others; + $storePaidDetails['PayableAmount'] = $feeRow->CourseFees+$feeRow->STFOrWR+$feeRow->Others-$feeRow->Waiver; + $storePaidDetails['Firstname'] = $feeRow->Firstname; + $storePaidDetails['MobileNumber'] = $feeRow->MobileNumber; + $storePaidDetails['Fathername'] = $feeRow->Fathername; + $storePaidDetails['EnrollmentID'] = $feeRow->EnrollmentID; + $storePaidDetails['CourseName'] = $feeRow->CourseName; + $storePaidDetails['UniversityName'] = $feeRow->UniversityName; + $storePaidDetails['UniveShortName'] = $feeRow->UniversityShortName; + $this->db->select('ifnull(SUM((BillAmount)),0) as PaidBillAmount'); + $this->db->where('FeesId',$feeRow->FeesID); + $paidBillAmount = $this->db->get(STUDENTS_FEES_PAID)->result(); + + $storePaidDetails['PaidBillAmount']=$paidBillAmount[0]->PaidBillAmount; + + if($paidBillAmount[0]->PaidBillAmount > $storePaidDetails['PayableAmount']){ + $storePaidDetails['BalanceAmount']=0; + + } + else{ + $storePaidDetails['BalanceAmount']=$storePaidDetails['PayableAmount'] - $paidBillAmount[0]->PaidBillAmount; + } + + // sepearte for student waiver and referral bill list + $this->db->select('ifnull(SUM((BillAmount)),0) as StudentWaiverRefAmount'); + $this->db->where('FeesId',$feeRow->FeesID); + $this->db->where_in('ModeOfPayment',$serachArray); + $studentWaiverRefAmount = $this->db->get(STUDENTS_FEES_PAID)->result(); + + $storePaidDetails['StudentWaiverRefAmount']=$studentWaiverRefAmount[0]->StudentWaiverRefAmount; + + $this->db->select('ifnull(SUM((BillAmount)),0) as StudentPaidAmount'); + $this->db->where('FeesId',$feeRow->FeesID); + $this->db->where('ModeOfPayment !=',WAIVER); + $this->db->where('ModeOfPayment !=',REFERRAL); + $studentPaidAmount = $this->db->get(STUDENTS_FEES_PAID)->result(); + + $storePaidDetails['StudentPaidAmount']=$studentPaidAmount[0]->StudentPaidAmount; + + // for get paid bill details + $this->db->select('ifnull(SUM((BillAmount)),0) as BillAmount,BillNO,BillDate,ModeOfPayment,ReceiptNo,BR.BranchName,BR.Address,BR.LogoPath,STF.Firstname as ReceivedBy'); + $this->db->from(STUDENTS_FEES_PAID.' as SFP'); + $this->db->join(BRANCH.' as BR','BR.BranchCode = SFP.UpdatedBy','left'); + $this->db->join(LOGIN.' as LO','LO.ID = SFP.CreatedBy'); + $this->db->join(STAFF.' as STF','STF.StaffID = LO.StaffID'); + $this->db->where('SFP.FeesId',$feeRow->FeesID); + $this->db->order_by('SFP.ID',"ASC"); + $this->db->group_by('SFP.BillNO'); + $storePaidDetails['paidDetails']=$this->db->get()->result(); + $mergeResult[]=$storePaidDetails; + + } + $existDefaultFees = $this->existStudentCourseDefaultFees($student); + if($existDefaultFees != false){ + return array_merge($mergeResult,$existDefaultFees); + } + else{ + return $mergeResult; + } + + } + else { + return false; + } + + } + + /* + * get exist student default fees details + * created by kms + * */ + + public function existStudentCourseDefaultFees($student=null){ + $serachArray = ["PC","TC","DC","MC","OTHER"]; + $this->db->distinct(); + $this->db->select('SFS.FeesID,SFS.FeesType,SFS.SessionName,SFS.ToSessionName,SFS.RollNo,ifnull(SFS.CourseFees,0) as CourseFees,ifnull(SFS.STFOrWR,0) as STFOrWR,ifnull(SFS.Waiver,0) as Waiver,ifnull(SFS.Others,0) as Others,ST.Firstname,ST.MobileNumber,ST.Fathername,CU.CourseName,CU.CourseID,STC.EnrollmentID,US.UniversityName,US.UniversityShortName'); + $this->db->from(STUDENTS_FEES_PAID.' as SFP'); + $this->db->join(STUDENTS_FEES_STATUS.' as SFS','SFP.FeesId = SFS.FeesID'); + $this->db->join(STUDENTS.' as ST', 'ST.StudentID = SFS.StudentID'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = SFS.CourseID'); + //$this->db->join(COURSE_FEES.' as CF', 'CF.ID = SFS.FeesType'); + $this->db->join(STUDENTCOURSE.' as STC', 'STC.CourseID = SFS.CourseID'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = STC.UniversityID'); + $this->db->where('SFS.CourseID', $student['CourseID']); + $this->db->where('SFS.StudentID', $student['StudentID']); + $this->db->where('STC.StudentID', $student['StudentID']); + $this->db->where('SFP.StudentID', $student['StudentID']); + $this->db->where_in('SFS.FeesType', $serachArray); + $this->db->order_by('SFP.ID', 'DESC'); + $getFeeDetails = $this->db->get(); + if($getFeeDetails->result()){ + foreach ($getFeeDetails->result() as $feeRow){ + $storePaidDetails['FeesID'] = $feeRow->FeesID; + $storePaidDetails['FeesName'] = $feeRow->FeesType; + $storePaidDetails['ProgramType'] = $feeRow->FeesType; + $storePaidDetails['CourseFees'] = $feeRow->CourseFees; + $storePaidDetails['SessionName'] = "Not Applicable"; + $storePaidDetails['ToSessionName'] = "Not Applicable"; + $storePaidDetails['BatchName'] = "Not Applicable"; + $storePaidDetails['RollNo'] = $feeRow->RollNo; + $storePaidDetails['STFOrWR'] = $feeRow->STFOrWR; + $storePaidDetails['Waiver'] = $feeRow->Waiver; + $storePaidDetails['Others'] = $feeRow->Others; + $storePaidDetails['PayableAmount'] = $feeRow->CourseFees+$feeRow->STFOrWR+$feeRow->Others-$feeRow->Waiver; + $storePaidDetails['Firstname'] = $feeRow->Firstname; + $storePaidDetails['MobileNumber'] = $feeRow->MobileNumber; + $storePaidDetails['Fathername'] = $feeRow->Fathername; + $storePaidDetails['EnrollmentID'] = $feeRow->EnrollmentID; + $storePaidDetails['CourseName'] = $feeRow->CourseName; + $storePaidDetails['UniversityName'] = $feeRow->UniversityName; + $storePaidDetails['UniveShortName'] = $feeRow->UniversityShortName; + $this->db->select('ifnull(SUM((BillAmount)),0) as PaidBillAmount'); + $this->db->where('FeesId',$feeRow->FeesID); + $paidBillAmount = $this->db->get(STUDENTS_FEES_PAID)->result(); + $storePaidDetails['PaidBillAmount']=$paidBillAmount[0]->PaidBillAmount; + if($paidBillAmount[0]->PaidBillAmount > $storePaidDetails['PayableAmount']){ + $storePaidDetails['BalanceAmount']=0; + + } + else{ + $storePaidDetails['BalanceAmount']=$storePaidDetails['PayableAmount'] - $paidBillAmount[0]->PaidBillAmount; + } + + // for get paid bill details + $this->db->select('ifnull(SUM((BillAmount)),0) as BillAmount,BillNO,BillDate,ModeOfPayment,ReceiptNo,BR.BranchName,BR.Address,BR.LogoPath,STF.Firstname as ReceivedBy'); + $this->db->from(STUDENTS_FEES_PAID.' as SFP'); + $this->db->join(BRANCH.' as BR','BR.BranchCode = SFP.UpdatedBy','left'); + $this->db->join(LOGIN.' as LO','LO.ID = SFP.CreatedBy'); + $this->db->join(STAFF.' as STF','STF.StaffID = LO.StaffID'); + $this->db->where('SFP.FeesId',$feeRow->FeesID); + $this->db->order_by('SFP.ID',"ASC"); + $this->db->group_by('SFP.BillNO'); + $storePaidDetails['paidDetails']=$this->db->get()->result(); + $mergeResult[]=$storePaidDetails; + + } + + return $mergeResult; + } + else { + return false; + } + } + + + /* + * update fees details + * created by kms + * */ + + public function updateFees($feesPaidDetails=null,$courseID=null) + { + if($feesPaidDetails['UpdatedBy']=='All'){ + $this->db->select('BranchID'); + $this->db->where('FeesID', $feesPaidDetails['FeesId']); + $this->db->from(STUDENTS_FEES_STATUS.' as SFS'); + $this->db->join(STUDENTCOURSE.' as SC', 'SC.CourseID = SFS.CourseID'); + $getStudentBranch=$this->db->get()->result(); + $feesPaidDetails['UpdatedBy'] = $getStudentBranch[0]->BranchID; + + } + $this->db->select('BillNO'); + $this->db->where('UpdatedBy', $feesPaidDetails['UpdatedBy']); + + $getLastBillNo=$this->db->get(STUDENTS_FEES_PAID)->last_row(); + if($getLastBillNo){ + $strExplode= explode("-", $getLastBillNo->BillNO); + + $n=$strExplode[1]; + $n2 = str_pad($n + 1, 5, 0, STR_PAD_LEFT); + $splitString = substr($feesPaidDetails['UpdatedBy'], 0, 3); + $feesPaidDetails['BillNO']=$splitString.'-'.$n2; + } + else{ + $n='00000'; + $n2 = str_pad($n + 1, 5, 0, STR_PAD_LEFT); + $splitString = substr($feesPaidDetails['UpdatedBy'], 0, 3); + $feesPaidDetails['BillNO']=$splitString.'-'.$n2; + } + $this->db->select('BillNO'); + $this->db->where('BillNO', $feesPaidDetails['BillNO']); + if($this->db->get(STUDENTS_FEES_PAID)->first_row()){ + $result['paidStatus'] = false; + $result['message'] = "This bill number is already exist!"; + } else { + + $this->db->select('ReceiptNo'); + $this->db->where('ReceiptNo', $feesPaidDetails['ReceiptNo']); + if($this->db->get(STUDENTS_FEES_PAID)->first_row() AND $feesPaidDetails['ReceiptNo']!=''){ + $result['paidStatus'] = false; + $result['message'] = "This receipt number is already exist!"; + } + else{ + $this->db->insert(STUDENTS_FEES_PAID, $feesPaidDetails); + if ($this->db->affected_rows() == '1') { + + $result['paidStatus'] = true; + $result['message'] = "Successfully fees details added"; + $feesPayedID = $this->db->insert_id(); + // $entryOfCallTrack = $this->updateInCallTrack($trackDetails); + // day book entry + + if($feesPaidDetails['BillAmount']!='0'){ + + $dayBookEntry = $this->insertDayBookMaster($feesPaidDetails,$feesPayedID); + } + + // Entry for all status screen except fees + $this->entryForAllStatus($feesPaidDetails,$courseID); + + + + } + else{ + $result['paidStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + + + + + } + + return $result; + + + } + + /* + * update followup details + * created by kms + * */ + public function updateInCallTrack($arrayDetails=null){ + // create activity in call tracking + $this->db->select('ActivityID,ActivityName'); + $this->db->like('ActivityName', 'Fees', 'after'); + $this->db->where('IsActive', '1'); + $activityDetails=$this->db->get(ACTIVITY)->last_row(); + if($activityDetails){ + $newLeadDetails['MobileNumber'] = $arrayDetails['MobileNumber']; + $newLeadDetails['LeadName'] = $arrayDetails['LeadName']; + $newLeadDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $newLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_DETAILS, $newLeadDetails); + // this if for insert lead details + if($this->db->affected_rows() == '1'){ + // get and store insert id from db + $track_Details['LeadID']=$this->db->insert_id(); + $track_Details['ActivityStatus'] = $activityDetails->ActivityID; + $track_Details['University'] = $arrayDetails['University']; + $track_Details['Course'] = $arrayDetails['Course']; + $track_Details['AssignedTo'] = $arrayDetails['CreatedBy']; + $track_Details['StatusCode'] = $arrayDetails['StatusCode']; + $track_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $track_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING, $track_Details); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $insertfollowup_Details['TrackingID']=$this->db->insert_id(); + $insertfollowup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $insertfollowup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $insertfollowup_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $insertfollowup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $insertfollowup_Details); + // this if for insert follow up details + + } + + + } + + // hide tracking updated sepaerate code + + /* $this->db->select('LD.LeadID,LT.TrackingID'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->where('LD.MobileNumber',$arrayDetails['MobileNumber']); + $this->db->where('LT.ActivityStatus',$activityDetails->ActivityID); + $this->db->like('LT.University',$arrayDetails['University'],'after'); + $this->db->like('LT.Course',$arrayDetails['Course'],'after'); + $leadDet=$this->db->get()->last_row(); + + if($leadDet){ + $this->db->select('FollowupOn'); + $this->db->where('TrackingID',$leadDet->TrackingID); + $this->db->order_by('InteractionId','DESC'); + $existFollowupOn = $this->db->get(LEAD_TRACKING_FOLLOWUP)->last_row(); + // upate tracking status + $changeStatusCode['StatusCode'] = $arrayDetails['StatusCode']; + $changeStatusCode['UpdatedBy'] = $arrayDetails['CreatedBy']; + $changeStatusCode['UpdatedOn'] = $arrayDetails['CreatedOn']; + $this->db->where('TrackingID',$leadDet->TrackingID); + $this->db->update(LEAD_TRACKING, $changeStatusCode); + // end update status + $updateTrackDetails['TrackingID'] = $leadDet->TrackingID; + $updateTrackDetails['FollowupOn'] = $existFollowupOn->FollowupOn; + $updateTrackDetails['FollowupComments'] = $arrayDetails['FollowupComments']; + $updateTrackDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $updateTrackDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $updateTrackDetails); + + } + + else{ + $this->db->select('LeadID'); + $this->db->where('MobileNumber',$arrayDetails['MobileNumber']); + $checkLeadDet=$this->db->get(LEAD_DETAILS)->last_row(); + if($checkLeadDet){ + $updateLeadDetails['LeadID'] = $checkLeadDet->LeadID; + $updateLeadDetails['ActivityStatus'] = $activityDetails->ActivityID; + $updateLeadDetails['University'] = $arrayDetails['University']; + $updateLeadDetails['Course'] = $arrayDetails['Course']; + $updateLeadDetails['AssignedTo'] = $arrayDetails['CreatedBy']; + $updateLeadDetails['StatusCode'] = $arrayDetails['StatusCode']; + $updateLeadDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $updateLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING, $updateLeadDetails); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $followup_Details['TrackingID']=$this->db->insert_id(); + $followup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $followup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $followup_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $followup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $followup_Details); + // this if for insert follow up details + + } + + } + else{ + $newLeadDetails['MobileNumber'] = $arrayDetails['MobileNumber']; + $newLeadDetails['LeadName'] = $arrayDetails['LeadName']; + $newLeadDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $newLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_DETAILS, $newLeadDetails); + // this if for insert lead details + if($this->db->affected_rows() == '1'){ + // get and store insert id from db + $track_Details['LeadID']=$this->db->insert_id(); + $track_Details['ActivityStatus'] = $activityDetails->ActivityID; + $track_Details['University'] = $arrayDetails['University']; + $track_Details['Course'] = $arrayDetails['Course']; + $track_Details['AssignedTo'] = $arrayDetails['CreatedBy']; + $track_Details['StatusCode'] = $arrayDetails['StatusCode']; + $track_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $track_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING, $track_Details); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $insertfollowup_Details['TrackingID']=$this->db->insert_id(); + $insertfollowup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $insertfollowup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $insertfollowup_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $insertfollowup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $insertfollowup_Details); + // this if for insert follow up details + + } + + + } + + } + + + }*/ + + + } + + return true; + } + + /* + * get university details + * created by kms + * */ + public function getUniversityDetails() + { + $this->db->select('UniversityID,UniversityName'); + $this->db->where('IsActive','1'); + $this->db->order_by('UniversityID','ASC'); + $unviversityDetails = $this->db->get(UNIVERSITY); + + if($unviversityDetails->result()){ + $result_university = array(); + $result_university['universityStatus'] = true; + foreach ($unviversityDetails->result() as $row) + { + + $university_array['universityID'] = $row->UniversityID; + $university_array['universityName'] = $row->UniversityName; + $university_array['courseDetails']= $this->getCourseDetails($row->UniversityID); + $result_array[]=$university_array; + } + $result_university['univerSityDetails']= $result_array; + } + else { + $result_university['universityStatus'] = false; + $result_university['message'] = "No records found!"; + $result_university['universityID'] = ""; + $result_university['universityName'] = ""; + $result_university['courseDetails']= ""; + } + + + return $result_university; + + } + /* + * get course details + * @params university id + * created by kms + * */ + public function getCourseDetails($universityID=null) + { + $this->db->select('CourseID,CONCAT(CourseName, "(",CourseCode,")") AS CourseName'); + $this->db->where('UniversityID',$universityID); + $this->db->where('IsActive','1'); + $this->db->order_by('CourseID','ASC'); + $courseDetails = $this->db->get(COURSE); + return $courseDetails->result(); + } + /* + * get fees details assign for student + * created by kms + * */ + public function getFeesStructureAssign($student=null){ + + $this->db->select('ID,CourseID,ProgramType,FeesAmount,Sem_Year'); + $this->db->where('CourseID',$student['CourseID']); + $this->db->order_by('ProgramType'); + $feesDetails = $this->db->get(COURSE_FEES); + $SNoValue=0; + if($feesDetails->result()){ + + $result_array['feesStatus']=true; + foreach ($feesDetails->result() as $row){ + $SNoValue=$SNoValue+1; + $this->db->select('SFS.FeesID,SFS.CourseFees,SFS.STFOrWR,SFS.Waiver,SFS.Others,SFS.SessionName,SFS.ToSessionName,SFS.RollNo,SFS.BatchCode,SM.SessionName as MasterSessionName,SM1.SessionName as MasterToSessionName'); + $this->db->from(STUDENTS_FEES_STATUS.' as SFS'); + $this->db->join(SESSIONMASTER.' as SM', 'SM.SessionID = SFS.SessionName'); + $this->db->join(SESSIONMASTER.' as SM1', 'SM1.SessionID = SFS.ToSessionName','left'); + $this->db->where('StudentID',$student['StudentID']); + $this->db->where('CourseID',$student['CourseID']); + $this->db->where('FeesType',$row->ID); + $existFeesDetails = $this->db->get(); + if($existData=$existFeesDetails->result()){ + $fetchData['SNo']=$SNoValue; + $fetchData['ExistValue']=1; + $fetchData['ID']=$row->ID; + $fetchData['CourseID']=$row->CourseID; + $fetchData['ProgramType']=$row->ProgramType; + $fetchData['Sem_Year']=$row->Sem_Year; + $fetchData['ActualFees']=$existData[0]->CourseFees; + $fetchData['BatchCode']=$existData[0]->BatchCode; + $fetchData['STFOrWR']=$existData[0]->STFOrWR; + $fetchData['Waiver']=$existData[0]->Waiver; + $fetchData['Others']=$existData[0]->Others; + $fetchData['SessionName']=$existData[0]->SessionName; + $fetchData['ToSessionName']=$existData[0]->ToSessionName; + $fetchData['MasterSessionName']=$existData[0]->MasterSessionName; + if($existData[0]->MasterToSessionName=='' OR $existData[0]->MasterToSessionName==null){ + $fetchData['MasterToSessionName']="Not Applicable"; + } + else{ + $fetchData['MasterToSessionName']=$existData[0]->MasterToSessionName; + } + + $fetchData['RollNo']=$existData[0]->RollNo; + $fetchData['PayableFees']=$existData[0]->CourseFees+$existData[0]->STFOrWR+$existData[0]->Others-$existData[0]->Waiver; + // for installment details + $InstallemtResult = $this->getInstallmentDetails($existData[0]->FeesID); + + if($InstallemtResult != false){ + $fetchData['InstallmentDetails']=$InstallemtResult; + } + else{ + + $fetchData['InstallmentDetails']=""; + + + } + $batchDetails = $this->getBatchDetails($existData[0]->BatchCode,$student['CourseID'],$student['StudentID'],$row->ID); + if($batchDetails!=false){ + $fetchData['batchDetails']=$batchDetails; + } + else{ + $fetchData['batchDetails']=""; + } + + $CourseFeesArray[]=$fetchData; + + } + else{ + $fetchData['SNo']=$SNoValue; + $fetchData['ExistValue']=0; + $fetchData['ID']=$row->ID; + $fetchData['CourseID']=$row->CourseID; + $fetchData['ProgramType']=$row->ProgramType; + $fetchData['Sem_Year']=$row->Sem_Year; + $fetchData['ActualFees']=$row->FeesAmount; + $fetchData['BatchCode']=""; + $fetchData['STFOrWR']=""; + $fetchData['Waiver']=""; + $fetchData['Others']=""; + $fetchData['SessionName']=""; + $fetchData['ToSessionName']=""; + $fetchData['MasterSessionName']="Not Applicable"; + $fetchData['MasterToSessionName']="Not Applicable"; + $fetchData['RollNo']=""; + $fetchData['PayableFees']=$row->FeesAmount; + // for installment details + $fetchData['InstallmentDetails']=""; + $batchDetails = $this->getBatchDetails('',$student['CourseID'],$student['StudentID'],''); + if($batchDetails!=false){ + $fetchData['batchDetails']=$batchDetails; + } + else{ + $fetchData['batchDetails']=""; + } + + $CourseFeesArray[]=$fetchData; + + } + + } + + $defaultCourseDetails = $this->defaultCourseFeesDetails($student); + if($defaultCourseDetails!=false){ + $result_array['feesDetails']=array_merge($CourseFeesArray,$defaultCourseDetails); + } + else{ + $result_array['feesDetails']=$CourseFeesArray; + } + + + + } + + else{ + $result_array['feesStatus']=false; + } + + $result_array['sessionDetails'] = $this->getSession($student); + + return $result_array; + + } + /* + * get installment details + * created by kms + * */ + public function getInstallmentDetails($installment=null){ + $this->db->select('ID,FeesID,Name,Amount,DueDate'); + $this->db->where('FeesID',$installment); + $this->db->order_by('ID','ASC'); + $installmentDetails = $this->db->get(FEES_INSTALLMENT); + if($installmentDetails->result()){ + return $installmentDetails->result(); + } + else{ + return false; + } + + } + + /* + * get batch details + * created by kms + * */ + public function getBatchDetails($batchCode=null,$courseID=null,$studentID=null,$feesType=null){ + if($batchCode=='' OR $batchCode==null){ + $this->db->select('BA.BatchCode,BA.BatchName,BA.BatchDate,BA.IsDefault,US.UniversityID,US.UniversityName,BA.IsActive'); + $this->db->from(COURSE.' as CU'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = CU.UniversityID'); + $this->db->join(BATCH.' as BA', 'BA.UniversityID = US.UniversityID'); + $this->db->order_by('BA.CreatedOn','DESC'); + $this->db->where('CU.CourseID',$courseID); + $this->db->where('BA.IsActive','1'); + $batchDetails = $this->db->get(); + if($batchDetails->result()){ + + return $batchDetails->result(); + } + else { + return false; + } + } + else{ + + + $this->db->distinct(); + $this->db->select('BA.BatchCode,BA.BatchName,BA.BatchDate,BA.IsDefault,US.UniversityID,US.UniversityName,BA.IsActive'); + $this->db->from(COURSE.' as CU'); + $this->db->join(STUDENTS_FEES_STATUS.' as STF', 'STF.CourseID = CU.CourseID'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = CU.UniversityID'); + $this->db->join(BATCH.' as BA', 'BA.UniversityID = US.UniversityID'); + $this->db->order_by('BA.CreatedOn','DESC'); + $this->db->where('CU.CourseID',$courseID); + $this->db->where('STF.StudentID',$studentID); + $this->db->where('STF.FeesType',$feesType); + $batchDetails = array(); + + /* $this->db->or_where('BA.IsActive','1'); + $this->db->or_where('STF.BatchCode =',$batchCode);*/ + $existDetails = $this->db->get(); + if($existDetails->result()){ + foreach ($existDetails->result() as $row){ + if($row->IsActive=='1' || $row->BatchCode==$batchCode){ + array_push($batchDetails,$row); + } + + } + } + if($batchDetails){ + + return $batchDetails; + } + else { + return false; + } + + + + } + + } + + /* + * get default pc,tc,dc,mc,other fees + * created by kms + * */ + public function defaultCourseFeesDetails($student=null){ + + // check student fees paid details for get default course fees + + $this->db->select('ifnull(SUM((SFS.CourseFees)),0) as CourseFees,ifnull(SUM((SFS.STFOrWR)),0) as STFOrWR,ifnull(SUM((SFS.Others)),0) as Others,ifnull(SUM((SFS.Waiver)),0) as Waiver'); + $this->db->from(STUDENTS_FEES_STATUS.' as SFS'); + $this->db->join(COURSE_FEES.' as CF', 'CF.ID = SFS.FeesType'); + $this->db->where('SFS.CourseID',$student['CourseID']); + $this->db->where('SFS.StudentID',$student['StudentID']); + $feesAmount = $this->db->get()->result(); + + $this->db->select('ifnull(SUM((SFP.BillAmount)),0) as PaidAmount'); + $this->db->from(STUDENTS_FEES_PAID.' as SFP'); + $this->db->join(STUDENTS_FEES_STATUS.' as SFS', 'SFS.FeesID = SFP.FeesId'); + $this->db->where('SFS.CourseID',$student['CourseID']); + $this->db->where('SFS.StudentID',$student['StudentID']); + $paidAmount = $this->db->get()->result(); + + if($feesAmount[0]->CourseFees+$feesAmount[0]->STFOrWR+$feesAmount[0]->Others-$feesAmount[0]->Waiver <= $paidAmount[0]->PaidAmount AND $feesAmount[0]->CourseFees !='0'){ + $valid=1; + } + else{ + $valid=0; + } + // get default course fees with paid + $this->db->select('CourseID,CourseName,PC,TC,DC,MC,OtherFees'); + $this->db->where('CourseID',$student['CourseID']); + $endFeesDetails = $this->db->get(COURSE); + $myArray = array(); + if($endFeesDetails->result()){ + foreach ($endFeesDetails->result() as $value ){ + $pc_array = array('CourseID'=>$value->CourseID,'Sem_Year'=>'PC', 'ActualFees'=>$value->PC); + $tc_array = array('CourseID'=>$value->CourseID,'Sem_Year'=>'TC', 'ActualFees'=>$value->TC); + $dc_array = array('CourseID'=>$value->CourseID,'Sem_Year'=>'DC', 'ActualFees'=>$value->DC); + $mc_array = array('CourseID'=>$value->CourseID,'Sem_Year'=>'MC', 'ActualFees'=>$value->MC); + $other_array = array('CourseID'=>$value->CourseID,'Sem_Year'=>'OTHER', 'ActualFees'=>$value->OtherFees); + + array_push($myArray,$pc_array); + array_push($myArray,$tc_array); + array_push($myArray,$dc_array); + array_push($myArray,$mc_array); + array_push($myArray,$other_array); + } + + // default course fees details in student status + foreach ($myArray as $row1){ + $this->db->select('FeesID,CourseFees,STFOrWR,Waiver,Others,SessionName,ToSessionName,RollNo'); + $this->db->where('StudentID',$student['StudentID']); + $this->db->where('CourseID',$student['CourseID']); + $this->db->where('FeesType',$row1['Sem_Year']); + $existFeesDetails = $this->db->get(STUDENTS_FEES_STATUS); + + if($existData=$existFeesDetails->result()){ + $fetchData['Valid']=$valid; + $fetchData['ExistValue']=1; + $fetchData['ID']=$row1['Sem_Year']; + $fetchData['CourseID']=$row1['CourseID']; + $fetchData['ProgramType']=$row1['Sem_Year']; + $fetchData['Sem_Year']=$row1['Sem_Year']; + $fetchData['ActualFees']=$existData[0]->CourseFees; + $fetchData['STFOrWR']=$existData[0]->STFOrWR; + $fetchData['Waiver']=$existData[0]->Waiver; + $fetchData['Others']=$existData[0]->Others; + $fetchData['SessionName']=$existData[0]->SessionName; + $fetchData['ToSessionName']=$existData[0]->ToSessionName; + $fetchData['MasterSessionName']="Not applicable"; + $fetchData['MasterToSessionName']="Not applicable"; + $fetchData['RollNo']=$existData[0]->RollNo; + $fetchData['PayableFees']=$existData[0]->CourseFees+$existData[0]->STFOrWR+$existData[0]->Others-$existData[0]->Waiver; + // for installment details + $InstallemtResult = $this->getInstallmentDetails($existData[0]->FeesID); + if($InstallemtResult != false){ + $fetchData['InstallmentDetails']=$InstallemtResult; + } + else{ + + $fetchData['InstallmentDetails']=""; + + + } + + $CourseFeesArray1[]=$fetchData; + + } + else{ + + $fetchData['Valid']=$valid; + + $fetchData['ExistValue']=0; + + $fetchData['ID']=$row1['Sem_Year']; + + $fetchData['CourseID']=$row1['CourseID']; + $fetchData['Sem_Year']=$row1['Sem_Year']; + $fetchData['ActualFees']=$row1['ActualFees']; + $fetchData['STFOrWR']=""; + $fetchData['Waiver']=""; + $fetchData['Others']=""; + $fetchData['SessionName']="Not applicable"; + $fetchData['ToSessionName']="Not applicable"; + $fetchData['MasterSessionName']="Not applicable"; + $fetchData['MasterToSessionName']="Not applicable"; + $fetchData['RollNo']=""; + $fetchData['PayableFees']=$row1['ActualFees']; + $fetchData['InstallmentDetails']=""; + $CourseFeesArray1[]=$fetchData; + + } + + } + + return $CourseFeesArray1; + } + else { + return false; + } + /* } + else{ + return false; + }*/ + + + + } + + /* + * set fees for student + * created by kms + * */ + public function setFees($details=null,$jsonData=null){ + $this->db->select('FeesID'); + $this->db->where('CourseID', $details['CourseID']); + $this->db->where('StudentID', $details['StudentID']); + $this->db->where('FeesType', $details['FeesType']); + $checkExist=$this->db->get(STUDENTS_FEES_STATUS); + if($checkExist->result()){ + $feesId = $checkExist->result(); + $updateDetails['SessionName'] = $details['SessionName']; + $updateDetails['ToSessionName'] = $details['ToSessionName']; + $updateDetails['BatchCode'] = $details['BatchCode']; + $updateDetails['RollNo'] = $details['RollNo']; + $updateDetails['STFOrWR'] = $details['STFOrWR']; + $updateDetails['Waiver'] = $details['Waiver']; + $updateDetails['Others'] = $details['Others']; + $updateDetails['UpdatedOn'] = $details['CreatedOn']; + $updateDetails['UpdatedBy'] = $details['CreatedBy']; + + $installmentFeesID = $feesId[0]->FeesID; + foreach ($jsonData as $jrow){ + + $insertInstallment['FeesID'] = $installmentFeesID; + $insertInstallment['Name'] = $jrow['Name']; + $insertInstallment['Amount'] = $jrow['Amount']; + $insertInstallment['DueDate'] = $jrow['DueDate']; + $insertInstallment['CreatedBy'] = $details['CreatedBy']; + $insertInstallment['CreatedOn'] = $details['CreatedOn']; + if($jrow['ID'] =='' OR $jrow['ID'] =='undefined'){ + $this->db->insert(FEES_INSTALLMENT, $insertInstallment); + } + else{ + $updateInstallment['FeesID'] = $installmentFeesID; + $updateInstallment['Name'] = $jrow['Name']; + $updateInstallment['Amount'] = $jrow['Amount']; + $updateInstallment['DueDate'] = $jrow['DueDate']; + $updateInstallment['UpdatedBy'] = $details['CreatedBy']; + $updateInstallment['UpdatedOn'] = $details['CreatedOn']; + $this->db->where('ID',$jrow['ID']); + $this->db->update(FEES_INSTALLMENT, $updateInstallment); + + + } + + + } + + $this->db->where('FeesID', $feesId[0]->FeesID); + $this->db->update(STUDENTS_FEES_STATUS, $updateDetails); + $result['setStatus'] = true; + $result['message'] = "Successfully fees details is updated."; + + } + else{ + $this->db->insert(STUDENTS_FEES_STATUS, $details); + + $this->db->select('FeesID'); + $this->db->where('CourseID', $details['CourseID']); + $this->db->where('StudentID', $details['StudentID']); + $this->db->where('FeesType', $details['FeesType']); + $existDb=$this->db->get(STUDENTS_FEES_STATUS)->last_row(); + if($existDb){ + $rowId = $existDb; + $installmentFeesID = $rowId->FeesID; + foreach ($jsonData as $jrow){ + $insertInstallment['FeesID'] = $installmentFeesID; + $insertInstallment['Name'] = $jrow['Name']; + $insertInstallment['Amount'] = $jrow['Amount']; + $insertInstallment['DueDate'] = $jrow['DueDate']; + $insertInstallment['CreatedBy'] = $details['CreatedBy']; + $insertInstallment['CreatedOn'] = $details['CreatedOn']; + if($jrow['ID'] =='' OR $jrow['ID'] =='undefined'){ + $this->db->insert(FEES_INSTALLMENT, $insertInstallment); + } + else{ + $updateInstallment['FeesID'] = $installmentFeesID; + $updateInstallment['Name'] = $jrow['Name']; + $updateInstallment['Amount'] = $jrow['Amount']; + $updateInstallment['DueDate'] = $jrow['DueDate']; + $updateInstallment['UpdatedBy'] = $details['CreatedBy']; + $updateInstallment['UpdatedOn'] = $details['CreatedOn']; + + $this->db->where('ID',$jrow['ID']); + $this->db->update(FEES_INSTALLMENT, $updateInstallment); + + + } + + + } + + + } + + $result['setStatus'] = true; + $result['message'] = "Successfully fees details is added."; + + } + return $result; + + } + /* + * insert day book master while fees update + * created by kms + * */ + public function insertDayBookMaster($data=null,$paymentID){ + $this->db->select('Firstname'); + $this->db->where('StudentID', $data['StudentID']); + $getStudentName=$this->db->get(STUDENTS)->result(); + if($getStudentName){ + // this is for income entry + $insertArray['Date'] = $data['BillDate']; + $insertArray['CreatedBy'] = $data['CreatedBy']; + $insertArray['CreatedOn'] = $data['CreatedOn']; + $insertArray['Description'] = $data['InternalComments']; + $insertArray['PaidDescription'] = ""; + $insertArray['Amount'] = $data['BillAmount']; + $insertArray['Status'] = 'Approved'; + $insertArray['PaymentStatus'] = false; + $insertArray['FeesPaymentID'] = $paymentID; + $insertArray['VoucherNumber'] = $data['BillNO']; + $insertArray['PaidTo'] = $getStudentName[0]->Firstname; + $insertArray['BranchCode'] = $data['UpdatedBy']; + $insertArray['ModeOfPayment'] = $data['ModeOfPayment']; + + $this->db->select('ID,TypeID'); + $this->db->where('TypeID', 'I002'); + $this->db->where('TypeName', 'FEES'); + $getIncome=$this->db->get(INCOMEOUTCOMEMASTER)->last_row(); + + if($getIncome){ + $insertArray['Name'] = $getIncome->TypeID; + $insertArray['Type'] = $getIncome->ID; + $checkInsertIn=$this->add_dayBook($insertArray); + if($checkInsertIn['addDayBookStatus']==true AND $data['ModeOfPayment']!='CASH'){ + // this is for expense come entry + $now1 = new DateTime(); + $now1->setTimezone(new DateTimezone('Asia/Kolkata')); + + $expenseArray['Date'] = $data['BillDate']; + $expenseArray['CreatedBy'] = $data['CreatedBy']; + $expenseArray['CreatedOn'] = $now1->format('Y-m-d H:i:s');; + $expenseArray['Description'] = $data['InternalComments']; + $expenseArray['PaidDescription'] = ""; + $expenseArray['Amount'] = $data['BillAmount']; + $expenseArray['Status'] = 'Pending'; + $expenseArray['PaymentStatus'] = false; + $expenseArray['FeesPaymentID'] = $paymentID; + $expenseArray['VoucherNumber'] = $data['BillNO']; + $expenseArray['PaidTo'] = $getStudentName[0]->Firstname; + $expenseArray['BranchCode'] = $data['UpdatedBy']; + $expenseArray['ModeOfPayment'] = $data['ModeOfPayment']; + $this->db->select('ID,TypeID'); + $this->db->where('TypeID', 'I001'); + $this->db->where('TypeName', 'FEES'); + $getOutcome=$this->db->get(INCOMEOUTCOMEMASTER)->last_row(); + + if($getOutcome){ + $expenseArray['Name'] = $getOutcome->TypeID; + $expenseArray['Type'] = $getOutcome->ID; + /* $this->db->insert(DAYBOOKMASTER, $expenseArray);*/ + $checkInsertOut=$this->add_dayBook($expenseArray); + + } + + } + + + } + + return true; + } + else{ + return false; + } + + + + + + } + /* + * send notification for student + * created by kms + * */ + public function studentNotification(){ + $date = new DateTime(date("d-m-Y")); + $date->modify('+2 day'); + $tomorrowDATE = $date->format('d-m-Y'); + + $this->db->select('FIN.ID,FIN.Name,FIN.FeesID,FIN.Amount,FIN.DueDate,SFS.StudentID,SFS.CourseID'); + $this->db->from(FEES_INSTALLMENT.' as FIN'); + $this->db->join(STUDENTS_FEES_STATUS.' as SFS', 'FIN.FeesID = SFS.FeesID'); + $this->db->join(STUDENTS_FEES_PAID.' as SFP', 'SFP.FeesId = FIN.FeesID','left'); + $this->db->where('FIN.DueDate',$tomorrowDATE); + $getStudentDetails = $this->db->get(); + + if ($getStudentDetails->result()){ + foreach ($getStudentDetails->result() as $row){ + $this->db->select('ifnull(SUM((SFP.BillAmount)),0) as BillAmount'); + $this->db->from(STUDENTS_FEES_PAID.' as SFP'); + $this->db->join(STUDENTS_FEES_STATUS.' as SFS', 'SFP.FeesId = SFS.FeesID'); + $this->db->where('SFS.CourseID',$row->CourseID); + $this->db->where('SFS.StudentID',$row->StudentID); + $getStudentPaiDetails = $this->db->get()->result(); + + if($row->Amount > $getStudentPaiDetails[0]->BillAmount){ + $this->smssend($row->StudentID,$row->DueDate); + } + + } + } + $date1 = new DateTime(date("d-m-Y")); + $date1->modify('+7 day'); + $afterFiveDays = $date1->format('d-m-Y'); + $this->db->select('FIN.ID,FIN.Name,FIN.FeesID,FIN.Amount,FIN.DueDate,SFS.StudentID,SFS.CourseID'); + $this->db->from(FEES_INSTALLMENT.' as FIN'); + $this->db->join(STUDENTS_FEES_STATUS.' as SFS', 'FIN.FeesID = SFS.FeesID'); + $this->db->join(STUDENTS_FEES_PAID.' as SFP', 'SFP.FeesId = FIN.FeesID','left'); + $this->db->where('FIN.DueDate',$afterFiveDays); + $getStudentDetails1 = $this->db->get(); + if ($getStudentDetails1->result()){ + foreach ($getStudentDetails1->result() as $row1){ + $this->db->select('ifnull(SUM((SFP.BillAmount)),0) as BillAmount'); + $this->db->from(STUDENTS_FEES_PAID.' as SFP'); + $this->db->join(STUDENTS_FEES_STATUS.' as SFS', 'SFP.FeesId = SFS.FeesID'); + $this->db->where('SFS.CourseID',$row1->CourseID); + $this->db->where('SFS.StudentID',$row1->StudentID); + $getStudentPaiDetails1 = $this->db->get()->result(); + if($row1->Amount < $getStudentPaiDetails1[0]->BillAmount){ + $this->smssend($row1->StudentID,$row1->DueDate); + } + + } + } + + // this is for update details in call track after due date + $yesterdayDate = new DateTime(date("d-m-Y")); + $yesterdayDate->modify('-1 day'); + $preDATE = $yesterdayDate->format('d-m-Y'); + $this->db->distinct(); + $this->db->select('FIN.ID,FIN.Name,FIN.FeesID,FIN.Amount,FIN.DueDate,SFS.StudentID,SFS.CourseID'); + $this->db->from(FEES_INSTALLMENT.' as FIN'); + $this->db->join(STUDENTS_FEES_STATUS.' as SFS', 'FIN.FeesID = SFS.FeesID'); + $this->db->join(STUDENTS_FEES_PAID.' as SFP', 'SFP.FeesId = FIN.FeesID','left'); + $this->db->where('FIN.DueDate',$preDATE); + $getStudentDetails2 = $this->db->get(); + if ($getStudentDetails2->result()){ + foreach ($getStudentDetails2->result() as $row2){ + $this->db->select('ifnull(SUM((SFP.BillAmount)),0) as BillAmount'); + $this->db->from(STUDENTS_FEES_PAID.' as SFP'); + $this->db->join(STUDENTS_FEES_STATUS.' as SFS', 'SFP.FeesId = SFS.FeesID'); + $this->db->where('SFS.CourseID',$row2->CourseID); + $this->db->where('SFS.StudentID',$row2->StudentID); + $getStudentPaiDetails2 = $this->db->get()->result(); + + if($row2->Amount > $getStudentPaiDetails2[0]->BillAmount){ + + + $this->updateFeesStatusInCallTrack($row2->StudentID,$row2->CourseID); + } + + + } + } + + + + return true; + } + + /* + * this is for sms send + * created by kms + * */ + public function smssend($studentID=null,$date=null) + { + + $studentDetails = $this->get_registered_mobile($studentID); + $msg ="Dear $studentDetails->Firstname, Fees Payment for your course is falling due on $date. Please ignore if already paid."; + + $mobile = "91$studentDetails->MobileNumber"; + // $message ="Your new password for logging into Apollo student portal is SAMPLE. Please change the password as soon as you login."; + // $mobile = "91$mobile"; + + $message = urlencode($msg); + $ch=curl_init(); + curl_setopt($ch,CURLOPT_URL,"https://smsapi.24x7sms.com/api_2.0/SendSMS.aspx?APIKEY=xegCdYUIMf3&MobileNo=".$mobile."&SenderID=APOLLO&Message=".$message."&ServiceName=TEMPLATE_BASED"); + + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + $output =curl_exec($ch); + + // print_r($output);exit(); + curl_close($ch); + return $output; + } + + // self function for getting registered mobile for sms + public function get_registered_mobile($num) { + $this->db->select('MobileNumber,Firstname'); + $this->db->from(STUDENTS); + $this->db->where('StudentID', $num); + $roleDetails = $this->db->get()->first_row(); + return $roleDetails; + } + /* + * update followup details for fees pending in call tracking + * created by kms + * */ + public function updateFeesStatusInCallTrack($studentID=null,$courseID=null){ + $now = new DateTime(); + $now->setTimezone(new DateTimezone('Asia/Kolkata')); + $currentDate = new DateTime(date("d-m-Y")); + $afterFormatedDate = $currentDate->format('d-m-Y'); + // get student details + + $this->db->select('PLD.ListCode'); + $this->db->from(PICK_LIST_DETAILS.' as PLD'); + $this->db->where('PLD.ListName','PENDING'); + $this->db->where('PLD.IsActive','1'); + $checkStatus=$this->db->get()->last_row(); + if($checkStatus){ + + + $studentDetails = $this->studentInfoForFeesStatus($studentID,$courseID); + + if($studentDetails){ + $arrayDetails['MobileNumber']=$studentDetails->MobileNumber; + $arrayDetails['LeadName']=$studentDetails->Firstname; + $arrayDetails['University']=$studentDetails->UniversityName; + $arrayDetails['Course']=$studentDetails->CourseName; + $arrayDetails['StatusCode']=$checkStatus->ListCode; + $arrayDetails['CreatedBranch']=$studentDetails->BranchID; + $arrayDetails['CreatedOn']=$now->format('Y-m-d H:i:s'); + $arrayDetails['FollowupOn']=$afterFormatedDate; + $arrayDetails['FollowupComments']="Fees payment for your course is falling."; + // get created by with branch id + + $this->db->select('LO.ID'); + $this->db->from(STAFF_BRANCH.' as STB'); + $this->db->join(LOGIN.' as LO', 'LO.StaffID = STB.StaffID'); + $this->db->where('STB.BranchCode',$studentDetails->BranchID); + $this->db->where('LO.ListCode',ADMIN); + $this->db->where('STB.IsActive','1'); + $this->db->where('LO.IsActive','1'); + $assignDet=$this->db->get()->last_row(); + if($assignDet){ + $arrayDetails['CreatedBy']=$assignDet->ID; + } + else{ + $arrayDetails['CreatedBy']=''; + } + + // create activity in call tracking + $this->db->select('ActivityID,ActivityName'); + $this->db->like('ActivityName', 'Fees', 'after'); + $this->db->where('IsActive', '1'); + $activityDetails=$this->db->get(ACTIVITY)->last_row(); + if($activityDetails){ + + $newLeadDetails['MobileNumber'] = $arrayDetails['MobileNumber']; + $newLeadDetails['LeadName'] = $arrayDetails['LeadName']; + $newLeadDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $newLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_DETAILS, $newLeadDetails); + // this if for insert lead details + if($this->db->affected_rows() == '1'){ + // get and store insert id from db + $track_Details['LeadID']=$this->db->insert_id(); + $track_Details['ActivityStatus'] = $activityDetails->ActivityID; + $track_Details['University'] = $arrayDetails['University']; + $track_Details['Course'] = $arrayDetails['Course']; + $track_Details['AssignedTo'] = $arrayDetails['CreatedBy']; + $track_Details['StatusCode'] = $arrayDetails['StatusCode']; + $track_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $track_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $track_Details['CreatedBranch']=$arrayDetails['CreatedBranch']; + $this->db->insert(LEAD_TRACKING, $track_Details); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $insertfollowup_Details['TrackingID']=$this->db->insert_id(); + $insertfollowup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $insertfollowup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $insertfollowup_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $insertfollowup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $insertfollowup_Details); + // this if for insert follow up details + + } + + + } + + // hide call track update code + + /*$this->db->select('LD.LeadID,LT.TrackingID'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->where('LD.MobileNumber',$arrayDetails['MobileNumber']); + $this->db->where('LT.ActivityStatus',$activityDetails->ActivityID); + $this->db->like('LT.University',$arrayDetails['University'],'after'); + $this->db->like('LT.Course',$arrayDetails['Course'],'after'); + $leadDet=$this->db->get()->last_row(); + + if($leadDet){ + + $this->db->select('FollowupOn'); + $this->db->where('TrackingID',$leadDet->TrackingID); + $existFollowupOn = $this->db->get(LEAD_TRACKING_FOLLOWUP)->last_row(); + + // upate tracking status + $changeStatusCode['StatusCode'] = $arrayDetails['StatusCode']; + $changeStatusCode['UpdatedBy'] = $arrayDetails['CreatedBy']; + $changeStatusCode['UpdatedOn'] = $arrayDetails['CreatedOn']; + $changeStatusCode['CreatedBranch']=$arrayDetails['CreatedBranch']; + + $this->db->where('TrackingID',$leadDet->TrackingID); + $this->db->update(LEAD_TRACKING, $changeStatusCode); + // end update status + $updateTrackDetails['TrackingID'] = $leadDet->TrackingID; + $updateTrackDetails['FollowupOn'] = $arrayDetails['FollowupOn']; + $updateTrackDetails['FollowupComments'] = $arrayDetails['FollowupComments']; + $updateTrackDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $updateTrackDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $updateTrackDetails); + + } + + else{ + $this->db->select('LeadID'); + $this->db->where('MobileNumber',$arrayDetails['MobileNumber']); + $checkLeadDet=$this->db->get(LEAD_DETAILS)->last_row(); + if($checkLeadDet){ + $updateLeadDetails['LeadID'] = $checkLeadDet->LeadID; + $updateLeadDetails['ActivityStatus'] = $activityDetails->ActivityID; + $updateLeadDetails['University'] = $arrayDetails['University']; + $updateLeadDetails['Course'] = $arrayDetails['Course']; + $updateLeadDetails['AssignedTo'] = $arrayDetails['CreatedBy']; + $updateLeadDetails['StatusCode'] = $arrayDetails['StatusCode']; + $updateLeadDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $updateLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $updateLeadDetails['CreatedBranch']=$arrayDetails['CreatedBranch']; + $this->db->insert(LEAD_TRACKING, $updateLeadDetails); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $followup_Details['TrackingID']=$this->db->insert_id(); + $followup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $followup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $followup_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $followup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $followup_Details); + // this if for insert follow up details + + } + + } + else{ + $newLeadDetails['MobileNumber'] = $arrayDetails['MobileNumber']; + $newLeadDetails['LeadName'] = $arrayDetails['LeadName']; + $newLeadDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $newLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_DETAILS, $newLeadDetails); + // this if for insert lead details + if($this->db->affected_rows() == '1'){ + // get and store insert id from db + $track_Details['LeadID']=$this->db->insert_id(); + $track_Details['ActivityStatus'] = $activityDetails->ActivityID; + $track_Details['University'] = $arrayDetails['University']; + $track_Details['Course'] = $arrayDetails['Course']; + $track_Details['AssignedTo'] = $arrayDetails['CreatedBy']; + $track_Details['StatusCode'] = $arrayDetails['StatusCode']; + $track_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $track_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $track_Details['CreatedBranch']=$arrayDetails['CreatedBranch']; + $this->db->insert(LEAD_TRACKING, $track_Details); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $insertfollowup_Details['TrackingID']=$this->db->insert_id(); + $insertfollowup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $insertfollowup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $insertfollowup_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $insertfollowup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $insertfollowup_Details); + // this if for insert follow up details + + } + + + } + + } + + + }*/ + + + } + } + + return true; + } + else{ + return false; + } + } + + /* + * get student info for fees due updates + * created by kms + * */ + public function studentInfoForFeesStatus($studentID=null,$courseID=null){ + + $this->db->select('ST.Firstname,ST.MobileNumber,US.UniversityName,CU.CourseName,STC.BranchID'); + $this->db->from(STUDENTCOURSE.' as STC'); + $this->db->join(STUDENTS.' as ST', 'ST.StudentID = STC.StudentID'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = STC.CourseID'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = STC.UniversityID'); + $this->db->where('ST.StudentID',$studentID); + $this->db->where('STC.CourseID',$courseID); + $leadDet=$this->db->get()->last_row(); + if($leadDet){ + return $leadDet; + } + else{ + return false; + } + + } + + /* + * Get session master details + * created by kms + * */ + + public function getSession($details=null) + { + $this->db->select('SM.SessionID,SM.SessionDate,SM.SessionName,SM.IsActive'); + $this->db->from(SESSIONMASTER.' as SM'); + $this->db->join(SESSIONDETAILS.' as SD', 'SM.SessionID = SD.SessionID'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = SD.UniversityID'); + $this->db->join(COURSE.' as CU', 'CU.UniversityID = US.UniversityID'); + // $this->db->where('SD.IsActive','1'); + $this->db->order_by('CU.CreatedOn','DESC'); + $this->db->where('CU.CourseID',$details['CourseID']); + // $this->db->group_by('SM.SessionName','DESC'); + $sessionDetails = $this->db->get(); + if($sessionDetails->result()){ + + return $sessionDetails->result(); + } + else { + return false; + } + + } + /* + * Entry for all status update + * created by kms + * */ + public function entryForAllStatus($feesDetails=null,$courseID=null){ + $singleFeesDetails=["SEM 1","SEM 2","SEM 3","SEM 4","SEM 5","SEM 6","SEM 7","SEM 8"]; + // get pick list expected status + $this->db->select('ListCode,ListName'); + $this->db->where('ListName','EXPECTED'); + $this->db->where('IsActive','1'); + $existStatusDetails = $this->db->get(PICK_LIST_DETAILS)->last_row(); + if($existStatusDetails){ + //check if exist + $this->db->select('SFS.FeesID,SFS.FeesType'); + $this->db->from(STUDENTS_FEES_PAID.' as SFP'); + $this->db->join(STUDENTS_FEES_STATUS.' as SFS', 'SFS.FeesID = SFP.FeesId'); + $this->db->where('SFS.CourseID',$courseID); + $this->db->where('SFS.StudentID',$feesDetails['StudentID']); + $this->db->where('SFP.FeesId',$feesDetails['FeesId']); + $existDetails = $this->db->get(); + if($existDetails->num_rows()>1){ + return true; + } + else{ + $fetchData = $existDetails->result(); + if($fetchData[0]->FeesType!=PC AND $fetchData[0]->FeesType!=DC AND $fetchData[0]->FeesType!=TC AND $fetchData[0]->FeesType!=MC AND $fetchData[0]->FeesType!=OTHER) { + $this->db->select('SFS.FeesType,CF.Sem_Year,CF.ProgramType'); + $this->db->from(STUDENTS_FEES_STATUS.' as SFS'); + $this->db->join(COURSE_FEES.' as CF', 'CF.ID = SFS.FeesType'); + $this->db->where('SFS.CourseID',$courseID); + $this->db->where('SFS.StudentID',$feesDetails['StudentID']); + $this->db->where('SFS.FeesID',$feesDetails['FeesId']); + $getFeesTypeDetails = $this->db->get(); + + if($getFeesTypeDetails->result()){ + $insertDetails=array(); + + foreach ($getFeesTypeDetails->result() as $row){ + + // this array for study material and answer booklet update + $insertStudyBook['StudentID']=$feesDetails['StudentID']; + $insertStudyBook['CourseID']=$row->FeesType; + $insertStudyBook['BranchCode']=$feesDetails['UpdatedBy']; + $insertStudyBook['ListCode']=$existStatusDetails->ListCode; + $insertStudyBook['Comments']=$feesDetails['CommentsForStudent']; + $insertStudyBook['Coursedetail']=$feesDetails['StudentID']; + $insertStudyBook['CreatedBy']=$feesDetails['CreatedBy']; + $insertStudyBook['CreatedOn']=$feesDetails['CreatedOn']; + // this array for mark card updates + $insertMark['StudentID']=$feesDetails['StudentID']; + $insertMark['CourseID']=$row->FeesType; + $insertMark['BranchCode']=$feesDetails['UpdatedBy']; + $insertMark['ListCode']=$existStatusDetails->ListCode; + $insertMark['Comments']=$feesDetails['CommentsForStudent']; + $insertMark['Coursedetail']=$feesDetails['StudentID']; + $insertMark['CreatedBy']=$feesDetails['CreatedBy']; + $insertMark['CreatedOn']=$feesDetails['CreatedOn']; + $insertMark['CertificationType']="MARK CARD"; + + if($row->ProgramType==REGULARFEES OR $row->ProgramType==LATERALFEES){ + foreach ($singleFeesDetails as $Fees){ + + $insertStudyBook['Sem']=$Fees; + // insert study material details + $this->db->insert(STUDY_MATERIAL_STATUS, $insertStudyBook); + // insert answer booklet details + $this->db->insert(ANSWER_BOOKLET, $insertStudyBook); + + // insert mark card details + $insertMark['Sem']=$Fees; + $this->db->insert(CERTIFICATION_STATUS, $insertMark); + } + + + } + else{ + $insertStudyBook['Sem']=$row->Sem_Year; + // insert study material details + $this->db->insert(STUDY_MATERIAL_STATUS, $insertStudyBook); + // insert answer booklet details + $this->db->insert(ANSWER_BOOKLET, $insertStudyBook); + // insert mark card details + $insertMark['Sem']=$row->Sem_Year; + $this->db->insert(CERTIFICATION_STATUS, $insertMark); + + } + + } + + } + } + + else{ + $this->db->select('CertificationID'); + $this->db->where('CertificateName',$fetchData[0]->FeesType); + $this->db->where('IsActive','1'); + $getEndFeesDetails = $this->db->get(CERTIFICATION_MASTER)->last_row(); + if($getEndFeesDetails){ + // this array for document update + $insertDocs['StudentID']=$feesDetails['StudentID']; + $insertDocs['CourseID']=$courseID; + $insertDocs['BranchCode']=$feesDetails['UpdatedBy']; + $insertDocs['ListCode']=$existStatusDetails->ListCode; + $insertDocs['Comments']=$feesDetails['CommentsForStudent']; + $insertDocs['CreatedBy']=$feesDetails['CreatedBy']; + $insertDocs['CreatedOn']=$feesDetails['CreatedOn']; + $insertDocs['CertificationType']=$getEndFeesDetails->CertificationID; + // insert application details + $this->db->insert(APPLICATION_STATUS,$insertDocs); + + } + + + + } + + + + } + + return true; + } + + else{ + return false; + } + } + + // add dayBook + public function add_dayBook($Arr) + { + $branch = $Arr['BranchCode']; + $sql = "SELECT * FROM ".DAYBOOKMASTER." WHERE BranchCode = '$branch' + ORDER BY ID DESC + LIMIT 1"; + $prevBalance = 0; + $latestUpdate = $this->db->query($sql); + $latestUpdateDetails = $latestUpdate->result(); + + If(is_array($latestUpdateDetails) && count($latestUpdateDetails)>0) + { + $prevBalance = $latestUpdateDetails[0]->Balance; + }else{ + } + + if($Arr['Name'] == 'I002') { + //Income + $Arr['Balance'] = $prevBalance + $Arr['Amount']; + }else if ($Arr['Name'] == 'I001') { + //Expense + $Arr['Balance'] = $prevBalance - $Arr['Amount']; + } else { + $Arr['Balance'] = 0; + } + + $this->db->insert(DAYBOOKMASTER, $Arr); + if ($this->db->affected_rows() == '1') { + $result['addDayBookStatus'] = true; + $result['message'] = "Successfully DayBook Details Added"; + } else { + $result['addDayBookStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + return $result; + } + + +} \ No newline at end of file diff --git a/api/application/models/Forgot_model.php b/api/application/models/Forgot_model.php new file mode 100644 index 0000000..cbeada8 --- /dev/null +++ b/api/application/models/Forgot_model.php @@ -0,0 +1,77 @@ + 7594aacdb21d8a9b29f71ea9163a5730 + */ + // + function forget($user=null, $password) + { + $this->db->select('ID,Emailid,MobileNumber,Password'); + $this->db->from(LOGIN); + $this->db->where('MobileNumber', $user['MobileNumber']); + $forgotDetails1 = $this->db->get()->first_row(); + // echo $forgotDetails->MobileNumber;exit(); + // $result = $query->result_array(); + if($forgotDetails1){ + $this->db->select('ID,Emailid,MobileNumber,Password'); + $this->db->from(LOGIN); + $this->db->where('MobileNumber', $user['MobileNumber']); + $this->db->where('IsActive', 1); + $forgotDetails = $this->db->get()->first_row(); + if($forgotDetails) { + $existUserID=$forgotDetails->ID; + $this->db->where('ID', $existUserID); + $upatePassword=$this->db->update('T_Login', $user); + // print_r ($upatePassword) ; + //exit(); + if($upatePassword) { + $this->smssend($user['MobileNumber'], $password); + $result['forgotstatus'] = true; + $result['resPass'] = "Check your registered Mobile Number!!"; + $result['message'] = "Password updated successfully"; + } + else{ + $result['forgotstatus'] = false; + $result['message'] = "Something went wrong!"; + } + } else { + $result['forgotstatus'] = false; + $result['message'] = "This user in InActive state!"; + } + } + else { + $result['forgotstatus'] = false; + $result['message'] = "User is not exist!"; + } + return $result; + } + + // http://www.24x7sms.com/downloads/24X7SMS_http_API2.0.pdf + // API Key : xegCdYUIMf3 + + // Your new password for logging into Apollo student portal is (Password). Please change the password as soon as you login. + // This is the template to be used. + + public function smssend($mobile,$messa) + { + $message ="Your new password for logging into Apollo student portal is $messa. Please change the password as soon as you login."; + $mobile = "91$mobile"; + + $message = urlencode($message); + $ch=curl_init(); + curl_setopt($ch,CURLOPT_URL,"https://smsapi.24x7sms.com/api_2.0/SendSMS.aspx?APIKEY=xegCdYUIMf3&MobileNo=".$mobile."&SenderID=APOLLO&Message=".$message."&ServiceName=TEMPLATE_BASED"); + + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + $output =curl_exec($ch); + + // print_r($output);exit(); + curl_close($ch); + return $output; + } +} \ No newline at end of file diff --git a/api/application/models/Hallticket_model.php b/api/application/models/Hallticket_model.php new file mode 100644 index 0000000..3b86a25 --- /dev/null +++ b/api/application/models/Hallticket_model.php @@ -0,0 +1,7 @@ + e99a18c428cb38d5f260853678922e03 + */ + + public function login($mobile = null, $password = null) + { + $this->db->select('t1.MobileNumber, t1.Password,t1.ListCode'); + $this->db->from('' . LOGIN . ' as t1'); + $this->db->where('t1.MobileNumber', $mobile); + // $this->db->join('' . STAFF . ' as t2', 't1.StaffID = t2.StaffID', 'LEFT'); + $this->db->where('t1.IsActive', 1); + //$this->db->where('t2.IsActive', 1); + $loginDetails = $this->db->get(LOGIN)->first_row(); + // print_r($loginDetails);exit(); + if ($loginDetails) { + if ($mobile == $loginDetails->MobileNumber) { + + if ($password == $loginDetails->Password) { + if($loginDetails->ListCode == SUPER_ADMIN){ + //print_r($loginDetails);exit(); + $this->db->select('t1.MobileNumber, t1.ListCode, t1.ID, t2.BranchCode, t2.FinanceModuleAccess'); + $this->db->from('' . LOGIN . ' as t1'); + $this->db->join('' . STAFF . ' as t2', 't1.StaffID = t2.StaffID', 'LEFT'); + $this->db->where('t1.MobileNumber', $mobile); + $this->db->where('t2.IsActive', 1); + $responseDetails = $this->db->get()->first_row(); + if($responseDetails){ + if ($responseDetails->ListCode == SUPER_ADMIN) { + // For First time Super admin login, will set all branch detail + $result['loginStatus'] = true; + $responseDetails->BranchCode = 'All'; + $result['details'] = $responseDetails; + } else { + $result['loginStatus'] = true; + $result['details'] = $responseDetails; + } + } + else{ + $result['loginStatus'] = false; + $result['message'] = "Your login is de-activated."; + } + } else if ($loginDetails->ListCode == ADMIN || $loginDetails->ListCode == EMPLOYEE) { + //print_r($loginDetails);exit(); + $this->db->select('t1.MobileNumber, t3.ListCode, t1.ID, t3.BranchCode, t3.FinanceModuleAccess'); + $this->db->from('' . LOGIN . ' as t1'); + $this->db->join('' . STAFF . ' as t2', 't1.StaffID = t2.StaffID', 'LEFT'); + $this->db->join('' . STAFF_BRANCH . ' as t3', 't3.StaffID = t2.StaffID', 'LEFT'); + $this->db->where('t1.MobileNumber', $mobile); + $this->db->where('t2.IsActive', 1); + $this->db->where('t3.IsActive', 1); + $this->db->order_by('t3.CreatedOn', 'ASC'); + $this->db->group_by('t3.StaffID'); + $responseDetails = $this->db->get()->first_row(); + if($responseDetails){ + $result['loginStatus'] = true; + $result['details'] = $responseDetails; + } + else{ + $result['loginStatus'] = false; + $result['message'] = "Your login is de-activated."; + } + } + else if($loginDetails->ListCode == STUDENT){ + $this->db->select('LO.MobileNumber, LO.ListCode, LO.ID,ST.BranchCode, ST.LoginAccess'); + $this->db->from('' . LOGIN . ' as LO'); + $this->db->join('' . STUDENTS . ' as ST', 'LO.StaffID = ST.StudentID'); + $this->db->where('LO.MobileNumber', $mobile); + $this->db->where('ST.IsActive', 1); + $responseDetails = $this->db->get()->first_row(); + + if($responseDetails){ + if($responseDetails->LoginAccess == 1){ + $result['loginStatus'] = true; + $result['details'] = $responseDetails; + } else { + $result['loginStatus'] = false; + $result['message'] = "Your login is de-activated."; + } + } + else{ + $result['loginStatus'] = false; + $result['message'] = "Your login is de-activated."; + } + } + else{ + $result['loginStatus'] = false; + $result['message'] = "Your login is de-activated or don't have login."; + } + } else { + $result['loginStatus'] = false; + $result['message'] = "Please Enter Valid Password !!"; + } + } else { + $result['loginStatus'] = false; + $result['message'] = "Please Enter Register Mobile Number !!"; + } + } else { + $result['loginStatus'] = false; + $result['message'] = "Your login is de-activated or don't have login."; + } + + /*$this->db->join('areas a', 'a.id = e.id_area', 'inner'); + $this->db->join('horario h', 'h.id = e.id_horario', 'inner'); + $this->db->join('dia d', 'd.id = e.id_data', 'inner'); + $this->db->join('tipo_evento t', 't.id = e.id_tipo', 'inner'); + $this->db->join('campus c', 'c.id = e.id_unidade', 'inner'); + if ( $id != null ){ + $this->db->where('e.id', $id); + return $this->db->get('eventos')->first_row(); + } else { + return $this->db->get('eventos')->result(); + }*/ + return $result; + + } + + public function change_Password( $userId, $newPassword, $oldPassword, $updateOn) { + $this->db->select('Password'); + $this->db->from(LOGIN); + $this->db->where('ID', $userId); + $loginDetails = $this->db->get()->first_row(); + if ($loginDetails->Password == $oldPassword) { + $sql = "UPDATE ".LOGIN." SET Password='$newPassword', UpdatedBy='$userId', UpdatedOn='$updateOn' WHERE ID='$userId'"; + if($this->db->query($sql) == '1'){ + $result['changePassStatus'] = true; + $result['message'] = "Your Password Successfully changed !!"; + } else { + $result['changePassStatus'] = false; + $result['message'] = "Please try Again !!"; + } + } else { + $result['changePassStatus'] = false; + $result['message'] = "Your Current Password miss match, Please try Again !!"; + } + return $result; + } +} \ No newline at end of file diff --git a/api/application/models/Reports_model.php b/api/application/models/Reports_model.php new file mode 100644 index 0000000..c1e7012 --- /dev/null +++ b/api/application/models/Reports_model.php @@ -0,0 +1,338 @@ +db->query($sql); + $statusDetails = $leadDet->result(); + if (count($statusDetails) > 0) { + $results['statusList'] = true; + $results['statusr'] = $statusDetails; + } else { + $results['statusList'] = false; + $results['message'] = 'No record found'; + } + + return $results; + + } + public function batch(){ + + + $sql = "SELECT BatchCode as batch,BatchName as bname FROM T_BatchMaster + group by batch;"; + $b=$this->db->query($sql); + $batch = $b->result(); + if (count($batch) > 0) { + $results['batchlist'] = true; + $results['batch'] = $batch; + } else { + $results['batchlist'] = false; + $results['message'] = 'No record found'; + } + $sql = "SELECT BranchCode as brcode,BranchName as bname FROM T_BranchMaster"; + $b=$this->db->query($sql); + $batch = $b->result(); + if (count($batch) > 0) { + $results['branchlist'] = true; + $results['branch'] = $batch; + } else { + $results['branchlist'] = false; + $results['message'] = 'No record found'; + } + $sql = "SELECT UniversityID as uid,UniversityName as uname FROM T_UniversityMaster"; + $b=$this->db->query($sql); + $batch = $b->result(); + if (count($batch) > 0) { + $results['univlist'] = true; + $results['univ'] = $batch; + } else { + $results['univlist'] = false; + $results['message'] = 'No record found'; + } + return $results; + + } + public function mstatus($bat=null,$br=null,$u=null){ + + $sql = "select @s:=@s+1 sl,sms.sid as ssid,std.name as name,std.father as father,br.bname as bname,ifnull(b.batch,'-') as batch,std.phone as phone,sms.cid as scid,sfp.bdate as bdate,list.status as status,u.uname as uname,cm.course as course,sms.sem as sem,sms.cdate as cdate,sfs.batch as fbatch,sfs.cid as fcid,cfd.syear as syear,sum(sfs.cf) as crsfee,sum(sfs.stf) as stf,sum(sfs.others) as others,(sum(sfs.cf) + sum(sfs.stf) + sum(sfs.others)) as total,ifnull(sfp.bamount,0) as bamount,(sum(sfs.cf) + (sum(sfs.stf) + sum(sfs.others)) - ifnull(sfp.bamount,0)) as balance + from + (SELECT StudentID as sid,CourseID as cid,BranchCode as branch,CDate as cdate,ListCode as lcode,Comments as cmts,Sem as sem FROM T_CertificationStatus) as sms + left join + (SELECT FeesID as fid,BatchCode as batch,StudentID as sid,CourseID as cid,FeesType as ftype,sum(CourseFees) as cf,Sum(STFOrWR) as stf,sum(Others) as others FROM T_Students_Fees_Status + group by sid,batch) as sfs on sfs.sid=sms.sid + left join + (SELECT StudentID as sid,FeesId as fid,BillDate as bdate,sum(BillAmount) as bamount + FROM T_Students_Fees_PaidDetails, (SELECT @s:= 0) AS s + group by sid,fid,bdate) as sfp on sfp.sid=sfs.sid and sfp.fid=sfs.fid + left join + (SELECT ID as cid,CourseID as ccid,FeesType as ftype,Sem_Year as syear FROM T_Course_Fees_Details) as cfd + on cfd.cid=sms.cid + left join + (SELECT CourseID as cid,UniversityID as uid,CourseName as course FROM T_CourseMaster) as cm + on cm.cid=sfs.cid + left join + (SELECT UniversityID as uid,UniversityName as uname FROM T_UniversityMaster) as u + on u.uid=cm.uid + left join + (SELECT ListCode as lcode,ListName as status FROM T_PickListDetails) as list + on list.lcode=sms.lcode + left join + (SELECT StudentID as sid,MobileNumber as phone,FirstName as name,Fathername as father FROM T_StudentDetails) as std on std.sid=sms.sid + left join + (SELECT BatchCode as bcode,BatchName as batch FROM T_BatchMaster) as b on b.bcode=sfs.batch + left join + (SELECT BranchCode as brcode,BranchName as bname FROM T_BranchMaster) as br on br.brcode=sms.branch + where std.name != 'null' + "; + if ($br!= ''){ + + $sql.=" and sms.branch = '".$br."'"; + + } + if ($bat!= ''){ + + $sql.=" and b.bcode = '".$bat."'"; + + } + if ($u!= ''){ + + $sql.=" and u.uid = '".$u."'"; + + } + $sql.=" group by ssid,sem,fbatch"; + $sql.=" order by sl"; + $leadDet=$this->db->query($sql); + $mstatusDetails = $leadDet->result(); + if (count($mstatusDetails) > 0) { + $results['mstatusList'] = true; + $results['mstatusr'] = $mstatusDetails; + } else { + $results['mstatusList'] = false; + $results['mmessage'] = 'No record found'; + } + + return $results; + + } + public function certificate_status($bat=null,$br=null,$u=null){ + + $sql = "select @s:=@s+1 sl,sms.sid as ssid,std.name as name,std.father as father,br.bname as bname,ifnull(b.batch,'-') as batch,std.phone as phone,sms.cid as scid,sfp.bdate as bdate,list.status as status,u.uname as uname,cm.course as course,sms.cert_name as cert_name,sms.sem as sem,sms.cdate as cdate,sfs.batch as fbatch,sfs.cid as fcid,cfd.syear as syear,sum(sfs.cf) as crsfee,sum(sfs.stf) as stf,sum(sfs.others) as others,(sum(sfs.cf) + sum(sfs.stf) + sum(sfs.others)) as total,ifnull(sfp.bamount,0) as bamount,(sum(sfs.cf) + (sum(sfs.stf) + sum(sfs.others)) - ifnull(sfp.bamount,0)) as balance + from + (SELECT StudentID as sid,CourseID as cid,CertificationType as cert_name,BranchCode as branch,CDate as cdate,ListCode as lcode,Comments as cmts,Sem as sem FROM T_CertificationStatus) as sms + left join + (SELECT FeesID as fid,BatchCode as batch,StudentID as sid,CourseID as cid,FeesType as ftype,sum(CourseFees) as cf,Sum(STFOrWR) as stf,sum(Others) as others FROM T_Students_Fees_Status + group by sid,batch) as sfs on sfs.sid=sms.sid + left join + (SELECT StudentID as sid,FeesId as fid,BillDate as bdate,sum(BillAmount) as bamount + FROM T_Students_Fees_PaidDetails, (SELECT @s:= 0) AS s + group by sid,fid,bdate) as sfp on sfp.sid=sfs.sid and sfp.fid=sfs.fid + left join + (SELECT ID as cid,CourseID as ccid,FeesType as ftype,Sem_Year as syear FROM T_Course_Fees_Details) as cfd + on cfd.cid=sms.cid + left join + (SELECT CourseID as cid,UniversityID as uid,CourseName as course FROM T_CourseMaster) as cm + on cm.cid=sfs.cid + left join + (SELECT UniversityID as uid,UniversityName as uname FROM T_UniversityMaster) as u + on u.uid=cm.uid + left join + (SELECT ListCode as lcode,ListName as status FROM T_PickListDetails) as list + on list.lcode=sms.lcode + left join + (SELECT StudentID as sid,MobileNumber as phone,FirstName as name,Fathername as father FROM T_StudentDetails) as std on std.sid=sms.sid + left join + (SELECT BatchCode as bcode,BatchName as batch FROM T_BatchMaster) as b on b.bcode=sfs.batch + left join + (SELECT BranchCode as brcode,BranchName as bname FROM T_BranchMaster) as br on br.brcode=sms.branch + where std.name != 'null' + "; + if ($br!= ''){ + + $sql.=" and sms.branch = '".$br."'"; + + } + if ($bat!= ''){ + + $sql.=" and b.bcode = '".$bat."'"; + + } + if ($u!= ''){ + + $sql.=" and u.uid = '".$u."'"; + + } + $sql.=" group by ssid,sem,fbatch"; + $sql.=" order by sl"; + $leadDet=$this->db->query($sql); + $cert_statusDetails = $leadDet->result(); + if (count($cert_statusDetails) > 0) { + $results['cert_statusList'] = true; + $results['cert_status'] = $cert_statusDetails; + } else { + $results['cert_statusList'] = false; + $results['cert_message'] = 'No record found'; + } + + return $results; + + } + public function mark_cert_status($bat=null,$br=null,$u=null,$from=null,$to=null){ + + $sql = "select @s:=@s+1 sl,sms.sid as ssid,std.name as name,std.father as father,br.bname as bname,ifnull(b.batch,'-') as batch,std.phone as phone,sms.cmts as cmts,sms.cid as scid,sfp.bdate as bdate,list.status as status,u.uname as uname,cm.course as course,sms.cert_name as cert_name,sms.sem as sem,sms.cdate as cdate,sfs.batch as fbatch,sfs.cid as fcid,cfd.syear as syear,sum(sfs.cf) as crsfee,sum(sfs.stf) as stf,sum(sfs.others) as others,(sum(sfs.cf) + sum(sfs.stf) + sum(sfs.others)) as total,ifnull(sfp.bamount,0) as bamount,(sum(sfs.cf) + (sum(sfs.stf) + sum(sfs.others)) - ifnull(sfp.bamount,0)) as balance + from + (SELECT StudentID as sid,CourseID as cid,CertificationType as cert_name,BranchCode as branch,CDate as cdate,ListCode as lcode,Comments as cmts,Sem as sem FROM T_CertificationStatus) as sms + left join + (SELECT FeesID as fid,BatchCode as batch,StudentID as sid,CourseID as cid,FeesType as ftype,sum(CourseFees) as cf,Sum(STFOrWR) as stf,sum(Others) as others FROM T_Students_Fees_Status + group by sid,batch) as sfs on sfs.sid=sms.sid + left join + (SELECT StudentID as sid,FeesId as fid,BillDate as bdate,sum(BillAmount) as bamount + FROM T_Students_Fees_PaidDetails, (SELECT @s:= 0) AS s + group by sid,fid,bdate) as sfp on sfp.sid=sfs.sid and sfp.fid=sfs.fid + left join + (SELECT ID as cid,CourseID as ccid,FeesType as ftype,Sem_Year as syear FROM T_Course_Fees_Details) as cfd + on cfd.cid=sms.cid + left join + (SELECT CourseID as cid,UniversityID as uid,CourseName as course FROM T_CourseMaster) as cm + on cm.cid=sfs.cid + left join + (SELECT UniversityID as uid,UniversityName as uname FROM T_UniversityMaster) as u + on u.uid=cm.uid + left join + (SELECT ListCode as lcode,ListName as status FROM T_PickListDetails) as list + on list.lcode=sms.lcode + left join + (SELECT StudentID as sid,MobileNumber as phone,FirstName as name,Fathername as father FROM T_StudentDetails) as std on std.sid=sms.sid + left join + (SELECT BatchCode as bcode,BatchName as batch FROM T_BatchMaster) as b on b.bcode=sfs.batch + left join + (SELECT BranchCode as brcode,BranchName as bname FROM T_BranchMaster) as br on br.brcode=sms.branch + where std.name != 'null' + "; + if ($br!= ''){ + + $sql.=" and sms.branch = '".$br."'"; + + } + if ($bat!= ''){ + + $sql.=" and b.bcode = '".$bat."'"; + + } + if ($u!= ''){ + + $sql.=" and u.uid = '".$u."'"; + + } + if ($from and $to != ''){ + $fromd= date("Y-m-d",strtotime($from)); + $tod=date("Y-m-d",strtotime($to)); + + $sql.="and sms.cdate >= '".$fromd."' + and sms.cdate <= '".$tod."'"; + + } + $sql.=" group by ssid,sem,fbatch"; + $sql.=" order by sl"; + + $leadDet=$this->db->query($sql); + $mcert_statusDetails = $leadDet->result(); + if (count($mcert_statusDetails) > 0) { + $results['markcert_statusList'] = true; + $results['markcert_status'] = $mcert_statusDetails; + } else { + $results['markcert_statusList'] = false; + $results['markcert_message'] = 'No record found'; + } + + return $results; + + } + public function expense($from=null,$to=null){ + + $sql = "SELECT exp.TypeName as exp_name,sum(dbm.Amount) as amount FROM T_Income_Outcome_Master exp + join T_DayBookMaster dbm on dbm.Type=exp.ID + where dbm.Name = 'I001' + "; + + if ($from and $to != ''){ + $fromd= date("d-m-Y",strtotime($from)); + $tod=date("d-m-Y",strtotime($to)); + + $sql.="and dbm.Date >= '".$fromd."' + and dbm.Date <= '".$tod."'"; + + } + $sql.=" group by exp_name"; + + + $leadDet=$this->db->query($sql); + $expense = $leadDet->result(); + if (count($expense) > 0) { + $results['expense_list'] = true; + $results['expense'] = $expense; + } else { + $results['expense_list'] = false; + $results['expense_message'] = 'No record found'; + } + + return $results; + + } + + +} \ No newline at end of file diff --git a/api/application/models/SeesionMaster_model.php b/api/application/models/SeesionMaster_model.php new file mode 100644 index 0000000..5b83bc6 --- /dev/null +++ b/api/application/models/SeesionMaster_model.php @@ -0,0 +1,189 @@ +db->select('SessionName'); + $this->db->where('SessionName', $arrayDetails['SessionName']); + if($this->db->get(SESSIONMASTER)->first_row()){ + $result['sessionStatus'] = false; + $result['message'] ="This sessions is already exist."; + } + else{ + $insertMaster['SessionName']=$arrayDetails['SessionName']; + $insertMaster['SessionDate']=$arrayDetails['SessionDate']; + $insertMaster['CreatedBy']=$arrayDetails['CreatedBy']; + $insertMaster['IsActive']=$arrayDetails['IsActive']; + $insertMaster['CreatedOn']=$arrayDetails['CreatedOn']; + + $this->db->insert(SESSIONMASTER, $insertMaster); + + if ($this->db->affected_rows() == '1') { + $insertDetails['SessionID']=$this->db->insert_id(); + foreach ($university['UniversityID'] as $row1){ + $insertDetails['UniversityID']=$row1['UniversityID']; + $insertDetails['CreatedBy']=$arrayDetails['CreatedBy']; + $insertDetails['IsActive']=$arrayDetails['IsActive']; + $insertDetails['CreatedOn']=$arrayDetails['CreatedOn']; + $this->db->insert(SESSIONDETAILS, $insertDetails); + + } + + $result['sessionStatus'] = true; + $result['message'] = "Sessions added successfully"; + } else { + $result['sessionStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + } + + + + + return $result; + + } + + + /* + * Get session master details + * created by kms + * */ + + public function getSession() + { + $this->db->select('SM.SessionID,SM.SessionDate,SM.SessionName,GROUP_CONCAT(SD.UniversityID) as UniversityID,GROUP_CONCAT(SM.SessionID) as GrpID,SM.IsActive,GROUP_CONCAT(US.UniversityName) as UniversityName'); + $this->db->from(SESSIONMASTER.' as SM'); + $this->db->join(SESSIONDETAILS.' as SD', 'SM.SessionID = SD.SessionID'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = SD.UniversityID'); + $this->db->where('SD.IsActive','1'); + $this->db->order_by('SM.SessionID','DESC'); + $this->db->group_by('SM.SessionID','DESC'); + $sessionDetails = $this->db->get(); + if($sessionDetails->result()){ + + $result['sessionStatus'] = true; + $result['details'] = $sessionDetails->result(); + } + else { + $result['sessionStatus'] = false; + $result['message'] = "No records found!"; + } + // load batch model for get university details + $this->load->model('Batch_model', 'batch'); + $result['universityDetails'] = $this->batch->getUniversityDetails(); + + + return $result; + + } + + /* + * update session master details + * created by kms + * */ + public function updateSession($arrayDetails=null,$universityDetails=null) + { + $this->db->select('SessionName'); + $this->db->where('SessionName', $arrayDetails['SessionName']); + $this->db->where('SessionID !=', $arrayDetails['SessionID']); + if($this->db->get(SESSIONMASTER)->first_row()){ + $result['sessionStatus'] = false; + $result['message'] ="This sessions is already exist."; + } + else{ + $this->db->where('SessionID', $arrayDetails['SessionID']); + $upateStatus=$this->db->update(SESSIONMASTER, $arrayDetails); + + if($upateStatus){ + $deactiveStatus['IsActive']=false; + $deactiveStatus['UpdatedBy']=$arrayDetails['UpdatedBy']; + $deactiveStatus['UpdatedOn']=$arrayDetails['UpdatedOn']; + $this->db->where('SessionID ',$arrayDetails['SessionID']); + $updateActivityStatusDeactive = $this->db->update(SESSIONDETAILS, $deactiveStatus); + + if($updateActivityStatusDeactive){ + + if($universityDetails['University']){ + + foreach ($universityDetails['University'] as $urow){ + $this->db->select('ID'); + $this->db->where('SessionID',$arrayDetails['SessionID']); + $this->db->where('UniversityID',$urow); + if($this->db->get(SESSIONDETAILS)->first_row()){ + $existStatusUpdate['IsActive']=true; + $existStatusUpdate['UpdatedBy']=$arrayDetails['UpdatedBy']; + $existStatusUpdate['UpdatedOn']=$arrayDetails['UpdatedOn']; + $this->db->where('SessionID',$arrayDetails['SessionID']); + $this->db->where('UniversityID',$urow); + $this->db->update(SESSIONDETAILS, $existStatusUpdate); + } + else{ + $update_array["UniversityID"]=$urow; + $update_array["SessionID"]=$arrayDetails['SessionID']; + $update_array["IsActive"]=true; + $update_array["CreatedBy"]=$arrayDetails['UpdatedBy']; + $update_array["CreatedOn"]=$arrayDetails['UpdatedOn']; + $this->db->insert(SESSIONDETAILS, $update_array); + + } + + } + } + else{ + $activateStatus['IsActive']=true; + $this->db->where('SessionID ',$arrayDetails['SessionID']); + $this->db->update(SESSIONMASTER, $activateStatus); + + } + + + + $result['sessionStatus'] = true; + $result['message'] = "Sessions updated successfully"; + } + + + } else { + $result['sessionStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + } + + return $result; + + } + /* + * Get university details + * created by kms + * */ + public function getUniversityDetails()//doubt + { + $this->db->select('UniversityID,UniversityName'); + $this->db->order_by('UniversityID','ASC'); + $this->db->where('IsActive','1'); + // $this->db->where_not_in('ID', $id); + $universityDetails = $this->db->get(UNIVERSITY); + return $universityDetails->result(); + } + + + +} \ No newline at end of file diff --git a/api/application/models/SeesionSchedule_model.php b/api/application/models/SeesionSchedule_model.php new file mode 100644 index 0000000..f374aee --- /dev/null +++ b/api/application/models/SeesionSchedule_model.php @@ -0,0 +1,206 @@ +db->select('SCDate'); + $this->db->where('SCDate', $arrayDetails['SCDate']); + $this->db->where('SessionID', $arrayDetails['SessionID']); + if($this->db->get(SESSIONSCHEDULE)->first_row()){ + $result['sessionStatus'] = false; + $result['message'] ="This same session/date is already exist."; + } + else{ + $insertMaster['SCDate']=$arrayDetails['SCDate']; + $insertMaster['SessionID']=$arrayDetails['SessionID']; + $insertMaster['CreatedBy']=$arrayDetails['CreatedBy']; + $insertMaster['IsActive']=$arrayDetails['IsActive']; + $insertMaster['CreatedOn']=$arrayDetails['CreatedOn']; + + $this->db->insert(SESSIONSCHEDULE, $insertMaster); + + if ($this->db->affected_rows() == '1') { + $insertDetails['SessionID']=$this->db->insert_id(); + foreach ($Timings['Timings'] as $row1){ + $insertDetails['StartTime']=$row1['startTime']; + $insertDetails['EndTime']=$row1['endTime']; + $insertDetails['CreatedBy']=$arrayDetails['CreatedBy']; + $insertDetails['IsActive']=$arrayDetails['IsActive']; + $insertDetails['CreatedOn']=$arrayDetails['CreatedOn']; + $this->db->insert(SESSIONSCHEDULEDETAILS, $insertDetails); + + } + + $result['sessionStatus'] = true; + $result['message'] = "Schedules added successfully"; + } else { + $result['sessionStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + } + + + + + return $result; + + } + + + /* + * Get session schedule master details + * created by kms + * */ + + public function getSessionSchedule() + { + $this->db->select('SS.SCID,SM.SessionName,SM.SessionID,SS.IsActive,SS.SCDate'); + $this->db->from(SESSIONSCHEDULE.' as SS'); + $this->db->join(SESSIONMASTER.' as SM', 'SS.SessionID = SM.SessionID'); + // $this->db->where('SM.IsActive','1'); + $this->db->order_by('SS.SCID','DESC'); + $sessionDetails = $this->db->get(); + $result_array = array(); + if($sessionDetails->result()){ + + foreach ($sessionDetails->result() as $row) + { + $scheduleDetails['SCID'] = $row->SCID; + $scheduleDetails['SessionName'] = $row->SessionName; + $scheduleDetails['SessionID'] = $row->SessionID; + $scheduleDetails['SCDate'] = $row->SCDate; + // $scheduleDetails['ScheduleDate'] = $row->SCDate; + $scheduleDetails['IsActive'] = $row->IsActive; + $scheduleDetails['ScheduleDetails'] = $this->getSessionScheduleDetails($row->SCID); + $result[]=$scheduleDetails; + + } + + $result_array['sessionStatus'] = true; + $result_array['details'] = $result; + } + else { + $result_array['sessionStatus'] = false; + $result_array['message'] = "No records found!"; + } + + $result_array['sessionMaster'] = $this->getSessionMasterDetails(); + + + return $result_array; + + } + + /* + * get schedule details + * created by kms + * */ + + public function getSessionScheduleDetails($scheduleID=null) + { + $this->db->select('SD.StartTime,SD.EndTime,SD.SSD as ScheduleID'); + $this->db->from(SESSIONSCHEDULEDETAILS.' as SD'); + $this->db->join(SESSIONSCHEDULE.' as SS', 'SS.SCID = SD.SessionID'); + $this->db->where('SD.SessionID',$scheduleID); + $this->db->group_by('SD.SSD','ASC'); + $sessionDetails = $this->db->get(); + return $sessionDetails->result(); + + } + + + + /* + * update session schedule details + * created by kms + * */ + public function updateSessionSchedule($arrayDetails=null,$Timings=null) + { + + $this->db->select('SessionID'); + $this->db->where('SessionID', $arrayDetails['SessionID']); + $this->db->where('SCDate', $arrayDetails['SCDate']); + $this->db->where('SCID !=', $arrayDetails['SCID']); + if($this->db->get(SESSIONSCHEDULE)->first_row()){ + $result['sessionStatus'] = false; + $result['message'] ="This same session/date is already exist."; + } + else{ + $this->db->where('SCID', $arrayDetails['SCID']); + $upateStatus=$this->db->update(SESSIONSCHEDULE, $arrayDetails); + + if($upateStatus){ + + if($Timings['Timings']){ + + foreach ($Timings['Timings'] as $urow){ + if($urow['scheduleID']==''){ + $insertDetails['SessionID']=$arrayDetails['SCID']; + $insertDetails['StartTime']=$urow['startTime']; + $insertDetails['EndTime']=$urow['endTime']; + $insertDetails['IsActive']=$arrayDetails['IsActive']; + $insertDetails['CreatedBy']=$arrayDetails['UpdatedBy']; + $insertDetails['CreatedOn']=$arrayDetails['UpdatedOn']; + $this->db->insert(SESSIONSCHEDULEDETAILS, $insertDetails); + + } + else{ + $updateDetails['SessionID']=$arrayDetails['SCID']; + $updateDetails['StartTime']=$urow['startTime']; + $updateDetails['EndTime']=$urow['endTime']; + $updateDetails['IsActive']=$arrayDetails['IsActive']; + $updateDetails['UpdatedBy']=$arrayDetails['UpdatedBy']; + $updateDetails['UpdatedOn']=$arrayDetails['UpdatedOn']; + $this->db->where('SSD',$urow['scheduleID']); + $this->db->where('SessionID',$arrayDetails['SCID']); + $this->db->update(SESSIONSCHEDULEDETAILS, $updateDetails); + + } + + + } + } + $result['sessionStatus'] = true; + $result['message'] = "Schedules updated successfully"; + + } else { + $result['sessionStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + } + + return $result; + + } + /* + * Get session master details + * created by kms + * */ + public function getSessionMasterDetails()//doubt + { + $this->db->select('SessionID,SessionName'); + $this->db->order_by('SessionID','DESC'); + $this->db->where('IsActive','1'); + $sessionDetails = $this->db->get(SESSIONMASTER); + return $sessionDetails->result(); + } + + + +} \ No newline at end of file diff --git a/api/application/models/StatusUpdation_model.php b/api/application/models/StatusUpdation_model.php new file mode 100644 index 0000000..6076a7d --- /dev/null +++ b/api/application/models/StatusUpdation_model.php @@ -0,0 +1,1068 @@ +get_status_list_code($reqDetails); + $subQuery = "SELECT P.ListCode , P.ListName + FROM ".PICK_LIST_DETAILS." as P LEFT JOIN ".DEFAULTACTIVITY." as SM ON SM.StatusCode = P.ListCode + WHERE + SM.StudentActivityCode = '$statusCode' + AND SM.IsActive = '1'"; + + $queryDetails = $this->db->query($subQuery); + // $this->db->select('ListCode, ListName'); + // $this->db->order_by('CreatedOn', 'DESC'); + // $this->db->from('T_PickListDetails'); + // $this->db->where('ListCode', 'S034'); + // $staDetails = $this->db->get(); + $statusDetails = $queryDetails->result(); + if (count($statusDetails) > 0) { + $results['statusList'] = true; + $results['statusList_details'] = $statusDetails; + } else { + $results['statusList'] = false; + $results['message'] = 'No record found'; + } + return $results; + } + + public function get_couser_name($cours) { + $this->db->select('t2.CourseName'); + // $this->db->from('' . COURSE_FEES . ' as t1'); + $this->db->from('' . COURSE . ' as t2'); + $this->db->where('t2.CourseID', $cours); + $roleDetails = $this->db->get()->first_row(); + return "$roleDetails->CourseName"; + } + + // update Application status + public function update_applicationStatus($arr,$reqDetails) { + $this->db->insert_batch(APPLICATION_STATUS, $arr); + if ($this->db->affected_rows() >= 1) { + if($this->get_ListCode_status($arr[0]['ListCode'])){ + $dateToMsg = $arr[0]['AppDate']; + $statuToMsg = $this->get_status_name_ListCode($arr[0]['ListCode']); + $cerNamtToMsg = $this->get_certificate_name($arr[0]['CertificationType']); + $getCourseName = $this->get_couser_name($arr[0]['CourseID']); + $mesg = "Status Update : $cerNamtToMsg $getCourseName - $statuToMsg $dateToMsg."; + $this->smssend($arr, $mesg); + } + // $result['addStatus'] = true; + // $result['message'] = "Successfully Certification Status Updated"; + $this->updateDocumentStatusInCallTrack($arr,$reqDetails); + $result['addStatus'] = true; + $result['message'] = "Successfully Documents Status Updated"; + } else { + $result['addStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + return $result; + } + + // update certificate stauts + public function update_certificateStatus($arr) { + // $this->get_status_name_ListCode($arr[0]['ListCode']); + // $dateToMsg = $arr[0]['CDate']; + // print_r($arr);exit(); + // echo $this->get_status_name_ListCode($arr[0]['ListCode']);exit(); + $this->db->insert_batch(CERTIFICATION_STATUS, $arr); + if ($this->db->affected_rows() >= 1) { + // if( ($this->get_status_name_ListCode($arr[0]['ListCode']) == 'Received' || 'received' || 'RECEIVED') || ($this->get_status_name_ListCode($arr[0]['ListCode']) == 'Issued' || 'issued' || 'ISSUED')) { + if($this->get_ListCode_status($arr[0]['ListCode'])){ + $dateToMsg = $arr[0]['CDate']; + $statuToMsg = $this->get_status_name_ListCode($arr[0]['ListCode']); + // $cerNamtToMsg = $this->get_certificate_name($arr[0]['CertificationType']); + $cerNamtToMsg = 'MARK CARD'; + $getSemYearMsg = $this->get_couser_sem_yr_msg($arr[0]['CourseID']); + $mesg = "Status Update : $cerNamtToMsg $getSemYearMsg - $statuToMsg $dateToMsg."; + + // $mesg = "Status Update : $cerNamtToMsg - $statuToMsg $dateToMsg."; + $this->smssend($arr, $mesg); + } + $result['addStatus'] = true; + $result['message'] = "Successfully Mark Card Status Updated"; + } else { + $result['addStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + return $result; + } + + // get certificate list + public function get_certificate_list() { + $this->db->select('*'); + $this->db->order_by('CreatedOn', 'DESC'); + $this->db->from(CERTIFICATION); + $this->db->where('IsActive', 1); + $cerfDetails = $this->db->get(); + $certificateDetails = $cerfDetails->result(); + if (count($certificateDetails) > 0) { + $results['certificateStatus'] = true; + $results['certificate_details'] = $certificateDetails; + } else { + $results['certificateStatus'] = false; + $results['message'] = 'No record found'; + } + return $results; + } + + + // self function for getting registered mobile for sms + public function get_registered_mobile($num) { + $this->db->select('MobileNumber'); + $this->db->from(STUDENTS); + $this->db->where('StudentID', $num); + $roleDetails = $this->db->get()->first_row(); + return $roleDetails->MobileNumber; + } + + // self function for getting the status for the LISTCODE + public function get_ListCode_status($listCode) { + // print_r ($listCode);exit(); + $this->db->select('ListName'); + $this->db->from(PICK_LIST_DETAILS); + $this->db->where('ListCode', $listCode); + // $this->db->or_like('ListName', 'RECEIVED'); + // $this->db->or_like('ListName', 'ISSUED'); + $statusDetails = $this->db->get()->first_row(); + // echo $statusDetails->ListName;exit(); + if ( $statusDetails->ListName == 'RECEIVED' || $statusDetails->ListName == 'ISSUED') { + return true; + } else { + return false; + } + } + + public function get_prev_status_list($reqDetailsFor, $reqDetails){ + if( $reqDetailsFor == 'STUDY_MATERIAL') { + $searchFor = 'M001'; + $searchTableFor = STUDY_MATERIAL_STATUS; + $this->db->select('t1.*, t4.Firstname, t5.ListName, t2.Sem_Year, t2.ProgramType'); + $this->db->from(''. $searchTableFor . ' as t1'); + $this->db->where('t1.StudentID', $reqDetails['student']); + $this->db->join('' . COURSE_FEES . ' as t2', 't2.ID = t1.CourseID', 'LEFT'); + $this->db->where('t2.CourseID', $reqDetails['CourseID']); + $this->db->join('' . LOGIN . ' as t3', 't3.ID = t1.CreatedBy', 'LEFT'); + $this->db->join('' . STAFF . ' as t4', 't4.StaffID = t3.StaffID', 'LEFT'); + $this->db->join('' . PICK_LIST_DETAILS . ' as t5', 't5.ListCode = t1.ListCode', 'LEFT'); + $this->db->order_by('t1.CreatedOn', 'DESC'); + $statusDetails = $this->db->get(); + $prevStatusDetails = $statusDetails->result(); + if (count($prevStatusDetails) > 0) { + $results['preStatusDetails'] = true; + $results['preStatus_details_list'] = $prevStatusDetails; + } else { + $results['preStatusDetails'] = false; + $results['message'] = 'No record found'; + } + } else if ( $reqDetailsFor == 'APPICATION_STATUS' ) { + $searchFor = 'A001'; + $searchTableFor = APPLICATION_STATUS; + $this->db->select('t1.*, t4.Firstname, t5.ListName, t6.CertificateName'); + $this->db->from(''. $searchTableFor . ' as t1'); + $this->db->where('t1.StudentID', $reqDetails['student']); + // $this->db->join('' . COURSE_FEES . ' as t2', 't2.ID = t1.CourseID', 'LEFT'); + // $this->db->where('t2.CourseID', $reqDetails['CourseID']); + $this->db->join('' . LOGIN . ' as t3', 't3.ID = t1.CreatedBy', 'LEFT'); + $this->db->join('' . STAFF . ' as t4', 't4.StaffID = t3.StaffID', 'LEFT'); + $this->db->join('' . PICK_LIST_DETAILS . ' as t5', 't5.ListCode = t1.ListCode', 'LEFT'); + $this->db->join('' . CERTIFICATION . ' as t6', 't6.CertificationID = t1.CertificationType', 'LEFT'); + $this->db->order_by('t1.CreatedOn', 'DESC'); + $statusDetails = $this->db->get(); + $prevStatusDetails = $statusDetails->result(); + if (count($prevStatusDetails) > 0) { + $results['preStatusDetails'] = true; + $results['preStatus_details_list'] = $prevStatusDetails; + } else { + $results['preStatusDetails'] = false; + $results['message'] = 'No record found'; + } + } else if ( $reqDetailsFor == 'CERTIFICATION_STATUS' ) { + $searchFor = 'C001'; + $searchTableFor = CERTIFICATION_STATUS; + $this->db->select('t1.*, t4.Firstname, t5.ListName, t2.Sem_Year, t2.ProgramType'); + $this->db->from(''. $searchTableFor . ' as t1'); + $this->db->where('t1.StudentID', $reqDetails['student']); + $this->db->join('' . COURSE_FEES . ' as t2', 't2.ID = t1.CourseID', 'LEFT'); + $this->db->where('t2.CourseID', $reqDetails['CourseID']); + $this->db->join('' . LOGIN . ' as t3', 't3.ID = t1.CreatedBy', 'LEFT'); + $this->db->join('' . STAFF . ' as t4', 't4.StaffID = t3.StaffID', 'LEFT'); + $this->db->join('' . PICK_LIST_DETAILS . ' as t5', 't5.ListCode = t1.ListCode', 'LEFT'); + // $this->db->join('' . CERTIFICATION . ' as t6', 't6.CertificationID = t1.CertificationType', 'LEFT'); + $this->db->order_by('t1.CreatedOn', 'DESC'); + $statusDetails = $this->db->get(); + $prevStatusDetails = $statusDetails->result(); + if (count($prevStatusDetails) > 0) { + $results['preStatusDetails'] = true; + $results['preStatus_details_list'] = $prevStatusDetails; + } else { + $results['preStatusDetails'] = false; + $results['message'] = 'No record found'; + } + } else if ( $reqDetailsFor == 'ANSWERBOOKLET_STATUS' ) { + $searchFor = 'B001'; + $searchTableFor = ANSWER_BOOKLET; + $this->db->select('t1.*, t4.Firstname, t5.ListName, t2.Sem_Year, t2.ProgramType'); + $this->db->from(''. $searchTableFor . ' as t1'); + $this->db->where('t1.StudentID', $reqDetails['student']); + $this->db->join('' . COURSE_FEES . ' as t2', 't2.ID = t1.CourseID', 'LEFT'); + $this->db->where('t2.CourseID', $reqDetails['CourseID']); + $this->db->join('' . LOGIN . ' as t3', 't3.ID = t1.CreatedBy', 'LEFT'); + $this->db->join('' . STAFF . ' as t4', 't4.StaffID = t3.StaffID', 'LEFT'); + $this->db->join('' . PICK_LIST_DETAILS . ' as t5', 't5.ListCode = t1.ListCode', 'LEFT'); + $this->db->order_by('t1.CreatedOn', 'DESC'); + $statusDetails = $this->db->get(); + $prevStatusDetails = $statusDetails->result(); + if (count($prevStatusDetails) > 0) { + $results['preStatusDetails'] = true; + $results['preStatus_details_list'] = $prevStatusDetails; + } else { + $results['preStatusDetails'] = false; + $results['message'] = 'No record found'; + } + } + return $results; + } + + public function get_status_name_ListCode($listCode) { + $this->db->select('ListName'); + $this->db->from(PICK_LIST_DETAILS); + $this->db->where('ListCode', $listCode); + $statusDetails = $this->db->get()->first_row(); + return $statusDetails->ListName; + } + + // self function for getting certificate name for the CERTIFICATECODE + public function get_certificate_name($listCode) { + $this->db->select('CertificateName'); + $this->db->from(CERTIFICATION); + $this->db->where('CertificationID', $listCode); + $cerfDetails = $this->db->get()->first_row(); + return $cerfDetails->CertificateName; + } + + // update answer booklet status + public function update_answerbooklet($arr,$reqDetails) { + // print_r($arr);exit(); + $this->db->insert_batch(ANSWER_BOOKLET, $arr); + if ($this->db->affected_rows() >= 1) { + $this->updateBookletStatusInCallTrack($arr,$reqDetails); + // $this->smssend($arr); + $result['addStatus'] = true; + $result['message'] = "Successfully Answer Booklet Status Updated"; + } else { + $result['addStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + return $result; + } + + public function get_couser_sem_yr_msg($cours) { + $this->db->select('t1.Sem_Year, t2.CourseName'); + $this->db->from('' . COURSE_FEES . ' as t1'); + $this->db->join('' . COURSE . ' as t2', 't2.CourseID = t1.CourseID', 'LEFT'); + $this->db->where('ID', $cours); + $roleDetails = $this->db->get()->first_row(); + return "$roleDetails->Sem_Year $roleDetails->CourseName"; + + } + + // update study material status + public function update_semyear($arr) { + // echo $cours;exit(); + // $this->get_status_name_ListCode($arr[0]['ListCode']); + $this->db->insert_batch(STUDY_MATERIAL_STATUS, $arr); + if ($this->db->affected_rows() >= 1) { + // if(($this->get_status_name_ListCode($arr[0]['ListCode']) == 'Received' || 'received' || 'Active') || ($this->get_status_name_ListCode($arr[0]['ListCode']) == 'Issued' || 'issued')) { + if($this->get_ListCode_status($arr[0]['ListCode']) == true) { + $dateToMsg = $arr[0]['SDate']; + $statuToMsg = $this->get_status_name_ListCode($arr[0]['ListCode']); + $cerNamtToMsg = 'Study Material'; + $getSemYearMsg = $this->get_couser_sem_yr_msg($arr[0]['CourseID']); + $mesg = "Status Update : $cerNamtToMsg $getSemYearMsg - $statuToMsg $dateToMsg."; + $this->smssend($arr, $mesg); + } + // $this->smssend($arr); + $result['addStatus'] = true; + $result['message'] = "Successfully Study Material Status Updated"; + } else { + $result['addStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + return $result; + } + + // get sem/Year for the course + public function get_semyear_result($reqData, $stuFor) { + // echo $stuFor;exit(); + $subQuery = "SELECT CF.Sem_Year, CF.ID , IF(CF.ProgramType = 'Y001', '0', '1') as SEM_YEAR_TYPE + FROM ".COURSE_FEES." as CF LEFT JOIN ".STUDENTS_FEES_STATUS." as SFS ON SFS.FeesType = CF.ID + WHERE + SFS.CourseID = '$reqData' + AND SFS.StudentID = '$stuFor'"; + // AND CF.ProgramType ='Y001'"; + $queryDetails = $this->db->query($subQuery); + $results['semYearResult'] = true; + $results['semYear_result_details'] = $queryDetails->result(); + return $results; + } + + // get serach result + public function get_search_result($reqData, $req) { + // print_r($reqData['University']); + // print_r($req); + // exit(); + $University = $reqData['University']; + $Course = $reqData['Course']; + $Batch = $reqData['Batch']; + $branch = $req['localBranchID']; + if( $branch == 'All' ) { + + // echo $University; + // echo $branch + + if($University != '' && $Course == '' && $Batch == '') { + $subQuery = "SELECT S.* , SC.ID as UNI_ID, SC.CourseID , C.CourseName , C.CourseCode, U.UniversityName + FROM ".STUDENTS." as S LEFT JOIN ".STUDENTCOURSE." as SC ON SC.StudentID = S.StudentID + LEFT JOIN ".UNIVERSITY." as U ON SC.UniversityID = U.UniversityID LEFT JOIN ".COURSE." as C ON + SC.CourseID = C.CourseID + WHERE + SC.UniversityID = '$University' + AND S.IsActive = '1' + AND SC.IsActive = '1'"; + // AND S.BranchCode = '$branch' + // SC.UniversityID LIKE '%$University%' + // AND SC.CourseID LIKE '%$Course%' + // AND SC.BatchCode LIKE '%$Batch%' + $queryDetails = $this->db->query($subQuery); + $results['searchResult'] = true; + $results['search_result_details'] = $queryDetails->result(); + } else if ($University != '' && $Course != '' && $Batch == '' ) { + $subQuery = "SELECT S.* , SC.ID as UNI_ID, SC.CourseID , C.CourseName , C.CourseCode, U.UniversityName + FROM ".STUDENTS." as S LEFT JOIN ".STUDENTCOURSE." as SC ON SC.StudentID = S.StudentID + LEFT JOIN ".UNIVERSITY." as U ON SC.UniversityID = U.UniversityID LEFT JOIN ".COURSE." as C ON + SC.CourseID = C.CourseID + WHERE + SC.CourseID = '$Course' AND SC.UniversityID = '$University' + AND S.IsActive = '1' + AND SC.IsActive = '1'"; + // AND S.BranchCode = '$branch' + // SC.UniversityID LIKE '%$University%' + // AND SC.CourseID LIKE '%$Course%' + // AND SC.BatchCode LIKE '%$Batch%' + $queryDetails = $this->db->query($subQuery); + $results['searchResult'] = true; + $results['search_result_details'] = $queryDetails->result(); + } else if ( $University != '' && $Course == '' && $Batch != '' ) { + $subQuery = "SELECT S.* , SC.ID as UNI_ID, SC.CourseID , C.CourseName ,C.CourseCode, U.UniversityName + FROM ".STUDENTS." as S LEFT JOIN ".STUDENTCOURSE." as SC ON SC.StudentID = S.StudentID + LEFT JOIN ".UNIVERSITY." as U ON SC.UniversityID = U.UniversityID LEFT JOIN ".COURSE." as C ON + SC.CourseID = C.CourseID + LEFT JOIN ".STUDENTS_FEES_STATUS." as SFS ON SFS.StudentID = SC.StudentID + WHERE SFS.CourseID = SC.CourseID AND + SFS.BatchCode = '$Batch' AND SC.UniversityID = '$University' + AND S.IsActive = '1' + AND SC.IsActive = '1'"; + // AND S.BranchCode = '$branch' + // SC.UniversityID LIKE '%$University%' + // AND SC.CourseID LIKE '%$Course%' + // AND SC.BatchCode LIKE '%$Batch%' + $queryDetails = $this->db->query($subQuery); + $results['searchResult'] = true; + $results['search_result_details'] = $queryDetails->result(); + }else if ( $University != '' && $Course != '' && $Batch != '' ) { + $subQuery = "SELECT S.* , SC.ID as UNI_ID, SC.CourseID , C.CourseName ,C.CourseCode, U.UniversityName + FROM ".STUDENTS." as S LEFT JOIN ".STUDENTCOURSE." as SC ON SC.StudentID = S.StudentID + LEFT JOIN ".UNIVERSITY." as U ON SC.UniversityID = U.UniversityID LEFT JOIN ".COURSE." as C ON + SC.CourseID = C.CourseID + LEFT JOIN ".STUDENTS_FEES_STATUS." as SFS ON SFS.StudentID = SC.StudentID + WHERE SFS.CourseID = SC.CourseID AND + SFS.BatchCode = '$Batch' AND SC.CourseID = '$Course' AND SC.UniversityID = '$University' + AND S.IsActive = '1' + AND SC.IsActive = '1'"; + // AND S.BranchCode = '$branch' + // SC.UniversityID LIKE '%$University%' + // AND SC.CourseID LIKE '%$Course%' + // AND SC.BatchCode LIKE '%$Batch%' + $queryDetails = $this->db->query($subQuery); + $results['searchResult'] = true; + $results['search_result_details'] = $queryDetails->result(); + } + } else { + // echo $University; + // echo $branch; + + if($University != '' && $Course == '' && $Batch == '') { + $subQuery = "SELECT S.* , SC.ID as UNI_ID, SC.CourseID , C.CourseName , C.CourseCode, U.UniversityName + FROM ".STUDENTS." as S LEFT JOIN ".STUDENTCOURSE." as SC ON SC.StudentID = S.StudentID + LEFT JOIN ".UNIVERSITY." as U ON SC.UniversityID = U.UniversityID LEFT JOIN ".COURSE." as C ON + SC.CourseID = C.CourseID + WHERE + SC.UniversityID = '$University' + AND S.IsActive = '1' + AND SC.BranchID = '$branch' + AND SC.IsActive = '1'"; + // AND S.BranchCode = '$branch' + // SC.UniversityID LIKE '%$University%' + // AND SC.CourseID LIKE '%$Course%' + // AND SC.BatchCode LIKE '%$Batch%' + $queryDetails = $this->db->query($subQuery); + $results['searchResult'] = true; + $results['search_result_details'] = $queryDetails->result(); + } else if ($University != '' && $Course != '' && $Batch == '' ) { + $subQuery = "SELECT S.* , SC.ID as UNI_ID, SC.CourseID , C.CourseName , C.CourseCode, U.UniversityName + FROM ".STUDENTS." as S LEFT JOIN ".STUDENTCOURSE." as SC ON SC.StudentID = S.StudentID + LEFT JOIN ".UNIVERSITY." as U ON SC.UniversityID = U.UniversityID LEFT JOIN ".COURSE." as C ON + SC.CourseID = C.CourseID + WHERE + SC.CourseID = '$Course' AND SC.UniversityID = '$University' + AND S.IsActive = '1' + AND SC.BranchID = '$branch' + AND SC.IsActive = '1'"; + // AND S.BranchCode = '$branch' + // SC.UniversityID LIKE '%$University%' + // AND SC.CourseID LIKE '%$Course%' + // AND SC.BatchCode LIKE '%$Batch%' + $queryDetails = $this->db->query($subQuery); + $results['searchResult'] = true; + $results['search_result_details'] = $queryDetails->result(); + } else if ( $University != '' && $Course == '' && $Batch != '' ) { + $subQuery = "SELECT S.* , SC.ID as UNI_ID, SC.CourseID , C.CourseName ,C.CourseCode, U.UniversityName + FROM ".STUDENTS." as S LEFT JOIN ".STUDENTCOURSE." as SC ON SC.StudentID = S.StudentID + LEFT JOIN ".UNIVERSITY." as U ON SC.UniversityID = U.UniversityID + LEFT JOIN ".COURSE." as C ON C.CourseID = SC.CourseID + LEFT JOIN ".STUDENTS_FEES_STATUS." as SFS ON SFS.StudentID = SC.StudentID + WHERE SFS.CourseID = SC.CourseID AND + SFS.BatchCode = '$Batch' AND SC.UniversityID = '$University' + AND S.IsActive = '1' + AND SC.BranchID = '$branch' + AND SC.IsActive = '1'"; + // AND S.BranchCode = '$branch' + // SC.UniversityID LIKE '%$University%' + // AND SC.CourseID LIKE '%$Course%' + // AND SC.BatchCode LIKE '%$Batch%' + $queryDetails = $this->db->query($subQuery); + $results['searchResult'] = true; + $results['search_result_details'] = $queryDetails->result(); + } else if ( $University != '' && $Course != '' && $Batch != '' ) { + $subQuery = "SELECT S.* , SC.ID as UNI_ID, SC.CourseID , C.CourseName , C.CourseCode, U.UniversityName + FROM ".STUDENTS." as S LEFT JOIN ".STUDENTCOURSE." as SC ON SC.StudentID = S.StudentID + LEFT JOIN ".UNIVERSITY." as U ON SC.UniversityID = U.UniversityID LEFT JOIN ".COURSE." as C ON + SC.CourseID = C.CourseID + LEFT JOIN ".STUDENTS_FEES_STATUS." as SFS ON SFS.StudentID = SC.StudentID + WHERE SFS.CourseID = SC.CourseID AND + SFS.BatchCode = '$Batch' AND SC.CourseID = '$Course' AND SC.UniversityID = '$University' + AND S.IsActive = '1' + AND SC.BranchID = '$branch' + AND SC.IsActive = '1'"; + // AND S.BranchCode = '$branch' + // SC.UniversityID LIKE '%$University%' + // AND SC.CourseID LIKE '%$Course%' + // AND SC.BatchCode LIKE '%$Batch%' + $queryDetails = $this->db->query($subQuery); + $results['searchResult'] = true; + $results['search_result_details'] = $queryDetails->result(); + } + } + return $results; + } + + // get list of universities, course, batch + public function get_university_course_batch() { + $this->db->select('t1.UniversityID, t1.UniversityName'); + $this->db->order_by('CreatedOn', 'DESC'); + $this->db->from(''.UNIVERSITY. ' as t1'); + $this->db->where('IsActive', 1); + // $this->db->join('' . COURSE . ' as t2', 't2.UniversityID = t1.UniversityID', 'LEFT'); + $univDetails = $this->db->get(); + $universityDetails = $univDetails->result(); + $endResult = []; + foreach($universityDetails as $clip){ + // University Details + $resultArr['UniversityID'] = $clip->UniversityID; + $resultArr['UniversityName'] = $clip->UniversityName; + // Course Details + $this->db->select('t2.CourseID, t2.CourseName, t2.CourseCode'); + $this->db->from(''.COURSE. ' as t2'); + $this->db->where('t2.UniversityID', $clip->UniversityID); + $this->db->where('t2.IsActive', 1); + $courDetails = $this->db->get(); + $courseDetails = $courDetails->result(); + $resultArr['Course'] =$courseDetails; + // Batch Details + $this->db->select('t3.BatchName, t3.BatchCode'); + $this->db->from(''.BATCH. ' as t3'); + $this->db->where('t3.UniversityID', $clip->UniversityID); + $this->db->where('t3.IsActive', 1); + + //Session Details + // $this->db->select('B.SessionID, B.SessionName'); + // $this->db->from(SESSIONMASTER . ' as B'); + // $this->db->join(SESSIONDETAILS . ' SD', 'SD.SessionID = B.SessionID'); + // $this->db->where('SD.UniversityID', $clip->UniversityID); + // $this->db->where('B.IsActive', 1); + // $this->db->where('SD.IsActive', 1); + + $batDetails = $this->db->get(); + $batchDetails = $batDetails->result(); + $resultArr['Batch'] =$batchDetails; + array_push($endResult, $resultArr); + } + $results['univList'] = true; + $results['university_details'] = $endResult; + return $results; + } + + + // http://www.24x7sms.com/downloads/24X7SMS_http_API2.0.pdf + // API Key : xegCdYUIMf3 + // Your new password for logging into Apollo student portal is (Password). Please change the password as soon as you login. + // This is the template to be used. + public function smssend($arr, $msg) + { + $number =array(); + foreach($arr as $ar){ + $mobi = $this->get_registered_mobile($ar['StudentID']); + array_push($number, "91$mobi"); + } + $mobile = implode(',', $number); + // $message ="Your new password for logging into Apollo student portal is SAMPLE. Please change the password as soon as you login."; + // $mobile = "91$mobile"; + + $message = urlencode($msg); + // echo $mobile , $message; + $ch=curl_init(); + curl_setopt($ch,CURLOPT_URL,"https://smsapi.24x7sms.com/api_2.0/SendSMS.aspx?APIKEY=xegCdYUIMf3&MobileNo=".$mobile."&SenderID=APOLLO&Message=".$message."&ServiceName=TEMPLATE_BASED"); + + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + $output =curl_exec($ch); + + // print_r($output);exit(); + curl_close($ch); + return $output; + } + + // public function mailsend() { + // //Load email library + // $this->load->library('email'); + + // //SMTP & mail configuration + // $config = array( + // 'protocol' => 'smtp', + // 'smtp_host' => 'ssl://smtp.example.com', + // 'smtp_port' => 465, + // 'smtp_user' => 'email@example.com', + // 'smtp_pass' => 'email_password', + // 'mailtype' => 'html', + // 'charset' => 'utf-8' + // ); + // $this->email->initialize($config); + // $this->email->set_mailtype("html"); + // $this->email->set_newline("\r\n"); + + // //Email content + // $htmlContent = '

Sending email via SMTP server

'; + // $htmlContent .= '

This email has sent via SMTP server from CodeIgniter application.

'; + + // // Email body load the html template + // // $body = $this->load->view('emails/anillabs.php',$data,TRUE); + + + // $this->email->to('recipient@example.com'); + // $this->email->from('sender@example.com','MyWebsite'); + // $this->email->subject('How to send email via SMTP server in CodeIgniter'); + // $this->email->message($htmlContent); + + // //Send email + // $this->email->send(); + // } + + /* + * update followup details for booklet details in call tracking + * created by kms + * */ + public function updateBookletStatusInCallTrack($fromDetails=null,$reqDetails=null){ + // get student details + $this->db->select('PLD.ListCode'); + $this->db->from(PICK_LIST_DETAILS.' as PLD'); + $this->db->where('PLD.ListName','ISSUED TO STUDENTS'); + $this->db->where('PLD.ListCode',$fromDetails[0]['ListCode']); + $this->db->where('PLD.IsActive','1'); + $checkStatus=$this->db->get()->last_row(); + if($checkStatus){ + + + $studentDetails = $this->studentInfo($fromDetails); + if($studentDetails){ + $arrayDetails['MobileNumber']=$studentDetails->MobileNumber; + $arrayDetails['LeadName']=$studentDetails->Firstname; + $arrayDetails['University']=$studentDetails->UniversityName; + $arrayDetails['Course']=$studentDetails->CourseName; + $arrayDetails['StatusCode']=$fromDetails[0]['ListCode']; + $arrayDetails['CreatedBranch']=$fromDetails[0]['BranchCode']; + $arrayDetails['CreatedOn']=$fromDetails[0]['CreatedOn']; + $arrayDetails['FollowupOn']=$fromDetails[0]['AnsDate']; + $arrayDetails['FollowupComments']=$fromDetails[0]['Comments']; + if($reqDetails['localType']==SUPER_ADMIN){ + $this->db->select('LO.ID'); + $this->db->from(STAFF_BRANCH.' as STB'); + $this->db->join(LOGIN.' as LO', 'LO.StaffID = STB.StaffID'); + $this->db->where('STB.BranchCode',$fromDetails[0]['BranchCode']); + $this->db->where('LO.ListCode',ADMIN); + $this->db->where('STB.IsActive','1'); + $this->db->where('LO.IsActive','1'); + $assignDet=$this->db->get()->last_row(); + if($assignDet){ + $arrayDetails['CreatedBy']=$assignDet->ID; + } + else{ + $arrayDetails['CreatedBy']=$fromDetails[0]['CreatedBy']; + } + + } + else{ + $arrayDetails['CreatedBy']=$fromDetails[0]['CreatedBy']; + } + + // create activity in call tracking + $this->db->select('ActivityID,ActivityName'); + $this->db->like('ActivityName', 'Answer Booklet', 'after'); + $this->db->where('IsActive', '1'); + $activityDetails=$this->db->get(ACTIVITY)->last_row(); + if($activityDetails){ + + $newLeadDetails['MobileNumber'] = $arrayDetails['MobileNumber']; + $newLeadDetails['LeadName'] = $arrayDetails['LeadName']; + $newLeadDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $newLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_DETAILS, $newLeadDetails); + // this if for insert lead details + if($this->db->affected_rows() == '1'){ + // get and store insert id from db + $track_Details['LeadID']=$this->db->insert_id(); + $track_Details['ActivityStatus'] = $activityDetails->ActivityID; + $track_Details['University'] = $arrayDetails['University']; + $track_Details['Course'] = $arrayDetails['Course']; + $track_Details['AssignedTo'] = $arrayDetails['CreatedBy']; + $track_Details['StatusCode'] = $arrayDetails['StatusCode']; + $track_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $track_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $track_Details['CreatedBranch']=$arrayDetails['CreatedBranch']; + $this->db->insert(LEAD_TRACKING, $track_Details); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $insertfollowup_Details['TrackingID']=$this->db->insert_id(); + $insertfollowup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $insertfollowup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $insertfollowup_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $insertfollowup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $insertfollowup_Details); + // this if for insert follow up details + + } + + + } + + // hide tracking updated code + + /*$this->db->select('LD.LeadID,LT.TrackingID'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->where('LD.MobileNumber',$arrayDetails['MobileNumber']); + $this->db->where('LT.ActivityStatus',$activityDetails->ActivityID); + $this->db->like('LT.University',$arrayDetails['University'],'after'); + $this->db->like('LT.Course',$arrayDetails['Course'],'after'); + $leadDet=$this->db->get()->last_row(); + + if($leadDet){ + $this->db->select('FollowupOn'); + $this->db->where('TrackingID',$leadDet->TrackingID); + // $this->db->order_by('InteractionId','DESC'); + $existFollowupOn = $this->db->get(LEAD_TRACKING_FOLLOWUP)->last_row(); + // upate tracking status + $changeStatusCode['StatusCode'] = $arrayDetails['StatusCode']; + $changeStatusCode['UpdatedBy'] = $arrayDetails['CreatedBy']; + $changeStatusCode['UpdatedOn'] = $arrayDetails['CreatedOn']; + $changeStatusCode['CreatedBranch']=$arrayDetails['CreatedBranch']; + + $this->db->where('TrackingID',$leadDet->TrackingID); + $this->db->update(LEAD_TRACKING, $changeStatusCode); + // end update status + $updateTrackDetails['TrackingID'] = $leadDet->TrackingID; + $updateTrackDetails['FollowupOn'] = $existFollowupOn->FollowupOn; + $updateTrackDetails['FollowupComments'] = $arrayDetails['FollowupComments']; + $updateTrackDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $updateTrackDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $updateTrackDetails); + + } + + else{ + $this->db->select('LeadID'); + $this->db->where('MobileNumber',$arrayDetails['MobileNumber']); + $checkLeadDet=$this->db->get(LEAD_DETAILS)->last_row(); + if($checkLeadDet){ + $updateLeadDetails['LeadID'] = $checkLeadDet->LeadID; + $updateLeadDetails['ActivityStatus'] = $activityDetails->ActivityID; + $updateLeadDetails['University'] = $arrayDetails['University']; + $updateLeadDetails['Course'] = $arrayDetails['Course']; + $updateLeadDetails['AssignedTo'] = $arrayDetails['CreatedBy']; + $updateLeadDetails['StatusCode'] = $arrayDetails['StatusCode']; + $updateLeadDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $updateLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $updateLeadDetails['CreatedBranch']=$arrayDetails['CreatedBranch']; + $this->db->insert(LEAD_TRACKING, $updateLeadDetails); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $followup_Details['TrackingID']=$this->db->insert_id(); + $followup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $followup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $followup_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $followup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $followup_Details); + // this if for insert follow up details + + } + + } + else{ + $newLeadDetails['MobileNumber'] = $arrayDetails['MobileNumber']; + $newLeadDetails['LeadName'] = $arrayDetails['LeadName']; + $newLeadDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $newLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_DETAILS, $newLeadDetails); + // this if for insert lead details + if($this->db->affected_rows() == '1'){ + // get and store insert id from db + $track_Details['LeadID']=$this->db->insert_id(); + $track_Details['ActivityStatus'] = $activityDetails->ActivityID; + $track_Details['University'] = $arrayDetails['University']; + $track_Details['Course'] = $arrayDetails['Course']; + $track_Details['AssignedTo'] = $arrayDetails['CreatedBy']; + $track_Details['StatusCode'] = $arrayDetails['StatusCode']; + $track_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $track_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $track_Details['CreatedBranch']=$arrayDetails['CreatedBranch']; + $this->db->insert(LEAD_TRACKING, $track_Details); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $insertfollowup_Details['TrackingID']=$this->db->insert_id(); + $insertfollowup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $insertfollowup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $insertfollowup_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $insertfollowup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $insertfollowup_Details); + // this if for insert follow up details + + } + + + } + + } + + + }*/ + + + } + } + + return true; + } + else{ + return false; + } + } + + /* + * update followup details for application status in call tracking + * created by kms + * */ + public function updateDocumentStatusInCallTrack($fromDetails=null,$reqDetails=null){ + + + // check certificate type + $this->db->select('CFM.CertificationID'); + $this->db->from(CERTIFICATION_MASTER.' as CFM'); + $this->db->where('CFM.CertificateName','APPLICATION'); + $this->db->where('CFM.CertificationID',$fromDetails[0]['CertificationType']); + $this->db->where('CFM.IsActive','1'); + $checkApplicationStatus=$this->db->get()->last_row(); + if($checkApplicationStatus){ + // get student details + $this->db->select('PLD.ListCode'); + $this->db->from(PICK_LIST_DETAILS.' as PLD'); + $this->db->where('PLD.ListName','PENDING'); + $this->db->where('PLD.ListCode',$fromDetails[0]['ListCode']); + $this->db->where('PLD.IsActive','1'); + $checkStatus=$this->db->get()->last_row(); + if($checkStatus){ + + $studentDetails = $this->studentInfoForDocumentStatus($fromDetails); + if($studentDetails){ + $arrayDetails['MobileNumber']=$studentDetails->MobileNumber; + $arrayDetails['LeadName']=$studentDetails->Firstname; + $arrayDetails['University']=$studentDetails->UniversityName; + $arrayDetails['Course']=$studentDetails->CourseName; + $arrayDetails['StatusCode']=$fromDetails[0]['ListCode']; + $arrayDetails['CreatedBranch']=$fromDetails[0]['BranchCode']; + $arrayDetails['CreatedOn']=$fromDetails[0]['CreatedOn']; + $arrayDetails['FollowupOn']=$fromDetails[0]['AppDate']; + $arrayDetails['FollowupComments']=$fromDetails[0]['Comments']; + if($reqDetails['localType']==SUPER_ADMIN){ + $this->db->select('LO.ID'); + $this->db->from(STAFF_BRANCH.' as STB'); + $this->db->join(LOGIN.' as LO', 'LO.StaffID = STB.StaffID'); + $this->db->where('STB.BranchCode',$fromDetails[0]['BranchCode']); + $this->db->where('LO.ListCode',ADMIN); + $this->db->where('STB.IsActive','1'); + $this->db->where('LO.IsActive','1'); + $assignDet=$this->db->get()->last_row(); + if($assignDet){ + $arrayDetails['CreatedBy']=$assignDet->ID; + } + else{ + $arrayDetails['CreatedBy']=$fromDetails[0]['CreatedBy']; + } + + } + else{ + $arrayDetails['CreatedBy']=$fromDetails[0]['CreatedBy']; + } + + // create activity in call tracking + $this->db->select('ActivityID,ActivityName'); + $this->db->like('ActivityName', 'Application', 'after'); + $this->db->where('IsActive', '1'); + $activityDetails=$this->db->get(ACTIVITY)->last_row(); + if($activityDetails){ + + $newLeadDetails['MobileNumber'] = $arrayDetails['MobileNumber']; + $newLeadDetails['LeadName'] = $arrayDetails['LeadName']; + $newLeadDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $newLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_DETAILS, $newLeadDetails); + // this if for insert lead details + if($this->db->affected_rows() == '1'){ + // get and store insert id from db + $track_Details['LeadID']=$this->db->insert_id(); + $track_Details['ActivityStatus'] = $activityDetails->ActivityID; + $track_Details['University'] = $arrayDetails['University']; + $track_Details['Course'] = $arrayDetails['Course']; + $track_Details['AssignedTo'] = $arrayDetails['CreatedBy']; + $track_Details['StatusCode'] = $arrayDetails['StatusCode']; + $track_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $track_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $track_Details['CreatedBranch']=$arrayDetails['CreatedBranch']; + $this->db->insert(LEAD_TRACKING, $track_Details); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $insertfollowup_Details['TrackingID']=$this->db->insert_id(); + $insertfollowup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $insertfollowup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $insertfollowup_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $insertfollowup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $insertfollowup_Details); + // this if for insert follow up details + + } + + + } + + /// hide seperate track id + + /* $this->db->select('LD.LeadID,LT.TrackingID'); + $this->db->from(LEAD_DETAILS.' as LD'); + $this->db->join(LEAD_TRACKING.' as LT', 'LT.LeadID = LD.LeadID'); + $this->db->where('LD.MobileNumber',$arrayDetails['MobileNumber']); + $this->db->where('LT.ActivityStatus',$activityDetails->ActivityID); + $this->db->like('LT.University',$arrayDetails['University'],'after'); + $this->db->like('LT.Course',$arrayDetails['Course'],'after'); + $leadDet=$this->db->get()->last_row(); + + if($leadDet){ + $this->db->select('FollowupOn'); + $this->db->where('TrackingID',$leadDet->TrackingID); + // $this->db->order_by('InteractionId','DESC'); + $existFollowupOn = $this->db->get(LEAD_TRACKING_FOLLOWUP)->last_row(); + // upate tracking status + $changeStatusCode['StatusCode'] = $arrayDetails['StatusCode']; + $changeStatusCode['UpdatedBy'] = $arrayDetails['CreatedBy']; + $changeStatusCode['UpdatedOn'] = $arrayDetails['CreatedOn']; + $changeStatusCode['CreatedBranch']=$arrayDetails['CreatedBranch']; + + $this->db->where('TrackingID',$leadDet->TrackingID); + $this->db->update(LEAD_TRACKING, $changeStatusCode); + // end update status + $updateTrackDetails['TrackingID'] = $leadDet->TrackingID; + $updateTrackDetails['FollowupOn'] = $arrayDetails['FollowupOn']; + $updateTrackDetails['FollowupComments'] = $arrayDetails['FollowupComments']; + $updateTrackDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $updateTrackDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $updateTrackDetails); + + } + + else{ + $this->db->select('LeadID'); + $this->db->where('MobileNumber',$arrayDetails['MobileNumber']); + $checkLeadDet=$this->db->get(LEAD_DETAILS)->last_row(); + if($checkLeadDet){ + $updateLeadDetails['LeadID'] = $checkLeadDet->LeadID; + $updateLeadDetails['ActivityStatus'] = $activityDetails->ActivityID; + $updateLeadDetails['University'] = $arrayDetails['University']; + $updateLeadDetails['Course'] = $arrayDetails['Course']; + $updateLeadDetails['AssignedTo'] = $arrayDetails['CreatedBy']; + $updateLeadDetails['StatusCode'] = $arrayDetails['StatusCode']; + $updateLeadDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $updateLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $updateLeadDetails['CreatedBranch']=$arrayDetails['CreatedBranch']; + $this->db->insert(LEAD_TRACKING, $updateLeadDetails); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $followup_Details['TrackingID']=$this->db->insert_id(); + $followup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $followup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $followup_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $followup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $followup_Details); + // this if for insert follow up details + + } + + } + else{ + $newLeadDetails['MobileNumber'] = $arrayDetails['MobileNumber']; + $newLeadDetails['LeadName'] = $arrayDetails['LeadName']; + $newLeadDetails['CreatedBy'] = $arrayDetails['CreatedBy']; + $newLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_DETAILS, $newLeadDetails); + // this if for insert lead details + if($this->db->affected_rows() == '1'){ + // get and store insert id from db + $track_Details['LeadID']=$this->db->insert_id(); + $track_Details['ActivityStatus'] = $activityDetails->ActivityID; + $track_Details['University'] = $arrayDetails['University']; + $track_Details['Course'] = $arrayDetails['Course']; + $track_Details['AssignedTo'] = $arrayDetails['CreatedBy']; + $track_Details['StatusCode'] = $arrayDetails['StatusCode']; + $track_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $track_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $track_Details['CreatedBranch']=$arrayDetails['CreatedBranch']; + $this->db->insert(LEAD_TRACKING, $track_Details); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $insertfollowup_Details['TrackingID']=$this->db->insert_id(); + $insertfollowup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $insertfollowup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $insertfollowup_Details['CreatedBy'] = $arrayDetails['CreatedBy']; + $insertfollowup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $insertfollowup_Details); + // this if for insert follow up details + + } + + + } + + } + + + }*/ + + + } + } + + + return true; + } + else{ + return false; + } + } + else{ + return false; + } + + } + + /* + * get student info + * created by kms + * */ + public function studentInfo($details=null){ + + $this->db->select('ST.Firstname,ST.MobileNumber,US.UniversityName,CU.CourseName'); + $this->db->from(COURSE_FEES.' as CF'); + $this->db->join(STUDENTCOURSE.' as STC', 'STC.CourseID = CF.CourseID'); + $this->db->join(STUDENTS.' as ST', 'ST.StudentID = STC.StudentID'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = STC.CourseID'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = STC.UniversityID'); + $this->db->where('ST.StudentID',$details[0]['StudentID']); + $this->db->where('CF.ID',$details[0]['CourseID']); + $leadDet=$this->db->get()->last_row(); + if($leadDet){ + return $leadDet; + } + else{ + return false; + } + + } + /* + * get student info for documet updates + * created by kms + * */ + public function studentInfoForDocumentStatus($details=null){ + + $this->db->select('ST.Firstname,ST.MobileNumber,US.UniversityName,CU.CourseName'); + $this->db->from(STUDENTCOURSE.' as STC'); + $this->db->join(STUDENTS.' as ST', 'ST.StudentID = STC.StudentID'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = STC.CourseID'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = STC.UniversityID'); + $this->db->where('ST.StudentID',$details[0]['StudentID']); + $this->db->where('STC.CourseID',$details[0]['CourseID']); + $leadDet=$this->db->get()->last_row(); + if($leadDet){ + return $leadDet; + } + else{ + return false; + } + + } + + + +} \ No newline at end of file diff --git a/api/application/models/Status_model.php b/api/application/models/Status_model.php new file mode 100644 index 0000000..66272ba --- /dev/null +++ b/api/application/models/Status_model.php @@ -0,0 +1,121 @@ +db->select('ListCode'); + $this->db->where('ListGroup', '1'); + $this->db->where('ListName', $arrayDetails['ListName']); + if($this->db->get(PICK_LIST_DETAILS)->first_row()){ + $result['Status'] = false; + $result['message'] = "Status name is already exist!"; + } else { + $this->db->insert(PICK_LIST_DETAILS, $arrayDetails); + if($this->db->affected_rows() == '1'){ + $result['Status'] = true; + $result['message'] = "Successfully status details added"; + } + else { + $result['Status'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + } + // $checkExistActivity = $this->db->get(PICK_LIST_DETAILS); + + + + + return $result; + + } + + + + /* + * get status details + * parama id + * created by Surendiran + * */ + + public function getStatus() + { + $this->db->select('ListCode,ListName,IsActive'); + $this->db->where('ListGroup','1'); + $this->db->order_by('ListCode','DESC'); + $statusDetails = $this->db->get(PICK_LIST_DETAILS); + if($statusDetails->result()){ + + $result['Status'] = true; + $result['details'] = $statusDetails->result(); + } + else { + $result['Status'] = false; + $result['message'] = "No records found!"; + } + + return $result; + + } + /* + * update status details + * created by Surendiran + * */ + + public function update($arrayDetails=null,$ListCode=null) + { + $this->db->select('ListName'); + $this->db->where('ListName', $arrayDetails['ListName']); + $this->db->where_not_in('ListCode', $ListCode); + if($this->db->get(PICK_LIST_DETAILS)->first_row()){ + $result['Status'] = false; + $result['message'] = "Status name is already exist!"; + } else { + $this->db->where('ListCode',$ListCode); + $this->db->update(PICK_LIST_DETAILS, $arrayDetails); + if($this->db->affected_rows() == '1'){ + $result['Status'] = true; + $result['message'] = "Successfully status details updated"; + } + else { + $result['Status'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + return $result; + } + + public function getStatusBranchList( $id ) { + $this->db->select('BranchCode, BranchName'); + $this->db->from(BRANCH); + $getBranchDetails = $this->db->get(); + $branchDetails = $getBranchDetails->result(); + if (count($branchDetails) > 0) { + $results['branchListStatus'] = true; + $results['branch_list_details'] = $branchDetails; + } else { + $results['branchListStatus'] = false; + $results['message'] = "Branch Is Not Avail."; + } + return $results; + } + + public function getBranchStatusList($branchCode) { +echo $branchCode;exit(); + } + +} \ No newline at end of file diff --git a/api/application/models/Student_model.php b/api/application/models/Student_model.php new file mode 100644 index 0000000..d484991 --- /dev/null +++ b/api/application/models/Student_model.php @@ -0,0 +1,1347 @@ +db->select('t1.BranchCode,t1.BranchName'); + $this->db->from('' . BRANCH . ' as t1'); + + // $this->db->where('t1.IsActive', 1); + + $branchDetails = $this->db->get(); + $checkArr = $branchDetails->result(); + if (count($checkArr) > 0) { + $result['branDetailstatus'] = true; + $result['branch_details'] = $branchDetails->result(); + } + else { + $result['branDetailstatus'] = false; + } + + return $result; + } + + // check the branch active status for student add + + public function getBranchActiveStatusforStuAdd($branchId) + { + $this->db->select('t1.IsActive'); + $this->db->from('' . BRANCH . ' as t1'); + $this->db->where('BranchCode', $branchId); + $statusDetails = $this->db->get()->first_row(); + + // echo $statusDetails->IsActive;exit(); + + $result['branch_active_status'] = $statusDetails->IsActive; + return $result; + + // if (count($checkArr) > 0) { + // $result['branDetailstatus'] = true; + // $result['branch_details'] = $branchDetails->result(); + // } else { + // $result['branDetailstatus'] = false; + // } + // return $result; + + } + + // get student list based on login user + + public function get_student_list($loginUserId, $loginUserBranchId, $loginUserType, $getSearchData) + { + + // print_r($getSearchData);exit(); + // echo $loginUserId, $loginUserBranchId, $loginUserType; exit(); + + if ($loginUserType == SUPER_ADMIN) { + + // list for super admin based on branch + + if ($getSearchData["University"] === '' && $getSearchData["Course"] === '' && $getSearchData["Status"] === '') { + $this->db->select('t1.*'); + $this->db->from('' . STUDENTS . ' as t1'); + + // $this->db->order_by('CreatedOn', 'DESC'); + // $this->db->where('BranchCode', $loginUserBranchId); + + $this->db->join('' . STUDENTCOURSE . ' as t2', 't2.StudentID = t1.StudentID', 'LEFT'); + $this->db->where('t2.BranchID', $loginUserBranchId); + $this->db->group_by('t2.StudentID'); + $this->db->order_by('t2.CreatedOn', 'DESC'); + $stuDetails = $this->db->get(); + $checkArr = $stuDetails->result(); + if (count($checkArr) > 0) { + $results['studentList'] = true; + $results['student_details'] = $stuDetails->result(); + } + else { + $results['studentList'] = false; + } + } + else { + + // print_r($getSearchData);exit(); + // $this->db->select('t1.*'); + // // $this->db->from(STUDENTS); + // $this->db->from('' . STUDENTS . ' as t1'); + // $this->db->order_by('t1.CreatedOn', 'DESC'); + // $this->db->where('t1.BranchCode', $loginUserBranchId); + // $this->db->from('' . STUDENTCOURSE . ' as t2', 't2.StudentID = t1.StudentID', 'LEFT'); + // $this->db->where('t2.UniversityID', $getSearchData["University"]); + // $this->db->where('t2.CourseID', $getSearchData["Course"]); + + $University = $getSearchData['University']; + $Course = $getSearchData['Course']; + + // $Batch = $getSearchData['Batch']; + + $Batch = ''; + $StuStatus = $getSearchData['Status']; + if ($StuStatus == '') { + if ($University != '' && $Course == '') { + $subQuery = "SELECT S.* + FROM " . STUDENTS . " as S LEFT JOIN " . STUDENTCOURSE . " as SC ON SC.StudentID = S.StudentID + LEFT JOIN " . UNIVERSITY . " as U ON SC.UniversityID = U.UniversityID LEFT JOIN " . COURSE . " as C ON + SC.CourseID = C.CourseID + WHERE + SC.UniversityID = '$University' + AND SC.BranchID = '$loginUserBranchId' + GROUP BY SC.StudentID + ORDER BY S.CreatedOn"; + } + else + if ($University != '' && $Course != '') { + $subQuery = "SELECT S.* + FROM " . STUDENTS . " as S LEFT JOIN " . STUDENTCOURSE . " as SC ON SC.StudentID = S.StudentID + LEFT JOIN " . UNIVERSITY . " as U ON SC.UniversityID = U.UniversityID LEFT JOIN " . COURSE . " as C ON + SC.CourseID = C.CourseID + WHERE + SC.CourseID = '$Course' AND SC.UniversityID = '$University' + AND SC.BranchID = '$loginUserBranchId' + GROUP BY SC.StudentID + ORDER BY S.CreatedOn"; + } + } + else { + if ($University != '' && $Course == '') { + $subQuery = "SELECT S.* + FROM " . STUDENTS . " as S LEFT JOIN " . STUDENTCOURSE . " as SC ON SC.StudentID = S.StudentID + LEFT JOIN " . UNIVERSITY . " as U ON SC.UniversityID = U.UniversityID LEFT JOIN " . COURSE . " as C ON + SC.CourseID = C.CourseID + WHERE + SC.UniversityID = '$University' + AND SC.BranchID = '$loginUserBranchId' + AND S.IsActive = '$StuStatus' + GROUP BY SC.StudentID + ORDER BY S.CreatedOn"; + } + else + if ($University != '' && $Course != '') { + $subQuery = "SELECT S.* + FROM " . STUDENTS . " as S LEFT JOIN " . STUDENTCOURSE . " as SC ON SC.StudentID = S.StudentID + LEFT JOIN " . UNIVERSITY . " as U ON SC.UniversityID = U.UniversityID LEFT JOIN " . COURSE . " as C ON + SC.CourseID = C.CourseID + WHERE + SC.CourseID = '$Course' AND SC.UniversityID = '$University' + AND SC.BranchID = '$loginUserBranchId' + AND S.IsActive = '$StuStatus' + GROUP BY SC.StudentID + ORDER BY S.CreatedOn"; + } + } + + $stuDetails = $this->db->query($subQuery); + + // $stuDetails = $this->db->get(); + + $checkArr = $stuDetails->result(); + if (count($checkArr) > 0) { + $results['studentList'] = true; + $results['student_details'] = $stuDetails->result(); + } + else { + $results['studentList'] = false; + } + } + + // if ($loginUserBranchId == 'All') { + // // for getting all branch details + // $staffId = $this->selfGetEmpId($loginUserId); + // $this->db->select('*'); + // $this->db->order_by('CreatedOn', 'DESC'); + // $this->db->from(STAFF); + // // not for SuperAdmin and Student Role code + // $this->db->where_not_in('StaffID', $staffId); + // // $this->db->where('BranchCode', $loginUserBranchId); + // $empDetails = $this->db->get(); + // $checkArr = $empDetails->result(); + // if (count($checkArr) > 0) { + // $results['employeeList'] = true; + // $results['employees_details'] = $empDetails->result(); + // } else { + // $results['employeeList'] = false; + // $results['message'] = 'No record found'; + // } + // } else { + // $staffId = $this->selfGetEmpId($loginUserId); + // $this->db->select('*'); + // $this->db->order_by('CreatedOn', 'DESC'); + // $this->db->from(STAFF); + // // not for SuperAdmin and Student Role code + // $this->db->where_not_in('StaffID', $staffId); + // $this->db->where('BranchCode', $loginUserBranchId); + // $empDetails = $this->db->get(); + // $checkArr = $empDetails->result(); + // if (count($checkArr) > 0) { + // $results['employeeList'] = true; + // $results['employees_details'] = $empDetails->result(); + // } else { + // $results['employeeList'] = false; + // $results['message'] = 'No record found'; + // } + // } + + } + else if ($loginUserType == ADMIN) { + + // list for admin + + if ($getSearchData["University"] === '' && $getSearchData["Course"] === '' && $getSearchData["Status"] === '') { + + // print_r($getSearchData);exit(); + + $this->db->select('t1.*'); + $this->db->from('' . STUDENTS . ' as t1'); + + // $this->db->where('BranchCode', $loginUserBranchId); + // $this->db->group_by('user_id'); + + $this->db->join('' . STUDENTCOURSE . ' as t2', 't2.StudentID = t1.StudentID', 'LEFT'); + $this->db->where('t2.BranchID', $loginUserBranchId); + $this->db->group_by('t2.StudentID'); + $this->db->order_by('t2.CreatedOn', 'DESC'); + $stuDetails = $this->db->get(); + $checkArr = $stuDetails->result(); + if (count($checkArr) > 0) { + $results['studentList'] = true; + $results['student_details'] = $stuDetails->result(); + } + else { + $results['studentList'] = false; + } + } + else { + $University = $getSearchData['University']; + $Course = $getSearchData['Course']; + + // $Batch = $getSearchData['Batch']; + + $Batch = ''; + $StuStatus = $getSearchData['Status']; + if ($StuStatus == '') { + if ($University != '' && $Course == '') { + $subQuery = "SELECT S.* + FROM " . STUDENTS . " as S LEFT JOIN " . STUDENTCOURSE . " as SC ON SC.StudentID = S.StudentID + LEFT JOIN " . UNIVERSITY . " as U ON SC.UniversityID = U.UniversityID LEFT JOIN " . COURSE . " as C ON + SC.CourseID = C.CourseID + WHERE + SC.UniversityID = '$University' + AND SC.BranchID = '$loginUserBranchId' + GROUP BY SC.StudentID + ORDER BY S.CreatedOn"; + } + else if ($University != '' && $Course != '') { + $subQuery = "SELECT S.* + FROM " . STUDENTS . " as S LEFT JOIN " . STUDENTCOURSE . " as SC ON SC.StudentID = S.StudentID + LEFT JOIN " . UNIVERSITY . " as U ON SC.UniversityID = U.UniversityID LEFT JOIN " . COURSE . " as C ON + SC.CourseID = C.CourseID + WHERE + SC.CourseID = '$Course' AND SC.UniversityID = '$University' + AND SC.BranchID = '$loginUserBranchId' + GROUP BY SC.StudentID + ORDER BY S.CreatedOn"; + } + } + else { + if ($University != '' && $Course == '') { + $subQuery = "SELECT S.* + FROM " . STUDENTS . " as S LEFT JOIN " . STUDENTCOURSE . " as SC ON SC.StudentID = S.StudentID + LEFT JOIN " . UNIVERSITY . " as U ON SC.UniversityID = U.UniversityID LEFT JOIN " . COURSE . " as C ON + SC.CourseID = C.CourseID + WHERE + SC.UniversityID = '$University' + AND SC.BranchID = '$loginUserBranchId' + AND S.IsActive = '$StuStatus' + GROUP BY SC.StudentID + ORDER BY S.CreatedOn"; + } + else if ($University != '' && $Course != '') { + $subQuery = "SELECT S.* + FROM " . STUDENTS . " as S LEFT JOIN " . STUDENTCOURSE . " as SC ON SC.StudentID = S.StudentID + LEFT JOIN " . UNIVERSITY . " as U ON SC.UniversityID = U.UniversityID LEFT JOIN " . COURSE . " as C ON + SC.CourseID = C.CourseID + WHERE + SC.CourseID = '$Course' AND SC.UniversityID = '$University' + AND SC.BranchID = '$loginUserBranchId' + AND S.IsActive = '$StuStatus' + GROUP BY SC.StudentID + ORDER BY S.CreatedOn"; + } + } + + $stuDetails = $this->db->query($subQuery); + + // $stuDetails = $this->db->get(); + + $checkArr = $stuDetails->result(); + if (count($checkArr) > 0) { + $results['studentList'] = true; + $results['student_details'] = $stuDetails->result(); + } + else { + $results['studentList'] = false; + } + } + } + else if ($loginUserType == EMPLOYEE) { + + // list for staff + // list for admin + + if ($getSearchData["University"] === '' && $getSearchData["Course"] === '' && $getSearchData["Status"] === '') { + + // print_r($getSearchData);exit(); + + $this->db->select("t1.*, IF(t3.ID > 0, '1' , '0') as Fee_paid_exist"); + $this->db->from('' . STUDENTS . ' as t1'); + $this->db->join('' . STUDENTCOURSE . ' as t2', 't2.StudentID = t1.StudentID', 'LEFT'); + $this->db->join('' . STUDENTS_FEES_PAID . ' as t3', 't3.StudentID = t1.StudentID', 'LEFT'); + $this->db->where('t2.BranchID', $loginUserBranchId); + $this->db->group_by('t2.StudentID'); + // $this->db->from(STUDENTS); + $this->db->order_by('t2.CreatedOn', 'DESC'); + $stuDetails = $this->db->get(); + $checkArr = $stuDetails->result(); + if (count($checkArr) > 0) { + $results['studentList'] = true; + $results['student_details'] = $stuDetails->result(); + } + else { + $results['studentList'] = false; + } + } + else { + + // print_r($getSearchData);exit(); + // $this->db->select('t1.*'); + // // $this->db->from(STUDENTS); + // $this->db->from('' . STUDENTS . ' as t1'); + // $this->db->order_by('t1.CreatedOn', 'DESC'); + // $this->db->where('t1.BranchCode', $loginUserBranchId); + // $this->db->from('' . STUDENTCOURSE . ' as t2', 't2.StudentID = t1.StudentID', 'LEFT'); + // $this->db->where('t2.UniversityID', $getSearchData["University"]); + // $this->db->where('t2.CourseID', $getSearchData["Course"]); + + $University = $getSearchData['University']; + $Course = $getSearchData['Course']; + + // $Batch = $getSearchData['Batch']; + + $Batch = ''; + $StuStatus = $getSearchData['Status']; + if ($StuStatus == '') { + if ($University != '' && $Course == '') { + $subQuery = "SELECT S.*, IF(SFP.ID > 0, '1' , '0') as Fee_paid_exist + FROM " . STUDENTS . " as S LEFT JOIN " . STUDENTCOURSE . " as SC ON SC.StudentID = S.StudentID + LEFT JOIN " . UNIVERSITY . " as U ON SC.UniversityID = U.UniversityID LEFT JOIN " . COURSE . " as C ON + SC.CourseID = C.CourseID LEFT JOIN ". STUDENTS_FEES_PAID ." as SFP ON SFP.StudentID = S.StudentID + WHERE + SC.UniversityID = '$University' + AND SC.BranchID = '$loginUserBranchId' + GROUP BY SC.StudentID + ORDER BY S.CreatedOn"; + } + else if ($University != '' && $Course != '') { + $subQuery = "SELECT S.*, IF(SFP.ID > 0, '1' , '0') as Fee_paid_exist + FROM " . STUDENTS . " as S LEFT JOIN " . STUDENTCOURSE . " as SC ON SC.StudentID = S.StudentID + LEFT JOIN " . UNIVERSITY . " as U ON SC.UniversityID = U.UniversityID LEFT JOIN " . COURSE . " as C ON + SC.CourseID = C.CourseID LEFT JOIN ". STUDENTS_FEES_PAID ." as SFP ON SFP.StudentID = S.StudentID + WHERE + SC.CourseID = '$Course' AND SC.UniversityID = '$University' + AND SC.BranchID = '$loginUserBranchId' + GROUP BY SC.StudentID + ORDER BY S.CreatedOn"; + } // ### query branch code changed from student branch code to student course branch code + + // AND S.BranchCode = '$loginUserBranchId' -> SC.BranchCode = '$loginUserBranchId' + // (SC.UniversityID = '$University' + // OR (SC.CourseID = '$Course' AND SC.UniversityID = '$University')) + + } + else { + if ($University != '' && $Course == '') { + $subQuery = "SELECT S.*, IF(SFP.ID > 0, '1' , '0') as Fee_paid_exist + FROM " . STUDENTS . " as S LEFT JOIN " . STUDENTCOURSE . " as SC ON SC.StudentID = S.StudentID + LEFT JOIN " . UNIVERSITY . " as U ON SC.UniversityID = U.UniversityID LEFT JOIN " . COURSE . " as C ON + SC.CourseID = C.CourseID LEFT JOIN ". STUDENTS_FEES_PAID ." as SFP ON SFP.StudentID = S.StudentID + WHERE + SC.UniversityID = '$University' + AND SC.BranchID = '$loginUserBranchId' + AND S.IsActive = '$StuStatus' + GROUP BY SC.StudentID + ORDER BY S.CreatedOn"; + } + else if ($University != '' && $Course != '') { + $subQuery = "SELECT S.*, IF(SFP.ID > 0, '1' , '0') as Fee_paid_exist + FROM " . STUDENTS . " as S LEFT JOIN " . STUDENTCOURSE . " as SC ON SC.StudentID = S.StudentID + LEFT JOIN " . UNIVERSITY . " as U ON SC.UniversityID = U.UniversityID LEFT JOIN " . COURSE . " as C ON + SC.CourseID = C.CourseID LEFT JOIN ". STUDENTS_FEES_PAID ." as SFP ON SFP.StudentID = S.StudentID + WHERE + SC.CourseID = '$Course' AND SC.UniversityID = '$University' + AND SC.BranchID = '$loginUserBranchId' + AND S.IsActive = '$StuStatus' + GROUP BY SC.StudentID + ORDER BY S.CreatedOn"; + } + + // ### query branch code changed from student branch code to student course branch code + // AND S.BranchCode = '$loginUserBranchId' -> SC.BranchCode = '$loginUserBranchId' + + } + + $stuDetails = $this->db->query($subQuery); + + // $stuDetails = $this->db->get(); + + $checkArr = $stuDetails->result(); + if (count($checkArr) > 0) { + $results['studentList'] = true; + $results['student_details'] = $stuDetails->result(); + } + else { + $results['studentList'] = false; + } + } + } + else { + $results['studentList'] = false; + } + + return $results; + } + + // get a student cource list + + public function get_student_course_list($studentId, $req) + { + + // echo $req['localBranchID'];exit(); + + $this->db->select("t1.*,t2.UniversityName,t3.CourseName,t3.CourseCode,t4.SessionName, IF(t6.ID > 0, '1' , '0') as Fee_paid_exist"); + $this->db->from('' . STUDENTCOURSE . ' as t1'); + $this->db->join('' . UNIVERSITY . ' as t2', 't2.UniversityID = t1.UniversityID', 'LEFT'); + $this->db->join('' . COURSE . ' as t3', 't3.CourseID = t1.CourseID', 'LEFT'); + $this->db->join('' . SESSIONMASTER . ' as t4', 't4.SessionID = t1.SessionID', 'LEFT'); + $this->db->join(''.STUDENTS_FEES_STATUS.' as t5', 't5.StudentID = '.$studentId.' AND t5.CourseID = t1.CourseID', 'LEFT'); + $this->db->join(''.STUDENTS_FEES_PAID.' as t6', 't6.FeesId = t5.FeesID', 'LEFT'); + $this->db->where('t1.BranchID', $req['localBranchID']); + $this->db->where('t1.StudentID', $studentId); + $this->db->group_by('t1.CourseID'); + $courseDetails = $this->db->get(); + $checkArr = $courseDetails->result(); + if (count($checkArr) > 0) { + $result['stuCourseDetails'] = true; + $result['course_details'] = $courseDetails->result(); + } + else { + $result['stuCourseDetails'] = false; + } + + return $result; + } + + // get student course details + + public function get_student_course($studentcourseId) + { + $this->db->select('*'); + $this->db->from(STUDENTCOURSE); + $this->db->where('ID', $studentcourseId); + $courseDetails = $this->db->get(); + $checkArr = $courseDetails->result(); + if (count($checkArr) > 0) { + $result['stuCourseDetails'] = true; + $result['course_details'] = $courseDetails->result(); + } + else { + $result['stuCourseDetails'] = false; + } + + return $result; + } + + // get university list + + public function get_university_list() + { + $this->db->select('*'); + $this->db->order_by('CreatedOn', 'DESC'); + $this->db->from(UNIVERSITY); + $this->db->where('IsActive', 1); + $univDetails = $this->db->get(); + $universityDetails = $univDetails->result(); + if (count($universityDetails) > 0) { + $results['univList'] = true; + $results['university_details'] = $universityDetails; + } + else { + $results['univList'] = false; + $results['message'] = 'No record found'; + } + + return $results; + } + + // get course, batch for university + + public function get_courseBatch_list($univId) + { + $this->db->select('C.CourseID, C.CourseName,C.Specilization1,C.Specilization2, C.CourseCode'); + $this->db->from(COURSE . ' as C'); + $this->db->where('UniversityID', $univId); + $this->db->where('IsActive', 1); + $courseDetails = $this->db->get(); + if ($courseDetails->result()) { + $this->db->select('B.SessionID, B.SessionName'); + $this->db->from(SESSIONMASTER . ' as B'); + $this->db->join(SESSIONDETAILS . ' SD', 'SD.SessionID = B.SessionID'); + $this->db->where('SD.UniversityID', $univId); + $this->db->where('B.IsActive', 1); + $this->db->where('SD.IsActive', 1); + $batchDetails = $this->db->get(); + if ($batchDetails->result()) { + $result['courseStatus'] = true; + $result['course_details'] = $courseDetails->result(); + $result['batch_details'] = $batchDetails->result(); + } + else { + $result['courseStatus'] = false; + $result['message'] = "No records found!"; + } + } + else { + $result['courseStatus'] = false; + $result['message'] = "No records found!"; + } + + return $result; + } + + // Get exist student details + + public function get_exist_stu_details($data, $reqArr) + { + + // echo $data;exit(); + + $this->db->select('t0.*'); + $this->db->from('' . STUDENTS . ' as t0'); + $this->db->where('t0.StudentID', $data); + $personalDetails = $this->db->get()->result(); + $this->db->select('t1.*,t2.UniversityName,t3.CourseName,t3.Specilization1,t3.Specilization2,t4.SessionName, t5.BranchName'); + + // $this->db->from('' . STUDENTS . ' as t0'); + + $this->db->from('' . STUDENTCOURSE . ' as t1'); + $this->db->join('' . UNIVERSITY . ' as t2', 't2.UniversityID = t1.UniversityID', 'LEFT'); + $this->db->join('' . COURSE . ' as t3', 't3.CourseID = t1.CourseID', 'LEFT'); + $this->db->join('' . SESSIONMASTER . ' as t4', 't4.SessionID = t1.SessionID', 'LEFT'); + $this->db->join('' . BRANCH . ' as t5', 't5.BranchCode = t1.BranchID', 'LEFT'); + $this->db->where('t1.StudentID', $data); + + // $this->db->group_by('t1.StudentID'); + + $courseDetails = $this->db->get()->result(); + $result['personalDetails'] = $personalDetails; + $result['courseDetails'] = $courseDetails; + $result['existingStudentDetailsStatus'] = true; + return $result; + } + + // check exist + + public function check_exist($data, $checkData) + { + if ($checkData == 'studentId') { + + // check for student id + // $this->db->select('*'); + // $this->db->from(STAFF); + // $this->db->where('StaffID', $data); + // if ($this->db->get()->first_row()) { + // $result['existEmpId'] = true; + // $result['message'] = "This Employee ID is already exist!"; + // } else { + // $result['existEmpId'] = false; + // } + + } + else if ($checkData == 'mobileNumber') { + + // check for mobile number + + $this->db->select('*'); + $this->db->from(STUDENTS); + $this->db->where('MobileNumber', $data); + $details = $this->db->get()->result(); + + // echo count($details);exit(); + + if (count($details) > 0) { + + // print_r($details);exit(); + // echo $details[0]->StudentID;exit(); + + $datas['studentId'] = $details[0]->StudentID; + $datas['type'] = 'R001'; + $result['details'] = $datas; + $result['existMobile'] = true; + $result['message'] = "This Mobile Number is already exist!"; + } + else { + $this->db->select('*'); + $this->db->from(LOGIN); + $this->db->where('MobileNumber', $data); + $details1 = $this->db->get()->result(); + if ($details1 > 0) { + $datas['studentId'] = $details1[0]->StaffID; + $datas['type'] = $details1[0]->ListCode; + $result['details'] = $datas; + $result['existMobile'] = true; + $result['message'] = "This Mobile Number is already exist!"; + } + else { + $result['existMobile'] = false; + } + } + } + else if ($checkData == 'emailId') { + + // check for email id + + $this->db->select('*'); + $this->db->from(STUDENTS); + $this->db->where('EmailID', $data); + if ($this->db->get()->first_row()) { + $result['existEmailId'] = true; + $result['message'] = "This EmailId is already exist!"; + } + else { + $result['existEmailId'] = false; + } + } + else { + } + + return $result; + } + + // add student course + + public function add_student_course($studID, $Arr) + { + if ($this->getBranchActiveStatusforStuAdd($Arr['BranchID']) ['branch_active_status'] === '1') { + $this->db->select('*'); + $this->db->from(STUDENTCOURSE); + $this->db->where('StudentID', $studID); + $this->db->where('CourseID', $Arr['CourseID']); + if ($this->db->get()->first_row()) { + $result['addStuCourseStatus'] = false; + $result['message'] = "This Student Already exist for this course"; + } + else { + $this->db->insert(STUDENTCOURSE, $Arr); + if ($this->db->affected_rows() == '1') { + $result['addStuCourseStatus'] = true; + $result['message'] = "Successfully Student Course Details Updated"; + } + else { + $result['addStuCourseStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + } + else { + $result['addStuCourseStatus'] = false; + $result['message'] = "New Cource Cannot able to create for In-Active Branch"; + } + + return $result; + } + + // add student + + public function add_student($Arr, $courseArr, $imagename, $imageSource, $size) + { + + // echo $this->getBranchActiveStatusforStuAdd($courseArr['BranchID'])['branch_active_status'];exit(); + + if ($this->getBranchActiveStatusforStuAdd($courseArr['BranchID']) ['branch_active_status'] === '1') { + + // echo 'in';exit(); + + if ($imageSource == '') { // add employee without image + $imageNameDb = 'default.jpeg'; + $Arr['ProfilePicPath'] = "student/" . $imageNameDb; + + // print_r($Arr); + // print_r($courseArr);exit(); + + $this->db->select('*'); + $this->db->from(STUDENTS); + $this->db->where('MobileNumber', $Arr['MobileNumber']); + if ($this->db->get()->first_row()) { + $result['addStudentStatus'] = false; + $result['message'] = "This Student Already exist"; + } + else { + $this->db->insert(STUDENTS, $Arr); + $insert_id = $this->db->insert_id('StudentID'); + $courseArr['StudentID'] = $insert_id; + if ($this->db->affected_rows() == '1') { + $this->db->insert(STUDENTCOURSE, $courseArr); + if ($this->db->affected_rows() == '1') { + $loginArr['StaffID'] = $courseArr['StudentID']; + $loginArr['ListCode'] = STUDENT; + $loginArr['MobileNumber'] = $Arr['MobileNumber']; + $loginArr['EmailId'] = $Arr['EmailID']; + $loginArr['IsActive'] = $Arr['IsActive']; + $loginArr['CreatedBy'] = $Arr['CreatedBy']; + $loginArr['CreatedOn'] = $Arr['CreatedOn']; + $loginArr['Password'] = ENCR_PASSWORD; + $this->db->insert(LOGIN, $loginArr); + if ($this->db->affected_rows() == '1') { + $result['addStudentStatus'] = true; + $result['message'] = "Successfully student details added"; + } + else { + $result['addStudentStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + else { + $result['addStudentStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + else { + $result['addStudentStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + } + else { + $target = "../images/student/"; + $getUploadStatus = $this->upload_image($imageSource, $size, $target); + $imageNameDb = $getUploadStatus['status'] == true ? $getUploadStatus['imageName'] : $getUploadStatus['imageName'] = 'default.jpeg'; + $Arr['ProfilePicPath'] = "student/" . $imageNameDb; + $this->db->select('*'); + $this->db->from(STUDENTS); + $this->db->where('MobileNumber', $Arr['MobileNumber']); + if ($this->db->get()->first_row()) { + $result['addStudentStatus'] = false; + $result['message'] = "This Student Already exist"; + } + else { + $this->db->insert(STUDENTS, $Arr); + $insert_id = $this->db->insert_id('StudentID'); + $courseArr['StudentID'] = $insert_id; + if ($this->db->affected_rows() == '1') { + $this->db->insert(STUDENTCOURSE, $courseArr); + if ($this->db->affected_rows() == '1') { + $loginArr['StaffID'] = $courseArr['StudentID']; + $loginArr['ListCode'] = STUDENT; + $loginArr['MobileNumber'] = $Arr['MobileNumber']; + $loginArr['EmailId'] = $Arr['EmailID']; + $loginArr['IsActive'] = $Arr['IsActive']; + $loginArr['CreatedBy'] = $Arr['CreatedBy']; + $loginArr['CreatedOn'] = $Arr['CreatedOn']; + $loginArr['Password'] = ENCR_PASSWORD; + $this->db->insert(LOGIN, $loginArr); + if ($this->db->affected_rows() == '1') { + $result['addStudentStatus'] = true; + $result['message'] = "Successfully student details added"; + } + else { + $result['addStudentStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + else { + $result['addStudentStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + else { + $result['addStudentStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + } + } + else { + $result['addStudentStatus'] = false; + $result['message'] = "New Student cannot able to create for In-Active Branch"; + } + + return $result; + } + + // check existing data while update + + public function check_update_exist($exceptId, $datas, $checkFor) + { + if ($checkFor == 'mobileNumber') { + + // check update for mobile number + + $this->db->select('*'); + $this->db->from(STUDENTS); + $this->db->where('MobileNumber', $datas); + $this->db->where_not_in('StudentID', $exceptId); + if ($this->db->get()->first_row()) { + $result['existMobile'] = true; + $this->db->select('MobileNumber'); + $this->db->from(STUDENTS); + $this->db->where('StudentID', $exceptId); + $result['resetValue'] = $this->db->get()->first_row(); + $result['message'] = "This Mobile Number is already exist!"; + } + else { + + // check login + + $this->db->select('*'); + $this->db->from(LOGIN); + $this->db->where('MobileNumber', $datas); + $this->db->where_not_in('StaffID', $exceptId); + if ($this->db->get()->first_row()) { + $result['existMobile'] = true; + $this->db->select('MobileNumber'); + $this->db->from(STUDENTS); + $this->db->where('StudentID', $exceptId); + $result['resetValue'] = $this->db->get()->first_row(); + $result['message'] = "This Mobile Number is already exist!"; + } + else { + $result['existMobile'] = false; + } + } + } + else if ($checkFor == 'emailId') { + + // check update for email + + $this->db->select('*'); + $this->db->from(STUDENTS); + $this->db->where('EmailID', $datas); + $this->db->where_not_in('StudentID', $exceptId); + if ($this->db->get()->first_row()) { + $result['existEmailId'] = true; + $this->db->select('EmailID'); + $this->db->from(STUDENTS); + $this->db->where('StudentID', $exceptId); + $result['resetValue'] = $this->db->get()->first_row(); + $result['message'] = "This EmailId is already exist!"; + } + else { + $result['existEmailId'] = false; + } + } + else { + } + + return $result; + } + + // get the student entrollment doc details + + public function getStudent_doc_details($stuId) + { + $this->db->select('*'); + $this->db->order_by('CreatedOn', 'DESC'); + $this->db->from(STUDENTDOCUMENTDETAILS); + $this->db->where('StudentID', $stuId); + $getDocDetails = $this->db->get(); + $documentDetails = $getDocDetails->result(); + if (count($documentDetails) > 0) { + $results['docListStatus'] = true; + $results['student_doc_details'] = $documentDetails; + } + else { + $results['docListStatus'] = false; + $results['message'] = 'No record found'; + } + return $results; + } + + public function deleteStu_doc_details($stuId, $docId) + { + $sql1 = "SELECT * FROM ".STUDENTDOCUMENTDETAILS." WHERE StudentID = '" . $stuId . "' AND ID = '" . $docId . "'"; + $resultSql1 = $this->db->query($sql1)->result(); + if(count($resultSql1) > 0){ + // print_r($resultSql1); + // echo $resultSql1[0]->DocumentStorePath;exit(); + $sql = "DELETE FROM ".STUDENTDOCUMENTDETAILS." WHERE StudentID = '" . $stuId . "' AND ID = '" . $docId . "'"; + if ($this->db->query($sql)) { + try{ + if(!file_exists('../images/' . $resultSql1[0]->DocumentStorePath)) { + throw new Exception("File Not Found."); + }else { + unlink('../images/' . $resultSql1[0]->DocumentStorePath); + } + } catch(Exception $e){ + // echo "Error :"; + } finally { + $results['message'] = 'Deleted Successfully.'; + $results['deleteStatus'] = true; + } + } + else { + $results['deleteStatus'] = false; + $results['message'] = 'Something went wrong.please try again'; + } + }else{ + $results['deleteStatus'] = false; + $results['message'] = 'Something went wrong.please try again'; + } + return $results; + } + + // add student entroll doc details + + public function student_entroll_doc_add($req, $doc_status) + { + + // if( $doc_status == "true") { + + $target = "../images/documents/"; + $getUploadStatus = $this->upload_doc_student($req['doc_source'], $req['doc_name'], $req['doc_size'], $target, $req['student_id']); + if ($imageNameDb = $getUploadStatus['status'] == true) { + $imageNameDb = $getUploadStatus['status'] == true ? $getUploadStatus['imageName'] : $getUploadStatus['imageName'] = 'default.jpeg'; + + // echo $imageNameDb;exit(); + + $strPath = "documents/" . $imageNameDb; + $stuId = $req['student_id']; + $docTypeName = $req['document_type_name']; + $docStatus = $req['document_status']; + $docComments = $req['document_comments']; + $docCreatedBy = $req['CreatedBy']; + $docCreatadOn = $req['CreatedOn']; + + // echo $docCreatadOn;exit(); + // ".STAFF_BRANCH." + + $sql1 = "INSERT INTO ".STUDENTDOCUMENTDETAILS." (StudentID, DocumentName, Status, DocumentStorePath, Comments, CreatedBy, CreatedOn) + VALUES ('$stuId', '$docTypeName', '$docStatus', '$strPath', '$docComments', '$docCreatedBy', '$docCreatadOn')"; + + // update branch to staff_branch table + + if ($this->db->query($sql1) == '1') { + $result['stuDocUpdateStatus'] = true; + $result['message'] = "Successfully Student document details updated"; + } + else { + $result['stuDocUpdateStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + else { + $result['stuDocUpdateStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + return $result; + } + + // student document upload target path + + public function upload_doc_student($imageSource, $doc_name, $size, $target, $stu_id) + { + $key2 = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') , 0, 12); + $new_regNo = "Dri_" . $key2 . "_" . $stu_id . "_" . $doc_name; + $targetPlace = $target . $new_regNo; + + // echo $targetPlace;exit(); + + if (!move_uploaded_file($imageSource, $targetPlace)) { + return $result['status'] = false; + } + else { + $result['status'] = true; + $result['imageName'] = $new_regNo; + return $result; + } + } + + public function getStudent_PendingDoc_Details($stuID) { + $this->db->select('*'); + $this->db->order_by('CreatedOn', 'DESC'); + $this->db->from(STUDENTDOCUMENTTRACKDETAILS); + $this->db->where('StudentID', $stuID); + $getPendDocDetails = $this->db->get(); + $documentPendingDetails = $getPendDocDetails->result(); + if (count($documentPendingDetails) > 0) { + $results['PendingDocListStatus'] = true; + $results['student_pending_doc_details'] = $documentPendingDetails; + } + else { + $results['PendingDocListStatus'] = false; + $results['message'] = 'No record found'; + } + return $results; + } + + // add student enrollment pending document details + public function addStu_PendingDoc_Details($reqData,$localdata) { + // echo "model"; + // print_r($reqData);exit(); + $this->db->insert(STUDENTDOCUMENTTRACKDETAILS, $reqData); + if ($this->db->affected_rows() > 0) { + // Entry for call track + if($reqData['Status']=='1'){ + $this->updatePendingDocumentInCallTrack($reqData,$localdata); + } + + // end call track entry + $results['AddStuPendingDocStatus'] = true; + $results['message'] = "Added Successfully."; + } else { + $results['AddStuPendingDocStatus'] = false; + $results['message'] = "Something went wrong.please try again."; + } + return $results; + } + + public function deleteStu_entrollPending_doc_details($id) { + // echo $id;exit(); + $sql = "DELETE FROM ".STUDENTDOCUMENTTRACKDETAILS." WHERE ID = '" . $id . "'"; + if ($this->db->query($sql)) { + $results['deleteStatus'] = true; + $results['message'] = 'Document pending track details deleted.'; + } else { + $results['deleteStatus'] = false; + $results['message'] = 'Something went wrong.please try again'; + } + return $results; + } + + + // update student personal details + + public function update_student($empArr, $updateFor, $imagename, $imageSource, $size) + { + // print_r($empArr);exit(); + if ($imageSource == '') { + // print_r($empArr); + // print_r($updateFor); + // exit(); + $this->db->select('*'); + $this->db->from(STUDENTS); + $this->db->where('MobileNumber', $empArr['MobileNumber']); + $this->db->where_not_in('StudentID', $updateFor); + if ($this->db->get()->first_row()) { + $result['updateStuStatus'] = false; + $result['message'] = "This Mobile Number Already Exist"; + } + else { + $this->db->select('*'); + $this->db->from(LOGIN); + $this->db->where('MobileNumber', $empArr['MobileNumber']); + $this->db->where_not_in('StaffID', $updateFor); + if ($this->db->get()->first_row()) { + $result['updateStuStatus'] = false; + $result['message'] = "This Mobile Number Already Exist"; + } + else { + $this->db->where('StudentID', $updateFor); + $this->db->update(STUDENTS, $empArr); + if ($this->db->affected_rows() == '1') { + $mobile = $empArr['MobileNumber']; + $email = $empArr['EmailID']; + $active = $empArr['IsActive']; + $updatedBy = $empArr['UpdatedBy']; + $updatedOn = $empArr['UpdatedOn']; + $sql = "UPDATE " . LOGIN . " SET MobileNumber='$mobile', EmailId='$email', IsActive='$active', UpdatedBy='$updatedBy', UpdatedOn='$updatedOn' WHERE StaffID='$updateFor'"; + if ($this->db->query($sql) == '1') { + $result['updateStuStatus'] = true; + $result['message'] = "Successfully student details Updated"; + } + else { + $result['updateStuStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + else { + $result['updateStuStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + } + } + else { + $this->db->select('*'); + $this->db->from(STUDENTS); + $this->db->where('MobileNumber', $empArr['MobileNumber']); + $this->db->where_not_in('StudentID', $updateFor); + if ($this->db->get()->first_row()) { + $result['updateStuStatus'] = false; + $result['message'] = "This Mobile Number Already Exist"; + } + else { + $this->db->select('*'); + $this->db->from(LOGIN); + $this->db->where('MobileNumber', $empArr['MobileNumber']); + $this->db->where_not_in('StaffID', $updateFor); + if ($this->db->get()->first_row()) { + $result['updateStuStatus'] = false; + $result['message'] = "This Mobile Number Already Exist"; + } + else { + $target = "../images/student/"; + $getUploadStatus = $this->upload_image($imageSource, $size, $target); + $imageNameDb = $getUploadStatus['status'] == true ? $getUploadStatus['imageName'] : $getUploadStatus['imageName'] = 'default.jpeg'; + $empArr['ProfilePicPath'] = "student/" . $imageNameDb; + $this->db->select('ProfilePicPath'); + $this->db->from(STUDENTS); + $this->db->where('StudentID', $updateFor); + $roleDetails = $this->db->get()->first_row(); + + // echo $roleDetails->ProfilePicPath; + // exit(); + + if ($roleDetails->ProfilePicPath != '' && $roleDetails->ProfilePicPath != 'student/default.jpeg') { + unlink('../images/' . $roleDetails->ProfilePicPath); + } + else { + } + $this->db->where('StudentID', $updateFor); + $this->db->update(STUDENTS, $empArr); + if ($this->db->affected_rows() == '1') { + $mobile = $empArr['MobileNumber']; + $email = $empArr['EmailID']; + $active = $empArr['IsActive']; + $updatedBy = $empArr['UpdatedBy']; + $updatedOn = $empArr['UpdatedOn']; + $sql = "UPDATE " . LOGIN . " SET MobileNumber='$mobile', EmailId='$email', IsActive='$active', UpdatedBy='$updatedBy', UpdatedOn='$updatedOn' WHERE StaffID='$updateFor'"; + if ($this->db->query($sql) == '1') { + $result['updateStuStatus'] = true; + $result['message'] = "Successfully student details Updated"; + } + else { + $result['updateStuStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + else { + $result['updateStuStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + } + } + return $result; + } + + // Update Student Course Details + + public function update_student_course($reqArr, $id) + { + + // print_r($id); + // print_r($reqArr); + // exit(); + + $this->db->select('*'); + $this->db->from(STUDENTCOURSE); + $this->db->where('StudentID', $reqArr['StudentID']); + $this->db->where('CourseID', $reqArr['CourseID']); + $this->db->where_not_in('ID', $id); + if ($this->db->get()->first_row()) { + $result['updateStuCourseStatus'] = false; + $result['message'] = "This Student Already exist for this course"; + } + else { + $this->db->where('ID', $id); + $this->db->update(STUDENTCOURSE, $reqArr); + if ($this->db->affected_rows() == '1') { + $result['updateStuCourseStatus'] = true; + $result['message'] = "Successfully Student Course Details Updated"; + } + else { + $result['updateStuCourseStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + return $result; + } + + // image upload in taget path + + public function upload_image($imageSource, $size, $target) + { + $key2 = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') , 0, 12); + $new_regNo = "Dri_" . $key2 . "." . 'jpeg'; + $targetPlace = $target . $new_regNo; + + // echo $targetPlace;exit(); + + if (!move_uploaded_file($imageSource, $targetPlace)) { + return $result['status'] = false; + } + else { + $result['status'] = true; + $result['imageName'] = $new_regNo; + return $result; + } + } + + + /* + * update followup details for application status in call tracking + * created by kms + * */ + public function updatePendingDocumentInCallTrack($fromDetails=null,$localdata=null){ + + // check document type + $this->db->select('AC.ActivityID,PLD.ListCode'); + $this->db->from(ACTIVITY_STATUS.' as AS'); + $this->db->join(ACTIVITY.' as AC', 'AC.ActivityID = AS.ActivityID'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'PLD.ListCode = AS.StatusName'); + $this->db->where('AC.ActivityName','DOCUMENT FOLLOWUP'); + $this->db->where('PLD.ListName','PENDING'); + $this->db->where('AC.IsActive','1'); + $this->db->where('AS.IsActive','1'); + $checkApplicationStatus=$this->db->get()->last_row(); + if($checkApplicationStatus){ + + $studentDetails = $this->studentInfoForDocumentStatus($fromDetails); + if($studentDetails){ + $arrayDetails['MobileNumber']=$studentDetails->MobileNumber; + $arrayDetails['LeadName']=$studentDetails->Firstname; + $arrayDetails['University']=""; + $arrayDetails['Course']=""; + $arrayDetails['ActivityStatus'] = $checkApplicationStatus->ActivityID;; + $arrayDetails['StatusCode']=$checkApplicationStatus->ListCode; + $arrayDetails['CreatedBranch']=$localdata['localBranchID']; + $arrayDetails['CreatedOn']=$fromDetails['CreatedOn']; + $arrayDetails['FollowupOn']=$date = date('d-m-Y'); + $arrayDetails['FollowupComments']=$fromDetails['Details']; + if($localdata['localType']==SUPER_ADMIN){ + $this->db->select('LO.ID'); + $this->db->from(STAFF_BRANCH.' as STB'); + $this->db->join(LOGIN.' as LO', 'LO.StaffID = STB.StaffID'); + $this->db->where('STB.BranchCode',$localdata['localBranchID']); + $this->db->where('LO.ListCode',ADMIN); + $this->db->where('STB.IsActive','1'); + $this->db->where('LO.IsActive','1'); + $assignDet=$this->db->get()->last_row(); + if($assignDet){ + $arrayDetails['CreatedBy']=$assignDet->ID; + } + else{ + $arrayDetails['CreatedBy']=$fromDetails['CreatedBy']; + } + + } + else{ + $arrayDetails['CreatedBy']=$fromDetails['CreatedBy']; + } + + // new lead details + $newLeadDetails['MobileNumber'] = $arrayDetails['MobileNumber']; + $newLeadDetails['LeadName'] = $arrayDetails['LeadName']; + $newLeadDetails['CreatedBy'] = $fromDetails['CreatedBy']; + $newLeadDetails['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_DETAILS, $newLeadDetails); + // this if for insert lead details + if($this->db->affected_rows() == '1'){ + // get and store insert id from db + $track_Details['LeadID']=$this->db->insert_id(); + $track_Details['ActivityStatus'] = $arrayDetails['ActivityStatus']; + $track_Details['University'] = $arrayDetails['University']; + $track_Details['Course'] = $arrayDetails['Course']; + $track_Details['AssignedTo'] = $arrayDetails['CreatedBy']; + $track_Details['StatusCode'] = $arrayDetails['StatusCode']; + $track_Details['CreatedBy'] = $fromDetails['CreatedBy']; + $track_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $track_Details['CreatedBranch']=$arrayDetails['CreatedBranch']; + $this->db->insert(LEAD_TRACKING, $track_Details); + // this if for insert tracking details + if($this->db->affected_rows() == '1'){ + $insertfollowup_Details['TrackingID']=$this->db->insert_id(); + $insertfollowup_Details['FollowupOn']=$arrayDetails['FollowupOn']; + $insertfollowup_Details['FollowupComments']=$arrayDetails['FollowupComments']; + $insertfollowup_Details['CreatedBy'] = $fromDetails['CreatedBy']; + $insertfollowup_Details['CreatedOn'] = $arrayDetails['CreatedOn']; + $this->db->insert(LEAD_TRACKING_FOLLOWUP, $insertfollowup_Details); + // this if for insert follow up details + + } + + + } + + + + } + + + else{ + return false; + } + } + else{ + return false; + } + + } + + /* + * get student info for documet updates + * created by kms + * */ + public function studentInfoForDocumentStatus($details=null){ + + $this->db->select('ST.Firstname,ST.MobileNumber,US.UniversityName,CU.CourseName'); + $this->db->from(STUDENTCOURSE.' as STC'); + $this->db->join(STUDENTS.' as ST', 'ST.StudentID = STC.StudentID'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = STC.CourseID'); + $this->db->join(UNIVERSITY.' as US', 'US.UniversityID = STC.UniversityID'); + $this->db->where('ST.StudentID',$details['StudentID']); + // $this->db->where('STC.CourseID',$details[0]['CourseID']); + $leadDet=$this->db->get()->last_row(); + if($leadDet){ + return $leadDet; + } + else{ + return false; + } + + } +} diff --git a/api/application/models/Studentview_model.php b/api/application/models/Studentview_model.php new file mode 100644 index 0000000..4dfa717 --- /dev/null +++ b/api/application/models/Studentview_model.php @@ -0,0 +1,390 @@ +db->select('ST.*'); + $this->db->from( LOGIN . ' as LO'); + $this->db->join( STUDENTS . ' as ST', 'LO.StaffID = ST.StudentID'); + $this->db->where('LO.ID', $requestedBy); + $studentDetails = $this->db->get()->first_row(); + if($studentDetails){ + $result['studentStatus'] = true; + $result['studentDetails'] = $studentDetails; + // get student course details + $result['courseDetails'] = $this->getStudentCourse($studentDetails->StudentID); + } + else{ + $result['studentStatus'] = false; + $result['studentInfo'] = ""; + } + } + else if($requestFrom =='1'){ + $this->db->select('ST.*'); + $this->db->from( LOGIN . ' as LO'); + $this->db->join( STUDENTS . ' as ST', 'LO.StaffID = ST.StudentID'); + $this->db->where('ST.StudentID', $requestedBy); + $studentDetails = $this->db->get()->first_row(); + if($studentDetails){ + $result['studentStatus'] = true; + $result['studentDetails'] = $studentDetails; + // get student course details + $result['courseDetails'] = $this->getStudentCourse($studentDetails->StudentID); + } + else{ + $result['studentStatus'] = false; + $result['studentInfo'] = ""; + } + } + else if ($requestFrom =='3'){ + $this->db->select('ST.*'); + $this->db->from( LOGIN . ' as LO'); + $this->db->join( STUDENTS . ' as ST', 'LO.StaffID = ST.StudentID'); + $this->db->where('ST.MobileNumber', $requestedBy); + $studentDetails = $this->db->get()->first_row(); + if($studentDetails){ + $result['studentStatus'] = true; + $result['studentDetails'] = $studentDetails; + // get student course details + $result['courseDetails'] = $this->getStudentCourse($studentDetails->StudentID); + } + else{ + $result['studentStatus'] = false; + $result['studentInfo'] = ""; + } + } + + return $result; + + } + /* + * get student course details + * created by kms + * */ + public function getStudentCourse($studentId=null){ + + $this->db->select('SCU.EnrollmentID,CU.CourseID,CU.CourseName,US.UniversityID,US.UniversityName,US.UniversityShortName'); + $this->db->from( STUDENTCOURSE . ' as SCU'); + $this->db->join( COURSE . ' as CU', 'CU.CourseID = SCU.CourseID'); + $this->db->join( UNIVERSITY . ' as US', 'US.UniversityID = SCU.UniversityID'); + // $this->db->join( SESSIONMASTER . ' as SM', 'SM.SessionID = SCU.SessionID'); + $this->db->where('SCU.StudentID', $studentId); + $courseDetails = $this->db->get(); + if($courseDetails->result()){ + $studentCourseStatus['status'] = true; + foreach ($courseDetails->result() as $row){ + $fetchData['CourseID']=$row->CourseID; + $fetchData['CourseName']=$row->CourseName; + $fetchData['UniversityID']=$row->UniversityID; + $fetchData['UniversityName']=$row->UniversityName; + $fetchData['UniveShortName'] = $row->UniversityShortName; + // $fetchData['SessionName']=$row->SessionName; + $fetchData['EnrollmentID']=$row->EnrollmentID; + // get student fees details + $fetchData['feesDetails']=$this->getStudentFeesDetails($studentId,$row->CourseID); + // get student boollet details + $fetchData['studyMaterialDetails']=$this->getStudentMaterialDetails($studentId,$row->CourseID); + // get application details + $fetchData['applicationDetails']=$this->getStudentCertificateDetails($studentId,$row->CourseID); + // get student Mark crad details + $fetchData['markCardDetails']=$this->getMarkcardDetails($studentId,$row->CourseID); + + $CourseArray[]=$fetchData; + + + } + $studentCourseStatus['courseStatus'] = $CourseArray; + } + else{ + $studentCourseStatus['status'] = false; + } + + return $studentCourseStatus; + } + + /* + * get student fees details + * created by kms + * */ + public function getStudentFeesDetails($studentID=null,$courseID=null){ + $serachArray=[WAIVER,REFERRAL]; + + $this->db->distinct(); + $this->db->select('SFS.FeesID,SFS.FeesType,SFS.RollNo,ifnull(SFS.CourseFees,0) as CourseFees,ifnull(SFS.STFOrWR,0) as STFOrWR,ifnull(SFS.Waiver,0) as Waiver,ifnull(SFS.Others,0) as Others,CF.Sem_Year,CF.FeesType as CourseFeesType,SM.SessionName,SM1.SessionName as ToSessionName,CF.ProgramType,BA.BatchName,BA.BatchDate'); + $this->db->from(STUDENTS_FEES_STATUS.' as SFS'); + $this->db->join(SESSIONMASTER.' as SM', 'SM.SessionID = SFS.SessionName'); + $this->db->join(SESSIONMASTER.' as SM1', 'SM1.SessionID = SFS.ToSessionName','left'); + $this->db->join(STUDENTS_FEES_PAID.' as SFP','SFP.FeesId = SFS.FeesID','left'); + $this->db->join(COURSE_FEES.' as CF', 'CF.ID = SFS.FeesType'); + $this->db->join(BATCH.' as BA', 'BA.BatchCode = SFS.BatchCode'); + $this->db->where('SFS.CourseID', $courseID); + $this->db->where('SFS.StudentID', $studentID); + $this->db->order_by('SFS.FeesID', 'ASC'); + $getFeeDetails = $this->db->get(); + if($getFeeDetails->result()){ + foreach ($getFeeDetails->result() as $feeRow){ + $storePaidDetails['FeesID'] = $feeRow->FeesID; + $storePaidDetails['FeesName'] = $feeRow->Sem_Year; + $storePaidDetails['CourseFees'] = $feeRow->CourseFees; + $storePaidDetails['ProgramType'] = $feeRow->ProgramType; + $storePaidDetails['SessionName'] = $feeRow->SessionName; + if($feeRow->ToSessionName=='' || $feeRow->ToSessionName==null){ + $storePaidDetails['ToSessionName'] = "Not Applicable"; + } + else{ + $storePaidDetails['ToSessionName'] = $feeRow->ToSessionName; + } + + $storePaidDetails['RollNo'] = $feeRow->RollNo; + $storePaidDetails['STFOrWR'] = $feeRow->STFOrWR; + $storePaidDetails['Waiver'] = $feeRow->Waiver; + $storePaidDetails['Others'] = $feeRow->Others; + $storePaidDetails['CourseFeesType'] = $feeRow->CourseFeesType; + $storePaidDetails['PayableAmount'] = $feeRow->CourseFees+$feeRow->STFOrWR+$feeRow->Others-$feeRow->Waiver; + + $this->db->select('ifnull(SUM((BillAmount)),0) as PaidBillAmount'); + $this->db->where('FeesId',$feeRow->FeesID); + $paidBillAmount = $this->db->get(STUDENTS_FEES_PAID)->result(); + $storePaidDetails['PaidBillAmount']=$paidBillAmount[0]->PaidBillAmount; + if($paidBillAmount[0]->PaidBillAmount > $storePaidDetails['PayableAmount']){ + $storePaidDetails['BalanceAmount']=0; + + } + else{ + $storePaidDetails['BalanceAmount']=$storePaidDetails['PayableAmount'] - $paidBillAmount[0]->PaidBillAmount; + } + + // sepearte for student waiver and referral bill list + $this->db->select('ifnull(SUM((BillAmount)),0) as StudentWaiverRefAmount'); + $this->db->where('FeesId',$feeRow->FeesID); + $this->db->where_in('ModeOfPayment',$serachArray); + $studentWaiverRefAmount = $this->db->get(STUDENTS_FEES_PAID)->result(); + + $storePaidDetails['StudentWaiverRefAmount']=$studentWaiverRefAmount[0]->StudentWaiverRefAmount; + + $this->db->select('ifnull(SUM((BillAmount)),0) as StudentPaidAmount'); + $this->db->where('FeesId',$feeRow->FeesID); + $this->db->where('ModeOfPayment !=',WAIVER); + $this->db->where('ModeOfPayment !=',REFERRAL); + $studentPaidAmount = $this->db->get(STUDENTS_FEES_PAID)->result(); + + $storePaidDetails['StudentPaidAmount']=$studentPaidAmount[0]->StudentPaidAmount; + $storePaidDetails['BatchName'] = $feeRow->BatchName; + $storePaidDetails['BatchDate'] = $feeRow->BatchDate; + + // for get paid bill details + // for get paid bill details + $this->db->select('ifnull(SUM((BillAmount)),0) as BillAmount,BillNO,BillDate,ModeOfPayment,ReceiptNo,BR.BranchName,BR.Address,BR.LogoPath,STF.Firstname as ReceivedBy'); + $this->db->from(STUDENTS_FEES_PAID.' as SFP'); + $this->db->join(BRANCH.' as BR','BR.BranchCode = SFP.UpdatedBy','left'); + $this->db->join(LOGIN.' as LO','LO.ID = SFP.CreatedBy'); + $this->db->join(STAFF.' as STF','STF.StaffID = LO.StaffID'); + $this->db->where('SFP.FeesId',$feeRow->FeesID); + $this->db->order_by('SFP.ID',"ASC"); + $this->db->group_by('SFP.BillNO'); + $storePaidDetails['paidDetails']=$this->db->get()->result(); + // for installment details + $this->load->model('Fees_status_model'); + + $InstallemtResult = $this->Fees_status_model->getInstallmentDetails($feeRow->FeesID); + + if($InstallemtResult != false){ + $storePaidDetails['InstallmentDetails']=$InstallemtResult; + } + else{ + + $storePaidDetails['InstallmentDetails']=""; + + + } + $mergeResult[]=$storePaidDetails; + + } + + $getStudentDefaultFees = $this->getDefaultCourseFees($studentID,$courseID); + if($getStudentDefaultFees != false){ + return array_merge($mergeResult,$getStudentDefaultFees); + } + else{ + return$mergeResult; + } + + } + else { + return false; + } + + } + /* + * get default course details + * created by kms + * */ + public function getDefaultCourseFees($studentID=null,$courseID=null){ + $serachArray = ["PC","TC","DC","MC","OTHER"]; + $this->db->distinct(); + $this->db->select('SFS.FeesID,SFS.FeesType,SFS.SessionName,SFS.RollNo,ifnull(SFS.CourseFees,0) as CourseFees,ifnull(SFS.STFOrWR,0) as STFOrWR,ifnull(SFS.Waiver,0) as Waiver,ifnull(SFS.Others,0) as Others'); + $this->db->from(STUDENTS_FEES_STATUS.' as SFS'); + $this->db->join(STUDENTS_FEES_PAID.' as SFP','SFP.FeesId = SFS.FeesID','left'); + //$this->db->join(COURSE_FEES.' as CF', 'CF.ID = SFS.FeesType'); + $this->db->where('SFS.CourseID', $courseID); + $this->db->where('SFS.StudentID', $studentID); + $this->db->where_in('SFS.FeesType', $serachArray); + $this->db->order_by('SFS.FeesID', 'ASC'); + $getFeeDetails = $this->db->get(); + if($getFeeDetails->result()){ + foreach ($getFeeDetails->result() as $feeRow){ + $storePaidDetails['FeesID'] = $feeRow->FeesID; + $storePaidDetails['FeesName'] = $feeRow->FeesType; + $storePaidDetails['ProgramType'] = $feeRow->FeesType; + $storePaidDetails['CourseFees'] = $feeRow->CourseFees; + $storePaidDetails['SessionName'] = "Not Applicable"; + $storePaidDetails['ToSessionName'] = "Not Applicable"; + $storePaidDetails['RollNo'] = $feeRow->RollNo; + $storePaidDetails['STFOrWR'] = $feeRow->STFOrWR; + $storePaidDetails['Waiver'] = $feeRow->Waiver; + $storePaidDetails['Others'] = $feeRow->Others; + $storePaidDetails['PayableAmount'] = $feeRow->CourseFees+$feeRow->STFOrWR+$feeRow->Others-$feeRow->Waiver; + + $this->db->select('ifnull(SUM((BillAmount)),0) as PaidBillAmount'); + $this->db->where('FeesId',$feeRow->FeesID); + $paidBillAmount = $this->db->get(STUDENTS_FEES_PAID)->result(); + $storePaidDetails['PaidBillAmount']=$paidBillAmount[0]->PaidBillAmount; + if($paidBillAmount[0]->PaidBillAmount > $storePaidDetails['PayableAmount']){ + $storePaidDetails['BalanceAmount']=0; + + } + else{ + $storePaidDetails['BalanceAmount']=$storePaidDetails['PayableAmount'] - $paidBillAmount[0]->PaidBillAmount; + } + $storePaidDetails['BatchName'] = "Not Applicable"; + $storePaidDetails['BatchDate'] = ""; + + // for get paid bill details + $this->db->select('ifnull(SUM((BillAmount)),0) as BillAmount,BillNO,BillDate,ModeOfPayment,ReceiptNo,BR.BranchName,BR.Address,BR.LogoPath,STF.Firstname as ReceivedBy'); + $this->db->from(STUDENTS_FEES_PAID.' as SFP'); + $this->db->join(BRANCH.' as BR','BR.BranchCode = SFP.UpdatedBy','left'); + $this->db->join(LOGIN.' as LO','LO.ID = SFP.CreatedBy'); + $this->db->join(STAFF.' as STF','STF.StaffID = LO.StaffID'); + $this->db->where('SFP.FeesId',$feeRow->FeesID); + $this->db->order_by('SFP.ID',"ASC"); + $this->db->group_by('SFP.BillNO'); + $storePaidDetails['paidDetails']=$this->db->get()->result(); + $storePaidDetails['InstallmentDetails']=""; + $mergeResult[]=$storePaidDetails; + + } + + return $mergeResult; + } + else { + return false; + } + + } + + /* + * get student study material details + * created by kms + * */ + public function getStudentMaterialDetails($studentID=null,$courseID=null){ + $this->db->select('SMS.CourseID,SMS.SDate,SMS.Comments,SMS.Sem,CF.Sem_Year,CF.FeesType,PLD.ListName'); + $this->db->from(STUDY_MATERIAL_STATUS.' as SMS'); + $this->db->join(COURSE_FEES.' as CF','CF.ID = SMS.CourseID'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = CF.CourseID'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'PLD.ListCode = SMS.ListCode'); + $this->db->where('CU.CourseID', $courseID); + $this->db->where('SMS.StudentID', $studentID); + $this->db->order_by('SMS.ID', 'DESC'); + $getMaterialDetails = $this->db->get(); + if ($getMaterialDetails->result()){ + return $getMaterialDetails->result(); + } + else{ + return false; + } + } + /* + * get student certificate details + * created by kms + * */ + public function getStudentCertificateDetails($studentID=null,$courseID=null){ + $this->db->select('AS.CertificationNo,AS.AppDate,AS.Comments,CM.CertificateName,PLD.ListName'); + $this->db->from(APPLICATION_STATUS.' as AS'); + $this->db->join(CERTIFICATION_MASTER.' as CM','CM.CertificationID = AS.CertificationType'); + //$this->db->join(COURSE_FEES.' as CF','CF.ID = AS.CourseID'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = AS.CourseID'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'PLD.ListCode = AS.ListCode'); + $this->db->where('CU.CourseID', $courseID); + $this->db->where('AS.StudentID', $studentID); + $this->db->order_by('AS.ID', 'DESC'); + $getCertDetails = $this->db->get(); + + if($getCertDetails->result()){ + return $getCertDetails->result(); + } + + else { + return false; + } + + } + /* + * get mark card details + * created by kms + * */ + public function getMarkcardDetails($studentID=null,$courseID=null){ + + $this->db->select('CS.CourseID,CS.CertificationNo,CS.CDate,CS.Comments,CS.CertificationType as CertificateName,CF.Sem_Year,CF.FeesType,CS.Sem,PLD.ListName'); + $this->db->from(CERTIFICATION_STATUS.' as CS'); + $this->db->join(COURSE_FEES.' as CF','CF.ID = CS.CourseID'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = CF.CourseID'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'PLD.ListCode = CS.ListCode'); + $this->db->where('CU.CourseID', $courseID); + $this->db->where('CS.StudentID', $studentID); + $this->db->where_in('CS.CertificationType', 'MARK CARD'); + $this->db->order_by('CS.ID', 'DESC'); + $getMarkDetails = $this->db->get(); + if ($getMarkDetails->result()){ + return $getMarkDetails->result(); + } + else{ + return false; + } + } + /* + * get student application details + * created by kms*/ + public function getStudentApplicationDetails($studentID=null,$courseID=null){ + $this->db->select('AS.CourseID,AS.AppDate,AS.Comments,CF.Sem_Year,PLD.ListName'); + $this->db->from(APPLICATION_STATUS.' as AS'); + $this->db->join(COURSE_FEES.' as CF','CF.ID = AS.CourseID'); + $this->db->join(COURSE.' as CU', 'CU.CourseID = CF.CourseID'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'PLD.ListCode = AS.ListCode'); + $this->db->where('CU.CourseID', $courseID); + $this->db->where('AS.StudentID', $studentID); + $this->db->order_by('AS.ID', 'DESC'); + $getAppDetails = $this->db->get(); + if ($getAppDetails->result()){ + return $getAppDetails->result(); + } + else{ + return false; + } + } +} \ No newline at end of file diff --git a/api/application/models/Subject_model.php b/api/application/models/Subject_model.php new file mode 100644 index 0000000..d4e185a --- /dev/null +++ b/api/application/models/Subject_model.php @@ -0,0 +1,102 @@ +db->select('SubjectCode'); + $this->db->where('SubjectCode',$arrayDetails['SubjectCode']); + if($this->db->get(SUBJECTMASTER)->first_row()){ + $result['SubjectStatus']=false; + $result['message']="This subject code already exists"; + }else{ + + $this->db->insert(SUBJECTMASTER,$arrayDetails); + if ($this->db->affected_rows() == '1') { + + $result['SubjectStatus']=true; + $result['message']="Successfully Subject Code is added"; + + }else{ + $result['SubjectStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + return $result; +} + + + /* + * Update Subject details + * created by srk + */ + +public function updateSubject($arrayDetails=null,$SubjectID=null) +{ + $this->db->select('SubjectCode'); + $this->db->where('SubjectCode',$arrayDetails['SubjectCode']); + $this->db->where('SubjectCode !=', $arrayDetails['SubjectCode']); + if($this->db->get(SUBJECTMASTER)->first_row()){ + $result['SubjectStatus']=false; + $result['message']="This subject code is already exists"; + }else{ + $this->db->where('SubjectID',$SubjectID); + $upateStatus=$this->db->update(SUBJECTMASTER, $arrayDetails); + + + + if($upateStatus){ + + $result['SubjectStatus'] = true; + $result['message'] = "Successfully Subject details updated"; + } + + else { + + $result['SubjectStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + + } + } + + return $result; + + } + /* + * Get subject details + * created by srk + */ + + + + public function getSubject() + { + $this->db->select('*'); + $this->db->order_by('CreatedOn','DESC'); + $subjectDetails = $this->db->get(SUBJECTMASTER); + + + if($subjectDetails->result()){ + + $result['SubjectStatus'] = true; + $result['details'] = $subjectDetails->result(); + } + else { + $result['SubjectStatus'] = false; + $result['message'] = "No records found!"; + } + + return $result; + + } + +} \ No newline at end of file diff --git a/api/application/models/University_model.php b/api/application/models/University_model.php new file mode 100644 index 0000000..a9a1018 --- /dev/null +++ b/api/application/models/University_model.php @@ -0,0 +1,368 @@ +db->select('*'); + $this->db->order_by('CreatedOn', 'DESC'); + $this->db->from(UNIVERSITY); + $univDetails = $this->db->get(); + $universityDetails = $univDetails->result(); + if (count($universityDetails) > 0) { + $results['univList'] = true; + $results['university_details'] = $universityDetails; + } else { + $results['univList'] = false; + $results['message'] = 'No record found'; + } + return $results; + } + + // update univesity details + public function update_university_details($updateFor, $Arr) { + $this->db->where('UniversityID', $updateFor); + $this->db->update(UNIVERSITY, $Arr); + if ($this->db->affected_rows() == '1') { + $result['updateUniversityStatus'] = true; + $result['message'] = "Successfully University details Updated"; + } else { + $result['updateUniversityStatus'] = false; + $result['message'] = "Successfully University details Updated"; + } + return $result; + } + + // check exist details + public function check_Univ_Exist($data, $check) { + // check update for mobile number + $this->db->select('*'); + $this->db->from(UNIVERSITY); + $this->db->where('UniversityID', $data); + if ($this->db->get()->first_row()) { + $result['existUniv'] = true; + $result['message'] = "This University Id is already exist!"; + } else { + $result['existUniv'] = false; + } + return $result; + } + + // add university details + public function insert_Univ($arr) { + $this->db->insert(UNIVERSITY, $arr); + if ($this->db->affected_rows() == '1') { + $result['addUniv'] = true; + $result['message'] = "Successfully University details added"; + } else { + $result['addUniv'] = false; + $result['message'] = "Something went wrong.please try again"; + } + return $result; + } + + public function addActivity($arrayDetails=null,$jsonData=null) + { + $this->db->select('ActivityID,ActivityName'); + + $this->db->where('ActivityName', $arrayDetails['ActivityName']); + + if($this->db->get(ACTIVITY)->first_row()){ + $result['activityStatus'] = false; + $result['message'] = "Activity name is already exist!"; + } + else{ + + $this->db->insert(ACTIVITY, $arrayDetails); + if($this->db->affected_rows() == '1'){ + $last = $this->db->order_by('ActivityID',"desc")->limit(1)->get(ACTIVITY)->row(); + $lastActivityID=$last->ActivityID; + + if($jsonData){ + + foreach ($jsonData as $srow){ + $status_array["StatusName"]=$srow['id']; + $status_array["ActivityID"]=$lastActivityID; + $status_array["IsActive"]=$arrayDetails['IsActive']; + $status_array["CreatedBy"]=$arrayDetails['CreatedBy']; + $status_array["CreatedOn"]=$arrayDetails['CreatedOn']; + $this->db->insert(ACTIVITY_STATUS, $status_array); + } + } + $result['activityStatus'] = true; + $result['message'] = "Successfully activity details added"; + + } + else { + $result['activityStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + } + + + + return $result; + + } + + /* + * get Activity details + * parama id + * created by Surendiran + * */ + + public function getActivity() + { + $this->db->distinct(); + $this->db->select('ActivityID,ActivityName,Description,IsActive'); + $this->db->order_by('ActivityID','DESC'); + $activityDetails=$this->db->get(ACTIVITY); + if($activityDetails->result()){ + + $activity_result['activityStatus'] = true; + foreach ($activityDetails->result() as $row){ + $result_array['ActivityID'] = $row->ActivityID; + $result_array['ActivityName'] = $row->ActivityName; + $result_array['IsActive'] = $row->IsActive; + $result_array['Description'] = $row->Description; + $this->db->select('AVS.StatusID,PLD.ListCode,PLD.ListName'); + $this->db->from(ACTIVITY_STATUS .' as AVS'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'PLD.ListCode = AVS.StatusName'); + $this->db->where('AVS.ActivityID',$row->ActivityID); + $this->db->where('AVS.IsActive','1'); + $result_array['statusDetails']=$this->db->get()->result(); + $result[]=$result_array; + } + + $activity_result['details'] = $result; + + + } + else { + $activity_result['activityStatus'] = false; + $activity_result['details'] = "No records found!"; + } + $activity_result['masterStatusList']=$this->getAllStatusList('1'); + return $activity_result; + + } + /* + * get status details + * created by kms + * */ + + public function getAllStatusList($groupName=null) + { + $this->db->select('ListCode,ListName'); + $this->db->where('ListGroup',$groupName); + $this->db->where('IsActive','1'); + $this->db->order_by('ListCode','ASC'); + $status = $this->db->get(PICK_LIST_DETAILS); + return $status->result(); + } + + + /* + * update activity details details + * created by Surendiran + * */ + public function updateActivity($arrayDetails=null,$jsonData=null) { + + $this->db->select('ActivityName'); + $this->db->where('ActivityName',$arrayDetails['ActivityName']); + $this->db->where('ActivityID !=',$arrayDetails['ActivityID']); + if($this->db->get(ACTIVITY)->first_row()){ + $result['activityStatus'] = false; + $result['message'] = "Activity name is already exist!"; + } + else{ + + $this->db->where('ActivityID ',$arrayDetails['ActivityID']); + $updateStatus=$this->db->update(ACTIVITY, $arrayDetails); + if($updateStatus){ + $deactiveStatus['IsActive']=false; + $deactiveStatus['UpdatedBy']=$arrayDetails['UpdatedBy']; + $deactiveStatus['UpdatedOn']=$arrayDetails['UpdatedOn']; + $this->db->where('ActivityID ',$arrayDetails['ActivityID']); + $updateActivityStatusDeactive = $this->db->update(ACTIVITY_STATUS, $deactiveStatus); + if($updateActivityStatusDeactive){ + + if($jsonData){ + + foreach ($jsonData as $urow){ + + $this->db->select('StatusName'); + $this->db->where('StatusName',$urow); + $this->db->where('ActivityID',$arrayDetails['ActivityID']); + if($this->db->get(ACTIVITY_STATUS)->first_row()){ + $existStatusUpdate['IsActive']=true; + $existStatusUpdate['UpdatedBy']=$arrayDetails['UpdatedBy']; + $existStatusUpdate['UpdatedOn']=$arrayDetails['UpdatedOn']; + $this->db->where('StatusName',$urow); + $this->db->where('ActivityID',$arrayDetails['ActivityID']); + $this->db->update(ACTIVITY_STATUS, $existStatusUpdate); + } + else{ + $update_array["StatusName"]=$urow; + $update_array["ActivityID"]=$arrayDetails['ActivityID']; + $update_array["IsActive"]=true; + $update_array["CreatedBy"]=$arrayDetails['UpdatedBy']; + $update_array["CreatedOn"]=$arrayDetails['UpdatedOn']; + $this->db->insert(ACTIVITY_STATUS, $update_array); + + } + + } + } + else{ + $activateStatus['IsActive']=true; + $this->db->where('ActivityID ',$arrayDetails['ActivityID']); + $this->db->update(ACTIVITY_STATUS, $activateStatus); + + } + + + + $result['activityStatus'] = true; + $result['message'] = "Successfully activity details updated"; + } + + + } + else { + $result['activityStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + } + + return $result; + } + + /* + * get default activity details + * created by kms + * */ + public function getDefaultActivity() + { + $arr = array('ListGroup'=>2,'ListGroup'=>6); + $this->db->distinct(); + $this->db->select('ListName,ListCode,IsActive'); + $this->db->order_by('ListName','ASC'); + $this->db->or_where('ListGroup','2'); + $this->db->or_where('ListGroup','6'); + $this->db->or_where('ListGroup','7'); + $this->db->or_where('ListGroup','8'); + $this->db->or_where('ListGroup','9'); + $defaultActivityDetails=$this->db->get(PICK_LIST_DETAILS); + if($defaultActivityDetails->result()){ + $activity_result['activityStatus'] = true; + foreach ($defaultActivityDetails->result() as $row){ + $result_array['ActivityID'] = $row->ListCode; + $result_array['ActivityName'] = $row->ListName; + $result_array['IsActive'] = $row->IsActive; + $this->db->select('DA.StudentActivityCode,PLD.ListCode,PLD.ListName'); + $this->db->from(DEFAULTACTIVITY .' as DA'); + $this->db->join(PICK_LIST_DETAILS.' as PLD', 'PLD.ListCode = DA.StatusCode'); + // $this->db->where('PLD.IsActive','1'); + $this->db->where('DA.IsActive','1'); + $this->db->where('DA.StudentActivityCode',$row->ListCode); + $result_array['statusDetails']=$this->db->get()->result(); + $result[]=$result_array; + } + + $activity_result['details'] = $result; + + + } + else { + $activity_result['activityStatus'] = false; + $activity_result['details'] = "No records found!"; + } + $activity_result['masterStatusList']=$this->getAllStatusList('1'); + return $activity_result; + + } + /* + * update default activity status + * created by kms + * */ + public function updateDefaultActivity($arrayDetails=null,$jsonData=null) { + + + $deactiveStatus['IsActive']=false; + $deactiveStatus['UpdatedBy']=$arrayDetails['UpdatedBy']; + $deactiveStatus['UpdatedOn']=$arrayDetails['UpdatedOn']; + $this->db->where('StudentActivityCode ',$arrayDetails['StudentActivityCode']); + $updateActivityStatusDeactive = $this->db->update(DEFAULTACTIVITY, $deactiveStatus); + if($updateActivityStatusDeactive){ + + if($jsonData){ + + foreach ($jsonData as $urow){ + + $this->db->select('StatusCode'); + $this->db->where('StatusCode',$urow); + $this->db->where('StudentActivityCode',$arrayDetails['StudentActivityCode']); + if($this->db->get(DEFAULTACTIVITY)->first_row()){ + $existStatusUpdate['IsActive']=true; + $existStatusUpdate['UpdatedBy']=$arrayDetails['UpdatedBy']; + $existStatusUpdate['UpdatedOn']=$arrayDetails['UpdatedOn']; + $this->db->where('StatusCode',$urow); + $this->db->where('StudentActivityCode',$arrayDetails['StudentActivityCode']); + $this->db->update(DEFAULTACTIVITY, $existStatusUpdate); + } + else{ + $update_array["StatusCode"]=$urow; + $update_array["StudentActivityCode"]=$arrayDetails['StudentActivityCode']; + $update_array["IsActive"]=true; + $update_array["CreatedBy"]=$arrayDetails['UpdatedBy']; + $update_array["CreatedOn"]=$arrayDetails['UpdatedOn']; + $this->db->insert(DEFAULTACTIVITY, $update_array); + + } + + } + } + /*else{ + $activateStatus['IsActive']=true; + $this->db->where('StudentActivityCode ',$arrayDetails['StudentActivityCode']); + $this->db->update(DEFAULTACTIVITY, $activateStatus); + + }*/ + + + + $result['activityStatus'] = true; + $result['message'] = "Successfully status updated"; + } + + + + else { + $result['activityStatus'] = false; + $result['message'] = "Something went wrong.please try again"; + } + + + + return $result; + } + +} \ No newline at end of file diff --git a/api/application/models/index.html b/api/application/models/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/application/models/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

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

Directory access is forbidden.

+ + + diff --git a/api/application/views/errors/cli/error_404.php b/api/application/views/errors/cli/error_404.php new file mode 100644 index 0000000..6984b61 --- /dev/null +++ b/api/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/api/application/views/errors/cli/error_general.php b/api/application/views/errors/cli/error_general.php new file mode 100644 index 0000000..6984b61 --- /dev/null +++ b/api/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/api/application/views/errors/cli/index.html b/api/application/views/errors/cli/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/application/views/errors/cli/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

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

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

+ +
+ + \ No newline at end of file diff --git a/api/application/views/errors/html/error_exception.php b/api/application/views/errors/html/error_exception.php new file mode 100644 index 0000000..8784886 --- /dev/null +++ b/api/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/api/application/views/errors/html/error_general.php b/api/application/views/errors/html/error_general.php new file mode 100644 index 0000000..fc3b2eb --- /dev/null +++ b/api/application/views/errors/html/error_general.php @@ -0,0 +1,64 @@ + + + + +Error + + + +
+

+ +
+ + \ No newline at end of file diff --git a/api/application/views/errors/html/error_php.php b/api/application/views/errors/html/error_php.php new file mode 100644 index 0000000..b146f9c --- /dev/null +++ b/api/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/api/application/views/errors/html/index.html b/api/application/views/errors/html/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/application/views/errors/html/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

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

Directory access is forbidden.

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

Directory access is forbidden.

+ + + diff --git a/api/application/views/rest_server.php b/api/application/views/rest_server.php new file mode 100644 index 0000000..5212e6d --- /dev/null +++ b/api/application/views/rest_server.php @@ -0,0 +1,222 @@ + + + + + + + REST Server Tests + + + + + +
+

REST Server Tests

+ +
+ +

Home

+ +

+ See the article + + http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/ + +

+ +

+ The master project repository is + + https://github.com/chriskacerguis/codeigniter-restserver + +

+ +

+ Click on the links to check whether the REST server is working. +

+ +
    +
  1. Users - defaulting to JSON
  2. +
  3. Users - get it in CSV
  4. +
  5. User #1 - defaulting to JSON (users/id/1)
  6. +
  7. User #1 - defaulting to JSON (users/1)
  8. +
  9. User #1 - get it in XML (users/id/1.xml)
  10. +
  11. User #1 - get it in XML (users/id/1/format/xml)
  12. +
  13. User #1 - get it in XML (users/id/1?format=xml)
  14. +
  15. User #1 - get it in XML (users/1.xml)
  16. +
  17. Users - get it in JSON (AJAX request)
  18. +
  19. Users - get it in HTML (users.html)
  20. +
  21. Users - get it in HTML (users/format/html)
  22. +
  23. Users - get it in HTML (users?format=html)
  24. +
+ +
+ +

Page rendered in {elapsed_time} seconds. '.CI_VERSION.'' : '' ?>

+
+ + + + + + + diff --git a/api/application/views/welcome_message.php b/api/application/views/welcome_message.php new file mode 100644 index 0000000..9ba456f --- /dev/null +++ b/api/application/views/welcome_message.php @@ -0,0 +1,101 @@ + + + + + + + Welcome to CodeIgniter + + + + + +
+

Welcome to CodeIgniter!

+ +
+ +

REST Server Tests

+ + +

REST Server Documentation

+ + +

The page you are looking at is being generated dynamically by CodeIgniter.

+ +

If you would like to edit this page you'll find it located at:

+ application/views/welcome_message.php + +

The corresponding controller for this page is found at:

+ application/controllers/Welcome.php + + +

If you are exploring CodeIgniter for the very first time, you should start by reading the User Guide.

+ +
+ +

Page rendered in {elapsed_time} seconds. '.CI_VERSION.'' : '' ?>

+
+ + + diff --git a/api/composer.json b/api/composer.json new file mode 100644 index 0000000..64d1be1 --- /dev/null +++ b/api/composer.json @@ -0,0 +1,22 @@ +{ + "description": "The CodeIgniter framework", + "name": "codeigniter/framework", + "type": "project", + "homepage": "https://codeigniter.com", + "license": "MIT", + "support": { + "forum": "http://forum.codeigniter.com/", + "wiki": "https://github.com/bcit-ci/CodeIgniter/wiki", + "irc": "irc://irc.freenode.net/codeigniter", + "source": "https://github.com/bcit-ci/CodeIgniter" + }, + "require": { + "php": ">=5.2.4" + }, + "suggest": { + "paragonie/random_compat": "Provides better randomness in PHP 5.x" + }, + "require-dev": { + "mikey179/vfsStream": "1.1.*" + } +} \ No newline at end of file diff --git a/api/composer.lock b/api/composer.lock new file mode 100644 index 0000000..3e8e07b --- /dev/null +++ b/api/composer.lock @@ -0,0 +1,51 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "425582499c09ce5b5eebb2abb6dc2111", + "content-hash": "163eb4764cfceda4201e2d993dd1e79d", + "packages": [], + "packages-dev": [ + { + "name": "mikey179/vfsStream", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/mikey179/vfsStream.git", + "reference": "fc0fe8f4d0b527254a2dc45f0c265567c881d07e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mikey179/vfsStream/zipball/fc0fe8f4d0b527254a2dc45f0c265567c881d07e", + "reference": "fc0fe8f4d0b527254a2dc45f0c265567c881d07e", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "org\\bovigo\\vfs": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "homepage": "http://vfs.bovigo.org/", + "time": "2012-08-25 12:49:29" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.2.4" + }, + "platform-dev": [] +} diff --git a/api/index.php b/api/index.php new file mode 100644 index 0000000..0e240df --- /dev/null +++ b/api/index.php @@ -0,0 +1,327 @@ +=')) + { + 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/api/system/.htaccess b/api/system/.htaccess new file mode 100644 index 0000000..97c65d2 --- /dev/null +++ b/api/system/.htaccess @@ -0,0 +1,6 @@ + + Require all denied + + + Deny from all + \ No newline at end of file diff --git a/api/system/core/Benchmark.php b/api/system/core/Benchmark.php new file mode 100644 index 0000000..b1d74f7 --- /dev/null +++ b/api/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/api/system/core/CodeIgniter.php b/api/system/core/CodeIgniter.php new file mode 100644 index 0000000..a2067fb --- /dev/null +++ b/api/system/core/CodeIgniter.php @@ -0,0 +1,556 @@ + '_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)) && strcasecmp($class, $method) === 0) + { + $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/api/system/core/Common.php b/api/system/core/Common.php new file mode 100644 index 0000000..91c585f --- /dev/null +++ b/api/system/core/Common.php @@ -0,0 +1,857 @@ +='); + } + + 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 string 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)) + { + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) + { + $_mimes = include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); + } + elseif (file_exists(APPPATH.'config/mimes.php')) + { + $_mimes = include(APPPATH.'config/mimes.php'); + } + else + { + $_mimes = array(); + } + } + + 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 + if ($exit_status > 125) // 125 is EXIT__AUTO_MAX + { + $exit_status = 1; // EXIT_ERROR + } + + $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); + } + else + { + $server_protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_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[] = '/[\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 commited 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/api/system/core/Config.php b/api/system/core/Config.php new file mode 100644 index 0000000..9fd3e4a --- /dev/null +++ b/api/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/api/system/core/Controller.php b/api/system/core/Controller.php new file mode 100644 index 0000000..83b3df2 --- /dev/null +++ b/api/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/api/system/core/Exceptions.php b/api/system/core/Exceptions.php new file mode 100644 index 0000000..4e10f28 --- /dev/null +++ b/api/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 string Error page output + */ + 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/api/system/core/Hooks.php b/api/system/core/Hooks.php new file mode 100644 index 0000000..856795c --- /dev/null +++ b/api/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/api/system/core/Input.php b/api/system/core/Input.php new file mode 100644 index 0000000..b81d51e --- /dev/null +++ b/api/system/core/Input.php @@ -0,0 +1,897 @@ +_allow_get_array = (config_item('allow_get_array') === TRUE); + $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 = FALSE, $httponly = FALSE) + { + 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'); + } + + if ($secure === FALSE && config_item('cookie_secure') === TRUE) + { + $secure = config_item('cookie_secure'); + } + + if ($httponly === FALSE && config_item('cookie_httponly') !== FALSE) + { + $httponly = config_item('cookie_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[$i] = 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/api/system/core/Lang.php b/api/system/core/Lang.php new file mode 100644 index 0000000..1fcff07 --- /dev/null +++ b/api/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/api/system/core/Loader.php b/api/system/core/Loader.php new file mode 100644 index 0000000..d2c3508 --- /dev/null +++ b/api/system/core/Loader.php @@ -0,0 +1,1437 @@ + 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 string $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 string $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"); + } + } + 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); + } + } + } + + $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; + $CI->$name = new $model(); + 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_object_to_array($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 = '') + { + if (is_string($vars)) + { + $vars = array($vars => $val); + } + + $vars = $this->_ci_object_to_array($vars); + + if (is_array($vars) && count($vars) > 0) + { + 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()) + { + foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper) + { + if (isset($this->_ci_helpers[$helper])) + { + continue; + } + + // Is this a helper extension request? + $ext_helper = config_item('subclass_prefix').$helper; + $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. + */ + if (is_array($_ci_vars)) + { + foreach (array_keys($_ci_vars) as $key) + { + if (strncmp($key, '_ci_', 4) === 0) + { + unset($_ci_vars[$key]); + } + } + + $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); + } + + // 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'; + + // Safety: Was the class already loaded by a previous call? + if (class_exists($class, FALSE)) + { + // Before we deem this to be a duplicate request, let's see + // if a custom object name is being supplied. If so, we'll + // return a new instance of the object + if ($object_name !== NULL) + { + $CI =& get_instance(); + if ( ! isset($CI->$object_name)) + { + return $this->_ci_init_library($class, '', $params, $object_name); + } + } + + log_message('debug', $class.' class already loaded. Second attempt ignored.'); + return; + } + // Does the file exist? No? Bummer... + elseif ( ! 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'); + } + + // Before we deem this to be a duplicate request, let's see + // if a custom object name is being supplied. If so, we'll + // return a new instance of the object + if ($object_name !== NULL) + { + $CI =& get_instance(); + if ( ! isset($CI->$object_name)) + { + 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); + } + else + { + 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; + } + else + { + 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']); + } + } + + // -------------------------------------------------------------------- + + /** + * CI Object to Array translator + * + * Takes an object as input and converts the class variables to + * an associative array with key/value pairs. + * + * @param object $object Object data to translate + * @return array + */ + protected function _ci_object_to_array($object) + { + return is_object($object) ? get_object_vars($object) : $object; + } + + // -------------------------------------------------------------------- + + /** + * 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; + } + + // -------------------------------------------------------------------- + + /** + * Prep filename + * + * This function prepares filenames of various items to + * make their loading more reliable. + * + * @param string|string[] $filename Filename(s) + * @param string $extension Filename extension + * @return array + */ + protected function _ci_prep_filename($filename, $extension) + { + if ( ! is_array($filename)) + { + return array(strtolower(str_replace(array($extension, '.php'), '', $filename).$extension)); + } + else + { + foreach ($filename as $key => $val) + { + $filename[$key] = strtolower(str_replace(array($extension, '.php'), '', $val).$extension); + } + + return $filename; + } + } + +} diff --git a/api/system/core/Log.php b/api/system/core/Log.php new file mode 100644 index 0000000..cf6c75a --- /dev/null +++ b/api/system/core/Log.php @@ -0,0 +1,296 @@ + 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4); + + /** + * mbstring.func_override flag + * + * @var bool + */ + protected static $func_override; + + // -------------------------------------------------------------------- + + /** + * Class constructor + * + * @return void + */ + public function __construct() + { + $config =& get_config(); + + isset(self::$func_override) OR self::$func_override = (extension_loaded('mbstring') && ini_get('mbstring.func_override')); + + $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_override) + ? 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_override) + { + // 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/api/system/core/Model.php b/api/system/core/Model.php new file mode 100644 index 0000000..941881a --- /dev/null +++ b/api/system/core/Model.php @@ -0,0 +1,80 @@ +$key; + } + +} diff --git a/api/system/core/Output.php b/api/system/core/Output.php new file mode 100644 index 0000000..cf6510f --- /dev/null +++ b/api/system/core/Output.php @@ -0,0 +1,848 @@ +_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_override) OR self::$func_override = (extension_loaded('mbstring') && ini_get('mbstring.func_override')); + + // 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; + } + + for ($i = 0, $c = count($headers); $i < $c; $i++) + { + if (strncasecmp($header, $headers[$i], $l = self::strlen($header)) === 0) + { + return trim(self::substr($headers[$i], $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)) + { + // 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); + } + else + { + log_message('error', 'Unable to secure a file lock for file at: '.$cache_path); + return; + } + + fclose($fp); + + if (is_int($result)) + { + 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); + } + else + { + @unlink($cache_path); + log_message('error', 'Unable to write the complete cache content at: '.$cache_path); + } + } + + // -------------------------------------------------------------------- + + /** + * 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; + } + else + { + // Or else 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; + } + else + { + 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_override) + ? 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_override) + { + // 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/api/system/core/Router.php b/api/system/core/Router.php new file mode 100644 index 0000000..045d366 --- /dev/null +++ b/api/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/api/system/core/Security.php b/api/system/core/Security.php new file mode 100644 index 0000000..d0308c5 --- /dev/null +++ b/api/system/core/Security.php @@ -0,0 +1,1078 @@ +', '<', '>', + "'", '"', '&', '$', '#', + '{', '}', '[', ']', '=', + ';', '?', '%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.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|(document\.)?window)\.(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; + } + } + } + + // Do the tokens exist in both the _POST and _COOKIE arrays? + if ( ! isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]) + OR $_POST[$this->_csrf_token_name] !== $_COOKIE[$this->_csrf_cookie_name]) // Do the tokens match? + { + $this->csrf_show_error(); + } + + // 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(); + + 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)) + { + while (list($key) = each($str)) + { + $str[$key] = $this->xss_clean($str[$key]); + } + + 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 + ); + + // 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 fitlered 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 preceed 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;)|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;)|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/api/system/core/URI.php b/api/system/core/URI.php new file mode 100644 index 0000000..544f6c8 --- /dev/null +++ b/api/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/api/system/core/Utf8.php b/api/system/core/Utf8.php new file mode 100644 index 0000000..f2f42e6 --- /dev/null +++ b/api/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/api/system/core/compat/hash.php b/api/system/core/compat/hash.php new file mode 100644 index 0000000..d567d0f --- /dev/null +++ b/api/system/core/compat/hash.php @@ -0,0 +1,245 @@ + 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]) && strlen($password) > $block_sizes[$algo]) + { + $password = hash($algo, $password, TRUE); + } + + $hash = ''; + // Note: Blocks are NOT 0-indexed + for ($bc = 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 + return substr($raw_output ? $hash : bin2hex($hash), 0, $length); + } +} diff --git a/api/system/core/compat/index.html b/api/system/core/compat/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/core/compat/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/core/compat/mbstring.php b/api/system/core/compat/mbstring.php new file mode 100644 index 0000000..554d100 --- /dev/null +++ b/api/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_override; + isset($func_override) OR $func_override = (extension_loaded('mbstring') && ini_get('mbstring.func_override')); + + 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_override ? 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_override) ? 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/api/system/core/compat/standard.php b/api/system/core/compat/standard.php new file mode 100644 index 0000000..6b7caa4 --- /dev/null +++ b/api/system/core/compat/standard.php @@ -0,0 +1,182 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/database/DB.php b/api/system/database/DB.php new file mode 100644 index 0000000..b4b7767 --- /dev/null +++ b/api/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/api/system/database/DB_cache.php b/api/system/database/DB_cache.php new file mode 100644 index 0000000..8855cc1 --- /dev/null +++ b/api/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 (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/api/system/database/DB_driver.php b/api/system/database/DB_driver.php new file mode 100644 index 0000000..7ae52a3 --- /dev/null +++ b/api/system/database/DB_driver.php @@ -0,0 +1,1986 @@ + $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_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)\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-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return str_replace("'", "''", remove_invisible_characters($str)); + } + + // -------------------------------------------------------------------- + + /** + * 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 ? ' 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++; + } + + // Verify table prefix and replace if necessary + if ($this->swap_pre !== '' && strpos($parts[$i], $this->swap_pre) === 0) + { + $parts[$i] = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $parts[$i]); + } + // We only add the table prefix if it does not already exist + elseif (strpos($parts[$i], $this->dbprefix) !== 0) + { + $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/api/system/database/DB_forge.php b/api/system/database/DB_forge.php new file mode 100644 index 0000000..ed6f4b6 --- /dev/null +++ b/api/system/database/DB_forge.php @@ -0,0 +1,1032 @@ +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) + { + empty($this->db->data_cache['table_names']) OR $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; + } + else + { + $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 string + */ + 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 + * @return string + */ + 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/api/system/database/DB_query_builder.php b/api/system/database/DB_query_builder.php new file mode 100644 index 0000000..5a86ce5 --- /dev/null +++ b/api/system/database/DB_query_builder.php @@ -0,0 +1,2789 @@ +_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'); + } + + $this->{$qb_key}[] = array('condition' => $prefix.$k.$v, 'escape' => $escape); + if ($this->qb_caching === TRUE) + { + $this->{$qb_cache_key}[] = array('condition' => $prefix.$k.$v, 'escape' => $escape); + $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).')', + '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); + } + + if ($side === 'none') + { + $like_statement = "{$prefix} {$k} {$not} LIKE '{$v}'"; + } + elseif ($side === 'before') + { + $like_statement = "{$prefix} {$k} {$not} LIKE '%{$v}'"; + } + elseif ($side === 'after') + { + $like_statement = "{$prefix} {$k} {$not} LIKE '{$v}%'"; + } + else + { + $like_statement = "{$prefix} {$k} {$not} LIKE '%{$v}%'"; + } + + // some platforms require an escape sequence definition for LIKE wildcards + if ($escape === TRUE && $this->_like_escape_str !== '') + { + $like_statement .= sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + $this->qb_where[] = array('condition' => $like_statement, 'escape' => $escape); + if ($this->qb_caching === TRUE) + { + $this->qb_cache_where[] = array('condition' => $like_statement, 'escape' => $escape); + $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).' (', + '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--).')', + '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(*) ... + if ( ! empty($this->qb_orderby)) + { + $orderby = $this->qb_orderby; + $this->qb_orderby = NULL; + } + + $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby)) + ? $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(); + } + // If we've previously reset the qb_orderby values, get them back + elseif ( ! isset($this->qb_orderby)) + { + $this->qb_orderby = $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(current($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)) + { + 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); $i < $total; $i += $batch_size) + { + if ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $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) + { + $index_escaped = $this->protect_identifiers($index); + + $ids = array(); + foreach ($values as $key => $val) + { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$field][] = 'WHEN '.$index_escaped.' = '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k." = CASE \n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END, '; + } + + $this->where($index_escaped.' 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[$this->protect_identifiers($k2, FALSE, $escape)] = ($escape === FALSE) ? $v2 : $this->escape($v2); + } + + if ($index_set === FALSE) + { + return $this->display_error('db_batch_missing_index'); + } + + $this->qb_set[] = $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 ? ' 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)) + { + $this->qb_aliased_tables[] = $table; + } + } + } + + // -------------------------------------------------------------------- + + /** + * 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 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']; + 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); + } + + 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 wether + * 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 wether + * 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 (is_array($this->qb_orderby) && count($this->qb_orderby) > 0) + { + for ($i = 0, $c = count($this->qb_orderby); $i < $c; $i++) + { + 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 $this->qb_orderby = "\nORDER BY ".implode(', ', $this->qb_orderby); + } + elseif (is_string($this->qb_orderby)) + { + return $this->qb_orderby; + } + + return ''; + } + + // -------------------------------------------------------------------- + + /** + * 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() + )); + + 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; + } + } + + // If we are "protecting identifiers" we need to examine the "from" + // portion of the query to determine if there are any aliases + if ($this->_protect_identifiers === TRUE && count($this->qb_cache_from) > 0) + { + $this->_track_aliases($this->qb_from); + } + } + + // -------------------------------------------------------------------- + + /** + * 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_from' => array(), + 'qb_join' => array(), + 'qb_where' => array(), + 'qb_orderby' => array(), + 'qb_keys' => array(), + 'qb_limit' => FALSE + )); + } + +} diff --git a/api/system/database/DB_result.php b/api/system/database/DB_result.php new file mode 100644 index 0000000..4e24293 --- /dev/null +++ b/api/system/database/DB_result.php @@ -0,0 +1,666 @@ +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(); + } + else + { + 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); + else 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/api/system/database/DB_utility.php b/api/system/database/DB_utility.php new file mode 100644 index 0000000..7052828 --- /dev/null +++ b/api/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/api/system/database/drivers/cubrid/cubrid_driver.php b/api/system/database/drivers/cubrid/cubrid_driver.php new file mode 100644 index 0000000..77f591c --- /dev/null +++ b/api/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-dependant 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 occured. + * + * @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/api/system/database/drivers/cubrid/cubrid_forge.php b/api/system/database/drivers/cubrid/cubrid_forge.php new file mode 100644 index 0000000..46a3b21 --- /dev/null +++ b/api/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/api/system/database/drivers/cubrid/cubrid_result.php b/api/system/database/drivers/cubrid/cubrid_result.php new file mode 100644 index 0000000..9cccb25 --- /dev/null +++ b/api/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/api/system/database/drivers/cubrid/cubrid_utility.php b/api/system/database/drivers/cubrid/cubrid_utility.php new file mode 100644 index 0000000..942fa3b --- /dev/null +++ b/api/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/api/system/database/drivers/cubrid/index.html b/api/system/database/drivers/cubrid/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/drivers/cubrid/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/database/drivers/ibase/ibase_driver.php b/api/system/database/drivers/ibase/ibase_driver.php new file mode 100644 index 0000000..671a353 --- /dev/null +++ b/api/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 occured. + * + * @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->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + ibase_close($this->conn_id); + } + +} diff --git a/api/system/database/drivers/ibase/ibase_forge.php b/api/system/database/drivers/ibase/ibase_forge.php new file mode 100644 index 0000000..b35cc37 --- /dev/null +++ b/api/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 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_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/api/system/database/drivers/ibase/ibase_result.php b/api/system/database/drivers/ibase/ibase_result.php new file mode 100644 index 0000000..f3c21fc --- /dev/null +++ b/api/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/api/system/database/drivers/ibase/ibase_utility.php b/api/system/database/drivers/ibase/ibase_utility.php new file mode 100644 index 0000000..619ebad --- /dev/null +++ b/api/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/api/system/database/drivers/ibase/index.html b/api/system/database/drivers/ibase/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/drivers/ibase/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

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

Directory access is forbidden.

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

Directory access is forbidden.

+ + + diff --git a/api/system/database/drivers/mssql/mssql_driver.php b/api/system/database/drivers/mssql/mssql_driver.php new file mode 100644 index 0000000..66d7572 --- /dev/null +++ b/api/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 occured. + * + * @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) + { + $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->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + mssql_close($this->conn_id); + } + +} diff --git a/api/system/database/drivers/mssql/mssql_forge.php b/api/system/database/drivers/mssql/mssql_forge.php new file mode 100644 index 0000000..91b5794 --- /dev/null +++ b/api/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/api/system/database/drivers/mssql/mssql_result.php b/api/system/database/drivers/mssql/mssql_result.php new file mode 100644 index 0000000..b62bf75 --- /dev/null +++ b/api/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/api/system/database/drivers/mssql/mssql_utility.php b/api/system/database/drivers/mssql/mssql_utility.php new file mode 100644 index 0000000..cd23be8 --- /dev/null +++ b/api/system/database/drivers/mssql/mssql_utility.php @@ -0,0 +1,77 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/api/system/database/drivers/mysql/index.html b/api/system/database/drivers/mysql/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/drivers/mysql/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/database/drivers/mysql/mysql_driver.php b/api/system/database/drivers/mysql/mysql_driver.php new file mode 100644 index 0000000..7804dda --- /dev/null +++ b/api/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-dependant 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 occured. + * + * @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/api/system/database/drivers/mysql/mysql_forge.php b/api/system/database/drivers/mysql/mysql_forge.php new file mode 100644 index 0000000..fa84be3 --- /dev/null +++ b/api/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/api/system/database/drivers/mysql/mysql_result.php b/api/system/database/drivers/mysql/mysql_result.php new file mode 100644 index 0000000..20cade2 --- /dev/null +++ b/api/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/api/system/database/drivers/mysql/mysql_utility.php b/api/system/database/drivers/mysql/mysql_utility.php new file mode 100644 index 0000000..4c1f239 --- /dev/null +++ b/api/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/api/system/database/drivers/mysqli/index.html b/api/system/database/drivers/mysqli/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/drivers/mysqli/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/database/drivers/mysqli/mysqli_driver.php b/api/system/database/drivers/mysqli/mysqli_driver.php new file mode 100644 index 0000000..4a14eea --- /dev/null +++ b/api/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->db_debug) ? $this->db->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-dependant 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/api/system/database/drivers/mysqli/mysqli_forge.php b/api/system/database/drivers/mysqli/mysqli_forge.php new file mode 100644 index 0000000..c17f729 --- /dev/null +++ b/api/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/api/system/database/drivers/mysqli/mysqli_result.php b/api/system/database/drivers/mysqli/mysqli_result.php new file mode 100644 index 0000000..0ce0741 --- /dev/null +++ b/api/system/database/drivers/mysqli/mysqli_result.php @@ -0,0 +1,186 @@ +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 = $field_data[$i]->type; + $retval[$i]->max_length = $field_data[$i]->max_length; + $retval[$i]->primary_key = (int) ($field_data[$i]->flags & 2); + $retval[$i]->default = $field_data[$i]->def; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * 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/api/system/database/drivers/mysqli/mysqli_utility.php b/api/system/database/drivers/mysqli/mysqli_utility.php new file mode 100644 index 0000000..79d9f36 --- /dev/null +++ b/api/system/database/drivers/mysqli/mysqli_utility.php @@ -0,0 +1,213 @@ +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(strtolower($field->type), + 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/api/system/database/drivers/oci8/index.html b/api/system/database/drivers/oci8/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/drivers/oci8/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/database/drivers/oci8/oci8_driver.php b/api/system/database/drivers/oci8/oci8_driver.php new file mode 100644 index 0000000..56fdf32 --- /dev/null +++ b/api/system/database/drivers/oci8/oci8_driver.php @@ -0,0 +1,688 @@ + '/^\(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 occured. + * + * @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); + } + +} diff --git a/api/system/database/drivers/oci8/oci8_forge.php b/api/system/database/drivers/oci8/oci8_forge.php new file mode 100644 index 0000000..23e0257 --- /dev/null +++ b/api/system/database/drivers/oci8/oci8_forge.php @@ -0,0 +1,185 @@ +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']) + .' '.$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/api/system/database/drivers/oci8/oci8_result.php b/api/system/database/drivers/oci8/oci8_result.php new file mode 100644 index 0000000..fc860ea --- /dev/null +++ b/api/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/api/system/database/drivers/oci8/oci8_utility.php b/api/system/database/drivers/oci8/oci8_utility.php new file mode 100644 index 0000000..ebe49c4 --- /dev/null +++ b/api/system/database/drivers/oci8/oci8_utility.php @@ -0,0 +1,68 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/api/system/database/drivers/odbc/index.html b/api/system/database/drivers/odbc/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/drivers/odbc/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/database/drivers/odbc/odbc_driver.php b/api/system/database/drivers/odbc/odbc_driver.php new file mode 100644 index 0000000..dbce1cf --- /dev/null +++ b/api/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-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + $this->db->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->db_debug) ? $this->db->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 occured. + * + * @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/api/system/database/drivers/odbc/odbc_forge.php b/api/system/database/drivers/odbc/odbc_forge.php new file mode 100644 index 0000000..bac30be --- /dev/null +++ b/api/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/api/system/database/drivers/odbc/odbc_utility.php b/api/system/database/drivers/odbc/odbc_utility.php new file mode 100644 index 0000000..2e34496 --- /dev/null +++ b/api/system/database/drivers/odbc/odbc_utility.php @@ -0,0 +1,63 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/api/system/database/drivers/pdo/index.html b/api/system/database/drivers/pdo/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/drivers/pdo/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/database/drivers/pdo/pdo_driver.php b/api/system/database/drivers/pdo/pdo_driver.php new file mode 100644 index 0000000..c27607e --- /dev/null +++ b/api/system/database/drivers/pdo/pdo_driver.php @@ -0,0 +1,375 @@ +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-dependant 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 occured. + * + * @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; + } + + // -------------------------------------------------------------------- + + /** + * 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]; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k.' = CASE '."\n"; + + foreach ($v as $row) + { + $cases .= $row."\n"; + } + + $cases .= 'ELSE '.$k.' END, '; + } + + $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); + + return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); + } + + // -------------------------------------------------------------------- + + /** + * 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/api/system/database/drivers/pdo/pdo_forge.php b/api/system/database/drivers/pdo/pdo_forge.php new file mode 100644 index 0000000..2595f7b --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/pdo_utility.php b/api/system/database/drivers/pdo/pdo_utility.php new file mode 100644 index 0000000..384661b --- /dev/null +++ b/api/system/database/drivers/pdo/pdo_utility.php @@ -0,0 +1,63 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/api/system/database/drivers/pdo/subdrivers/index.html b/api/system/database/drivers/pdo/subdrivers/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/drivers/pdo/subdrivers/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php b/api/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php new file mode 100644 index 0000000..3dedfd9 --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php b/api/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php new file mode 100644 index 0000000..41994f9 --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php b/api/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php new file mode 100644 index 0000000..8377798 --- /dev/null +++ b/api/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php @@ -0,0 +1,250 @@ +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; + } + + // -------------------------------------------------------------------- + + /** + * 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]; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k." = CASE \n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END), '; + } + + $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); + + return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); + } + + // -------------------------------------------------------------------- + + /** + * 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/api/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/api/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php new file mode 100644 index 0000000..b5b9507 --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php b/api/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php new file mode 100644 index 0000000..9a1cbca --- /dev/null +++ b/api/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php @@ -0,0 +1,337 @@ +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) + { + $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->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + +} diff --git a/api/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php b/api/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php new file mode 100644 index 0000000..8302003 --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php b/api/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php new file mode 100644 index 0000000..7811d3d --- /dev/null +++ b/api/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->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } +} diff --git a/api/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/api/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php new file mode 100644 index 0000000..50df769 --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php b/api/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php new file mode 100644 index 0000000..2366c40 --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php b/api/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php new file mode 100644 index 0000000..a2dbfc2 --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php b/api/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php new file mode 100644 index 0000000..d40d17a --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php b/api/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php new file mode 100644 index 0000000..5af39b1 --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/api/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php new file mode 100644 index 0000000..6452b78 --- /dev/null +++ b/api/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->db_debug) ? $this->db->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/api/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php b/api/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php new file mode 100644 index 0000000..9d04a8a --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/api/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php new file mode 100644 index 0000000..dd1d31c --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/api/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php new file mode 100644 index 0000000..705b1c7 --- /dev/null +++ b/api/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']) + .' '.$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/api/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/api/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php new file mode 100644 index 0000000..ebe1ed6 --- /dev/null +++ b/api/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-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + $this->db->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/api/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php b/api/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php new file mode 100644 index 0000000..7c65daa --- /dev/null +++ b/api/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]; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$field][] = 'WHEN '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k.' = (CASE '.$index."\n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END), '; + } + + $this->where($index.' 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/api/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php b/api/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php new file mode 100644 index 0000000..214b6f5 --- /dev/null +++ b/api/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 lenghts 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/api/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/api/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php new file mode 100644 index 0000000..6269013 --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php b/api/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php new file mode 100644 index 0000000..b124bca --- /dev/null +++ b/api/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/api/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php b/api/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php new file mode 100644 index 0000000..dfccb7d --- /dev/null +++ b/api/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) + { + $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->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + +} diff --git a/api/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php b/api/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php new file mode 100644 index 0000000..56bf87f --- /dev/null +++ b/api/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/api/system/database/drivers/postgre/index.html b/api/system/database/drivers/postgre/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/drivers/postgre/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/database/drivers/postgre/postgre_driver.php b/api/system/database/drivers/postgre/postgre_driver.php new file mode 100644 index 0000000..dfd87f9 --- /dev/null +++ b/api/system/database/drivers/postgre/postgre_driver.php @@ -0,0 +1,620 @@ +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']) + ? $this->data_cache['version'] = $pg_version['server'] + : 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-dependant 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 = pg_version($this->conn_id); + $v = isset($v['server']) ? $v['server'] : 0; // 'server' key is only available since PosgreSQL 7.4 + + $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 occured. + * + * @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]; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$field][] = 'WHEN '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k.' = (CASE '.$index."\n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END), '; + } + + $this->where($index.' 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/api/system/database/drivers/postgre/postgre_forge.php b/api/system/database/drivers/postgre/postgre_forge.php new file mode 100644 index 0000000..8d985ba --- /dev/null +++ b/api/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 lenghts 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/api/system/database/drivers/postgre/postgre_result.php b/api/system/database/drivers/postgre/postgre_result.php new file mode 100644 index 0000000..354bb08 --- /dev/null +++ b/api/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/api/system/database/drivers/postgre/postgre_utility.php b/api/system/database/drivers/postgre/postgre_utility.php new file mode 100644 index 0000000..bb5e6e0 --- /dev/null +++ b/api/system/database/drivers/postgre/postgre_utility.php @@ -0,0 +1,78 @@ +db->display_error('db_unsupported_feature'); + } +} diff --git a/api/system/database/drivers/sqlite/index.html b/api/system/database/drivers/sqlite/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/drivers/sqlite/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/database/drivers/sqlite/sqlite_driver.php b/api/system/database/drivers/sqlite/sqlite_driver.php new file mode 100644 index 0000000..16b8c29 --- /dev/null +++ b/api/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/api/system/database/drivers/sqlite/sqlite_forge.php b/api/system/database/drivers/sqlite/sqlite_forge.php new file mode 100644 index 0000000..3ad3477 --- /dev/null +++ b/api/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/api/system/database/drivers/sqlite/sqlite_result.php b/api/system/database/drivers/sqlite/sqlite_result.php new file mode 100644 index 0000000..d40b98a --- /dev/null +++ b/api/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/api/system/database/drivers/sqlite/sqlite_utility.php b/api/system/database/drivers/sqlite/sqlite_utility.php new file mode 100644 index 0000000..59c46f9 --- /dev/null +++ b/api/system/database/drivers/sqlite/sqlite_utility.php @@ -0,0 +1,61 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/api/system/database/drivers/sqlite3/index.html b/api/system/database/drivers/sqlite3/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/drivers/sqlite3/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/database/drivers/sqlite3/sqlite3_driver.php b/api/system/database/drivers/sqlite3/sqlite3_driver.php new file mode 100644 index 0000000..9743499 --- /dev/null +++ b/api/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-dependant 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 occured. + * + * @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/api/system/database/drivers/sqlite3/sqlite3_forge.php b/api/system/database/drivers/sqlite3/sqlite3_forge.php new file mode 100644 index 0000000..c45472f --- /dev/null +++ b/api/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/api/system/database/drivers/sqlite3/sqlite3_result.php b/api/system/database/drivers/sqlite3/sqlite3_result.php new file mode 100644 index 0000000..aa559ee --- /dev/null +++ b/api/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/api/system/database/drivers/sqlite3/sqlite3_utility.php b/api/system/database/drivers/sqlite3/sqlite3_utility.php new file mode 100644 index 0000000..b47c086 --- /dev/null +++ b/api/system/database/drivers/sqlite3/sqlite3_utility.php @@ -0,0 +1,61 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/api/system/database/drivers/sqlsrv/index.html b/api/system/database/drivers/sqlsrv/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/drivers/sqlsrv/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/api/system/database/drivers/sqlsrv/sqlsrv_driver.php b/api/system/database/drivers/sqlsrv/sqlsrv_driver.php new file mode 100644 index 0000000..c55d5f7 --- /dev/null +++ b/api/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 occured. + * + * @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) + { + $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->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + sqlsrv_close($this->conn_id); + } + +} diff --git a/api/system/database/drivers/sqlsrv/sqlsrv_forge.php b/api/system/database/drivers/sqlsrv/sqlsrv_forge.php new file mode 100644 index 0000000..4f0ce9d --- /dev/null +++ b/api/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/api/system/database/drivers/sqlsrv/sqlsrv_result.php b/api/system/database/drivers/sqlsrv/sqlsrv_result.php new file mode 100644 index 0000000..fde7264 --- /dev/null +++ b/api/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/api/system/database/drivers/sqlsrv/sqlsrv_utility.php b/api/system/database/drivers/sqlsrv/sqlsrv_utility.php new file mode 100644 index 0000000..726fe3e --- /dev/null +++ b/api/system/database/drivers/sqlsrv/sqlsrv_utility.php @@ -0,0 +1,77 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/api/system/database/index.html b/api/system/database/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/api/system/database/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

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

Directory access is forbidden.

+ + + diff --git a/api/system/fonts/texb.ttf b/api/system/fonts/texb.ttf new file mode 100644 index 0000000..383c88b Binary files /dev/null and b/api/system/fonts/texb.ttf differ diff --git a/api/system/helpers/array_helper.php b/api/system/helpers/array_helper.php new file mode 100644 index 0000000..3fdccf9 --- /dev/null +++ b/api/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/api/system/helpers/cookie_helper.php b/api/system/helpers/cookie_helper.php new file mode 100644 index 0000000..ca43244 --- /dev/null +++ b/api/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/api/system/helpers/date_helper.php b/api/system/helpers/date_helper.php new file mode 100644 index 0000000..5f1fcf0 --- /dev/null +++ b/api/system/helpers/date_helper.php @@ -0,0 +1,741 @@ +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. + * + * @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{2})\d{2}(\d{4})$/i', $bad_date, $matches)) + { + return date($format, strtotime($matches[1].'/01/'.$matches[2])); + } + + // 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/api/system/helpers/directory_helper.php b/api/system/helpers/directory_helper.php new file mode 100644 index 0000000..cdc4c16 --- /dev/null +++ b/api/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/api/system/helpers/download_helper.php b/api/system/helpers/download_helper.php new file mode 100644 index 0000000..a6463df --- /dev/null +++ b/api/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/api/system/helpers/form_helper.php b/api/system/helpers/form_helper.php new file mode 100644 index 0000000..aa7379f --- /dev/null +++ b/api/system/helpers/form_helper.php @@ -0,0 +1,1032 @@ +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"; + + // 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"')) + { + $hidden[$CI->security->get_csrf_token_name()] = $CI->security->get_csrf_hash(); + } + + if (is_array($hidden)) + { + foreach ($hidden as $name => $value) + { + $form .= ''."\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 array Additional attributes + * @return string + */ + function form_label($label_text = '', $id = '', $attributes = array()) + { + + $label = ' 0) + { + foreach ($attributes as $key => $val) + { + $label .= ' '.$key.'="'.$val.'"'; + } + } + + return $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 ' + '
Send' + '' + '' + '' + ''; + var directive = { + restrict: 'EA', + template: submitTemplate, + replace: true, + scope: { + submitFunction: "=", + ngModel: "=" + }, + link: function ($scope, $element, $attrs) { + + $scope.submitChat = function () { + $scope.submitFunction(); + + + if (typeof $attrs.scrollElement !== "undefined") { + var scrlEl = angular.element($attrs.scrollElement); + var lastElement = scrlEl.find('.discussion > li:last'); + if (lastElement.length) + scrlEl.scrollToElementAnimated(lastElement); + } + + }; + } + }; + + return directive; + } + + +})(); diff --git a/assets/js/directives/compare-to.js b/assets/js/directives/compare-to.js new file mode 100644 index 0000000..5b4ddb8 --- /dev/null +++ b/assets/js/directives/compare-to.js @@ -0,0 +1,51 @@ +'use strict'; +/** + * Password-check directive. +*/ +app.directive('compareTo', function () { + return { + require: "ngModel", + scope: { + otherModelValue: "=compareTo" + }, + link: function (scope, element, attributes, ngModel) { + + ngModel.$validators.compareTo = function (modelValue) { + return modelValue == scope.otherModelValue; + }; + + scope.$watch("otherModelValue", function () { + ngModel.$validate(); + }); + } + }; +}); +app.directive('capitalize', function() { + return { + require: 'ngModel', + link: function(scope, element, attrs, modelCtrl) { + var capitalize = function(inputValue) { + if (inputValue == undefined) inputValue = ''; + var capitalized = inputValue.toUpperCase(); + if (capitalized !== inputValue) { + modelCtrl.$setViewValue(capitalized); + modelCtrl.$render(); + } + return capitalized; + } + modelCtrl.$parsers.push(capitalize); + capitalize(scope[attrs.ngModel]); // capitalize initial value + } + }; +}); +app.directive('disallowSpaces', function() { + return { + restrict: 'A', + + link: function($scope, $element) { + $element.bind('input', function() { + $(this).val($(this).val().replace(/ /g, '')); + }); + } + }; +}); \ No newline at end of file diff --git a/assets/js/directives/convert-words.js b/assets/js/directives/convert-words.js new file mode 100644 index 0000000..67c82d3 --- /dev/null +++ b/assets/js/directives/convert-words.js @@ -0,0 +1,167 @@ +app.service('WordsService', function() { + this.convertNumberToWords = function(amount) { + var words = new Array(); + words[0] = ''; + words[1] = 'One'; + words[2] = 'Two'; + words[3] = 'Three'; + words[4] = 'Four'; + words[5] = 'Five'; + words[6] = 'Six'; + words[7] = 'Seven'; + words[8] = 'Eight'; + words[9] = 'Nine'; + words[10] = 'Ten'; + words[11] = 'Eleven'; + words[12] = 'Twelve'; + words[13] = 'Thirteen'; + words[14] = 'Fourteen'; + words[15] = 'Fifteen'; + words[16] = 'Sixteen'; + words[17] = 'Seventeen'; + words[18] = 'Eighteen'; + words[19] = 'Nineteen'; + words[20] = 'Twenty'; + words[30] = 'Thirty'; + words[40] = 'Forty'; + words[50] = 'Fifty'; + words[60] = 'Sixty'; + words[70] = 'Seventy'; + words[80] = 'Eighty'; + words[90] = 'Ninety'; + amount = amount.toString(); + var atemp = amount.split("."); + var number = atemp[0].split(",").join(""); + var n_length = number.length; + var words_string = ""; + if (n_length <= 9) { + var n_array = new Array(0, 0, 0, 0, 0, 0, 0, 0, 0); + var received_n_array = new Array(); + for (var i = 0; i < n_length; i++) { + received_n_array[i] = number.substr(i, 1); + } + for (var i = 9 - n_length, j = 0; i < 9; i++, j++) { + n_array[i] = received_n_array[j]; + } + for (var i = 0, j = 1; i < 9; i++, j++) { + if (i == 0 || i == 2 || i == 4 || i == 7) { + if (n_array[i] == 1) { + n_array[j] = 10 + parseInt(n_array[j]); + n_array[i] = 0; + } + } + } + var value = ""; + for (var i = 0; i < 9; i++) { + if (i == 0 || i == 2 || i == 4 || i == 7) { + value = n_array[i] * 10; + } else { + value = n_array[i]; + } + if (value != 0) { + words_string += words[value] + " "; + } + if ((i == 1 && value != 0) || (i == 0 && value != 0 && n_array[i + 1] == 0)) { + words_string += "Crores "; + } + if ((i == 3 && value != 0) || (i == 2 && value != 0 && n_array[i + 1] == 0)) { + words_string += "Lakhs "; + } + if ((i == 5 && value != 0) || (i == 4 && value != 0 && n_array[i + 1] == 0)) { + words_string += "Thousand "; + } + if (i == 6 && value != 0 && (n_array[i + 1] != 0 && n_array[i + 2] != 0)) { + words_string += "Hundred and "; + } else if (i == 6 && value != 0) { + words_string += "Hundred "; + } + } + words_string = words_string.split(" ").join(" "); + } + return words_string+" Only"; + } +}); +app.service('installmentService', function() { + + this.installmentWords = function(amount) { + var words = new Array(); + words[0] = ''; + words[1] = 'First'; + words[2] = 'Second'; + words[3] = 'Third'; + words[4] = 'Fourth'; + words[5] = 'Fifth'; + words[6] = 'Sixth'; + words[7] = 'Seventh'; + words[8] = 'Eighth'; + words[9] = 'Nineth'; + words[10] = 'Tenth'; + words[11] = 'Eleventh'; + words[12] = 'Twelveth'; + words[13] = 'Thirteenth'; + words[14] = 'Fourteen'; + words[15] = 'Fifteenth'; + words[16] = 'Sixteenth'; + words[17] = 'Seventeenth'; + words[18] = 'Eighteenth'; + words[19] = 'Nineteenth'; + words[20] = 'Twentyth'; + words[30] = 'Thirty'; + words[40] = 'Forty'; + words[50] = 'Fifty'; + words[60] = 'Sixty'; + words[70] = 'Seventy'; + words[80] = 'Eighty'; + words[90] = 'Ninety'; + amount = amount.toString(); + var atemp = amount.split("."); + var number = atemp[0].split(",").join(""); + var n_length = number.length; + var words_string = ""; + if (n_length <= 9) { + var n_array = new Array(0, 0, 0, 0, 0, 0, 0, 0, 0); + var received_n_array = new Array(); + for (var i = 0; i < n_length; i++) { + received_n_array[i] = number.substr(i, 1); + } + for (var i = 9 - n_length, j = 0; i < 9; i++, j++) { + n_array[i] = received_n_array[j]; + } + for (var i = 0, j = 1; i < 9; i++, j++) { + if (i == 0 || i == 2 || i == 4 || i == 7) { + if (n_array[i] == 1) { + n_array[j] = 10 + parseInt(n_array[j]); + n_array[i] = 0; + } + } + } + var value = ""; + for (var i = 0; i < 9; i++) { + if (i == 0 || i == 2 || i == 4 || i == 7) { + value = n_array[i] * 10; + } else { + value = n_array[i]; + } + if (value != 0) { + words_string += words[value] + " "; + } + if ((i == 1 && value != 0) || (i == 0 && value != 0 && n_array[i + 1] == 0)) { + words_string += "Crores "; + } + if ((i == 3 && value != 0) || (i == 2 && value != 0 && n_array[i + 1] == 0)) { + words_string += "Lakhs "; + } + if ((i == 5 && value != 0) || (i == 4 && value != 0 && n_array[i + 1] == 0)) { + words_string += "Thousand "; + } + if (i == 6 && value != 0 && (n_array[i + 1] != 0 && n_array[i + 2] != 0)) { + words_string += "Hundred and "; + } else if (i == 6 && value != 0) { + words_string += "Hundred "; + } + } + words_string = words_string.split(" ").join(" "); + } + return words_string; + } +}); \ No newline at end of file diff --git a/assets/js/directives/dismiss.js b/assets/js/directives/dismiss.js new file mode 100644 index 0000000..779adad --- /dev/null +++ b/assets/js/directives/dismiss.js @@ -0,0 +1,17 @@ +'use strict'; +/** + * A directive used for "close buttons" (eg: alert box). + * It hides its parent node that has the class with the name of its value. +*/ +app.directive('ctDismiss', function () { + return { + restrict: 'A', + link: function (scope, elem, attrs) { + elem.on('click', function (e) { + elem.parent('.' + attrs.ctDismiss).hide(); + e.preventDefault(); + }); + + } + }; +}); \ No newline at end of file diff --git a/assets/js/directives/empty-links.js b/assets/js/directives/empty-links.js new file mode 100644 index 0000000..36f83c5 --- /dev/null +++ b/assets/js/directives/empty-links.js @@ -0,0 +1,16 @@ +'use strict'; +/** + * Prevent default action on empty links. +*/ +app.directive('a', function () { + return { + restrict: 'E', + link: function (scope, elem, attrs) { + if (attrs.ngClick || attrs.href === '' || attrs.href === '#') { + elem.on('click', function (e) { + e.preventDefault(); + }); + } + } + }; +}); \ No newline at end of file diff --git a/assets/js/directives/file-upload.js b/assets/js/directives/file-upload.js new file mode 100644 index 0000000..8d6ed1d --- /dev/null +++ b/assets/js/directives/file-upload.js @@ -0,0 +1,59 @@ +'use strict'; + + +app + + + // Angular File Upload module does not include this directive + // Only for example + + + /** + * The ng-thumb directive + * @author: nerv + * @version: 0.1.2, 2014-01-09 + */ + .directive('ngThumb', ['$window', function($window) { + var helper = { + support: !!($window.FileReader && $window.CanvasRenderingContext2D), + isFile: function(item) { + return angular.isObject(item) && item instanceof $window.File; + }, + isImage: function(file) { + var type = '|' + file.type.slice(file.type.lastIndexOf('/') + 1) + '|'; + return '|jpg|png|jpeg|bmp|gif|'.indexOf(type) !== -1; + } + }; + + return { + restrict: 'A', + template: '', + link: function(scope, element, attributes) { + if (!helper.support) return; + + var params = scope.$eval(attributes.ngThumb); + + if (!helper.isFile(params.file)) return; + if (!helper.isImage(params.file)) return; + + var canvas = element.find('canvas'); + var reader = new FileReader(); + + reader.onload = onLoadFile; + reader.readAsDataURL(params.file); + + function onLoadFile(event) { + var img = new Image(); + img.onload = onLoadImage; + img.src = event.target.result; + } + + function onLoadImage() { + var width = params.width || this.width / this.height * params.height; + var height = params.height || this.height / this.width * params.width; + canvas.attr({ width: width, height: height }); + canvas[0].getContext('2d').drawImage(this, 0, 0, width, height); + } + } + }; + }]); diff --git a/assets/js/directives/full-height.js b/assets/js/directives/full-height.js new file mode 100644 index 0000000..00d078d --- /dev/null +++ b/assets/js/directives/full-height.js @@ -0,0 +1,69 @@ +'use strict'; +/** + * Make element 100% height of browser window. + */ +app.directive('ctFullheight', ['$window', '$rootScope', '$timeout', 'APP_MEDIAQUERY', +function ($window, $rootScope, $timeout, mq) { + return { + restrict: "AE", + scope: { + ctFullheightIf: '&' + }, + link: function (scope, elem, attrs) { + var $win = $($window); + var $document = $(document); + var exclusionItems; + var exclusionHeight; + var setHeight = true; + var page; + + scope.initializeWindowSize = function () { + $timeout(function () { + exclusionHeight = 0; + if (attrs.ctFullheightIf) { + scope.$watch(scope.ctFullheightIf, function (newVal, oldVal) { + if (newVal && !oldVal) { + setHeight = true; + } else if (!newVal) { + $(elem).css('height', 'auto'); + setHeight = false; + } + }); + } + + if (attrs.ctFullheightExclusion) { + var exclusionItems = attrs.ctFullheightExclusion.split(','); + angular.forEach(exclusionItems, function (_element) { + exclusionHeight = exclusionHeight + $(_element).outerHeight(true); + }); + } + if (attrs.ctFullheight == 'window') { + page = $win; + } else { + page = $document; + } + + scope.$watch(function () { + scope.__height = page.height(); + }); + if (setHeight) { + $(elem).css('height', 'auto'); + if (page.innerHeight() < $win.innerHeight()) { + page = $win; + } + $(elem).css('height', page.innerHeight() - exclusionHeight); + } + }, 300); + }; + + scope.initializeWindowSize(); + scope.$watch('__height', function (newHeight, oldHeight) { + scope.initializeWindowSize(); + }); + $win.on('resize', function () { + scope.initializeWindowSize(); + }); + + } + }; +}]); diff --git a/assets/js/directives/messages.js b/assets/js/directives/messages.js new file mode 100644 index 0000000..71b60a4 --- /dev/null +++ b/assets/js/directives/messages.js @@ -0,0 +1,14 @@ +'use strict'; +/** + * Returns the id of the selected e-mail. +*/ +app.directive('messageItem', ['$location', function ($location) { + return { + restrict: 'EA', + link: function (scope, elem, attrs) { + elem.on("click tap", function (e) { + var id = attrs.messageItem; + }); + } + }; +}]); diff --git a/assets/js/directives/off-click.js b/assets/js/directives/off-click.js new file mode 100644 index 0000000..a9f83cf --- /dev/null +++ b/assets/js/directives/off-click.js @@ -0,0 +1,55 @@ +'use strict'; +/** + * It's like click, but when you don't click on your element. +*/ +app.directive('offClick', ['$document', '$timeout', function ($document, $timeout) { + + function targetInFilter(target, filter) { + if (!target || !filter) return false; + var elms = angular.element(document.querySelectorAll(filter)); + var elmsLen = elms.length; + for (var i = 0; i < elmsLen; ++i) + if (elms[i].contains(target)) return true; + return false; + } + + return { + restrict: 'A', + scope: { + offClick: '&', + offClickIf: '&' + }, + link: function (scope, elm, attr) { + + if (attr.offClickIf) { + scope.$watch(scope.offClickIf, function (newVal, oldVal) { + if (newVal && !oldVal) { + $timeout(function () { + $document.on('click', handler); + }); + } else if (!newVal) { + $document.off('click', handler); + } + } + ); + } else { + $document.on('click', handler); + } + + scope.$on('$destroy', function () { + $document.off('click', handler); + }); + + function handler(event) { + // This filters out artificial click events. Example: If you hit enter on a form to submit it, an + // artificial click event gets triggered on the form's submit button. + if (event.pageX == 0 && event.pageY == 0) return; + + var target = event.target || event.srcElement; + if (!(elm[0].contains(target) || targetInFilter(target, attr.offClickFilter))) { + scope.$apply(scope.offClick()); + } + } + } + }; +}]); diff --git a/assets/js/directives/panel-tools.js b/assets/js/directives/panel-tools.js new file mode 100644 index 0000000..8807bdf --- /dev/null +++ b/assets/js/directives/panel-tools.js @@ -0,0 +1,101 @@ +'use strict'; +/** + * Add several features to panels. +*/ +app.directive('ctPaneltool', function () { + var templates = { + /* jshint multistr: true */ + collapse: "" + "" + "" + "", + dismiss: "" + "" + "", + refresh: "" + "" + "" + }; + + return { + restrict: 'E', + template: function (elem, attrs) { + var temp = ''; + if (attrs.toolCollapse) + temp += templates.collapse.replace(/{{panelId}}/g, (elem.parent().parent().attr('id'))); + if (attrs.toolDismiss) + temp += templates.dismiss; + if (attrs.toolRefresh) + temp += templates.refresh.replace(/{{spinner}}/g, attrs.toolRefresh); + return temp; + } + }; +}); +app.directive('panelDismiss', function () { + 'use strict'; + return { + restrict: 'A', + controller: ["$scope", "$element", function ($scope, $element) { + var removeEvent = 'panel-remove', removedEvent = 'panel-removed'; + + $element.on('click', function () { + + var parent = $(this).closest('.panel'); + + destroyPanel(); + + function destroyPanel() { + var col = parent.parent(); + parent.fadeOut(300, function () { + $(this).remove(); + if (col.is('[class*="col-"]') && col.children('*').length === 0) { + col.remove(); + } + }); + } + + }); + }] + }; +}) + +.directive('panelRefresh', function () { + 'use strict'; + + return { + restrict: 'A', + controller: ["$scope", "$element", function ($scope, $element) { + + var refreshEvent = 'panel-refresh', csspinnerClass = 'csspinner', defaultSpinner = 'load1'; + + // method to clear the spinner when done + function removeSpinner() { + this.removeClass(csspinnerClass); + } + + // catch clicks to toggle panel refresh + $element.on('click', function () { + var $this = $(this), panel = $this.parents('.panel').eq(0), spinner = $this.data('spinner') || defaultSpinner; + + // start showing the spinner + panel.addClass(csspinnerClass + ' ' + spinner); + + // attach as public method + panel.removeSpinner = removeSpinner; + + // Trigger the event and send the panel object + $this.trigger(refreshEvent, [panel]); + + }); + + }] + }; +}); + +(function ($, window, document) { + 'use strict'; + + $(document).on('panel-refresh', '.panel', function (e, panel) { + + // perform any action when a .panel triggers a the refresh event + setTimeout(function () { + // when the action is done, just remove the spinner class + panel.removeSpinner(); + }, 3000); + + }); + +}(jQuery, window, document)); \ No newline at end of file diff --git a/assets/js/directives/perfect-scrollbar.js b/assets/js/directives/perfect-scrollbar.js new file mode 100644 index 0000000..0a6483b --- /dev/null +++ b/assets/js/directives/perfect-scrollbar.js @@ -0,0 +1,70 @@ +app.directive('perfectScrollbar', ['$parse', '$window', +function($parse, $window) { + var psOptions = ['wheelSpeed', 'wheelPropagation', 'minScrollbarLength', 'useBothWheelAxes', 'useKeyboard', 'suppressScrollX', 'suppressScrollY', 'scrollXMarginOffset', 'scrollYMarginOffset', 'includePadding'//, 'onScroll', 'scrollDown' + ]; + + return { + restrict: 'EA', + transclude: true, + template: '
', + replace: true, + link: function($scope, $elem, $attr) { + var jqWindow = angular.element($window); + var options = {}; + if(!$scope.app.isMobile) { + for(var i = 0, l = psOptions.length; i < l; i++) { + var opt = psOptions[i]; + if($attr[opt] !== undefined) { + options[opt] = $parse($attr[opt])(); + } + } + + $scope.$evalAsync(function() { + $elem.perfectScrollbar(options); + var onScrollHandler = $parse($attr.onScroll); + $elem.scroll(function() { + var scrollTop = $elem.scrollTop(); + var scrollHeight = $elem.prop('scrollHeight') - $elem.height(); + $scope.$apply(function() { + onScrollHandler($scope, { + scrollTop: scrollTop, + scrollHeight: scrollHeight + }); + }); + }); + }); + + function update(event) { + $scope.$evalAsync(function() { + if($attr.scrollDown == 'true' && event != 'mouseenter') { + setTimeout(function() { + $($elem).scrollTop($($elem).prop("scrollHeight")); + }, 100); + } + $elem.perfectScrollbar('update'); + }); + } + + // This is necessary when you don't watch anything with the scrollbar + $elem.bind('mousemove', update); + + // Possible future improvement - check the type here and use the appropriate watch for non-arrays + if($attr.refreshOnChange) { + $scope.$watchCollection($attr.refreshOnChange, function() { + update(); + }); + } + + // this is from a pull request - I am not totally sure what the original issue is but seems harmless + if($attr.refreshOnResize) { + jqWindow.on('resize', update); + } + + $elem.bind('$destroy', function() { + jqWindow.off('resize', update); + $elem.perfectScrollbar('destroy'); + }); + } + } + }; +}]); diff --git a/assets/js/directives/select.js b/assets/js/directives/select.js new file mode 100644 index 0000000..6471688 --- /dev/null +++ b/assets/js/directives/select.js @@ -0,0 +1,393 @@ +'use strict'; +/** + * Create a custom CSS3 Select Elements. + * You must use it as a class. + * Combined with the class .cs-skin-slide it creates a slide + Activity name is required + Invalid activity name + + + + +
+ + + + Description is required + Invalid description +
+ +
+
+ + + + + {{$item.name}} + + + {{d.name}} + + + + + Status is required. + + +
+
+ + + + +
+
+ + +
+
+ + + +
+ +
+ +

+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Activity ID + + Activity Name + + + Description + Status
{{p.ActivityID}}{{p.ActivityName}}{{p.Description}} Active In-Active + + + +
+ + + + + \ No newline at end of file diff --git a/assets/views/announcement/Announcement.html b/assets/views/announcement/Announcement.html new file mode 100644 index 0000000..742906a --- /dev/null +++ b/assets/views/announcement/Announcement.html @@ -0,0 +1,184 @@ + + +
+
+
+

{{ mainTitle }}

+ Add/View Announcement Details. +
+
+
+
+ + +
+
+ + +
+
+
+ +
Please Wait...
+
+
+ +
+

oops! No + records found...

+
+
+
+ +
+ +

+
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Title + + Status + +
{{p.Heading}} Active In-Active + +
+
+ + +
+ +
+
+
+ +
+ + + + +
+
+ + Add New Announcement Details + +
+
+ +
+
+ + Title is required +
+
+ +
+
+ +
+
+ + +
+ + +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+ + +
+
+ +
+
+
+
+ + + +
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/assets/views/announcement/editAnnouncementDetails.html b/assets/views/announcement/editAnnouncementDetails.html new file mode 100644 index 0000000..54e2fd8 --- /dev/null +++ b/assets/views/announcement/editAnnouncementDetails.html @@ -0,0 +1,99 @@ +
+
+ +
+
+ + Update Announcement Details + + + + +
+ + +
+ +
+ +
+
+ + Title is required +
+ + + +
+ + +
+
+ +
+
+ + +
+ + +
+
+ +
+
+ +
+
+
+ +
+ + + +
+
+ + +
+ +
+ +
+
+
+
+ + + + + +
+
+ + + + + +
+ +
+ + + diff --git a/assets/views/app.html b/assets/views/app.html new file mode 100644 index 0000000..21edc02 --- /dev/null +++ b/assets/views/app.html @@ -0,0 +1,26 @@ + + + + +
+ +
+
+
+ +
+ +
+ + +
+ + +
+ +
+ +
+ +
+
diff --git a/assets/views/batch.html b/assets/views/batch.html new file mode 100644 index 0000000..ae2b97a --- /dev/null +++ b/assets/views/batch.html @@ -0,0 +1,272 @@ + + +
+
+
+

+ + Add/View Batch Details. + +
+
+
+
+ + +
+
+ + +
+
+
+ +
Please Wait...
+
+
+ +
+

oops! No + records found...

+
+
+
+ +
+ +

+
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Batch Code + + Batch Name + + University Name + + StatusIs Default Action
{{p.BatchCode}}{{p.BatchName}}{{p.UniversityName}} Active In-Active + + + + + + + + + + + + + +
+ + +
+
+ +
+
+
+ + +
+ + + +
+
+
+ +
+
+ + Add New Batch Details + + +
+
+ + + + Batch code is required + Invalid course id + +
+
+
+ + + Batch date is required. + + +
+ +
+ + +
+ + + + Batch name is required + Invalid batch name + + +
+ +
+ + + University is required + +
+ +
+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+ + + + + + diff --git a/assets/views/branchDetails.html b/assets/views/branchDetails.html new file mode 100644 index 0000000..7ce3e45 --- /dev/null +++ b/assets/views/branchDetails.html @@ -0,0 +1,329 @@ + + +
+
+
+

{{ mainTitle }}

+ + Add/View Branch Details. + +
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
+
+
Please Wait...
+
+
+ +
+

oops! No + records found...

+
+
+
+ +
+ +

+
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Branch Code + + Branch Name + + Email Id + + Mobile Number + + Landline Number + + Status +
{{p.BranchCode}}{{p.BranchName}}{{p.EmailID}}{{p.MobileNumber}}{{p.LandlineNumber}} Active In-Active + +
+
+ + +
+ +
+
+
+ + + + +
+ + + +
+
+
+ +
+
+ + Add New Branch Details + + +
+
+ + + + Branch code is required + Invalid branch code + + +
+ + +
+ + + + Branch name is required + Invalid branch name + + +
+ +
+ + + Email is required. + Please, enter a valid email address. + +
+
+
+ +
+ + + Phone number is required. + Enter a valid phone number + +
+ +
+ + + Enter a valid phone number +
+
+ + + Enter a valid number +
+
+
+ +
+ + + Address is required + + +
+
+ +
+
+ + +
+
+ + +
+ + +
+ + +
+
+ +
+ +
+ +
+
+
+ +
+
+
Branch Logo
+
+ +
+
+ +
+
+ + +
+
+ +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + + +
+
+
+
+
+ +
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/calendar-event.html b/assets/views/calendar-event.html new file mode 100644 index 0000000..2e9ee08 --- /dev/null +++ b/assets/views/calendar-event.html @@ -0,0 +1,71 @@ +
+

{{startDate}}

+
+
+
+ + +
+
+ + +
+
+ + + + + +
+
+ + + + + +
+
+ +
+ +
+
+ +
+
+ +
+
+
+
+
+ + + +
diff --git a/assets/views/calendar/day.html b/assets/views/calendar/day.html new file mode 100644 index 0000000..42e6783 --- /dev/null +++ b/assets/views/calendar/day.html @@ -0,0 +1,252 @@ +
+
+
Time
+
Events
+
+ + +
+
+ +
+ +
+
06:00
+
+
+ +
+
06:30
+
+
+ +
+ +
+ +
+
07:00
+
+
+ +
+
07:30
+
+
+ +
+ +
+ +
+
08:00
+
+
+ +
+
08:30
+
+
+ +
+ +
+ +
+
09:00
+
+
+ +
+
09:30
+
+
+ +
+ +
+ +
+
10:00
+
+
+ +
+
10:30
+
+
+ +
+ +
+ +
+
11:00
+
+
+ +
+
11:30
+
+
+ +
+ +
+ +
+
12:00
+
+
+ +
+
12:30
+
+
+ +
+ +
+ +
+
13:00
+
+
+ +
+
13:30
+
+
+ +
+ +
+ +
+
14:00
+
+
+ +
+
14:30
+
+
+ +
+ +
+ +
+
15:00
+
+
+ +
+
15:30
+
+
+ +
+ +
+ +
+
16:00
+
+
+ +
+
16:30
+
+
+ +
+ +
+ +
+
17:00
+
+
+ +
+
17:30
+
+
+ +
+ +
+ +
+
18:00
+
+
+ +
+
18:30
+
+
+ +
+ +
+ +
+
19:00
+
+
+ +
+
19:30
+
+
+ +
+ +
+ +
+
20:00
+
+
+ +
+
20:30
+
+
+ +
+ +
+ +
+
21:00
+
+
+ +
+
21:30
+
+
+ +
+ +
+ + +
+ + + + {{ event.title | truncateEventTitle:20:event.height }} + + +
+ +
+ +
diff --git a/assets/views/calendar/main.html b/assets/views/calendar/main.html new file mode 100644 index 0000000..1426ada --- /dev/null +++ b/assets/views/calendar/main.html @@ -0,0 +1,42 @@ +
+ + + + + + + + +
diff --git a/assets/views/calendar/month.html b/assets/views/calendar/month.html new file mode 100644 index 0000000..1115366 --- /dev/null +++ b/assets/views/calendar/month.html @@ -0,0 +1,75 @@ +
+ +
{{ day }}
+ +
+
+ +
+
+
+
+ {{ day.label }} +
+ + +
+
+ +
+ +
+
+
+ +
+
+
    + +
  • + +   + + {{ event.title }} + + + + + + + +
  • + +
+
+
+
+ +
diff --git a/assets/views/calendar/week.html b/assets/views/calendar/week.html new file mode 100644 index 0000000..977c696 --- /dev/null +++ b/assets/views/calendar/week.html @@ -0,0 +1,23 @@ +
+
+ +
{{ column.weekDay }}
+ + {{ column.date }} + +
+ + +
+
+ +
+
+ + {{ event.title }} + +
+
+ + +
diff --git a/assets/views/calendar/year.html b/assets/views/calendar/year.html new file mode 100644 index 0000000..f4e7979 --- /dev/null +++ b/assets/views/calendar/year.html @@ -0,0 +1,53 @@ +
+
+
+
+ {{ month.label }} + + {{ month.events.length }} + +
+ + +
+ +
+
+
+ +
+
    + +
  • + +   + + {{ event.title }} + + + + + + + +
  • + +
+
+
+
+ +
diff --git a/assets/views/callTrackingCloseDetails.html b/assets/views/callTrackingCloseDetails.html new file mode 100644 index 0000000..d55a117 --- /dev/null +++ b/assets/views/callTrackingCloseDetails.html @@ -0,0 +1,153 @@ + + +
+
+
+ +

{{ mainTitle }}

+ View all closed leads. + +
+
+
+
+ + +
+
+
+
+
+ + + +
+ + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID + + Followup + + Name + + Mobile + + UniversityCourseActivity + Assigned Created Status
+ + + + {{p.TrackingID}}{{p.followupDetails }}{{p.LeadName}}{{p.MobileNumber}}{{p.UniversityName}}{{p.CourseName }}{{p.ActivityName}}{{p.Firstname}}{{p.UpdatedOn}} + + + {{p.statusName}} + + + + + {{p.statusName}} + +
+ + +
+ +
+
+ +
+ + + + + + diff --git a/assets/views/callTrackingDetails.html b/assets/views/callTrackingDetails.html new file mode 100644 index 0000000..7265d3c --- /dev/null +++ b/assets/views/callTrackingDetails.html @@ -0,0 +1,616 @@ + + +
+
+
+ +

{{ mainTitle }}

+ + Manage new leads. + +
+
+
+
+ + +
+
+ + +
+
+ + + +
+ +
+ +
+ +
+ + + + + + + +
+
+ +
+ + +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+

+
+ +
+ +
+ + +
+
+
+
+
+
Please Wait...
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID + + Followup + + Name + + Mobile + + UniversityCourseActivity Assigned Status
+ + + + {{p.TrackingID}}{{p.followupDetails }} {{p.LeadName}}{{p.MobileNumber}}{{p.UniversityName}}{{p.CourseName }}{{p.ActivityName}}{{p.Firstname}} + + + {{p.statusName}} + + + + + {{p.statusName}} + +
+ + +
+ +
+ +
+
+
+ +
+ + + + + +
+
+
+ +
+
+ + Add New Lead Details + + +
+
+ + + + Phone number is required + Enter a valid phone number + +
+
+ +
+
+
+
+
+
Please Wait...
+
+ +
+ + +
+ + + + Student name is required + Invalid student name +
+ +
+ +
+
+
+
+
+
Please Wait...
+
+ +
+ +
+ + + + Enter a valid university name +
+ +
+ +
+
+
+
+
+
Please Wait...
+
+ +
+ +
+ + + + Enter a valid course name +
+ + +
+
+ +
+
+ + + Followup date is required. + + +
+ +
+
+ +
+
+
+
+
+
Please Wait...
+
+ +
+
+ + + Activity is required + + +
+
+ +
+
+
+
+
+
Please Wait...
+
+ +
+
+ + + Status is required + + +
+ + +
+ +
+
+
+
+
+
Please Wait...
+
+ +
+
+ + + + Assigned to is required + + +
+ + +
+ +
+
+
+
+
+
Please Wait...
+
+ +
+
+ + + + Branch is required + + +
+ + +
+
+ + + + +
+ + + + Assigned to is required + + +
+ +
+ + + + + Enter a valid phone number + + +
+
+ + + + + Invalid referred by name +
+
+ + + +
+ + +
+ + + Comments is required + + +
+ + +
+ + + + +
+
+ + + + +
+
+
+
+
+
+
+
+
+
+ +
+ + + + + + diff --git a/assets/views/callTrackingFollowup.html b/assets/views/callTrackingFollowup.html new file mode 100644 index 0000000..1176f04 --- /dev/null +++ b/assets/views/callTrackingFollowup.html @@ -0,0 +1,397 @@ + + +
+ +
+
+
+

View Student Details/Activity

+ + +
+ +
+ + + + +
+ +
+ +
+
+ +
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Contact Information
Student Name + + {{followupDetails.LeadName}} +
Mobile Number + {{followupDetails.MobileNumber}}
University{{followupDetails.UniversityName}}
Course + {{followupDetails.CourseName}} +
Alternate Mobile + + + Enter a valid phone number + +
Address + + +
Referred By + + + + Invalid referred by name +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tracking information
Tracking ID{{followupDetails.TrackingID}}
Activity{{followupDetails.ActivityName}}
Followup On + + +
+ + + + + + Followup date is required. +
+ + + +
Assigned To + +
Select Branch + +
Assigned To + +
Status + +
+
+
+

Other Lead/Activities

+ +
+
+
+
    +
  • + +
    +
    +
    + + {{trackValues.ListName}} + +
    +
    + + {{trackValues.ActivityName}} + +
    + + +
    +
    + + +
    + + Tracking ID {{trackValues.TrackingID}} + +
    +
    +
  • +
+
+ +
+
+ + + + + + + + + + + + +
+
+
+ +
+
+

Comments

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

Comments History

+ +
+
+
+
    +
  • +
    +
    + {{message.FirstName}}    On   {{message.CreatedOn}} +
    + +

    + {{message.FollowupComments}} +

    +
    +
  • +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ diff --git a/assets/views/callTrackingLeadDetails.html b/assets/views/callTrackingLeadDetails.html new file mode 100644 index 0000000..3898908 --- /dev/null +++ b/assets/views/callTrackingLeadDetails.html @@ -0,0 +1,151 @@ + + +
+
+
+ +

{{ mainTitle }}

+ + Leads created on a given date. + +
+
+
+
+ + +
+
+
+
+
+ + + +
+ + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID + + Followup + + Name + + Mobile + + UniversityCourseActivity + Assigned Created Status
+ + + + {{p.TrackingID}}{{p.followupDetails }}{{p.LeadName}}{{p.MobileNumber}}{{p.UniversityName}}{{p.CourseName }}{{p.ActivityName}}{{p.Firstname}}{{p.CreatedOn}} + + + {{p.statusName}} + + + + + {{p.statusName}} + +
+ + +
+ +
+
+ +
+ + + + + diff --git a/assets/views/callTrackingPendingDetails.html b/assets/views/callTrackingPendingDetails.html new file mode 100644 index 0000000..a3999f0 --- /dev/null +++ b/assets/views/callTrackingPendingDetails.html @@ -0,0 +1,152 @@ + + +
+
+
+ +

{{ mainTitle }}

+ + View all pending leads. + +
+
+
+
+ + +
+
+
+
+
+ + + +
+ + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID + + Followup + + Name + + Mobile + + UniversityCourseActivity + AssignedCreatedStatus
+ + + + {{p.TrackingID}}{{p.followupDetails }}{{p.LeadName}}{{p.MobileNumber}}{{p.UniversityName}}{{p.CourseName }}{{p.ActivityName}}{{p.Firstname}}{{p.UpdatedOn}} + + + {{p.statusName}} + + + + + {{p.statusName}} + +
+ + +
+ +
+
+ +
+ + + + + + diff --git a/assets/views/centerMaster.html b/assets/views/centerMaster.html new file mode 100644 index 0000000..7389989 --- /dev/null +++ b/assets/views/centerMaster.html @@ -0,0 +1,235 @@ + + +
+
+
+

+ +
+
+
+
+ + +
+
+ + +
+
+
+ +
Please Wait...
+
+
+ +
+

oops! No + records found...

+
+
+
+ +
+ +

+
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Center Code + + Center Name + + Center Address + + Status Action
{{p.CenterCode}}{{p.CenterName}}{{p.CenterAddress}} Active De-Active + + + + +
+ + +
+
+ +
+
+
+ + +
+ + + +
+
+
+ +
+
+ + Add New Center Details + + +
+
+ + + + Center code is required + Invalid center code + +
+ + +
+ + + + Center name is required + Invalid center name + + +
+ + + +
+ + + Address is required +
+ +
+ + + Comments is required +
+
+
+ +
+
+ + +
+
+ + +
+ + +
+ + +
+
+ +
+ +
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+ + + + + + diff --git a/assets/views/certificate/certificate.html b/assets/views/certificate/certificate.html new file mode 100644 index 0000000..37e5578 --- /dev/null +++ b/assets/views/certificate/certificate.html @@ -0,0 +1,142 @@ + +
+
+
+

+ Add/Edit certificate type. +
+
+
+
+
+
+
+
+ Add Certificate Details +
+ +
+ +
+ +
+ + + + Certificate Name is required + Invalid Certificate name + +
+ +
+
+ + + +
+
+ +
+ + +
+
+
+ +
+
+ +
+ +

+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
Certification ID + + Certificate Nmae + + Status
{{p.CertificationID}}{{p.CertificateName}} Active In-Active + + +
+ + + +
+
\ No newline at end of file diff --git a/assets/views/certificate/editCertificationDetails.html b/assets/views/certificate/editCertificationDetails.html new file mode 100644 index 0000000..64270ad --- /dev/null +++ b/assets/views/certificate/editCertificationDetails.html @@ -0,0 +1,70 @@ +
+
+
+
+
+ + Update Certificate Details + + +
+
+ + + + Certificate ID is required + +
+ + +
+ + + + Certificate Name is required + Invalid Certificate Name + +
+
+ +
+ + + +
+
+ + +
+ +
+ +
+ +
+
+
+
+ + + + + +
+
+
+ +
+
+
+ \ No newline at end of file diff --git a/assets/views/changePassword.html b/assets/views/changePassword.html new file mode 100644 index 0000000..857debd --- /dev/null +++ b/assets/views/changePassword.html @@ -0,0 +1,96 @@ + + +
+
+
+

Change Password

+
+
+
+
+ + +
+
+
+ + +
+ +
+
+ + + +
+
+
+
+ + +
+
+
+
+ + Change Password + +
+ +
+ + + Password is required. + Enter at least 8 characters + +
+ +
+ + + Password is required. + Enter at least 8 characters + Ok! +
+
+ + + Repeat password is required! + Passwords do not match! + Passwords match! +
+
+ +
+ + +
+ +
+ +
+
+
+ + + +
+ +
+ +
+
+
+
+ \ No newline at end of file diff --git a/assets/views/charts.html b/assets/views/charts.html new file mode 100644 index 0000000..d9a0454 --- /dev/null +++ b/assets/views/charts.html @@ -0,0 +1,207 @@ + +
+
+
+

{{ mainTitle }}

+ Tc-angular-chartjs provides you with directives for all chartjs chart types. +
+
+
+
+ + +
+
+
+
Line Chart
+
+ +
+
+ +
+
+

+ A line chart is a way of plotting data points on a line. + Often, it is used to show trend data, and the comparison of two data sets. +

+

+ The line chart requires an array of labels for each of the data points. This is shown on the X axis. The data for line charts is broken up into an array of datasets. Each dataset has a colour for the fill, a colour for the line and colours for the points and strokes of the points. These colours are strings just like CSS. You can use RGBA, RGB, HEX or HSL notation. +

+

+ The label key on each dataset is optional, and can be used when generating a scale for the chart. +

+

+

+

+
+
+
+
+
+
+ + +
+
+
+
Bar Chart
+
+ +
+
+

+ A bar chart is a way of showing data as bars. + It is sometimes used to show trend data, and the comparison of multiple data sets side by side. +

+

+ The bar chart has the a very similar data structure to the line chart, and has an array of datasets, each with colours and an array of data. Again, colours are in CSS format. + We have an array of labels too for display. In the example, we are showing the same data as the previous line chart example. +

+

+ The label key on each dataset is optional, and can be used when generating a scale for the chart. +

+

+

+

+
+
+ +
+
+
+
+
+
+ + +
+
+
+
Doughnut Chart
+
+ +
+
+
+ +
+
+
+

+ Pie and doughnut charts are probably the most commonly used chart there are. They are divided into segments, the arc of each segment shows the proportional value of each piece of data. +

+

+ They are excellent at showing the relational proportions between data. +

+

+ Pie and doughnut charts are effectively the same class in Chart.js, but have one different default value - their percentageInnerCutout. This equates what percentage of the inner should be cut out. This defaults to 0 for pie charts, and 50 for doughnuts. +

+

+

+

+
+
+
+
+
+
+ + +
+
+
+
Pie Chart
+
+ +
+
+

+ Pie and doughnut charts are probably the most commonly used chart there are. They are divided into segments, the arc of each segment shows the proportional value of each piece of data. +

+

+ They are excellent at showing the relational proportions between data. +

+

+ Pie and doughnut charts are effectively the same class in Chart.js, but have one different default value - their percentageInnerCutout. This equates what percentage of the inner should be cut out. This defaults to 0 for pie charts, and 50 for doughnuts. +

+

+

+

+
+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+
Polar Area Chart
+
+ +
+
+
+ +
+
+
+

+ Polar area charts are similar to pie charts, but each segment has the same angle - the radius of the segment differs depending on the value. +

+

+ This type of chart is often useful when we want to show a comparison data similar to a pie chart, but also show a scale of values for context. +

+

+ As you can see, for the chart data you pass in an array of objects, with a value and a colour. The value attribute should be a number, while the color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL. +

+

+

+

+
+
+
+
+
+
+ + +
+
+
+
Radar Chart
+
+ +
+
+

+ A radar chart is a way of showing multiple data points and the variation between them. +

+

+ They are often useful for comparing the points of two or more different data sets. +

+

+ For a radar chart, to provide context of what each point means, we include an array of strings that show around each point in the chart. + For the radar chart data, we have an array of datasets. Each of these is an object, with a fill colour, a stroke colour, a colour for the fill of each point, and a colour for the stroke of each point. We also have an array of data values. +

+

+

+

+
+
+ +
+
+
+
+
+
+ diff --git a/assets/views/courseDetails.html b/assets/views/courseDetails.html new file mode 100644 index 0000000..d1fa6a5 --- /dev/null +++ b/assets/views/courseDetails.html @@ -0,0 +1,527 @@ + + +
+
+
+

{{ mainTitle }}

+ + Add/View Course Details. + +
+
+
+
+ + +
+
+ + +
+
+
+ +
Please Wait...
+
+
+ +
+

oops! No + records found...

+
+
+
+ +
+ +

+
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Course ID + + Course Name + + University + + Status
{{p.CourseCode}}{{p.CourseName}}{{p.UniversityName}} Active In-Active + + + +
+ + +
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+ +
+
+ + Add New Course Details + + +
+
+ + + University is required + +
+
+ + + + Course id is required + Invalid course id + + +
+ + +
+ + + + Course name is required + Invalid course name + + +
+ + +
+ +
+
+ + +
+
+ + +
+ + +
+ + +
+
+ +
+ +
+
+
+ + + + + Invalid Specilization 1 + + +
+
+ + + + + Invalid Specilization 2 + + +
+
+ + + +
+
+ + + + + {{$item.SubjectName}} + + + {{sub.SubjectName}} + + + + + + + + +
+ +
+ + +
+ +
+
+
+ +
{{myModelRegular.FeesName}} +
+ +
+ + + + + Enter a valid amount + +
+
+ + + + + Enter a valid amount + +
+ +
+ + +
+
+ +
+ +
+ +
+
+ {{myModelSemYear.FeesName}} + +
+ +
+
+ + + + + Invalid Sem/Year name +
+
+ + + + + Enter a valid amount + +
+
+
+ + +
+
+
+
+ + + + Enter a valid name +
+
+ + + + Enter a valid amount + +
+ +
+
+
+
+ +
+
+ +
+ +
+
+
+ +
+ + + + Enter a valid amount + +
+ + + +
+ + + + Enter a valid amount + +
+
+
+
+ + + + Enter a valid amount + +
+
+ + + + Enter a valid amount + +
+
+
+
+ + + + Enter a valid amount + +
+ + +
+ +
+
+ + +
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+ + + + + + diff --git a/assets/views/dashboard.html b/assets/views/dashboard.html new file mode 100644 index 0000000..9ee52f8 --- /dev/null +++ b/assets/views/dashboard.html @@ -0,0 +1,226 @@ + + + + + +
+
+
+
+
+
+ +
+
+

Follow Ups For Today : {{todayFolloupDetails.length}}

+ +
+
+
+
+
No Followup!
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID NameMobile ActivityStatus
{{today.TrackingID}}{{today.LeadName}}{{today.MobileNumber}}{{today.ActivityName}}{{today.statusName}}{{today.statusName}}
+
+
+
+
+ +
+
+
+

Leads Created Today :{{leadDetails.length}}

+ +
+
+
+
+
No Lead Created By Today!
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ID NameMobile ActivityFollowup Status
{{lead.TrackingID}}{{lead.LeadName}}{{lead.MobileNumber}}{{lead.ActivityName}}{{lead.FollowupOn}}{{lead.statusName}}{{lead.statusName}}
+
+
+
+
+
+
+
+
+
+

Pending Follow Ups :{{pendingFolloupDetails.length}}

+ +
+
+
+
+
No Pending Followup!
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ID NameMobile ActivityFollowup Status
{{pending.TrackingID}}{{pending.LeadName}}{{pending.MobileNumber}}{{pending.ActivityName}}{{pending.FollowupOn}}{{pending.statusName}}
+
+
+
+
+
+ +
+ + +
+
+
+
+
\ No newline at end of file diff --git a/assets/views/daybook/dayBookApproval.html b/assets/views/daybook/dayBookApproval.html new file mode 100644 index 0000000..b97692d --- /dev/null +++ b/assets/views/daybook/dayBookApproval.html @@ -0,0 +1,360 @@ + +
+
+
+

{{ mainTitle }}

+
+
+
+
+ + +
+
+
+ +
+ + +
+
+
+
+ +
+
+ + + +
+
+
+
+ + + +
+
+
+ + + Type is Required + +
+
+
+
+ Loading... +
+
+
+

No + records found...

+
+ +
+ + +
+
+
+
+ Total Count: + {{ dataLengthExpense }} +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Date + + Income/Expense + + Voucher Number/Bill Number + + Paid To / Received From + + Description/Comments + + Type + + Amount + + Status + +
+ + {{p.Date}}{{p.ListName}}{{p.VoucherNumber}}{{p.PaidTo}} +
+
+ {{p.PaidDescription}} / {{p.Description}} +
+
+
{{p.TypeName}}{{p.Amount}}{{p.Status}} + {{p.Status}} + {{p.Status}} +
+ + +
+
+ +
+
+
+
+
+
+
+ +
+
+ +
+
+ + Update Status + +
+ + + +
+
+
+ + + + Status is Required + +
+ +
+
+
+
+ + + + Address is required + + +
+
+ +
+ + + +
+
+ + +
+ +
+
+ + +
+
+ +
+
+
+
Update Logo
+
+ +
+ +
+
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+ + + + + +
+
+
+
+ + + + + + diff --git a/assets/views/editCenterDetails.html b/assets/views/editCenterDetails.html new file mode 100644 index 0000000..af9650d --- /dev/null +++ b/assets/views/editCenterDetails.html @@ -0,0 +1,102 @@ +
+
+
+
+
+ + Update Center Details + + +
+
+ + + + Center code is required + Invalid center Code + +
+ + +
+ + + + Center name is required + Invalid center name + +
+ +
+ + + Address is required +
+
+ + + Comments is required +
+
+ +
+ +
+ + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + +
+
+
+ +
+
+
+
+ + + + + diff --git a/assets/views/editCourseDetails.html b/assets/views/editCourseDetails.html new file mode 100644 index 0000000..2f3b0e9 --- /dev/null +++ b/assets/views/editCourseDetails.html @@ -0,0 +1,395 @@ +
+
+
+
+
+ + Update Course Details + + +
+ +
+ + + + Course id is required + Invalid course id + +
+ + + +
+ + + + Course name is required + Invalid course name + + +
+ +
+ + + University is required + +
+ +
+ +
+ + + +
+
+ + +
+ +
+
+
+
+ + + + + Invalid Specilization 1 + + +
+
+ + + + + Invalid Specilization 2 + + +
+
+
+
+ + + + {{$item.SubjectName}} + + + {{sub.SubjectName}} + + + + + + + + +
+ +
+ +
+ +
+
+
+ +
+ Single +
+ +
+ + + + + Enter a valid amount + +
+
+ + + + + Enter a valid amount + +
+ +
+ + +
+
+ +
+ +
+ +
+
+ {{myModelSemYear1.FeesName}} + +
+ +
+
+
+ + + + + Invalid Sem/Year name +
+
+ + + + + Enter a valid amount + +
+
+
+ + +
+
+
+ + + +
+
+ + + + Enter a valid name +
+
+ + + + Enter a valid amount + +
+
+
+ +
+
+ +
+
+ +
+ +
+
+
+
+ + + + Enter a valid amount + +
+ + + +
+ + + + Enter a valid amount + +
+
+ + +
+
+ + + + Enter a valid amount + +
+
+ + + + Enter a valid amount + +
+
+ +
+
+ + + + Enter a valid amount + +
+
+ + + + +
+ +
+
+ + +
+
+
+
+ + + + + +
+
+
+ +
+
+
+
+ + + + + diff --git a/assets/views/editDefaultActivityStatus.html b/assets/views/editDefaultActivityStatus.html new file mode 100644 index 0000000..43bef97 --- /dev/null +++ b/assets/views/editDefaultActivityStatus.html @@ -0,0 +1,103 @@ +
+
+
+
+
+ + Update Status + + +
+
+ + + + Activity ID is required + +
+ + +
+ + + + Activity name is required + Invalid activity name + +
+
+
+ + + + + {{$item.name}} + + + {{d.name}} + + + + + Status is required. + + +
+ +
+ +
+
+ + + + +
+ +
+
+
+
+ + + + + +
+
+
+ +
+
+
+ \ No newline at end of file diff --git a/assets/views/editEmployeeBranchDetails.html b/assets/views/editEmployeeBranchDetails.html new file mode 100644 index 0000000..feb0050 --- /dev/null +++ b/assets/views/editEmployeeBranchDetails.html @@ -0,0 +1,273 @@ +
+
+
+

Fetching ...

+
+
+
+ + Branch Details + +
+ + + + + + + + + + + + + + + + + + + + + +
Branch + Role + JobResponsibility + FinanceModule Access + Status + +
{{s.BranchName}}{{s.ListName}}{{s.JobResponsibility}}Active + In-ActiveActive + In-Active + +
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + Role is required + +
+
+
+ + + Role is required +
+
+ + + JOB Responsibility is required + Job Responsibility Should be Less than 1000 Characters. +
+
+
+
+ +
+ + +
+ +
+
+ +
+ + +
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+ + + Role is required + +
+
+
+ + + Role is required +
+
+ + + JOB Responsibility is required + Job Responsibility Should be Less than 1000 Characters. +
+
+
+
+ +
+ + +
+ +
+
+
+
+
+ + +
+
+
+
+
+
+ +
+
+
+
\ No newline at end of file diff --git a/assets/views/editEmployeeDetails.html b/assets/views/editEmployeeDetails.html new file mode 100644 index 0000000..3d26957 --- /dev/null +++ b/assets/views/editEmployeeDetails.html @@ -0,0 +1,581 @@ +
+
+
+ + + +
+
+ + Personal Details + + +
+
+ + + + Employee Id required + Invalid Employee Id +
+ + +
+ + + + First Name required + Invalid First Name +
+ +
+ + + + Last Name required + Invalid Last Name +
+
+
+
+ + + + Invalid Father Name +
+ +
+ + + + Invalid Last Name +
+ +
+
+ + + + + + + + Date of Birth is required. + Enter a Valid Date of Birth +
+
+
+
+ +
+ + + Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + Enter a Valid Phone Number +
+
+ + + Email is required. + Please, enter a valid email address. +
+ +
+
+
+ +
+ + + + + Gender is required. + +
+
+
+ + + + Enter a Valid Qualification +
+ +
+ +
+ +
+ + + + + Aadhar Number is required. + Enter a Valid Aadhar Number +
+
+
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+
+ +
+
+
+ + + Permanent Address is required +
+
+ + + Current Address is required +
+
+ +
+
+
+ + + + + + Date of Joining is required + +
+
+
+ +
+
+ + + + +
+ +
+
+ +
+ +
+
+ + +
+ +
+ +
+
+ +
+
Update Profile Picture
+
+ +
+ +
+
+ + +
+
+ +
+ + + +
+
+ + +
+
+ +
+
+
+
+ + + +
+ + + +
+
+
+ +
+ +
+
+ + + +
+
+
+ + +
+
+
+ + + +
+
+ + +
+ + + \ No newline at end of file diff --git a/assets/views/editRow.html b/assets/views/editRow.html new file mode 100644 index 0000000..af56078 --- /dev/null +++ b/assets/views/editRow.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + +
ID: {{p.id}} + + Firstname: + + Description: + + Email: + +
Lastname: + + Phone: + + +
+ + +
+ diff --git a/assets/views/editSessionMaster.html b/assets/views/editSessionMaster.html new file mode 100644 index 0000000..45d8548 --- /dev/null +++ b/assets/views/editSessionMaster.html @@ -0,0 +1,122 @@ +
+
+
+
+
+ + Update Session Details + + + +
+
+
+ + + Session date is required. + + +
+ + +
+
+ + + + Session name is required + Invalid session name + + +
+
+ + + + + + {{$item.UniversityName}} + + + {{d.UniversityName}} + + + + + + University is required. + + + +
+ + + +
+
+
+ +
+ + + +
+
+ + +
+ +
+
+ +
+
+
+
+ + + + + +
+
+
+ +
+
+
+ \ No newline at end of file diff --git a/assets/views/editSessionSchedule.html b/assets/views/editSessionSchedule.html new file mode 100644 index 0000000..46d38de --- /dev/null +++ b/assets/views/editSessionSchedule.html @@ -0,0 +1,181 @@ +
+
+
+
+
+ + Update Session Details + + + +
+ + + + +
+
+ + + Session is required + + +
+
+
+ + + Date is required. + + +
+ +
+
+ +
+ + + +
+
+ + +
+ +
+ +
+ +
+
+ + + +
+
+
+ +
+ +
+
+
Schedule {{n+1}}
+
+
+ + + + Enter valid time +
+
+
+
+ + + + Enter valid time +
+ +
+ + +
+ + +
+ + +
+ + +
+ + + + +
+ +
+
+
+
+ + + + + +
+
+
+ +
+
+ + \ No newline at end of file diff --git a/assets/views/editStatusDetails.html b/assets/views/editStatusDetails.html new file mode 100644 index 0000000..0a9248f --- /dev/null +++ b/assets/views/editStatusDetails.html @@ -0,0 +1,70 @@ +
+
+
+
+
+ + Update Status Details + + +
+
+ + + + status ID is required + +
+ + +
+ + + + status Name is required + Invalid status Name + +
+
+ +
+ + + +
+
+ + +
+ +
+ +
+ +
+
+
+
+ + + + + +
+
+
+ +
+
+
+ \ No newline at end of file diff --git a/assets/views/editSubjectDetails.html b/assets/views/editSubjectDetails.html new file mode 100644 index 0000000..eb97b8f --- /dev/null +++ b/assets/views/editSubjectDetails.html @@ -0,0 +1,87 @@ +
+
+
+
+
+ + Update Subject Details + + + + +
+ + + + Subject code is required + Enter a valid subject code + +
+
+ + + + Subject name is required + Invalid subject name +
+
+ +
+ + + +
+
+ + +
+ +
+ + + +
+
+
+ + + + + +
+
+
+
+
+
+
+ +
+ + + + diff --git a/assets/views/editUniversityDetails.html b/assets/views/editUniversityDetails.html new file mode 100644 index 0000000..0119819 --- /dev/null +++ b/assets/views/editUniversityDetails.html @@ -0,0 +1,111 @@ +
+
+
+
+
+ + University Details + + +
+
+ + + + University Id is required + Invalid university Id +
+ +
+ + + + University Name is required +
+ +
+ + + + University Short Name is required + +
+ + + +
+
+ + +
+ + + Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + Email is required. + Please, enter a valid email address. +
+
+ + + Address is required +
+
+ + +
+
+ +
+ +
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
+ +
+
+ + +
+ diff --git a/assets/views/employeeDetails.html b/assets/views/employeeDetails.html new file mode 100644 index 0000000..5cb4b91 --- /dev/null +++ b/assets/views/employeeDetails.html @@ -0,0 +1,553 @@ + +
+
+
+

{{ mainTitle }}

+ + View/Add Employee Details. + +
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
+
+
Please Wait...
+
+
+ +
+

No + records found...

+
+ +
+ +
+
+ +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Staff Id + + First Name + + Last Name + + Mobile + + Email ID + + Status Details +
{{p.StaffID}}{{p.Firstname}}{{p.Lastname}}{{p.MobileNumber}}{{p.EmailID}} Active In-Active + + + + + +
+ + + +
+ +
+
+
+
+ + + + + +
+
+
+
+
+ + Personal Details + + +
+
+ + + + + Employee Id is required + Employee ID length Should be (4-12) +
+ + +
+ + + + First Name is required + Invalid First Name +
+ +
+ + + + Last Name is required + Invalid Last Name +
+
+
+ + + +
+ + + + Invalid Father Name +
+ +
+ + + + Invalid Last Name +
+ +
+ + + +
+ + + + + Date of Birth is required. + Enter a Valid Date of Birth +
+
+
+
+ +
+ + + Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + Enter a Valid Phone Number +
+ +
+ + + +
+ + + Email is required. + Please, enter a valid email address. +
+
+ +
+
+
+ +
+ + + + + Gender is required. + +
+
+
+ + + + Enter a Valid Qualification +
+ + +
+ +
+
+ + + + + Aadhar Number is required. + Enter a Valid Aadhar Number +
+
+
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+
+ +
+
+
+ + + Permanent Address is required +
+
+ + + Current Address is required +
+
+
+
+ +
+
+ +
+ + +
+
+
Profile Picture
+
+ +
+
+ + + +
+
+ + +
+
+ +
+
+
+
+ + + +
+ + + +
+
+
+ +
+
+
+
+ + Branch Details + +
+
+ + + + Home Branch is Required +
+ +
+
+ + + + + + Date of Joining is required +
+
+ +
+ + + Role is required +
+
+
+
+ +
+ + +
+ + +
+
+ + + JOB Responsibility is required + Job Responsibility Should be Less than 1000 Characters. +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+
+ +
+ +
+
+
+ + +
+
+
+
+ +
+
+ +
+
+
+ + +
+
+ \ No newline at end of file diff --git a/assets/views/feesNotification.html b/assets/views/feesNotification.html new file mode 100644 index 0000000..c47b2c7 --- /dev/null +++ b/assets/views/feesNotification.html @@ -0,0 +1,25 @@ + +
+
+
+

{{ mainTitle }}

+ +
+
+
+
+ + +
+
+ +
+
+ + + + + + diff --git a/assets/views/firstpage.html b/assets/views/firstpage.html new file mode 100644 index 0000000..9f6398f --- /dev/null +++ b/assets/views/firstpage.html @@ -0,0 +1 @@ +hai \ No newline at end of file diff --git a/assets/views/form_elements.html b/assets/views/form_elements.html new file mode 100644 index 0000000..0c72a3d --- /dev/null +++ b/assets/views/form_elements.html @@ -0,0 +1,1847 @@ + +
+
+
+

{{ mainTitle }}

+ We set out to create an easy, powerful and versatile form layout system. A combination of form styles and the Bootstrap grid means you can do almost anything. +
+
+
+
+ + +
+
+
+
Basic example
+

+ Individual form controls automatically receive some global styling. +

+
+
+
+
+
Default Form
+
+
+

+ All textual <input>, <textarea>, and <select> elements with .form-control are set to width: 100%; by default. Wrap labels and controls in .form-group for optimum spacing. +

+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+
+
+
Horizontal form
+
+
+

+ Use Bootstrap's predefined grid classes to align labels and groups of form controls in a horizontal layout by adding .form-horizontal to the form. Doing so changes .form-groups to behave as grid rows, so no need for .row. +

+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
Inline form
+
+
+

+ Add .form-inline to your <form> for left-aligned and inline-block controls. +

+
+
+
+
+ @ +
+ +
+
+
+ + +
+
+
+ + +
+
+ +
+
+
+
+
+
+
+
+ + +
+
+
+
Alternative example
+

+ Show your text field as a line, adding the class .underline +

+
+
+
Default Form
+
+
+
+
+ + +
+
+ + +
+
+
+
+
+
+
+
Horizontal Form
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+
Control sizing
+

+ Create taller or shorter form controls that match button sizes. +

+
+
+
Default field sizing
+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
Alternative field sizing
+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+ + +
+
+
+
Defining a Fieldset
+

+ <fieldset> is used as a wrapper right inside the form element. Right after you define a fieldset, you can include a legend title by using <legend>. Here's some HTML to help make copy paste. +

+
+
+
+ + Your Account + +
+ +
+ +
+
+
+
+ + Choose a password + +
+ + +
+
+ + +
+
+
+
+
+ + Personal Information + +
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + + +
+
+
+
+
+ + +
+
+
+
+
+ + Terms & Condition + +
+
+
+ +
+
+
+
+
+
+
+
+
+ + +
+
+
+
Input Options
+
+
+
+
+
+ Disabled State +
+
+
+

+ Add the disabled boolean attribute on an input to prevent user input. +

+
+ + +
+
+
+
+
+
+
+
+ Readonly State +
+
+
+

+ Add the readonly boolean attribute on an input to prevent user input. +

+
+ + +
+
+
+
+
+
+
+
+ Required Label +
+
+
+

+ An asterisk indicates to the user that the field is required. +

+
+ + +
+
+
+
+
+
+
+
+ Success State +
+
+
+

+ Includes validation styles for success states on form controls. +

+
+ + +
+
+
+
+
+
+
+
+ Warning State +
+
+
+

+ Includes validation styles for warning states on form controls. +

+
+ + +
+
+
+
+
+
+
+
+ Error State +
+
+
+

+ Includes validation styles for error states on form controls. +

+
+ + +
+
+
+
+
+
+
+
+ + +
+
+
+
Icons & Helpers
+
+
+
+
+
+
+ + + A block of help text that breaks onto a new line and may extend beyond one line. +
+
+
+ +
+ +
+ Inline help text +
+
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+
+
+ + + + +
+
+ + + + +
+
+ +
+ @ + +
+
+
+
+ + .00 +
+
+
+
+ $ + + .00 +
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
Checkboxes
+

+ Checkboxes are for selecting one or several options in a list +

+
+
+
+
+
Inline Checkbox
+
+
+

+ Use the .checkbox-inline classes on a series of checkboxes for controls that appear on the same line. +

+
+ + +
+
+ + +
+
+
+
+
+
Default (stacked)
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
Various Colours
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
Various Sizes
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
Switches
+
+
+

+ Turn checkboxes in toggle switches. +

+
+ +
+
+
+
+
+
Buttons
+
+
+

+ Turn checkboxes in buttons. +

+ +
+
+ + + +
+
{{checkModel}}
+
+
+
+
+
+
+
+
+ + +
+
+
+
Radio
+

+ Radios are for selecting one option from many. +

+
+
+
+
+
Inline radio
+
+
+

+ Use the .radio-inline classes on a series of radios for controls that appear on the same line. +

+
+ + +
+
+ + +
+
+
+
+
+
Vertical radio
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
Verious Colours
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
Sized
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ +
+
+
+
Buttons
+
+
+

+ Turn radio in buttons. +

+
+ + + +
+
+ + + +
+
{{radioModel || 'null'}}
+
+
+
+
+
+
+
+
+ + +
+
+
+
Masked Input
+

+ uiMask Directive allows users to enter the data in a certain format (dates, phone numbers, etc). +

+
+
+
+
+
+ Date - 99/99/9999 +
+
+
+
+ +
+ + + +
+
+
+
+
+
+
+
+
+ Phone - (999) 999-9999 +
+
+
+
+ +
+ + +
+
+
+
+
+
+
+
+
+ Product Key -A*-999-A999 +
+
+
+
+ +
+ + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
Text Area
+

+ The <textarea> tag defines a multi-line text input control. +

+
+
+
+
+
+ Default +
+
+
+
+ +
+
+
+
+
+
+ With Character Limit +
+
+
+
+ +
+
+
+
+
+
+ As a Block Note +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ Autosize with Animation +
+
+
+
+ +
+
+
+
+
+
+ Autosize without Animation +
+
+
+
+ +
+
+
+
+
+
+ Autosize As a Block Note +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ + +
+
+
+
Date/Time Picker
+

+ A clean, flexible, and fully customizable date picker. + User can navigate through months and years. The datepicker shows dates that come from other than the main month being displayed. These other dates are also selectable. +

+
+
+ +
+
+
+
Selected date is: {{dt | date:'MM/dd/yyyy  h:mma' }}
+
+
+
Inline
+
+ +
+
+
+
Popup
+

+ + + +

+
Format:
+ +
+ + + + +
+
+
+
+
+
Timepicker
+ +
Time is: {{dt | date:'shortTime' }}
+
+
+ Hours step is: +
+
+ Minutes step is: +
+
+
+ + + +
+
+
Date Range
+
+ + to + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
Select Box
+

+ The <select> element is used to create a drop-down list. +

+
+
+
+
+
Default Select Boxes
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
Css3 Select Boxes
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
Ui-Select Directive
+

+ AngularJS-native version of Select2 and Selectize. +

+
+ +
+
+
+
+
+ + + + {{$select.selected.name}} + + +
+ +
+
+
+
+ + + + {{$select.selected.name}} + + + + + + +
+
+ +
+ + + {{$select.selected.name}} + + + + + + + + +
+
+
+
+
+
+
+
+
+ + + + {{$select.selected.name}} + + +
+ +
+
+
+
+ + + + {{$item}} + + + {{color}} + + +
+
+ + + + {{$item.name}} <{{$item.email}}> + + +
+ email: {{person.email}} + age: +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
Input Spinner
+

+ A mobile and touch friendly input spinner component for Bootstrap. It supports the mousewheel and the up/down keys. +

+
+
+
+
+
+ Basic example +
+
+
+

+ The init value is set on the input with the value attribute. +

+
+ + +
+
+
+
+
+
+
+
+ Example with postfix +
+
+
+

+ Use the data-postfix attribute to add a postfix. +

+
+ + +
+
+
+
+
+
+
+
+ With prefix +
+
+
+

+ Use the data-prefix attribute to add a prefix. +

+
+ + +
+
+
+
+
+
+
+
+ Vertical buttons +
+
+
+

+ Set the data-verticalbuttons attribute as true. + You can also specify the class for icons. +

+
+ + +
+
+
+
+
+
+
+
+ Button postfix +
+
+
+

+ Set the data-postfix attribute as button. + You can also specify the class for the button. +

+
+ + +
+
+
+
+
+
+
+
+ Sizes +
+
+
+

+ Size of the whole controller can be set with applying input-sm or input-lg class on the input +

+
+ + +
+
+
+
+
+
+
+
+ diff --git a/assets/views/form_file_upload.html b/assets/views/form_file_upload.html new file mode 100644 index 0000000..99e8fa0 --- /dev/null +++ b/assets/views/form_file_upload.html @@ -0,0 +1,222 @@ + +
+
+
+

{{ mainTitle }}

+ Angular File Upload supports drag-n-drop upload, upload progress, validation filters and a file upload queue. +
+
+
+
+ + +
+
+
+
Uploads only images
+

+ with canvas preview +

+ +
+
+
+
Select files
+
+
+
+ +
+ Base drop zone +
+ +
+
+ Another drop zone with its own settings +
+
+
+ + Select an image file + + +
+
+
+
+
+

The queue

+

+ Queue length: {{ uploaderImages.queue.length }} +

+
+ + + + + + + + + + + + + + + + + + + +
NameSizeProgressStatusActions
{{ item.file.name }} + + + + +
+ + +
{{ item.file.size/1024/1024|number:2 }} MB +
+
+
+ + +
+
+
+
+ Queue progress: +
+
+
+
+ + + +
+
+
+
+
+
+
+ + +
+
+
+
Uploads all files
+

+ without canvas preview +

+ +
+
+
+
Select files
+
+
+
+ +
+ Base drop zone +
+ +
+
+ Another drop zone with its own settings +
+
+
+ + Select multiple files + + +
+ Select single file + + +
+
+
+
+

Upload queue

+
+
+

+ Queue length: {{ uploader.queue.length }} +

+
+ + + + + + + + + + + + + + + + + + + +
NameSizeProgressStatusActions
{{ item.file.name }}{{ item.file.size/1024/1024|number:2 }} MB +
+
+
+ + +
+
+
+
+ Queue progress: +
+
+
+
+ + + +
+
+
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/form_image_cropping.html b/assets/views/form_image_cropping.html new file mode 100644 index 0000000..06ed6aa --- /dev/null +++ b/assets/views/form_image_cropping.html @@ -0,0 +1,61 @@ + +
+
+
+

{{ mainTitle }}

+ Simple Image Crop directive for AngularJS. Enables to crop a circle or a square out of an image. +
+
+
+
+ + +
+
+
+
Image Crop example
+

+ Add the image crop directive <img-crop> + to the HTML file where you want to use an image crop control. +
+ Note: + a container, you place the directive to, should have some pre-defined size (absolute or relative to its parent). That's required, because the image crop control fits the size of its container. +

+ +
+
+
+ Select an image file + + +
+ + +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/form_text_editor.html b/assets/views/form_text_editor.html new file mode 100644 index 0000000..6725173 --- /dev/null +++ b/assets/views/form_text_editor.html @@ -0,0 +1,30 @@ + +
+
+
+

{{ mainTitle }}

+ CKEditor directive for Angular. +
+
+
+
+ + +
+
+
+
WYSIWYG Editor
+

+ CKEditor is a ready-for-use HTML text editor designed to simplify web content creation. It's a WYSIWYG editor that brings common word processor features directly to your web pages. Enhance your website experience with our community maintained editor. +

+ +
+
+
+ {{content}} +
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/form_validation.html b/assets/views/form_validation.html new file mode 100644 index 0000000..f964f3a --- /dev/null +++ b/assets/views/form_validation.html @@ -0,0 +1,276 @@ + +
+
+
+

{{ mainTitle }}

+ Client side validation it’s very important if it is used as help for the user to complete with success the submission of a form. +
+
+
+
+ + +
+
+
+
AngularJS directives for form validation
+

+ AngularJS has many directives to run form validation. Some of these (like required, pattern, etc.) repeat the behaviour of the new HTML5 attributes. The advantage of using AngularJS directives instead of classic HTML5 attributes, is that AngularJS way allows to mantain the two way data binding between model and view. +

+ +
+
+
+
+
+ + Success and Error Message + +
+ + + First Name is required + Thank You! +
+
+ + + Last Name is required + Wonderful! +
+
+ + + Email is required. + Please, enter a valid email address. + It's a valid e-mail! +
+
+ +
+ + + + +
+ Gender is required. + Thank You, Mr. {{form.lastName}}! + Thank You, Mrs. {{form.lastName}}! +
+
+ + + Password is required. + Ok! +
+
+ + + Repeat password is required! + Passwords do not match! + Passwords match! +
+
+ + + Country is required. + Lovely place! +
+
+ +
+ +
+ You must accept terms and conditions! + Thank You! +
+
+
+ + Only Error Message + +
+ + + Url is required! + Not Valid Url! +
+
+
+
+
+ + No Messages + +
+ + +
+
+ + +
+
+
+ + Min Length and Max Length + +
+ + + Too short! +
+
+ + + Too long! +
+
+ + + Too long! + Too short! +
+
+
+ + Min Number and Max Number + +
+ + + Number must not be higher than 10! + Not valid number! +
+
+ + + Number must be higher than 10! + Not valid number! +
+
+ + + Number must not be higher than 100! + Number must be higher than 10! + Not valid number! +
+
+
+
+
+
+
+ + + +
+
+
+
{{ myModel | json }}
+
+
+
+
+
+ diff --git a/assets/views/form_wizard.html b/assets/views/form_wizard.html new file mode 100644 index 0000000..d4f0816 --- /dev/null +++ b/assets/views/form_wizard.html @@ -0,0 +1,433 @@ + +
+
+
+

{{ mainTitle }}

+ Using simple Angular.js guidelines you can turn a form into a multi-step form wizard +
+
+
+
+ + +
+
+
+
Wizard demo
+

+ Some textboxes in this example is required. +

+ +
+ +
+
+ +
    +
  • + +
    + 1 +
    + Personal Information +
    +
  • +
  • + +
    + 2 +
    + Create an account +
    +
  • +
  • + +
    + 3 +
    + Billing details +
    +
  • +
  • + +
    + 4 +
    + Complete +
    +
  • +
+ + +
+
+
+
+

Enter your personal information

+

+ This is an added measure against fraud and to help with billing issues. +

+

+ Enter security questions in case you lose access to your account. +

+
+
+
+
+ + Personal Information + +
+
+
+ + + First Name is required + Thank You! +
+
+
+
+ + + Last Name is required + Wonderful! +
+
+
+
+
+
+ +
+ + + + +
+
+
+
+
+ + +
+
+
+

+ + Why do you need my personal information? + +

+
+
+ + Security question + +

+ Enter security questions in case you lose access to your account. Be sure to pick questions that you will remember the answers to. +

+ + + + What was the name of your first stuffed animal? + +
+ +
+
+ + + What is your grandfather's first name? + +
+ +
+
+ + + In what city your grandmother live? + +
+ +
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+

Create an account to manage everything you do with ng-Clip

+

+ You’ll enjoy personal services and great benefits including: +

+

+

    +
  • + Access to exclusive releases and limited products. +
  • +
  • + ng-Clip services, benefits and promotions. +
  • +
+

+
+
+
+
+ + Account Credential + +
+ + + Email is required. + Please, enter a valid email address. + It's a valid e-mail! +
+
+
+
+ + + Password is required. + Ok! +
+
+
+
+ + + Repeat password is required! + Passwords do not match! + Passwords match! +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+

Enter billing details

+

+ You will need to enter your billing address and select your payment method. +

+

+ You can use most major credit card, as well as PayPal. +

+
+
+
+
+ + Payment Method + + +
+
+ + +
+
+
+ + +
+ +
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+

+

Congratulations!

+

+ Your tutorial is complete. +

+

+ Thank you for your registration. Your transaction has been completed, and a receipt for your purchase has been emailed to you. You may log into your account to view details of this transaction. +

+ + Back to first step + +
+
+
+
+ +
+
{{ myModel | json }}
+
+ +
+
+
+
+ diff --git a/assets/views/form_xeditable.html b/assets/views/form_xeditable.html new file mode 100644 index 0000000..097760a --- /dev/null +++ b/assets/views/form_xeditable.html @@ -0,0 +1,291 @@ + +
+
+
+

{{ mainTitle }}

+ Angular-xeditable is a bundle of AngularJS directives that allows you to create editable elements. Such technique is also known as click-to-edit or edit-in-place. +
+
+
+
+ + +
+
+
+
Angular-xeditable
+

+ It is based on ideas of x-editable but was written from scratch to use power of angular and support complex forms / editable grids. +

+
+
+
+
+
Edit Text
+
+
+

+ To make element editable via textbox just add editable-text="model.field" attribute. +

+
+ +
+ + {{ example.name || 'empty' }} + +
+
+
+
+
+
+
+
+
Select Local
+
+
+

+ To create editable select (dropdown) just set editable-select attribute pointing to model. + To pass dropdown options you should define e-ng-options attribute + that works like normal angular ng-options but is transfered to underlying <select> from original element. +

+
+ +
+ + {{ showStatus() }} + +
+
+
+
+
+
+
+
+
+
+
Select Remote
+
+
+

+ To load select options from remote url you should define onshow attribute pointing to scope function. + The result of function should be a $http promise, it allows to disable element while loading. +

+
+ +
+ + {{ example.groupName || 'not set' }} + +
+
+
+
+
+
+
+
+
Textarea
+
+
+

+ To make element editable via textarea just add editable-textarea attribute + pointing to model in scope. You can also wrap content into <pre> tags to keep linebreaks. + Data can be submitted by Ctrl + Enter. +

+
+ +
+ +
{{ example.desc || 'no description' }}
+
+
+
+
+
+
+
+
+
+
+
+
Checkbox
+
+
+

+ To make element editable via checkbox just add editable-checkbox attribute + pointing to model in scope. Set e-title attribute to define text shown with checkbox. +

+
+ +
+ + {{ example.remember && "Remember me!" || "Don't remember" }} + +
+
+
+
+
+
+
+
+
Checklist
+
+
+

+ To create list of checkboxes use editable-checklist attribute pointing to model. + Also you should define e-ng-options attribute to set value and display items. +

+
+ +
+ + {{ showStatus() }} + +
+
+
+
+
+
+
+
+
+
+
Radiolist
+
+
+

+ To create list of radios use editable-radiolist attribute pointing to model. + Also you should define e-ng-options attribute to set value and display items. + By default, radioboxes aligned horizontally. +

+
+ +
+ + {{ showStatus() }} + +
+
+
+
+
+
+
+
+
Typeahead
+
+
+

+ Basically it is normal editable-text control with additional e-typeahead attributes. +
+ You should include additional ui-bootstrap-tpls.min.js: +

+
+ +
+ + {{ user.state || 'empty' }} + +
+
+
+
+
+
+
+
+
+
+
Customize input
+
+
+

+ To define attributes for input (e.g. style or placeholder) you can define them + on the original element with e-* prefix (e.g. e-style or e-placeholder). + When input will appear these attributes will be transfered to it. +

+
+ +
+ + {{ (user.name || 'empty') | uppercase }} + +
+
+
+
+
+
+
+
+
Trigger manually
+
+
+

+ To trigger edit-in-place by external button you should define e-form attribute. + Value of it is the name of variable to be created in scope that allows you to show / hide editor manually. +

+
+ +
+ {{ user.name || 'empty' }} + +
+
+
+
+
+
+
+
+
+
+
Hide buttons
+
+
+

+ To hide Ok and Cancel buttons you may set buttons="no" attribute. + New value will be saved automatically after change. +

+ +
+
+ + {{ showStatus() }} + +
+
+
+
+
+
+
+
+
Select multiple
+
+
+

+ Just define e-multiple attribute that will be transfered to select as multiple. +

+
+ +
+ + {{ showStatus() }} + +
+
+
+
+
+
+
+
+
+ diff --git a/assets/views/generateHallTicket.html b/assets/views/generateHallTicket.html new file mode 100644 index 0000000..fbb78dc --- /dev/null +++ b/assets/views/generateHallTicket.html @@ -0,0 +1,116 @@ + + +
+
+
+ +

{{ mainTitle }}

+ + Generate halltickets. + +
+
+
+
+ + +
+
+ +
+
+ Search +
+ +
+ + + +
+
+ + + +
+
+ + + +
+ +
+ +
+ +
+
+ +
+ + + + + + diff --git a/assets/views/hallticket/batchSchedule.html b/assets/views/hallticket/batchSchedule.html new file mode 100644 index 0000000..5129e84 --- /dev/null +++ b/assets/views/hallticket/batchSchedule.html @@ -0,0 +1,114 @@ + + +
+
+
+ +

{{ mainTitle }}

+ + Schedule Examinaiton Timing to Specific Batch. + +
+
+
+
+ + +
+
+ +
+
+ Search +
+ +
+ + + +
+
+ + + +
+
+ + + +
+ +
+ +
+ +
+
+ +
+ + + + + + diff --git a/assets/views/hallticket/generateHallTicket.html b/assets/views/hallticket/generateHallTicket.html new file mode 100644 index 0000000..fbb78dc --- /dev/null +++ b/assets/views/hallticket/generateHallTicket.html @@ -0,0 +1,116 @@ + + +
+
+
+ +

{{ mainTitle }}

+ + Generate halltickets. + +
+
+
+
+ + +
+
+ +
+
+ Search +
+ +
+ + + +
+
+ + + +
+
+ + + +
+ +
+ +
+ +
+
+ +
+ + + + + + diff --git a/assets/views/hallticket/semesterCourseMapping.html b/assets/views/hallticket/semesterCourseMapping.html new file mode 100644 index 0000000..d872a5b --- /dev/null +++ b/assets/views/hallticket/semesterCourseMapping.html @@ -0,0 +1,116 @@ + + +
+
+
+ +

{{ mainTitle }}

+ + Allocate Subjects to corresponding Semesters. + +
+
+
+
+ + +
+
+ +
+
+ Search +
+ +
+ + + +
+
+ + + +
+
+ + + +
+ +
+ +
+ +
+
+ +
+ + + + + + diff --git a/assets/views/login_forgot.html b/assets/views/login_forgot.html new file mode 100644 index 0000000..684cd49 --- /dev/null +++ b/assets/views/login_forgot.html @@ -0,0 +1,47 @@ + +
+
+
+ {{app.name}} +
+ +
+ + +
+
+ + Forget Password? + +

+ Enter your Registered Mobile Number below to reset your password. +

+
+ + + + mobile number is required. + + Enter a valid mobile number +
+ +
+ + Log-In + + +
+
+
+ +
+ {{app.year}} © {{ app.name }} by {{ app.author }}. +
+ +
+ +
+
+ diff --git a/assets/views/login_lock_screen.html b/assets/views/login_lock_screen.html new file mode 100644 index 0000000..12e5c70 --- /dev/null +++ b/assets/views/login_lock_screen.html @@ -0,0 +1,22 @@ + +
+
+
+ +
+

Peter Clark

+ peter@example.com +
+
+ + + +
+
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/login_login.html b/assets/views/login_login.html new file mode 100644 index 0000000..bed3caa --- /dev/null +++ b/assets/views/login_login.html @@ -0,0 +1,166 @@ + + + + + +
+ + +
+ + + +
+ +
+
+
+ + +
+

{{slide.Heading}}

+
+
+ +
+
+ +
+
+
+
+
+ +
+ + + + + + +
+ + +
+ +
+
+
+ {{app.name}} +
+
+
+
+ + + + + + mobile number is required. + Enter a valid mobile number / Employee Id +
+ +
+ + + + + Password Required +
+ +
+ I forgot my password + +
+ + +
+ + + + + +
+ + + +
+
+ + + + + + + + + + + + + + + diff --git a/assets/views/login_registration.html b/assets/views/login_registration.html new file mode 100644 index 0000000..3fd2e01 --- /dev/null +++ b/assets/views/login_registration.html @@ -0,0 +1,89 @@ + +
+
+
+ {{app.name}} +
+ +
+
+
+ + Sign Up + +

+ Enter your personal details below: +

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

+ Enter your account details below: +

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

+ Already have an account? + + Log-in + +

+ +
+
+
+ +
+ {{app.year}} © {{ app.name }} by {{ app.author }}. +
+ +
+ +
+
+ diff --git a/assets/views/maps.html b/assets/views/maps.html new file mode 100644 index 0000000..116d5a2 --- /dev/null +++ b/assets/views/maps.html @@ -0,0 +1,182 @@ + +
+
+
+

{{ mainTitle }}

+ The Simplest Way of Showing A Map +
+
+
+
+ + +
+
+
+
Basic Map
+

+ Everything in tag and attributes. +

+ +
+
+
+ + +
+
+
+
Showing Pixel And Tile Coordinates
+

+ Showing static coordinates of Chicago +

+ +
+ + +
+ Chicago, IL +
+ LatLng: {{chicago.lat()}}, {{chicago.lng()}}, +
+ World Coordinate: {{worldCoordinate.x}}, {{worldCoordinate.y}}, +
+ Pixel Coordinate: {{pixelCoordinate.x}}, {{pixelCoordinate.y}}, +
+ Tile Coordinate: {{tileCoordinate.x}}, {{tileCoordinate.y}} at Zoom Level {{map.getZoom()}} +
+
+
+
+
+
+
Simple Click Event
+

+ Click the marker to zoom and drag and watch it comes back after 3 seconds. +

+ +
+ + + +
+
+
+
+ + +
+
+
+
Assigning arguments in UI events
+

+ When zoom level changed, the contents of infoWindow also updates. +

+ +
+ + +
+ Change the zoom level +
+
+
+
+
+
+
Adding state to controls
+

+ Adds a control to the map that returns the user to the control's defined home +

+ +
+ + + + Go Home + + + + + Set Home + + + +
+
+
+
+ + +
+
+
+
Styled Map
+

+ Styled maps allow you to customize the presentation of the standard Google base maps. +

+ +
+
+
Simple Marker
+

+ A marker identifies a location on a map. By default, a marker uses a standard image. +

+ + + +
+
+
+ + +
+
+
+
Icon
+

+ In the most basic case, an icon can simply indicate an image to use instead of the default Google Maps pushpin icon. +

+ + + +
+
+
Info Windows
+

+ This example displays a marker at the center of Australia. When the user clicks the marker, an info window opens. +

+ + + +
+
+

Uluru

+
+

+ Uluru, also referred to as Ayers Rock, is a large sandstone rock formation in the southern part of the Northern Territory, central Australia. +

s +

+ Attribution: Uluru, + + http://en.wikipedia.org/w/index.php?title=Uluru + + (last visited June 22, 2009). +

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

More examples at
http://ngmap.github.io

+
+
+
+ \ No newline at end of file diff --git a/assets/views/myProfile/myProfile.html b/assets/views/myProfile/myProfile.html new file mode 100644 index 0000000..9b3344d --- /dev/null +++ b/assets/views/myProfile/myProfile.html @@ -0,0 +1,146 @@ + +
+
+
+

{{ mainTitle }}

+
+
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+
+ +
+
+
+ img + img +
+
+
+
+
+

{{userInfo.StaffID}}

+

{{userInfo.Firstname}} {{userInfo.Lastname}}

+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
General information
Mobile Number : {{userInfo.MobileNumber}}
Alternate Mobile Number : {{userInfo.AlternateNumber}}
Email : {{userInfo.EmailID}}
Father's Name : {{userInfo.Fathername}}
Mother's Name : {{userInfo.MotherName}}
Gender : {{userInfo.Gender}}
Date Of Birth : {{userInfo.DOB}}
Aadhar Number : {{userInfo.AadharNumber}}
Qualification : {{userInfo.Qualification}}
Present Address : {{userInfo.PresentAddress}}
Permanent Address : {{userInfo.PermanentAddress}}
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + +
Branch Details
Role : {{ userStatusInfo }}
Date Of Joining : {{userInfo.DOJ}}
Branch Access :
  • {{ branch.BranchName }}
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
\ No newline at end of file diff --git a/assets/views/pages_blank_page.html b/assets/views/pages_blank_page.html new file mode 100644 index 0000000..01ac747 --- /dev/null +++ b/assets/views/pages_blank_page.html @@ -0,0 +1,13 @@ + +
+
+
+

{{ mainTitle }}

+ Use this page to start from scratch and put your custom content +
+
+
+
+ + + \ No newline at end of file diff --git a/assets/views/pages_calendar.html b/assets/views/pages_calendar.html new file mode 100644 index 0000000..1e18db4 --- /dev/null +++ b/assets/views/pages_calendar.html @@ -0,0 +1,198 @@ + +
+
+
+

{{ mainTitle }}

+ A port of the bootstrap calendar widget to AngularJS (no jQuery required). +
+
+
+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+
+

{{ calendarControl.getTitle() }}

+
+
+
+ + +
+ +
+
+
+
+ + + + +
+
+
+
+ +
    +
  • + + Year + +
  • +
  • + + Month + +
  • +
  • + + Week + +
  • +
  • + + Day + +
  • +
+
+
+
+
+
+ +
+
+
+ + + +
+
+
+
+ diff --git a/assets/views/pages_inbox.html b/assets/views/pages_inbox.html new file mode 100644 index 0000000..b29262c --- /dev/null +++ b/assets/views/pages_inbox.html @@ -0,0 +1,71 @@ +
+
    +
  • + All Inboxes +
  • +
  • + + + + +
      +
    • + + Reply + +
    • +
    • + + Reply all + +
    • +
    • + + Forward + +
    • +
    • + + Delete + +
    • +
    +
  • +
  • + + Reply + +
  • +
  • + + Reply all + +
  • +
  • + + Forward + +
  • +
  • + + Delete + +
  • +
+
+
+ {{ message.from }} +
+ {{message.date | date: "MM/dd/yyyy 'at' h:mma" }} +
+
+ {{message.from}} <{{message.email}}> +
+
+ To: Peter Clark +
+
+
+ [SPAM] {{message.subject}} +
+
\ No newline at end of file diff --git a/assets/views/pages_invoice.html b/assets/views/pages_invoice.html new file mode 100644 index 0000000..0c7bad3 --- /dev/null +++ b/assets/views/pages_invoice.html @@ -0,0 +1,160 @@ + +
+
+
+

{{ mainTitle }}

+ Beautifully simple invoicing and payments. Give clients attractive invoices, estimates, and receipts. +
+
+
+
+ + +
+
+
+
+
+
+ +
+
+

+ #1233219 / 01 Jan 2014 Lorem ipsum dolor sit amet +

+
+
+
+
+
+

Client:

+
+
+ Customer Company, Inc. +
+ 1 Infinite Loop +
+ Cupertino, CA 95014 +
+ P: (123) 456-7890 +
+
+ E-mail: + + info@customer.com + +
+
+
+
+

We appreciate your business.

+
+ Thanks for being a customer. + A detailed summary of your invoice is below. +
+ If you have questions, we're happy to help. +
+ Email support@cliptheme.com or contact us through other support channels. +
+
+
+

Payment Details:

+
    +
  • + V.A.T Reg #: 233243444 +
  • +
  • + Account Name: Company Ltd +
  • +
  • + SWIFT code: 1233F4343ABCDEW +
  • +
  • + DATE: 01/01/2014 +
  • +
  • + DUE: 11/02/2014 +
  • +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
# Item Description Quantity Unit Cost Total
1 Lorem Drem psum dolor 12 $35 $1152
2 Ipsum Consectetuer adipiscing elit 21 $469 $6159
3 Dolor Olor sit amet adipiscing eli 24 $144 $8270
4 Sit Laoreet dolore magna 194 $317 $966
+
+
+
+
+
    +
  • + Sub-Total: $12,876 +
  • +
  • + Discount: 9.9% +
  • +
  • + VAT: 22% +
  • +
  • + Total: $11,400 +
  • +
+
+ + Print + + + Submit Your Invoice + +
+
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/pages_messages.html b/assets/views/pages_messages.html new file mode 100644 index 0000000..8170e74 --- /dev/null +++ b/assets/views/pages_messages.html @@ -0,0 +1,126 @@ + +
+ +
+ +
+
+ +

+ BROWSE +

+
    +
  • + + Inbox + {{(messages |filter: filters = {sent: false}).length}} + +
  • +
  • + + Sent + +
  • +
  • + + Spam + {{(messages |filter: filters = {spam: true}).length}} + +
  • +
  • + + Starred + {{(messages |filter: filters = {starred: true}).length}} + +
  • +
+
+
+ + +
+
+
+
+
+ + +
    +
  • + + Inbox + {{(messages |filter: filters = {sent: false}).length}} + +
  • +
  • + + Sent + +
  • +
  • + + Spam + {{(messages |filter: filters = {spam: true}).length}} + +
  • +
  • + + Starred + {{(messages |filter: filters = {starred: true}).length}} + +
  • +
+
+ + +
+
+
+ +
+
+
+
    +
  • +
    + No messages! Try sending one to a friend. +
    +
  • +
  • + + + {{ message.from }} + {{ message.from }} +
    + {{ message.date | date: "MM/dd/yyyy 'at' h:mma" }} +
    + [SPAM] {{ message.subject }} + {{ message.content | htmlToPlaintext | words:15 :true }} +
    +
  • +
+
+
+ + +
+
+
+

No email has been selected

+
+
+
+ +
+
+ \ No newline at end of file diff --git a/assets/views/pages_timeline.html b/assets/views/pages_timeline.html new file mode 100644 index 0000000..13ec739 --- /dev/null +++ b/assets/views/pages_timeline.html @@ -0,0 +1,238 @@ + +
+
+
+

{{ mainTitle }}

+ Timeline is used to show chronological events in a clear and effective way +
+
+
+
+ + +
+
+
+
+
+
+
+ NOVEMBER 2014 +
+
    +
  • +
    +
    +
    +
    + 02 +
    +
    + Wensdey + november 2014 +
    +
    +
    +
    + +

    Appointment

    +
    +
    + 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. +
    +
    + + Read More + +
    +
    +
  • +
  • +
    +
    +
    +
    + 05 +
    +
    + Wensdey + november 2014 +
    +
    +
    +
    + +

    Appointment

    +
    +
    +
    +
    offce +
    +
    + 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. +
    +
    +
    +
    + + Read More + +
    +
    +
  • +
  • +
    +
    +
    +
    + 12 +
    +
    + Wensdey + november 2014 +
    +
    +
    +
    + +

    Test Solution

    +
    +
    +

    + 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. +

    + + + +
    +
    + + Read More + +
    +
    +
  • +
+
+ OCTOBER 2014 +
+
    +
  • +
    +
    +
    +
    + 05 +
    +
    + Wensdey + november 2014 +
    +
    +
    +
    + +

    Appointment

    +
    +
    +
    +
    offce +
    +
    + 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. +
    +
    +
    +
    + + Read More + +
    +
    +
  • +
  • +
    +
    +
    +
    + 05 +
    +
    + Wensdey + november 2014 +
    +
    +
    +
    + +

    Appointment

    +
    +
    +
    +
    offce +
    +
    + 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. +
    +
    +
    +
    + + Read More + +
    +
    +
  • +
  • +
    +
    +
    +
    + 05 +
    +
    + Wensdey + november 2014 +
    +
    +
    +
    + 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. +
    +
    + + Read More + +
    +
    +
  • +
  • +
    +
    +
    +
    + 05 +
    +
    + Wensdey + november 2014 +
    +
    +
    +
    + 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. +
    +
    + + Read More + +
    +
    +
  • +
+
+
+
+
+
+ diff --git a/assets/views/pages_user_profile.html b/assets/views/pages_user_profile.html new file mode 100644 index 0000000..a7017c3 --- /dev/null +++ b/assets/views/pages_user_profile.html @@ -0,0 +1,574 @@ + +
+
+
+

{{ mainTitle }}

+ There are many systems which have a need for user profile pages which display personal information on each member. +
+
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+
+

{{userInfo.firstName}} {{userInfo.lastName}}

+
+
+
+ + + +
+
+ + +
+
+ + +
+
+
+
+
+
    +
  • + + Twitter + +
  • +
  • + + Facebook + +
  • +
  • + + Google+ + +
  • +
  • + + LinkedIn + +
  • +
  • + + Github + +
  • +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Contact Information
url + + {{userInfo.url}} +
email: + + {{userInfo.email}} +
phone:{{userInfo.phone}}
skye + + {{userInfo.skype}} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
General information
PositionUI Designer
Last Logged In56 min
PositionSenior Marketing Manager
Supervisor + + Kenneth Ross +
StatusAdministrator
+ + + + + + + + + + + + +
Additional information
GroupsNew company web site development, HR Management
+
+ + Edit Account + +
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+

Recent Activities

+ +
+
+
+
    +
  • +
    +
    + 2 minutes ago +
    +

    + + Steven + + has completed his account. +

    +
    +
  • +
  • +
    +
    + 12:30 +
    +

    + Staff Meeting +

    +
    +
  • +
  • +
    +
    + 11:11 +
    +

    + Completed new layout. +

    +
    +
  • +
  • +
    +
    + Thu, 12 Jun +
    +

    + Contacted + + Microsoft + + for license upgrades. +

    +
    +
  • +
  • +
    +
    + Tue, 10 Jun +
    +

    + Started development new site +

    +
    +
  • +
  • +
    +
    + Sun, 11 Apr +
    +

    + Lunch with + + Nicole + + . +

    +
    +
  • +
  • +
    +
    + Wed, 25 Mar +
    +

    + server Maintenance. +

    +
    +
  • +
  • +
    +
    + Fri, 20 Mar +
    +

    + New User Registration + + more details + + . +

    +
    +
  • +
+
+
+
+
+
+

Recent Tweets

+
+
+
    +
  • +

    + + @Shakespeare + + Some are born great, some achieve greatness, and some have greatness thrust upon them. +

    + 2 minuts ago +
  • +
+
+
+
+
+
+ + + +
+
+ + Account Info + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ +
+ + + + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+
+
+ + + +
+
+
+ + +
+
+ + +
+
+
+
+
+
+
+ + Additional Info + +
+
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Project NameClientProj Comp%CompPriority
IT Help DeskMaster Company11 november 2014 +
+
+ 70% Complete (danger) +
+
Critical
PM New Product DevBrand Company12 june 2014 +
+
+ 40% Complete +
+
High
ClipTheme Web SiteInternal11 november 2014 +
+
+ 90% Complete +
+
Normal
Local AdUI Fab15 april 2014 +
+
+ 50% Complete +
+
Normal
Design new themeInternal2 october 2014 +
+
+ 20% Complete (warning) +
+
Critical
IT Help DeskDesigner TM6 december 2014 +
+
+ 40% Complete (warning) +
+
High
+
+ +
+ +
+
+
+
+ diff --git a/assets/views/partials/footer.html b/assets/views/partials/footer.html new file mode 100644 index 0000000..7c70b34 --- /dev/null +++ b/assets/views/partials/footer.html @@ -0,0 +1,10 @@ + +
+
+ © {{app.year}} {{ app.author }}. All rights reserved +
+
+ +
+
+ \ No newline at end of file diff --git a/assets/views/partials/main-content.html b/assets/views/partials/main-content.html new file mode 100644 index 0000000..aad2c7e --- /dev/null +++ b/assets/views/partials/main-content.html @@ -0,0 +1,3 @@ + +
+ \ No newline at end of file diff --git a/assets/views/partials/nav.html b/assets/views/partials/nav.html new file mode 100644 index 0000000..4b61522 --- /dev/null +++ b/assets/views/partials/nav.html @@ -0,0 +1,924 @@ + + + + +
    +
  • + +
    +
    + +
    +
    + Dashboard +
    +
    +
    +
  • + +
  • + +
    +
    + +
    +
    + SETTINGS +
    +
    +
    +
      +
    • + + DEFAULT STUDENT ACTIVITY + +
    • +
    • + + ACTIVITY DETAILS + +
    • + + +
    • + + STATUS DETAILS + +
    • +
    • + + UNIVERSITY DETAILS + +
    • +
    • + + BATCH DETAILS + +
    • + +
    • + + COURSE DETAILS + +
    • +
    • + + BRANCH DETAILS + +
    • +
    • + + EMPLOYEE DETAILS + +
    • +
    • + + CERTIFICATETYPE + +
    • +
    • + + DAY BOOK DETAILS + +
    • +
    • + + CENTER DETAILS + +
    • +
    • + + SUBJECT DETAILS + +
    • +
    • + + SESSION DETAILS + +
    • +
    • + + SESSION SCHEDULE + +
    • + + + +
    +
  • + + + +
  • + +
    +
    + +
    +
    + ANNOUNCEMENT DETAILS +
    +
    +
    +
  • + + + +
  • + +
    +
    + +
    +
    + STUDENT +
    +
    +
    +
      +
    • + + STUDENT DETAILS + +
    • + +
    • + + Status Update + +
        +
      • + + Study Material + +
      • +
      • + + Fess + +
      • +
      • + + Answer Booklet + +
      • +
      • + + Certification + +
      • +
      • + + Application + +
      • +
      +
    • +
    +
  • + +
  • + +
    +
    + +
    +
    + CAll TRACKING +
    +
    +
    +
      + + + +
    • + + ADD/VIEW DETAILS + +
    • +
    • + + LEAD DETAILS + +
    • +
    • + + CLOSE DETAILS + +
    • +
    • + + PENDING DETAILS + +
    • + + + +
    +
  • + +
  • + +
    +
    + +
    +
    + DAY BOOK +
    +
    +
    +
      +
    • + + DAY BOOK + +
    • +
    • + + DAY BOOK + +
    • +
    +
  • +
  • + +
    +
    + +
    +
    + BROADCAST +
    +
    +
    + +
      +
    • + + SEND SMS + +
    • +
    • + + SEND SMS + +
    • +
    + +
  • + + +
  • + +
    +
    + +
    +
    + HALLTICKET +
    +
    +
    + +
      +
    • + + COURSE SEMESTER MAPPING + +
    • +
    • + + BATCH SCHEDULE + +
    • +
    • + + GENERATE HALLTICKET + +
    • +
    + +
  • +
  • + +
    +
    + +
    +
    + REPORTS +
    +
    +
    +
      +
    • + + Study Material Status + +
    • +
    • + + Mark Card Status + +
    • +
    • + + Certificate Status + +
    • +
    • + + Markcard and Certificate Status + +
    • +
    • + + Expense Report + +
    • + + +
    +
  • +
  • + +
    +
    + +
    +
    + MY PROFILE +
    +
    +
    + +
  • +
+ + + + + +
    +
  • + +
    +
    + +
    +
    + Dashboard +
    +
    +
    +
  • +
  • + +
    +
    + +
    +
    + SETTINGS +
    +
    +
    +
      +
    • + + DEFAULT STUDENT ACTIVITY + +
    • +
    • + + ACTIVITY DETAILS + +
    • +
    • + + STATUS DETAILS + +
    • +
    • + + UNIVERSITY DETAILS + +
    • +
    • + + BATCH DETAILS + +
    • +
    • + + COURSE DETAILS + +
    • + + + +
    • + + EMPLOYEE DETAILS + +
    • + + + +
    • + + CERTIFICATETYPE + +
    • +
    • + + DAY BOOK DETAILS + +
    • + +
    • + + CENTER DETAILS + +
    • +
    • + + SUBJECT DETAILS + +
    • +
    • + + SESSION DETAILS + +
    • +
    • + + SESSION SCHEDULE + +
    • + +
    +
  • +
  • + +
    +
    + +
    +
    + STUDENT +
    +
    +
    +
      +
    • + + STUDENT DETAILS + +
    • +
    • + + Status Update + +
        +
      • + + Study Material + +
      • +
      • + + Fess + +
      • +
      • + + Answer Booklet + +
      • +
      • + + Certification + +
      • +
      • + + Application + +
      • +
      + +
    • +
    +
  • +
  • + +
    +
    + +
    +
    + ANNOUNCEMENT DETAILS +
    +
    +
    +
  • +
  • + +
    +
    + +
    +
    + CAll TRACKING +
    +
    +
    +
      + + + +
    • + + ADD/VIEW DETAILS + +
    • +
    • + + LEAD DETAILS + +
    • +
    • + + CLOSE DETAILS + +
    • +
    • + + PENDING DETAILS + +
    • + + + +
    +
  • + + + + + + + + +
  • + +
    +
    + +
    +
    + DAY BOOK +
    +
    +
    +
      +
    • + + DAY BOOK + +
    • +
    • + + DAY BOOK + +
    • +
    +
  • + +
  • + +
    +
    + +
    +
    + HALLTICKET +
    +
    +
    + +
      +
    • + + COURSE SEMESTER MAPPING + +
    • +
    • + + BATCH SCHEDULE + +
    • +
    • + + GENERATE HALLTICKET + +
    • +
    + +
  • +
  • + +
    +
    + +
    +
    + MY PROFILE +
    +
    +
    + +
  • +
+ + + + + +
    +
  • + +
    +
    + +
    +
    + Dashboard +
    +
    +
    +
  • +
  • + +
    +
    + +
    +
    + STUDENT +
    +
    +
    +
      +
    • + + STUDENT DETAILS + +
    • +
    • + + Status Update + +
        +
      • + + Study Material + +
      • +
      • + + Fess + +
      • +
      • + + Answer Booklet + +
      • +
      • + + Certification + +
      • +
      • + + Application + +
      • +
      + +
    • +
    +
  • +
  • + +
    +
    + +
    +
    + CALL TRACKING +
    +
    +
    + +
  • + + +
  • + +
    +
    + +
    +
    + DAY BOOK +
    +
    +
    +
      +
    • + + DAY BOOK + +
    • +
    • + + DAY BOOK + +
    • +
    +
  • + +
  • + +
    +
    + +
    +
    + HALLTICKET +
    +
    +
    + +
      +
    • + + COURSE SEMESTER MAPPING + +
    • +
    • + + BATCH SCHEDULE + +
    • +
    • + + GENERATE HALLTICKET + +
    • +
    + +
  • + +
  • + +
    +
    + +
    +
    + MY PROFILE +
    +
    +
    + +
  • +
+
    +
  • + +
    +
    + +
    +
    + My View +
    +
    +
    +
  • + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/assets/views/partials/off-sidebar.html b/assets/views/partials/off-sidebar.html new file mode 100644 index 0000000..a51572d --- /dev/null +++ b/assets/views/partials/off-sidebar.html @@ -0,0 +1,257 @@ + + + + + + + + +
+
+
+
On-line
+
    +
  • + + + ... +
    +

    Nicole Bell

    + Content Designer +
    +
    +
  • +
  • + +
    + 3 +
    + + ... +
    +

    Steven Thompson

    + Visual Designer +
    +
    +
  • +
  • + + + ... +
    +

    Ella Patterson

    + Web Editor +
    +
    +
  • +
  • + + + ... +
    +

    Kenneth Ross

    + Senior Designer +
    +
    +
  • +
+
Off-line
+
    +
  • + + ... +
    +

    Nicole Bell

    + Content Designer +
    +
    +
  • +
  • + +
    + 3 +
    + ... +
    +

    Steven Thompson

    + Visual Designer +
    +
    +
  • +
  • + + ... +
    +

    Ella Patterson

    + Web Editor +
    +
    +
  • +
  • + + ... +
    +

    Kenneth Ross

    + Senior Designer +
    +
    +
  • +
  • + + ... +
    +

    Ella Patterson

    + Web Editor +
    +
    +
  • +
  • + + ... +
    +

    Kenneth Ross

    + Senior Designer +
    +
    +
  • +
+
+
+
+
+ Back +
+ + +
+
+ + +
+
+
+ + + + + + +
+
+
+
Favorites
+
    +
  • + + ... +
    +

    Nicole Bell

    + Content Designer +
    +
    +
  • +
  • + +
    + 3 +
    + ... +
    +

    Steven Thompson

    + Visual Designer +
    +
    +
  • +
  • + + ... +
    +

    Ella Patterson

    + Web Editor +
    +
    +
  • +
  • + + ... +
    +

    Kenneth Ross

    + Senior Designer +
    +
    +
  • +
  • + + ... +
    +

    Ella Patterson

    + Web Editor +
    +
    +
  • +
  • + + ... +
    +

    Kenneth Ross

    + Senior Designer +
    +
    +
  • +
+
+
+
+
+ + + + + + +
+
+
General Settings
+
    +
  • +
    + + Enable Notifications +
    +
  • +
  • +
    + + Show your E-mail +
    +
  • +
  • +
    + + Show Offline Users +
    +
  • +
  • +
    + + E-mail Alerts +
    +
  • +
  • +
    + + SMS Alerts +
    +
  • +
+
+ +
+
+
+
+ +
+ diff --git a/assets/views/partials/settings.html b/assets/views/partials/settings.html new file mode 100644 index 0000000..6a13574 --- /dev/null +++ b/assets/views/partials/settings.html @@ -0,0 +1,110 @@ + + +
+ Style Selector +
+
+ +
+ Fixed header + + + +
+ + +
+ Fixed sidebar + + + +
+ + +
+ Closed sidebar + + + +
+ + +
+ Fixed footer + + + +
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+ +
+ diff --git a/assets/views/partials/sidebar.html b/assets/views/partials/sidebar.html new file mode 100644 index 0000000..377b562 --- /dev/null +++ b/assets/views/partials/sidebar.html @@ -0,0 +1,3 @@ + +
+ diff --git a/assets/views/partials/top-navbar.html b/assets/views/partials/top-navbar.html new file mode 100644 index 0000000..71d99ee --- /dev/null +++ b/assets/views/partials/top-navbar.html @@ -0,0 +1,219 @@ + + +
+ + + + + + {{app.name}} + + + {{app.name}} + + + + + + Toggle navigation + + +
+ + +
+
    + + + + + + + + + + +
  • + + {{ getCurrentBran.BranchName }} + +
      +
    • + + {{branch.BranchName}} - {{branch.ListName}} + + +
    • +
    +
  • + + + + +
  • + +
    +
    + img +
    + +
    +
    +
  • + + + + +
  • + + + img + img + {{ loginUser.fName}} + +
      + + +
    • + + Change Password + +
    • +
    • + + Log Out + +
    • +
    +
  • + +
+ + + +
+ + + \ No newline at end of file diff --git a/assets/views/report_certificate_status.html b/assets/views/report_certificate_status.html new file mode 100644 index 0000000..8a867a5 --- /dev/null +++ b/assets/views/report_certificate_status.html @@ -0,0 +1,148 @@ +
+
+
+

Certificate Status Report

+
+ +
+
+ + +
+
+
+
+
+
+ +
+
+ + + +
+
+ + + +
+
+ + + +
+ + +
+
+ + + +
+
+ +
+ + +
+
+
+ +
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SL.NoDocument Fee Paid DateStudent IDStudent NameFather NameCourseSem/YearPhone NoUniversityBalance FeeCertificates NameCertificates StatusDate
{{p.sl}}{{p.bdate}}{{p.ssid}}{{p.name}}{{p.father}}{{p.course}}{{p.syear}}({{p.sem}}){{p.phone}}{{p.univ}}{{p.balance}}{{p.cert_name}}{{p.status}}{{p.cdate}}
+

{{cert_message}}

+ +
+ + + +
+
\ No newline at end of file diff --git a/assets/views/report_expense.html b/assets/views/report_expense.html new file mode 100644 index 0000000..6c9b530 --- /dev/null +++ b/assets/views/report_expense.html @@ -0,0 +1,118 @@ +
+
+
+

Expense Report

+
+ +
+
+ + +
+
+
+
+
+
+ + +
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+ + +
+
+ + + +
+
+
+ + + +
+
+
+ +
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
SL.NoDescriptionTotal Amount
{{$index + 1}}{{p.exp_name}}{{p.amount}}
+

{{expense_message}}

+ +
+ + + +
+
\ No newline at end of file diff --git a/assets/views/report_mark_certificate_status.html b/assets/views/report_mark_certificate_status.html new file mode 100644 index 0000000..505f68c --- /dev/null +++ b/assets/views/report_mark_certificate_status.html @@ -0,0 +1,184 @@ +
+
+
+

Markcard/Certificate Issued Status Report

+
+ +
+
+ + +
+
+
+
+
+
+ +
+
+ + + +
+
+ + + +
+
+ + + +
+
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+ + +
+
+ + + +
+
+
+ + + +
+
+
+ +
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SL.NoDocument Fee Paid DateStudent IDStudent NameFather NameCourseSem/YearPhone NoUniversityBalance FeeMarkcard StatusDateMarkcard Issued CommentsCertificates NameCertificates StatusDateCertificate Issued Comments
{{p.sl}}{{p.bdate}}{{p.ssid}}{{p.name}}{{p.father}}{{p.course}}{{p.syear}}({{p.sem}}){{p.phone}}{{p.univ}}{{p.balance}}{{p.status}}{{p.cdate}}{{p.cmts}}{{p.cert_name}}{{p.status}}{{p.cdate}}{{p.cmts}}
+

{{markcert_message}}

+ +
+ + + +
+
\ No newline at end of file diff --git a/assets/views/report_markcardstatus.html b/assets/views/report_markcardstatus.html new file mode 100644 index 0000000..1e5399a --- /dev/null +++ b/assets/views/report_markcardstatus.html @@ -0,0 +1,146 @@ +
+
+
+

Mark Card Status Report

+
+ +
+
+ + +
+
+
+
+
+
+ +
+
+ + + +
+
+ + + +
+
+ + + +
+ + +
+
+ + + +
+
+ +
+ + +
+
+
+ +
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SL.NoIntial Payment Paid DateStudent IDStudent NameFather NameCourseSem/YearPhone NoUniversityBalance FeeMark Card StatusDate
{{p.sl}}{{p.bdate}}{{p.ssid}}{{p.name}}{{p.father}}{{p.course}}{{p.syear}}({{p.sem}}){{p.phone}}{{p.univ}}{{p.balance}}{{p.status}}{{p.cdate}}
+

{{mmessage}}

+ +
+ + + +
+
\ No newline at end of file diff --git a/assets/views/report_studymaterialstatus.html b/assets/views/report_studymaterialstatus.html new file mode 100644 index 0000000..114c16e --- /dev/null +++ b/assets/views/report_studymaterialstatus.html @@ -0,0 +1,146 @@ +
+
+
+

Study Material Status Report

+
+ +
+
+ + +
+
+
+
+
+
+ +
+
+ + + +
+
+ + + +
+
+ + + +
+ + +
+
+ + + +
+
+ +
+ + +
+
+
+ +
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SL.NoIntial Payment Paid DateStudent IDStudent NameFather NameCourseSem/YearPhone NoUniversityBalance FeeStudy Material StatusDate
{{p.sl}}{{p.bdate}}{{p.ssid}}{{p.name}}{{p.father}}{{p.course}}{{p.syear}}({{p.sem}}){{p.phone}}{{p.univ}}{{p.balance}}{{p.status}}{{p.date}}
+

{{message}}

+ +
+ + + +
+
\ No newline at end of file diff --git a/assets/views/sendSMS/listingViewOfSMSSendDetails.html b/assets/views/sendSMS/listingViewOfSMSSendDetails.html new file mode 100644 index 0000000..900c544 --- /dev/null +++ b/assets/views/sendSMS/listingViewOfSMSSendDetails.html @@ -0,0 +1,40 @@ +
+
+
+

Fetching ...

+
+
+
+ + + + + + + + + + + + + + + + + +
Message IdMobile NumberDelivery StatusDelivery On
{{s.MsgId}}{{s.MobileNumber}}{{s.DeliveredStatus}}{{s.DeliveredOn}}
+ +
+
+

No + Status Details Exist ...

+
+
+ +
+
+
+
\ No newline at end of file diff --git a/assets/views/sendSMS/sendSMSDetailssuperadmin.html b/assets/views/sendSMS/sendSMSDetailssuperadmin.html new file mode 100644 index 0000000..47da904 --- /dev/null +++ b/assets/views/sendSMS/sendSMSDetailssuperadmin.html @@ -0,0 +1,158 @@ + +
+
+
+

{{ mainTitle }}

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

loading...

+
+ +
+ + +
+
+

No + records found...

+
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
Message + Message Count + Sent On +
{{p.MsgBody}}{{p.MSG_SEND_CNT}}{{p.CreatedOn}} + +
+ + +
+
+

Fetching ...

+
+
+
+ + + + + + + + + + + + + +
Message IdMobile NumberDelivered StatusDelivered On
{{s.MsgId}}{{s.MobileNumber}}{{s.DeliveredStatus}}{{s.DeliveredOn}}
+ + +
+
+

No + Status Details Exist ...

+
+
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+ +
+
\ No newline at end of file diff --git a/assets/views/sendSMS/sendSMSsuperadmin.html b/assets/views/sendSMS/sendSMSsuperadmin.html new file mode 100644 index 0000000..bcc8cdc --- /dev/null +++ b/assets/views/sendSMS/sendSMSsuperadmin.html @@ -0,0 +1,253 @@ + +
+
+
+

{{ mainTitle }}

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

fetching...

+
+ +
+ +
+
+

No + records found...

+
+ +
+
+

No + records found...

+
+ +
+ +
+
+
+ + + +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + First Name + + Last Name + + MobileNumber + + Email ID + + Course + +
+ + {{p.Firstname}}{{p.Lastname}}{{p.MobileNumber}}{{p.EmailID}}{{p.CourseName}}
+ + +
+
+ +
+ +
+
+
+
+
+
+ +
+
+ + SMS Details + + + +
+
+
+ + + + Student comments is required + + +
+
+ + + Staff comments is required + + +
+ +
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Sem/YearCourseBatchSession From/Session ToSessionRoll NumberCourse FeesSTF/WROthersPayable FeesReferral/WaiverPaidBalance
{{p.FeesName}}{{p.CourseName}}{{p.BatchName}}{{p.SessionName}}/{{p.ToSessionName}}{{p.SessionName}}{{p.RollNo}}{{p.CourseFees}}{{p.STFOrWR}}{{p.Others}}{{p.PayableAmount}}{{p.StudentWaiverRefAmount}}{{p.StudentPaidAmount}}{{p.BalanceAmount}} + + + +
+ + +
+
+
+ + + +
+
+
+
+ + + + + +
+
+
+ + +
+
+ +
+
+ + \ No newline at end of file diff --git a/assets/views/status.html b/assets/views/status.html new file mode 100644 index 0000000..4071152 --- /dev/null +++ b/assets/views/status.html @@ -0,0 +1,116 @@ + +
+
+
+

+ + Manage various status for the entire application. + +
+
+
+
+
+
+ + +
+
+ Add Status Details +
+
+
+
+ + + Status name is required + Invalid Status name +
+
+
+ +
+
+
+
+
+
+
+
+
+ +

+
+
+ + + + + + + + + + + + + + + + + + + + +
Status ID + + Status Name + + Status
{{p.ListCode}}{{p.ListName}} Active In-Active + + +
+ + +
+ +
+
+
\ No newline at end of file diff --git a/assets/views/student/editStudentCourseDetails.html b/assets/views/student/editStudentCourseDetails.html new file mode 100644 index 0000000..94925da --- /dev/null +++ b/assets/views/student/editStudentCourseDetails.html @@ -0,0 +1,352 @@ +
+
+ +
+ +

Fetching ...

+
+
+ +
+ + Course Details + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
University + Course + Specilization 1 + Specilization 2 + Date of Joining + +
{{s.UniversityName}}{{s.CourseName}}({{s.CourseCode}}){{s.Specilization1}}{{s.Specilization2}}{{s.DOJ}}
+
+
+
+ + +
+
+
+
+ + + +
+
+
+
+ + + University is required +
+ + +
+ + +
+ + + + {{$select.selected.CourseName}} + + +
+ +
+
+ Course is required +
+ +
+
+ + +
+
+ + + + Invalid Specilization 1 +
+
+ + + + Invalid Specilization 2 +
+ +
+ + + Enrollment ID is required +
+ +
+
+
+ + + + Date of Joining is required +
+ +
+ +
+ +
+
+ +
+
+
+ + + Max 100 Characters. + De-Active Comments is required +
+ + +
+ + + +
+
+
+ + +
+
+
+
+
+ + + + + +
+ +
+
+
+ + + + University is Required +
+ +
+ + + +
+ + + + {{$select.selected.CourseName}} + + +
+ +
+
+ Course is required +
+
+ + +
+ +
+
+ + + Invalid Specilization 1 +
+
+ + + Invalid Specilization 2 +
+
+ + + Enrollment ID is required +
+
+
+ + +
+ + + + + Date of Joining is required +
+
+
+
+
+ + +
+
+
+
+ +
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/student/editStudentDetails.html b/assets/views/student/editStudentDetails.html new file mode 100644 index 0000000..491b41e --- /dev/null +++ b/assets/views/student/editStudentDetails.html @@ -0,0 +1,627 @@ + + + +
+
+
+
+ +
+ + Personal Details + +
+
+
+ +
+
+
+ + + +
+
+ +
+
+
+ +
+ +
+ +
+
+
+
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ + + Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + First Name is required + Invalid First Name +
+
+ + + Last Name is required + Invalid Last Name +
+
+
+
+ + + Father Name is required + Invalid Father Name +
+
+ + + + Mother Name is required + Invalid Mother Name +
+
+ + + Email is required. + Please, enter a valid email address. +
+
+
+
+ + + Alternate Mobile Number is required. + Enter a Valid Phone Number +
+
+
+ + + Date of Birth is required. + Enter a Valid Date of Birth +
+
+
+ +
+ + + + + Gender is required. + +
+
+
+
+
+ + + Permanent Address is required +
+
+ + + Current Address is required +
+
+ + + Aadhar Number is required. + Enter a Valid Aadhar Number +
+
+
+
+
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+
+
+ + + + Invalid Caste Name +
+
+ + + + Invalid Category Name +
+
+ +
+
+ + + + Invalid Religion Name +
+
+ + + + Invalid Nationality Name +
+
+ + + Enter a Valid Qualification +
+
+
+ +
+ + + + Invalid Occupation +
+
+ + + + Invalid Designation +
+
+ + + Invalid Company +
+
+
+
+ + + Invalid Referred By +
+
+ + + Refer's Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + Max 100 Characters. + +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ ACTIVE +
+ IN-ACTIVE +
+
+
+
+
+ +
+
+ +
+
+
+
+
+ + + Max 100 Characters. + De-Active Comments is required +
+
+
+
+ +
+ +
+
+ +
+ +
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+ +
+ + + +
+
+ + Add Document Details + +
+
+
+
+ + + Document Name is required. +
+
+ + + + + +
+
+ +
+ + +
+
+
+
+
+
Loading...
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + +
Document NameDetailsDownload/Delete
{{doc.DocumentName}}{{doc.DocumentStorePath}} + + + +
+
+ No document details found ** +
+
+
+
+
+ +
+ + Pending Document Details + +
+
+
+
+ + + Permanent Address is required +
+
+ + + Current Address is required +
+
+ + + Aadhar Number is required. + Enter a Valid Aadhar Number +
+
+ + + +
+ +
+
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+
+
+ + + + Invalid Caste Name +
+
+ + + + Invalid Category Name +
+
+
+ +
+ + + + Invalid Religion Name +
+
+ + + + Invalid Nationality Name +
+
+ + + + Enter a Valid Qualification +
+
+
+ +
+ + + + Invalid Occupation +
+
+ + + + Invalid Designation +
+
+ + + + Invalid Company +
+
+
+
+ + + + Invalid Referred By +
+
+ + + Refer's Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + Max 100 Characters. + +
+
+
+
+ + +
+
+ +
+
+ +
+
+ +
+
+
+
+ + + Max 100 Characters. + De-Active Comments is required +
+
+ + +
+
+ + Course Details + +
+
+ + + + University is Required +
+ + + +
+ +
+ + + + {{$select.selected.CourseName}} + + +
+ +
+
+ Course is required +
+ +
+ + + + +
+
+
+ +
+ + + + Invalid Specilization 1 +
+
+ + + + Invalid Specilization 2 +
+
+ +
+ + + Enrollment ID is required +
+
+ +
+ + +
+ + + + + Date of Joining is required +
+
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+
+ +
+
+

Fetching ...

+
+
+
+ +
+
+
+
+ + Personal Details + +
+
+
+ +
+
+
+ + +
+ +
+ +
+ +
+
+
+ + + Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + First Name is required + Invalid First Name +
+
+ + + Last Name is required + Invalid Last Name +
+
+
+
+ + + Father Name is required + Invalid Father Name +
+
+ + + + Mother Name is required + Invalid Mother Name +
+
+ + + Email is required. + Please, enter a valid email address. +
+
+
+
+ + + Alternate Mobile Number is required. + Enter a Valid Phone Number +
+ +
+
+ + + + + Date of Birth is required. + Enter a Valid Date of Birth +
+
+
+ + + +
+
+
+
+ + + Permanent Address is required +
+
+ + + Current Address is required +
+
+ + + Aadhar Number is required. + Enter a Valid Aadhar Number +
+
+
+ +
+
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+
+
+ + + + Invalid Caste Name +
+
+ + + + Invalid Category Name +
+
+ +
+ +
+ + + + Invalid Religion Name +
+
+ + + + Invalid Nationality Name +
+
+ + + + Enter a Valid Qualification +
+
+
+ +
+ + + + Invalid Occupation +
+
+ + + + Invalid Designation +
+
+ + + Invalid Company +
+
+
+
+ + + Invalid Referred By +
+
+ + + Refer's Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + Max 100 Characters. + +
+
+
+
+ +
+ + +
+
+ + +
+
+
+ + + Max 100 Characters. + De-Active Comments is required +
+ +
+ + + +
+ +
+ + Course Details + +
+ + + + + + + + + + + + + + + + + + + + + + + +
University + Course + Session + Date of Joining + Status + Enrolled Branch +
{{s.UniversityName}}{{s.CourseName}}{{s.SessionName}}{{s.DOJ}}Active + In-Active{{s.BranchName}}
+
+
+ +
+
+
+ +
+
+
+ + Add New Cource + + +
+
+
+ + + + University is Required +
+ + +
+ +
+ + + + {{$select.selected.CourseName}} + + +
+ +
+
+ Course is required +
+ +
+
+ +
+
+ +
+ + + + Invalid Specilization 1 +
+
+ + + + Invalid Specilization 2 +
+
+
+ + + Enrollment ID is required +
+
+
+ + +
+ + + + + Date of Joining is required +
+
+
+
+
+ + +
+
+
+
+
+
+
+ + + +
+
+
+
+
+ + +
+ + \ No newline at end of file diff --git a/assets/views/student/student_details_SuperAdmin.html b/assets/views/student/student_details_SuperAdmin.html new file mode 100644 index 0000000..5a1543c --- /dev/null +++ b/assets/views/student/student_details_SuperAdmin.html @@ -0,0 +1,1349 @@ + +
+
+
+

{{ mainTitle }}

+ Add/Edit Student Details. +
+
+
+
+ + +
+ + + + +
+
+
+
+
+ + + + +
+ + Loading... +
+
+
+
+ +
+ + + + +
+
+ + + + +
+
+ +
+ + + +

+ +
+
+ + + +
+ + +
+ + + +
+ +
+ + + + +
+ + +
+
+
+ + Loading... +
+
+

No + records found...

+
+
+ +
+
+
+
+ Total Count: {{ studentListLength }} +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MobileNumber + + Student Name + + Father Name + + Status + + Comments + + Details +
+ + {{p.MobileNumber}} + + + + + {{p.Firstname}} {{p.Lastname}} + + + {{p.Fathername}}ACTIVE + DEACTIVE
{{p.Comments}}
+ + + + +
+ + + +
+ +
+
+
+
+ + + + + + +
+ +
+
+
+
+ + Personal Details + +
+
+
+
+ +
+
+
+
+
+
Profile Picture
+
+
+
+ + + + + +
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ + + Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + First Name is required + Invalid First Name +
+
+ + + Last Name is required + Invalid Last Name +
+
+
+
+ + + Father Name is required + Invalid Father Name +
+
+ + + + Mother Name is required + Invalid Mother Name +
+
+ + + Email is required. + Please, enter a valid email address. +
+
+
+
+ + + Alternate Mobile Number is required. + Enter a Valid Phone Number +
+ +
+
+ + + + + Date of Birth is required. + Enter a Valid Date of Birth +
+
+
+ +
+ + + + + Gender is required. + +
+
+ +
+
+
+ + + Permanent Address is required +
+
+ + + Current Address is required +
+
+ + + Aadhar Number is required. + Enter a Valid Aadhar Number +
+
+ + + +
+ +
+
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+
+
+ + + + Invalid Caste Name +
+
+ + + + Invalid Category Name +
+
+
+ +
+ + + + Invalid Religion Name +
+
+ + + + Invalid Nationality Name +
+
+ + + + Enter a Valid Qualification +
+
+
+ +
+ + + + Invalid Occupation +
+
+ + + + Invalid Designation +
+
+ + + + Invalid Company +
+
+
+
+ + + + Invalid Referred By +
+
+ + + Refer's Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + Max 100 Characters. + +
+
+
+
+ + +
+
+ +
+
+ +
+
+ +
+
+
+
+ + + Max 100 Characters. + De-Active Comments is required +
+
+ + +
+
+ + Course Details + +
+
+ + + + University is Required +
+ + + +
+ +
+ + + + {{$select.selected.CourseName}} + + +
+ +
+
+ Course is required +
+ +
+ + +
+
+
+ +
+ + + + Invalid Specilization 1 +
+
+ + + + Invalid Specilization 2 +
+
+ +
+ + + Enrollment ID is required +
+
+
+ + +
+ + + + + Date of Joining is required +
+
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+ +
+ +
+
+

Fetching ...

+
+
+
+ +
+
+
+
+ + Personal Details + +
+
+
+ +
+
+
+ + +
+ +
+ +
+ +
+
+
+ + + Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + First Name is required + Invalid First Name +
+
+ + + Last Name is required + Invalid Last Name +
+
+
+
+ + + Father Name is required + Invalid Father Name +
+
+ + + + Mother Name is required + Invalid Mother Name +
+
+ + + Email is required. + Please, enter a valid email address. +
+
+
+
+ + + Alternate Mobile Number is required. + Enter a Valid Phone Number +
+ +
+
+ + + + + Date of Birth is required. + Enter a Valid Date of Birth +
+
+
+ + + +
+
+
+
+ + + Permanent Address is required +
+
+ + + Current Address is required +
+
+ + + Aadhar Number is required. + Enter a Valid Aadhar Number +
+
+
+ +
+
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+ + + Aadhar Number is required. + Enter a Valid Details +
+
+
+
+ + + + Invalid Caste Name +
+
+ + + + Invalid Category Name +
+
+ +
+ +
+ + + + Invalid Religion Name +
+
+ + + + Invalid Nationality Name +
+
+ + + + Enter a Valid Qualification +
+
+
+ +
+ + + + Invalid Occupation +
+
+ + + + Invalid Designation +
+
+ + + Invalid Company +
+
+
+
+ + + Invalid Referred By +
+
+ + + Refer's Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + Max 100 Characters. + +
+
+
+
+ +
+ + +
+
+ + +
+
+
+ + + Max 100 Characters. + De-Active Comments is required +
+ +
+ + + +
+ +
+ + Course Details + +
+ + + + + + + + + + + + + + + + + + + + + + + +
University + Course + Session + Date of Joining + Status + Enrolled Branch +
{{s.UniversityName}}{{s.CourseName}}{{s.SessionName}}{{s.DOJ}}Active + In-Active{{s.BranchName}}
+
+
+ +
+
+
+ +
+
+
+ + Add New Cource + + +
+
+
+ + + + University is Required +
+ + + +
+ +
+ + + + {{$select.selected.CourseName}} + + +
+ +
+
+ Course is required +
+ +
+ +
+ +
+
+ +
+ + + + Invalid Specilization 1 +
+
+ + + + Invalid Specilization 2 +
+
+ +
+ + + Enrollment ID is required +
+
+
+ + +
+ + + + + Date of Joining is required +
+
+
+
+
+ + +
+
+
+
+
+
+
+ + + +
+
+
+
+
+ + + + +
+
+ + + \ No newline at end of file diff --git a/assets/views/studentStatusUpdate.html b/assets/views/studentStatusUpdate.html new file mode 100644 index 0000000..9d6dddf --- /dev/null +++ b/assets/views/studentStatusUpdate.html @@ -0,0 +1,77 @@ + +
+
+
+

+ + Manage statuses for each activity. + +
+
+
+
+
+
+
+ +
+ +

+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
Activity ID + + Activity Name + + +
{{p.ActivityID}}{{p.ActivityName}} + + + +
+
+ + +
+ \ No newline at end of file diff --git a/assets/views/subjectMaster.html b/assets/views/subjectMaster.html new file mode 100644 index 0000000..991cffe --- /dev/null +++ b/assets/views/subjectMaster.html @@ -0,0 +1,217 @@ + + +
+
+
+

+ +
+
+
+
+ + +
+
+ + +
+
+
+ +
Please Wait...
+
+
+ +
+

oops! No + records found...

+
+
+
+ +
+ +

+
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Subject Code + + Subject Name + + Status
{{p.SubjectCode}}{{p.SubjectName}} Active De-Active + + + +
+ + +
+
+ + +
+
+
+ + + +
+ + + +
+
+
+ +
+ + Subject + +
+
+ + + + Subject code is required + Enter a valid subject code + +
+
+ + + + Subject name is required + Invalid subject name +
+
+ +
+
+ + +
+
+ + +
+ + +
+ + +
+
+ +
+ +
+ + +
+
+
+ + + + +
+
+
+
+ +
+
+
+
+ + + +
+ + diff --git a/assets/views/table_basic.html b/assets/views/table_basic.html new file mode 100644 index 0000000..15c4e85 --- /dev/null +++ b/assets/views/table_basic.html @@ -0,0 +1,763 @@ + +
+
+
+

{{ mainTitle }}

+ Refers to data arranged in rows and columns. A spreadsheet, for example, is a table. In relational database management systems, all information is stored in the form of tables. Webopedia - Online Tech Dictionary for IT Professionals +
+
+
+
+ + +
+
+
+
Basic Table
+

+ For basic styling—light padding and only horizontal dividers—add the base class .table to any <table>. It may seem super redundant, but given the widespread use of tables for other plugins like calendars and date pickers, we've opted to isolate our custom table styles. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#BrowserCreatorSoftware licenseCurrent layout engine
1Google ChromeGoogle + + Terms of Service + Blink +
+ + + +
+
+
+ +
    +
  • + + Edit + +
  • +
  • + + Share + +
  • +
  • + + Remove + +
  • +
+
+
2Internet ExplorerMicrosoft, Spyglass + + Proprietary + Trident +
+ + + +
+
+
+ +
    +
  • + + Edit + +
  • +
  • + + Share + +
  • +
  • + + Remove + +
  • +
+
+
3Mozilla FirefoxMozilla Foundation + + MPR + Gecko +
+ + + +
+
+
+ +
    +
  • + + Edit + +
  • +
  • + + Share + +
  • +
  • + + Remove + +
  • +
+
+
4SafariApple Inc. + + Proprietary + WebKit +
+ + + +
+
+
+ +
    +
  • + + Edit + +
  • +
  • + + Share + +
  • +
  • + + Remove + +
  • +
+
+
5OperaOpera Software + + Proprietary + Presto +
+ + + +
+
+
+ +
    +
  • + + Edit + +
  • +
  • + + Share + +
  • +
  • + + Remove + +
  • +
+
+
+
+
+
+ + +
+
+
+
Striped rows
+

+ Use .table-striped to add zebra-striping to any table row within the <tbody>. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PhotoFull NameRoleEmailPhone
imagePeter ClarkUI Designer + + peter@example.com + (641)-734-4763 +
+ + + +
+
+
+ +
    +
  • + + Edit + +
  • +
  • + + Share + +
  • +
  • + + Remove + +
  • +
+
+
imageNicole BellContent Designer + + nicole@example.com + (741)-034-4573 +
+ + + +
+
+
+ +
    +
  • + + Edit + +
  • +
  • + + Share + +
  • +
  • + + Remove + +
  • +
+
+
imageSteven ThompsonVisual Designer + + steven@example.com + (471)-543-4073 +
+ + + +
+
+
+ +
    +
  • + + Edit + +
  • +
  • + + Share + +
  • +
  • + + Remove + +
  • +
+
+
imageElla PattersonWeb Editor + + ella@example.com + (799)-994-9999 +
+ + + +
+
+
+ +
    +
  • + + Edit + +
  • +
  • + + Share + +
  • +
  • + + Remove + +
  • +
+
+
imageKenneth RossSenior Designer + + kenneth@example.com + (111)-114-1173 +
+ + + +
+
+
+ +
    +
  • + + Edit + +
  • +
  • + + Share + +
  • +
  • + + Remove + +
  • +
+
+
+
+
+
+ + +
+
+
+
Condensed table
+

+ Add .table-condensed to make tables more compact by cutting cell padding in half. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Clicks Update Status
+ + alpha.com + 3,330Feb 13Expiring
+ + beta.com + 3,330Jen 15Active
+ + gamma.com + 3,330Mar 09Expired
+ + delta.com + 3,330Feb 10Flagged
+ + epsilon.com + 3,330Feb 18Active
+ + zeta.com + 3,330Feb 13Expiring
+ + eta.com + 3,330Jen 15Active
+ + theta.com + 3,330Mar 09Expired
+ + iota.com + 3,330Feb 10Flagged
+ + kappa.com + 3,330Feb 18Active
+
+
+
Bordered table
+

+ Add .table-bordered for borders on all sides of the table and cells. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DomainClicks Update Status
+ + alpha.com + 3,330Feb 13Expiring
+ + beta.com + 3,330Jen 15Active
+ + gamma.com + 3,330Mar 09Expired
+ + delta.com + 3,330Feb 10Flagged
+ + epsilon.com + 3,330Feb 18Active
+ + zeta.com + 3,330Feb 13Expiring
+ + eta.com + 3,330Jen 15Active
+ + theta.com + 3,330Mar 09Expired
+ + iota.com + 3,330Feb 10Flagged
+ + kappa.com + 3,330Feb 18Active
+
+
+
+ + +
+
+
+
Contextual classes
+

+ Use contextual classes to color table rows or individual cells. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#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
+
+
+
+ \ No newline at end of file diff --git a/assets/views/table_data.html b/assets/views/table_data.html new file mode 100644 index 0000000..8d3594a --- /dev/null +++ b/assets/views/table_data.html @@ -0,0 +1,226 @@ + +
+
+
+

{{ mainTitle }}

+ This directive allow to liven your tables. It support sorting, filtering and pagination. Header row with titles and filters automatic generated on compilation step. +
+
+
+
+ + +
+
+
+
Simple table with pagination
+ +
+

+ Page: {{tableParams.page()}} +

+

+ Count per page: {{tableParams.count()}} +

+ + + + + + + +
{{user.name}}{{user.alias}}{{user.publisher}}{{user.gender}}
+
+
+
+
+ + +
+
+
+
Pagination template
+ +
+

+ Page: {{tableParams.page()}} +

+

+ Count per page: {{tableParams.count()}} +

+ + + + + + + +
{{user.name}}{{user.alias}}{{user.publisher}}{{user.gender}}
+ +
+
+
+
+ + +
+
+
+
Table with sorting
+ +
+
+
+ +
+
+ Sorting: {{tableParams.sorting()|json}} + + + + + + + +
{{user.name}}{{user.alias}}{{user.publisher}}{{user.gender}}
+
+
+
+
+ + +
+
+
+
Table with filters
+ +
+ Filter: {{tableParams.filter()|json}} + + + + + + + +
{{user.name}} {{user.alias}}{{user.publisher}}{{user.gender}}
+
+
+
+
+ + +
+
+
+
Cell Template
+
+
+ +
+
+
+ +
+
+ + + + + + +
{{user.name}} {{user.alias}} {{user.power}}
+
+
+
+
+
+
Row Template
+
+
+ +
+
+
+ +
+
+ + + + + + +
{{user.name}} {{user.alias}} {{user.power}}
+
+
+
+
+
+
+ + +
+
+
+
Inline edit example
+ +
+
+
+ +
+
+ Sorting: {{tableParams.sorting()|json}} +
+ + + + + + + + + + + + + + + +
{{p.id}}{{p.fn}}{{p.ln}}{{p.dc}}{{p.em}}{{p.ph}} +
+ +
+
+
+
+
+
+ diff --git a/assets/views/table_export.html b/assets/views/table_export.html new file mode 100644 index 0000000..45c2fb1 --- /dev/null +++ b/assets/views/table_export.html @@ -0,0 +1,338 @@ +
+
+ +
+
+

Export Basic Table

+
+
+ + + +
    +
  • + Collapse +
  • +
  • + + Refresh + +
  • +
  • + + Configurations + +
  • +
  • + + Fullscreen + +
  • +
+
+ + + +
+
+
+

+ Export HTML Table to JSON, XML, PNG, CSV, TXT, SQL, MS-Word, Ms-Excel, Ms-Powerpoint and PDF. You can easily set the font size, separator, export type, margin and etc.. +

+
+
+
+ +
    +
  • + + Save as PDF + +
  • +
  • + + Save as PNG + +
  • +
  • + + Save as CSV + +
  • +
  • + + Save as TXT + +
  • +
  • + + Save as XML + +
  • +
  • + + Save as SQL + +
  • +
  • + + Save as JSON + +
  • +
  • + + Export to Excel + +
  • +
  • + + Export to Word + +
  • +
  • + + Export to PowerPoint + +
  • +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CountryPopulationDate%ge
Chinna1,363,480,000March 24, 201419.1
India1,241,900,000March 24, 201417.4
United States317,746,000March 24, 20144.44
Indonesia249,866,000July 1, 20133.49
Brazil201,032,714July 1, 20132.81
+
+
+
+ +
+
+
+
+ +
+
+

Export Data Table

+
+
+ + + +
    +
  • + Collapse +
  • +
  • + + Refresh + +
  • +
  • + + Configurations + +
  • +
  • + + Fullscreen + +
  • +
+
+ + + +
+
+
+
+
+ +
+ +
    +
  • + + Save as PDF + +
  • +
  • + + Save as PNG + +
  • +
  • + + Save as CSV + +
  • +
  • + + Save as TXT + +
  • +
  • + + Save as XML + +
  • +
  • + + Save as SQL + +
  • +
  • + + Save as JSON + +
  • +
  • + + Export to Excel + +
  • +
  • + + Export to Word + +
  • +
  • + + Export to PowerPoint + +
  • +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Full NameRolePhoneEditDelete
Peter ClarkUI Designer(641)-734-4763 + + Edit + + + Delete +
Nicole BellContent Designer(741)-034-4573 + + Edit + + + Delete +
Steven ThompsonVisual Designer(471)-543-4073 + + Edit + + + Delete +
Ella PattersonWeb Editor(799)-994-9999 + + Edit + + + Delete +
Kenneth RossSenior Designer(111)-114-1173 + + Edit + + + Delete +
+
+
+
+ +
+
\ No newline at end of file diff --git a/assets/views/table_responsive.html b/assets/views/table_responsive.html new file mode 100644 index 0000000..5a9818b --- /dev/null +++ b/assets/views/table_responsive.html @@ -0,0 +1,141 @@ + +
+
+
+

{{ mainTitle }}

+ Make tables scroll horizontally on small devices +
+
+
+
+ + +
+
+
+
Responsive Table
+

+ Create responsive tables by wrapping any .table in .table-responsive to make them scroll horizontally on small devices (under 768px). When viewing on anything larger than 768px wide, you will not see any difference in these tables. +

+
+ Please try to re-size your browser window in order to see the tables in responsive mode. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DomainPriceClicks Update Status
+ + alpha.com + $453,330February 13Expiring
+ + beta.com + $703,330January 15Registered
+ + gamma.com + $253,330March 09Expired
+ + delta.com + $503,330February 10Flagged
+ + epsilon.com + $353,330February 18Registered
+ + zeta.com + $453,330February 13Expiring
+ + eta.com + $703,330January 15Registered
+ + theta.com + $253,330March 09Expired
+ + iota.com + $503,330February 10Flagged
+ + kappa.com + $353,330February 18Registered
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/trackinglist.html b/assets/views/trackinglist.html new file mode 100644 index 0000000..a842749 --- /dev/null +++ b/assets/views/trackinglist.html @@ -0,0 +1,25 @@ + +
+
+
+
Table with filters
+ +
+ Filter: {{tableParams.filter()|json}} + + + + + + +
NameMobile Email Id
saravana12345 sssfrrr@gmn.co
Sathish54321 defrg@fdrrf.co
Mohan36789 dcfdre@ddfsf.in
+
+
+
+
+ diff --git a/assets/views/ui_animations.html b/assets/views/ui_animations.html new file mode 100644 index 0000000..bbde650 --- /dev/null +++ b/assets/views/ui_animations.html @@ -0,0 +1,143 @@ +
+
+

{{ currTitle }}

+
+
+
+
+
+
+

Animation

+
+
+ + + +
    +
  • + Collapse +
  • +
  • + + Refresh + +
  • +
  • + + Configurations + +
  • +
  • + + Fullscreen + +
  • +
+
+
+
+
+

+ animate.css + is a bunch of cool, fun, and cross-browser animations for you to use in your projects. Great for emphasis, home pages, sliders, and general just-add-water-awesomeness. +

+
+

Animate.css

+
+
+

+ + +

+
+
+
+
+
\ No newline at end of file diff --git a/assets/views/ui_buttons.html b/assets/views/ui_buttons.html new file mode 100644 index 0000000..abd3a71 --- /dev/null +++ b/assets/views/ui_buttons.html @@ -0,0 +1,1057 @@ + +
+
+
+

{{ mainTitle }}

+ Button design is usually a subtle element to a web design, but it can have a significant impact on the overall look and usability of the site. +
+
+
+
+ + +
+
+
+
Default Buttons
+

+ Use the button classes on an <a>, <button>, or <input> element. +

+ + + + + + + + + + + + +
+
+
Outlined Buttons
+

+ Use the .btn-o class for outlined buttons. +

+ + + + + + +
+
+
+ + +
+
+
+
Colorful Buttons
+

+ Use any of the available button classes to quickly create a styled button. +

+

+ Using color to add meaning to a button only provides a visual indication, which will not be conveyed to users of assistive technologies – such as screen readers. Ensure that information denoted by the color is either obvious from the content itself (the visible text of the button), or is included through alternative means, such as additional text hidden with the .sr-only class. +

+
+
+
Azure Button
+

+ Add class .btn-azure, .btn-light-azure or .btn-dark-azure to your button. +

+ + + +
+
+
Blue Button
+

+ Add class .btn-blue, .btn-light-blue or .btn-dark-blue to your button. +

+ + + +
+
+
Purple Button
+

+ Add class .btn-purple, .btn-light-purple or .btn-dark-purple to your button. +

+ + + +
+
+
Red Button
+

+ Add class .btn-red, .btn-light-red or .btn-dark-red to your button. +

+ + + +
+
+
Orange Button
+

+ Add class .btn-orange, .btn-light-orange or .btn-dark-orange to your button. +

+ + + +
+
+
Yellow Button
+

+ Add class .btn-yellow, .btn-light-yellow or .btn-dark-yellow to your button. +

+ + + +
+
+
Green Button
+

+ Add class .btn-green, .btn-light-green or .btn-dark-green to your button. +

+ + + +
+
+
Beige Button
+

+ Add class .btn-beige, .btn-light-beige or .btn-dark-beige to your button. +

+ + + +
+
+
Grey Button
+

+ Add class .btn-grey, .btn-light-grey or .btn-dark-grey to your button. +

+ + + +
+
+
+
+
+ + +
+
+
+
Options
+

+ You can change the style and the state of the buttons using minimal markup. +

+
+
+
+
+
+ Square Buttons +
+
+
+

+ Do you like the square buttons? Add .btn-squared + to change its shape. +

+ + + + +
+
+
+
+
+
+
+ Sizes +
+
+
+

+ Fancy larger or smaller buttons? Add .btn-lg + , .btn-sm + , or .btn-xs + for additional sizes. +

+

+ +

+

+ +

+

+ +

+

+ +

+
+
+
+
+
+
+
+ Disabled State +
+
+
+

+ Add the disabled + attribute to <button> + buttons. +

+ + + + +
+
+
+
+
+
+
+ Active State +
+
+
+

+ if you need to force the :active appearance, add .active. +

+ + + + +
+
+
+
+
+
+
+ Block level buttons +
+
+
+

+ Create block level buttons—those that span the full width of a parent— by adding .btn-block + . +

+

+ +

+

+

+ + Tools + + + Help + + + Contact + +
+

+
+
+
+
+
+
+
+ + +
+
+
+
Button Groups
+

+ Group a series of buttons together on a single line with the button group. +

+
+
+
+
+
+ Basic example +
+
+
+

+ Wrap a series of buttons with .btn + in .btn-group + . +

+
+
+ + Tools + + + Settings + + + Help + + + Contact + +
+
+
+
+
+
+
+
+
+ Button toolbar +
+
+
+

+ Combine sets of <div class="btn-group"> into a <div class="btn-toolbar"> for more complex components. +

+
+
+
+ + + + +
+
+ + + +
+
+ +
+
+
+
+
+
+
+
+
+
+ Vertical variation +
+
+
+

+ Make a set of buttons appear vertically stacked rather than horizontally +

+
+
+ + Tools + + + Settings + + + Help + + + Contact + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
Dropdown Buttons
+

+ Dropdown is a simple directive which will toggle a dropdown menu on click or programmatically. + You can either use is-open to toggle or add inside a <a dropdown-toggle> element to toggle it when is clicked. + There is also the on-toggle(open) optional expression fired when dropdown changes state. +

+ +
+ + +

+ + Click me for a dropdown, yo! + +

+
    +
  • + + {{choice}} + +
  • +
+ +
+ +
    +
  • + + Action + +
  • +
  • + + Another action + +
  • +
  • + + Something else here + +
  • +
  • +
  • + + Separated link + +
  • +
+
+ +
+ + +
    +
  • + + Action + +
  • +
  • + + Another action + +
  • +
  • + + Something else here + +
  • +
  • +
  • + + Separated link + +
  • +
+
+
+

+ + +

+
+
+
+
+ + +
+
+
+
Buttons with loading indicator
+

+ An angular directive wrapper for Ladda, a UI concept which merges loading indicators into the action that invoked them. Click the buttons to see the effect. +

+
+ +
+
+
Expand
+

+ + expand-left + + + expand-right + + + expand-up + + + expand-down + +

+
Zoom
+

+ + contract + + + zoom-in + + + zoom-out + +

+
Slide
+

+ + slide-left + + + slide-right + + + slide-up + + + slide-down + +

+
+
+
Built-in progress bar
+

+ + expand-right + + + contract + +

+
Sizes
+

+ + 10 + + + 20 + + + 30 + +

+
Colors
+

+ + red + + + gray + + + black + +

+
+
+
+
+
+
+ + +
+
+
+
Buttons with icons
+

+ A lightweight, extensible directive for add small overlays of content, like those on the iPad, to any element for housing secondary information.. +

+
+
+
+
+
+ Font Awesome +
+
+
+

+ Examples to use buttons with font awesome icons. +

+

+ + + + +

+

+ Buttons with both text and font awesome icon. +

+

+ Delete Item + Add Item + + Listen + + Submit Entry +

+

+ Toolbar made with font awesome icons. +

+
+
+ + + + + + +
+
+
+
+
+
+
+
+
+ Glyphicons +
+
+
+

+ Examples to use buttons with glyphicon icons. +

+

+ + + + +

+

+ Buttons with both text and glyphicon icon. +

+

+ Delete Item + Add Item + + Listen + + Submit Entry +

+

+ Toolbar made with glyphicon icons. +

+
+
+ + + + + + +
+
+
+
+
+
+
+
+
+ Themify Icons +
+
+
+

+ Examples to use buttons with themify icons. +

+

+ + + + +

+

+ Buttons with both text and themify icon. +

+

+ Delete Item + Add Item + + Listen + + Submit Entry +

+

+ Toolbar made with themify icons. +

+
+
+ + + + + + +
+
+
+
+
+
+
+
+
+
+
+ Animated Buttons +
+
+
+

+ Modern and subtle styles & effects for buttons +

+ + + + +
+
+
+
+
+
+
+
+
+ Social List +
+
+
+
+
    +
  • + + Twitter + +
  • +
  • + + Dribbble + +
  • +
  • + + Facebook + +
  • +
  • + + Google+ + +
  • +
  • + + LinkedIn + +
  • +
  • + + YouTube + +
  • +
  • + + RSS + +
  • +
  • + + Behance + +
  • +
  • + + Dropbox + +
  • +
  • + + Github + +
  • +
  • + + Spotify + +
  • +
  • + + Stumbleupon + +
  • +
  • + + Skype + +
  • +
  • + + Tumblr + +
  • +
  • + + Spotify + +
  • +
  • + + Vimeo + +
  • +
  • + + Wordpress + +
  • +
  • + + Xing + +
  • +
  • + + Yahoo + +
  • +
  • + + VK + +
  • +
  • + + Instagram + +
  • +
  • + + Reddit + +
  • +
  • + + Flickr + +
  • +
  • + + Foursquare + +
  • +
+
+
+
+
+
+
+
+
+ diff --git a/assets/views/ui_elements.html b/assets/views/ui_elements.html new file mode 100644 index 0000000..5cacde8 --- /dev/null +++ b/assets/views/ui_elements.html @@ -0,0 +1,1008 @@ + +
+
+
+

{{ mainTitle }}

+ Over a dozen reusable components built to provide popovers, media objects, navigation, tooltips and much more. +
+
+
+
+ + +
+
+
+
List Group
+

+ List groups are a flexible and powerful component for displaying not only simple lists of elements, but complex ones with custom content. +

+
+
+
+
+
+ Basic example with Badges +
+
+
+

+ The most basic list group is simply an unordered list with list items, and the proper classes. Add the badges component to any list group item and it will automatically be positioned on the right. +

+
    +
  • + 14 + Cras justo odio +
  • +
  • + 2 + Dapibus ac facilisis in +
  • +
  • + 1 + Morbi leo risus +
  • +
+
+
+
+
+
+
+
+ Linked items +
+
+
+

+ Linkify list group items by using anchor tags instead of list items (that also means a parent <div> instead of an <ul>). No need for individual parents around each element. +

+
+ + Cras justo odio + + + Dapibus ac facilisis in + + + Porta ac consectetur ac + +
+
+
+
+
+
+
+
+ Contextual classes +
+
+
+

+ Use contextual classes to style list items, default or linked. Also includes .active state. +

+
+ + Dapibus ac facilisis in + + + Cras sit amet nibh libero + + + Porta ac consectetur ac + + + Vestibulum at eros + +
+
+
+
+
+
+
+
+ Custom content +
+
+
+

+ Add nearly any HTML within, even for linked list groups like the one below. +

+
+ +
List group item heading
+

+ Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit. +

+
+ +
List group item heading
+

+ Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit. +

+
+ +
List group item heading
+

+ Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit. +

+
+
+
+
+
+
+
+
+
+ + +
+
+
+
Tooltips
+

+ A lightweight, extensible directive for fancy tooltip creation. The tooltip directive supports multiple placements, optional transition animation, and more. +

+ +
+
+
+
+
+
+ Static Tooltip +
+
+
+

+ Four options are available: top, right, bottom, and left aligned. +

+
+
+
+
+ Tooltip on the left +
+
+
+
+
+ Tooltip on the top +
+
+
+
+
+ Tooltip on the bottom +
+
+
+
+
+ Tooltip on the right +
+
+
+
+
+
+
+
+
+
+ Dynamic Tooltip +
+
+
+ + + {{dynamicTooltipText}} + +
+ + +
+
+ + +
+
+
+
+
+
+
+

+ Hover over the links below to see tooltips: +

+

+ Pellentesque + + {{dynamicTooltipText}} + + , + sit amet venenatis urna cursus eget nunc scelerisque viverra mauris, in + aliquam. Tincidunt lobortis feugiat vivamus at + + left + + eget + arcu dictum varius duis at consectetur lorem. Vitae elementum curabitur + + right + + nunc sed velit dignissim sodales ut eu sem integer vitae. Turpis egestas + + bottom + + pharetra convallis posuere morbi leo urna, + + fading + + at elementum eu, facilisis sed odio morbi quis commodo odio. In cursus + + delayed + + turpis massa tincidunt dui ut. +

+

+ I can even contain HTML. + + Check me out! + +

+
+
+
+
+
+
+
+
+ + +
+
+
+
Popovers
+

+ A lightweight, extensible directive for add small overlays of content, like those on the iPad, to any element for housing secondary information.. +

+ +
+
+
+
+
+
+ Static Popover +
+
+
+

+ Four options are available: top, right, bottom, and left aligned. +

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

Popover {{popoverType}}

+
+

+ Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. +

+
+
+
+
+
+
+
+
+
+
+
+ Dynamic Popover +
+
+
+ + +
+ + +
+
+ + +
+
+
+
+
+
+ Others +
+
+
+

+ The popover directives provides several optional attributes to control how it will display +

+

+ + +

+
+
+
+
+
+
+
+
+ + +
+
+
+
Progress Bars
+

+ Provide up-to-date feedback on the progress of a workflow or action with simple yet flexible progress bars. +

+
+ Progress bars use CSS3 gradients, transitions, and animations to achieve all their effects. These features are not supported in IE7-9 or older versions of Firefox. Versions earlier than Internet Explorer 10 and Opera 12 do not support animations. +
+ +
+
+
+
+
+
+ Static Progress Bars +
+
+
+

+ Progress bars use some of the same button and alert classes for consistent styles. +

+
+
+

+

Basic
+

+ + + + + +
+
+

+

Striped
+

+ + + + + +
+
+

+

Animated
+

+ + + + + +
+
+

+

Sizes
+

+ + + +
+
+

+

With label
+

+ + 22% + + + 166 / 200 + +
+
+
+
+
+
+
+
+
+ Dynamic Progress Bars +
+
+
+

+ A progress bar directive that is focused on providing feedback on the progress of a workflow or action. + It supports multiple (stacked) bars into the same <progress> element or a single <progressbar> element with optional max attribute and transition animations. +

+
+
+

+

Dynamic
+

+ +

+ max value +

+ + {{dynamic}} / {{max}} + +

+ No animation +

+ + {{dynamic}}% + +

+ Object (changes type based on value) +

+ + {{type}} ! Watch out! + +
+
+

+

Stacked
+

+ +

+ Place multiple bars into the same .progress to stack them. +

+ + + {{bar.value}}% + + +
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
Pagination
+

+ Provide pagination links for your site or app with the multi-page pagination component, or the simpler pager alternative. + Simple pagination, great for apps and search results. The large block is hard to miss, easily scalable, and provides large click areas. +

+
+
+
+
+
+ Default Pagination +
+
+
+

+ Simple pagination, great for apps and search results. The large block is hard to miss, easily scalable, and provides large click areas. +

+
+
    +
  • + + + +
  • +
  • + + 1 + +
  • +
  • + + 2 + +
  • +
  • + + 3 + +
  • +
  • + + 4 + +
  • +
  • + + + +
  • +
+
+

+ Fancy larger or smaller pagination? Add .pagination-lg or .pagination-sm for additional sizes. +

+
+
    +
  • + + + +
  • +
  • + + 1 + +
  • +
  • + + 2 + +
  • +
  • + + 3 + +
  • +
  • + + + +
  • +
+
+
+
    +
  • + + + +
  • +
  • + + 1 + +
  • +
  • + + 2 + +
  • +
  • + + 3 + +
  • +
  • + + 4 + +
  • +
  • + + + +
  • +
+
+
+
+
+
+
+
+
+ Colorful +
+
+
+

+ Use any of the available button classes to quickly create a styled pagination. +

+
+
    +
  • + +
  • +
  • + + 1 + +
  • +
  • + + 2 + +
  • +
  • + + 3 + +
  • +
  • + + 4 + +
  • +
  • + +
  • +
+
+
+
    +
  • + +
  • +
  • + + 1 + +
  • +
  • + + 2 + +
  • +
  • + + 3 + +
  • +
  • + + 4 + +
  • +
  • + +
  • +
+
+
+
    +
  • + +
  • +
  • + + 1 + +
  • +
  • + + 2 + +
  • +
  • + + 3 + +
  • +
  • + + 4 + +
  • +
  • + +
  • +
+
+
+
+
+
+ +
+
+
+
+
+
+ Dynamic Pagination +
+
+
+

+ A lightweight pagination directive that is focused on ... providing pagination & will take care of visualising a pagination bar and enable / disable buttons correctly! +

+
+
+

+

Default
+

+
+ +
+
+ +
+
+ +
+
+ +
+
+ The selected page no: {{currentPage}} +
+ +
+
+

+

Pager
+

+ +

+

Limit the maximum visible buttons
+

+
+ +
+
+ +
+
+ Page: {{bigCurrentPage}} / {{numPages}} +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
Labels and Badges
+

+ Using Twitter Bootstrap, you may create inline labels, i.e. Label and annotate text and badges, i.e. indicators and unread counts. +

+
+
+
+
+
+ Available labels +
+
+
+

+ Add any of the below mentioned modifier classes to change the appearance of a label. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelsClass
Default label label-default
Success label label-success
Warning label label-warning;
Danger label label-danger
Info label label-info
Inverse label label-inverse
+
+
+
+
+
+
+
+ Available badges +
+
+
+

+ Easily highlight new or unread items by adding a <span class="badge"> to links, Bootstrap navs, and more. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameExampleClass
Default 1 badge badge-default
Success 2 badge badge-success
Warning 4 badge badge-warning
Danger 6 badge badge-danger
Info 8 badge badge-info
Inverse 10 badge badge-inverse
+
+
+
+
+
+
+
+ + +
+
+
+
Rating
+

+ Rating directive that will take care of visualising a star rating bar. +

+ +
+
+
+
+
+
+ Default +
+
+
+

+ Four options are available: top, right, bottom, and left aligned. +

+
+ +
+ {{percent}}% +
+ Rate: {{rate}} - Readonly is: {{isReadonly}} - Hovering over: {{overStar || "none"}} +
+ + +
+
+
+
+
+
+
+ Custom icons +
+
+
+

+ Four options are available: top, right, bottom, and left aligned. +

+
+ + (Rate: {{x}}) +
+
+ + (Love: {{h}}) +
+
+
+
+
+
+
+
+
+ diff --git a/assets/views/ui_icons.html b/assets/views/ui_icons.html new file mode 100644 index 0000000..9bf2446 --- /dev/null +++ b/assets/views/ui_icons.html @@ -0,0 +1,31 @@ + +
+
+
+

{{ mainTitle }}

+ Font Awesome gives you scalable vector icons that can instantly be customized — size, color, drop shadow, and anything that can be done with the power of CSS. + +
+
+
+
+ + + +
+
+
+
+
+
{{sections.title}}
+
+
+ {{item}} +
+
+
+
+
+
+
+ diff --git a/assets/views/ui_line_icons.html b/assets/views/ui_line_icons.html new file mode 100644 index 0000000..1688c7c --- /dev/null +++ b/assets/views/ui_line_icons.html @@ -0,0 +1,31 @@ + +
+
+
+

{{ mainTitle }}

+ Themify Icons is a complete set of icons for use in web design and apps, consisting of 320+ pixel-perfect, hand-crafted icons that draw inspiration from Apple iOS 7 + +
+
+
+
+ + + +
+
+
+
+
+
{{sections.title}}
+
+
+ {{item}} +
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/ui_links.html b/assets/views/ui_links.html new file mode 100644 index 0000000..c160c3f --- /dev/null +++ b/assets/views/ui_links.html @@ -0,0 +1,571 @@ + +
+
+
+

{{ mainTitle }}

+ Subtle and modern effects for links or menu items +
+
+
+
+ + +
+
+
+
Brackets
+

+ Enclose your link inside the class .cl-effect-1 +

+
+
+ + Wafture + + + Sumptuous + + + Scintilla + + + Propinquity + + + Harbinger + +
+
+
+
+
+ + +
+
+
+
3D rolling links
+

+ Enclose your link inside the class .cl-effect-2 +

+
+
+ Ratatouille + Lassitude + Murmurous + Palimpsest + Assemblage +
+
+
+
+
+ + +
+
+
+
Bottom line slides/fades in
+

+ Enclose your link inside the class .cl-effect-3 +

+
+
+ + Palimpsest + + + Ineffable + + + Lilt + + + Mellifluous + + + Serendipity + +
+
+
+
+
+ + +
+
+
+
Bottom border enlarge
+

+ Enclose your link inside the class .cl-effect-4 +

+
+
+ + Woebegone + + + Lassitude + + + Murmurous + + + Palimpsest + + + Assemblage + +
+
+
+
+
+ + +
+
+
+
Same word slide in
+

+ Enclose your link inside the class .cl-effect-5 +

+
+
+ Seraglio + Sumptuous + Scintilla + Palimpsest + Assemblage +
+
+
+
+
+ + +
+
+
+
Same word slide in and border bottom
+

+ Enclose your link inside the class .cl-effect-6 +

+
+
+ + Umbrella + + + Ineffable + + + Lilt + + + Mellifluous + + + Serendipity + +
+
+
+
+
+ + +
+
+
+
Second border slides up
+

+ Enclose your link inside the class .cl-effect-7 +

+
+
+ + Languor + + + Lassitude + + + Murmurous + + + Palimpsest + + + Assemblage + +
+
+
+
+
+ + +
+
+
+
Border slight translate
+

+ Enclose your link inside the class .cl-effect-8 +

+
+
+ + Imbue + + + Sumptuous + + + Scintilla + + + Propinquity + + + Harbinger + +
+
+
+
+
+ + +
+
+
+
Second text and borders
+

+ Enclose your link inside the class .cl-effect-9 +

+
+
+ GossamerSumptuous Heart + IneffableEvanescent Life + ChatoyantAssemblage Love + MellifluousMellifluous Will + SerendipitySerendipity Cut +
+
+
+
+
+ + +
+
+
+
Reveal, push out
+

+ Enclose your link inside the class .cl-effect-10 +

+
+
+ Seraglio + Sumptuous + Scintilla + Palimpsest + Assemblage +
+
+
+
+
+ + +
+
+
+
Text fill
+

+ Enclose your link inside the class .cl-effect-11 +

+
+
+ + Desultory + + + Sumptuous + + + Scintilla + + + Propinquity + + + Harbinger + +
+
+
+
+
+ + +
+
+
+
Circle
+

+ Enclose your link inside the class .cl-effect-12 +

+
+
+ + Chatoyant + + + Ineffable + + + Efficiency + + + Mellifluous + + + Serendipity + +
+
+
+
+
+ + +
+
+
+
Three circles
+

+ Enclose your link inside the class .cl-effect-13 +

+
+
+ + Beleaguer + + + Lassitude + + + Murmurous + + + Palimpsest + + + Assemblage + +
+
+
+
+
+ + +
+
+
+
Border switch
+

+ Enclose your link inside the class .cl-effect-14 +

+
+
+ + Ailurophile + + + Sumptuous + + + Scintilla + + + Propinquity + + + Harbinger + +
+
+
+
+
+ + +
+
+
+
Scale down, reveal
+

+ Enclose your link inside the class .cl-effect-15 +

+
+
+ + Desultory + + + Sumptuous + + + Scintilla + + + Propinquity + + + Harbinger + +
+
+
+
+
+ + +
+
+
+
Fall down
+

+ Enclose your link inside the class .cl-effect-16 +

+
+
+ + Languor + + + Murmurous + + + Lassitude + + + Chatoyant + + + Palimpsest + +
+
+
+
+
+ + +
+
+
+
Move up fade out, push border
+

+ Enclose your link inside the class .cl-effect-17 +

+
+
+ + Languor + + + Murmurous + + + Lassitude + + + Chatoyant + + + Palimpsest + +
+
+
+
+
+ + +
+
+
+
Cross
+

+ Enclose your link inside the class .cl-effect-18 +

+
+
+ + Desultory + + + Sumptuous + + + Scintilla + + + Propinquity + + + Harbinger + +
+
+
+
+
+ + +
+
+
+
3D side
+

+ Enclose your link inside the class .cl-effect-19 +

+
+
+ Ratatouille + Lassitude + Murmurous + Palimpsest + Assemblage +
+
+
+
+
+ + +
+
+
+
3D side
+

+ Enclose your link inside the class .cl-effect-20 +

+
+
+ Beleaguer + Scintilla + Chatoyant + Palimpsest + Languor +
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/ui_media.html b/assets/views/ui_media.html new file mode 100644 index 0000000..188e1e4 --- /dev/null +++ b/assets/views/ui_media.html @@ -0,0 +1,354 @@ + +
+
+
+

{{ mainTitle }}

+ Images, thumbnails and media object. +
+
+
+
+ + +
+
+
+
Media Object
+

+ Abstract object styles for building various types of components (like blog comments, Tweets, etc) that feature a left- or right-aligned image alongside textual content. +

+
+
+
+
+
+ Default media +
+
+
+

+ The default media displays a media object (images, video, audio) to the left or right of a content block. +

+
    +
  • + + + +
    +

    Media heading

    +

    + Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. +

    + +
    + + + +
    +

    Nested media heading

    + Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. + +
    + + + +
    +

    Nested media heading

    + Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. +
    +
    +
    +
    + +
    + + + +
    +

    Nested media heading

    + Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. +
    +
    +
    +
  • +
  • + + + +
    +

    Media heading

    + Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. +
    +
  • +
  • + + + +
    +

    Media heading

    + Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. +
    + + + +
  • +
+
+
+
+
+
+
+
+ Media alignment +
+
+
+

+ The images or other media can be aligned top, middle, or bottom. The default is top aligned. +

+
+ + + +
+

Top aligned media

+

+ Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus. +

+

+ Donec sed odio dui. Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. +

+
+
+
+ + + +
+

Middle aligned media

+

+ Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus. +

+

+ Donec sed odio dui. Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. +

+
+
+
+ + + +
+

Bottom aligned media

+

+ Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus. +

+

+ Donec sed odio dui. Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. +

+
+
+
+
+
+
+
+
+
+ + +
+
+
+
Images & Thumbnails
+

+ Extend Bootstrap's grid system with the thumbnail component to easily display grids of images, videos, text, and more. +

+
+
+
+
+
+ Default example +
+
+
+

+ By default, Bootstrap's thumbnails are designed to showcase linked images with minimal required markup. +

+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+
+
+
+
+
+
+
+ Custom Content +
+
+
+

+ With a bit of extra markup, it's possible to add any kind of HTML content like headings, paragraphs, or buttons into thumbnails. +

+
+
+
+ +
+

Thumbnail label

+

+ Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit. +

+

+ + Button + + + Button + +

+
+
+
+
+
+ +
+

Thumbnail label

+

+ Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit. +

+

+ + Button + + + Button + +

+
+
+
+
+
+ +
+

Thumbnail label

+

+ Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit. +

+

+ + Button + + + Button + +

+
+
+
+
+
+ +
+

Thumbnail label

+

+ Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit. +

+

+ + Button + + + Button + +

+
+
+
+
+
+
+
+
+
+
+
+ Image shapes +
+
+
+

+ Add classes to an <img> + element to easily style images in any project. +

+
+
+
+
+ A generic image with rounded corners +
+
+
+ <img src="..." alt="..." class="img-rounded"> +
+
+
+
+
+
+
+ A generic image where only the portion within the circle circumscribed about said square is visible +
+
+
+ <img src="..." alt="..." class="img-circle"> +
+
+
+
+
+
+
+ A generic image with a white border around it, making it resemble a photograph taken with an old instant camera +
+
+
+ <img src="..." alt="..." class="img-thumbnail"> +
+
+
+
+
+
+
+
+
+
+
+
+ diff --git a/assets/views/ui_modals.html b/assets/views/ui_modals.html new file mode 100644 index 0000000..a8143d5 --- /dev/null +++ b/assets/views/ui_modals.html @@ -0,0 +1,196 @@ + +
+
+
+

{{ mainTitle }}

+ A modal window is any type of window that is a child (secondary window) to a parent window and usurps the parent's control. Webopedia - Online Tech Dictionary for IT Professionals +
+
+
+
+ + +
+ +
+
+
+
UI Bootstrap Modals
+

+ $modal is a service to quickly create AngularJS-powered modal windows. Creating custom modals is straightforward: create a partial view, its controller and reference them when using the service. +

+ +
+
+
+
+
+ Default Modal +
+
+
+

+ Toggle a modal by clicking the button below. It will slide down and fade in from the top of the page. +

+ +
+
+
+
+
+
+
+ Large Modal +
+
+
+

+ Modals have a large optional size, available by setting option size: 'lg' in the method open(options) +

+ +
+
+
+
+
+
+
+ Small Modal +
+
+
+

+ Modals have a small optional size, available by setting option size: 'sm' in the method open(options) +

+ +
+
+
+
+
+ Selection from a modal: {{ selected }} +
+
+
+
+
+ + +
+ +
+
+
+
Angular Aside
+

+ Off canvas side menu to use with ui-bootstrap. Extends ui-bootstrap's $modal provider. +

+ +
+
+
+
+
+ Up Aside +
+
+
+

+ This modal slide down from the top of the page. +

+ +
+
+
+
+
+
+
+ Left Aside +
+
+
+

+ This modal slides from the left side of the page. +

+ +
+
+
+
+
+
+
+ Down Aside +
+
+
+

+ This modal slide up from the bottom of the page. +

+ +
+
+
+
+
+
+
+ Right Aside +
+
+
+

+ This modal slides from the right side of the page +

+ +
+
+
+
+
+
+
+
+ diff --git a/assets/views/ui_nestable.html b/assets/views/ui_nestable.html new file mode 100644 index 0000000..b730f60 --- /dev/null +++ b/assets/views/ui_nestable.html @@ -0,0 +1,33 @@ + +
+
+
+

{{ mainTitle }}

+ Drag & drop hierarchical list with mouse and touch compatibility +
+
+
+
+ + +
+
+ +
+
+
+
+ {{$item.text}} +
+
+
+
Data binding
+
+ {{mdl | json}} +
+
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/ui_notifications.html b/assets/views/ui_notifications.html new file mode 100644 index 0000000..f6da14e --- /dev/null +++ b/assets/views/ui_notifications.html @@ -0,0 +1,369 @@ + +
+
+
+

{{ mainTitle }}

+ A small box that appears on the display screen to give you information or to warn you about a potentially damaging operation. Webopedia - Online Tech Dictionary for IT Professionals +
+
+
+
+ + +
+ +
+
+
+
ngSweetAlert
+

+ AngularJS wrapper for SweetAlert. Sweet Alert is a beautiful replacement for Javascript's "Alert". +

+
+
+
+
+
+ Basic message +
+
+
+

+ Show a basic message to give information to the user or to warn about a potentially damaging operation. +

+ +
+
+
+
+
+
+
+ Title with a text under +
+
+
+

+ Not enough basic message? Show more information to the user by entering a text below the title +

+ +
+
+
+
+
+
+
+ Success message +
+
+
+

+ Shows the user a message to warn him that a certain operation is successful. +

+ +
+
+
+
+
+
+
+ Warning message +
+
+
+

+ Shows the user a warning message, with a function attached to the "Confirm" button. +

+ +
+
+
+
+
+
+
+ Another warning message +
+
+
+

+ By passing a parameter to warning message, you can execute something else for "Cancel". +

+ +
+
+
+
+
+
+
+ Custom icon +
+
+
+

+ If desired, you can make more effective the message by adding a custom icon +

+ +
+
+
+
+
+
+
+
+ + +
+
+
+
Toaster notifications for Angular
+

+ AngularJS Toaster is an AngularJS port of the toastr non-blocking notification jQuery library. +

+ +
+
+
+
+ + +
+
+ + +
+
+
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+
+
+ + +
+
+
+
Inline Alerts and Notifications
+

+ Provide contextual feedback messages for typical user actions with the handful of available and flexible messages. +

+
+
+ +
Alerts
+
+
+
Basic
+

+ Wrap any text and an optional dismiss button in .alert + and one of the four contextual classes (e.g., .alert-success + ) for basic alert messages. +

+

+ Use the .alert-link + utility class to quickly provide matching colored links within any alert. +

+
+ + Well done! You successfully read + + this important alert message + + . +
+
+ + Heads up! + This + + alert needs your attention + + , but it's not super important. +
+
+ + Warning! + Better check yourself, you're + + not looking too good + + . +
+
+ + Oh snap! + + Change a few things up + + and try submitting again. +
+
AngularJS-version of bootstrap's alert
+

+ This directive can be used to generate alerts from the dynamic model data (using the ng-repeat directive); + The presence of the close attribute determines if a close button is displayed +

+ +
+ + {{alert.msg}} + + +
+
+
+ +
+
+ +
Notifications
+
+
+
+ +

Error!

+

+ Duis mollis, est non commodo luctus, + nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. +

+

+ + Take this action + + + Or do this + +

+
+
+ +

Success!

+

+ Duis mollis, est non commodo luctus, + nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. +

+

+ + Take this action + + + Or do this + +

+
+
+ +

Info!

+

+ Duis mollis, est non commodo luctus, + nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. +

+

+ + Take this action + + + Or do this + +

+
+
+ +

Warning!

+

+ Duis mollis, est non commodo luctus, + nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. +

+

+ + Take this action + + + Or do this + +

+
+
+
+ +
+
+
+
+
+ diff --git a/assets/views/ui_panels.html b/assets/views/ui_panels.html new file mode 100644 index 0000000..908d282 --- /dev/null +++ b/assets/views/ui_panels.html @@ -0,0 +1,401 @@ + +
+
+
+

{{ mainTitle }}

+ While not always necessary, sometimes you need to put your DOM in a box. For those situations, try the panel component. +
+
+
+
+ + +
+
+
+
Panel with heading
+

+ By default, all the .panel does is apply some basic border and padding to contain some content. +

+

+ Easily add a heading container to your panel with .panel-heading. You may also include any <h1>-<h6> with a .panel-title class to add a pre-styled heading. +

+

+ For proper link coloring, be sure to place links in headings within .panel-title. +

+

+ Wrap buttons or secondary text in .panel-footer. Note that panel footers do not inherit colors and borders when using contextual variations as they are not meant to be in the foreground. +

+
+
+
+
+

Panel Title

+
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+

+ 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. +

+

+ Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ullamcorper nulla non metus auctor fringilla. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. +

+
+
+ Panel Footer +
+
+
+
+
+ + +
+
+
+
Panel Tools
+

+ Add several features to the panel with <paneltool> directive. +

+
+
+
+
+

Panel Collapse

+ +
+
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+
+
+
+
+
+
+
+

Panel Refresh

+ +
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+
+
+
+
+
+
+
+
+

Panel Remove

+ +
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+
+
+
+
+
+
+

All Tools

+ +
+
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+
+
+
+
+
+
+
+
+
+

Initially closed

+ +
+
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+

+ 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. +

+
+
+
+
+
+
+
+

Panel Scroll

+ +
+
+
+

+ 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. +

+

+ Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ullamcorper nulla non metus auctor fringilla. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. +

+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+

+ Maecenas sed diam eget risus varius blandit sit amet non magna. Donec id elit non mi porta gravida at eget metus. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. +

+
+
+
+
+
+
+
+
+ + +
+
+
+
Colored Panels
+

+ Use any of the available classes to quickly create a styled panel. +

+
+
+
+
+

Panel Primary

+ +
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+
+
+
+
+
+
+

Panel Blue

+ +
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+
+
+
+
+
+
+

Panel Green

+ +
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+
+
+
+
+
+
+

Panel Red

+ +
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+
+
+
+
+
+
+

Mixed Colors

+ +
+
+
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+
+
+
+
+

+ Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ullamcorper nulla non metus auctor fringilla. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. +

+
+
+
+
+
+
+
+
+

Mixed Colors

+ +
+
+
+
+

+ Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ullamcorper nulla non metus auctor fringilla. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. +

+
+
+
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+
+
+
+
+
+
+
+
+
+ + +
+
+
+
Options
+

+ Additional classes can be added to your panels. +

+
+
+
+
+

Header Border

+ +
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+

+ 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. +

+

+ Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ullamcorper nulla non metus auctor fringilla. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. +

+
+
+
+
+
+
+

Toolbar

+
    +
  • +
    +
    + +
      +
    • + + Action + +
    • +
    • + + Another action + +
    • +
    • + + Something else here + +
    • +
    • +
    • + + Separated link + +
    • +
    +
    +
    +
  • +
  • +
    + 15% +
    +
  • +
  • + +
  • +
+
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+

+ 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. +

+

+ Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ullamcorper nulla non metus auctor fringilla. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. +

+
+
+
+
+
+
+

Squared Panel

+ +
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+

+ 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. +

+

+ Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ullamcorper nulla non metus auctor fringilla. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. +

+
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/ui_sliders.html b/assets/views/ui_sliders.html new file mode 100644 index 0000000..77cc75b --- /dev/null +++ b/assets/views/ui_sliders.html @@ -0,0 +1,143 @@ +
+
+
+

{{ mainTitle }}

+ This handy slider will allow you to drag a handle to select a specific value from a range. +
+
+
+
+
+
+
+
+
Boostrap Sliders
+

+ Basic example with custom formatter and colored selected region via CSS. +

+
+
+
+
+
+ + {{sliders.sliderValue}} +
+
+ + {{sliders.secondSliderValue}} +
+
+ + {{sliders.thirdSliderValue}} +
+
+ + {{sliders.fourthSliderValue}} +
+
+ + {{sliders.fifthSliderValue}} +
+
+ + {{sliders.sixthSliderValue}} +
+
+
+
+
+
+
+

Slider component with different options

+
    +
  • + vertical or horizontal orientation +
  • +
  • + minimum and maxim values +
  • +
  • + step incrementor +
  • +
  • + range selector +
  • +
  • + touch capabale +
  • +
+
+
+
+
+
+
+
+
+
+
+
Options
+

+ Options for the bootstrap-slider component. +

+
+
+
Vertical Sliders
+

Vertical selector, options specified via data attribute orientation.

+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
Range Sliders
+

Range selector, options specified via data attribute.

+
+
+
+ + {{sliders.rangeSliderValue}} +
+
+
+ + {{sliders.rangeSliderValue2}} +
+
+
+
Status
+

Show the status of slider.

+
+
+
+ + {{sliders.statusSliderValue}} + status: {{status}} +
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/assets/views/ui_tabs_accordions.html b/assets/views/ui_tabs_accordions.html new file mode 100644 index 0000000..32e6752 --- /dev/null +++ b/assets/views/ui_tabs_accordions.html @@ -0,0 +1,316 @@ + +
+
+
+

{{ mainTitle }}

+ Allow user to view multiple contents inside "tabbed" sections of the page +
+
+
+
+ + + +
+
+
+
+
Togglable Tabs
+

+ Add quick, dynamic tab functionality to transition through panes of content, even via dropdown menus. +

+ + +

Static content

+

+ 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. +

+

+ Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui. +

+
+ + {{tab.content}} + + + + Alert! + + I've got an HTML heading, and a select callback. Pretty cool! + +
+

+ + Go to tab 2 + + + Go to tab 3 + + + Enable / Disable third tab + +

+
+
+
+
+
+
+
Justified Tabs
+

+ Easily make tabs or pills equal widths of their parent. On smaller screens, the nav links are stacked. +

+ + + Justified content + + + Short Labeled Justified content + + + Long Labeled Justified content + + +
+
+
Pills
+

+ Take that same HTML, but use type="pills" attribute: +

+ + + Pill content + + + Pill content 2 + + + Pill content 3 + + +
+
+
+
+
+
+
Left Tabs
+

+ Add class tabs-left to <tabset>. +

+ + + + Tab 1 + +

+ Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. +

+

+ Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui. +

+
+ + + Tab 2 + +

+ 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. +

+

+ Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. +

+
+ + + Tab 3 + +

+ Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. +

+

+ Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. +

+
+
+
+
+
Right Tabs
+

+ Add class tabs-right to <tabset>. +

+ + + + Tab 1 + +

+ Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. +

+

+ Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui. +

+
+ + + Tab 2 + +

+ 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. +

+

+ Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. +

+
+ + + Tab 3 + +

+ Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. +

+

+ Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. +

+
+
+
+
+
+
+ + + +
+
+
+
+
Ui Bootsrap Accordions
+

+ The accordion directive builds on top of the collapse directive to provide a list of items, with collapsible bodies that are collapsed or expanded by clicking on the item's header. +

+

+ + +

+
+ + +
+ + + This content is straight in the template. + + + {{group.content}} + + +

+ The body of the accordion group grows to fit the contents +

+ +
+ {{item}} +
+
+ + + I can have markup, too! + + This is just some content to illustrate fancy headings. + +
+
+
+
+
+ + +
+
+
+
vAccordion
+

+ AngularJS multi-level accordion component. +

+
+ +
+
+
+
+

Works with (or without) ng-repeat

+
+
+ + + +
{{ pane.header }}
+
+ +

+ {{ pane.content }} +

+ + + +
{{ subpane.header }}
+
+ +

+ {{ subpane.content }} +

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

Allows multiple sections open at once

+
+
+ + + +
{{ pane.header }}
+
+ +

+ {{ pane.content }} +

+ + + +
{{ subpane.header }}
+
+ +

+ {{ subpane.content }} +

+
+
+
+
+
+
+
+
+
+
+
+
+ diff --git a/assets/views/ui_toggle.html b/assets/views/ui_toggle.html new file mode 100644 index 0000000..0828bb7 --- /dev/null +++ b/assets/views/ui_toggle.html @@ -0,0 +1,62 @@ + +
+
+
+

{{ mainTitle }}

+ A simple but useful and efficient directive to toggle a class to an element +
+
+
+
+ + +
+
+
+
Lightbulb Example
+

+ The element that contains the icon "lightbulb", has the directive toggleable, which indicates that it is ready to alternate some class. + The class is specified in the activeClass attribute (in this example text-primary). +

+

+ +

+
+ + Toggle + + + Turn On + + + Turn Off + +
+

Through the directive ctToggle, the buttons can activate, turn off, or toggle class to the target element (which is indicated by its ID)

+
+
+
+ + +
+
+
+
Heart Example
+

+ +

+
+ + Toggle + + + Turn On + + + Turn Off + +
+
+
+
+ \ No newline at end of file diff --git a/assets/views/ui_tree.html b/assets/views/ui_tree.html new file mode 100644 index 0000000..998b03f --- /dev/null +++ b/assets/views/ui_tree.html @@ -0,0 +1,92 @@ + +
+
+
+

{{ mainTitle }}

+ A type of data structure in which each element is attached to one or more elements directly beneath it. The connections between elements are called branches. Webopedia - Online Tech Dictionary for IT Professionals +
+
+
+
+ + +
+
+
+
Angular Bootstrap Nav Tree
+

+ This is a Tree directive for Angular JS apps that use Bootstrap CSS. +

+ +
+
+
+
+
+
+ ...loading... + +
+
+
+
+ {{ output }} +
+
+
+ +
+ +
+
Test the Tree Control API:
+
+ +
+ + +
+ + +
+ +
+ + + + +
+ +
+ +
+
+
+
+
+ diff --git a/assets/views/ui_typography.html b/assets/views/ui_typography.html new file mode 100644 index 0000000..453c69f --- /dev/null +++ b/assets/views/ui_typography.html @@ -0,0 +1,876 @@ + +
+
+
+

{{ mainTitle }}

+ The style, arrangement, or appearance of typeset matter +
+
+
+
+ + +
+
+
+
Headings
+

+ All HTML headings, <h1> through <h6>, are available. .h1 through .h6 classes are also available, for when you want to match the font styling of a heading but still want your text to be displayed inline. +

+

+ Create lighter, secondary text in any heading with a generic <small> + tag or the .small + class. +

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

h1. Heading Secondary text

Semibold 36px

h2. Heading Secondary text

Semibold 30px

h3. Heading Secondary text

Semibold 24px

h4. Heading Secondary text

Semibold 18px
h5. Heading Secondary text
Semibold 14px
h6. Heading Secondary text
Semibold 12px
+
+
+
+
+
+
+
Paragraphs & lead body copy
+

+ Bootstrap's global default font-size is 14px, with a line-height of 1.428. This is applied to the <body> and all paragraphs. In addition, <p> (paragraphs) receive a bottom margin of half their computed line-height (10px by default). +

+

+ Make a paragraph stand out by adding .lead. +

+
+
+
+
+
+ Paragraph +
+
+
+

+ Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula. +

+

+ Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ullamcorper nulla non metus auctor fringilla. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. +

+

+ Maecenas sed diam eget risus varius blandit sit amet non magna. Donec id elit non mi porta gravida at eget metus. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. +

+
+
+
+
+
+
+
+ Lead body copy +
+
+
+

+ Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus. +

+

+ Donec ullamcorper nulla non metus auctor fringilla. Duis mollis, est non commodo luctus, nisi erat porttitor ligula. +

+
+
+
+
+
+ + +
+
+
+
Inline text elements
+

+ This elements are meant to make your life easier by providing simple default styles for all of the most basic typographical needs. +

+
+
+
+
+
+ Marked text +
+
+
+

+ For highlighting a run of text due to its relevance in another context, use the <mark> tag. +

+

+ You can use the mark tag to + + highlight + + text. +

+
+
+
+
+
+
+
+ Deleted text +
+
+
+

+ For indicating blocks of text that have been deleted use the <del> tag. +

+

+ This line of text is meant to be treated as deleted text. +

+
+
+
+
+
+
+
+ Strikethrough text +
+
+
+

+ For indicating blocks of text that are no longer relevant use the <s> tag. +

+

+ This line of text is meant to be treated as no longer accurate. +

+
+
+
+
+
+
+
+ Inserted text +
+
+
+

+ For indicating additions to the document use the <ins> tag. +

+

+ This line of text is meant to be treated as an addition to the document. +

+
+
+
+
+
+
+
+ Underlined text +
+
+
+

+ To underline text use the <u> tag. +

+

+ This line of text will render as underlined +

+
+
+
+
+
+
+
+ Small text +
+
+
+

+ For de-emphasizing inline or blocks of text, use the <small> tag to set text at 85% the size of the parent. +

+

+ This line of text will render as underlined +

+
+
+
+
+
+
+
+ Small and Large text classes +
+
+
+

+ For emphasizing or de-emphasizing inline or blocks of text, use the .text-small or .text-large class. +

+

+ Text Large, Text Normal, Text Small +

+
+
+
+
+
+
+
+ Bold +
+
+
+

+ For emphasizing a snippet of text with a heavier font-weight. +

+

+ The following snippet of text is rendered as bold text. +

+
+
+
+
+
+
+
+ Italics +
+
+
+

+ For emphasizing a snippet of text with italics. +

+

+ The following snippet of text is rendered as italicized text. +

+
+
+
+
+
+
+
+ Transformation classes +
+
+
+

+ Transform text in components with text capitalization classes. +

+

+ Lowercased text. +

+

+ Uppercased text. +

+

+ Capitalized text. +

+
+
+
+
+
+
+
+ Abbreviations +
+
+
+

+ Stylized implementation of HTML's <abbr> element for abbreviations and acronyms to show the expanded version on hover. +

+

+ An abbreviation of the word attribute is attr. +

+
+
+
+
+
+
+
+ Initialism +
+
+
+

+ Add .initialism to an abbreviation for a slightly smaller font-size. +

+

+ HTML is the best thing since sliced bread. +

+
+
+
+
+
+
+
+ Alignment classes +
+
+
+

+ Easily realign text to components with text alignment classes. +

+

+ Left aligned text. +

+

+ Center aligned text. +

+

+ Right aligned text. +

+

+ Justified text. +

+

+ No wrap text. +

+
+
+
+
+
+
+
+
+
+
+
+
+
+ Text Color +
+
+
+

+ You can change the color of text using specific classes. +

+

+ Fusce dapibus, tellus ac cursus commodo, tortor mauris nibh. +

+

+ Nullam id dolor id nibh ultricies vehicula ut id elit. +

+

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

+

+ Maecenas sed diam eget risus varius blandit sit amet non magna. +

+

+ Etiam porta sem malesuada magna mollis euismod. +

+

+ Donec ullamcorper nulla non metus auctor fringilla. +

+

+ Cum sociis natoque penatibus et magnis dis parturient montes. +

+

+ Nullam quis risus eget urna mollis ornare vel eu leo. +

+

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

+

+ Fusce dapibus, tellus ac cursus commodo, tortor mauris nibh. +

+

+ Nullam id dolor id nibh ultricies vehicula ut id elit. +

+

+ Etiam porta sem malesuada magna mollis euismod. +

+
+
+
+
+
+
+
+ Blockquotes +
+
+
+
Default blockquote
+

+ Wrap <blockquote> around any HTML as the quote. For straight quotes, we recommend a <p>. +

+
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante. +

+
+
Naming a source
+

+ Add a <footer> for identifying the source. Wrap the name of the source work in <cite>. +

+
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante. +

+
+ Someone famous in Source Title +
+
+
Alternate displays
+

+ Add .blockquote-reverse for a blockquote with right-aligned content. +

+
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante. +

+
+ Someone famous in Source Title +
+
+
+
+
+
+
+
+
+
+
+
+
+ Addresses +
+
+
+

+ Present contact information for the nearest ancestor or the entire body of work. Preserve formatting by ending all lines with <br>. +

+
+
+ Twitter, Inc. +
+ 795 Folsom Ave, Suite 600 +
+ San Francisco, CA 94107 +
+ P: (123) 456-7890 +
+
+ Full Name +
+ + first.last@example.com + +
+
+
+
+
+
+
+
+
+ Wells +
+
+
+

+ Use the well as a simple effect on an element to give it an inset effect. +

+
+ Look, I'm in a well! +
+
+ Look, I'm in a large well! +
+
+ Look, I'm in a small well! +
+
+
+
+
+
+ + +
+
+
+
Lists
+

+ Lists are helpful for, well, lists of things. Didn't see that coming did you! There are baked-in styles for a number of different unordered list styles, as well as ordered and definition lists. +

+
+
+
+
+
+ Unordered +
+
+
+

+ A list of items in which the order does not explicitly matter. +

+
    +
  • + Lorem ipsum dolor sit amet +
  • +
  • + Consectetur adipiscing elit +
  • +
  • + Integer molestie lorem at massa +
  • +
  • + Facilisis in pretium nisl aliquet +
  • +
  • + Nulla volutpat aliquam velit +
      +
    • + Phasellus iaculis neque +
    • +
    • + Purus sodales ultricies +
    • +
    • + Vestibulum laoreet porttitor sem +
    • +
    • + Ac tristique libero volutpat at +
    • +
    +
  • +
  • + Faucibus porta lacus fringilla vel +
  • +
  • + Aenean sit amet erat nunc +
  • +
  • + Eget porttitor lorem +
  • +
+
+
+
+
+
+
+
+ Ordered +
+
+
+

+ A list of items in which the order does explicitly matter. +

+
    +
  1. + Lorem ipsum dolor sit amet +
  2. +
  3. + Consectetur adipiscing elit +
  4. +
  5. + Integer molestie lorem at massa +
  6. +
  7. + Facilisis in pretium nisl aliquet +
  8. +
  9. + Nulla volutpat aliquam velit +
  10. +
  11. + Faucibus porta lacus fringilla vel +
  12. +
  13. + Aenean sit amet erat nunc +
  14. +
  15. + Eget porttitor lorem +
  16. +
+
+
+
+
+
+
+
+ Unstyled +
+
+
+

+ Remove the default list-style and left margin on list items (immediate children only). This only applies to immediate children list items, meaning you will need to add the class for any nested lists as well. +

+
    +
  • + Lorem ipsum dolor sit amet +
  • +
  • + Facilisis in pretium nisl aliquet +
  • +
  • + Nulla volutpat aliquam velit +
      +
    • + Phasellus iaculis neque +
    • +
    • + Purus sodales ultricies +
    • +
    • + Vestibulum laoreet porttitor sem +
    • +
    • + Ac tristique libero volutpat at +
    • +
    +
  • +
  • + Faucibus porta lacus fringilla vel +
  • +
+
+
+
+
+
+
+
+ Inline List +
+
+
+

+ Place all list items on a single line with display: inline-block; and some light padding. +

+
    +
  • + Lorem ipsum +
  • +
  • + Phasellus iaculis +
  • +
  • + Nulla volutpat +
  • +
+
+
+
+
+
+
+
+ + +
+
+
+
Description
+

+ A list of terms with their associated descriptions. +

+
+
+
+
+
+ Default Description +
+
+
+
+
+ Description lists +
+
+ A description list is perfect for defining terms. +
+
+ Euismod +
+
+ Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit. +
+
+ Donec id elit non mi porta gravida at eget metus. +
+
+ Malesuada porta +
+
+ Etiam porta sem malesuada magna mollis euismod. +
+
+
+
+
+
+
+
+
+ Horizontal description +
+
+
+

+ Make terms and descriptions in <dl> line up side-by-side. Starts off stacked like default <dl>s, but when the navbar expands, so do these. +

+
+
+ Description lists +
+
+ A description list is perfect for defining terms. +
+
+ Euismod +
+
+ Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit. +
+
+ Donec id elit non mi porta gravida at eget metus. +
+
+ Malesuada porta +
+
+ Etiam porta sem malesuada magna mollis euismod. +
+
+ Felis euismod semper eget lacinia +
+
+ Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. +
+
+
+
+
+
+
+
+
+ + +
+
+
+
Code
+

+ A list of terms with their associated descriptions. +

+
+
+
+
+
+ Inline Code +
+
+
+

+ Wrap inline snippets of code with <code>. +

+

+ For example, <section> should be wrapped as inline. +

+
+
+
+
+
+
+
+ User input +
+
+
+

+ Use the <kbd> to indicate input that is typically entered via keyboard. +

+

+ To switch directories, type cd followed by the name of the directory. +

+

+ To edit settings, press ctrl + E +

+
+
+
+
+
+
+
+
+
+ Basic block +
+
+
+

+ Use <pre> for multiple lines of code. Be sure to escape any angle brackets in the code for proper rendering. +

+

+

<p>Sample text here...</p>
+

+

+ You may optionally add the .pre-scrollable class, which will set a max-height of 350px and provide a y-axis scrollbar. +

+
+
+
+
+
+
+
+ Variables +
+
+
+

+ For indicating variables use the <var> tag. +

+

+ y = mx + b +

+
+
+
+
+
+
+
+ diff --git a/assets/views/university.html b/assets/views/university.html new file mode 100644 index 0000000..53d9e2c --- /dev/null +++ b/assets/views/university.html @@ -0,0 +1,221 @@ + +
+
+
+

{{ mainTitle }}

+ + View/Add University Details. + +
+
+
+
+ + +
+
+ + +
+
+ +
+
Please Wait...
+
+
+ +
+

No + records found...

+
+ +
+
+
+ +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
University ID + + University Short Name + + University Name + + Email ID + + Status Details +
{{p.UniversityID}}{{p.UniversityShortName}}{{p.UniversityName}}{{p.EmailID}} Active In-Active + +
+ + + +
+ +
+
+
+
+ + + + + +
+
+
+
+
+ + University Details + + +
+
+ + + + University Id is required + Invalid university Id +
+ + +
+ + + + University Name is required +
+ +
+ + + + University Short Name is required + +
+
+
+ +
+ + + Mobile Number is required. + Enter a Valid Phone Number +
+
+ + + Email is required. + Please, enter a valid email address. +
+
+ + + Address is required +
+
+
+
+ + +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/utility_404.html b/assets/views/utility_404.html new file mode 100644 index 0000000..e157ab5 --- /dev/null +++ b/assets/views/utility_404.html @@ -0,0 +1,40 @@ + +
+
+
+
+
+ 404 +
+
+

Oops! You are stuck at 404

+

+ Unfortunately the page you were looking for could not be found. +
+ It may be temporarily unavailable, moved or no longer exist. +
+ Check the URL you entered for any mistakes and try again. +
+ + Return home + +
+ Still no luck? +
+ Search for whatever is missing, or take a look around the rest of our site. +

+
+
+ + + +
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/utility_500.html b/assets/views/utility_500.html new file mode 100644 index 0000000..aab5367 --- /dev/null +++ b/assets/views/utility_500.html @@ -0,0 +1,23 @@ + +
+
+
+
+
+ 500 +
+
+

Oops! You are stuck at 500

+

+ Something's wrong! +
+ It looks as though we've broken something on our system. +
+ Don't panic, we are fixing it! Please come back in a while. +

+
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/utility_faq.html b/assets/views/utility_faq.html new file mode 100644 index 0000000..c06e600 --- /dev/null +++ b/assets/views/utility_faq.html @@ -0,0 +1,566 @@ +
+
+ +
+
    +
  • + + About the new Product + +
  • +
  • + + Buying Product + +
  • +
  • + + Benefits of the new Product + +
  • +
  • + + Download and install the Product + +
  • +
  • + + Billing and renewal + +
  • +
  • + + Support and resources + +
  • +
+
+
+
+

About the new Product

+
+
+

+ + Excepteur sint obcaecat cupiditat non proident? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Quis aute iure reprehenderit in voluptate velit esse cillum? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Nemo enim ipsam voluptatem, quia voluptas sit? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Excepteur sint obcaecat cupiditat non proident? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Quis aute iure reprehenderit in voluptate velit esse cillum? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Nemo enim ipsam voluptatem, quia voluptas sit? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+
+
+

Buying Product

+
+
+

+ + Spernatur aut odit aut fugit sed quia consequuntur magni? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Qui ratione voluptatem sequi nesciunt? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Quis nostrum exercitationem ullam corporis suscipit laboriosam? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Nisi ut aliquid ex ea commodi consequatur? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Quis autem vel eum iure reprehenderit? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+
+
+

Benefits of the new Product

+
+
+

+ + Quis autem vel eum iure reprehenderit? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Nisi ut aliquid ex ea commodi consequatur? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Quis nostrum exercitationem ullam corporis suscipit laboriosam? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Excepteur sint obcaecat cupiditat non proident +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Temporibus autem quibusdam et aut officiis? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Anim pariatur cliche reprehenderit? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Excepteur sint obcaecat cupiditat non proident +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Temporibus autem quibusdam et aut officiis? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+
+
+

Download and install the Product

+
+
+

+ + Feugiat nulla facilisis at vero eros? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Accumsan et iusto odio dignissim qui blandit? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Nam liber tempor cum soluta nobis? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Placerat facer possim assum? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Typi non habent claritatem insitam? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Est usus legentis in iis qui facit eorum? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+
+
+

Billing and renewal

+
+
+

+ + Investigationes demonstraverunt lectores? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Legere me lius quod ii legunt saepius? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Claritas est etiam processus dynamicus? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Qui sequitur mutationem consuetudium lectorum? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Mirum est notare quam littera gothica? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Quam nunc putamus parum claram? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+
+
+

Support and resources

+
+
+

+ + Anteposuerit litterarum formas humanitatis? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Per seacula quarta decima? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Eodem modo typi? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Qui nunc nobis videntur parum clari? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Fiant sollemnes in futurum? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Quis nostrud exerci tation ullamcorper suscipit lobortis? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+

+ + Aliquip ex ea commodo consequat? +

+
+
+
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. +
+
+
+
+
+
+
+ +
+
\ No newline at end of file diff --git a/assets/views/utility_pricing_table.html b/assets/views/utility_pricing_table.html new file mode 100644 index 0000000..116f504 --- /dev/null +++ b/assets/views/utility_pricing_table.html @@ -0,0 +1,547 @@ + +
+
+
+

{{ mainTitle }}

+ If you're making a rockin' marketing site for a subscription-based product, you're likely in need of a pricing table. +
+
+
+
+ + +
+
+
+
First example
+

+ These tables fill 100% of their container and are made from a simple unordered list. +

+
+
+
    +
  • + Basic +
  • +
  • +

    $19 99/month

    +
  • +
  • + 5GB Storage +
  • +
  • + 1GB RAM +
  • +
  • + 400GB Bandwidth +
  • +
  • + 10 Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
    +
  • + Standard +
  • +
  • +

    $29 99/month

    +
  • +
  • + 5GB Storage +
  • +
  • + 1GB RAM +
  • +
  • + 400GB Bandwidth +
  • +
  • + 10 Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
    +
  • + Advanced +
  • +
  • +

    $49 99/month

    +
  • +
  • + 50GB Storage +
  • +
  • + 8GB RAM +
  • +
  • + 1024GB Bandwidth +
  • +
  • + Unlimited Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
    +
  • + Mighty +
  • +
  • +

    $99 99/month

    +
  • +
  • + 50GB Storage +
  • +
  • + 8GB RAM +
  • +
  • + 1024GB Bandwidth +
  • +
  • + Unlimited Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
+
+
+ + +
+
+
+
Second example
+

+ These tables fill 100% of their container and are made from a simple unordered list. +

+
+
+
    +
  • + Basic +
  • +
  • +

    $19 99/month

    +
  • +
  • + 5GB Storage +
  • +
  • + 1GB RAM +
  • +
  • + 400GB Bandwidth +
  • +
  • + 10 Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
    +
  • + Standard +
  • +
  • +

    $29 99/month

    +
  • +
  • + 5GB Storage +
  • +
  • + 1GB RAM +
  • +
  • + 400GB Bandwidth +
  • +
  • + 10 Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
    +
  • + Advanced +
  • +
  • +

    $49 99/month

    +
  • +
  • + 50GB Storage +
  • +
  • + 8GB RAM +
  • +
  • + 1024GB Bandwidth +
  • +
  • + Unlimited Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
    +
  • + Mighty +
  • +
  • +

    $99 99/month

    +
  • +
  • + 50GB Storage +
  • +
  • + 8GB RAM +
  • +
  • + 1024GB Bandwidth +
  • +
  • + Unlimited Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
+
+
+ + +
+
+
+
Third example
+

+ These tables fill 100% of their container and are made from a simple unordered list. +

+
+
+
    +
  • + Basic +
  • +
  • +

    $19 99/month

    +
  • +
  • + 5GB Storage +
  • +
  • + 1GB RAM +
  • +
  • + 400GB Bandwidth +
  • +
  • + 10 Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
    +
  • + Standard +
  • +
  • +

    $29 99/month

    +
  • +
  • + 5GB Storage +
  • +
  • + 1GB RAM +
  • +
  • + 400GB Bandwidth +
  • +
  • + 10 Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
    +
  • + Advanced +
  • +
  • +

    $49 99/month

    +
  • +
  • + 50GB Storage +
  • +
  • + 8GB RAM +
  • +
  • + 1024GB Bandwidth +
  • +
  • + Unlimited Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
    +
  • + Mighty +
  • +
  • +

    $99 99/month

    +
  • +
  • + 50GB Storage +
  • +
  • + 8GB RAM +
  • +
  • + 1024GB Bandwidth +
  • +
  • + Unlimited Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
+
+
+ + +
+
+
+
Fourth example
+

+ These tables fill 100% of their container and are made from a simple unordered list. +

+
+
+
    +
  • + Basic +
  • +
  • +

    $19 99/month

    +
  • +
  • + 5GB Storage +
  • +
  • + 1GB RAM +
  • +
  • + 400GB Bandwidth +
  • +
  • + 10 Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
    +
  • + Standard +
  • +
  • +

    $29 99/month

    +
  • +
  • + 5GB Storage +
  • +
  • + 1GB RAM +
  • +
  • + 400GB Bandwidth +
  • +
  • + 10 Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
    +
  • + Advanced +
  • +
  • +

    $49 99/month

    +
  • +
  • + 50GB Storage +
  • +
  • + 8GB RAM +
  • +
  • + 1024GB Bandwidth +
  • +
  • + Unlimited Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
    +
  • + Mighty +
  • +
  • +

    $99 99/month

    +
  • +
  • + 50GB Storage +
  • +
  • + 8GB RAM +
  • +
  • + 1024GB Bandwidth +
  • +
  • + Unlimited Email Address +
  • +
  • + Forum Support +
  • +
  • + + Signup + +
  • +
+
+
+
+
+
+ \ No newline at end of file diff --git a/assets/views/utility_search_result.html b/assets/views/utility_search_result.html new file mode 100644 index 0000000..3f3c0a2 --- /dev/null +++ b/assets/views/utility_search_result.html @@ -0,0 +1,160 @@ + +
+
+
+

{{ mainTitle }}

+ Show your users the search results in a simple and intuitive way +
+
+
+
+ + +
+
+
+
+
+
+ + + +
+
+

Search results for '{{app.name}}'

+
+
+

+ + {{app.name}} - Responsive Admin Template +

+ + http://www.apple.com + +

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sequi, obcaecati consequuntur aspernatur neque voluptatum mollitia eaque tenetur ea tempora itaque dolore incidunt explicabo voluptate quaerat at reprehenderit iste iusto asperiores? +

+
+
+
+

+ + {{app.name}} - Responsive Admin Dashboard Template +

+ + http://www.apple.com + +

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae, ut, quis, molestias dolor nobis doloremque eos distinctio perferendis alias aspernatur quam natus necessitatibus fugiat quo nostrum ipsum tempore. Expedita eveniet impedit dolorum unde rerum temporibus. +

+
+
+
+

+ + {{app.name}} - Responsive Admin Template +

+ + http://www.apple.com + +

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit, voluptates, nulla vero beatae deserunt impedit quas fugiat cupiditate error soluta veritatis delectus cumque possimus fugit libero eligendi provident voluptatum nostrum nesciunt. +

+
+
+
+

+ + {{app.name}} - Responsive Admin Dashboard Template +

+ + http://www.apple.com + +

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui, reprehenderit, cumque, quas, voluptatibus expedita aspernatur alias enim laboriosam eum sunt perspiciatis a pariatur dignissimos eligendi repellat harum hic! +

+
+
+
+

+ + {{app.name}} - Responsive Admin Template +

+ + http://www.apple.com + +

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dicta, incidunt. +

+
+
+
+

+ + {{app.name}} - Responsive Admin Dashboard Template +

+ + http://www.apple.com + +

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus adipisci laborum provident enim quam! +

+
+
+
+

+ + {{app.name}} - Responsive Admin Template +

+ + http://www.apple.com + +

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque, harum temporibus beatae assumenda ipsum. Dignissimos deleniti temporibus ut obcaecati possimus. +

+
+
+
    +
  1. + + Prev + +
  2. +
  3. + + 1 + +
  4. +
  5. + + 2 + +
  6. +
  7. + + 3 + +
  8. +
  9. + + 4 + +
  10. +
  11. + + 5 + +
  12. +
  13. + + Next + +
  14. +
+
+
+
+
+ \ No newline at end of file diff --git a/bower_components/AngularJS-Toaster/.bower.json b/bower_components/AngularJS-Toaster/.bower.json new file mode 100644 index 0000000..7e69050 --- /dev/null +++ b/bower_components/AngularJS-Toaster/.bower.json @@ -0,0 +1,27 @@ +{ + "name": "AngularJS-Toaster", + "version": "0.4.10", + "main": [ + "toaster.js", + "toaster.css" + ], + "ignore": [ + "**/.*", + "node_modules", + "components" + ], + "dependencies": { + "angular": ">1.2.6", + "angular-animate": ">1.2.8" + }, + "homepage": "https://github.com/jirikavi/AngularJS-Toaster", + "_release": "0.4.10", + "_resolution": { + "type": "version", + "tag": "0.4.10", + "commit": "ebdb0d4c834c91452d027e6be5606abfaf42deee" + }, + "_source": "git://github.com/jirikavi/AngularJS-Toaster.git", + "_target": "~0.4.10", + "_originalSource": "AngularJS-Toaster" +} \ No newline at end of file diff --git a/bower_components/AngularJS-Toaster/LICENSE b/bower_components/AngularJS-Toaster/LICENSE new file mode 100644 index 0000000..51cc495 --- /dev/null +++ b/bower_components/AngularJS-Toaster/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 jirikavi + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/bower_components/AngularJS-Toaster/README.md b/bower_components/AngularJS-Toaster/README.md new file mode 100644 index 0000000..eca49a3 --- /dev/null +++ b/bower_components/AngularJS-Toaster/README.md @@ -0,0 +1,79 @@ +AngularJS-Toaster +================= + +**AngularJS Toaster** is an AngularJS port of the **toastr** non-blocking notification jQuery library. It requires AngularJS v1.2.6 or higher and angular-animate for the CSS3 transformations. +(I would suggest to use /1.2.8/angular-animate.js, there is a weird blinking in newer versions.) + +### Current Version 0.4.10 + +## Demo +- Simple demo is at http://plnkr.co/edit/HKTC1a +- Older versions are http://plnkr.co/edit/1poa9A or http://plnkr.co/edit/4qpHwp or http://plnkr.co/edit/lzYaZt (with version 0.4.5) +- Older version with Angular 1.2.0 is placed at http://plnkr.co/edit/mejR4h +- Older version with Angular 1.2.0-rc.2 is placed at http://plnkr.co/edit/iaC2NY +- Older version with Angular 1.1.5 is placed at http://plnkr.co/mVR4P4 + +## Getting started + +Optionally: to install with bower, use: +``` +bower install --save angularjs-toaster +``` + +* Link scripts: + +```html + + + + +``` + +* Add toaster container directive: + +```html + +``` + +* Prepare the call of toaster method: + +```js + // Display an info toast with no title + angular.module('main', ['toaster']) + .controller('myController', function($scope, toaster) { + $scope.pop = function(){ + toaster.pop('success', "title", "text"); + }; + }); +``` + +* Call controller method on button click: + +```html +
+ +
+``` + +### Other Options + +```html +// Change display position + +``` + +### Animations +Unlike toastr, this library relies on ngAnimate and CSS3 transformations for animations. + +## Author +**Jiri Kavulak** + +## Credits +Inspired by http://codeseven.github.io/toastr/demo.html. + +## Copyright +Copyright © 2013 [Jiri Kavulak](https://twitter.com/jirikavi). + +## License +AngularJS-Toaster is under MIT license - http://www.opensource.org/licenses/mit-license.php + diff --git a/bower_components/AngularJS-Toaster/bower.json b/bower_components/AngularJS-Toaster/bower.json new file mode 100644 index 0000000..c51c52b --- /dev/null +++ b/bower_components/AngularJS-Toaster/bower.json @@ -0,0 +1,17 @@ +{ + "name": "AngularJS-Toaster", + "version": "0.4.10", + "main": [ + "toaster.js", + "toaster.css" + ], + "ignore": [ + "**/.*", + "node_modules", + "components" + ], + "dependencies": { + "angular": ">1.2.6", + "angular-animate": ">1.2.8" + } +} diff --git a/bower_components/AngularJS-Toaster/toaster.css b/bower_components/AngularJS-Toaster/toaster.css new file mode 100644 index 0000000..6e21ba5 --- /dev/null +++ b/bower_components/AngularJS-Toaster/toaster.css @@ -0,0 +1,239 @@ +/* + * Toastr + * Version 2.0.1 + * Copyright 2012 John Papa and Hans Fjällemark. + * All Rights Reserved. + * Use, reproduction, distribution, and modification of this code is subject to the terms and + * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php + * + * Author: John Papa and Hans Fjällemark + * Project: https://github.com/CodeSeven/toastr + */ +.toast-title { + font-weight: bold; +} +.toast-message { + -ms-word-wrap: break-word; + word-wrap: break-word; +} +.toast-message a, +.toast-message label { + color: #ffffff; +} +.toast-message a:hover { + color: #cccccc; + text-decoration: none; +} + +.toast-close-button { + position: relative; + right: -0.3em; + top: -0.3em; + float: right; + font-size: 20px; + font-weight: bold; + color: #ffffff; + -webkit-text-shadow: 0 1px 0 #ffffff; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.8; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); + filter: alpha(opacity=80); +} +.toast-close-button:hover, +.toast-close-button:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40); + filter: alpha(opacity=40); +} + +/*Additional properties for button version + iOS requires the button element instead of an anchor tag. + If you want the anchor version, it requires `href="#"`.*/ +button.toast-close-button { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.toast-top-full-width { + top: 0; + right: 0; + width: 100%; +} +.toast-bottom-full-width { + bottom: 0; + right: 0; + width: 100%; +} +.toast-top-left { + top: 12px; + left: 12px; +} +.toast-top-center { + top: 12px; +} +.toast-top-right { + top: 12px; + right: 12px; +} +.toast-bottom-right { + right: 12px; + bottom: 12px; +} +.toast-bottom-center { + bottom: 12px; +} +.toast-bottom-left { + bottom: 12px; + left: 12px; +} +.toast-center { + top: 45%; +} +#toast-container { + position: fixed; + z-index: 999999; + /*overrides*/ + +} +#toast-container.toast-center, +#toast-container.toast-top-center, +#toast-container.toast-bottom-center{ + width: 100%; + pointer-events: none; +} +#toast-container.toast-center > div, +#toast-container.toast-top-center > div, +#toast-container.toast-bottom-center > div{ + margin: auto; + pointer-events: auto; +} +#toast-container.toast-center > button, +#toast-container.toast-top-cente > button, +#toast-container.toast-bottom-center > button{ + pointer-events: auto; +} +#toast-container * { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +#toast-container > div { + margin: 0 0 6px; + padding: 15px 15px 15px 50px; + width: 300px; + -moz-border-radius: 3px 3px 3px 3px; + -webkit-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; + background-position: 15px center; + background-repeat: no-repeat; + -moz-box-shadow: 0 0 12px #999999; + -webkit-box-shadow: 0 0 12px #999999; + box-shadow: 0 0 12px #999999; + color: #ffffff; + opacity: 0.8; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); + filter: alpha(opacity=80); +} +#toast-container > :hover { + -moz-box-shadow: 0 0 12px #000000; + -webkit-box-shadow: 0 0 12px #000000; + box-shadow: 0 0 12px #000000; + opacity: 1; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + filter: alpha(opacity=100); + cursor: pointer; +} +#toast-container > .toast-info { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important; +} +#toast-container > .toast-wait { + background-image: url("data:image/gif;base64,R0lGODlhIAAgAIQAAAQCBISGhMzKzERCROTm5CQiJKyurHx+fPz+/ExOTOzu7Dw+PIyOjCwqLFRWVAwKDIyKjMzOzOzq7CQmJLy6vFRSVPTy9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCQAXACwAAAAAIAAgAAAF3eAljmRpnmh6VRSVqLDpIDTixOdUlFSNUDhSQUAT7ES9GnD0SFQAKWItMqr4bqKHVPDI+WiTkaOFFVlrFe83rDrT0qeIjwrT0iLdU0GOiBxhAA4VeSk6QYeIOAsQEAuJKgw+EI8nA18IA48JBAQvFxCXDI8SNAQikV+iiaQIpheWX5mJmxKeF6g0qpQmA4yOu8C7EwYWCgZswRcTFj4KyMAGlwYxDwcHhCXMXxYxBzQHKNo+3DDeCOAn0V/TddbYJA0K48gAEAFQicMWFsfwNA3JSgAIAAFfwIMIL4QAACH5BAkJABoALAAAAAAgACAAhAQCBIyKjERCRMzOzCQiJPTy9DQyNGRmZMTCxOTm5CwqLHx+fBQWFJyenNTW1Pz6/Dw6PGxubAwKDIyOjNTS1CQmJCwuLPz+/Dw+PHRydAAAAAAAAAAAAAAAAAAAAAAAAAXboCaOZGmeaKoxWcSosMkk15W8cZ7VdZaXkcEgQtrxfD9RhHchima1GwlCGUBSFCaFxMrgRtnLFhWujWHhs2nJc8KoVlWGQnEn7/i8XgOwWAB7JwoONQ4KgSQAZRcOgHgSCwsSIhZMNRZ5CzULIgaWF5h4mhecfIQ8jXmQkiODhYeIiRYGjrG2PxgBARi3IhNMAbcCnwI5BAQpAZ8TIwK6vCQVDwUVKL+WzAANTA210g/VJ8OWxQefByQE4dZMzBoInwh4zrtgn2p725YNthUFTNRuGYB3AYGBHCEAACH5BAkJAB0ALAAAAAAgACAAhAQCBISChFRWVMzKzCQiJOTm5GxqbCwuLJSWlPz6/NTW1AwODJSSlGRmZCwqLOzu7HR2dDQ2NAQGBISGhFxaXNTS1CQmJOzq7GxubDQyNKSmpPz+/Nza3AAAAAAAAAAAAAXfYCeOZGmeaKqurHBdAiuP17Zdc0lMAVHWt9yI8LA9fCPB4xEjARoNSWpis01kBpshFahurqzsZosiGpErScMAUO0maKF8Tq/bTQCIQgFp30cQXhB1BHEcXhx0FgkJFiOHVYlzi42AgoRxeRx8fn+en3UABwedKgsBAwMBCygOCjYKDisLFV4VrCUAtVUKpSZdXl8mB8EbByQWcQPFAyYZxccdB7sV0cvBzbmvvG0LBV4FrFTBYCWuNhyyHRTFFB20trh4BxmdYl4YIqepq0IRxRE+IfDCAFQHARo0NGERAgAh+QQJCQAgACwAAAAAIAAgAIUEAgSEgoRMTkzMyswcHhzk5uR0cnQUFhRcXlwsKiz09vQMCgyMiozU1tQkJiR8fnxkZmT8/vwEBgSEhoRcWlzU0tQkIiT08vR0dnQcGhxkYmQ0MjT8+vwMDgyMjozc2twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG+UCQcEgsGo/IpHLJXDweC6Z0+IhEHlOjRGIMWLHZoUZx0RQlAajxkFFKFFYFl5m5KNpIySU+X2bIBEoQZBBZGQdMElFhjI2Oj5AgHQEDAw8dQxYeDBaNHRVWVhWYCXsRFwmMXqFWEyAerB6MA6xWA6+xs7URt6VWqIwTu64gDh4eDp6goaORQ5OVAZjO1EgEGhB4RwAYDQ0YAEwIcBEKFEgYrBhLBORxgUYfrB9LELuF8fNDAAaVBuEg7NXCVyRdqHVCGLBiIIQAB1Yc4BXh9uEbwAXuyi2iQI7DuSwHdiFqCEGDtizLRFUDsaGAlQIbVoJYIEDAIiZBAAAh+QQJCQAbACwAAAAAIAAgAIQEAgSMioxcWlz08vQcHhysqqwMDgx8enwsKiykoqRkZmT8+vzEwsQMCgyUlpQkJiS0srQEBgSMjoxcXlz09vQkIiSsrqwUEhQ0MjRsamz8/vwAAAAAAAAAAAAAAAAAAAAF7+AmjmRpnmiqruz2PG0sIssCj4CQJAIgj4/abRNJaI6agu9kCAQaphdJgEQKUIFjgGWsahJYLdf7RTWfLKr3+jsBClVlG5Xb9eb4fImgUBBKDVB4ExRHFGwbGRQLGXMEhUgUfw2QC4IyCmSNDQtHlm2ZXgoiGQsUjW0EnUgLfyKBeYSeiHojfH61uS0GBisVEgEVLRcWRxAXKAgDRwMILMVIECgSVRIrBmS9JtRI1iMVBweuGxerSNolyszOIhjLGs0jEFXSKA8SEkMbcEgWIxfzNBxrw6AKgxIGkM05UOWALhERHJhysOThBgAVWYQAACH5BAkJABkALAAAAAAgACAAhAQGBIyKjERCRMzOzCwuLGRiZPz6/OTm5AwODLSytFRSVNTW1Dw6PHx6fAwKDJSSlERGRNTS1DQyNGxqbPz+/BQSFLy6vFRWVNza3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAXqYCaO5FgFwxBUZeu61ULNFMa+eBvQdJD/owFvFhkBBAwHsBQZUooZyWF2YOQkBNJu6ANMaQeli0AxSEwymi0DcUJeEgPlbEJFAghRe/h+Eeg/Dl9UYks5DF9VhksOAgKFi5GSSwh5kzgVCXIJNxknD5aSCTwJIw8zD5MITpanFKmSCHI8NxUPoJejNKWXLZkznL0vCJ3CxsckDpA/ChYJFzkTBgYTSxc80C4OswbLLhY8Fi/bMwYAJVgl4DTiL9LUJADrFuci1zTZLwD1IwU8BSQuWLCQb1EDHg2QiSDALYvCDAISJLDy8FIIACH5BAkJAB4ALAAAAAAgACAAhAQGBISGhFRSVNTW1CQiJKyqrGRmZOzu7CwuLIyOjGxubPz6/BQSFGRiZOTi5CwqLLy6vDQ2NIyKjFRWVCQmJKyurGxqbPT29DQyNJSSlHRydPz+/BQWFOzq7AAAAAAAAAXhoCeOJElYClGubOs117YtjWuvxCLLi3qbhc6h4FPsdorfiNI5dige43GT9AAkHUcCwCpMNxVP7tgTJY4J1uF7EBl0M8Ooueuo2SOCIkVa11kVX2E2EmgsFH4yBz4uAAkdHVstBAUHQ4xKmZqbnJ2bAhAQAiURGJ4eE0cTIxgzpp0QRxCsrp6xO7MjpaepO6unKxOhv8DFxsfIJBwaChw2DAkZDEocDjIOzi0ZMhlKUjIaLtsb3T8aR+EtDBkJ0yQUBQVQI9XX2ZsDMgMlyxr3mzE2XEgmotCGAARFIHiQ0FMIACH5BAkJABgALAAAAAAgACAAhAQCBISGhDw+POTi5CwuLLS2tPTy9BQSFJyenGRiZDQ2NIyOjLy+vPz6/BweHIyKjFRSVOzq7DQyNLy6vBQWFHRydDw6PPz+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXICaOZHkcZaquIjVd10SxtFrAcFGrVhBYIwoON9uNAsOA6DCEFTEKBEKxEjQvAtELNxkpGrAGNfW4Plpb2QgxRKjKzfPoVGLj3CnLNUv7hscpSDhKOxJSgDwPP0ZGAACMjAQFDQYFBJA0BAZDBpeYGBQVFUU3TV2YFAMwAzNgTQ2PkBVDFRiuQ7CYszi1pUOnkKmrM5qcnqiiTwQTDQ2Wn9DR0tPUfRKQEBEREDQSFw3XRhEwEd3f4TvjF+XWKgJ8JNnb0QkwCdUlCzAL+CQODAwc9BtIMAQAOw==") !important; +} +#toast-container > .toast-error { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important; +} +#toast-container > .toast-success { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important; +} +#toast-container > .toast-warning { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important; +} +#toast-container.toast-top-full-width > div, +#toast-container.toast-bottom-full-width > div { + width: 96%; + margin: auto; +} +.toast { + background-color: #030303; +} +.toast-success { + background-color: #51a351; +} +.toast-error { + background-color: #bd362f; +} +.toast-info { + background-color: #2f96b4; +} +.toast-wait { + background-color: #2f96b4; +} +.toast-warning { + background-color: #f89406; +} +/*Responsive Design*/ +@media all and (max-width: 240px) { + #toast-container > div { + padding: 8px 8px 8px 50px; + width: 11em; + } + #toast-container .toast-close-button { + right: -0.2em; + top: -0.2em; +} + } +@media all and (min-width: 241px) and (max-width: 480px) { + #toast-container > div { + padding: 8px 8px 8px 50px; + width: 18em; + } + #toast-container .toast-close-button { + right: -0.2em; + top: -0.2em; +} +} +@media all and (min-width: 481px) and (max-width: 768px) { + #toast-container > div { + padding: 15px 15px 15px 50px; + width: 25em; + } +} + + /* + * AngularJS-Toaster + * Version 0.3 + */ +:not(.no-enter)#toast-container > div.ng-enter, +:not(.no-leave)#toast-container > div.ng-leave +{ + -webkit-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; + -moz-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; + -ms-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; + -o-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; + transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; +} + +:not(.no-enter)#toast-container > div.ng-enter.ng-enter-active, +:not(.no-leave)#toast-container > div.ng-leave { + opacity: 0.8; +} + +:not(.no-leave)#toast-container > div.ng-leave.ng-leave-active, +:not(.no-enter)#toast-container > div.ng-enter { + opacity: 0; +} \ No newline at end of file diff --git a/bower_components/AngularJS-Toaster/toaster.js b/bower_components/AngularJS-Toaster/toaster.js new file mode 100644 index 0000000..f11b2eb --- /dev/null +++ b/bower_components/AngularJS-Toaster/toaster.js @@ -0,0 +1,281 @@ +(function () { +'use strict'; + +/* + * AngularJS Toaster + * Version: 0.4.10 + * + * Copyright 2013 Jiri Kavulak. + * All Rights Reserved. + * Use, reproduction, distribution, and modification of this code is subject to the terms and + * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php + * + * Author: Jiri Kavulak + * Related to project of John Papa and Hans Fjällemark + */ + +angular.module('toaster', ['ngAnimate']) +.constant('toasterConfig', { + 'limit': 0, // limits max number of toasts + 'tap-to-dismiss': true, + 'close-button': false, + 'newest-on-top': true, + //'fade-in': 1000, // done in css + //'on-fade-in': undefined, // not implemented + //'fade-out': 1000, // done in css + // 'on-fade-out': undefined, // not implemented + //'extended-time-out': 1000, // not implemented + 'time-out': 5000, // Set timeOut and extendedTimeout to 0 to make it sticky + 'icon-classes': { + error: 'toast-error', + info: 'toast-info', + wait: 'toast-wait', + success: 'toast-success', + warning: 'toast-warning' + }, + 'body-output-type': '',// Options: '', 'trustedHtml', 'template', 'templateWithData' + 'body-template': 'toasterBodyTmpl.html', + 'icon-class': 'toast-info', + 'position-class': 'toast-top-right', + 'title-class': 'toast-title', + 'message-class': 'toast-message', + 'mouseover-timer-stop': true // stop timeout on mouseover and restart timer on mouseout +}) +.service('toaster', ['$rootScope', 'toasterConfig', function ($rootScope, toasterConfig) { + this.pop = function (type, title, body, timeout, bodyOutputType, clickHandler) { + if (angular.isObject(type)) { + var params = type; // NOTE: anable parameters as pop argument + this.toast = { + type: params.type, + title: params.title, + body: params.body, + timeout: params.timeout, + bodyOutputType: params.bodyOutputType, + clickHandler: params.clickHandler + }; + } + else { + this.toast = { + type: type, + title: title, + body: body, + timeout: timeout, + bodyOutputType: bodyOutputType, + clickHandler: clickHandler + }; + } + $rootScope.$emit('toaster-newToast'); + }; + + this.clear = function () { + $rootScope.$emit('toaster-clearToasts'); + }; + + for (var type in toasterConfig['icon-classes']) { + this[type] = (function (toasterType){ + return function(title, body, timeout, bodyOutputType, clickHandler) { + if (angular.isString(title)) + this.pop(toasterType, title, body, timeout, bodyOutputType, clickHandler); + else + this.pop(angular.extend(title, {type: toasterType})); + } + })(type); + } +}]) +.factory('toasterRegisterEvents', function() { + + var toasterFactory = { + _NewToastEvent: false, + _ClearAllToastsEvent: false, + registerNewToastEvent: function(){ + this._NewToastEvent = true; + }, + registerClearAllToastsEvent: function(){ + this._ClearAllToastsEvent = true; + }, + isRegisteredNewToastEvent: function(){ + return this._NewToastEvent; + }, + isRegisteredClearAllToastsEvent: function(){ + return this._ClearAllToastsEvent; + } + } + return { + registerNewToastEvent: toasterFactory.registerNewToastEvent, + registerClearAllToastsEvent: toasterFactory.registerClearAllToastsEvent, + isRegisteredNewToastEvent: toasterFactory.isRegisteredNewToastEvent, + isRegisteredClearAllToastsEvent: toasterFactory.isRegisteredClearAllToastsEvent + } +}) +.directive('toasterContainer', ['$parse', '$rootScope', '$interval', '$sce', 'toasterConfig', 'toaster', 'toasterRegisterEvents', +function ($parse, $rootScope, $interval, $sce, toasterConfig, toaster, toasterRegisterEvents) { + return { + replace: true, + restrict: 'EA', + scope: true, // creates an internal scope for this directive + link: function (scope, elm, attrs) { + + var id = 0, + mergedConfig; + + mergedConfig = angular.extend({}, toasterConfig, scope.$eval(attrs.toasterOptions)); + + scope.config = { + position: mergedConfig['position-class'], + title: mergedConfig['title-class'], + message: mergedConfig['message-class'], + tap: mergedConfig['tap-to-dismiss'], + closeButton: mergedConfig['close-button'], + animation: mergedConfig['animation-class'], + mouseoverTimer: mergedConfig['mouseover-timer-stop'] + }; + + scope.deregClearToasts = null; + scope.deregNewToast = null; + + scope.$on("$destroy",function () { + if (scope.deregClearToasts) scope.deregClearToasts(); + if (scope.deregNewToast) scope.deregNewToast(); + scope.deregClearToasts=null; + scope.deregNewToast=null; + }); + + scope.configureTimer = function configureTimer(toast) { + var timeout = typeof (toast.timeout) == "number" ? toast.timeout : mergedConfig['time-out']; + if (timeout > 0) + setTimeout(toast, timeout); + }; + + function addToast(toast) { + toast.type = mergedConfig['icon-classes'][toast.type]; + if (!toast.type) + toast.type = mergedConfig['icon-class']; + + id++; + angular.extend(toast, { id: id }); + + // Set the toast.bodyOutputType to the default if it isn't set + toast.bodyOutputType = toast.bodyOutputType || mergedConfig['body-output-type']; + switch (toast.bodyOutputType) { + case 'trustedHtml': + toast.html = $sce.trustAsHtml(toast.body); + break; + case 'template': + toast.bodyTemplate = toast.body || mergedConfig['body-template']; + break; + case 'templateWithData': + var fcGet = $parse(toast.body || mergedConfig['body-template']); + var templateWithData = fcGet(scope); + toast.bodyTemplate = templateWithData.template; + toast.data = templateWithData.data; + break; + } + + scope.configureTimer(toast); + + if (mergedConfig['newest-on-top'] === true) { + scope.toasters.unshift(toast); + if (mergedConfig['limit'] > 0 && scope.toasters.length > mergedConfig['limit']) { + scope.toasters.pop(); + } + } else { + scope.toasters.push(toast); + if (mergedConfig['limit'] > 0 && scope.toasters.length > mergedConfig['limit']) { + scope.toasters.shift(); + } + } + + toast.mouseover = false; + } + + function setTimeout(toast, time) { + toast.timeout = $interval(function () { + if (!toast.mouseover) + scope.removeToast(toast.id); + }, time); + } + + scope.toasters = []; + + if(!toasterRegisterEvents.isRegisteredNewToastEvent()){ + toasterRegisterEvents.registerNewToastEvent(); + scope.deregNewToast = $rootScope.$on('toaster-newToast', function () { + addToast(toaster.toast); + }); + } + + if(!toasterRegisterEvents.isRegisteredClearAllToastsEvent()){ + toasterRegisterEvents.registerClearAllToastsEvent(); + scope.deregClearToasts = $rootScope.$on('toaster-clearToasts', function () { + scope.toasters.splice(0, scope.toasters.length); + }); + } + }, + controller: ['$scope', '$element', '$attrs', function ($scope, $element, $attrs) { + + $scope.stopTimer = function (toast) { + toast.mouseover = true; + if ($scope.config.mouseoverTimer === true) { + if (toast.timeout) { + $interval.cancel(toast.timeout); + toast.timeout = null; + } + } + }; + + $scope.restartTimer = function (toast) { + toast.mouseover = false; + if ($scope.config.mouseoverTimer === true) { + if (!toast.timeout) + $scope.configureTimer(toast); + } + else if (toast.timeout === null) { + $scope.removeToast(toaster.id); + } + }; + + $scope.removeToast = function (id) { + var i = 0; + for (i; i < $scope.toasters.length; i++) { + if ($scope.toasters[i].id === id) + break; + } + $scope.toasters.splice(i, 1); + }; + + $scope.click = function (toaster, isCloseButton) { + if ($scope.config.tap === true || isCloseButton == true) { + var removeToast = true; + if (toaster.clickHandler) { + if (angular.isFunction(toaster.clickHandler)) { + removeToast = toaster.clickHandler(toaster, isCloseButton); + } + else if (angular.isFunction($scope.$parent.$eval(toaster.clickHandler))) { + removeToast = $scope.$parent.$eval(toaster.clickHandler)(toaster, isCloseButton); + } + else { + console.log("TOAST-NOTE: Your click handler is not inside a parent scope of toaster-container."); + } + } + if (removeToast) { + $scope.removeToast(toaster.id); + } + } + }; + }], + template: + '
' + + '
' + + '' + + '
{{toaster.title}}
' + + '
' + + '
' + + '
' + + '
' + + '
{{toaster.body}}
' + + '
' + + '
' + + '
' + }; +}]); +})(window, document); diff --git a/bower_components/AngularJS-Toaster/toaster.scss b/bower_components/AngularJS-Toaster/toaster.scss new file mode 100644 index 0000000..35897d4 --- /dev/null +++ b/bower_components/AngularJS-Toaster/toaster.scss @@ -0,0 +1,292 @@ +/* + * Toastr + * Version 2.0.1 + * Copyright 2012 John Papa and Hans Fjällemark. + * All Rights Reserved. + * Use, reproduction, distribution, and modification of this code is subject to the terms and + * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php + * + * Author: John Papa and Hans Fjällemark + * Project: https://github.com/CodeSeven/toastr + * + * + * SCSS File + * Author: Damian Szymczuk + * GitHub: https://github.com/dszymczuk + * + */ + + +/* Variables */ +$textColor: #ffffff; +$textColorHover: #cccccc; +$closeButton: #ffffff; +$closeButtonHover: #000000; + +$fontSize: 20px; + +$toast: #030303; +$toastSuccess: #51a351; +$toastError: #bd362f; +$toastInfo: #2f96b4; +$toastWarning: #f89406; + + +$toastPositionFullWidthTop: 0; +$toastPositionFullWidthBottom: 0; + +$toastPossitionTop: 12px; +$toastPossitionLeft: 12px; +$toastPossitionRight: 12px; +$toastPossitionBottom: 12px; + +$toastContainerColor: #ffffff; +$toastContainerShadowColor: #999999; +$toastContainerShadowColorHover: #000000; + + +.toast-title { + font-weight: bold; +} + +.toast-message { + -ms-word-wrap: break-word; + word-wrap: break-word; + a, label { + color: $textColor; + } + a:hover { + color: $textColorHover; + text-decoration: none; + } +} + +.toast-close-button { + position: relative; + right: -0.3em; + top: -0.3em; + float: right; + font-size: $fontSize; + font-weight: bold; + color: $closeButton; + -webkit-text-shadow: 0 1px 0 $closeButton; + text-shadow: 0 1px 0 $closeButton; + opacity: 0.8; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); + filter: alpha(opacity = 80); + &:hover, &:focus { + color: $closeButtonHover; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40); + filter: alpha(opacity = 40); + } +} + +/*Additional properties for button version + iOS requires the button element instead of an anchor tag. + If you want the anchor version, it requires `href="#"`.*/ + +button.toast-close-button { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.toast-top-full-width { + top: $toastPositionFullWidthTop; + right: 0; + width: 100%; +} + +.toast-bottom-full-width { + bottom: $toastPositionFullWidthBottom; + right: 0; + width: 100%; +} + +.toast-top-left { + top: $toastPossitionTop; + left: $toastPossitionLeft; +} + +.toast-top-center { + top: $toastPossitionTop; +} + +.toast-top-right { + top: $toastPossitionTop; + right: $toastPossitionRight; +} + +.toast-bottom-right { + right: $toastPossitionRight; + bottom: $toastPossitionBottom; +} + +.toast-bottom-center { + bottom: $toastPossitionBottom; +} + +.toast-bottom-left { + bottom: $toastPossitionBottom; + left: $toastPossitionLeft; +} + +.toast-center { + top: 45%; +} + +#toast-container { + position: fixed; + z-index: 999999; + /*overrides*/ + &.toast-center, &.toast-top-center, &.toast-bottom-center { + width: 100%; + pointer-events: none; + } + &.toast-center > div, &.toast-top-center > div, &.toast-bottom-center > div { + margin: auto; + pointer-events: auto; + } + &.toast-center > button, &.toast-top-cente > button, &.toast-bottom-center > button { + pointer-events: auto; + } + * { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + } + > { + div { + margin: 0 0 6px; + padding: 15px 15px 15px 50px; + width: 300px; + -moz-border-radius: 3px 3px 3px 3px; + -webkit-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; + background-position: 15px center; + background-repeat: no-repeat; + -moz-box-shadow: 0 0 12px $toastContainerShadowColor; + -webkit-box-shadow: 0 0 12px $toastContainerShadowColor; + box-shadow: 0 0 12px $toastContainerShadowColor; + color: $toastContainerColor; + opacity: 0.8; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); + filter: alpha(opacity = 80); + } + :hover { + -moz-box-shadow: 0 0 12px $toastContainerShadowColorHover; + -webkit-box-shadow: 0 0 12px $toastContainerShadowColorHover; + box-shadow: 0 0 12px $toastContainerShadowColorHover; + opacity: 1; + -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); + filter: alpha(opacity = 100); + cursor: pointer; + } + .toast-info { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important; + } + .toast-wait { + background-image: url("data:image/gif;base64,R0lGODlhIAAgAIQAAAQCBISGhMzKzERCROTm5CQiJKyurHx+fPz+/ExOTOzu7Dw+PIyOjCwqLFRWVAwKDIyKjMzOzOzq7CQmJLy6vFRSVPTy9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCQAXACwAAAAAIAAgAAAF3eAljmRpnmh6VRSVqLDpIDTixOdUlFSNUDhSQUAT7ES9GnD0SFQAKWItMqr4bqKHVPDI+WiTkaOFFVlrFe83rDrT0qeIjwrT0iLdU0GOiBxhAA4VeSk6QYeIOAsQEAuJKgw+EI8nA18IA48JBAQvFxCXDI8SNAQikV+iiaQIpheWX5mJmxKeF6g0qpQmA4yOu8C7EwYWCgZswRcTFj4KyMAGlwYxDwcHhCXMXxYxBzQHKNo+3DDeCOAn0V/TddbYJA0K48gAEAFQicMWFsfwNA3JSgAIAAFfwIMIL4QAACH5BAkJABoALAAAAAAgACAAhAQCBIyKjERCRMzOzCQiJPTy9DQyNGRmZMTCxOTm5CwqLHx+fBQWFJyenNTW1Pz6/Dw6PGxubAwKDIyOjNTS1CQmJCwuLPz+/Dw+PHRydAAAAAAAAAAAAAAAAAAAAAAAAAXboCaOZGmeaKoxWcSosMkk15W8cZ7VdZaXkcEgQtrxfD9RhHchima1GwlCGUBSFCaFxMrgRtnLFhWujWHhs2nJc8KoVlWGQnEn7/i8XgOwWAB7JwoONQ4KgSQAZRcOgHgSCwsSIhZMNRZ5CzULIgaWF5h4mhecfIQ8jXmQkiODhYeIiRYGjrG2PxgBARi3IhNMAbcCnwI5BAQpAZ8TIwK6vCQVDwUVKL+WzAANTA210g/VJ8OWxQefByQE4dZMzBoInwh4zrtgn2p725YNthUFTNRuGYB3AYGBHCEAACH5BAkJAB0ALAAAAAAgACAAhAQCBISChFRWVMzKzCQiJOTm5GxqbCwuLJSWlPz6/NTW1AwODJSSlGRmZCwqLOzu7HR2dDQ2NAQGBISGhFxaXNTS1CQmJOzq7GxubDQyNKSmpPz+/Nza3AAAAAAAAAAAAAXfYCeOZGmeaKqurHBdAiuP17Zdc0lMAVHWt9yI8LA9fCPB4xEjARoNSWpis01kBpshFahurqzsZosiGpErScMAUO0maKF8Tq/bTQCIQgFp30cQXhB1BHEcXhx0FgkJFiOHVYlzi42AgoRxeRx8fn+en3UABwedKgsBAwMBCygOCjYKDisLFV4VrCUAtVUKpSZdXl8mB8EbByQWcQPFAyYZxccdB7sV0cvBzbmvvG0LBV4FrFTBYCWuNhyyHRTFFB20trh4BxmdYl4YIqepq0IRxRE+IfDCAFQHARo0NGERAgAh+QQJCQAgACwAAAAAIAAgAIUEAgSEgoRMTkzMyswcHhzk5uR0cnQUFhRcXlwsKiz09vQMCgyMiozU1tQkJiR8fnxkZmT8/vwEBgSEhoRcWlzU0tQkIiT08vR0dnQcGhxkYmQ0MjT8+vwMDgyMjozc2twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG+UCQcEgsGo/IpHLJXDweC6Z0+IhEHlOjRGIMWLHZoUZx0RQlAajxkFFKFFYFl5m5KNpIySU+X2bIBEoQZBBZGQdMElFhjI2Oj5AgHQEDAw8dQxYeDBaNHRVWVhWYCXsRFwmMXqFWEyAerB6MA6xWA6+xs7URt6VWqIwTu64gDh4eDp6goaORQ5OVAZjO1EgEGhB4RwAYDQ0YAEwIcBEKFEgYrBhLBORxgUYfrB9LELuF8fNDAAaVBuEg7NXCVyRdqHVCGLBiIIQAB1Yc4BXh9uEbwAXuyi2iQI7DuSwHdiFqCEGDtizLRFUDsaGAlQIbVoJYIEDAIiZBAAAh+QQJCQAbACwAAAAAIAAgAIQEAgSMioxcWlz08vQcHhysqqwMDgx8enwsKiykoqRkZmT8+vzEwsQMCgyUlpQkJiS0srQEBgSMjoxcXlz09vQkIiSsrqwUEhQ0MjRsamz8/vwAAAAAAAAAAAAAAAAAAAAF7+AmjmRpnmiqruz2PG0sIssCj4CQJAIgj4/abRNJaI6agu9kCAQaphdJgEQKUIFjgGWsahJYLdf7RTWfLKr3+jsBClVlG5Xb9eb4fImgUBBKDVB4ExRHFGwbGRQLGXMEhUgUfw2QC4IyCmSNDQtHlm2ZXgoiGQsUjW0EnUgLfyKBeYSeiHojfH61uS0GBisVEgEVLRcWRxAXKAgDRwMILMVIECgSVRIrBmS9JtRI1iMVBweuGxerSNolyszOIhjLGs0jEFXSKA8SEkMbcEgWIxfzNBxrw6AKgxIGkM05UOWALhERHJhysOThBgAVWYQAACH5BAkJABkALAAAAAAgACAAhAQGBIyKjERCRMzOzCwuLGRiZPz6/OTm5AwODLSytFRSVNTW1Dw6PHx6fAwKDJSSlERGRNTS1DQyNGxqbPz+/BQSFLy6vFRWVNza3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAXqYCaO5FgFwxBUZeu61ULNFMa+eBvQdJD/owFvFhkBBAwHsBQZUooZyWF2YOQkBNJu6ANMaQeli0AxSEwymi0DcUJeEgPlbEJFAghRe/h+Eeg/Dl9UYks5DF9VhksOAgKFi5GSSwh5kzgVCXIJNxknD5aSCTwJIw8zD5MITpanFKmSCHI8NxUPoJejNKWXLZkznL0vCJ3CxsckDpA/ChYJFzkTBgYTSxc80C4OswbLLhY8Fi/bMwYAJVgl4DTiL9LUJADrFuci1zTZLwD1IwU8BSQuWLCQb1EDHg2QiSDALYvCDAISJLDy8FIIACH5BAkJAB4ALAAAAAAgACAAhAQGBISGhFRSVNTW1CQiJKyqrGRmZOzu7CwuLIyOjGxubPz6/BQSFGRiZOTi5CwqLLy6vDQ2NIyKjFRWVCQmJKyurGxqbPT29DQyNJSSlHRydPz+/BQWFOzq7AAAAAAAAAXhoCeOJElYClGubOs117YtjWuvxCLLi3qbhc6h4FPsdorfiNI5dige43GT9AAkHUcCwCpMNxVP7tgTJY4J1uF7EBl0M8Ooueuo2SOCIkVa11kVX2E2EmgsFH4yBz4uAAkdHVstBAUHQ4xKmZqbnJ2bAhAQAiURGJ4eE0cTIxgzpp0QRxCsrp6xO7MjpaepO6unKxOhv8DFxsfIJBwaChw2DAkZDEocDjIOzi0ZMhlKUjIaLtsb3T8aR+EtDBkJ0yQUBQVQI9XX2ZsDMgMlyxr3mzE2XEgmotCGAARFIHiQ0FMIACH5BAkJABgALAAAAAAgACAAhAQCBISGhDw+POTi5CwuLLS2tPTy9BQSFJyenGRiZDQ2NIyOjLy+vPz6/BweHIyKjFRSVOzq7DQyNLy6vBQWFHRydDw6PPz+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXICaOZHkcZaquIjVd10SxtFrAcFGrVhBYIwoON9uNAsOA6DCEFTEKBEKxEjQvAtELNxkpGrAGNfW4Plpb2QgxRKjKzfPoVGLj3CnLNUv7hscpSDhKOxJSgDwPP0ZGAACMjAQFDQYFBJA0BAZDBpeYGBQVFUU3TV2YFAMwAzNgTQ2PkBVDFRiuQ7CYszi1pUOnkKmrM5qcnqiiTwQTDQ2Wn9DR0tPUfRKQEBEREDQSFw3XRhEwEd3f4TvjF+XWKgJ8JNnb0QkwCdUlCzAL+CQODAwc9BtIMAQAOw==") !important; + } + .toast-error { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important; + } + .toast-success { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important; + } + .toast-warning { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important; + } + } + &.toast-top-full-width > div, &.toast-bottom-full-width > div { + width: 96%; + margin: auto; + } +} + +.toast { + background-color: $toast; +} + +.toast-success { + background-color: $toastSuccess; +} + +.toast-error { + background-color: $toastError; +} + +.toast-info, .toast-wait { + background-color: $toastInfo; +} + +.toast-warning { + background-color: $toastWarning; +} + +/*Responsive Design*/ +@media all and (max-width: 240px) { + #toast-container { + > div { + padding: 8px 8px 8px 50px; + width: 11em; + } + .toast-close-button { + right: -0.2em; + top: -0.2em; + } + } +} + +@media all and (min-width: 241px) and (max-width: 480px) { + #toast-container { + > div { + padding: 8px 8px 8px 50px; + width: 18em; + } + .toast-close-button { + right: -0.2em; + top: -0.2em; + } + } +} + +@media all and (min-width: 481px) and (max-width: 768px) { + #toast-container > div { + padding: 15px 15px 15px 50px; + width: 25em; + } +} + +/* + * AngularJS-Toaster + * Version 0.3 +*/ + +:not(.no-enter)#toast-container > div.ng-enter, :not(.no-leave)#toast-container > div.ng-leave { + -webkit-transition: 1000ms cubic-bezier(0.25, 0.25, 0.75, 0.75) all; + -moz-transition: 1000ms cubic-bezier(0.25, 0.25, 0.75, 0.75) all; + -ms-transition: 1000ms cubic-bezier(0.25, 0.25, 0.75, 0.75) all; + -o-transition: 1000ms cubic-bezier(0.25, 0.25, 0.75, 0.75) all; + transition: 1000ms cubic-bezier(0.25, 0.25, 0.75, 0.75) all; +} + +:not(.no-enter)#toast-container > div.ng-enter.ng-enter-active { + opacity: 0.8; +} + +:not(.no-leave)#toast-container > div.ng-leave { + opacity: 0.8; + &.ng-leave-active { + opacity: 0; + } +} + +:not(.no-enter)#toast-container > div.ng-enter { + opacity: 0; +} \ No newline at end of file diff --git a/bower_components/Chart.js/.bower.json b/bower_components/Chart.js/.bower.json new file mode 100644 index 0000000..c3f41bf --- /dev/null +++ b/bower_components/Chart.js/.bower.json @@ -0,0 +1,20 @@ +{ + "name": "Chart.js", + "version": "1.0.2", + "description": "Simple HTML5 Charts using the canvas element", + "homepage": "https://github.com/nnnick/Chart.js", + "author": "nnnick", + "main": [ + "Chart.js" + ], + "dependencies": {}, + "_release": "1.0.2", + "_resolution": { + "type": "version", + "tag": "v1.0.2", + "commit": "930b16a0af59201dcfcd1594b0e7540db4d04c9f" + }, + "_source": "git://github.com/nnnick/Chart.js.git", + "_target": "^1.0.0-beta", + "_originalSource": "Chart.js" +} \ No newline at end of file diff --git a/bower_components/Chart.js/.gitignore b/bower_components/Chart.js/.gitignore new file mode 100644 index 0000000..3969d0a --- /dev/null +++ b/bower_components/Chart.js/.gitignore @@ -0,0 +1,7 @@ + +.DS_Store + +node_modules/* +custom/* + +docs/index.md diff --git a/bower_components/Chart.js/.travis.yml b/bower_components/Chart.js/.travis.yml new file mode 100644 index 0000000..c66ea5f --- /dev/null +++ b/bower_components/Chart.js/.travis.yml @@ -0,0 +1,13 @@ +language: node_js +node_js: + - "0.11" + - "0.10" + +before_script: + - npm install + +script: + - gulp test + +notifications: + slack: chartjs:pcfCZR6ugg5TEcaLtmIfQYuA diff --git a/bower_components/Chart.js/CONTRIBUTING.md b/bower_components/Chart.js/CONTRIBUTING.md new file mode 100644 index 0000000..714bdd2 --- /dev/null +++ b/bower_components/Chart.js/CONTRIBUTING.md @@ -0,0 +1,55 @@ +Contributing to Chart.js +======================== + +Contributions to Chart.js are welcome and encouraged, but please have a look through the guidelines in this document before raising an issue, or writing code for the project. + + +Using issues +------------ + +The [issue tracker](https://github.com/nnnick/Chart.js/issues) is the preferred channel for reporting bugs, requesting new features and submitting pull requests. + +If you're suggesting a new chart type, please take a look at [writing new chart types](https://github.com/nnnick/Chart.js/blob/master/docs/06-Advanced.md#writing-new-chart-types) in the documentation, and some of the [community extensions](https://github.com/nnnick/Chart.js/blob/master/docs/06-Advanced.md#community-extensions) that have been created already. + +To keep the library lightweight for everyone, it's unlikely we'll add many more chart types to the core of Chart.js, but issues are a good medium to design and spec out how new chart types could work and look. + +Please do not use issues for support requests. For help using Chart.js, please take a look at the [`chartjs`](http://stackoverflow.com/questions/tagged/chartjs) tag on Stack Overflow. + + +Reporting bugs +-------------- + +Well structured, detailed bug reports are hugely valuable for the project. + +Guidlines for reporting bugs: + + - Check the issue search to see if it has already been reported + - Isolate the problem to a simple test case + - Provide a demonstration of the problem on [JS Bin](http://jsbin.com) or similar + +Please provide any additional details associated with the bug, if it's browser or screen density specific, or only happens with a certain configuration or data. + + +Pull requests +------------- + +Clear, concise pull requests are excellent at continuing the project's community driven growth. But please review [these guidelines](https://github.com/blog/1943-how-to-write-the-perfect-pull-request) and the guidelines below before starting work on the project. + +Guidlines: + + - Please create an issue first: + - For bugs, we can discuss the fixing approach + - For enhancements, we can discuss if it is within the project scope and avoid duplicate effort + - Please make changes to the files in [`/src`](https://github.com/nnnick/Chart.js/tree/master/src), not `Chart.js` or `Chart.min.js` in the repo root directory, this avoids merge conflicts + - Tabs for indentation, not spaces please + - If adding new functionality, please also update the relevant `.md` file in [`/docs`](https://github.com/nnnick/Chart.js/tree/master/docs) + - Please make your commits in logical sections with clear commit messages + +Joining the Project +------------- + - Active committers and contributors are invited to introduce yourself and request commit access to this project. Please send an email to hello@nickdownie.com or file an issue. + +License +------- + +By contributing your code, you agree to license your contribution under the [MIT license](https://github.com/nnnick/Chart.js/blob/master/LICENSE.md). diff --git a/bower_components/Chart.js/Chart.js b/bower_components/Chart.js/Chart.js new file mode 100644 index 0000000..c264262 --- /dev/null +++ b/bower_components/Chart.js/Chart.js @@ -0,0 +1,3477 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 1.0.2 + * + * Copyright 2015 Nick Downie + * Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + */ + + +(function(){ + + "use strict"; + + //Declare root variable - window in the browser, global on the server + var root = this, + previous = root.Chart; + + //Occupy the global variable of Chart, and create a simple base class + var Chart = function(context){ + var chart = this; + this.canvas = context.canvas; + + this.ctx = context; + + //Variables global to the chart + var computeDimension = function(element,dimension) + { + if (element['offset'+dimension]) + { + return element['offset'+dimension]; + } + else + { + return document.defaultView.getComputedStyle(element).getPropertyValue(dimension); + } + } + + var width = this.width = computeDimension(context.canvas,'Width'); + var height = this.height = computeDimension(context.canvas,'Height'); + + // Firefox requires this to work correctly + context.canvas.width = width; + context.canvas.height = height; + + var width = this.width = context.canvas.width; + var height = this.height = context.canvas.height; + this.aspectRatio = this.width / this.height; + //High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale. + helpers.retinaScale(this); + + return this; + }; + //Globally expose the defaults to allow for user updating/changing + Chart.defaults = { + global: { + // Boolean - Whether to animate the chart + animation: true, + + // Number - Number of animation steps + animationSteps: 60, + + // String - Animation easing effect + animationEasing: "easeOutQuart", + + // Boolean - If we should show the scale at all + showScale: true, + + // Boolean - If we want to override with a hard coded scale + scaleOverride: false, + + // ** Required if scaleOverride is true ** + // Number - The number of steps in a hard coded scale + scaleSteps: null, + // Number - The value jump in the hard coded scale + scaleStepWidth: null, + // Number - The scale starting value + scaleStartValue: null, + + // String - Colour of the scale line + scaleLineColor: "rgba(0,0,0,.1)", + + // Number - Pixel width of the scale line + scaleLineWidth: 1, + + // Boolean - Whether to show labels on the scale + scaleShowLabels: true, + + // Interpolated JS string - can access value + scaleLabel: "<%=value%>", + + // Boolean - Whether the scale should stick to integers, and not show any floats even if drawing space is there + scaleIntegersOnly: true, + + // Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero: false, + + // String - Scale label font declaration for the scale label + scaleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Scale label font size in pixels + scaleFontSize: 12, + + // String - Scale label font weight style + scaleFontStyle: "normal", + + // String - Scale label font colour + scaleFontColor: "#666", + + // Boolean - whether or not the chart should be responsive and resize when the browser does. + responsive: false, + + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + + // Boolean - Determines whether to draw tooltips on the canvas or not - attaches events to touchmove & mousemove + showTooltips: true, + + // Boolean - Determines whether to draw built-in tooltip or call custom tooltip function + customTooltips: false, + + // Array - Array of string names to attach tooltip events + tooltipEvents: ["mousemove", "touchstart", "touchmove", "mouseout"], + + // String - Tooltip background colour + tooltipFillColor: "rgba(0,0,0,0.8)", + + // String - Tooltip label font declaration for the scale label + tooltipFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip label font size in pixels + tooltipFontSize: 14, + + // String - Tooltip font weight style + tooltipFontStyle: "normal", + + // String - Tooltip label font colour + tooltipFontColor: "#fff", + + // String - Tooltip title font declaration for the scale label + tooltipTitleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip title font size in pixels + tooltipTitleFontSize: 14, + + // String - Tooltip title font weight style + tooltipTitleFontStyle: "bold", + + // String - Tooltip title font colour + tooltipTitleFontColor: "#fff", + + // Number - pixel width of padding around tooltip text + tooltipYPadding: 6, + + // Number - pixel width of padding around tooltip text + tooltipXPadding: 6, + + // Number - Size of the caret on the tooltip + tooltipCaretSize: 8, + + // Number - Pixel radius of the tooltip border + tooltipCornerRadius: 6, + + // Number - Pixel offset from point x to tooltip edge + tooltipXOffset: 10, + + // String - Template string for single tooltips + tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>", + + // String - Template string for single tooltips + multiTooltipTemplate: "<%= value %>", + + // String - Colour behind the legend colour block + multiTooltipKeyBackground: '#fff', + + // Function - Will fire on animation progression. + onAnimationProgress: function(){}, + + // Function - Will fire on animation completion. + onAnimationComplete: function(){} + + } + }; + + //Create a dictionary of chart types, to allow for extension of existing types + Chart.types = {}; + + //Global Chart helpers object for utility methods and classes + var helpers = Chart.helpers = {}; + + //-- Basic js utility methods + var each = helpers.each = function(loopable,callback,self){ + var additionalArgs = Array.prototype.slice.call(arguments, 3); + // Check to see if null or undefined firstly. + if (loopable){ + if (loopable.length === +loopable.length){ + var i; + for (i=0; i= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)){ + return currentItem; + } + } + }, + inherits = helpers.inherits = function(extensions){ + //Basic javascript inheritance based on the model created in Backbone.js + var parent = this; + var ChartElement = (extensions && extensions.hasOwnProperty("constructor")) ? extensions.constructor : function(){ return parent.apply(this, arguments); }; + + var Surrogate = function(){ this.constructor = ChartElement;}; + Surrogate.prototype = parent.prototype; + ChartElement.prototype = new Surrogate(); + + ChartElement.extend = inherits; + + if (extensions) extend(ChartElement.prototype, extensions); + + ChartElement.__super__ = parent.prototype; + + return ChartElement; + }, + noop = helpers.noop = function(){}, + uid = helpers.uid = (function(){ + var id=0; + return function(){ + return "chart-" + id++; + }; + })(), + warn = helpers.warn = function(str){ + //Method for warning of errors + if (window.console && typeof window.console.warn == "function") console.warn(str); + }, + amd = helpers.amd = (typeof define == 'function' && define.amd), + //-- Math methods + isNumber = helpers.isNumber = function(n){ + return !isNaN(parseFloat(n)) && isFinite(n); + }, + max = helpers.max = function(array){ + return Math.max.apply( Math, array ); + }, + min = helpers.min = function(array){ + return Math.min.apply( Math, array ); + }, + cap = helpers.cap = function(valueToCap,maxValue,minValue){ + if(isNumber(maxValue)) { + if( valueToCap > maxValue ) { + return maxValue; + } + } + else if(isNumber(minValue)){ + if ( valueToCap < minValue ){ + return minValue; + } + } + return valueToCap; + }, + getDecimalPlaces = helpers.getDecimalPlaces = function(num){ + if (num%1!==0 && isNumber(num)){ + return num.toString().split(".")[1].length; + } + else { + return 0; + } + }, + toRadians = helpers.radians = function(degrees){ + return degrees * (Math.PI/180); + }, + // Gets the angle from vertical upright to the point about a centre. + getAngleFromPoint = 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.PI * 2 + Math.atan2(distanceFromYCenter, distanceFromXCenter); + + //If the segment is in the top left quadrant, we need to add another rotation to the angle + if (distanceFromXCenter < 0 && distanceFromYCenter < 0){ + angle += Math.PI*2; + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }, + aliasPixel = helpers.aliasPixel = function(pixelWidth){ + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }, + splineCurve = helpers.splineCurve = function(FirstPoint,MiddlePoint,AfterPoint,t){ + //Props to Rob Spencer at scaled innovation for his post on splining between points + //http://scaledinnovation.com/analytics/splines/aboutSplines.html + var d01=Math.sqrt(Math.pow(MiddlePoint.x-FirstPoint.x,2)+Math.pow(MiddlePoint.y-FirstPoint.y,2)), + d12=Math.sqrt(Math.pow(AfterPoint.x-MiddlePoint.x,2)+Math.pow(AfterPoint.y-MiddlePoint.y,2)), + fa=t*d01/(d01+d12),// scaling factor for triangle Ta + fb=t*d12/(d01+d12); + return { + inner : { + x : MiddlePoint.x-fa*(AfterPoint.x-FirstPoint.x), + y : MiddlePoint.y-fa*(AfterPoint.y-FirstPoint.y) + }, + outer : { + x: MiddlePoint.x+fb*(AfterPoint.x-FirstPoint.x), + y : MiddlePoint.y+fb*(AfterPoint.y-FirstPoint.y) + } + }; + }, + calculateOrderOfMagnitude = helpers.calculateOrderOfMagnitude = function(val){ + return Math.floor(Math.log(val) / Math.LN10); + }, + calculateScaleRange = helpers.calculateScaleRange = function(valuesArray, drawingSize, textSize, startFromZero, integersOnly){ + + //Set a minimum step of two - a point at the top of the graph, and a point at the base + var minSteps = 2, + maxSteps = Math.floor(drawingSize/(textSize * 1.5)), + skipFitting = (minSteps >= maxSteps); + + var maxValue = max(valuesArray), + minValue = min(valuesArray); + + // We need some degree of seperation here to calculate the scales if all the values are the same + // Adding/minusing 0.5 will give us a range of 1. + if (maxValue === minValue){ + maxValue += 0.5; + // So we don't end up with a graph with a negative start value if we've said always start from zero + if (minValue >= 0.5 && !startFromZero){ + minValue -= 0.5; + } + else{ + // Make up a whole number above the values + maxValue += 0.5; + } + } + + var valueRange = Math.abs(maxValue - minValue), + rangeOrderOfMagnitude = calculateOrderOfMagnitude(valueRange), + graphMax = Math.ceil(maxValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude), + graphMin = (startFromZero) ? 0 : Math.floor(minValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude), + graphRange = graphMax - graphMin, + stepValue = Math.pow(10, rangeOrderOfMagnitude), + numberOfSteps = Math.round(graphRange / stepValue); + + //If we have more space on the graph we'll use it to give more definition to the data + while((numberOfSteps > maxSteps || (numberOfSteps * 2) < maxSteps) && !skipFitting) { + if(numberOfSteps > maxSteps){ + stepValue *=2; + numberOfSteps = Math.round(graphRange/stepValue); + // Don't ever deal with a decimal number of steps - cancel fitting and just use the minimum number of steps. + if (numberOfSteps % 1 !== 0){ + skipFitting = true; + } + } + //We can fit in double the amount of scale points on the scale + else{ + //If user has declared ints only, and the step value isn't a decimal + if (integersOnly && rangeOrderOfMagnitude >= 0){ + //If the user has said integers only, we need to check that making the scale more granular wouldn't make it a float + if(stepValue/2 % 1 === 0){ + stepValue /=2; + numberOfSteps = Math.round(graphRange/stepValue); + } + //If it would make it a float break out of the loop + else{ + break; + } + } + //If the scale doesn't have to be an int, make the scale more granular anyway. + else{ + stepValue /=2; + numberOfSteps = Math.round(graphRange/stepValue); + } + + } + } + + if (skipFitting){ + numberOfSteps = minSteps; + stepValue = graphRange / numberOfSteps; + } + + return { + steps : numberOfSteps, + stepValue : stepValue, + min : graphMin, + max : graphMin + (numberOfSteps * stepValue) + }; + + }, + /* jshint ignore:start */ + // Blows up jshint errors based on the new Function constructor + //Templating methods + //Javascript micro templating by John Resig - source at http://ejohn.org/blog/javascript-micro-templating/ + template = helpers.template = function(templateString, valuesObject){ + + // If templateString is function rather than string-template - call the function for valuesObject + + if(templateString instanceof Function){ + return templateString(valuesObject); + } + + var cache = {}; + function tmpl(str, data){ + // Figure out if we're getting a template, or if we need to + // load the template - and be sure to cache the result. + var fn = !/\W/.test(str) ? + cache[str] = cache[str] : + + // Generate a reusable function that will serve as a template + // generator (and which will be cached). + new Function("obj", + "var p=[],print=function(){p.push.apply(p,arguments);};" + + + // Introduce the data as local variables using with(){} + "with(obj){p.push('" + + + // Convert the template into pure JavaScript + str + .replace(/[\r\t\n]/g, " ") + .split("<%").join("\t") + .replace(/((^|%>)[^\t]*)'/g, "$1\r") + .replace(/\t=(.*?)%>/g, "',$1,'") + .split("\t").join("');") + .split("%>").join("p.push('") + .split("\r").join("\\'") + + "');}return p.join('');" + ); + + // Provide some basic currying to the user + return data ? fn( data ) : fn; + } + return tmpl(templateString,valuesObject); + }, + /* jshint ignore:end */ + generateLabels = helpers.generateLabels = function(templateString,numberOfSteps,graphMin,stepValue){ + var labelsArray = new Array(numberOfSteps); + if (labelTemplateString){ + each(labelsArray,function(val,index){ + labelsArray[index] = template(templateString,{value: (graphMin + (stepValue*(index+1)))}); + }); + } + return labelsArray; + }, + //--Animation methods + //Easing functions adapted from Robert Penner's easing equations + //http://www.robertpenner.com/easing/ + 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 (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p)); + }, + easeOutElastic: 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 (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + return a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1; + }, + easeInOutElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) return 0; + if ((t /= 1 / 2) == 2) return 1; + if (!p) p = 1 * (0.3 * 1.5); + if (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + if (t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p)); + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function (t) { + var s = 1.70158; + return 1 * (t /= 1) * t * ((s + 1) * t - s); + }, + easeOutBack: function (t) { + var s = 1.70158; + return 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1); + }, + easeInOutBack: function (t) { + var s = 1.70158; + if ((t /= 1 / 2) < 1) return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)); + return 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + easeInBounce: function (t) { + return 1 - easingEffects.easeOutBounce(1 - t); + }, + easeOutBounce: function (t) { + if ((t /= 1) < (1 / 2.75)) { + return 1 * (7.5625 * t * t); + } else if (t < (2 / 2.75)) { + return 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75); + } else if (t < (2.5 / 2.75)) { + return 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375); + } else { + return 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375); + } + }, + easeInOutBounce: function (t) { + if (t < 1 / 2) return easingEffects.easeInBounce(t * 2) * 0.5; + return easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5; + } + }, + //Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + requestAnimFrame = helpers.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(), + cancelAnimFrame = helpers.cancelAnimFrame = (function(){ + return window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + window.msCancelAnimationFrame || + function(callback) { + return window.clearTimeout(callback, 1000 / 60); + }; + })(), + animationLoop = helpers.animationLoop = function(callback,totalSteps,easingString,onProgress,onComplete,chartInstance){ + + var currentStep = 0, + easingFunction = easingEffects[easingString] || easingEffects.linear; + + var animationFrame = function(){ + currentStep++; + var stepDecimal = currentStep/totalSteps; + var easeDecimal = easingFunction(stepDecimal); + + callback.call(chartInstance,easeDecimal,stepDecimal, currentStep); + onProgress.call(chartInstance,easeDecimal,stepDecimal); + if (currentStep < totalSteps){ + chartInstance.animationFrame = requestAnimFrame(animationFrame); + } else{ + onComplete.apply(chartInstance); + } + }; + requestAnimFrame(animationFrame); + }, + //-- DOM methods + getRelativePosition = helpers.getRelativePosition = function(evt){ + var mouseX, mouseY; + var e = evt.originalEvent || evt, + canvas = evt.currentTarget || evt.srcElement, + boundingRect = canvas.getBoundingClientRect(); + + if (e.touches){ + mouseX = e.touches[0].clientX - boundingRect.left; + mouseY = e.touches[0].clientY - boundingRect.top; + + } + else{ + mouseX = e.clientX - boundingRect.left; + mouseY = e.clientY - boundingRect.top; + } + + return { + x : mouseX, + y : mouseY + }; + + }, + addEvent = 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; + } + }, + removeEvent = 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] = noop; + } + }, + bindEvents = helpers.bindEvents = function(chartInstance, arrayOfEvents, handler){ + // Create the events object if it's not already present + if (!chartInstance.events) chartInstance.events = {}; + + each(arrayOfEvents,function(eventName){ + chartInstance.events[eventName] = function(){ + handler.apply(chartInstance, arguments); + }; + addEvent(chartInstance.chart.canvas,eventName,chartInstance.events[eventName]); + }); + }, + unbindEvents = helpers.unbindEvents = function (chartInstance, arrayOfEvents) { + each(arrayOfEvents, function(handler,eventName){ + removeEvent(chartInstance.chart.canvas, eventName, handler); + }); + }, + getMaximumWidth = helpers.getMaximumWidth = function(domNode){ + var container = domNode.parentNode; + // TODO = check cross browser stuff with this. + return container.clientWidth; + }, + getMaximumHeight = helpers.getMaximumHeight = function(domNode){ + var container = domNode.parentNode; + // TODO = check cross browser stuff with this. + return container.clientHeight; + }, + getMaximumSize = helpers.getMaximumSize = helpers.getMaximumWidth, // legacy support + retinaScale = helpers.retinaScale = function(chart){ + var ctx = chart.ctx, + width = chart.canvas.width, + height = chart.canvas.height; + + if (window.devicePixelRatio) { + ctx.canvas.style.width = width + "px"; + ctx.canvas.style.height = height + "px"; + ctx.canvas.height = height * window.devicePixelRatio; + ctx.canvas.width = width * window.devicePixelRatio; + ctx.scale(window.devicePixelRatio, window.devicePixelRatio); + } + }, + //-- Canvas methods + clear = helpers.clear = function(chart){ + chart.ctx.clearRect(0,0,chart.width,chart.height); + }, + fontString = helpers.fontString = function(pixelSize,fontStyle,fontFamily){ + return fontStyle + " " + pixelSize+"px " + fontFamily; + }, + longestText = helpers.longestText = function(ctx,font,arrayOfStrings){ + ctx.font = font; + var longest = 0; + each(arrayOfStrings,function(string){ + var textWidth = ctx.measureText(string).width; + longest = (textWidth > longest) ? textWidth : longest; + }); + return longest; + }, + drawRoundedRectangle = 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(); + }; + + + //Store a reference to each instance - allowing us to globally resize chart instances on window resize. + //Destroy method on the chart will remove the instance of the chart from this reference. + Chart.instances = {}; + + Chart.Type = function(data,options,chart){ + this.options = options; + this.chart = chart; + this.id = uid(); + //Add the chart instance to the global namespace + Chart.instances[this.id] = this; + + // Initialize is always called when a chart type is created + // By default it is a no op, but it should be extended + if (options.responsive){ + this.resize(); + } + this.initialize.call(this,data); + }; + + //Core methods that'll be a part of every chart type + extend(Chart.Type.prototype,{ + initialize : function(){return this;}, + clear : function(){ + clear(this.chart); + return this; + }, + stop : function(){ + // Stops any current animation loop occuring + cancelAnimFrame(this.animationFrame); + return this; + }, + resize : function(callback){ + this.stop(); + var canvas = this.chart.canvas, + newWidth = getMaximumWidth(this.chart.canvas), + newHeight = this.options.maintainAspectRatio ? newWidth / this.chart.aspectRatio : getMaximumHeight(this.chart.canvas); + + canvas.width = this.chart.width = newWidth; + canvas.height = this.chart.height = newHeight; + + retinaScale(this.chart); + + if (typeof callback === "function"){ + callback.apply(this, Array.prototype.slice.call(arguments, 1)); + } + return this; + }, + reflow : noop, + render : function(reflow){ + if (reflow){ + this.reflow(); + } + if (this.options.animation && !reflow){ + helpers.animationLoop( + this.draw, + this.options.animationSteps, + this.options.animationEasing, + this.options.onAnimationProgress, + this.options.onAnimationComplete, + this + ); + } + else{ + this.draw(); + this.options.onAnimationComplete.call(this); + } + return this; + }, + generateLegend : function(){ + return template(this.options.legendTemplate,this); + }, + destroy : function(){ + this.clear(); + unbindEvents(this, this.events); + var canvas = this.chart.canvas; + + // Reset canvas height/width attributes starts a fresh with the canvas context + canvas.width = this.chart.width; + canvas.height = this.chart.height; + + // < IE9 doesn't support removeProperty + if (canvas.style.removeProperty) { + canvas.style.removeProperty('width'); + canvas.style.removeProperty('height'); + } else { + canvas.style.removeAttribute('width'); + canvas.style.removeAttribute('height'); + } + + delete Chart.instances[this.id]; + }, + showTooltip : function(ChartElements, forceRedraw){ + // Only redraw the chart if we've actually changed what we're hovering on. + if (typeof this.activeElements === 'undefined') this.activeElements = []; + + var isChanged = (function(Elements){ + var changed = false; + + if (Elements.length !== this.activeElements.length){ + changed = true; + return changed; + } + + each(Elements, function(element, index){ + if (element !== this.activeElements[index]){ + changed = true; + } + }, this); + return changed; + }).call(this, ChartElements); + + if (!isChanged && !forceRedraw){ + return; + } + else{ + this.activeElements = ChartElements; + } + this.draw(); + if(this.options.customTooltips){ + this.options.customTooltips(false); + } + if (ChartElements.length > 0){ + // If we have multiple datasets, show a MultiTooltip for all of the data points at that index + if (this.datasets && this.datasets.length > 1) { + var dataArray, + dataIndex; + + for (var i = this.datasets.length - 1; i >= 0; i--) { + dataArray = this.datasets[i].points || this.datasets[i].bars || this.datasets[i].segments; + dataIndex = indexOf(dataArray, ChartElements[0]); + if (dataIndex !== -1){ + break; + } + } + var tooltipLabels = [], + tooltipColors = [], + medianPosition = (function(index) { + + // Get all the points at that particular index + var Elements = [], + dataCollection, + xPositions = [], + yPositions = [], + xMax, + yMax, + xMin, + yMin; + helpers.each(this.datasets, function(dataset){ + dataCollection = dataset.points || dataset.bars || dataset.segments; + if (dataCollection[dataIndex] && dataCollection[dataIndex].hasValue()){ + Elements.push(dataCollection[dataIndex]); + } + }); + + helpers.each(Elements, function(element) { + xPositions.push(element.x); + yPositions.push(element.y); + + + //Include any colour information about the element + tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, element)); + tooltipColors.push({ + fill: element._saved.fillColor || element.fillColor, + stroke: element._saved.strokeColor || element.strokeColor + }); + + }, this); + + yMin = min(yPositions); + yMax = max(yPositions); + + xMin = min(xPositions); + xMax = max(xPositions); + + return { + x: (xMin > this.chart.width/2) ? xMin : xMax, + y: (yMin + yMax)/2 + }; + }).call(this, dataIndex); + + new Chart.MultiTooltip({ + x: medianPosition.x, + y: medianPosition.y, + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + xOffset: this.options.tooltipXOffset, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + titleTextColor: this.options.tooltipTitleFontColor, + titleFontFamily: this.options.tooltipTitleFontFamily, + titleFontStyle: this.options.tooltipTitleFontStyle, + titleFontSize: this.options.tooltipTitleFontSize, + cornerRadius: this.options.tooltipCornerRadius, + labels: tooltipLabels, + legendColors: tooltipColors, + legendColorBackground : this.options.multiTooltipKeyBackground, + title: ChartElements[0].label, + chart: this.chart, + ctx: this.chart.ctx, + custom: this.options.customTooltips + }).draw(); + + } else { + each(ChartElements, function(Element) { + var tooltipPosition = Element.tooltipPosition(); + new Chart.Tooltip({ + x: Math.round(tooltipPosition.x), + y: Math.round(tooltipPosition.y), + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + caretHeight: this.options.tooltipCaretSize, + cornerRadius: this.options.tooltipCornerRadius, + text: template(this.options.tooltipTemplate, Element), + chart: this.chart, + custom: this.options.customTooltips + }).draw(); + }, this); + } + } + return this; + }, + toBase64Image : function(){ + return this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments); + } + }); + + Chart.Type.extend = function(extensions){ + + var parent = this; + + var ChartType = function(){ + return parent.apply(this,arguments); + }; + + //Copy the prototype object of the this class + ChartType.prototype = clone(parent.prototype); + //Now overwrite some of the properties in the base class with the new extensions + extend(ChartType.prototype, extensions); + + ChartType.extend = Chart.Type.extend; + + if (extensions.name || parent.prototype.name){ + + var chartName = extensions.name || parent.prototype.name; + //Assign any potential default values of the new chart type + + //If none are defined, we'll use a clone of the chart type this is being extended from. + //I.e. if we extend a line chart, we'll use the defaults from the line chart if our new chart + //doesn't define some defaults of their own. + + var baseDefaults = (Chart.defaults[parent.prototype.name]) ? clone(Chart.defaults[parent.prototype.name]) : {}; + + Chart.defaults[chartName] = extend(baseDefaults,extensions.defaults); + + Chart.types[chartName] = ChartType; + + //Register this new chart type in the Chart prototype + Chart.prototype[chartName] = function(data,options){ + var config = merge(Chart.defaults.global, Chart.defaults[chartName], options || {}); + return new ChartType(data,config,this); + }; + } else{ + warn("Name not provided for this chart, so it hasn't been registered"); + } + return parent; + }; + + Chart.Element = function(configuration){ + extend(this,configuration); + this.initialize.apply(this,arguments); + this.save(); + }; + extend(Chart.Element.prototype,{ + initialize : function(){}, + restore : function(props){ + if (!props){ + extend(this,this._saved); + } else { + each(props,function(key){ + this[key] = this._saved[key]; + },this); + } + return this; + }, + save : function(){ + this._saved = clone(this); + delete this._saved._saved; + return this; + }, + update : function(newProps){ + each(newProps,function(value,key){ + this._saved[key] = this[key]; + this[key] = value; + },this); + return this; + }, + transition : function(props,ease){ + each(props,function(value,key){ + this[key] = ((value - this._saved[key]) * ease) + this._saved[key]; + },this); + return this; + }, + tooltipPosition : function(){ + return { + x : this.x, + y : this.y + }; + }, + hasValue: function(){ + return isNumber(this.value); + } + }); + + Chart.Element.extend = inherits; + + + Chart.Point = Chart.Element.extend({ + display: true, + inRange: function(chartX,chartY){ + var hitDetectionRange = this.hitDetectionRadius + this.radius; + return ((Math.pow(chartX-this.x, 2)+Math.pow(chartY-this.y, 2)) < Math.pow(hitDetectionRange,2)); + }, + draw : function(){ + if (this.display){ + var ctx = this.ctx; + ctx.beginPath(); + + ctx.arc(this.x, this.y, this.radius, 0, Math.PI*2); + ctx.closePath(); + + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + ctx.fillStyle = this.fillColor; + + ctx.fill(); + ctx.stroke(); + } + + + //Quick debug for bezier curve splining + //Highlights control points and the line between them. + //Handy for dev - stripped in the min version. + + // ctx.save(); + // ctx.fillStyle = "black"; + // ctx.strokeStyle = "black" + // ctx.beginPath(); + // ctx.arc(this.controlPoints.inner.x,this.controlPoints.inner.y, 2, 0, Math.PI*2); + // ctx.fill(); + + // ctx.beginPath(); + // ctx.arc(this.controlPoints.outer.x,this.controlPoints.outer.y, 2, 0, Math.PI*2); + // ctx.fill(); + + // ctx.moveTo(this.controlPoints.inner.x,this.controlPoints.inner.y); + // ctx.lineTo(this.x, this.y); + // ctx.lineTo(this.controlPoints.outer.x,this.controlPoints.outer.y); + // ctx.stroke(); + + // ctx.restore(); + + + + } + }); + + Chart.Arc = Chart.Element.extend({ + inRange : function(chartX,chartY){ + + var pointRelativePosition = helpers.getAngleFromPoint(this, { + x: chartX, + y: chartY + }); + + //Check if within the range of the open/close angle + var betweenAngles = (pointRelativePosition.angle >= this.startAngle && pointRelativePosition.angle <= this.endAngle), + withinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius); + + return (betweenAngles && withinRadius); + //Ensure within the outside of the arc centre, but inside arc outer + }, + tooltipPosition : function(){ + var centreAngle = this.startAngle + ((this.endAngle - this.startAngle) / 2), + rangeFromCentre = (this.outerRadius - this.innerRadius) / 2 + this.innerRadius; + return { + x : this.x + (Math.cos(centreAngle) * rangeFromCentre), + y : this.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + draw : function(animationPercent){ + + var easingDecimal = animationPercent || 1; + + var ctx = this.ctx; + + ctx.beginPath(); + + ctx.arc(this.x, this.y, this.outerRadius, this.startAngle, this.endAngle); + + ctx.arc(this.x, this.y, this.innerRadius, this.endAngle, this.startAngle, true); + + ctx.closePath(); + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + ctx.fillStyle = this.fillColor; + + ctx.fill(); + ctx.lineJoin = 'bevel'; + + if (this.showStroke){ + ctx.stroke(); + } + } + }); + + Chart.Rectangle = Chart.Element.extend({ + draw : function(){ + var ctx = this.ctx, + halfWidth = this.width/2, + leftX = this.x - halfWidth, + rightX = this.x + halfWidth, + top = this.base - (this.base - this.y), + halfStroke = this.strokeWidth / 2; + + // Canvas doesn't allow us to stroke inside the width so we can + // adjust the sizes to fit if we're setting a stroke on the line + if (this.showStroke){ + leftX += halfStroke; + rightX -= halfStroke; + top += halfStroke; + } + + ctx.beginPath(); + + ctx.fillStyle = this.fillColor; + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + // It'd be nice to keep this class totally generic to any rectangle + // and simply specify which border to miss out. + ctx.moveTo(leftX, this.base); + ctx.lineTo(leftX, top); + ctx.lineTo(rightX, top); + ctx.lineTo(rightX, this.base); + ctx.fill(); + if (this.showStroke){ + ctx.stroke(); + } + }, + height : function(){ + return this.base - this.y; + }, + inRange : function(chartX,chartY){ + return (chartX >= this.x - this.width/2 && chartX <= this.x + this.width/2) && (chartY >= this.y && chartY <= this.base); + } + }); + + Chart.Tooltip = Chart.Element.extend({ + draw : function(){ + + var ctx = this.chart.ctx; + + ctx.font = fontString(this.fontSize,this.fontStyle,this.fontFamily); + + this.xAlign = "center"; + this.yAlign = "above"; + + //Distance between the actual element.y position and the start of the tooltip caret + var caretPadding = this.caretPadding = 2; + + var tooltipWidth = ctx.measureText(this.text).width + 2*this.xPadding, + tooltipRectHeight = this.fontSize + 2*this.yPadding, + tooltipHeight = tooltipRectHeight + this.caretHeight + caretPadding; + + if (this.x + tooltipWidth/2 >this.chart.width){ + this.xAlign = "left"; + } else if (this.x - tooltipWidth/2 < 0){ + this.xAlign = "right"; + } + + if (this.y - tooltipHeight < 0){ + this.yAlign = "below"; + } + + + var tooltipX = this.x - tooltipWidth/2, + tooltipY = this.y - tooltipHeight; + + ctx.fillStyle = this.fillColor; + + // Custom Tooltips + if(this.custom){ + this.custom(this); + } + else{ + switch(this.yAlign) + { + case "above": + //Draw a caret above the x/y + ctx.beginPath(); + ctx.moveTo(this.x,this.y - caretPadding); + ctx.lineTo(this.x + this.caretHeight, this.y - (caretPadding + this.caretHeight)); + ctx.lineTo(this.x - this.caretHeight, this.y - (caretPadding + this.caretHeight)); + ctx.closePath(); + ctx.fill(); + break; + case "below": + tooltipY = this.y + caretPadding + this.caretHeight; + //Draw a caret below the x/y + ctx.beginPath(); + ctx.moveTo(this.x, this.y + caretPadding); + ctx.lineTo(this.x + this.caretHeight, this.y + caretPadding + this.caretHeight); + ctx.lineTo(this.x - this.caretHeight, this.y + caretPadding + this.caretHeight); + ctx.closePath(); + ctx.fill(); + break; + } + + switch(this.xAlign) + { + case "left": + tooltipX = this.x - tooltipWidth + (this.cornerRadius + this.caretHeight); + break; + case "right": + tooltipX = this.x - (this.cornerRadius + this.caretHeight); + break; + } + + drawRoundedRectangle(ctx,tooltipX,tooltipY,tooltipWidth,tooltipRectHeight,this.cornerRadius); + + ctx.fill(); + + ctx.fillStyle = this.textColor; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(this.text, tooltipX + tooltipWidth/2, tooltipY + tooltipRectHeight/2); + } + } + }); + + Chart.MultiTooltip = Chart.Element.extend({ + initialize : function(){ + this.font = fontString(this.fontSize,this.fontStyle,this.fontFamily); + + this.titleFont = fontString(this.titleFontSize,this.titleFontStyle,this.titleFontFamily); + + this.height = (this.labels.length * this.fontSize) + ((this.labels.length-1) * (this.fontSize/2)) + (this.yPadding*2) + this.titleFontSize *1.5; + + this.ctx.font = this.titleFont; + + var titleWidth = this.ctx.measureText(this.title).width, + //Label has a legend square as well so account for this. + labelWidth = longestText(this.ctx,this.font,this.labels) + this.fontSize + 3, + longestTextWidth = max([labelWidth,titleWidth]); + + this.width = longestTextWidth + (this.xPadding*2); + + + var halfHeight = this.height/2; + + //Check to ensure the height will fit on the canvas + if (this.y - halfHeight < 0 ){ + this.y = halfHeight; + } else if (this.y + halfHeight > this.chart.height){ + this.y = this.chart.height - halfHeight; + } + + //Decide whether to align left or right based on position on canvas + if (this.x > this.chart.width/2){ + this.x -= this.xOffset + this.width; + } else { + this.x += this.xOffset; + } + + + }, + getLineHeight : function(index){ + var baseLineHeight = this.y - (this.height/2) + this.yPadding, + afterTitleIndex = index-1; + + //If the index is zero, we're getting the title + if (index === 0){ + return baseLineHeight + this.titleFontSize/2; + } else{ + return baseLineHeight + ((this.fontSize*1.5*afterTitleIndex) + this.fontSize/2) + this.titleFontSize * 1.5; + } + + }, + draw : function(){ + // Custom Tooltips + if(this.custom){ + this.custom(this); + } + else{ + drawRoundedRectangle(this.ctx,this.x,this.y - this.height/2,this.width,this.height,this.cornerRadius); + var ctx = this.ctx; + ctx.fillStyle = this.fillColor; + ctx.fill(); + ctx.closePath(); + + ctx.textAlign = "left"; + ctx.textBaseline = "middle"; + ctx.fillStyle = this.titleTextColor; + ctx.font = this.titleFont; + + ctx.fillText(this.title,this.x + this.xPadding, this.getLineHeight(0)); + + ctx.font = this.font; + helpers.each(this.labels,function(label,index){ + ctx.fillStyle = this.textColor; + ctx.fillText(label,this.x + this.xPadding + this.fontSize + 3, this.getLineHeight(index + 1)); + + //A bit gnarly, but clearing this rectangle breaks when using explorercanvas (clears whole canvas) + //ctx.clearRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + //Instead we'll make a white filled block to put the legendColour palette over. + + ctx.fillStyle = this.legendColorBackground; + ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + + ctx.fillStyle = this.legendColors[index].fill; + ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + + + },this); + } + } + }); + + Chart.Scale = Chart.Element.extend({ + initialize : function(){ + this.fit(); + }, + buildYLabels : function(){ + this.yLabels = []; + + var stepDecimalPlaces = getDecimalPlaces(this.stepValue); + + for (var i=0; i<=this.steps; i++){ + this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)})); + } + this.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx,this.font,this.yLabels) : 0; + }, + addXLabel : function(label){ + this.xLabels.push(label); + this.valuesCount++; + this.fit(); + }, + removeXLabel : function(){ + this.xLabels.shift(); + this.valuesCount--; + this.fit(); + }, + // Fitting loop to rotate x Labels and figure out what fits there, and also calculate how many Y steps to use + fit: function(){ + // First we need the width of the yLabels, assuming the xLabels aren't rotated + + // To do that we need the base line at the top and base of the chart, assuming there is no x label rotation + this.startPoint = (this.display) ? this.fontSize : 0; + this.endPoint = (this.display) ? this.height - (this.fontSize * 1.5) - 5 : this.height; // -5 to pad labels + + // Apply padding settings to the start and end point. + this.startPoint += this.padding; + this.endPoint -= this.padding; + + // Cache the starting height, so can determine if we need to recalculate the scale yAxis + var cachedHeight = this.endPoint - this.startPoint, + cachedYLabelWidth; + + // Build the current yLabels so we have an idea of what size they'll be to start + /* + * This sets what is returned from calculateScaleRange as static properties of this class: + * + this.steps; + this.stepValue; + this.min; + this.max; + * + */ + this.calculateYRange(cachedHeight); + + // With these properties set we can now build the array of yLabels + // and also the width of the largest yLabel + this.buildYLabels(); + + this.calculateXLabelRotation(); + + while((cachedHeight > this.endPoint - this.startPoint)){ + cachedHeight = this.endPoint - this.startPoint; + cachedYLabelWidth = this.yLabelWidth; + + this.calculateYRange(cachedHeight); + this.buildYLabels(); + + // Only go through the xLabel loop again if the yLabel width has changed + if (cachedYLabelWidth < this.yLabelWidth){ + this.calculateXLabelRotation(); + } + } + + }, + calculateXLabelRotation : function(){ + //Get the width of each grid by calculating the difference + //between x offsets between 0 and 1. + + this.ctx.font = this.font; + + var firstWidth = this.ctx.measureText(this.xLabels[0]).width, + lastWidth = this.ctx.measureText(this.xLabels[this.xLabels.length - 1]).width, + firstRotated, + lastRotated; + + + this.xScalePaddingRight = lastWidth/2 + 3; + this.xScalePaddingLeft = (firstWidth/2 > this.yLabelWidth + 10) ? firstWidth/2 : this.yLabelWidth + 10; + + this.xLabelRotation = 0; + if (this.display){ + var originalLabelWidth = longestText(this.ctx,this.font,this.xLabels), + cosRotation, + firstRotatedWidth; + this.xLabelWidth = originalLabelWidth; + //Allow 3 pixels x2 padding either side for label readability + var xGridWidth = Math.floor(this.calculateX(1) - this.calculateX(0)) - 6; + + //Max label rotate should be 90 - also act as a loop counter + while ((this.xLabelWidth > xGridWidth && this.xLabelRotation === 0) || (this.xLabelWidth > xGridWidth && this.xLabelRotation <= 90 && this.xLabelRotation > 0)){ + cosRotation = Math.cos(toRadians(this.xLabelRotation)); + + firstRotated = cosRotation * firstWidth; + lastRotated = cosRotation * lastWidth; + + // We're right aligning the text now. + if (firstRotated + this.fontSize / 2 > this.yLabelWidth + 8){ + this.xScalePaddingLeft = firstRotated + this.fontSize / 2; + } + this.xScalePaddingRight = this.fontSize/2; + + + this.xLabelRotation++; + this.xLabelWidth = cosRotation * originalLabelWidth; + + } + if (this.xLabelRotation > 0){ + this.endPoint -= Math.sin(toRadians(this.xLabelRotation))*originalLabelWidth + 3; + } + } + else{ + this.xLabelWidth = 0; + this.xScalePaddingRight = this.padding; + this.xScalePaddingLeft = this.padding; + } + + }, + // Needs to be overidden in each Chart type + // Otherwise we need to pass all the data into the scale class + calculateYRange: noop, + drawingArea: function(){ + return this.startPoint - this.endPoint; + }, + calculateY : function(value){ + var scalingFactor = this.drawingArea() / (this.min - this.max); + return this.endPoint - (scalingFactor * (value - this.min)); + }, + calculateX : function(index){ + var isRotated = (this.xLabelRotation > 0), + // innerWidth = (this.offsetGridLines) ? this.width - offsetLeft - this.padding : this.width - (offsetLeft + halfLabelWidth * 2) - this.padding, + innerWidth = this.width - (this.xScalePaddingLeft + this.xScalePaddingRight), + valueWidth = innerWidth/Math.max((this.valuesCount - ((this.offsetGridLines) ? 0 : 1)), 1), + valueOffset = (valueWidth * index) + this.xScalePaddingLeft; + + if (this.offsetGridLines){ + valueOffset += (valueWidth/2); + } + + return Math.round(valueOffset); + }, + update : function(newProps){ + helpers.extend(this, newProps); + this.fit(); + }, + draw : function(){ + var ctx = this.ctx, + yLabelGap = (this.endPoint - this.startPoint) / this.steps, + xStart = Math.round(this.xScalePaddingLeft); + if (this.display){ + ctx.fillStyle = this.textColor; + ctx.font = this.font; + each(this.yLabels,function(labelString,index){ + var yLabelCenter = this.endPoint - (yLabelGap * index), + linePositionY = Math.round(yLabelCenter), + drawHorizontalLine = this.showHorizontalLines; + + ctx.textAlign = "right"; + ctx.textBaseline = "middle"; + if (this.showLabels){ + ctx.fillText(labelString,xStart - 10,yLabelCenter); + } + + // This is X axis, so draw it + if (index === 0 && !drawHorizontalLine){ + drawHorizontalLine = true; + } + + if (drawHorizontalLine){ + ctx.beginPath(); + } + + if (index > 0){ + // This is a grid line in the centre, so drop that + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + } else { + // This is the first line on the scale + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + } + + linePositionY += helpers.aliasPixel(ctx.lineWidth); + + if(drawHorizontalLine){ + ctx.moveTo(xStart, linePositionY); + ctx.lineTo(this.width, linePositionY); + ctx.stroke(); + ctx.closePath(); + } + + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + ctx.beginPath(); + ctx.moveTo(xStart - 5, linePositionY); + ctx.lineTo(xStart, linePositionY); + ctx.stroke(); + ctx.closePath(); + + },this); + + each(this.xLabels,function(label,index){ + var xPos = this.calculateX(index) + aliasPixel(this.lineWidth), + // Check to see if line/bar here and decide where to place the line + linePos = this.calculateX(index - (this.offsetGridLines ? 0.5 : 0)) + aliasPixel(this.lineWidth), + isRotated = (this.xLabelRotation > 0), + drawVerticalLine = this.showVerticalLines; + + // This is Y axis, so draw it + if (index === 0 && !drawVerticalLine){ + drawVerticalLine = true; + } + + if (drawVerticalLine){ + ctx.beginPath(); + } + + if (index > 0){ + // This is a grid line in the centre, so drop that + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + } else { + // This is the first line on the scale + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + } + + if (drawVerticalLine){ + ctx.moveTo(linePos,this.endPoint); + ctx.lineTo(linePos,this.startPoint - 3); + ctx.stroke(); + ctx.closePath(); + } + + + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + + + // Small lines at the bottom of the base grid line + ctx.beginPath(); + ctx.moveTo(linePos,this.endPoint); + ctx.lineTo(linePos,this.endPoint + 5); + ctx.stroke(); + ctx.closePath(); + + ctx.save(); + ctx.translate(xPos,(isRotated) ? this.endPoint + 12 : this.endPoint + 8); + ctx.rotate(toRadians(this.xLabelRotation)*-1); + ctx.font = this.font; + ctx.textAlign = (isRotated) ? "right" : "center"; + ctx.textBaseline = (isRotated) ? "middle" : "top"; + ctx.fillText(label, 0, 0); + ctx.restore(); + },this); + + } + } + + }); + + Chart.RadialScale = Chart.Element.extend({ + initialize: function(){ + this.size = min([this.height, this.width]); + this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2); + }, + calculateCenterOffset: function(value){ + // Take into account half font size + the yPadding of the top value + var scalingFactor = this.drawingArea / (this.max - this.min); + + return (value - this.min) * scalingFactor; + }, + update : function(){ + if (!this.lineArc){ + this.setScaleSize(); + } else { + this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2); + } + this.buildYLabels(); + }, + buildYLabels: function(){ + this.yLabels = []; + + var stepDecimalPlaces = getDecimalPlaces(this.stepValue); + + for (var i=0; i<=this.steps; i++){ + this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)})); + } + }, + getCircumference : function(){ + return ((Math.PI*2) / this.valuesCount); + }, + setScaleSize: function(){ + /* + * Right, this is really confusing and there is a lot of maths going on here + * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + * + * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + * + * Solution: + * + * We assume the radius of the polygon is half the size of the canvas at first + * at each index we check if the text overlaps. + * + * Where it does, we store that angle and that index. + * + * After finding the largest index and angle we calculate how much we need to remove + * from the shape radius to move the point inwards by that x. + * + * We average the left and right distances to get the maximum shape radius that can fit in the box + * along with labels. + * + * Once we have that, we can find the centre point for the chart, by taking the x text protrusion + * on each side, removing that from the size, halving it and adding the left x protrusion width. + * + * This will mean we have a shape fitted to the canvas, as large as it can be with the labels + * and position it in the most space efficient manner + * + * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + */ + + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var largestPossibleRadius = min([(this.height/2 - this.pointLabelFontSize - 5), this.width/2]), + pointPosition, + i, + textWidth, + halfTextWidth, + furthestRight = this.width, + furthestRightIndex, + furthestRightAngle, + furthestLeft = 0, + furthestLeftIndex, + furthestLeftAngle, + xProtrusionLeft, + xProtrusionRight, + radiusReductionRight, + radiusReductionLeft, + maxWidthRadius; + this.ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily); + for (i=0;i furthestRight) { + furthestRight = pointPosition.x + halfTextWidth; + furthestRightIndex = i; + } + if (pointPosition.x - halfTextWidth < furthestLeft) { + furthestLeft = pointPosition.x - halfTextWidth; + furthestLeftIndex = i; + } + } + else if (i < this.valuesCount/2) { + // Less than half the values means we'll left align the text + if (pointPosition.x + textWidth > furthestRight) { + furthestRight = pointPosition.x + textWidth; + furthestRightIndex = i; + } + } + else if (i > this.valuesCount/2){ + // More than half the values means we'll right align the text + if (pointPosition.x - textWidth < furthestLeft) { + furthestLeft = pointPosition.x - textWidth; + furthestLeftIndex = i; + } + } + } + + xProtrusionLeft = furthestLeft; + + xProtrusionRight = Math.ceil(furthestRight - this.width); + + furthestRightAngle = this.getIndexAngle(furthestRightIndex); + + furthestLeftAngle = this.getIndexAngle(furthestLeftIndex); + + radiusReductionRight = xProtrusionRight / Math.sin(furthestRightAngle + Math.PI/2); + + radiusReductionLeft = xProtrusionLeft / Math.sin(furthestLeftAngle + Math.PI/2); + + // Ensure we actually need to reduce the size of the chart + radiusReductionRight = (isNumber(radiusReductionRight)) ? radiusReductionRight : 0; + radiusReductionLeft = (isNumber(radiusReductionLeft)) ? radiusReductionLeft : 0; + + this.drawingArea = largestPossibleRadius - (radiusReductionLeft + radiusReductionRight)/2; + + //this.drawingArea = min([maxWidthRadius, (this.height - (2 * (this.pointLabelFontSize + 5)))/2]) + this.setCenterPoint(radiusReductionLeft, radiusReductionRight); + + }, + setCenterPoint: function(leftMovement, rightMovement){ + + var maxRight = this.width - rightMovement - this.drawingArea, + maxLeft = leftMovement + this.drawingArea; + + this.xCenter = (maxLeft + maxRight)/2; + // Always vertically in the centre as the text height doesn't change + this.yCenter = (this.height/2); + }, + + getIndexAngle : function(index){ + var angleMultiplier = (Math.PI * 2) / this.valuesCount; + // Start from the top instead of right, so remove a quarter of the circle + + return index * angleMultiplier - (Math.PI/2); + }, + getPointPosition : function(index, distanceFromCenter){ + var thisAngle = this.getIndexAngle(index); + return { + x : (Math.cos(thisAngle) * distanceFromCenter) + this.xCenter, + y : (Math.sin(thisAngle) * distanceFromCenter) + this.yCenter + }; + }, + draw: function(){ + if (this.display){ + var ctx = this.ctx; + each(this.yLabels, function(label, index){ + // Don't draw a centre value + if (index > 0){ + var yCenterOffset = index * (this.drawingArea/this.steps), + yHeight = this.yCenter - yCenterOffset, + pointPosition; + + // Draw circular lines around the scale + if (this.lineWidth > 0){ + ctx.strokeStyle = this.lineColor; + ctx.lineWidth = this.lineWidth; + + if(this.lineArc){ + ctx.beginPath(); + ctx.arc(this.xCenter, this.yCenter, yCenterOffset, 0, Math.PI*2); + ctx.closePath(); + ctx.stroke(); + } else{ + ctx.beginPath(); + for (var i=0;i= 0; i--) { + if (this.angleLineWidth > 0){ + var outerPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max)); + ctx.beginPath(); + ctx.moveTo(this.xCenter, this.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + ctx.closePath(); + } + // Extra 3px out for some label spacing + var pointLabelPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max) + 5); + ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily); + ctx.fillStyle = this.pointLabelFontColor; + + var labelsCount = this.labels.length, + halfLabelsCount = this.labels.length/2, + quarterLabelsCount = halfLabelsCount/2, + upperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount), + exactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount); + if (i === 0){ + ctx.textAlign = 'center'; + } else if(i === halfLabelsCount){ + ctx.textAlign = 'center'; + } else if (i < halfLabelsCount){ + ctx.textAlign = 'left'; + } else { + ctx.textAlign = 'right'; + } + + // Set the correct text baseline based on outer positioning + if (exactQuarter){ + ctx.textBaseline = 'middle'; + } else if (upperHalf){ + ctx.textBaseline = 'bottom'; + } else { + ctx.textBaseline = 'top'; + } + + ctx.fillText(this.labels[i], pointLabelPosition.x, pointLabelPosition.y); + } + } + } + } + }); + + // Attach global event to resize each chart instance when the browser resizes + helpers.addEvent(window, "resize", (function(){ + // Basic debounce of resize function so it doesn't hurt performance when resizing browser. + var timeout; + return function(){ + clearTimeout(timeout); + timeout = setTimeout(function(){ + each(Chart.instances,function(instance){ + // If the responsive flag is set in the chart instance config + // Cascade the resize event down to the chart. + if (instance.options.responsive){ + instance.resize(instance.render, true); + } + }); + }, 50); + }; + })()); + + + if (amd) { + define(function(){ + return Chart; + }); + } else if (typeof module === 'object' && module.exports) { + module.exports = Chart; + } + + root.Chart = Chart; + + Chart.noConflict = function(){ + root.Chart = previous; + return Chart; + }; + +}).call(this); + +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + + var defaultConfig = { + //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero : true, + + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - If there is a stroke on each bar + barShowStroke : true, + + //Number - Pixel width of the bar stroke + barStrokeWidth : 2, + + //Number - Spacing between each of the X value sets + barValueSpacing : 5, + + //Number - Spacing between data sets within X values + barDatasetSpacing : 1, + + //String - A legend template + legendTemplate : "
    -legend\"><% for (var i=0; i
  • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
" + + }; + + + Chart.Type.extend({ + name: "Bar", + defaults : defaultConfig, + initialize: function(data){ + + //Expose options as a scope variable here so we can access it in the ScaleClass + var options = this.options; + + this.ScaleClass = Chart.Scale.extend({ + offsetGridLines : true, + calculateBarX : function(datasetCount, datasetIndex, barIndex){ + //Reusable method for calculating the xPosition of a given bar based on datasetIndex & width of the bar + var xWidth = this.calculateBaseWidth(), + xAbsolute = this.calculateX(barIndex) - (xWidth/2), + barWidth = this.calculateBarWidth(datasetCount); + + return xAbsolute + (barWidth * datasetIndex) + (datasetIndex * options.barDatasetSpacing) + barWidth/2; + }, + calculateBaseWidth : function(){ + return (this.calculateX(1) - this.calculateX(0)) - (2*options.barValueSpacing); + }, + calculateBarWidth : function(datasetCount){ + //The padding between datasets is to the right of each bar, providing that there are more than 1 dataset + var baseWidth = this.calculateBaseWidth() - ((datasetCount - 1) * options.barDatasetSpacing); + + return (baseWidth / datasetCount); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeBars = (evt.type !== 'mouseout') ? this.getBarsAtEvent(evt) : []; + + this.eachBars(function(bar){ + bar.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activeBars, function(activeBar){ + activeBar.fillColor = activeBar.highlightFill; + activeBar.strokeColor = activeBar.highlightStroke; + }); + this.showTooltip(activeBars); + }); + } + + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.BarClass = Chart.Rectangle.extend({ + strokeWidth : this.options.barStrokeWidth, + showStroke : this.options.barShowStroke, + ctx : this.chart.ctx + }); + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset,datasetIndex){ + + var datasetObject = { + label : dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + bars : [] + }; + + this.datasets.push(datasetObject); + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + datasetObject.bars.push(new this.BarClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + strokeColor : dataset.strokeColor, + fillColor : dataset.fillColor, + highlightFill : dataset.highlightFill || dataset.fillColor, + highlightStroke : dataset.highlightStroke || dataset.strokeColor + })); + },this); + + },this); + + this.buildScale(data.labels); + + this.BarClass.prototype.base = this.scale.endPoint; + + this.eachBars(function(bar, index, datasetIndex){ + helpers.extend(bar, { + width : this.scale.calculateBarWidth(this.datasets.length), + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, index), + y: this.scale.endPoint + }); + bar.save(); + }, this); + + this.render(); + }, + update : function(){ + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor', 'strokeColor']); + }); + + this.eachBars(function(bar){ + bar.save(); + }); + this.render(); + }, + eachBars : function(callback){ + helpers.each(this.datasets,function(dataset, datasetIndex){ + helpers.each(dataset.bars, callback, this, datasetIndex); + },this); + }, + getBarsAtEvent : function(e){ + var barsArray = [], + eventPosition = helpers.getRelativePosition(e), + datasetIterator = function(dataset){ + barsArray.push(dataset.bars[barIndex]); + }, + barIndex; + + for (var datasetIndex = 0; datasetIndex < this.datasets.length; datasetIndex++) { + for (barIndex = 0; barIndex < this.datasets[datasetIndex].bars.length; barIndex++) { + if (this.datasets[datasetIndex].bars[barIndex].inRange(eventPosition.x,eventPosition.y)){ + helpers.each(this.datasets, datasetIterator); + return barsArray; + } + } + } + + return barsArray; + }, + buildScale : function(labels){ + var self = this; + + var dataTotal = function(){ + var values = []; + self.eachBars(function(bar){ + values.push(bar.value); + }); + return values; + }; + + var scaleOptions = { + templateString : this.options.scaleLabel, + height : this.chart.height, + width : this.chart.width, + ctx : this.chart.ctx, + textColor : this.options.scaleFontColor, + fontSize : this.options.scaleFontSize, + fontStyle : this.options.scaleFontStyle, + fontFamily : this.options.scaleFontFamily, + valuesCount : labels.length, + beginAtZero : this.options.scaleBeginAtZero, + integersOnly : this.options.scaleIntegersOnly, + calculateYRange: function(currentHeight){ + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels : labels, + font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth : this.options.scaleLineWidth, + lineColor : this.options.scaleLineColor, + showHorizontalLines : this.options.scaleShowHorizontalLines, + showVerticalLines : this.options.scaleShowVerticalLines, + gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + padding : (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0, + showLabels : this.options.scaleShowLabels, + display : this.options.showScale + }; + + if (this.options.scaleOverride){ + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + this.scale = new this.ScaleClass(scaleOptions); + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + helpers.each(valuesArray,function(value,datasetIndex){ + //Add a new point for each piece of data, passing any required data to draw. + this.datasets[datasetIndex].bars.push(new this.BarClass({ + value : value, + label : label, + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, this.scale.valuesCount+1), + y: this.scale.endPoint, + width : this.scale.calculateBarWidth(this.datasets.length), + base : this.scale.endPoint, + strokeColor : this.datasets[datasetIndex].strokeColor, + fillColor : this.datasets[datasetIndex].fillColor + })); + },this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData : function(){ + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets,function(dataset){ + dataset.bars.shift(); + },this); + this.update(); + }, + reflow : function(){ + helpers.extend(this.BarClass.prototype,{ + y: this.scale.endPoint, + base : this.scale.endPoint + }); + var newScaleProps = helpers.extend({ + height : this.chart.height, + width : this.chart.width + }); + this.scale.update(newScaleProps); + }, + draw : function(ease){ + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + this.scale.draw(easingDecimal); + + //Draw all the bars for each dataset + helpers.each(this.datasets,function(dataset,datasetIndex){ + helpers.each(dataset.bars,function(bar,index){ + if (bar.hasValue()){ + bar.base = this.scale.endPoint; + //Transition then draw + bar.transition({ + x : this.scale.calculateBarX(this.datasets.length, datasetIndex, index), + y : this.scale.calculateY(bar.value), + width : this.scale.calculateBarWidth(this.datasets.length) + }, easingDecimal).draw(); + } + },this); + + },this); + } + }); + + +}).call(this); + +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + //Cache a local reference to Chart.helpers + helpers = Chart.helpers; + + var defaultConfig = { + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke : true, + + //String - The colour of each segment stroke + segmentStrokeColor : "#fff", + + //Number - The width of each segment stroke + segmentStrokeWidth : 2, + + //The percentage of the chart that we cut out of the middle. + percentageInnerCutout : 50, + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect + animationEasing : "easeOutBounce", + + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate : true, + + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale : false, + + //String - A legend template + legendTemplate : "
    -legend\"><% for (var i=0; i
  • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
  • <%}%>
" + + }; + + + Chart.Type.extend({ + //Passing in a name registers this chart in the Chart namespace + name: "Doughnut", + //Providing a defaults will also register the deafults in the chart namespace + defaults : defaultConfig, + //Initialize is fired when the chart is initialized - Data is passed in as a parameter + //Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data){ + + //Declare segments as a static property to prevent inheriting across the Chart type prototype + this.segments = []; + this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2; + + this.SegmentArc = Chart.Arc.extend({ + ctx : this.chart.ctx, + x : this.chart.width/2, + y : this.chart.height/2 + }); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : []; + + helpers.each(this.segments,function(segment){ + segment.restore(["fillColor"]); + }); + helpers.each(activeSegments,function(activeSegment){ + activeSegment.fillColor = activeSegment.highlightColor; + }); + this.showTooltip(activeSegments); + }); + } + this.calculateTotal(data); + + helpers.each(data,function(datapoint, index){ + this.addData(datapoint, index, true); + },this); + + this.render(); + }, + getSegmentsAtEvent : function(e){ + var segmentsArray = []; + + var location = helpers.getRelativePosition(e); + + helpers.each(this.segments,function(segment){ + if (segment.inRange(location.x,location.y)) segmentsArray.push(segment); + },this); + return segmentsArray; + }, + addData : function(segment, atIndex, silent){ + var index = atIndex || this.segments.length; + this.segments.splice(index, 0, new this.SegmentArc({ + value : segment.value, + outerRadius : (this.options.animateScale) ? 0 : this.outerRadius, + innerRadius : (this.options.animateScale) ? 0 : (this.outerRadius/100) * this.options.percentageInnerCutout, + fillColor : segment.color, + highlightColor : segment.highlight || segment.color, + showStroke : this.options.segmentShowStroke, + strokeWidth : this.options.segmentStrokeWidth, + strokeColor : this.options.segmentStrokeColor, + startAngle : Math.PI * 1.5, + circumference : (this.options.animateRotate) ? 0 : this.calculateCircumference(segment.value), + label : segment.label + })); + if (!silent){ + this.reflow(); + this.update(); + } + }, + calculateCircumference : function(value){ + return (Math.PI*2)*(Math.abs(value) / this.total); + }, + calculateTotal : function(data){ + this.total = 0; + helpers.each(data,function(segment){ + this.total += Math.abs(segment.value); + },this); + }, + update : function(){ + this.calculateTotal(this.segments); + + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor']); + }); + + helpers.each(this.segments,function(segment){ + segment.save(); + }); + this.render(); + }, + + removeData: function(atIndex){ + var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1; + this.segments.splice(indexToDelete, 1); + this.reflow(); + this.update(); + }, + + reflow : function(){ + helpers.extend(this.SegmentArc.prototype,{ + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2; + helpers.each(this.segments, function(segment){ + segment.update({ + outerRadius : this.outerRadius, + innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout + }); + }, this); + }, + draw : function(easeDecimal){ + var animDecimal = (easeDecimal) ? easeDecimal : 1; + this.clear(); + helpers.each(this.segments,function(segment,index){ + segment.transition({ + circumference : this.calculateCircumference(segment.value), + outerRadius : this.outerRadius, + innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout + },animDecimal); + + segment.endAngle = segment.startAngle + segment.circumference; + + segment.draw(); + if (index === 0){ + segment.startAngle = Math.PI * 1.5; + } + //Check to see if it's the last segment, if not get the next and update the start angle + if (index < this.segments.length-1){ + this.segments[index+1].startAngle = segment.endAngle; + } + },this); + + } + }); + + Chart.types.Doughnut.extend({ + name : "Pie", + defaults : helpers.merge(defaultConfig,{percentageInnerCutout : 0}) + }); + +}).call(this); +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + var defaultConfig = { + + ///Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - Whether the line is curved between points + bezierCurve : true, + + //Number - Tension of the bezier curve between points + bezierCurveTension : 0.4, + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 4, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + + //String - A legend template + legendTemplate : "
    -legend\"><% for (var i=0; i
  • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
" + + }; + + + Chart.Type.extend({ + name: "Line", + defaults : defaultConfig, + initialize: function(data){ + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.PointClass = Chart.Point.extend({ + strokeWidth : this.options.pointDotStrokeWidth, + radius : this.options.pointDotRadius, + display: this.options.pointDot, + hitDetectionRadius : this.options.pointHitDetectionRadius, + ctx : this.chart.ctx, + inRange : function(mouseX){ + return (Math.pow(mouseX-this.x, 2) < Math.pow(this.radius + this.hitDetectionRadius,2)); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activePoints = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : []; + this.eachPoints(function(point){ + point.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activePoints, function(activePoint){ + activePoint.fillColor = activePoint.highlightFill; + activePoint.strokeColor = activePoint.highlightStroke; + }); + this.showTooltip(activePoints); + }); + } + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset){ + + var datasetObject = { + label : dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + pointColor : dataset.pointColor, + pointStrokeColor : dataset.pointStrokeColor, + points : [] + }; + + this.datasets.push(datasetObject); + + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + datasetObject.points.push(new this.PointClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + strokeColor : dataset.pointStrokeColor, + fillColor : dataset.pointColor, + highlightFill : dataset.pointHighlightFill || dataset.pointColor, + highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor + })); + },this); + + this.buildScale(data.labels); + + + this.eachPoints(function(point, index){ + helpers.extend(point, { + x: this.scale.calculateX(index), + y: this.scale.endPoint + }); + point.save(); + }, this); + + },this); + + + this.render(); + }, + update : function(){ + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor', 'strokeColor']); + }); + this.eachPoints(function(point){ + point.save(); + }); + this.render(); + }, + eachPoints : function(callback){ + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,callback,this); + },this); + }, + getPointsAtEvent : function(e){ + var pointsArray = [], + eventPosition = helpers.getRelativePosition(e); + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,function(point){ + if (point.inRange(eventPosition.x,eventPosition.y)) pointsArray.push(point); + }); + },this); + return pointsArray; + }, + buildScale : function(labels){ + var self = this; + + var dataTotal = function(){ + var values = []; + self.eachPoints(function(point){ + values.push(point.value); + }); + + return values; + }; + + var scaleOptions = { + templateString : this.options.scaleLabel, + height : this.chart.height, + width : this.chart.width, + ctx : this.chart.ctx, + textColor : this.options.scaleFontColor, + fontSize : this.options.scaleFontSize, + fontStyle : this.options.scaleFontStyle, + fontFamily : this.options.scaleFontFamily, + valuesCount : labels.length, + beginAtZero : this.options.scaleBeginAtZero, + integersOnly : this.options.scaleIntegersOnly, + calculateYRange : function(currentHeight){ + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels : labels, + font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth : this.options.scaleLineWidth, + lineColor : this.options.scaleLineColor, + showHorizontalLines : this.options.scaleShowHorizontalLines, + showVerticalLines : this.options.scaleShowVerticalLines, + gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + padding: (this.options.showScale) ? 0 : this.options.pointDotRadius + this.options.pointDotStrokeWidth, + showLabels : this.options.scaleShowLabels, + display : this.options.showScale + }; + + if (this.options.scaleOverride){ + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + + this.scale = new Chart.Scale(scaleOptions); + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + + helpers.each(valuesArray,function(value,datasetIndex){ + //Add a new point for each piece of data, passing any required data to draw. + this.datasets[datasetIndex].points.push(new this.PointClass({ + value : value, + label : label, + x: this.scale.calculateX(this.scale.valuesCount+1), + y: this.scale.endPoint, + strokeColor : this.datasets[datasetIndex].pointStrokeColor, + fillColor : this.datasets[datasetIndex].pointColor + })); + },this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData : function(){ + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets,function(dataset){ + dataset.points.shift(); + },this); + this.update(); + }, + reflow : function(){ + var newScaleProps = helpers.extend({ + height : this.chart.height, + width : this.chart.width + }); + this.scale.update(newScaleProps); + }, + draw : function(ease){ + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + // Some helper methods for getting the next/prev points + var hasValue = function(item){ + return item.value !== null; + }, + nextPoint = function(point, collection, index){ + return helpers.findNextWhere(collection, hasValue, index) || point; + }, + previousPoint = function(point, collection, index){ + return helpers.findPreviousWhere(collection, hasValue, index) || point; + }; + + this.scale.draw(easingDecimal); + + + helpers.each(this.datasets,function(dataset){ + var pointsWithValues = helpers.where(dataset.points, hasValue); + + //Transition each point first so that the line and point drawing isn't out of sync + //We can use this extra loop to calculate the control points of this dataset also in this loop + + helpers.each(dataset.points, function(point, index){ + if (point.hasValue()){ + point.transition({ + y : this.scale.calculateY(point.value), + x : this.scale.calculateX(index) + }, easingDecimal); + } + },this); + + + // Control points need to be calculated in a seperate loop, because we need to know the current x/y of the point + // This would cause issues when there is no animation, because the y of the next point would be 0, so beziers would be skewed + if (this.options.bezierCurve){ + helpers.each(pointsWithValues, function(point, index){ + var tension = (index > 0 && index < pointsWithValues.length - 1) ? this.options.bezierCurveTension : 0; + point.controlPoints = helpers.splineCurve( + previousPoint(point, pointsWithValues, index), + point, + nextPoint(point, pointsWithValues, index), + tension + ); + + // Prevent the bezier going outside of the bounds of the graph + + // Cap puter bezier handles to the upper/lower scale bounds + if (point.controlPoints.outer.y > this.scale.endPoint){ + point.controlPoints.outer.y = this.scale.endPoint; + } + else if (point.controlPoints.outer.y < this.scale.startPoint){ + point.controlPoints.outer.y = this.scale.startPoint; + } + + // Cap inner bezier handles to the upper/lower scale bounds + if (point.controlPoints.inner.y > this.scale.endPoint){ + point.controlPoints.inner.y = this.scale.endPoint; + } + else if (point.controlPoints.inner.y < this.scale.startPoint){ + point.controlPoints.inner.y = this.scale.startPoint; + } + },this); + } + + + //Draw the line between all the points + ctx.lineWidth = this.options.datasetStrokeWidth; + ctx.strokeStyle = dataset.strokeColor; + ctx.beginPath(); + + helpers.each(pointsWithValues, function(point, index){ + if (index === 0){ + ctx.moveTo(point.x, point.y); + } + else{ + if(this.options.bezierCurve){ + var previous = previousPoint(point, pointsWithValues, index); + + ctx.bezierCurveTo( + previous.controlPoints.outer.x, + previous.controlPoints.outer.y, + point.controlPoints.inner.x, + point.controlPoints.inner.y, + point.x, + point.y + ); + } + else{ + ctx.lineTo(point.x,point.y); + } + } + }, this); + + ctx.stroke(); + + if (this.options.datasetFill && pointsWithValues.length > 0){ + //Round off the line by going to the base of the chart, back to the start, then fill. + ctx.lineTo(pointsWithValues[pointsWithValues.length - 1].x, this.scale.endPoint); + ctx.lineTo(pointsWithValues[0].x, this.scale.endPoint); + ctx.fillStyle = dataset.fillColor; + ctx.closePath(); + ctx.fill(); + } + + //Now draw the points over the line + //A little inefficient double looping, but better than the line + //lagging behind the point positions + helpers.each(pointsWithValues,function(point){ + point.draw(); + }); + },this); + } + }); + + +}).call(this); + +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + //Cache a local reference to Chart.helpers + helpers = Chart.helpers; + + var defaultConfig = { + //Boolean - Show a backdrop to the scale label + scaleShowLabelBackdrop : true, + + //String - The colour of the label backdrop + scaleBackdropColor : "rgba(255,255,255,0.75)", + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //Number - The backdrop padding above & below the label in pixels + scaleBackdropPaddingY : 2, + + //Number - The backdrop padding to the side of the label in pixels + scaleBackdropPaddingX : 2, + + //Boolean - Show line for each value in the scale + scaleShowLine : true, + + //Boolean - Stroke a line around each segment in the chart + segmentShowStroke : true, + + //String - The colour of the stroke on each segement. + segmentStrokeColor : "#fff", + + //Number - The width of the stroke value in pixels + segmentStrokeWidth : 2, + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect. + animationEasing : "easeOutBounce", + + //Boolean - Whether to animate the rotation of the chart + animateRotate : true, + + //Boolean - Whether to animate scaling the chart from the centre + animateScale : false, + + //String - A legend template + legendTemplate : "
    -legend\"><% for (var i=0; i
  • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
  • <%}%>
" + }; + + + Chart.Type.extend({ + //Passing in a name registers this chart in the Chart namespace + name: "PolarArea", + //Providing a defaults will also register the deafults in the chart namespace + defaults : defaultConfig, + //Initialize is fired when the chart is initialized - Data is passed in as a parameter + //Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data){ + this.segments = []; + //Declare segment class as a chart instance specific class, so it can share props for this instance + this.SegmentArc = Chart.Arc.extend({ + showStroke : this.options.segmentShowStroke, + strokeWidth : this.options.segmentStrokeWidth, + strokeColor : this.options.segmentStrokeColor, + ctx : this.chart.ctx, + innerRadius : 0, + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.scale = new Chart.RadialScale({ + display: this.options.showScale, + fontStyle: this.options.scaleFontStyle, + fontSize: this.options.scaleFontSize, + fontFamily: this.options.scaleFontFamily, + fontColor: this.options.scaleFontColor, + showLabels: this.options.scaleShowLabels, + showLabelBackdrop: this.options.scaleShowLabelBackdrop, + backdropColor: this.options.scaleBackdropColor, + backdropPaddingY : this.options.scaleBackdropPaddingY, + backdropPaddingX: this.options.scaleBackdropPaddingX, + lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0, + lineColor: this.options.scaleLineColor, + lineArc: true, + width: this.chart.width, + height: this.chart.height, + xCenter: this.chart.width/2, + yCenter: this.chart.height/2, + ctx : this.chart.ctx, + templateString: this.options.scaleLabel, + valuesCount: data.length + }); + + this.updateScaleRange(data); + + this.scale.update(); + + helpers.each(data,function(segment,index){ + this.addData(segment,index,true); + },this); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : []; + helpers.each(this.segments,function(segment){ + segment.restore(["fillColor"]); + }); + helpers.each(activeSegments,function(activeSegment){ + activeSegment.fillColor = activeSegment.highlightColor; + }); + this.showTooltip(activeSegments); + }); + } + + this.render(); + }, + getSegmentsAtEvent : function(e){ + var segmentsArray = []; + + var location = helpers.getRelativePosition(e); + + helpers.each(this.segments,function(segment){ + if (segment.inRange(location.x,location.y)) segmentsArray.push(segment); + },this); + return segmentsArray; + }, + addData : function(segment, atIndex, silent){ + var index = atIndex || this.segments.length; + + this.segments.splice(index, 0, new this.SegmentArc({ + fillColor: segment.color, + highlightColor: segment.highlight || segment.color, + label: segment.label, + value: segment.value, + outerRadius: (this.options.animateScale) ? 0 : this.scale.calculateCenterOffset(segment.value), + circumference: (this.options.animateRotate) ? 0 : this.scale.getCircumference(), + startAngle: Math.PI * 1.5 + })); + if (!silent){ + this.reflow(); + this.update(); + } + }, + removeData: function(atIndex){ + var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1; + this.segments.splice(indexToDelete, 1); + this.reflow(); + this.update(); + }, + calculateTotal: function(data){ + this.total = 0; + helpers.each(data,function(segment){ + this.total += segment.value; + },this); + this.scale.valuesCount = this.segments.length; + }, + updateScaleRange: function(datapoints){ + var valuesArray = []; + helpers.each(datapoints,function(segment){ + valuesArray.push(segment.value); + }); + + var scaleSizes = (this.options.scaleOverride) ? + { + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + } : + helpers.calculateScaleRange( + valuesArray, + helpers.min([this.chart.width, this.chart.height])/2, + this.options.scaleFontSize, + this.options.scaleBeginAtZero, + this.options.scaleIntegersOnly + ); + + helpers.extend( + this.scale, + scaleSizes, + { + size: helpers.min([this.chart.width, this.chart.height]), + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + } + ); + + }, + update : function(){ + this.calculateTotal(this.segments); + + helpers.each(this.segments,function(segment){ + segment.save(); + }); + + this.reflow(); + this.render(); + }, + reflow : function(){ + helpers.extend(this.SegmentArc.prototype,{ + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.updateScaleRange(this.segments); + this.scale.update(); + + helpers.extend(this.scale,{ + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + }); + + helpers.each(this.segments, function(segment){ + segment.update({ + outerRadius : this.scale.calculateCenterOffset(segment.value) + }); + }, this); + + }, + draw : function(ease){ + var easingDecimal = ease || 1; + //Clear & draw the canvas + this.clear(); + helpers.each(this.segments,function(segment, index){ + segment.transition({ + circumference : this.scale.getCircumference(), + outerRadius : this.scale.calculateCenterOffset(segment.value) + },easingDecimal); + + segment.endAngle = segment.startAngle + segment.circumference; + + // If we've removed the first segment we need to set the first one to + // start at the top. + if (index === 0){ + segment.startAngle = Math.PI * 1.5; + } + + //Check to see if it's the last segment, if not get the next and update the start angle + if (index < this.segments.length - 1){ + this.segments[index+1].startAngle = segment.endAngle; + } + segment.draw(); + }, this); + this.scale.draw(); + } + }); + +}).call(this); +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + + + Chart.Type.extend({ + name: "Radar", + defaults:{ + //Boolean - Whether to show lines for each scale point + scaleShowLine : true, + + //Boolean - Whether we show the angle lines out of the radar + angleShowLineOut : true, + + //Boolean - Whether to show labels on the scale + scaleShowLabels : false, + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //String - Colour of the angle line + angleLineColor : "rgba(0,0,0,.1)", + + //Number - Pixel width of the angle line + angleLineWidth : 1, + + //String - Point label font declaration + pointLabelFontFamily : "'Arial'", + + //String - Point label font weight + pointLabelFontStyle : "normal", + + //Number - Point label font size in pixels + pointLabelFontSize : 10, + + //String - Point label font colour + pointLabelFontColor : "#666", + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 3, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + + //String - A legend template + legendTemplate : "
    -legend\"><% for (var i=0; i
  • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
" + + }, + + initialize: function(data){ + this.PointClass = Chart.Point.extend({ + strokeWidth : this.options.pointDotStrokeWidth, + radius : this.options.pointDotRadius, + display: this.options.pointDot, + hitDetectionRadius : this.options.pointHitDetectionRadius, + ctx : this.chart.ctx + }); + + this.datasets = []; + + this.buildScale(data); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activePointsCollection = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : []; + + this.eachPoints(function(point){ + point.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activePointsCollection, function(activePoint){ + activePoint.fillColor = activePoint.highlightFill; + activePoint.strokeColor = activePoint.highlightStroke; + }); + + this.showTooltip(activePointsCollection); + }); + } + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset){ + + var datasetObject = { + label: dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + pointColor : dataset.pointColor, + pointStrokeColor : dataset.pointStrokeColor, + points : [] + }; + + this.datasets.push(datasetObject); + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + var pointPosition; + if (!this.scale.animation){ + pointPosition = this.scale.getPointPosition(index, this.scale.calculateCenterOffset(dataPoint)); + } + datasetObject.points.push(new this.PointClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + x: (this.options.animation) ? this.scale.xCenter : pointPosition.x, + y: (this.options.animation) ? this.scale.yCenter : pointPosition.y, + strokeColor : dataset.pointStrokeColor, + fillColor : dataset.pointColor, + highlightFill : dataset.pointHighlightFill || dataset.pointColor, + highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor + })); + },this); + + },this); + + this.render(); + }, + eachPoints : function(callback){ + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,callback,this); + },this); + }, + + getPointsAtEvent : function(evt){ + var mousePosition = helpers.getRelativePosition(evt), + fromCenter = helpers.getAngleFromPoint({ + x: this.scale.xCenter, + y: this.scale.yCenter + }, mousePosition); + + var anglePerIndex = (Math.PI * 2) /this.scale.valuesCount, + pointIndex = Math.round((fromCenter.angle - Math.PI * 1.5) / anglePerIndex), + activePointsCollection = []; + + // If we're at the top, make the pointIndex 0 to get the first of the array. + if (pointIndex >= this.scale.valuesCount || pointIndex < 0){ + pointIndex = 0; + } + + if (fromCenter.distance <= this.scale.drawingArea){ + helpers.each(this.datasets, function(dataset){ + activePointsCollection.push(dataset.points[pointIndex]); + }); + } + + return activePointsCollection; + }, + + buildScale : function(data){ + this.scale = new Chart.RadialScale({ + display: this.options.showScale, + fontStyle: this.options.scaleFontStyle, + fontSize: this.options.scaleFontSize, + fontFamily: this.options.scaleFontFamily, + fontColor: this.options.scaleFontColor, + showLabels: this.options.scaleShowLabels, + showLabelBackdrop: this.options.scaleShowLabelBackdrop, + backdropColor: this.options.scaleBackdropColor, + backdropPaddingY : this.options.scaleBackdropPaddingY, + backdropPaddingX: this.options.scaleBackdropPaddingX, + lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0, + lineColor: this.options.scaleLineColor, + angleLineColor : this.options.angleLineColor, + angleLineWidth : (this.options.angleShowLineOut) ? this.options.angleLineWidth : 0, + // Point labels at the edge of each line + pointLabelFontColor : this.options.pointLabelFontColor, + pointLabelFontSize : this.options.pointLabelFontSize, + pointLabelFontFamily : this.options.pointLabelFontFamily, + pointLabelFontStyle : this.options.pointLabelFontStyle, + height : this.chart.height, + width: this.chart.width, + xCenter: this.chart.width/2, + yCenter: this.chart.height/2, + ctx : this.chart.ctx, + templateString: this.options.scaleLabel, + labels: data.labels, + valuesCount: data.datasets[0].data.length + }); + + this.scale.setScaleSize(); + this.updateScaleRange(data.datasets); + this.scale.buildYLabels(); + }, + updateScaleRange: function(datasets){ + var valuesArray = (function(){ + var totalDataArray = []; + helpers.each(datasets,function(dataset){ + if (dataset.data){ + totalDataArray = totalDataArray.concat(dataset.data); + } + else { + helpers.each(dataset.points, function(point){ + totalDataArray.push(point.value); + }); + } + }); + return totalDataArray; + })(); + + + var scaleSizes = (this.options.scaleOverride) ? + { + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + } : + helpers.calculateScaleRange( + valuesArray, + helpers.min([this.chart.width, this.chart.height])/2, + this.options.scaleFontSize, + this.options.scaleBeginAtZero, + this.options.scaleIntegersOnly + ); + + helpers.extend( + this.scale, + scaleSizes + ); + + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + this.scale.valuesCount++; + helpers.each(valuesArray,function(value,datasetIndex){ + var pointPosition = this.scale.getPointPosition(this.scale.valuesCount, this.scale.calculateCenterOffset(value)); + this.datasets[datasetIndex].points.push(new this.PointClass({ + value : value, + label : label, + x: pointPosition.x, + y: pointPosition.y, + strokeColor : this.datasets[datasetIndex].pointStrokeColor, + fillColor : this.datasets[datasetIndex].pointColor + })); + },this); + + this.scale.labels.push(label); + + this.reflow(); + + this.update(); + }, + removeData : function(){ + this.scale.valuesCount--; + this.scale.labels.shift(); + helpers.each(this.datasets,function(dataset){ + dataset.points.shift(); + },this); + this.reflow(); + this.update(); + }, + update : function(){ + this.eachPoints(function(point){ + point.save(); + }); + this.reflow(); + this.render(); + }, + reflow: function(){ + helpers.extend(this.scale, { + width : this.chart.width, + height: this.chart.height, + size : helpers.min([this.chart.width, this.chart.height]), + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + }); + this.updateScaleRange(this.datasets); + this.scale.setScaleSize(); + this.scale.buildYLabels(); + }, + draw : function(ease){ + var easeDecimal = ease || 1, + ctx = this.chart.ctx; + this.clear(); + this.scale.draw(); + + helpers.each(this.datasets,function(dataset){ + + //Transition each point first so that the line and point drawing isn't out of sync + helpers.each(dataset.points,function(point,index){ + if (point.hasValue()){ + point.transition(this.scale.getPointPosition(index, this.scale.calculateCenterOffset(point.value)), easeDecimal); + } + },this); + + + + //Draw the line between all the points + ctx.lineWidth = this.options.datasetStrokeWidth; + ctx.strokeStyle = dataset.strokeColor; + ctx.beginPath(); + helpers.each(dataset.points,function(point,index){ + if (index === 0){ + ctx.moveTo(point.x,point.y); + } + else{ + ctx.lineTo(point.x,point.y); + } + },this); + ctx.closePath(); + ctx.stroke(); + + ctx.fillStyle = dataset.fillColor; + ctx.fill(); + + //Now draw the points over the line + //A little inefficient double looping, but better than the line + //lagging behind the point positions + helpers.each(dataset.points,function(point){ + if (point.hasValue()){ + point.draw(); + } + }); + + },this); + + } + + }); + + + + + +}).call(this); \ No newline at end of file diff --git a/bower_components/Chart.js/Chart.min.js b/bower_components/Chart.js/Chart.min.js new file mode 100644 index 0000000..3a0a2c8 --- /dev/null +++ b/bower_components/Chart.js/Chart.min.js @@ -0,0 +1,11 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 1.0.2 + * + * Copyright 2015 Nick Downie + * Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + */ +(function(){"use strict";var t=this,i=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;var i=function(t,i){return t["offset"+i]?t["offset"+i]:document.defaultView.getComputedStyle(t).getPropertyValue(i)},e=this.width=i(t.canvas,"Width"),n=this.height=i(t.canvas,"Height");t.canvas.width=e,t.canvas.height=n;var e=this.width=t.canvas.width,n=this.height=t.canvas.height;return this.aspectRatio=this.width/this.height,s.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,customTooltips:!1,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= value %>",multiTooltipKeyBackground:"#fff",onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var s=e.helpers={},n=s.each=function(t,i,e){var s=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var n;for(n=0;n=0;s--){var n=t[s];if(i(n))return n}},s.inherits=function(t){var i=this,e=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return i.apply(this,arguments)},s=function(){this.constructor=e};return s.prototype=i.prototype,e.prototype=new s,e.extend=r,t&&a(e.prototype,t),e.__super__=i.prototype,e}),c=s.noop=function(){},u=s.uid=function(){var t=0;return function(){return"chart-"+t++}}(),d=s.warn=function(t){window.console&&"function"==typeof window.console.warn&&console.warn(t)},p=s.amd="function"==typeof define&&define.amd,f=s.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},g=s.max=function(t){return Math.max.apply(Math,t)},m=s.min=function(t){return Math.min.apply(Math,t)},v=(s.cap=function(t,i,e){if(f(i)){if(t>i)return i}else if(f(e)&&e>t)return e;return t},s.getDecimalPlaces=function(t){return t%1!==0&&f(t)?t.toString().split(".")[1].length:0}),S=s.radians=function(t){return t*(Math.PI/180)},x=(s.getAngleFromPoint=function(t,i){var e=i.x-t.x,s=i.y-t.y,n=Math.sqrt(e*e+s*s),o=2*Math.PI+Math.atan2(s,e);return 0>e&&0>s&&(o+=2*Math.PI),{angle:o,distance:n}},s.aliasPixel=function(t){return t%2===0?0:.5}),y=(s.splineCurve=function(t,i,e,s){var n=Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2)),a=s*n/(n+o),h=s*o/(n+o);return{inner:{x:i.x-a*(e.x-t.x),y:i.y-a*(e.y-t.y)},outer:{x:i.x+h*(e.x-t.x),y:i.y+h*(e.y-t.y)}}},s.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),C=(s.calculateScaleRange=function(t,i,e,s,n){var o=2,a=Math.floor(i/(1.5*e)),h=o>=a,l=g(t),r=m(t);l===r&&(l+=.5,r>=.5&&!s?r-=.5:l+=.5);for(var c=Math.abs(l-r),u=y(c),d=Math.ceil(l/(1*Math.pow(10,u)))*Math.pow(10,u),p=s?0:Math.floor(r/(1*Math.pow(10,u)))*Math.pow(10,u),f=d-p,v=Math.pow(10,u),S=Math.round(f/v);(S>a||a>2*S)&&!h;)if(S>a)v*=2,S=Math.round(f/v),S%1!==0&&(h=!0);else if(n&&u>=0){if(v/2%1!==0)break;v/=2,S=Math.round(f/v)}else v/=2,S=Math.round(f/v);return h&&(S=o,v=f/S),{steps:S,stepValue:v,min:p,max:p+S*v}},s.template=function(t,i){function e(t,i){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join(" ").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split(" ").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):s[t]=s[t];return i?e(i):e}if(t instanceof Function)return t(i);var s={};return e(t,i)}),w=(s.generateLabels=function(t,i,e,s){var o=new Array(i);return labelTemplateString&&n(o,function(i,n){o[n]=C(t,{value:e+s*(n+1)})}),o},s.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--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){return(t/=.5)<1?.5*t*t*t:.5*((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){return(t/=.5)<1?.5*t*t*t*t:-0.5*((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){return(t/=.5)<1?.5*t*t*t*t*t:.5*((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-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),st?-.5*s*Math.pow(2,10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e):s*Math.pow(2,-10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e)*.5+1)},easeInBack:function(t){var i=1.70158;return 1*(t/=1)*t*((i+1)*t-i)},easeOutBack:function(t){var i=1.70158;return 1*((t=t/1-1)*t*((i+1)*t+i)+1)},easeInOutBack:function(t){var i=1.70158;return(t/=.5)<1?.5*t*t*(((i*=1.525)+1)*t-i):.5*((t-=2)*t*(((i*=1.525)+1)*t+i)+2)},easeInBounce:function(t){return 1-w.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?7.5625*t*t:2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*w.easeInBounce(2*t):.5*w.easeOutBounce(2*t-1)+.5}}),b=s.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),P=s.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),L=(s.animationLoop=function(t,i,e,s,n,o){var a=0,h=w[e]||w.linear,l=function(){a++;var e=a/i,r=h(e);t.call(o,r,e,a),s.call(o,r,e),i>a?o.animationFrame=b(l):n.apply(o)};b(l)},s.getRelativePosition=function(t){var i,e,s=t.originalEvent||t,n=t.currentTarget||t.srcElement,o=n.getBoundingClientRect();return s.touches?(i=s.touches[0].clientX-o.left,e=s.touches[0].clientY-o.top):(i=s.clientX-o.left,e=s.clientY-o.top),{x:i,y:e}},s.addEvent=function(t,i,e){t.addEventListener?t.addEventListener(i,e):t.attachEvent?t.attachEvent("on"+i,e):t["on"+i]=e}),k=s.removeEvent=function(t,i,e){t.removeEventListener?t.removeEventListener(i,e,!1):t.detachEvent?t.detachEvent("on"+i,e):t["on"+i]=c},F=(s.bindEvents=function(t,i,e){t.events||(t.events={}),n(i,function(i){t.events[i]=function(){e.apply(t,arguments)},L(t.chart.canvas,i,t.events[i])})},s.unbindEvents=function(t,i){n(i,function(i,e){k(t.chart.canvas,e,i)})}),R=s.getMaximumWidth=function(t){var i=t.parentNode;return i.clientWidth},T=s.getMaximumHeight=function(t){var i=t.parentNode;return i.clientHeight},A=(s.getMaximumSize=s.getMaximumWidth,s.retinaScale=function(t){var i=t.ctx,e=t.canvas.width,s=t.canvas.height;window.devicePixelRatio&&(i.canvas.style.width=e+"px",i.canvas.style.height=s+"px",i.canvas.height=s*window.devicePixelRatio,i.canvas.width=e*window.devicePixelRatio,i.scale(window.devicePixelRatio,window.devicePixelRatio))}),M=s.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},W=s.fontString=function(t,i,e){return i+" "+t+"px "+e},z=s.longestText=function(t,i,e){t.font=i;var s=0;return n(e,function(i){var e=t.measureText(i).width;s=e>s?e:s}),s},B=s.drawRoundedRectangle=function(t,i,e,s,n,o){t.beginPath(),t.moveTo(i+o,e),t.lineTo(i+s-o,e),t.quadraticCurveTo(i+s,e,i+s,e+o),t.lineTo(i+s,e+n-o),t.quadraticCurveTo(i+s,e+n,i+s-o,e+n),t.lineTo(i+o,e+n),t.quadraticCurveTo(i,e+n,i,e+n-o),t.lineTo(i,e+o),t.quadraticCurveTo(i,e,i+o,e),t.closePath()};e.instances={},e.Type=function(t,i,s){this.options=i,this.chart=s,this.id=u(),e.instances[this.id]=this,i.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return M(this.chart),this},stop:function(){return P(this.animationFrame),this},resize:function(t){this.stop();var i=this.chart.canvas,e=R(this.chart.canvas),s=this.options.maintainAspectRatio?e/this.chart.aspectRatio:T(this.chart.canvas);return i.width=this.chart.width=e,i.height=this.chart.height=s,A(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){return t&&this.reflow(),this.options.animation&&!t?s.animationLoop(this.draw,this.options.animationSteps,this.options.animationEasing,this.options.onAnimationProgress,this.options.onAnimationComplete,this):(this.draw(),this.options.onAnimationComplete.call(this)),this},generateLegend:function(){return C(this.options.legendTemplate,this)},destroy:function(){this.clear(),F(this,this.events);var t=this.chart.canvas;t.width=this.chart.width,t.height=this.chart.height,t.style.removeProperty?(t.style.removeProperty("width"),t.style.removeProperty("height")):(t.style.removeAttribute("width"),t.style.removeAttribute("height")),delete e.instances[this.id]},showTooltip:function(t,i){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var i=!1;return t.length!==this.activeElements.length?i=!0:(n(t,function(t,e){t!==this.activeElements[e]&&(i=!0)},this),i)}.call(this,t);if(o||i){if(this.activeElements=t,this.draw(),this.options.customTooltips&&this.options.customTooltips(!1),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,h,r=this.datasets.length-1;r>=0&&(a=this.datasets[r].points||this.datasets[r].bars||this.datasets[r].segments,h=l(a,t[0]),-1===h);r--);var c=[],u=[],d=function(){var t,i,e,n,o,a=[],l=[],r=[];return s.each(this.datasets,function(i){t=i.points||i.bars||i.segments,t[h]&&t[h].hasValue()&&a.push(t[h])}),s.each(a,function(t){l.push(t.x),r.push(t.y),c.push(s.template(this.options.multiTooltipTemplate,t)),u.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),o=m(r),e=g(r),n=m(l),i=g(l),{x:n>this.chart.width/2?n:i,y:(o+e)/2}}.call(this,h);new e.MultiTooltip({x:d.x,y:d.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:u,legendColorBackground:this.options.multiTooltipKeyBackground,title:t[0].label,chart:this.chart,ctx:this.chart.ctx,custom:this.options.customTooltips}).draw()}else n(t,function(t){var i=t.tooltipPosition();new e.Tooltip({x:Math.round(i.x),y:Math.round(i.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:C(this.options.tooltipTemplate,t),chart:this.chart,custom:this.options.customTooltips}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var i=this,s=function(){return i.apply(this,arguments)};if(s.prototype=o(i.prototype),a(s.prototype,t),s.extend=e.Type.extend,t.name||i.prototype.name){var n=t.name||i.prototype.name,l=e.defaults[i.prototype.name]?o(e.defaults[i.prototype.name]):{};e.defaults[n]=a(l,t.defaults),e.types[n]=s,e.prototype[n]=function(t,i){var o=h(e.defaults.global,e.defaults[n],i||{});return new s(t,o,this)}}else d("Name not provided for this chart, so it hasn't been registered");return i},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?n(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return n(t,function(t,i){this._saved[i]=this[i],this[i]=t},this),this},transition:function(t,i){return n(t,function(t,e){this[e]=(t-this._saved[e])*i+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return f(this.value)}}),e.Element.extend=r,e.Point=e.Element.extend({display:!0,inRange:function(t,i){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(i-this.y,2)=this.startAngle&&e.angle<=this.endAngle,o=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return n&&o},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,i=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*i,y:this.y+Math.sin(t)*i}},draw:function(t){var i=this.ctx;i.beginPath(),i.arc(this.x,this.y,this.outerRadius,this.startAngle,this.endAngle),i.arc(this.x,this.y,this.innerRadius,this.endAngle,this.startAngle,!0),i.closePath(),i.strokeStyle=this.strokeColor,i.lineWidth=this.strokeWidth,i.fillStyle=this.fillColor,i.fill(),i.lineJoin="bevel",this.showStroke&&i.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,i=this.width/2,e=this.x-i,s=this.x+i,n=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,s-=o,n+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,n),t.lineTo(s,n),t.lineTo(s,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,i){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&i>=this.y&&i<=this.base}}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var i=this.caretPadding=2,e=t.measureText(this.text).width+2*this.xPadding,s=this.fontSize+2*this.yPadding,n=s+this.caretHeight+i;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-n<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-n;if(t.fillStyle=this.fillColor,this.custom)this.custom(this);else{switch(this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-i),t.lineTo(this.x+this.caretHeight,this.y-(i+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(i+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+i+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+i),t.lineTo(this.x+this.caretHeight,this.y+i+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+i+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}B(t,o,a,e,s,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+s/2)}}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=W(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+1.5*this.titleFontSize,this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,i=z(this.ctx,this.font,this.labels)+this.fontSize+3,e=g([i,t]);this.width=e+2*this.xPadding;var s=this.height/2;this.y-s<0?this.y=s:this.y+s>this.chart.height&&(this.y=this.chart.height-s),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var i=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?i+this.titleFontSize/2:i+(1.5*this.fontSize*e+this.fontSize/2)+1.5*this.titleFontSize},draw:function(){if(this.custom)this.custom(this);else{B(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,s.each(this.labels,function(i,e){t.fillStyle=this.textColor,t.fillText(i,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?z(this.ctx,this.font,this.yLabels):0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,i=this.endPoint-this.startPoint;for(this.calculateYRange(i),this.buildYLabels(),this.calculateXLabelRotation();i>this.endPoint-this.startPoint;)i=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(i),this.buildYLabels(),tthis.yLabelWidth+10?e/2:this.yLabelWidth+10,this.xLabelRotation=0,this.display){var n,o=z(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)n=Math.cos(S(this.xLabelRotation)),t=n*e,i=n*s,t+this.fontSize/2>this.yLabelWidth+8&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=n*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(S(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){var i=this.drawingArea()/(this.min-this.max);return this.endPoint-i*(t-this.min)},calculateX:function(t){var i=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=i/Math.max(this.valuesCount-(this.offsetGridLines?0:1),1),s=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(s+=e/2),Math.round(s)},update:function(t){s.extend(this,t),this.fit()},draw:function(){var t=this.ctx,i=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,n(this.yLabels,function(n,o){var a=this.endPoint-i*o,h=Math.round(a),l=this.showHorizontalLines;t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(n,e-10,a),0!==o||l||(l=!0),l&&t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),h+=s.aliasPixel(t.lineWidth),l&&(t.moveTo(e,h),t.lineTo(this.width,h),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,h),t.lineTo(e,h),t.stroke(),t.closePath()},this),n(this.xLabels,function(i,e){var s=this.calculateX(e)+x(this.lineWidth),n=this.calculateX(e-(this.offsetGridLines?.5:0))+x(this.lineWidth),o=this.xLabelRotation>0,a=this.showVerticalLines;0!==e||a||(a=!0),a&&t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),a&&(t.moveTo(n,this.endPoint),t.lineTo(n,this.startPoint-3),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(n,this.endPoint),t.lineTo(n,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(s,o?this.endPoint+12:this.endPoint+8),t.rotate(-1*S(this.xLabelRotation)),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(i,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=m([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var i=this.drawingArea/(this.max-this.min);return(t-this.min)*i},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,i,e,s,n,o,a,h,l,r,c,u,d=m([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,g=0;for(this.ctx.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),i=0;ip&&(p=t.x+s,n=i),t.x-sp&&(p=t.x+e,n=i):i>this.valuesCount/2&&t.x-e0){var s,n=e*(this.drawingArea/this.steps),o=this.yCenter-n;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,n,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a=0;i--){if(this.angleLineWidth>0){var e=this.getPointPosition(i,this.calculateCenterOffset(this.max));t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(e.x,e.y),t.stroke(),t.closePath()}var s=this.getPointPosition(i,this.calculateCenterOffset(this.max)+5);t.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var o=this.labels.length,a=this.labels.length/2,h=a/2,l=h>i||i>o-h,r=i===h||i===o-h;t.textAlign=0===i?"center":i===a?"center":a>i?"left":"right",t.textBaseline=r?"middle":l?"bottom":"top",t.fillText(this.labels[i],s.x,s.y)}}}}}),s.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){n(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define(function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=i,e}}).call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'
    <% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
'};i.Type.extend({name:"Bar",defaults:s,initialize:function(t){var s=this.options;this.ScaleClass=i.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,i,e){var n=this.calculateBaseWidth(),o=this.calculateX(e)-n/2,a=this.calculateBarWidth(t);return o+a*i+i*s.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*s.barValueSpacing},calculateBarWidth:function(t){var i=this.calculateBaseWidth()-(t-1)*s.barDatasetSpacing;return i/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),this.BarClass=i.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,bars:[]};this.datasets.push(s),e.each(i.data,function(e,n){s.bars.push(new this.BarClass({value:e,label:t.labels[n],datasetLabel:i.label,strokeColor:i.strokeColor,fillColor:i.fillColor,highlightFill:i.highlightFill||i.fillColor,highlightStroke:i.highlightStroke||i.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,i,s){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,s,i),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(i,s){e.each(i.bars,t,this,s)},this)},getBarsAtEvent:function(t){for(var i,s=[],n=e.getRelativePosition(t),o=function(t){s.push(t.bars[i])},a=0;a<% for (var i=0; i
  • <%if(segments[i].label){%><%=segments[i].label%><%}%>
  • <%}%>'};i.Type.extend({name:"Doughnut",defaults:s,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=i.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.calculateTotal(t),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),e||(this.reflow(),this.update())},calculateCircumference:function(t){return 2*Math.PI*(Math.abs(t)/this.total)},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=Math.abs(t.value)},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var i=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},i),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>'};i.Type.extend({name:"Line",defaults:s,initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)0&&ithis.scale.endPoint?t.controlPoints.outer.y=this.scale.endPoint:t.controlPoints.outer.ythis.scale.endPoint?t.controlPoints.inner.y=this.scale.endPoint:t.controlPoints.inner.y0&&(s.lineTo(h[h.length-1].x,this.scale.endPoint),s.lineTo(h[0].x,this.scale.endPoint),s.fillStyle=t.fillColor,s.closePath(),s.fill()),e.each(h,function(t){t.draw()})},this)}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'
      <% for (var i=0; i
    • <%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    '};i.Type.extend({name:"PolarArea",defaults:s,initialize:function(t){this.segments=[],this.SegmentArc=i.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var i=[];e.each(t,function(t){i.push(t.value)});var s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var i=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},i),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>'},initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){var o;this.scale.animation||(o=this.scale.getPointPosition(n,this.scale.calculateCenterOffset(e))),s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,x:this.options.animation?this.scale.xCenter:o.x,y:this.options.animation?this.scale.yCenter:o.y,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=e.getRelativePosition(t),s=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},i),n=2*Math.PI/this.scale.valuesCount,o=Math.round((s.angle-1.5*Math.PI)/n),a=[];return(o>=this.scale.valuesCount||0>o)&&(o=0),s.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var i=function(){var i=[];return e.each(t,function(t){t.data?i=i.concat(t.data):e.each(t.points,function(t){i.push(t.value)})}),i}(),s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s)},addData:function(t,i){this.scale.valuesCount++,e.each(t,function(t,e){var s=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[e].points.push(new this.PointClass({value:t,label:i,x:s.x,y:s.y,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.labels.push(i),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var i=t||1,s=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.hasValue()&&t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),i)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(t.points,function(t,i){0===i?s.moveTo(t.x,t.y):s.lineTo(t.x,t.y)},this),s.closePath(),s.stroke(),s.fillStyle=t.fillColor,s.fill(),e.each(t.points,function(t){t.hasValue()&&t.draw()})},this)}})}.call(this); \ No newline at end of file diff --git a/bower_components/Chart.js/LICENSE.md b/bower_components/Chart.js/LICENSE.md new file mode 100644 index 0000000..e10bc0f --- /dev/null +++ b/bower_components/Chart.js/LICENSE.md @@ -0,0 +1,7 @@ +Copyright (c) 2013-2015 Nick Downie + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/bower_components/Chart.js/README.md b/bower_components/Chart.js/README.md new file mode 100644 index 0000000..7c4fa8b --- /dev/null +++ b/bower_components/Chart.js/README.md @@ -0,0 +1,20 @@ +# Chart.js + +[![Build Status](https://travis-ci.org/nnnick/Chart.js.svg?branch=master)](https://travis-ci.org/nnnick/Chart.js) [![Code Climate](https://codeclimate.com/github/nnnick/Chart.js/badges/gpa.svg)](https://codeclimate.com/github/nnnick/Chart.js) + + +*Simple HTML5 Charts using the canvas element* [chartjs.org](http://www.chartjs.org) + +## Documentation + +You can find documentation at [chartjs.org/docs](http://www.chartjs.org/docs/). The markdown files that build the site are available under `/docs`. Please note - in some of the json examples of configuration you might notice some liquid tags - this is just for the generating the site html, please disregard. + +## Bugs, issues and contributing + +Before submitting an issue or a pull request to the project, please take a moment to look over the [contributing guidelines](https://github.com/nnnick/Chart.js/blob/master/CONTRIBUTING.md) first. + +For support using Chart.js, please post questions with the [`chartjs` tag on Stack Overflow](http://stackoverflow.com/questions/tagged/chartjs). + +## License + +Chart.js is available under the [MIT license](http://opensource.org/licenses/MIT). diff --git a/bower_components/Chart.js/bower.json b/bower_components/Chart.js/bower.json new file mode 100644 index 0000000..f26f81e --- /dev/null +++ b/bower_components/Chart.js/bower.json @@ -0,0 +1,11 @@ +{ + "name": "Chart.js", + "version": "1.0.2", + "description": "Simple HTML5 Charts using the canvas element", + "homepage": "https://github.com/nnnick/Chart.js", + "author": "nnnick", + "main": [ + "Chart.js" + ], + "dependencies": {} +} \ No newline at end of file diff --git a/bower_components/Chart.js/docs/00-Getting-Started.md b/bower_components/Chart.js/docs/00-Getting-Started.md new file mode 100644 index 0000000..273b10f --- /dev/null +++ b/bower_components/Chart.js/docs/00-Getting-Started.md @@ -0,0 +1,203 @@ +--- +title: Getting started +anchor: getting-started +--- + +###Include Chart.js + +First we need to include the Chart.js library on the page. The library occupies a global variable of `Chart`. + +```html + +``` + +Alternatively, if you're using an AMD loader for JavaScript modules, that is also supported in the Chart.js core. Please note: the library will still occupy a global variable of `Chart`, even if it detects `define` and `define.amd`. If this is a problem, you can call `noConflict` to restore the global Chart variable to it's previous owner. + +```javascript +// Using requirejs +require(['path/to/Chartjs'], function(Chart){ + // Use Chart.js as normal here. + + // Chart.noConflict restores the Chart global variable to it's previous owner + // The function returns what was previously Chart, allowing you to reassign. + var Chartjs = Chart.noConflict(); + +}); +``` + +You can also grab Chart.js using bower: + +```bash +bower install Chart.js --save +``` + +###Creating a chart + +To create a chart, we need to instantiate the `Chart` class. To do this, we need to pass in the 2d context of where we want to draw the chart. Here's an example. + +```html + +``` + +```javascript +// Get the context of the canvas element we want to select +var ctx = document.getElementById("myChart").getContext("2d"); +var myNewChart = new Chart(ctx).PolarArea(data); +``` + +We can also get the context of our canvas with jQuery. To do this, we need to get the DOM node out of the jQuery collection, and call the `getContext("2d")` method on that. + +```javascript +// Get context with jQuery - using jQuery's .get() method. +var ctx = $("#myChart").get(0).getContext("2d"); +// This will get the first returned node in the jQuery collection. +var myNewChart = new Chart(ctx); +``` + +After we've instantiated the Chart class on the canvas we want to draw on, Chart.js will handle the scaling for retina displays. + +With the Chart class set up, we can go on to create one of the charts Chart.js has available. In the example below, we would be drawing a Polar area chart. + +```javascript +new Chart(ctx).PolarArea(data, options); +``` + +We call a method of the name of the chart we want to create. We pass in the data for that chart type, and the options for that chart as parameters. Chart.js will merge the global defaults with chart type specific defaults, then merge any options passed in as a second argument after data. + +###Global chart configuration + +This concept was introduced in Chart.js 1.0 to keep configuration DRY, and allow for changing options globally across chart types, avoiding the need to specify options for each instance, or the default for a particular chart type. + +```javascript +Chart.defaults.global = { + // Boolean - Whether to animate the chart + animation: true, + + // Number - Number of animation steps + animationSteps: 60, + + // String - Animation easing effect + animationEasing: "easeOutQuart", + + // Boolean - If we should show the scale at all + showScale: true, + + // Boolean - If we want to override with a hard coded scale + scaleOverride: false, + + // ** Required if scaleOverride is true ** + // Number - The number of steps in a hard coded scale + scaleSteps: null, + // Number - The value jump in the hard coded scale + scaleStepWidth: null, + // Number - The scale starting value + scaleStartValue: null, + + // String - Colour of the scale line + scaleLineColor: "rgba(0,0,0,.1)", + + // Number - Pixel width of the scale line + scaleLineWidth: 1, + + // Boolean - Whether to show labels on the scale + scaleShowLabels: true, + + // Interpolated JS string - can access value + scaleLabel: "<%=value%>", + + // Boolean - Whether the scale should stick to integers, not floats even if drawing space is there + scaleIntegersOnly: true, + + // Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero: false, + + // String - Scale label font declaration for the scale label + scaleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Scale label font size in pixels + scaleFontSize: 12, + + // String - Scale label font weight style + scaleFontStyle: "normal", + + // String - Scale label font colour + scaleFontColor: "#666", + + // Boolean - whether or not the chart should be responsive and resize when the browser does. + responsive: false, + + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + + // Boolean - Determines whether to draw tooltips on the canvas or not + showTooltips: true, + + // Function - Determines whether to execute the customTooltips function instead of drawing the built in tooltips (See [Advanced - External Tooltips](#advanced-usage-custom-tooltips)) + customTooltips: false, + + // Array - Array of string names to attach tooltip events + tooltipEvents: ["mousemove", "touchstart", "touchmove"], + + // String - Tooltip background colour + tooltipFillColor: "rgba(0,0,0,0.8)", + + // String - Tooltip label font declaration for the scale label + tooltipFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip label font size in pixels + tooltipFontSize: 14, + + // String - Tooltip font weight style + tooltipFontStyle: "normal", + + // String - Tooltip label font colour + tooltipFontColor: "#fff", + + // String - Tooltip title font declaration for the scale label + tooltipTitleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip title font size in pixels + tooltipTitleFontSize: 14, + + // String - Tooltip title font weight style + tooltipTitleFontStyle: "bold", + + // String - Tooltip title font colour + tooltipTitleFontColor: "#fff", + + // Number - pixel width of padding around tooltip text + tooltipYPadding: 6, + + // Number - pixel width of padding around tooltip text + tooltipXPadding: 6, + + // Number - Size of the caret on the tooltip + tooltipCaretSize: 8, + + // Number - Pixel radius of the tooltip border + tooltipCornerRadius: 6, + + // Number - Pixel offset from point x to tooltip edge + tooltipXOffset: 10, + {% raw %} + // String - Template string for single tooltips + tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>", + {% endraw %} + // String - Template string for multiple tooltips + multiTooltipTemplate: "<%= value %>", + + // Function - Will fire on animation progression. + onAnimationProgress: function(){}, + + // Function - Will fire on animation completion. + onAnimationComplete: function(){} +} +``` + +If for example, you wanted all charts created to be responsive, and resize when the browser window does, the following setting can be changed: + +```javascript +Chart.defaults.global.responsive = true; +``` + +Now, every time we create a chart, `options.responsive` will be `true`. diff --git a/bower_components/Chart.js/docs/01-Line-Chart.md b/bower_components/Chart.js/docs/01-Line-Chart.md new file mode 100644 index 0000000..1a5ae84 --- /dev/null +++ b/bower_components/Chart.js/docs/01-Line-Chart.md @@ -0,0 +1,166 @@ +--- +title: Line Chart +anchor: line-chart +--- +###Introduction +A line chart is a way of plotting data points on a line. + +Often, it is used to show trend data, and the comparison of two data sets. + +
    + +
    + +###Example usage +```javascript +var myLineChart = new Chart(ctx).Line(data, options); +``` +###Data structure + +```javascript +var data = { + labels: ["January", "February", "March", "April", "May", "June", "July"], + datasets: [ + { + label: "My First dataset", + fillColor: "rgba(220,220,220,0.2)", + strokeColor: "rgba(220,220,220,1)", + pointColor: "rgba(220,220,220,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(220,220,220,1)", + data: [65, 59, 80, 81, 56, 55, 40] + }, + { + label: "My Second dataset", + fillColor: "rgba(151,187,205,0.2)", + strokeColor: "rgba(151,187,205,1)", + pointColor: "rgba(151,187,205,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(151,187,205,1)", + data: [28, 48, 40, 19, 86, 27, 90] + } + ] +}; +``` + +The line chart requires an array of labels for each of the data points. This is shown on the X axis. +The data for line charts is broken up into an array of datasets. Each dataset has a colour for the fill, a colour for the line and colours for the points and strokes of the points. These colours are strings just like CSS. You can use RGBA, RGB, HEX or HSL notation. + +The label key on each dataset is optional, and can be used when generating a scale for the chart. + +### Chart options + +These are the customisation options specific to Line charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. + +```javascript +{ + + ///Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - Whether the line is curved between points + bezierCurve : true, + + //Number - Tension of the bezier curve between points + bezierCurveTension : 0.4, + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 4, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + {% raw %} + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    " + {% endraw %} +}; +``` + +You can override these for your `Chart` instance by passing a second argument into the `Line` method as an object with the keys you want to override. + +For example, we could have a line chart without bezier curves between points by doing the following: + +```javascript +new Chart(ctx).Line(data, { + bezierCurve: false +}); +// This will create a chart with all of the default options, merged from the global config, +// and the Line chart defaults, but this particular instance will have `bezierCurve` set to false. +``` + +We can also change these defaults values for each Line type that is created, this object is available at `Chart.defaults.Line`. + + +### Prototype methods + +#### .getPointsAtEvent( event ) + +Calling `getPointsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the point elements that are at that the same position of that event. + +```javascript +canvas.onclick = function(evt){ + var activePoints = myLineChart.getPointsAtEvent(evt); + // => activePoints is an array of points on the canvas that are at the same position as the click event. +}; +``` + +This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. + +#### .update( ) + +Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop. + +```javascript +myLineChart.datasets[0].points[2].value = 50; +// Would update the first dataset's value of 'March' to be 50 +myLineChart.update(); +// Calling update now animates the position of March from 90 to 50. +``` + +#### .addData( valuesArray, label ) + +Calling `addData(valuesArray, label)` on your Chart instance passing an array of values for each dataset, along with a label for those points. + +```javascript +// The values array passed into addData should be one for each dataset in the chart +myLineChart.addData([40, 60], "August"); +// This new data will now animate at the end of the chart. +``` + +#### .removeData( ) + +Calling `removeData()` on your Chart instance will remove the first value for all datasets on the chart. + +```javascript +myLineChart.removeData(); +// The chart will remove the first point and animate other points into place +``` diff --git a/bower_components/Chart.js/docs/02-Bar-Chart.md b/bower_components/Chart.js/docs/02-Bar-Chart.md new file mode 100644 index 0000000..cc23f38 --- /dev/null +++ b/bower_components/Chart.js/docs/02-Bar-Chart.md @@ -0,0 +1,149 @@ +--- +title: Bar Chart +anchor: bar-chart +--- + +### Introduction +A bar chart is a way of showing data as bars. + +It is sometimes used to show trend data, and the comparison of multiple data sets side by side. + +
    + +
    + +### Example usage +```javascript +var myBarChart = new Chart(ctx).Bar(data, options); +``` + +### Data structure + +```javascript +var data = { + labels: ["January", "February", "March", "April", "May", "June", "July"], + datasets: [ + { + label: "My First dataset", + fillColor: "rgba(220,220,220,0.5)", + strokeColor: "rgba(220,220,220,0.8)", + highlightFill: "rgba(220,220,220,0.75)", + highlightStroke: "rgba(220,220,220,1)", + data: [65, 59, 80, 81, 56, 55, 40] + }, + { + label: "My Second dataset", + fillColor: "rgba(151,187,205,0.5)", + strokeColor: "rgba(151,187,205,0.8)", + highlightFill: "rgba(151,187,205,0.75)", + highlightStroke: "rgba(151,187,205,1)", + data: [28, 48, 40, 19, 86, 27, 90] + } + ] +}; +``` +The bar chart has the a very similar data structure to the line chart, and has an array of datasets, each with colours and an array of data. Again, colours are in CSS format. +We have an array of labels too for display. In the example, we are showing the same data as the previous line chart example. + +The label key on each dataset is optional, and can be used when generating a scale for the chart. + +### Chart Options + +These are the customisation options specific to Bar charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. + +```javascript +{ + //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero : true, + + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - If there is a stroke on each bar + barShowStroke : true, + + //Number - Pixel width of the bar stroke + barStrokeWidth : 2, + + //Number - Spacing between each of the X value sets + barValueSpacing : 5, + + //Number - Spacing between data sets within X values + barDatasetSpacing : 1, + {% raw %} + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    " + {% endraw %} +} +``` + +You can override these for your `Chart` instance by passing a second argument into the `Bar` method as an object with the keys you want to override. + +For example, we could have a bar chart without a stroke on each bar by doing the following: + +```javascript +new Chart(ctx).Bar(data, { + barShowStroke: false +}); +// This will create a chart with all of the default options, merged from the global config, +// and the Bar chart defaults but this particular instance will have `barShowStroke` set to false. +``` + +We can also change these defaults values for each Bar type that is created, this object is available at `Chart.defaults.Bar`. + +### Prototype methods + +#### .getBarsAtEvent( event ) + +Calling `getBarsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the bar elements that are at that the same position of that event. + +```javascript +canvas.onclick = function(evt){ + var activeBars = myBarChart.getBarsAtEvent(evt); + // => activeBars is an array of bars on the canvas that are at the same position as the click event. +}; +``` + +This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. + +#### .update( ) + +Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop. + +```javascript +myBarChart.datasets[0].bars[2].value = 50; +// Would update the first dataset's value of 'March' to be 50 +myBarChart.update(); +// Calling update now animates the position of March from 90 to 50. +``` + +#### .addData( valuesArray, label ) + +Calling `addData(valuesArray, label)` on your Chart instance passing an array of values for each dataset, along with a label for those bars. + +```javascript +// The values array passed into addData should be one for each dataset in the chart +myBarChart.addData([40, 60], "August"); +// The new data will now animate at the end of the chart. +``` + +#### .removeData( ) + +Calling `removeData()` on your Chart instance will remove the first value for all datasets on the chart. + +```javascript +myBarChart.removeData(); +// The chart will now animate and remove the first bar +``` diff --git a/bower_components/Chart.js/docs/03-Radar-Chart.md b/bower_components/Chart.js/docs/03-Radar-Chart.md new file mode 100644 index 0000000..03dcf6e --- /dev/null +++ b/bower_components/Chart.js/docs/03-Radar-Chart.md @@ -0,0 +1,177 @@ +--- +title: Radar Chart +anchor: radar-chart +--- + +###Introduction +A radar chart is a way of showing multiple data points and the variation between them. + +They are often useful for comparing the points of two or more different data sets. + +
    + +
    + +###Example usage + +```javascript +var myRadarChart = new Chart(ctx).Radar(data, options); +``` + +###Data structure +```javascript +var data = { + labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"], + datasets: [ + { + label: "My First dataset", + fillColor: "rgba(220,220,220,0.2)", + strokeColor: "rgba(220,220,220,1)", + pointColor: "rgba(220,220,220,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(220,220,220,1)", + data: [65, 59, 90, 81, 56, 55, 40] + }, + { + label: "My Second dataset", + fillColor: "rgba(151,187,205,0.2)", + strokeColor: "rgba(151,187,205,1)", + pointColor: "rgba(151,187,205,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(151,187,205,1)", + data: [28, 48, 40, 19, 96, 27, 100] + } + ] +}; +``` +For a radar chart, to provide context of what each point means, we include an array of strings that show around each point in the chart. +For the radar chart data, we have an array of datasets. Each of these is an object, with a fill colour, a stroke colour, a colour for the fill of each point, and a colour for the stroke of each point. We also have an array of data values. + +The label key on each dataset is optional, and can be used when generating a scale for the chart. + +### Chart options + +These are the customisation options specific to Radar charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. + + +```javascript +{ + //Boolean - Whether to show lines for each scale point + scaleShowLine : true, + + //Boolean - Whether we show the angle lines out of the radar + angleShowLineOut : true, + + //Boolean - Whether to show labels on the scale + scaleShowLabels : false, + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //String - Colour of the angle line + angleLineColor : "rgba(0,0,0,.1)", + + //Number - Pixel width of the angle line + angleLineWidth : 1, + + //String - Point label font declaration + pointLabelFontFamily : "'Arial'", + + //String - Point label font weight + pointLabelFontStyle : "normal", + + //Number - Point label font size in pixels + pointLabelFontSize : 10, + + //String - Point label font colour + pointLabelFontColor : "#666", + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 3, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + {% raw %} + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    " + {% endraw %} +} +``` + + +You can override these for your `Chart` instance by passing a second argument into the `Radar` method as an object with the keys you want to override. + +For example, we could have a radar chart without a point for each on piece of data by doing the following: + +```javascript +new Chart(ctx).Radar(data, { + pointDot: false +}); +// This will create a chart with all of the default options, merged from the global config, +// and the Bar chart defaults but this particular instance will have `pointDot` set to false. +``` + +We can also change these defaults values for each Radar type that is created, this object is available at `Chart.defaults.Radar`. + + +### Prototype methods + +#### .getPointsAtEvent( event ) + +Calling `getPointsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the point elements that are at that the same position of that event. + +```javascript +canvas.onclick = function(evt){ + var activePoints = myRadarChart.getPointsAtEvent(evt); + // => activePoints is an array of points on the canvas that are at the same position as the click event. +}; +``` + +This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. + +#### .update( ) + +Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop. + +```javascript +myRadarChart.datasets[0].points[2].value = 50; +// Would update the first dataset's value of 'Sleeping' to be 50 +myRadarChart.update(); +// Calling update now animates the position of Sleeping from 90 to 50. +``` + +#### .addData( valuesArray, label ) + +Calling `addData(valuesArray, label)` on your Chart instance passing an array of values for each dataset, along with a label for those points. + +```javascript +// The values array passed into addData should be one for each dataset in the chart +myRadarChart.addData([40, 60], "Dancing"); +// The new data will now animate at the end of the chart. +``` + +#### .removeData( ) + +Calling `removeData()` on your Chart instance will remove the first value for all datasets on the chart. + +```javascript +myRadarChart.removeData(); +// Other points will now animate to their correct positions. +``` \ No newline at end of file diff --git a/bower_components/Chart.js/docs/04-Polar-Area-Chart.md b/bower_components/Chart.js/docs/04-Polar-Area-Chart.md new file mode 100644 index 0000000..658da54 --- /dev/null +++ b/bower_components/Chart.js/docs/04-Polar-Area-Chart.md @@ -0,0 +1,172 @@ +--- +title: Polar Area Chart +anchor: polar-area-chart +--- +### Introduction +Polar area charts are similar to pie charts, but each segment has the same angle - the radius of the segment differs depending on the value. + +This type of chart is often useful when we want to show a comparison data similar to a pie chart, but also show a scale of values for context. + +
    + +
    + +### Example usage + +```javascript +new Chart(ctx).PolarArea(data, options); +``` + +### Data structure + +```javascript +var data = [ + { + value: 300, + color:"#F7464A", + highlight: "#FF5A5E", + label: "Red" + }, + { + value: 50, + color: "#46BFBD", + highlight: "#5AD3D1", + label: "Green" + }, + { + value: 100, + color: "#FDB45C", + highlight: "#FFC870", + label: "Yellow" + }, + { + value: 40, + color: "#949FB1", + highlight: "#A8B3C5", + label: "Grey" + }, + { + value: 120, + color: "#4D5360", + highlight: "#616774", + label: "Dark Grey" + } + +]; +``` +As you can see, for the chart data you pass in an array of objects, with a value and a colour. The value attribute should be a number, while the color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL. + +### Chart options + +These are the customisation options specific to Polar Area charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. + +```javascript +{ + //Boolean - Show a backdrop to the scale label + scaleShowLabelBackdrop : true, + + //String - The colour of the label backdrop + scaleBackdropColor : "rgba(255,255,255,0.75)", + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //Number - The backdrop padding above & below the label in pixels + scaleBackdropPaddingY : 2, + + //Number - The backdrop padding to the side of the label in pixels + scaleBackdropPaddingX : 2, + + //Boolean - Show line for each value in the scale + scaleShowLine : true, + + //Boolean - Stroke a line around each segment in the chart + segmentShowStroke : true, + + //String - The colour of the stroke on each segement. + segmentStrokeColor : "#fff", + + //Number - The width of the stroke value in pixels + segmentStrokeWidth : 2, + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect. + animationEasing : "easeOutBounce", + + //Boolean - Whether to animate the rotation of the chart + animateRotate : true, + + //Boolean - Whether to animate scaling the chart from the centre + animateScale : false, + {% raw %} + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    " + {% endraw %} +} +``` + +You can override these for your `Chart` instance by passing a second argument into the `PolarArea` method as an object with the keys you want to override. + +For example, we could have a polar area chart with a black stroke on each segment like so: + +```javascript +new Chart(ctx).PolarArea(data, { + segmentStrokeColor: "#000000" +}); +// This will create a chart with all of the default options, merged from the global config, +// and the PolarArea chart defaults but this particular instance will have `segmentStrokeColor` set to `"#000000"`. +``` + +We can also change these defaults values for each PolarArea type that is created, this object is available at `Chart.defaults.PolarArea`. + +### Prototype methods + +#### .getSegmentsAtEvent( event ) + +Calling `getSegmentsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the segment elements that are at that the same position of that event. + +```javascript +canvas.onclick = function(evt){ + var activePoints = myPolarAreaChart.getSegmentsAtEvent(evt); + // => activePoints is an array of segments on the canvas that are at the same position as the click event. +}; +``` + +This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. + +#### .update( ) + +Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop. + +```javascript +myPolarAreaChart.segments[1].value = 10; +// Would update the first dataset's value of 'Green' to be 10 +myPolarAreaChart.update(); +// Calling update now animates the position of Green from 50 to 10. +``` + +#### .addData( segmentData, index ) + +Calling `addData(segmentData, index)` on your Chart instance passing an object in the same format as in the constructor. There is an option second argument of 'index', this determines at what index the new segment should be inserted into the chart. + +```javascript +// An object in the same format as the original data source +myPolarAreaChart.addData({ + value: 130, + color: "#B48EAD", + highlight: "#C69CBE", + label: "Purple" +}); +// The new segment will now animate in. +``` + +#### .removeData( index ) + +Calling `removeData(index)` on your Chart instance will remove segment at that particular index. If none is provided, it will default to the last segment. + +```javascript +myPolarAreaChart.removeData(); +// Other segments will update to fill the empty space left. +``` \ No newline at end of file diff --git a/bower_components/Chart.js/docs/05-Pie-Doughnut-Chart.md b/bower_components/Chart.js/docs/05-Pie-Doughnut-Chart.md new file mode 100644 index 0000000..dd9de6f --- /dev/null +++ b/bower_components/Chart.js/docs/05-Pie-Doughnut-Chart.md @@ -0,0 +1,158 @@ +--- +title: Pie & Doughnut Charts +anchor: doughnut-pie-chart +--- +###Introduction +Pie and doughnut charts are probably the most commonly used chart there are. They are divided into segments, the arc of each segment shows the proportional value of each piece of data. + +They are excellent at showing the relational proportions between data. + +Pie and doughnut charts are effectively the same class in Chart.js, but have one different default value - their `percentageInnerCutout`. This equates what percentage of the inner should be cut out. This defaults to `0` for pie charts, and `50` for doughnuts. + +They are also registered under two aliases in the `Chart` core. Other than their different default value, and different alias, they are exactly the same. + +
    + +
    + +
    + +
    + + +### Example usage + +```javascript +// For a pie chart +var myPieChart = new Chart(ctx[0]).Pie(data,options); + +// And for a doughnut chart +var myDoughnutChart = new Chart(ctx[1]).Doughnut(data,options); +``` + +### Data structure + +```javascript +var data = [ + { + value: 300, + color:"#F7464A", + highlight: "#FF5A5E", + label: "Red" + }, + { + value: 50, + color: "#46BFBD", + highlight: "#5AD3D1", + label: "Green" + }, + { + value: 100, + color: "#FDB45C", + highlight: "#FFC870", + label: "Yellow" + } +] +``` + +For a pie chart, you must pass in an array of objects with a value and a color property. The value attribute should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each. The color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL. + +### Chart options + +These are the customisation options specific to Pie & Doughnut charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. + +```javascript +{ + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke : true, + + //String - The colour of each segment stroke + segmentStrokeColor : "#fff", + + //Number - The width of each segment stroke + segmentStrokeWidth : 2, + + //Number - The percentage of the chart that we cut out of the middle + percentageInnerCutout : 50, // This is 0 for Pie charts + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect + animationEasing : "easeOutBounce", + + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate : true, + + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale : false, + {% raw %} + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    " + {% endraw %} +} +``` +You can override these for your `Chart` instance by passing a second argument into the `Doughnut` method as an object with the keys you want to override. + +For example, we could have a doughnut chart that animates by scaling out from the centre like so: + +```javascript +new Chart(ctx).Doughnut(data, { + animateScale: true +}); +// This will create a chart with all of the default options, merged from the global config, +// and the Doughnut chart defaults but this particular instance will have `animateScale` set to `true`. +``` + +We can also change these default values for each Doughnut type that is created, this object is available at `Chart.defaults.Doughnut`. Pie charts also have a clone of these defaults available to change at `Chart.defaults.Pie`, with the only difference being `percentageInnerCutout` being set to 0. + +### Prototype methods + +#### .getSegmentsAtEvent( event ) + +Calling `getSegmentsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the segment elements that are at the same position of that event. + +```javascript +canvas.onclick = function(evt){ + var activePoints = myDoughnutChart.getSegmentsAtEvent(evt); + // => activePoints is an array of segments on the canvas that are at the same position as the click event. +}; +``` + +This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. + +#### .update( ) + +Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop. + +```javascript +myDoughnutChart.segments[1].value = 10; +// Would update the first dataset's value of 'Green' to be 10 +myDoughnutChart.update(); +// Calling update now animates the circumference of the segment 'Green' from 50 to 10. +// and transitions other segment widths +``` + +#### .addData( segmentData, index ) + +Calling `addData(segmentData, index)` on your Chart instance passing an object in the same format as in the constructor. There is an optional second argument of 'index', this determines at what index the new segment should be inserted into the chart. + +```javascript +// An object in the same format as the original data source +myDoughnutChart.addData({ + value: 130, + color: "#B48EAD", + highlight: "#C69CBE", + label: "Purple" +}); +// The new segment will now animate in. +``` + +#### .removeData( index ) + +Calling `removeData(index)` on your Chart instance will remove segment at that particular index. If none is provided, it will default to the last segment. + +```javascript +myDoughnutChart.removeData(); +// Other segments will update to fill the empty space left. +``` diff --git a/bower_components/Chart.js/docs/06-Advanced.md b/bower_components/Chart.js/docs/06-Advanced.md new file mode 100644 index 0000000..f0495bf --- /dev/null +++ b/bower_components/Chart.js/docs/06-Advanced.md @@ -0,0 +1,185 @@ +--- +title: Advanced usage +anchor: advanced-usage +--- + + +### Prototype methods + +For each chart, there are a set of global prototype methods on the shared `ChartType` which you may find useful. These are available on all charts created with Chart.js, but for the examples, let's use a line chart we've made. + +```javascript +// For example: +var myLineChart = new Chart(ctx).Line(data); +``` + +#### .clear() + +Will clear the chart canvas. Used extensively internally between animation frames, but you might find it useful. + +```javascript +// Will clear the canvas that myLineChart is drawn on +myLineChart.clear(); +// => returns 'this' for chainability +``` + +#### .stop() + +Use this to stop any current animation loop. This will pause the chart during any current animation frame. Call `.render()` to re-animate. + +```javascript +// Stops the charts animation loop at its current frame +myLineChart.stop(); +// => returns 'this' for chainability +``` + +#### .resize() + +Use this to manually resize the canvas element. This is run each time the browser is resized, but you can call this method manually if you change the size of the canvas nodes container element. + +```javascript +// Resizes & redraws to fill its container element +myLineChart.resize(); +// => returns 'this' for chainability +``` + +#### .destroy() + +Use this to destroy any chart instances that are created. This will clean up any references stored to the chart object within Chart.js, along with any associated event listeners attached by Chart.js. + +```javascript +// Destroys a specific chart instance +myLineChart.destroy(); +``` + +#### .toBase64Image() + +This returns a base 64 encoded string of the chart in it's current state. + +```javascript +myLineChart.toBase64Image(); +// => returns png data url of the image on the canvas +``` + +#### .generateLegend() + +Returns an HTML string of a legend for that chart. The template for this legend is at `legendTemplate` in the chart options. + +```javascript +myLineChart.generateLegend(); +// => returns HTML string of a legend for this chart +``` + +### External Tooltips + +You can enable custom tooltips in the global or chart configuration like so: + +```javascript +var myPieChart = new Chart(ctx).Pie(data, { + customTooltips: function(tooltip) { + + // tooltip will be false if tooltip is not visible or should be hidden + if (!tooltip) { + return; + } + + // Otherwise, tooltip will be an object with all tooltip properties like: + + // tooltip.caretHeight + // tooltip.caretPadding + // tooltip.chart + // tooltip.cornerRadius + // tooltip.fillColor + // tooltip.font... + // tooltip.text + // tooltip.x + // tooltip.y + // etc... + + }; +}); +``` + +See files `sample/pie-customTooltips.html` and `sample/line-customTooltips.html` for examples on how to get started. + + +### Writing new chart types + +Chart.js 1.0 has been rewritten to provide a platform for developers to create their own custom chart types, and be able to share and utilise them through the Chart.js API. + +The format is relatively simple, there are a set of utility helper methods under `Chart.helpers`, including things such as looping over collections, requesting animation frames, and easing equations. + +On top of this, there are also some simple base classes of Chart elements, these all extend from `Chart.Element`, and include things such as points, bars and scales. + +```javascript +Chart.Type.extend({ + // Passing in a name registers this chart in the Chart namespace + name: "Scatter", + // Providing a defaults will also register the deafults in the chart namespace + defaults : { + options: "Here", + available: "at this.options" + }, + // Initialize is fired when the chart is initialized - Data is passed in as a parameter + // Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data){ + this.chart.ctx // The drawing context for this chart + this.chart.canvas // the canvas node for this chart + }, + // Used to draw something on the canvas + draw: function() { + } +}); + +// Now we can create a new instance of our chart, using the Chart.js API +new Chart(ctx).Scatter(data); +// initialize is now run +``` + +### Extending existing chart types + +We can also extend existing chart types, and expose them to the API in the same way. Let's say for example, we might want to run some more code when we initialize every Line chart. + +```javascript +// Notice now we're extending the particular Line chart type, rather than the base class. +Chart.types.Line.extend({ + // Passing in a name registers this chart in the Chart namespace in the same way + name: "LineAlt", + initialize: function(data){ + console.log('My Line chart extension'); + Chart.types.Line.prototype.initialize.apply(this, arguments); + } +}); + +// Creates a line chart in the same way +new Chart(ctx).LineAlt(data); +// but this logs 'My Line chart extension' in the console. +``` + +### Community extensions + +- Stacked Bar Chart by @Regaddi +- Error bars (bar and line charts) by @CAYdenberg + +### Creating custom builds + +Chart.js uses gulp to build the library into a single JavaScript file. We can use this same build script with custom parameters in order to build a custom version. + +Firstly, we need to ensure development dependencies are installed. With node and npm installed, after cloning the Chart.js repo to a local directory, and navigating to that directory in the command line, we can run the following: + +```bash +npm install +npm install -g gulp +``` + +This will install the local development dependencies for Chart.js, along with a CLI for the JavaScript task runner gulp. + +Now, we can run the `gulp build` task, and pass in a comma seperated list of types as an argument to build a custom version of Chart.js with only specified chart types. + +Here we will create a version of Chart.js with only Line, Radar and Bar charts included: + +```bash +gulp build --types=Line,Radar,Bar +``` + +This will output to the `/custom` directory, and write two files, Chart.js, and Chart.min.js with only those chart types included. diff --git a/bower_components/Chart.js/docs/07-Notes.md b/bower_components/Chart.js/docs/07-Notes.md new file mode 100644 index 0000000..8ba5a59 --- /dev/null +++ b/bower_components/Chart.js/docs/07-Notes.md @@ -0,0 +1,42 @@ +--- +title: Notes +anchor: notes +--- + +### Browser support +Browser support for the canvas element is available in all modern & major mobile browsers (caniuse.com/canvas). + +For IE8 & below, I would recommend using the polyfill ExplorerCanvas - available at https://code.google.com/p/explorercanvas/. It falls back to Internet explorer's format VML when canvas support is not available. Example use: + +```html + + + +``` + +Usually I would recommend feature detection to choose whether or not to load a polyfill, rather than IE conditional comments, however in this case, VML is a Microsoft proprietary format, so it will only work in IE. + +Some important points to note in my experience using ExplorerCanvas as a fallback. + +- Initialise charts on load rather than DOMContentReady when using the library, as sometimes a race condition will occur, and it will result in an error when trying to get the 2d context of a canvas. +- New VML DOM elements are being created for each animation frame and there is no hardware acceleration. As a result animation is usually slow and jerky, with flashing text. It is a good idea to dynamically turn off animation based on canvas support. I recommend using the excellent Modernizr to do this. +- When declaring fonts, the library explorercanvas requires the font name to be in single quotes inside the string. For example, instead of your scaleFontFamily property being simply "Arial", explorercanvas support, use "'Arial'" instead. Chart.js does this for default values. + +### Bugs & issues + +Please report these on the GitHub page - at github.com/nnnick/Chart.js. If you could include a link to a simple jsbin or similar to demonstrate the issue, that'd be really helpful. + + +### Contributing +New contributions to the library are welcome, just a couple of guidelines: + +- Tabs for indentation, not spaces please. +- Please ensure you're changing the individual files in `/src`, not the concatenated output in the `Chart.js` file in the root of the repo. +- Please check that your code will pass `jshint` code standards, `gulp jshint` will run this for you. +- Please keep pull requests concise, and document new functionality in the relevant `.md` file. +- Consider whether your changes are useful for all users, or if creating a Chart.js extension would be more appropriate. + +### License +Chart.js is open source and available under the MIT license. \ No newline at end of file diff --git a/bower_components/Chart.js/gulpfile.js b/bower_components/Chart.js/gulpfile.js new file mode 100644 index 0000000..e8fe1c7 --- /dev/null +++ b/bower_components/Chart.js/gulpfile.js @@ -0,0 +1,137 @@ +var gulp = require('gulp'), + concat = require('gulp-concat'), + uglify = require('gulp-uglify'), + util = require('gulp-util'), + jshint = require('gulp-jshint'), + size = require('gulp-size'), + connect = require('gulp-connect'), + replace = require('gulp-replace'), + htmlv = require('gulp-html-validator'), + inquirer = require('inquirer'), + semver = require('semver'), + exec = require('child_process').exec, + fs = require('fs'), + package = require('./package.json'), + bower = require('./bower.json'); + +var srcDir = './src/'; +/* + * Usage : gulp build --types=Bar,Line,Doughnut + * Output: - A built Chart.js file with Core and types Bar, Line and Doughnut concatenated together + * - A minified version of this code, in Chart.min.js + */ + +gulp.task('build', function(){ + + // Default to all of the chart types, with Chart.Core first + var srcFiles = [FileName('Core')], + isCustom = !!(util.env.types), + outputDir = (isCustom) ? 'custom' : '.'; + if (isCustom){ + util.env.types.split(',').forEach(function(type){ return srcFiles.push(FileName(type))}); + } + else{ + // Seems gulp-concat remove duplicates - nice! + // So we can use this to sort out dependency order - aka include Core first! + srcFiles.push(srcDir+'*'); + } + + return gulp.src(srcFiles) + .pipe(concat('Chart.js')) + .pipe(replace('{{ version }}', package.version)) + .pipe(gulp.dest(outputDir)) + .pipe(uglify({preserveComments:'some'})) + .pipe(concat('Chart.min.js')) + .pipe(gulp.dest(outputDir)); + + function FileName(moduleName){ + return srcDir+'Chart.'+moduleName+'.js'; + }; +}); + +/* + * Usage : gulp bump + * Prompts: Version increment to bump + * Output: - New version number written into package.json & bower.json + */ + +gulp.task('bump', function(complete){ + util.log('Current version:', util.colors.cyan(package.version)); + var choices = ['major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease'].map(function(versionType){ + return versionType + ' (v' + semver.inc(package.version, versionType) + ')'; + }); + inquirer.prompt({ + type: 'list', + name: 'version', + message: 'What version update would you like?', + choices: choices + }, function(res){ + var increment = res.version.split(' ')[0], + newVersion = semver.inc(package.version, increment); + + // Set the new versions into the bower/package object + package.version = newVersion; + bower.version = newVersion; + + // Write these to their own files, then build the output + fs.writeFileSync('package.json', JSON.stringify(package, null, 2)); + fs.writeFileSync('bower.json', JSON.stringify(bower, null, 2)); + + complete(); + }); +}); + +gulp.task('release', ['build'], function(){ + exec('git tag -a v' + package.version); +}); + +gulp.task('jshint', function(){ + return gulp.src(srcDir + '*.js') + .pipe(jshint()) + .pipe(jshint.reporter('default')); +}); + +gulp.task('valid', function(){ + return gulp.src('samples/*.html') + .pipe(htmlv()); +}); + +gulp.task('library-size', function(){ + return gulp.src('Chart.min.js') + .pipe(size({ + gzip: true + })); +}); + +gulp.task('module-sizes', function(){ + return gulp.src(srcDir + '*.js') + .pipe(uglify({preserveComments:'some'})) + .pipe(size({ + showFiles: true, + gzip: true + })) +}); + +gulp.task('watch', function(){ + gulp.watch('./src/*', ['build']); +}); + +gulp.task('test', ['jshint', 'valid']); + +gulp.task('size', ['library-size', 'module-sizes']); + +gulp.task('default', ['build', 'watch']); + +gulp.task('server', function(){ + connect.server({ + port: 8000 + }); +}); + +// Convenience task for opening the project straight from the command line +gulp.task('_open', function(){ + exec('open http://localhost:8000'); + exec('subl .'); +}); + +gulp.task('dev', ['server', 'default']); diff --git a/bower_components/Chart.js/package.json b/bower_components/Chart.js/package.json new file mode 100644 index 0000000..9ac4a0e --- /dev/null +++ b/bower_components/Chart.js/package.json @@ -0,0 +1,28 @@ +{ + "name": "chart.js", + "homepage": "http://www.chartjs.org", + "description": "Simple HTML5 charts using the canvas element.", + "version": "1.0.2", + "main": "Chart.js", + "repository": { + "type": "git", + "url": "https://github.com/nnnick/Chart.js.git" + }, + "dependences": {}, + "devDependencies": { + "gulp": "3.5.x", + "gulp-concat": "~2.1.x", + "gulp-connect": "~2.0.5", + "gulp-jshint": "~1.5.1", + "gulp-replace": "^0.4.0", + "gulp-size": "~0.4.0", + "gulp-uglify": "~0.2.x", + "gulp-util": "~2.2.x", + "gulp-html-validator": "^0.0.2", + "inquirer": "^0.5.1", + "semver": "^3.0.1" + }, + "spm": { + "main": "Chart.js" + } +} \ No newline at end of file diff --git a/bower_components/Chart.js/samples/bar.html b/bower_components/Chart.js/samples/bar.html new file mode 100644 index 0000000..5bf4b5b --- /dev/null +++ b/bower_components/Chart.js/samples/bar.html @@ -0,0 +1,45 @@ + + + + Bar Chart + + + +
    + +
    + + + + + diff --git a/bower_components/Chart.js/samples/doughnut.html b/bower_components/Chart.js/samples/doughnut.html new file mode 100644 index 0000000..fdf7539 --- /dev/null +++ b/bower_components/Chart.js/samples/doughnut.html @@ -0,0 +1,67 @@ + + + + Doughnut Chart + + + + +
    + +
    + + + + + diff --git a/bower_components/Chart.js/samples/line-customTooltips.html b/bower_components/Chart.js/samples/line-customTooltips.html new file mode 100644 index 0000000..4dc46e1 --- /dev/null +++ b/bower_components/Chart.js/samples/line-customTooltips.html @@ -0,0 +1,129 @@ + + + + + Line Chart with Custom Tooltips + + + + + + + +
    + +
    +
    + +
    + +
    + + + + + + diff --git a/bower_components/Chart.js/samples/line.html b/bower_components/Chart.js/samples/line.html new file mode 100644 index 0000000..ccd0dad --- /dev/null +++ b/bower_components/Chart.js/samples/line.html @@ -0,0 +1,54 @@ + + + + Line Chart + + + +
    +
    + +
    +
    + + + + + diff --git a/bower_components/Chart.js/samples/pie-customTooltips.html b/bower_components/Chart.js/samples/pie-customTooltips.html new file mode 100644 index 0000000..732317d --- /dev/null +++ b/bower_components/Chart.js/samples/pie-customTooltips.html @@ -0,0 +1,156 @@ + + + + + Pie Chart with Custom Tooltips + + + + + + + +
    + +
    +
    + +
    + +
    + + + + + + diff --git a/bower_components/Chart.js/samples/pie.html b/bower_components/Chart.js/samples/pie.html new file mode 100644 index 0000000..255a499 --- /dev/null +++ b/bower_components/Chart.js/samples/pie.html @@ -0,0 +1,58 @@ + + + + Pie Chart + + + +
    + +
    + + + + + diff --git a/bower_components/Chart.js/samples/polar-area.html b/bower_components/Chart.js/samples/polar-area.html new file mode 100644 index 0000000..d3d3f01 --- /dev/null +++ b/bower_components/Chart.js/samples/polar-area.html @@ -0,0 +1,60 @@ + + + + Polar Area Chart + + + +
    + +
    + + + + + diff --git a/bower_components/Chart.js/samples/radar.html b/bower_components/Chart.js/samples/radar.html new file mode 100644 index 0000000..6a04f87 --- /dev/null +++ b/bower_components/Chart.js/samples/radar.html @@ -0,0 +1,53 @@ + + + + Radar Chart + + + + + +
    + +
    + + + + + diff --git a/bower_components/Chart.js/src/Chart.Bar.js b/bower_components/Chart.js/src/Chart.Bar.js new file mode 100644 index 0000000..87fb26d --- /dev/null +++ b/bower_components/Chart.js/src/Chart.Bar.js @@ -0,0 +1,302 @@ +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + + var defaultConfig = { + //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero : true, + + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - If there is a stroke on each bar + barShowStroke : true, + + //Number - Pixel width of the bar stroke + barStrokeWidth : 2, + + //Number - Spacing between each of the X value sets + barValueSpacing : 5, + + //Number - Spacing between data sets within X values + barDatasetSpacing : 1, + + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    " + + }; + + + Chart.Type.extend({ + name: "Bar", + defaults : defaultConfig, + initialize: function(data){ + + //Expose options as a scope variable here so we can access it in the ScaleClass + var options = this.options; + + this.ScaleClass = Chart.Scale.extend({ + offsetGridLines : true, + calculateBarX : function(datasetCount, datasetIndex, barIndex){ + //Reusable method for calculating the xPosition of a given bar based on datasetIndex & width of the bar + var xWidth = this.calculateBaseWidth(), + xAbsolute = this.calculateX(barIndex) - (xWidth/2), + barWidth = this.calculateBarWidth(datasetCount); + + return xAbsolute + (barWidth * datasetIndex) + (datasetIndex * options.barDatasetSpacing) + barWidth/2; + }, + calculateBaseWidth : function(){ + return (this.calculateX(1) - this.calculateX(0)) - (2*options.barValueSpacing); + }, + calculateBarWidth : function(datasetCount){ + //The padding between datasets is to the right of each bar, providing that there are more than 1 dataset + var baseWidth = this.calculateBaseWidth() - ((datasetCount - 1) * options.barDatasetSpacing); + + return (baseWidth / datasetCount); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeBars = (evt.type !== 'mouseout') ? this.getBarsAtEvent(evt) : []; + + this.eachBars(function(bar){ + bar.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activeBars, function(activeBar){ + activeBar.fillColor = activeBar.highlightFill; + activeBar.strokeColor = activeBar.highlightStroke; + }); + this.showTooltip(activeBars); + }); + } + + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.BarClass = Chart.Rectangle.extend({ + strokeWidth : this.options.barStrokeWidth, + showStroke : this.options.barShowStroke, + ctx : this.chart.ctx + }); + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset,datasetIndex){ + + var datasetObject = { + label : dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + bars : [] + }; + + this.datasets.push(datasetObject); + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + datasetObject.bars.push(new this.BarClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + strokeColor : dataset.strokeColor, + fillColor : dataset.fillColor, + highlightFill : dataset.highlightFill || dataset.fillColor, + highlightStroke : dataset.highlightStroke || dataset.strokeColor + })); + },this); + + },this); + + this.buildScale(data.labels); + + this.BarClass.prototype.base = this.scale.endPoint; + + this.eachBars(function(bar, index, datasetIndex){ + helpers.extend(bar, { + width : this.scale.calculateBarWidth(this.datasets.length), + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, index), + y: this.scale.endPoint + }); + bar.save(); + }, this); + + this.render(); + }, + update : function(){ + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor', 'strokeColor']); + }); + + this.eachBars(function(bar){ + bar.save(); + }); + this.render(); + }, + eachBars : function(callback){ + helpers.each(this.datasets,function(dataset, datasetIndex){ + helpers.each(dataset.bars, callback, this, datasetIndex); + },this); + }, + getBarsAtEvent : function(e){ + var barsArray = [], + eventPosition = helpers.getRelativePosition(e), + datasetIterator = function(dataset){ + barsArray.push(dataset.bars[barIndex]); + }, + barIndex; + + for (var datasetIndex = 0; datasetIndex < this.datasets.length; datasetIndex++) { + for (barIndex = 0; barIndex < this.datasets[datasetIndex].bars.length; barIndex++) { + if (this.datasets[datasetIndex].bars[barIndex].inRange(eventPosition.x,eventPosition.y)){ + helpers.each(this.datasets, datasetIterator); + return barsArray; + } + } + } + + return barsArray; + }, + buildScale : function(labels){ + var self = this; + + var dataTotal = function(){ + var values = []; + self.eachBars(function(bar){ + values.push(bar.value); + }); + return values; + }; + + var scaleOptions = { + templateString : this.options.scaleLabel, + height : this.chart.height, + width : this.chart.width, + ctx : this.chart.ctx, + textColor : this.options.scaleFontColor, + fontSize : this.options.scaleFontSize, + fontStyle : this.options.scaleFontStyle, + fontFamily : this.options.scaleFontFamily, + valuesCount : labels.length, + beginAtZero : this.options.scaleBeginAtZero, + integersOnly : this.options.scaleIntegersOnly, + calculateYRange: function(currentHeight){ + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels : labels, + font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth : this.options.scaleLineWidth, + lineColor : this.options.scaleLineColor, + showHorizontalLines : this.options.scaleShowHorizontalLines, + showVerticalLines : this.options.scaleShowVerticalLines, + gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + padding : (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0, + showLabels : this.options.scaleShowLabels, + display : this.options.showScale + }; + + if (this.options.scaleOverride){ + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + this.scale = new this.ScaleClass(scaleOptions); + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + helpers.each(valuesArray,function(value,datasetIndex){ + //Add a new point for each piece of data, passing any required data to draw. + this.datasets[datasetIndex].bars.push(new this.BarClass({ + value : value, + label : label, + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, this.scale.valuesCount+1), + y: this.scale.endPoint, + width : this.scale.calculateBarWidth(this.datasets.length), + base : this.scale.endPoint, + strokeColor : this.datasets[datasetIndex].strokeColor, + fillColor : this.datasets[datasetIndex].fillColor + })); + },this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData : function(){ + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets,function(dataset){ + dataset.bars.shift(); + },this); + this.update(); + }, + reflow : function(){ + helpers.extend(this.BarClass.prototype,{ + y: this.scale.endPoint, + base : this.scale.endPoint + }); + var newScaleProps = helpers.extend({ + height : this.chart.height, + width : this.chart.width + }); + this.scale.update(newScaleProps); + }, + draw : function(ease){ + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + this.scale.draw(easingDecimal); + + //Draw all the bars for each dataset + helpers.each(this.datasets,function(dataset,datasetIndex){ + helpers.each(dataset.bars,function(bar,index){ + if (bar.hasValue()){ + bar.base = this.scale.endPoint; + //Transition then draw + bar.transition({ + x : this.scale.calculateBarX(this.datasets.length, datasetIndex, index), + y : this.scale.calculateY(bar.value), + width : this.scale.calculateBarWidth(this.datasets.length) + }, easingDecimal).draw(); + } + },this); + + },this); + } + }); + + +}).call(this); diff --git a/bower_components/Chart.js/src/Chart.Core.js b/bower_components/Chart.js/src/Chart.Core.js new file mode 100644 index 0000000..5dccd2e --- /dev/null +++ b/bower_components/Chart.js/src/Chart.Core.js @@ -0,0 +1,2021 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: {{ version }} + * + * Copyright 2015 Nick Downie + * Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + */ + + +(function(){ + + "use strict"; + + //Declare root variable - window in the browser, global on the server + var root = this, + previous = root.Chart; + + //Occupy the global variable of Chart, and create a simple base class + var Chart = function(context){ + var chart = this; + this.canvas = context.canvas; + + this.ctx = context; + + //Variables global to the chart + var computeDimension = function(element,dimension) + { + if (element['offset'+dimension]) + { + return element['offset'+dimension]; + } + else + { + return document.defaultView.getComputedStyle(element).getPropertyValue(dimension); + } + } + + var width = this.width = computeDimension(context.canvas,'Width'); + var height = this.height = computeDimension(context.canvas,'Height'); + + // Firefox requires this to work correctly + context.canvas.width = width; + context.canvas.height = height; + + var width = this.width = context.canvas.width; + var height = this.height = context.canvas.height; + this.aspectRatio = this.width / this.height; + //High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale. + helpers.retinaScale(this); + + return this; + }; + //Globally expose the defaults to allow for user updating/changing + Chart.defaults = { + global: { + // Boolean - Whether to animate the chart + animation: true, + + // Number - Number of animation steps + animationSteps: 60, + + // String - Animation easing effect + animationEasing: "easeOutQuart", + + // Boolean - If we should show the scale at all + showScale: true, + + // Boolean - If we want to override with a hard coded scale + scaleOverride: false, + + // ** Required if scaleOverride is true ** + // Number - The number of steps in a hard coded scale + scaleSteps: null, + // Number - The value jump in the hard coded scale + scaleStepWidth: null, + // Number - The scale starting value + scaleStartValue: null, + + // String - Colour of the scale line + scaleLineColor: "rgba(0,0,0,.1)", + + // Number - Pixel width of the scale line + scaleLineWidth: 1, + + // Boolean - Whether to show labels on the scale + scaleShowLabels: true, + + // Interpolated JS string - can access value + scaleLabel: "<%=value%>", + + // Boolean - Whether the scale should stick to integers, and not show any floats even if drawing space is there + scaleIntegersOnly: true, + + // Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero: false, + + // String - Scale label font declaration for the scale label + scaleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Scale label font size in pixels + scaleFontSize: 12, + + // String - Scale label font weight style + scaleFontStyle: "normal", + + // String - Scale label font colour + scaleFontColor: "#666", + + // Boolean - whether or not the chart should be responsive and resize when the browser does. + responsive: false, + + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + + // Boolean - Determines whether to draw tooltips on the canvas or not - attaches events to touchmove & mousemove + showTooltips: true, + + // Boolean - Determines whether to draw built-in tooltip or call custom tooltip function + customTooltips: false, + + // Array - Array of string names to attach tooltip events + tooltipEvents: ["mousemove", "touchstart", "touchmove", "mouseout"], + + // String - Tooltip background colour + tooltipFillColor: "rgba(0,0,0,0.8)", + + // String - Tooltip label font declaration for the scale label + tooltipFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip label font size in pixels + tooltipFontSize: 14, + + // String - Tooltip font weight style + tooltipFontStyle: "normal", + + // String - Tooltip label font colour + tooltipFontColor: "#fff", + + // String - Tooltip title font declaration for the scale label + tooltipTitleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip title font size in pixels + tooltipTitleFontSize: 14, + + // String - Tooltip title font weight style + tooltipTitleFontStyle: "bold", + + // String - Tooltip title font colour + tooltipTitleFontColor: "#fff", + + // Number - pixel width of padding around tooltip text + tooltipYPadding: 6, + + // Number - pixel width of padding around tooltip text + tooltipXPadding: 6, + + // Number - Size of the caret on the tooltip + tooltipCaretSize: 8, + + // Number - Pixel radius of the tooltip border + tooltipCornerRadius: 6, + + // Number - Pixel offset from point x to tooltip edge + tooltipXOffset: 10, + + // String - Template string for single tooltips + tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>", + + // String - Template string for single tooltips + multiTooltipTemplate: "<%= value %>", + + // String - Colour behind the legend colour block + multiTooltipKeyBackground: '#fff', + + // Function - Will fire on animation progression. + onAnimationProgress: function(){}, + + // Function - Will fire on animation completion. + onAnimationComplete: function(){} + + } + }; + + //Create a dictionary of chart types, to allow for extension of existing types + Chart.types = {}; + + //Global Chart helpers object for utility methods and classes + var helpers = Chart.helpers = {}; + + //-- Basic js utility methods + var each = helpers.each = function(loopable,callback,self){ + var additionalArgs = Array.prototype.slice.call(arguments, 3); + // Check to see if null or undefined firstly. + if (loopable){ + if (loopable.length === +loopable.length){ + var i; + for (i=0; i= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)){ + return currentItem; + } + } + }, + inherits = helpers.inherits = function(extensions){ + //Basic javascript inheritance based on the model created in Backbone.js + var parent = this; + var ChartElement = (extensions && extensions.hasOwnProperty("constructor")) ? extensions.constructor : function(){ return parent.apply(this, arguments); }; + + var Surrogate = function(){ this.constructor = ChartElement;}; + Surrogate.prototype = parent.prototype; + ChartElement.prototype = new Surrogate(); + + ChartElement.extend = inherits; + + if (extensions) extend(ChartElement.prototype, extensions); + + ChartElement.__super__ = parent.prototype; + + return ChartElement; + }, + noop = helpers.noop = function(){}, + uid = helpers.uid = (function(){ + var id=0; + return function(){ + return "chart-" + id++; + }; + })(), + warn = helpers.warn = function(str){ + //Method for warning of errors + if (window.console && typeof window.console.warn == "function") console.warn(str); + }, + amd = helpers.amd = (typeof define == 'function' && define.amd), + //-- Math methods + isNumber = helpers.isNumber = function(n){ + return !isNaN(parseFloat(n)) && isFinite(n); + }, + max = helpers.max = function(array){ + return Math.max.apply( Math, array ); + }, + min = helpers.min = function(array){ + return Math.min.apply( Math, array ); + }, + cap = helpers.cap = function(valueToCap,maxValue,minValue){ + if(isNumber(maxValue)) { + if( valueToCap > maxValue ) { + return maxValue; + } + } + else if(isNumber(minValue)){ + if ( valueToCap < minValue ){ + return minValue; + } + } + return valueToCap; + }, + getDecimalPlaces = helpers.getDecimalPlaces = function(num){ + if (num%1!==0 && isNumber(num)){ + return num.toString().split(".")[1].length; + } + else { + return 0; + } + }, + toRadians = helpers.radians = function(degrees){ + return degrees * (Math.PI/180); + }, + // Gets the angle from vertical upright to the point about a centre. + getAngleFromPoint = 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.PI * 2 + Math.atan2(distanceFromYCenter, distanceFromXCenter); + + //If the segment is in the top left quadrant, we need to add another rotation to the angle + if (distanceFromXCenter < 0 && distanceFromYCenter < 0){ + angle += Math.PI*2; + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }, + aliasPixel = helpers.aliasPixel = function(pixelWidth){ + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }, + splineCurve = helpers.splineCurve = function(FirstPoint,MiddlePoint,AfterPoint,t){ + //Props to Rob Spencer at scaled innovation for his post on splining between points + //http://scaledinnovation.com/analytics/splines/aboutSplines.html + var d01=Math.sqrt(Math.pow(MiddlePoint.x-FirstPoint.x,2)+Math.pow(MiddlePoint.y-FirstPoint.y,2)), + d12=Math.sqrt(Math.pow(AfterPoint.x-MiddlePoint.x,2)+Math.pow(AfterPoint.y-MiddlePoint.y,2)), + fa=t*d01/(d01+d12),// scaling factor for triangle Ta + fb=t*d12/(d01+d12); + return { + inner : { + x : MiddlePoint.x-fa*(AfterPoint.x-FirstPoint.x), + y : MiddlePoint.y-fa*(AfterPoint.y-FirstPoint.y) + }, + outer : { + x: MiddlePoint.x+fb*(AfterPoint.x-FirstPoint.x), + y : MiddlePoint.y+fb*(AfterPoint.y-FirstPoint.y) + } + }; + }, + calculateOrderOfMagnitude = helpers.calculateOrderOfMagnitude = function(val){ + return Math.floor(Math.log(val) / Math.LN10); + }, + calculateScaleRange = helpers.calculateScaleRange = function(valuesArray, drawingSize, textSize, startFromZero, integersOnly){ + + //Set a minimum step of two - a point at the top of the graph, and a point at the base + var minSteps = 2, + maxSteps = Math.floor(drawingSize/(textSize * 1.5)), + skipFitting = (minSteps >= maxSteps); + + var maxValue = max(valuesArray), + minValue = min(valuesArray); + + // We need some degree of seperation here to calculate the scales if all the values are the same + // Adding/minusing 0.5 will give us a range of 1. + if (maxValue === minValue){ + maxValue += 0.5; + // So we don't end up with a graph with a negative start value if we've said always start from zero + if (minValue >= 0.5 && !startFromZero){ + minValue -= 0.5; + } + else{ + // Make up a whole number above the values + maxValue += 0.5; + } + } + + var valueRange = Math.abs(maxValue - minValue), + rangeOrderOfMagnitude = calculateOrderOfMagnitude(valueRange), + graphMax = Math.ceil(maxValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude), + graphMin = (startFromZero) ? 0 : Math.floor(minValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude), + graphRange = graphMax - graphMin, + stepValue = Math.pow(10, rangeOrderOfMagnitude), + numberOfSteps = Math.round(graphRange / stepValue); + + //If we have more space on the graph we'll use it to give more definition to the data + while((numberOfSteps > maxSteps || (numberOfSteps * 2) < maxSteps) && !skipFitting) { + if(numberOfSteps > maxSteps){ + stepValue *=2; + numberOfSteps = Math.round(graphRange/stepValue); + // Don't ever deal with a decimal number of steps - cancel fitting and just use the minimum number of steps. + if (numberOfSteps % 1 !== 0){ + skipFitting = true; + } + } + //We can fit in double the amount of scale points on the scale + else{ + //If user has declared ints only, and the step value isn't a decimal + if (integersOnly && rangeOrderOfMagnitude >= 0){ + //If the user has said integers only, we need to check that making the scale more granular wouldn't make it a float + if(stepValue/2 % 1 === 0){ + stepValue /=2; + numberOfSteps = Math.round(graphRange/stepValue); + } + //If it would make it a float break out of the loop + else{ + break; + } + } + //If the scale doesn't have to be an int, make the scale more granular anyway. + else{ + stepValue /=2; + numberOfSteps = Math.round(graphRange/stepValue); + } + + } + } + + if (skipFitting){ + numberOfSteps = minSteps; + stepValue = graphRange / numberOfSteps; + } + + return { + steps : numberOfSteps, + stepValue : stepValue, + min : graphMin, + max : graphMin + (numberOfSteps * stepValue) + }; + + }, + /* jshint ignore:start */ + // Blows up jshint errors based on the new Function constructor + //Templating methods + //Javascript micro templating by John Resig - source at http://ejohn.org/blog/javascript-micro-templating/ + template = helpers.template = function(templateString, valuesObject){ + + // If templateString is function rather than string-template - call the function for valuesObject + + if(templateString instanceof Function){ + return templateString(valuesObject); + } + + var cache = {}; + function tmpl(str, data){ + // Figure out if we're getting a template, or if we need to + // load the template - and be sure to cache the result. + var fn = !/\W/.test(str) ? + cache[str] = cache[str] : + + // Generate a reusable function that will serve as a template + // generator (and which will be cached). + new Function("obj", + "var p=[],print=function(){p.push.apply(p,arguments);};" + + + // Introduce the data as local variables using with(){} + "with(obj){p.push('" + + + // Convert the template into pure JavaScript + str + .replace(/[\r\t\n]/g, " ") + .split("<%").join("\t") + .replace(/((^|%>)[^\t]*)'/g, "$1\r") + .replace(/\t=(.*?)%>/g, "',$1,'") + .split("\t").join("');") + .split("%>").join("p.push('") + .split("\r").join("\\'") + + "');}return p.join('');" + ); + + // Provide some basic currying to the user + return data ? fn( data ) : fn; + } + return tmpl(templateString,valuesObject); + }, + /* jshint ignore:end */ + generateLabels = helpers.generateLabels = function(templateString,numberOfSteps,graphMin,stepValue){ + var labelsArray = new Array(numberOfSteps); + if (labelTemplateString){ + each(labelsArray,function(val,index){ + labelsArray[index] = template(templateString,{value: (graphMin + (stepValue*(index+1)))}); + }); + } + return labelsArray; + }, + //--Animation methods + //Easing functions adapted from Robert Penner's easing equations + //http://www.robertpenner.com/easing/ + 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 (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p)); + }, + easeOutElastic: 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 (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + return a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1; + }, + easeInOutElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) return 0; + if ((t /= 1 / 2) == 2) return 1; + if (!p) p = 1 * (0.3 * 1.5); + if (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + if (t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p)); + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function (t) { + var s = 1.70158; + return 1 * (t /= 1) * t * ((s + 1) * t - s); + }, + easeOutBack: function (t) { + var s = 1.70158; + return 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1); + }, + easeInOutBack: function (t) { + var s = 1.70158; + if ((t /= 1 / 2) < 1) return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)); + return 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + easeInBounce: function (t) { + return 1 - easingEffects.easeOutBounce(1 - t); + }, + easeOutBounce: function (t) { + if ((t /= 1) < (1 / 2.75)) { + return 1 * (7.5625 * t * t); + } else if (t < (2 / 2.75)) { + return 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75); + } else if (t < (2.5 / 2.75)) { + return 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375); + } else { + return 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375); + } + }, + easeInOutBounce: function (t) { + if (t < 1 / 2) return easingEffects.easeInBounce(t * 2) * 0.5; + return easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5; + } + }, + //Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + requestAnimFrame = helpers.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(), + cancelAnimFrame = helpers.cancelAnimFrame = (function(){ + return window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + window.msCancelAnimationFrame || + function(callback) { + return window.clearTimeout(callback, 1000 / 60); + }; + })(), + animationLoop = helpers.animationLoop = function(callback,totalSteps,easingString,onProgress,onComplete,chartInstance){ + + var currentStep = 0, + easingFunction = easingEffects[easingString] || easingEffects.linear; + + var animationFrame = function(){ + currentStep++; + var stepDecimal = currentStep/totalSteps; + var easeDecimal = easingFunction(stepDecimal); + + callback.call(chartInstance,easeDecimal,stepDecimal, currentStep); + onProgress.call(chartInstance,easeDecimal,stepDecimal); + if (currentStep < totalSteps){ + chartInstance.animationFrame = requestAnimFrame(animationFrame); + } else{ + onComplete.apply(chartInstance); + } + }; + requestAnimFrame(animationFrame); + }, + //-- DOM methods + getRelativePosition = helpers.getRelativePosition = function(evt){ + var mouseX, mouseY; + var e = evt.originalEvent || evt, + canvas = evt.currentTarget || evt.srcElement, + boundingRect = canvas.getBoundingClientRect(); + + if (e.touches){ + mouseX = e.touches[0].clientX - boundingRect.left; + mouseY = e.touches[0].clientY - boundingRect.top; + + } + else{ + mouseX = e.clientX - boundingRect.left; + mouseY = e.clientY - boundingRect.top; + } + + return { + x : mouseX, + y : mouseY + }; + + }, + addEvent = 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; + } + }, + removeEvent = 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] = noop; + } + }, + bindEvents = helpers.bindEvents = function(chartInstance, arrayOfEvents, handler){ + // Create the events object if it's not already present + if (!chartInstance.events) chartInstance.events = {}; + + each(arrayOfEvents,function(eventName){ + chartInstance.events[eventName] = function(){ + handler.apply(chartInstance, arguments); + }; + addEvent(chartInstance.chart.canvas,eventName,chartInstance.events[eventName]); + }); + }, + unbindEvents = helpers.unbindEvents = function (chartInstance, arrayOfEvents) { + each(arrayOfEvents, function(handler,eventName){ + removeEvent(chartInstance.chart.canvas, eventName, handler); + }); + }, + getMaximumWidth = helpers.getMaximumWidth = function(domNode){ + var container = domNode.parentNode; + // TODO = check cross browser stuff with this. + return container.clientWidth; + }, + getMaximumHeight = helpers.getMaximumHeight = function(domNode){ + var container = domNode.parentNode; + // TODO = check cross browser stuff with this. + return container.clientHeight; + }, + getMaximumSize = helpers.getMaximumSize = helpers.getMaximumWidth, // legacy support + retinaScale = helpers.retinaScale = function(chart){ + var ctx = chart.ctx, + width = chart.canvas.width, + height = chart.canvas.height; + + if (window.devicePixelRatio) { + ctx.canvas.style.width = width + "px"; + ctx.canvas.style.height = height + "px"; + ctx.canvas.height = height * window.devicePixelRatio; + ctx.canvas.width = width * window.devicePixelRatio; + ctx.scale(window.devicePixelRatio, window.devicePixelRatio); + } + }, + //-- Canvas methods + clear = helpers.clear = function(chart){ + chart.ctx.clearRect(0,0,chart.width,chart.height); + }, + fontString = helpers.fontString = function(pixelSize,fontStyle,fontFamily){ + return fontStyle + " " + pixelSize+"px " + fontFamily; + }, + longestText = helpers.longestText = function(ctx,font,arrayOfStrings){ + ctx.font = font; + var longest = 0; + each(arrayOfStrings,function(string){ + var textWidth = ctx.measureText(string).width; + longest = (textWidth > longest) ? textWidth : longest; + }); + return longest; + }, + drawRoundedRectangle = 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(); + }; + + + //Store a reference to each instance - allowing us to globally resize chart instances on window resize. + //Destroy method on the chart will remove the instance of the chart from this reference. + Chart.instances = {}; + + Chart.Type = function(data,options,chart){ + this.options = options; + this.chart = chart; + this.id = uid(); + //Add the chart instance to the global namespace + Chart.instances[this.id] = this; + + // Initialize is always called when a chart type is created + // By default it is a no op, but it should be extended + if (options.responsive){ + this.resize(); + } + this.initialize.call(this,data); + }; + + //Core methods that'll be a part of every chart type + extend(Chart.Type.prototype,{ + initialize : function(){return this;}, + clear : function(){ + clear(this.chart); + return this; + }, + stop : function(){ + // Stops any current animation loop occuring + cancelAnimFrame(this.animationFrame); + return this; + }, + resize : function(callback){ + this.stop(); + var canvas = this.chart.canvas, + newWidth = getMaximumWidth(this.chart.canvas), + newHeight = this.options.maintainAspectRatio ? newWidth / this.chart.aspectRatio : getMaximumHeight(this.chart.canvas); + + canvas.width = this.chart.width = newWidth; + canvas.height = this.chart.height = newHeight; + + retinaScale(this.chart); + + if (typeof callback === "function"){ + callback.apply(this, Array.prototype.slice.call(arguments, 1)); + } + return this; + }, + reflow : noop, + render : function(reflow){ + if (reflow){ + this.reflow(); + } + if (this.options.animation && !reflow){ + helpers.animationLoop( + this.draw, + this.options.animationSteps, + this.options.animationEasing, + this.options.onAnimationProgress, + this.options.onAnimationComplete, + this + ); + } + else{ + this.draw(); + this.options.onAnimationComplete.call(this); + } + return this; + }, + generateLegend : function(){ + return template(this.options.legendTemplate,this); + }, + destroy : function(){ + this.clear(); + unbindEvents(this, this.events); + var canvas = this.chart.canvas; + + // Reset canvas height/width attributes starts a fresh with the canvas context + canvas.width = this.chart.width; + canvas.height = this.chart.height; + + // < IE9 doesn't support removeProperty + if (canvas.style.removeProperty) { + canvas.style.removeProperty('width'); + canvas.style.removeProperty('height'); + } else { + canvas.style.removeAttribute('width'); + canvas.style.removeAttribute('height'); + } + + delete Chart.instances[this.id]; + }, + showTooltip : function(ChartElements, forceRedraw){ + // Only redraw the chart if we've actually changed what we're hovering on. + if (typeof this.activeElements === 'undefined') this.activeElements = []; + + var isChanged = (function(Elements){ + var changed = false; + + if (Elements.length !== this.activeElements.length){ + changed = true; + return changed; + } + + each(Elements, function(element, index){ + if (element !== this.activeElements[index]){ + changed = true; + } + }, this); + return changed; + }).call(this, ChartElements); + + if (!isChanged && !forceRedraw){ + return; + } + else{ + this.activeElements = ChartElements; + } + this.draw(); + if(this.options.customTooltips){ + this.options.customTooltips(false); + } + if (ChartElements.length > 0){ + // If we have multiple datasets, show a MultiTooltip for all of the data points at that index + if (this.datasets && this.datasets.length > 1) { + var dataArray, + dataIndex; + + for (var i = this.datasets.length - 1; i >= 0; i--) { + dataArray = this.datasets[i].points || this.datasets[i].bars || this.datasets[i].segments; + dataIndex = indexOf(dataArray, ChartElements[0]); + if (dataIndex !== -1){ + break; + } + } + var tooltipLabels = [], + tooltipColors = [], + medianPosition = (function(index) { + + // Get all the points at that particular index + var Elements = [], + dataCollection, + xPositions = [], + yPositions = [], + xMax, + yMax, + xMin, + yMin; + helpers.each(this.datasets, function(dataset){ + dataCollection = dataset.points || dataset.bars || dataset.segments; + if (dataCollection[dataIndex] && dataCollection[dataIndex].hasValue()){ + Elements.push(dataCollection[dataIndex]); + } + }); + + helpers.each(Elements, function(element) { + xPositions.push(element.x); + yPositions.push(element.y); + + + //Include any colour information about the element + tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, element)); + tooltipColors.push({ + fill: element._saved.fillColor || element.fillColor, + stroke: element._saved.strokeColor || element.strokeColor + }); + + }, this); + + yMin = min(yPositions); + yMax = max(yPositions); + + xMin = min(xPositions); + xMax = max(xPositions); + + return { + x: (xMin > this.chart.width/2) ? xMin : xMax, + y: (yMin + yMax)/2 + }; + }).call(this, dataIndex); + + new Chart.MultiTooltip({ + x: medianPosition.x, + y: medianPosition.y, + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + xOffset: this.options.tooltipXOffset, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + titleTextColor: this.options.tooltipTitleFontColor, + titleFontFamily: this.options.tooltipTitleFontFamily, + titleFontStyle: this.options.tooltipTitleFontStyle, + titleFontSize: this.options.tooltipTitleFontSize, + cornerRadius: this.options.tooltipCornerRadius, + labels: tooltipLabels, + legendColors: tooltipColors, + legendColorBackground : this.options.multiTooltipKeyBackground, + title: ChartElements[0].label, + chart: this.chart, + ctx: this.chart.ctx, + custom: this.options.customTooltips + }).draw(); + + } else { + each(ChartElements, function(Element) { + var tooltipPosition = Element.tooltipPosition(); + new Chart.Tooltip({ + x: Math.round(tooltipPosition.x), + y: Math.round(tooltipPosition.y), + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + caretHeight: this.options.tooltipCaretSize, + cornerRadius: this.options.tooltipCornerRadius, + text: template(this.options.tooltipTemplate, Element), + chart: this.chart, + custom: this.options.customTooltips + }).draw(); + }, this); + } + } + return this; + }, + toBase64Image : function(){ + return this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments); + } + }); + + Chart.Type.extend = function(extensions){ + + var parent = this; + + var ChartType = function(){ + return parent.apply(this,arguments); + }; + + //Copy the prototype object of the this class + ChartType.prototype = clone(parent.prototype); + //Now overwrite some of the properties in the base class with the new extensions + extend(ChartType.prototype, extensions); + + ChartType.extend = Chart.Type.extend; + + if (extensions.name || parent.prototype.name){ + + var chartName = extensions.name || parent.prototype.name; + //Assign any potential default values of the new chart type + + //If none are defined, we'll use a clone of the chart type this is being extended from. + //I.e. if we extend a line chart, we'll use the defaults from the line chart if our new chart + //doesn't define some defaults of their own. + + var baseDefaults = (Chart.defaults[parent.prototype.name]) ? clone(Chart.defaults[parent.prototype.name]) : {}; + + Chart.defaults[chartName] = extend(baseDefaults,extensions.defaults); + + Chart.types[chartName] = ChartType; + + //Register this new chart type in the Chart prototype + Chart.prototype[chartName] = function(data,options){ + var config = merge(Chart.defaults.global, Chart.defaults[chartName], options || {}); + return new ChartType(data,config,this); + }; + } else{ + warn("Name not provided for this chart, so it hasn't been registered"); + } + return parent; + }; + + Chart.Element = function(configuration){ + extend(this,configuration); + this.initialize.apply(this,arguments); + this.save(); + }; + extend(Chart.Element.prototype,{ + initialize : function(){}, + restore : function(props){ + if (!props){ + extend(this,this._saved); + } else { + each(props,function(key){ + this[key] = this._saved[key]; + },this); + } + return this; + }, + save : function(){ + this._saved = clone(this); + delete this._saved._saved; + return this; + }, + update : function(newProps){ + each(newProps,function(value,key){ + this._saved[key] = this[key]; + this[key] = value; + },this); + return this; + }, + transition : function(props,ease){ + each(props,function(value,key){ + this[key] = ((value - this._saved[key]) * ease) + this._saved[key]; + },this); + return this; + }, + tooltipPosition : function(){ + return { + x : this.x, + y : this.y + }; + }, + hasValue: function(){ + return isNumber(this.value); + } + }); + + Chart.Element.extend = inherits; + + + Chart.Point = Chart.Element.extend({ + display: true, + inRange: function(chartX,chartY){ + var hitDetectionRange = this.hitDetectionRadius + this.radius; + return ((Math.pow(chartX-this.x, 2)+Math.pow(chartY-this.y, 2)) < Math.pow(hitDetectionRange,2)); + }, + draw : function(){ + if (this.display){ + var ctx = this.ctx; + ctx.beginPath(); + + ctx.arc(this.x, this.y, this.radius, 0, Math.PI*2); + ctx.closePath(); + + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + ctx.fillStyle = this.fillColor; + + ctx.fill(); + ctx.stroke(); + } + + + //Quick debug for bezier curve splining + //Highlights control points and the line between them. + //Handy for dev - stripped in the min version. + + // ctx.save(); + // ctx.fillStyle = "black"; + // ctx.strokeStyle = "black" + // ctx.beginPath(); + // ctx.arc(this.controlPoints.inner.x,this.controlPoints.inner.y, 2, 0, Math.PI*2); + // ctx.fill(); + + // ctx.beginPath(); + // ctx.arc(this.controlPoints.outer.x,this.controlPoints.outer.y, 2, 0, Math.PI*2); + // ctx.fill(); + + // ctx.moveTo(this.controlPoints.inner.x,this.controlPoints.inner.y); + // ctx.lineTo(this.x, this.y); + // ctx.lineTo(this.controlPoints.outer.x,this.controlPoints.outer.y); + // ctx.stroke(); + + // ctx.restore(); + + + + } + }); + + Chart.Arc = Chart.Element.extend({ + inRange : function(chartX,chartY){ + + var pointRelativePosition = helpers.getAngleFromPoint(this, { + x: chartX, + y: chartY + }); + + //Check if within the range of the open/close angle + var betweenAngles = (pointRelativePosition.angle >= this.startAngle && pointRelativePosition.angle <= this.endAngle), + withinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius); + + return (betweenAngles && withinRadius); + //Ensure within the outside of the arc centre, but inside arc outer + }, + tooltipPosition : function(){ + var centreAngle = this.startAngle + ((this.endAngle - this.startAngle) / 2), + rangeFromCentre = (this.outerRadius - this.innerRadius) / 2 + this.innerRadius; + return { + x : this.x + (Math.cos(centreAngle) * rangeFromCentre), + y : this.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + draw : function(animationPercent){ + + var easingDecimal = animationPercent || 1; + + var ctx = this.ctx; + + ctx.beginPath(); + + ctx.arc(this.x, this.y, this.outerRadius, this.startAngle, this.endAngle); + + ctx.arc(this.x, this.y, this.innerRadius, this.endAngle, this.startAngle, true); + + ctx.closePath(); + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + ctx.fillStyle = this.fillColor; + + ctx.fill(); + ctx.lineJoin = 'bevel'; + + if (this.showStroke){ + ctx.stroke(); + } + } + }); + + Chart.Rectangle = Chart.Element.extend({ + draw : function(){ + var ctx = this.ctx, + halfWidth = this.width/2, + leftX = this.x - halfWidth, + rightX = this.x + halfWidth, + top = this.base - (this.base - this.y), + halfStroke = this.strokeWidth / 2; + + // Canvas doesn't allow us to stroke inside the width so we can + // adjust the sizes to fit if we're setting a stroke on the line + if (this.showStroke){ + leftX += halfStroke; + rightX -= halfStroke; + top += halfStroke; + } + + ctx.beginPath(); + + ctx.fillStyle = this.fillColor; + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + // It'd be nice to keep this class totally generic to any rectangle + // and simply specify which border to miss out. + ctx.moveTo(leftX, this.base); + ctx.lineTo(leftX, top); + ctx.lineTo(rightX, top); + ctx.lineTo(rightX, this.base); + ctx.fill(); + if (this.showStroke){ + ctx.stroke(); + } + }, + height : function(){ + return this.base - this.y; + }, + inRange : function(chartX,chartY){ + return (chartX >= this.x - this.width/2 && chartX <= this.x + this.width/2) && (chartY >= this.y && chartY <= this.base); + } + }); + + Chart.Tooltip = Chart.Element.extend({ + draw : function(){ + + var ctx = this.chart.ctx; + + ctx.font = fontString(this.fontSize,this.fontStyle,this.fontFamily); + + this.xAlign = "center"; + this.yAlign = "above"; + + //Distance between the actual element.y position and the start of the tooltip caret + var caretPadding = this.caretPadding = 2; + + var tooltipWidth = ctx.measureText(this.text).width + 2*this.xPadding, + tooltipRectHeight = this.fontSize + 2*this.yPadding, + tooltipHeight = tooltipRectHeight + this.caretHeight + caretPadding; + + if (this.x + tooltipWidth/2 >this.chart.width){ + this.xAlign = "left"; + } else if (this.x - tooltipWidth/2 < 0){ + this.xAlign = "right"; + } + + if (this.y - tooltipHeight < 0){ + this.yAlign = "below"; + } + + + var tooltipX = this.x - tooltipWidth/2, + tooltipY = this.y - tooltipHeight; + + ctx.fillStyle = this.fillColor; + + // Custom Tooltips + if(this.custom){ + this.custom(this); + } + else{ + switch(this.yAlign) + { + case "above": + //Draw a caret above the x/y + ctx.beginPath(); + ctx.moveTo(this.x,this.y - caretPadding); + ctx.lineTo(this.x + this.caretHeight, this.y - (caretPadding + this.caretHeight)); + ctx.lineTo(this.x - this.caretHeight, this.y - (caretPadding + this.caretHeight)); + ctx.closePath(); + ctx.fill(); + break; + case "below": + tooltipY = this.y + caretPadding + this.caretHeight; + //Draw a caret below the x/y + ctx.beginPath(); + ctx.moveTo(this.x, this.y + caretPadding); + ctx.lineTo(this.x + this.caretHeight, this.y + caretPadding + this.caretHeight); + ctx.lineTo(this.x - this.caretHeight, this.y + caretPadding + this.caretHeight); + ctx.closePath(); + ctx.fill(); + break; + } + + switch(this.xAlign) + { + case "left": + tooltipX = this.x - tooltipWidth + (this.cornerRadius + this.caretHeight); + break; + case "right": + tooltipX = this.x - (this.cornerRadius + this.caretHeight); + break; + } + + drawRoundedRectangle(ctx,tooltipX,tooltipY,tooltipWidth,tooltipRectHeight,this.cornerRadius); + + ctx.fill(); + + ctx.fillStyle = this.textColor; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(this.text, tooltipX + tooltipWidth/2, tooltipY + tooltipRectHeight/2); + } + } + }); + + Chart.MultiTooltip = Chart.Element.extend({ + initialize : function(){ + this.font = fontString(this.fontSize,this.fontStyle,this.fontFamily); + + this.titleFont = fontString(this.titleFontSize,this.titleFontStyle,this.titleFontFamily); + + this.height = (this.labels.length * this.fontSize) + ((this.labels.length-1) * (this.fontSize/2)) + (this.yPadding*2) + this.titleFontSize *1.5; + + this.ctx.font = this.titleFont; + + var titleWidth = this.ctx.measureText(this.title).width, + //Label has a legend square as well so account for this. + labelWidth = longestText(this.ctx,this.font,this.labels) + this.fontSize + 3, + longestTextWidth = max([labelWidth,titleWidth]); + + this.width = longestTextWidth + (this.xPadding*2); + + + var halfHeight = this.height/2; + + //Check to ensure the height will fit on the canvas + if (this.y - halfHeight < 0 ){ + this.y = halfHeight; + } else if (this.y + halfHeight > this.chart.height){ + this.y = this.chart.height - halfHeight; + } + + //Decide whether to align left or right based on position on canvas + if (this.x > this.chart.width/2){ + this.x -= this.xOffset + this.width; + } else { + this.x += this.xOffset; + } + + + }, + getLineHeight : function(index){ + var baseLineHeight = this.y - (this.height/2) + this.yPadding, + afterTitleIndex = index-1; + + //If the index is zero, we're getting the title + if (index === 0){ + return baseLineHeight + this.titleFontSize/2; + } else{ + return baseLineHeight + ((this.fontSize*1.5*afterTitleIndex) + this.fontSize/2) + this.titleFontSize * 1.5; + } + + }, + draw : function(){ + // Custom Tooltips + if(this.custom){ + this.custom(this); + } + else{ + drawRoundedRectangle(this.ctx,this.x,this.y - this.height/2,this.width,this.height,this.cornerRadius); + var ctx = this.ctx; + ctx.fillStyle = this.fillColor; + ctx.fill(); + ctx.closePath(); + + ctx.textAlign = "left"; + ctx.textBaseline = "middle"; + ctx.fillStyle = this.titleTextColor; + ctx.font = this.titleFont; + + ctx.fillText(this.title,this.x + this.xPadding, this.getLineHeight(0)); + + ctx.font = this.font; + helpers.each(this.labels,function(label,index){ + ctx.fillStyle = this.textColor; + ctx.fillText(label,this.x + this.xPadding + this.fontSize + 3, this.getLineHeight(index + 1)); + + //A bit gnarly, but clearing this rectangle breaks when using explorercanvas (clears whole canvas) + //ctx.clearRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + //Instead we'll make a white filled block to put the legendColour palette over. + + ctx.fillStyle = this.legendColorBackground; + ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + + ctx.fillStyle = this.legendColors[index].fill; + ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + + + },this); + } + } + }); + + Chart.Scale = Chart.Element.extend({ + initialize : function(){ + this.fit(); + }, + buildYLabels : function(){ + this.yLabels = []; + + var stepDecimalPlaces = getDecimalPlaces(this.stepValue); + + for (var i=0; i<=this.steps; i++){ + this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)})); + } + this.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx,this.font,this.yLabels) : 0; + }, + addXLabel : function(label){ + this.xLabels.push(label); + this.valuesCount++; + this.fit(); + }, + removeXLabel : function(){ + this.xLabels.shift(); + this.valuesCount--; + this.fit(); + }, + // Fitting loop to rotate x Labels and figure out what fits there, and also calculate how many Y steps to use + fit: function(){ + // First we need the width of the yLabels, assuming the xLabels aren't rotated + + // To do that we need the base line at the top and base of the chart, assuming there is no x label rotation + this.startPoint = (this.display) ? this.fontSize : 0; + this.endPoint = (this.display) ? this.height - (this.fontSize * 1.5) - 5 : this.height; // -5 to pad labels + + // Apply padding settings to the start and end point. + this.startPoint += this.padding; + this.endPoint -= this.padding; + + // Cache the starting height, so can determine if we need to recalculate the scale yAxis + var cachedHeight = this.endPoint - this.startPoint, + cachedYLabelWidth; + + // Build the current yLabels so we have an idea of what size they'll be to start + /* + * This sets what is returned from calculateScaleRange as static properties of this class: + * + this.steps; + this.stepValue; + this.min; + this.max; + * + */ + this.calculateYRange(cachedHeight); + + // With these properties set we can now build the array of yLabels + // and also the width of the largest yLabel + this.buildYLabels(); + + this.calculateXLabelRotation(); + + while((cachedHeight > this.endPoint - this.startPoint)){ + cachedHeight = this.endPoint - this.startPoint; + cachedYLabelWidth = this.yLabelWidth; + + this.calculateYRange(cachedHeight); + this.buildYLabels(); + + // Only go through the xLabel loop again if the yLabel width has changed + if (cachedYLabelWidth < this.yLabelWidth){ + this.calculateXLabelRotation(); + } + } + + }, + calculateXLabelRotation : function(){ + //Get the width of each grid by calculating the difference + //between x offsets between 0 and 1. + + this.ctx.font = this.font; + + var firstWidth = this.ctx.measureText(this.xLabels[0]).width, + lastWidth = this.ctx.measureText(this.xLabels[this.xLabels.length - 1]).width, + firstRotated, + lastRotated; + + + this.xScalePaddingRight = lastWidth/2 + 3; + this.xScalePaddingLeft = (firstWidth/2 > this.yLabelWidth + 10) ? firstWidth/2 : this.yLabelWidth + 10; + + this.xLabelRotation = 0; + if (this.display){ + var originalLabelWidth = longestText(this.ctx,this.font,this.xLabels), + cosRotation, + firstRotatedWidth; + this.xLabelWidth = originalLabelWidth; + //Allow 3 pixels x2 padding either side for label readability + var xGridWidth = Math.floor(this.calculateX(1) - this.calculateX(0)) - 6; + + //Max label rotate should be 90 - also act as a loop counter + while ((this.xLabelWidth > xGridWidth && this.xLabelRotation === 0) || (this.xLabelWidth > xGridWidth && this.xLabelRotation <= 90 && this.xLabelRotation > 0)){ + cosRotation = Math.cos(toRadians(this.xLabelRotation)); + + firstRotated = cosRotation * firstWidth; + lastRotated = cosRotation * lastWidth; + + // We're right aligning the text now. + if (firstRotated + this.fontSize / 2 > this.yLabelWidth + 8){ + this.xScalePaddingLeft = firstRotated + this.fontSize / 2; + } + this.xScalePaddingRight = this.fontSize/2; + + + this.xLabelRotation++; + this.xLabelWidth = cosRotation * originalLabelWidth; + + } + if (this.xLabelRotation > 0){ + this.endPoint -= Math.sin(toRadians(this.xLabelRotation))*originalLabelWidth + 3; + } + } + else{ + this.xLabelWidth = 0; + this.xScalePaddingRight = this.padding; + this.xScalePaddingLeft = this.padding; + } + + }, + // Needs to be overidden in each Chart type + // Otherwise we need to pass all the data into the scale class + calculateYRange: noop, + drawingArea: function(){ + return this.startPoint - this.endPoint; + }, + calculateY : function(value){ + var scalingFactor = this.drawingArea() / (this.min - this.max); + return this.endPoint - (scalingFactor * (value - this.min)); + }, + calculateX : function(index){ + var isRotated = (this.xLabelRotation > 0), + // innerWidth = (this.offsetGridLines) ? this.width - offsetLeft - this.padding : this.width - (offsetLeft + halfLabelWidth * 2) - this.padding, + innerWidth = this.width - (this.xScalePaddingLeft + this.xScalePaddingRight), + valueWidth = innerWidth/Math.max((this.valuesCount - ((this.offsetGridLines) ? 0 : 1)), 1), + valueOffset = (valueWidth * index) + this.xScalePaddingLeft; + + if (this.offsetGridLines){ + valueOffset += (valueWidth/2); + } + + return Math.round(valueOffset); + }, + update : function(newProps){ + helpers.extend(this, newProps); + this.fit(); + }, + draw : function(){ + var ctx = this.ctx, + yLabelGap = (this.endPoint - this.startPoint) / this.steps, + xStart = Math.round(this.xScalePaddingLeft); + if (this.display){ + ctx.fillStyle = this.textColor; + ctx.font = this.font; + each(this.yLabels,function(labelString,index){ + var yLabelCenter = this.endPoint - (yLabelGap * index), + linePositionY = Math.round(yLabelCenter), + drawHorizontalLine = this.showHorizontalLines; + + ctx.textAlign = "right"; + ctx.textBaseline = "middle"; + if (this.showLabels){ + ctx.fillText(labelString,xStart - 10,yLabelCenter); + } + + // This is X axis, so draw it + if (index === 0 && !drawHorizontalLine){ + drawHorizontalLine = true; + } + + if (drawHorizontalLine){ + ctx.beginPath(); + } + + if (index > 0){ + // This is a grid line in the centre, so drop that + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + } else { + // This is the first line on the scale + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + } + + linePositionY += helpers.aliasPixel(ctx.lineWidth); + + if(drawHorizontalLine){ + ctx.moveTo(xStart, linePositionY); + ctx.lineTo(this.width, linePositionY); + ctx.stroke(); + ctx.closePath(); + } + + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + ctx.beginPath(); + ctx.moveTo(xStart - 5, linePositionY); + ctx.lineTo(xStart, linePositionY); + ctx.stroke(); + ctx.closePath(); + + },this); + + each(this.xLabels,function(label,index){ + var xPos = this.calculateX(index) + aliasPixel(this.lineWidth), + // Check to see if line/bar here and decide where to place the line + linePos = this.calculateX(index - (this.offsetGridLines ? 0.5 : 0)) + aliasPixel(this.lineWidth), + isRotated = (this.xLabelRotation > 0), + drawVerticalLine = this.showVerticalLines; + + // This is Y axis, so draw it + if (index === 0 && !drawVerticalLine){ + drawVerticalLine = true; + } + + if (drawVerticalLine){ + ctx.beginPath(); + } + + if (index > 0){ + // This is a grid line in the centre, so drop that + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + } else { + // This is the first line on the scale + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + } + + if (drawVerticalLine){ + ctx.moveTo(linePos,this.endPoint); + ctx.lineTo(linePos,this.startPoint - 3); + ctx.stroke(); + ctx.closePath(); + } + + + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + + + // Small lines at the bottom of the base grid line + ctx.beginPath(); + ctx.moveTo(linePos,this.endPoint); + ctx.lineTo(linePos,this.endPoint + 5); + ctx.stroke(); + ctx.closePath(); + + ctx.save(); + ctx.translate(xPos,(isRotated) ? this.endPoint + 12 : this.endPoint + 8); + ctx.rotate(toRadians(this.xLabelRotation)*-1); + ctx.font = this.font; + ctx.textAlign = (isRotated) ? "right" : "center"; + ctx.textBaseline = (isRotated) ? "middle" : "top"; + ctx.fillText(label, 0, 0); + ctx.restore(); + },this); + + } + } + + }); + + Chart.RadialScale = Chart.Element.extend({ + initialize: function(){ + this.size = min([this.height, this.width]); + this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2); + }, + calculateCenterOffset: function(value){ + // Take into account half font size + the yPadding of the top value + var scalingFactor = this.drawingArea / (this.max - this.min); + + return (value - this.min) * scalingFactor; + }, + update : function(){ + if (!this.lineArc){ + this.setScaleSize(); + } else { + this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2); + } + this.buildYLabels(); + }, + buildYLabels: function(){ + this.yLabels = []; + + var stepDecimalPlaces = getDecimalPlaces(this.stepValue); + + for (var i=0; i<=this.steps; i++){ + this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)})); + } + }, + getCircumference : function(){ + return ((Math.PI*2) / this.valuesCount); + }, + setScaleSize: function(){ + /* + * Right, this is really confusing and there is a lot of maths going on here + * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + * + * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + * + * Solution: + * + * We assume the radius of the polygon is half the size of the canvas at first + * at each index we check if the text overlaps. + * + * Where it does, we store that angle and that index. + * + * After finding the largest index and angle we calculate how much we need to remove + * from the shape radius to move the point inwards by that x. + * + * We average the left and right distances to get the maximum shape radius that can fit in the box + * along with labels. + * + * Once we have that, we can find the centre point for the chart, by taking the x text protrusion + * on each side, removing that from the size, halving it and adding the left x protrusion width. + * + * This will mean we have a shape fitted to the canvas, as large as it can be with the labels + * and position it in the most space efficient manner + * + * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + */ + + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var largestPossibleRadius = min([(this.height/2 - this.pointLabelFontSize - 5), this.width/2]), + pointPosition, + i, + textWidth, + halfTextWidth, + furthestRight = this.width, + furthestRightIndex, + furthestRightAngle, + furthestLeft = 0, + furthestLeftIndex, + furthestLeftAngle, + xProtrusionLeft, + xProtrusionRight, + radiusReductionRight, + radiusReductionLeft, + maxWidthRadius; + this.ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily); + for (i=0;i furthestRight) { + furthestRight = pointPosition.x + halfTextWidth; + furthestRightIndex = i; + } + if (pointPosition.x - halfTextWidth < furthestLeft) { + furthestLeft = pointPosition.x - halfTextWidth; + furthestLeftIndex = i; + } + } + else if (i < this.valuesCount/2) { + // Less than half the values means we'll left align the text + if (pointPosition.x + textWidth > furthestRight) { + furthestRight = pointPosition.x + textWidth; + furthestRightIndex = i; + } + } + else if (i > this.valuesCount/2){ + // More than half the values means we'll right align the text + if (pointPosition.x - textWidth < furthestLeft) { + furthestLeft = pointPosition.x - textWidth; + furthestLeftIndex = i; + } + } + } + + xProtrusionLeft = furthestLeft; + + xProtrusionRight = Math.ceil(furthestRight - this.width); + + furthestRightAngle = this.getIndexAngle(furthestRightIndex); + + furthestLeftAngle = this.getIndexAngle(furthestLeftIndex); + + radiusReductionRight = xProtrusionRight / Math.sin(furthestRightAngle + Math.PI/2); + + radiusReductionLeft = xProtrusionLeft / Math.sin(furthestLeftAngle + Math.PI/2); + + // Ensure we actually need to reduce the size of the chart + radiusReductionRight = (isNumber(radiusReductionRight)) ? radiusReductionRight : 0; + radiusReductionLeft = (isNumber(radiusReductionLeft)) ? radiusReductionLeft : 0; + + this.drawingArea = largestPossibleRadius - (radiusReductionLeft + radiusReductionRight)/2; + + //this.drawingArea = min([maxWidthRadius, (this.height - (2 * (this.pointLabelFontSize + 5)))/2]) + this.setCenterPoint(radiusReductionLeft, radiusReductionRight); + + }, + setCenterPoint: function(leftMovement, rightMovement){ + + var maxRight = this.width - rightMovement - this.drawingArea, + maxLeft = leftMovement + this.drawingArea; + + this.xCenter = (maxLeft + maxRight)/2; + // Always vertically in the centre as the text height doesn't change + this.yCenter = (this.height/2); + }, + + getIndexAngle : function(index){ + var angleMultiplier = (Math.PI * 2) / this.valuesCount; + // Start from the top instead of right, so remove a quarter of the circle + + return index * angleMultiplier - (Math.PI/2); + }, + getPointPosition : function(index, distanceFromCenter){ + var thisAngle = this.getIndexAngle(index); + return { + x : (Math.cos(thisAngle) * distanceFromCenter) + this.xCenter, + y : (Math.sin(thisAngle) * distanceFromCenter) + this.yCenter + }; + }, + draw: function(){ + if (this.display){ + var ctx = this.ctx; + each(this.yLabels, function(label, index){ + // Don't draw a centre value + if (index > 0){ + var yCenterOffset = index * (this.drawingArea/this.steps), + yHeight = this.yCenter - yCenterOffset, + pointPosition; + + // Draw circular lines around the scale + if (this.lineWidth > 0){ + ctx.strokeStyle = this.lineColor; + ctx.lineWidth = this.lineWidth; + + if(this.lineArc){ + ctx.beginPath(); + ctx.arc(this.xCenter, this.yCenter, yCenterOffset, 0, Math.PI*2); + ctx.closePath(); + ctx.stroke(); + } else{ + ctx.beginPath(); + for (var i=0;i= 0; i--) { + if (this.angleLineWidth > 0){ + var outerPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max)); + ctx.beginPath(); + ctx.moveTo(this.xCenter, this.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + ctx.closePath(); + } + // Extra 3px out for some label spacing + var pointLabelPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max) + 5); + ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily); + ctx.fillStyle = this.pointLabelFontColor; + + var labelsCount = this.labels.length, + halfLabelsCount = this.labels.length/2, + quarterLabelsCount = halfLabelsCount/2, + upperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount), + exactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount); + if (i === 0){ + ctx.textAlign = 'center'; + } else if(i === halfLabelsCount){ + ctx.textAlign = 'center'; + } else if (i < halfLabelsCount){ + ctx.textAlign = 'left'; + } else { + ctx.textAlign = 'right'; + } + + // Set the correct text baseline based on outer positioning + if (exactQuarter){ + ctx.textBaseline = 'middle'; + } else if (upperHalf){ + ctx.textBaseline = 'bottom'; + } else { + ctx.textBaseline = 'top'; + } + + ctx.fillText(this.labels[i], pointLabelPosition.x, pointLabelPosition.y); + } + } + } + } + }); + + // Attach global event to resize each chart instance when the browser resizes + helpers.addEvent(window, "resize", (function(){ + // Basic debounce of resize function so it doesn't hurt performance when resizing browser. + var timeout; + return function(){ + clearTimeout(timeout); + timeout = setTimeout(function(){ + each(Chart.instances,function(instance){ + // If the responsive flag is set in the chart instance config + // Cascade the resize event down to the chart. + if (instance.options.responsive){ + instance.resize(instance.render, true); + } + }); + }, 50); + }; + })()); + + + if (amd) { + define(function(){ + return Chart; + }); + } else if (typeof module === 'object' && module.exports) { + module.exports = Chart; + } + + root.Chart = Chart; + + Chart.noConflict = function(){ + root.Chart = previous; + return Chart; + }; + +}).call(this); diff --git a/bower_components/Chart.js/src/Chart.Doughnut.js b/bower_components/Chart.js/src/Chart.Doughnut.js new file mode 100644 index 0000000..a892b0e --- /dev/null +++ b/bower_components/Chart.js/src/Chart.Doughnut.js @@ -0,0 +1,184 @@ +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + //Cache a local reference to Chart.helpers + helpers = Chart.helpers; + + var defaultConfig = { + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke : true, + + //String - The colour of each segment stroke + segmentStrokeColor : "#fff", + + //Number - The width of each segment stroke + segmentStrokeWidth : 2, + + //The percentage of the chart that we cut out of the middle. + percentageInnerCutout : 50, + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect + animationEasing : "easeOutBounce", + + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate : true, + + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale : false, + + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    " + + }; + + + Chart.Type.extend({ + //Passing in a name registers this chart in the Chart namespace + name: "Doughnut", + //Providing a defaults will also register the deafults in the chart namespace + defaults : defaultConfig, + //Initialize is fired when the chart is initialized - Data is passed in as a parameter + //Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data){ + + //Declare segments as a static property to prevent inheriting across the Chart type prototype + this.segments = []; + this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2; + + this.SegmentArc = Chart.Arc.extend({ + ctx : this.chart.ctx, + x : this.chart.width/2, + y : this.chart.height/2 + }); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : []; + + helpers.each(this.segments,function(segment){ + segment.restore(["fillColor"]); + }); + helpers.each(activeSegments,function(activeSegment){ + activeSegment.fillColor = activeSegment.highlightColor; + }); + this.showTooltip(activeSegments); + }); + } + this.calculateTotal(data); + + helpers.each(data,function(datapoint, index){ + this.addData(datapoint, index, true); + },this); + + this.render(); + }, + getSegmentsAtEvent : function(e){ + var segmentsArray = []; + + var location = helpers.getRelativePosition(e); + + helpers.each(this.segments,function(segment){ + if (segment.inRange(location.x,location.y)) segmentsArray.push(segment); + },this); + return segmentsArray; + }, + addData : function(segment, atIndex, silent){ + var index = atIndex || this.segments.length; + this.segments.splice(index, 0, new this.SegmentArc({ + value : segment.value, + outerRadius : (this.options.animateScale) ? 0 : this.outerRadius, + innerRadius : (this.options.animateScale) ? 0 : (this.outerRadius/100) * this.options.percentageInnerCutout, + fillColor : segment.color, + highlightColor : segment.highlight || segment.color, + showStroke : this.options.segmentShowStroke, + strokeWidth : this.options.segmentStrokeWidth, + strokeColor : this.options.segmentStrokeColor, + startAngle : Math.PI * 1.5, + circumference : (this.options.animateRotate) ? 0 : this.calculateCircumference(segment.value), + label : segment.label + })); + if (!silent){ + this.reflow(); + this.update(); + } + }, + calculateCircumference : function(value){ + return (Math.PI*2)*(Math.abs(value) / this.total); + }, + calculateTotal : function(data){ + this.total = 0; + helpers.each(data,function(segment){ + this.total += Math.abs(segment.value); + },this); + }, + update : function(){ + this.calculateTotal(this.segments); + + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor']); + }); + + helpers.each(this.segments,function(segment){ + segment.save(); + }); + this.render(); + }, + + removeData: function(atIndex){ + var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1; + this.segments.splice(indexToDelete, 1); + this.reflow(); + this.update(); + }, + + reflow : function(){ + helpers.extend(this.SegmentArc.prototype,{ + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2; + helpers.each(this.segments, function(segment){ + segment.update({ + outerRadius : this.outerRadius, + innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout + }); + }, this); + }, + draw : function(easeDecimal){ + var animDecimal = (easeDecimal) ? easeDecimal : 1; + this.clear(); + helpers.each(this.segments,function(segment,index){ + segment.transition({ + circumference : this.calculateCircumference(segment.value), + outerRadius : this.outerRadius, + innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout + },animDecimal); + + segment.endAngle = segment.startAngle + segment.circumference; + + segment.draw(); + if (index === 0){ + segment.startAngle = Math.PI * 1.5; + } + //Check to see if it's the last segment, if not get the next and update the start angle + if (index < this.segments.length-1){ + this.segments[index+1].startAngle = segment.endAngle; + } + },this); + + } + }); + + Chart.types.Doughnut.extend({ + name : "Pie", + defaults : helpers.merge(defaultConfig,{percentageInnerCutout : 0}) + }); + +}).call(this); \ No newline at end of file diff --git a/bower_components/Chart.js/src/Chart.Line.js b/bower_components/Chart.js/src/Chart.Line.js new file mode 100644 index 0000000..34ad85b --- /dev/null +++ b/bower_components/Chart.js/src/Chart.Line.js @@ -0,0 +1,374 @@ +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + var defaultConfig = { + + ///Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - Whether the line is curved between points + bezierCurve : true, + + //Number - Tension of the bezier curve between points + bezierCurveTension : 0.4, + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 4, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    " + + }; + + + Chart.Type.extend({ + name: "Line", + defaults : defaultConfig, + initialize: function(data){ + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.PointClass = Chart.Point.extend({ + strokeWidth : this.options.pointDotStrokeWidth, + radius : this.options.pointDotRadius, + display: this.options.pointDot, + hitDetectionRadius : this.options.pointHitDetectionRadius, + ctx : this.chart.ctx, + inRange : function(mouseX){ + return (Math.pow(mouseX-this.x, 2) < Math.pow(this.radius + this.hitDetectionRadius,2)); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activePoints = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : []; + this.eachPoints(function(point){ + point.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activePoints, function(activePoint){ + activePoint.fillColor = activePoint.highlightFill; + activePoint.strokeColor = activePoint.highlightStroke; + }); + this.showTooltip(activePoints); + }); + } + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset){ + + var datasetObject = { + label : dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + pointColor : dataset.pointColor, + pointStrokeColor : dataset.pointStrokeColor, + points : [] + }; + + this.datasets.push(datasetObject); + + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + datasetObject.points.push(new this.PointClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + strokeColor : dataset.pointStrokeColor, + fillColor : dataset.pointColor, + highlightFill : dataset.pointHighlightFill || dataset.pointColor, + highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor + })); + },this); + + this.buildScale(data.labels); + + + this.eachPoints(function(point, index){ + helpers.extend(point, { + x: this.scale.calculateX(index), + y: this.scale.endPoint + }); + point.save(); + }, this); + + },this); + + + this.render(); + }, + update : function(){ + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor', 'strokeColor']); + }); + this.eachPoints(function(point){ + point.save(); + }); + this.render(); + }, + eachPoints : function(callback){ + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,callback,this); + },this); + }, + getPointsAtEvent : function(e){ + var pointsArray = [], + eventPosition = helpers.getRelativePosition(e); + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,function(point){ + if (point.inRange(eventPosition.x,eventPosition.y)) pointsArray.push(point); + }); + },this); + return pointsArray; + }, + buildScale : function(labels){ + var self = this; + + var dataTotal = function(){ + var values = []; + self.eachPoints(function(point){ + values.push(point.value); + }); + + return values; + }; + + var scaleOptions = { + templateString : this.options.scaleLabel, + height : this.chart.height, + width : this.chart.width, + ctx : this.chart.ctx, + textColor : this.options.scaleFontColor, + fontSize : this.options.scaleFontSize, + fontStyle : this.options.scaleFontStyle, + fontFamily : this.options.scaleFontFamily, + valuesCount : labels.length, + beginAtZero : this.options.scaleBeginAtZero, + integersOnly : this.options.scaleIntegersOnly, + calculateYRange : function(currentHeight){ + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels : labels, + font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth : this.options.scaleLineWidth, + lineColor : this.options.scaleLineColor, + showHorizontalLines : this.options.scaleShowHorizontalLines, + showVerticalLines : this.options.scaleShowVerticalLines, + gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + padding: (this.options.showScale) ? 0 : this.options.pointDotRadius + this.options.pointDotStrokeWidth, + showLabels : this.options.scaleShowLabels, + display : this.options.showScale + }; + + if (this.options.scaleOverride){ + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + + this.scale = new Chart.Scale(scaleOptions); + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + + helpers.each(valuesArray,function(value,datasetIndex){ + //Add a new point for each piece of data, passing any required data to draw. + this.datasets[datasetIndex].points.push(new this.PointClass({ + value : value, + label : label, + x: this.scale.calculateX(this.scale.valuesCount+1), + y: this.scale.endPoint, + strokeColor : this.datasets[datasetIndex].pointStrokeColor, + fillColor : this.datasets[datasetIndex].pointColor + })); + },this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData : function(){ + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets,function(dataset){ + dataset.points.shift(); + },this); + this.update(); + }, + reflow : function(){ + var newScaleProps = helpers.extend({ + height : this.chart.height, + width : this.chart.width + }); + this.scale.update(newScaleProps); + }, + draw : function(ease){ + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + // Some helper methods for getting the next/prev points + var hasValue = function(item){ + return item.value !== null; + }, + nextPoint = function(point, collection, index){ + return helpers.findNextWhere(collection, hasValue, index) || point; + }, + previousPoint = function(point, collection, index){ + return helpers.findPreviousWhere(collection, hasValue, index) || point; + }; + + this.scale.draw(easingDecimal); + + + helpers.each(this.datasets,function(dataset){ + var pointsWithValues = helpers.where(dataset.points, hasValue); + + //Transition each point first so that the line and point drawing isn't out of sync + //We can use this extra loop to calculate the control points of this dataset also in this loop + + helpers.each(dataset.points, function(point, index){ + if (point.hasValue()){ + point.transition({ + y : this.scale.calculateY(point.value), + x : this.scale.calculateX(index) + }, easingDecimal); + } + },this); + + + // Control points need to be calculated in a seperate loop, because we need to know the current x/y of the point + // This would cause issues when there is no animation, because the y of the next point would be 0, so beziers would be skewed + if (this.options.bezierCurve){ + helpers.each(pointsWithValues, function(point, index){ + var tension = (index > 0 && index < pointsWithValues.length - 1) ? this.options.bezierCurveTension : 0; + point.controlPoints = helpers.splineCurve( + previousPoint(point, pointsWithValues, index), + point, + nextPoint(point, pointsWithValues, index), + tension + ); + + // Prevent the bezier going outside of the bounds of the graph + + // Cap puter bezier handles to the upper/lower scale bounds + if (point.controlPoints.outer.y > this.scale.endPoint){ + point.controlPoints.outer.y = this.scale.endPoint; + } + else if (point.controlPoints.outer.y < this.scale.startPoint){ + point.controlPoints.outer.y = this.scale.startPoint; + } + + // Cap inner bezier handles to the upper/lower scale bounds + if (point.controlPoints.inner.y > this.scale.endPoint){ + point.controlPoints.inner.y = this.scale.endPoint; + } + else if (point.controlPoints.inner.y < this.scale.startPoint){ + point.controlPoints.inner.y = this.scale.startPoint; + } + },this); + } + + + //Draw the line between all the points + ctx.lineWidth = this.options.datasetStrokeWidth; + ctx.strokeStyle = dataset.strokeColor; + ctx.beginPath(); + + helpers.each(pointsWithValues, function(point, index){ + if (index === 0){ + ctx.moveTo(point.x, point.y); + } + else{ + if(this.options.bezierCurve){ + var previous = previousPoint(point, pointsWithValues, index); + + ctx.bezierCurveTo( + previous.controlPoints.outer.x, + previous.controlPoints.outer.y, + point.controlPoints.inner.x, + point.controlPoints.inner.y, + point.x, + point.y + ); + } + else{ + ctx.lineTo(point.x,point.y); + } + } + }, this); + + ctx.stroke(); + + if (this.options.datasetFill && pointsWithValues.length > 0){ + //Round off the line by going to the base of the chart, back to the start, then fill. + ctx.lineTo(pointsWithValues[pointsWithValues.length - 1].x, this.scale.endPoint); + ctx.lineTo(pointsWithValues[0].x, this.scale.endPoint); + ctx.fillStyle = dataset.fillColor; + ctx.closePath(); + ctx.fill(); + } + + //Now draw the points over the line + //A little inefficient double looping, but better than the line + //lagging behind the point positions + helpers.each(pointsWithValues,function(point){ + point.draw(); + }); + },this); + } + }); + + +}).call(this); diff --git a/bower_components/Chart.js/src/Chart.PolarArea.js b/bower_components/Chart.js/src/Chart.PolarArea.js new file mode 100644 index 0000000..8f2b9c5 --- /dev/null +++ b/bower_components/Chart.js/src/Chart.PolarArea.js @@ -0,0 +1,250 @@ +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + //Cache a local reference to Chart.helpers + helpers = Chart.helpers; + + var defaultConfig = { + //Boolean - Show a backdrop to the scale label + scaleShowLabelBackdrop : true, + + //String - The colour of the label backdrop + scaleBackdropColor : "rgba(255,255,255,0.75)", + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //Number - The backdrop padding above & below the label in pixels + scaleBackdropPaddingY : 2, + + //Number - The backdrop padding to the side of the label in pixels + scaleBackdropPaddingX : 2, + + //Boolean - Show line for each value in the scale + scaleShowLine : true, + + //Boolean - Stroke a line around each segment in the chart + segmentShowStroke : true, + + //String - The colour of the stroke on each segement. + segmentStrokeColor : "#fff", + + //Number - The width of the stroke value in pixels + segmentStrokeWidth : 2, + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect. + animationEasing : "easeOutBounce", + + //Boolean - Whether to animate the rotation of the chart + animateRotate : true, + + //Boolean - Whether to animate scaling the chart from the centre + animateScale : false, + + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    " + }; + + + Chart.Type.extend({ + //Passing in a name registers this chart in the Chart namespace + name: "PolarArea", + //Providing a defaults will also register the deafults in the chart namespace + defaults : defaultConfig, + //Initialize is fired when the chart is initialized - Data is passed in as a parameter + //Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data){ + this.segments = []; + //Declare segment class as a chart instance specific class, so it can share props for this instance + this.SegmentArc = Chart.Arc.extend({ + showStroke : this.options.segmentShowStroke, + strokeWidth : this.options.segmentStrokeWidth, + strokeColor : this.options.segmentStrokeColor, + ctx : this.chart.ctx, + innerRadius : 0, + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.scale = new Chart.RadialScale({ + display: this.options.showScale, + fontStyle: this.options.scaleFontStyle, + fontSize: this.options.scaleFontSize, + fontFamily: this.options.scaleFontFamily, + fontColor: this.options.scaleFontColor, + showLabels: this.options.scaleShowLabels, + showLabelBackdrop: this.options.scaleShowLabelBackdrop, + backdropColor: this.options.scaleBackdropColor, + backdropPaddingY : this.options.scaleBackdropPaddingY, + backdropPaddingX: this.options.scaleBackdropPaddingX, + lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0, + lineColor: this.options.scaleLineColor, + lineArc: true, + width: this.chart.width, + height: this.chart.height, + xCenter: this.chart.width/2, + yCenter: this.chart.height/2, + ctx : this.chart.ctx, + templateString: this.options.scaleLabel, + valuesCount: data.length + }); + + this.updateScaleRange(data); + + this.scale.update(); + + helpers.each(data,function(segment,index){ + this.addData(segment,index,true); + },this); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : []; + helpers.each(this.segments,function(segment){ + segment.restore(["fillColor"]); + }); + helpers.each(activeSegments,function(activeSegment){ + activeSegment.fillColor = activeSegment.highlightColor; + }); + this.showTooltip(activeSegments); + }); + } + + this.render(); + }, + getSegmentsAtEvent : function(e){ + var segmentsArray = []; + + var location = helpers.getRelativePosition(e); + + helpers.each(this.segments,function(segment){ + if (segment.inRange(location.x,location.y)) segmentsArray.push(segment); + },this); + return segmentsArray; + }, + addData : function(segment, atIndex, silent){ + var index = atIndex || this.segments.length; + + this.segments.splice(index, 0, new this.SegmentArc({ + fillColor: segment.color, + highlightColor: segment.highlight || segment.color, + label: segment.label, + value: segment.value, + outerRadius: (this.options.animateScale) ? 0 : this.scale.calculateCenterOffset(segment.value), + circumference: (this.options.animateRotate) ? 0 : this.scale.getCircumference(), + startAngle: Math.PI * 1.5 + })); + if (!silent){ + this.reflow(); + this.update(); + } + }, + removeData: function(atIndex){ + var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1; + this.segments.splice(indexToDelete, 1); + this.reflow(); + this.update(); + }, + calculateTotal: function(data){ + this.total = 0; + helpers.each(data,function(segment){ + this.total += segment.value; + },this); + this.scale.valuesCount = this.segments.length; + }, + updateScaleRange: function(datapoints){ + var valuesArray = []; + helpers.each(datapoints,function(segment){ + valuesArray.push(segment.value); + }); + + var scaleSizes = (this.options.scaleOverride) ? + { + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + } : + helpers.calculateScaleRange( + valuesArray, + helpers.min([this.chart.width, this.chart.height])/2, + this.options.scaleFontSize, + this.options.scaleBeginAtZero, + this.options.scaleIntegersOnly + ); + + helpers.extend( + this.scale, + scaleSizes, + { + size: helpers.min([this.chart.width, this.chart.height]), + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + } + ); + + }, + update : function(){ + this.calculateTotal(this.segments); + + helpers.each(this.segments,function(segment){ + segment.save(); + }); + + this.reflow(); + this.render(); + }, + reflow : function(){ + helpers.extend(this.SegmentArc.prototype,{ + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.updateScaleRange(this.segments); + this.scale.update(); + + helpers.extend(this.scale,{ + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + }); + + helpers.each(this.segments, function(segment){ + segment.update({ + outerRadius : this.scale.calculateCenterOffset(segment.value) + }); + }, this); + + }, + draw : function(ease){ + var easingDecimal = ease || 1; + //Clear & draw the canvas + this.clear(); + helpers.each(this.segments,function(segment, index){ + segment.transition({ + circumference : this.scale.getCircumference(), + outerRadius : this.scale.calculateCenterOffset(segment.value) + },easingDecimal); + + segment.endAngle = segment.startAngle + segment.circumference; + + // If we've removed the first segment we need to set the first one to + // start at the top. + if (index === 0){ + segment.startAngle = Math.PI * 1.5; + } + + //Check to see if it's the last segment, if not get the next and update the start angle + if (index < this.segments.length - 1){ + this.segments[index+1].startAngle = segment.endAngle; + } + segment.draw(); + }, this); + this.scale.draw(); + } + }); + +}).call(this); \ No newline at end of file diff --git a/bower_components/Chart.js/src/Chart.Radar.js b/bower_components/Chart.js/src/Chart.Radar.js new file mode 100644 index 0000000..134fd2d --- /dev/null +++ b/bower_components/Chart.js/src/Chart.Radar.js @@ -0,0 +1,343 @@ +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + + + Chart.Type.extend({ + name: "Radar", + defaults:{ + //Boolean - Whether to show lines for each scale point + scaleShowLine : true, + + //Boolean - Whether we show the angle lines out of the radar + angleShowLineOut : true, + + //Boolean - Whether to show labels on the scale + scaleShowLabels : false, + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //String - Colour of the angle line + angleLineColor : "rgba(0,0,0,.1)", + + //Number - Pixel width of the angle line + angleLineWidth : 1, + + //String - Point label font declaration + pointLabelFontFamily : "'Arial'", + + //String - Point label font weight + pointLabelFontStyle : "normal", + + //Number - Point label font size in pixels + pointLabelFontSize : 10, + + //String - Point label font colour + pointLabelFontColor : "#666", + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 3, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + + //String - A legend template + legendTemplate : "
      -legend\"><% for (var i=0; i
    • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    " + + }, + + initialize: function(data){ + this.PointClass = Chart.Point.extend({ + strokeWidth : this.options.pointDotStrokeWidth, + radius : this.options.pointDotRadius, + display: this.options.pointDot, + hitDetectionRadius : this.options.pointHitDetectionRadius, + ctx : this.chart.ctx + }); + + this.datasets = []; + + this.buildScale(data); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activePointsCollection = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : []; + + this.eachPoints(function(point){ + point.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activePointsCollection, function(activePoint){ + activePoint.fillColor = activePoint.highlightFill; + activePoint.strokeColor = activePoint.highlightStroke; + }); + + this.showTooltip(activePointsCollection); + }); + } + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset){ + + var datasetObject = { + label: dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + pointColor : dataset.pointColor, + pointStrokeColor : dataset.pointStrokeColor, + points : [] + }; + + this.datasets.push(datasetObject); + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + var pointPosition; + if (!this.scale.animation){ + pointPosition = this.scale.getPointPosition(index, this.scale.calculateCenterOffset(dataPoint)); + } + datasetObject.points.push(new this.PointClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + x: (this.options.animation) ? this.scale.xCenter : pointPosition.x, + y: (this.options.animation) ? this.scale.yCenter : pointPosition.y, + strokeColor : dataset.pointStrokeColor, + fillColor : dataset.pointColor, + highlightFill : dataset.pointHighlightFill || dataset.pointColor, + highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor + })); + },this); + + },this); + + this.render(); + }, + eachPoints : function(callback){ + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,callback,this); + },this); + }, + + getPointsAtEvent : function(evt){ + var mousePosition = helpers.getRelativePosition(evt), + fromCenter = helpers.getAngleFromPoint({ + x: this.scale.xCenter, + y: this.scale.yCenter + }, mousePosition); + + var anglePerIndex = (Math.PI * 2) /this.scale.valuesCount, + pointIndex = Math.round((fromCenter.angle - Math.PI * 1.5) / anglePerIndex), + activePointsCollection = []; + + // If we're at the top, make the pointIndex 0 to get the first of the array. + if (pointIndex >= this.scale.valuesCount || pointIndex < 0){ + pointIndex = 0; + } + + if (fromCenter.distance <= this.scale.drawingArea){ + helpers.each(this.datasets, function(dataset){ + activePointsCollection.push(dataset.points[pointIndex]); + }); + } + + return activePointsCollection; + }, + + buildScale : function(data){ + this.scale = new Chart.RadialScale({ + display: this.options.showScale, + fontStyle: this.options.scaleFontStyle, + fontSize: this.options.scaleFontSize, + fontFamily: this.options.scaleFontFamily, + fontColor: this.options.scaleFontColor, + showLabels: this.options.scaleShowLabels, + showLabelBackdrop: this.options.scaleShowLabelBackdrop, + backdropColor: this.options.scaleBackdropColor, + backdropPaddingY : this.options.scaleBackdropPaddingY, + backdropPaddingX: this.options.scaleBackdropPaddingX, + lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0, + lineColor: this.options.scaleLineColor, + angleLineColor : this.options.angleLineColor, + angleLineWidth : (this.options.angleShowLineOut) ? this.options.angleLineWidth : 0, + // Point labels at the edge of each line + pointLabelFontColor : this.options.pointLabelFontColor, + pointLabelFontSize : this.options.pointLabelFontSize, + pointLabelFontFamily : this.options.pointLabelFontFamily, + pointLabelFontStyle : this.options.pointLabelFontStyle, + height : this.chart.height, + width: this.chart.width, + xCenter: this.chart.width/2, + yCenter: this.chart.height/2, + ctx : this.chart.ctx, + templateString: this.options.scaleLabel, + labels: data.labels, + valuesCount: data.datasets[0].data.length + }); + + this.scale.setScaleSize(); + this.updateScaleRange(data.datasets); + this.scale.buildYLabels(); + }, + updateScaleRange: function(datasets){ + var valuesArray = (function(){ + var totalDataArray = []; + helpers.each(datasets,function(dataset){ + if (dataset.data){ + totalDataArray = totalDataArray.concat(dataset.data); + } + else { + helpers.each(dataset.points, function(point){ + totalDataArray.push(point.value); + }); + } + }); + return totalDataArray; + })(); + + + var scaleSizes = (this.options.scaleOverride) ? + { + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + } : + helpers.calculateScaleRange( + valuesArray, + helpers.min([this.chart.width, this.chart.height])/2, + this.options.scaleFontSize, + this.options.scaleBeginAtZero, + this.options.scaleIntegersOnly + ); + + helpers.extend( + this.scale, + scaleSizes + ); + + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + this.scale.valuesCount++; + helpers.each(valuesArray,function(value,datasetIndex){ + var pointPosition = this.scale.getPointPosition(this.scale.valuesCount, this.scale.calculateCenterOffset(value)); + this.datasets[datasetIndex].points.push(new this.PointClass({ + value : value, + label : label, + x: pointPosition.x, + y: pointPosition.y, + strokeColor : this.datasets[datasetIndex].pointStrokeColor, + fillColor : this.datasets[datasetIndex].pointColor + })); + },this); + + this.scale.labels.push(label); + + this.reflow(); + + this.update(); + }, + removeData : function(){ + this.scale.valuesCount--; + this.scale.labels.shift(); + helpers.each(this.datasets,function(dataset){ + dataset.points.shift(); + },this); + this.reflow(); + this.update(); + }, + update : function(){ + this.eachPoints(function(point){ + point.save(); + }); + this.reflow(); + this.render(); + }, + reflow: function(){ + helpers.extend(this.scale, { + width : this.chart.width, + height: this.chart.height, + size : helpers.min([this.chart.width, this.chart.height]), + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + }); + this.updateScaleRange(this.datasets); + this.scale.setScaleSize(); + this.scale.buildYLabels(); + }, + draw : function(ease){ + var easeDecimal = ease || 1, + ctx = this.chart.ctx; + this.clear(); + this.scale.draw(); + + helpers.each(this.datasets,function(dataset){ + + //Transition each point first so that the line and point drawing isn't out of sync + helpers.each(dataset.points,function(point,index){ + if (point.hasValue()){ + point.transition(this.scale.getPointPosition(index, this.scale.calculateCenterOffset(point.value)), easeDecimal); + } + },this); + + + + //Draw the line between all the points + ctx.lineWidth = this.options.datasetStrokeWidth; + ctx.strokeStyle = dataset.strokeColor; + ctx.beginPath(); + helpers.each(dataset.points,function(point,index){ + if (index === 0){ + ctx.moveTo(point.x,point.y); + } + else{ + ctx.lineTo(point.x,point.y); + } + },this); + ctx.closePath(); + ctx.stroke(); + + ctx.fillStyle = dataset.fillColor; + ctx.fill(); + + //Now draw the points over the line + //A little inefficient double looping, but better than the line + //lagging behind the point positions + helpers.each(dataset.points,function(point){ + if (point.hasValue()){ + point.draw(); + } + }); + + },this); + + } + + }); + + + + + +}).call(this); \ No newline at end of file diff --git a/bower_components/angular-animate/.bower.json b/bower_components/angular-animate/.bower.json new file mode 100644 index 0000000..3c5f2c9 --- /dev/null +++ b/bower_components/angular-animate/.bower.json @@ -0,0 +1,19 @@ +{ + "name": "angular-animate", + "version": "1.3.15", + "main": "./angular-animate.js", + "ignore": [], + "dependencies": { + "angular": "1.3.15" + }, + "homepage": "https://github.com/angular/bower-angular-animate", + "_release": "1.3.15", + "_resolution": { + "type": "version", + "tag": "v1.3.15", + "commit": "30fb369974560dbeb8a5311861c124e094944dab" + }, + "_source": "git://github.com/angular/bower-angular-animate.git", + "_target": ">1.2.8", + "_originalSource": "angular-animate" +} \ No newline at end of file diff --git a/bower_components/angular-animate/README.md b/bower_components/angular-animate/README.md new file mode 100644 index 0000000..8313da6 --- /dev/null +++ b/bower_components/angular-animate/README.md @@ -0,0 +1,68 @@ +# packaged angular-animate + +This repo is for distribution on `npm` and `bower`. The source for this module is in the +[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngAnimate). +Please file issues and pull requests against that repo. + +## Install + +You can install this package either with `npm` or with `bower`. + +### npm + +```shell +npm install angular-animate +``` + +Then add `ngAnimate` as a dependency for your app: + +```javascript +angular.module('myApp', [require('angular-animate')]); +``` + +### bower + +```shell +bower install angular-animate +``` + +Then add a ` +``` + +Then add `ngAnimate` as a dependency for your app: + +```javascript +angular.module('myApp', ['ngAnimate']); +``` + +## Documentation + +Documentation is available on the +[AngularJS docs site](http://docs.angularjs.org/api/ngAnimate). + +## License + +The MIT License + +Copyright (c) 2010-2015 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/bower_components/angular-animate/angular-animate.js b/bower_components/angular-animate/angular-animate.js new file mode 100644 index 0000000..7bd0d7a --- /dev/null +++ b/bower_components/angular-animate/angular-animate.js @@ -0,0 +1,2137 @@ +/** + * @license AngularJS v1.3.15 + * (c) 2010-2014 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) {'use strict'; + +/* jshint maxlen: false */ + +/** + * @ngdoc module + * @name ngAnimate + * @description + * + * The `ngAnimate` module provides support for JavaScript, CSS3 transition and CSS3 keyframe animation hooks within existing core and custom directives. + * + *
    + * + * # Usage + * + * To see animations in action, all that is required is to define the appropriate CSS classes + * or to register a JavaScript animation via the `myModule.animation()` function. The directives that support animation automatically are: + * `ngRepeat`, `ngInclude`, `ngIf`, `ngSwitch`, `ngShow`, `ngHide`, `ngView` and `ngClass`. Custom directives can take advantage of animation + * by using the `$animate` service. + * + * Below is a more detailed breakdown of the supported animation events provided by pre-existing ng directives: + * + * | Directive | Supported Animations | + * |----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| + * | {@link ng.directive:ngRepeat#animations ngRepeat} | enter, leave and move | + * | {@link ngRoute.directive:ngView#animations ngView} | enter and leave | + * | {@link ng.directive:ngInclude#animations ngInclude} | enter and leave | + * | {@link ng.directive:ngSwitch#animations ngSwitch} | enter and leave | + * | {@link ng.directive:ngIf#animations ngIf} | enter and leave | + * | {@link ng.directive:ngClass#animations ngClass} | add and remove (the CSS class(es) present) | + * | {@link ng.directive:ngShow#animations ngShow} & {@link ng.directive:ngHide#animations ngHide} | add and remove (the ng-hide class value) | + * | {@link ng.directive:form#animation-hooks form} & {@link ng.directive:ngModel#animation-hooks ngModel} | add and remove (dirty, pristine, valid, invalid & all other validations) | + * | {@link module:ngMessages#animations ngMessages} | add and remove (ng-active & ng-inactive) | + * | {@link module:ngMessages#animations ngMessage} | enter and leave | + * + * You can find out more information about animations upon visiting each directive page. + * + * Below is an example of how to apply animations to a directive that supports animation hooks: + * + * ```html + * + * + * + * + * ``` + * + * Keep in mind that, by default, if an animation is running, any child elements cannot be animated + * until the parent element's animation has completed. This blocking feature can be overridden by + * placing the `ng-animate-children` attribute on a parent container tag. + * + * ```html + *
    + *
    + *
    + * ... + *
    + *
    + *
    + * ``` + * + * When the `on` expression value changes and an animation is triggered then each of the elements within + * will all animate without the block being applied to child elements. + * + * ## Are animations run when the application starts? + * No they are not. When an application is bootstrapped Angular will disable animations from running to avoid + * a frenzy of animations from being triggered as soon as the browser has rendered the screen. For this to work, + * Angular will wait for two digest cycles until enabling animations. From there on, any animation-triggering + * layout changes in the application will trigger animations as normal. + * + * In addition, upon bootstrap, if the routing system or any directives or load remote data (via $http) then Angular + * will automatically extend the wait time to enable animations once **all** of the outbound HTTP requests + * are complete. + * + * ## CSS-defined Animations + * The animate service will automatically apply two CSS classes to the animated element and these two CSS classes + * are designed to contain the start and end CSS styling. Both CSS transitions and keyframe animations are supported + * and can be used to play along with this naming structure. + * + * The following code below demonstrates how to perform animations using **CSS transitions** with Angular: + * + * ```html + * + * + *
    + *
    + *
    + * ``` + * + * The following code below demonstrates how to perform animations using **CSS animations** with Angular: + * + * ```html + * + * + *
    + *
    + *
    + * ``` + * + * Both CSS3 animations and transitions can be used together and the animate service will figure out the correct duration and delay timing. + * + * Upon DOM mutation, the event class is added first (something like `ng-enter`), then the browser prepares itself to add + * the active class (in this case `ng-enter-active`) which then triggers the animation. The animation module will automatically + * detect the CSS code to determine when the animation ends. Once the animation is over then both CSS classes will be + * removed from the DOM. If a browser does not support CSS transitions or CSS animations then the animation will start and end + * immediately resulting in a DOM element that is at its final state. This final state is when the DOM element + * has no CSS transition/animation classes applied to it. + * + * ### Structural transition animations + * + * Structural transitions (such as enter, leave and move) will always apply a `0s none` transition + * value to force the browser into rendering the styles defined in the setup (`.ng-enter`, `.ng-leave` + * or `.ng-move`) class. This means that any active transition animations operating on the element + * will be cut off to make way for the enter, leave or move animation. + * + * ### Class-based transition animations + * + * Class-based transitions refer to transition animations that are triggered when a CSS class is + * added to or removed from the element (via `$animate.addClass`, `$animate.removeClass`, + * `$animate.setClass`, or by directives such as `ngClass`, `ngModel` and `form`). + * They are different when compared to structural animations since they **do not cancel existing + * animations** nor do they **block successive transitions** from rendering on the same element. + * This distinction allows for **multiple class-based transitions** to be performed on the same element. + * + * In addition to ngAnimate supporting the default (natural) functionality of class-based transition + * animations, ngAnimate also decorates the element with starting and ending CSS classes to aid the + * developer in further styling the element throughout the transition animation. Earlier versions + * of ngAnimate may have caused natural CSS transitions to break and not render properly due to + * $animate temporarily blocking transitions using `0s none` in order to allow the setup CSS class + * (the `-add` or `-remove` class) to be applied without triggering an animation. However, as of + * **version 1.3**, this workaround has been removed with ngAnimate and all non-ngAnimate CSS + * class transitions are compatible with ngAnimate. + * + * There is, however, one special case when dealing with class-based transitions in ngAnimate. + * When rendering class-based transitions that make use of the setup and active CSS classes + * (e.g. `.fade-add` and `.fade-add-active` for when `.fade` is added) be sure to define + * the transition value **on the active CSS class** and not the setup class. + * + * ```css + * .fade-add { + * /* remember to place a 0s transition here + * to ensure that the styles are applied instantly + * even if the element already has a transition style */ + * transition:0s linear all; + * + * /* starting CSS styles */ + * opacity:1; + * } + * .fade-add.fade-add-active { + * /* this will be the length of the animation */ + * transition:1s linear all; + * opacity:0; + * } + * ``` + * + * The setup CSS class (in this case `.fade-add`) also has a transition style property, however, it + * has a duration of zero. This may not be required, however, incase the browser is unable to render + * the styling present in this CSS class instantly then it could be that the browser is attempting + * to perform an unnecessary transition. + * + * This workaround, however, does not apply to standard class-based transitions that are rendered + * when a CSS class containing a transition is applied to an element: + * + * ```css + * /* this works as expected */ + * .fade { + * transition:1s linear all; + * opacity:0; + * } + * ``` + * + * Please keep this in mind when coding the CSS markup that will be used within class-based transitions. + * Also, try not to mix the two class-based animation flavors together since the CSS code may become + * overly complex. + * + * + * ### Preventing Collisions With Third Party Libraries + * + * Some third-party frameworks place animation duration defaults across many element or className + * selectors in order to make their code small and reuseable. This can lead to issues with ngAnimate, which + * is expecting actual animations on these elements and has to wait for their completion. + * + * You can prevent this unwanted behavior by using a prefix on all your animation classes: + * + * ```css + * /* prefixed with animate- */ + * .animate-fade-add.animate-fade-add-active { + * transition:1s linear all; + * opacity:0; + * } + * ``` + * + * You then configure `$animate` to enforce this prefix: + * + * ```js + * $animateProvider.classNameFilter(/animate-/); + * ``` + * + * + * ### CSS Staggering Animations + * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a + * curtain-like effect. The ngAnimate module (versions >=1.2) supports staggering animations and the stagger effect can be + * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for + * the animation. The style property expected within the stagger class can either be a **transition-delay** or an + * **animation-delay** property (or both if your animation contains both transitions and keyframe animations). + * + * ```css + * .my-animation.ng-enter { + * /* standard transition code */ + * -webkit-transition: 1s linear all; + * transition: 1s linear all; + * opacity:0; + * } + * .my-animation.ng-enter-stagger { + * /* this will have a 100ms delay between each successive leave animation */ + * -webkit-transition-delay: 0.1s; + * transition-delay: 0.1s; + * + * /* in case the stagger doesn't work then these two values + * must be set to 0 to avoid an accidental CSS inheritance */ + * -webkit-transition-duration: 0s; + * transition-duration: 0s; + * } + * .my-animation.ng-enter.ng-enter-active { + * /* standard transition styles */ + * opacity:1; + * } + * ``` + * + * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations + * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this + * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation + * will also be reset if more than 10ms has passed after the last animation has been fired. + * + * The following code will issue the **ng-leave-stagger** event on the element provided: + * + * ```js + * var kids = parent.children(); + * + * $animate.leave(kids[0]); //stagger index=0 + * $animate.leave(kids[1]); //stagger index=1 + * $animate.leave(kids[2]); //stagger index=2 + * $animate.leave(kids[3]); //stagger index=3 + * $animate.leave(kids[4]); //stagger index=4 + * + * $timeout(function() { + * //stagger has reset itself + * $animate.leave(kids[5]); //stagger index=0 + * $animate.leave(kids[6]); //stagger index=1 + * }, 100, false); + * ``` + * + * Stagger animations are currently only supported within CSS-defined animations. + * + * ## JavaScript-defined Animations + * In the event that you do not want to use CSS3 transitions or CSS3 animations or if you wish to offer animations on browsers that do not + * yet support CSS transitions/animations, then you can make use of JavaScript animations defined inside of your AngularJS module. + * + * ```js + * //!annotate="YourApp" Your AngularJS Module|Replace this or ngModule with the module that you used to define your application. + * var ngModule = angular.module('YourApp', ['ngAnimate']); + * ngModule.animation('.my-crazy-animation', function() { + * return { + * enter: function(element, done) { + * //run the animation here and call done when the animation is complete + * return function(cancelled) { + * //this (optional) function will be called when the animation + * //completes or when the animation is cancelled (the cancelled + * //flag will be set to true if cancelled). + * }; + * }, + * leave: function(element, done) { }, + * move: function(element, done) { }, + * + * //animation that can be triggered before the class is added + * beforeAddClass: function(element, className, done) { }, + * + * //animation that can be triggered after the class is added + * addClass: function(element, className, done) { }, + * + * //animation that can be triggered before the class is removed + * beforeRemoveClass: function(element, className, done) { }, + * + * //animation that can be triggered after the class is removed + * removeClass: function(element, className, done) { } + * }; + * }); + * ``` + * + * JavaScript-defined animations are created with a CSS-like class selector and a collection of events which are set to run + * a javascript callback function. When an animation is triggered, $animate will look for a matching animation which fits + * the element's CSS class attribute value and then run the matching animation event function (if found). + * In other words, if the CSS classes present on the animated element match any of the JavaScript animations then the callback function will + * be executed. It should be also noted that only simple, single class selectors are allowed (compound class selectors are not supported). + * + * Within a JavaScript animation, an object containing various event callback animation functions is expected to be returned. + * As explained above, these callbacks are triggered based on the animation event. Therefore if an enter animation is run, + * and the JavaScript animation is found, then the enter callback will handle that animation (in addition to the CSS keyframe animation + * or transition code that is defined via a stylesheet). + * + * + * ### Applying Directive-specific Styles to an Animation + * In some cases a directive or service may want to provide `$animate` with extra details that the animation will + * include into its animation. Let's say for example we wanted to render an animation that animates an element + * towards the mouse coordinates as to where the user clicked last. By collecting the X/Y coordinates of the click + * (via the event parameter) we can set the `top` and `left` styles into an object and pass that into our function + * call to `$animate.addClass`. + * + * ```js + * canvas.on('click', function(e) { + * $animate.addClass(element, 'on', { + * to: { + * left : e.client.x + 'px', + * top : e.client.y + 'px' + * } + * }): + * }); + * ``` + * + * Now when the animation runs, and a transition or keyframe animation is picked up, then the animation itself will + * also include and transition the styling of the `left` and `top` properties into its running animation. If we want + * to provide some starting animation values then we can do so by placing the starting animations styles into an object + * called `from` in the same object as the `to` animations. + * + * ```js + * canvas.on('click', function(e) { + * $animate.addClass(element, 'on', { + * from: { + * position: 'absolute', + * left: '0px', + * top: '0px' + * }, + * to: { + * left : e.client.x + 'px', + * top : e.client.y + 'px' + * } + * }): + * }); + * ``` + * + * Once the animation is complete or cancelled then the union of both the before and after styles are applied to the + * element. If `ngAnimate` is not present then the styles will be applied immediately. + * + */ + +angular.module('ngAnimate', ['ng']) + + /** + * @ngdoc provider + * @name $animateProvider + * @description + * + * The `$animateProvider` allows developers to register JavaScript animation event handlers directly inside of a module. + * When an animation is triggered, the $animate service will query the $animate service to find any animations that match + * the provided name value. + * + * Requires the {@link ngAnimate `ngAnimate`} module to be installed. + * + * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application. + * + */ + .directive('ngAnimateChildren', function() { + var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren'; + return function(scope, element, attrs) { + var val = attrs.ngAnimateChildren; + if (angular.isString(val) && val.length === 0) { //empty attribute + element.data(NG_ANIMATE_CHILDREN, true); + } else { + scope.$watch(val, function(value) { + element.data(NG_ANIMATE_CHILDREN, !!value); + }); + } + }; + }) + + //this private service is only used within CSS-enabled animations + //IE8 + IE9 do not support rAF natively, but that is fine since they + //also don't support transitions and keyframes which means that the code + //below will never be used by the two browsers. + .factory('$$animateReflow', ['$$rAF', '$document', function($$rAF, $document) { + var bod = $document[0].body; + return function(fn) { + //the returned function acts as the cancellation function + return $$rAF(function() { + //the line below will force the browser to perform a repaint + //so that all the animated elements within the animation frame + //will be properly updated and drawn on screen. This is + //required to perform multi-class CSS based animations with + //Firefox. DO NOT REMOVE THIS LINE. + var a = bod.offsetWidth + 1; + fn(); + }); + }; + }]) + + .config(['$provide', '$animateProvider', function($provide, $animateProvider) { + var noop = angular.noop; + var forEach = angular.forEach; + var selectors = $animateProvider.$$selectors; + var isArray = angular.isArray; + var isString = angular.isString; + var isObject = angular.isObject; + + var ELEMENT_NODE = 1; + var NG_ANIMATE_STATE = '$$ngAnimateState'; + var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren'; + var NG_ANIMATE_CLASS_NAME = 'ng-animate'; + var rootAnimateState = {running: true}; + + function extractElementNode(element) { + for (var i = 0; i < element.length; i++) { + var elm = element[i]; + if (elm.nodeType == ELEMENT_NODE) { + return elm; + } + } + } + + function prepareElement(element) { + return element && angular.element(element); + } + + function stripCommentsFromElement(element) { + return angular.element(extractElementNode(element)); + } + + function isMatchingElement(elm1, elm2) { + return extractElementNode(elm1) == extractElementNode(elm2); + } + var $$jqLite; + $provide.decorator('$animate', + ['$delegate', '$$q', '$injector', '$sniffer', '$rootElement', '$$asyncCallback', '$rootScope', '$document', '$templateRequest', '$$jqLite', + function($delegate, $$q, $injector, $sniffer, $rootElement, $$asyncCallback, $rootScope, $document, $templateRequest, $$$jqLite) { + + $$jqLite = $$$jqLite; + $rootElement.data(NG_ANIMATE_STATE, rootAnimateState); + + // Wait until all directive and route-related templates are downloaded and + // compiled. The $templateRequest.totalPendingRequests variable keeps track of + // all of the remote templates being currently downloaded. If there are no + // templates currently downloading then the watcher will still fire anyway. + var deregisterWatch = $rootScope.$watch( + function() { return $templateRequest.totalPendingRequests; }, + function(val, oldVal) { + if (val !== 0) return; + deregisterWatch(); + + // Now that all templates have been downloaded, $animate will wait until + // the post digest queue is empty before enabling animations. By having two + // calls to $postDigest calls we can ensure that the flag is enabled at the + // very end of the post digest queue. Since all of the animations in $animate + // use $postDigest, it's important that the code below executes at the end. + // This basically means that the page is fully downloaded and compiled before + // any animations are triggered. + $rootScope.$$postDigest(function() { + $rootScope.$$postDigest(function() { + rootAnimateState.running = false; + }); + }); + } + ); + + var globalAnimationCounter = 0; + var classNameFilter = $animateProvider.classNameFilter(); + var isAnimatableClassName = !classNameFilter + ? function() { return true; } + : function(className) { + return classNameFilter.test(className); + }; + + function classBasedAnimationsBlocked(element, setter) { + var data = element.data(NG_ANIMATE_STATE) || {}; + if (setter) { + data.running = true; + data.structural = true; + element.data(NG_ANIMATE_STATE, data); + } + return data.disabled || (data.running && data.structural); + } + + function runAnimationPostDigest(fn) { + var cancelFn, defer = $$q.defer(); + defer.promise.$$cancelFn = function() { + cancelFn && cancelFn(); + }; + $rootScope.$$postDigest(function() { + cancelFn = fn(function() { + defer.resolve(); + }); + }); + return defer.promise; + } + + function parseAnimateOptions(options) { + // some plugin code may still be passing in the callback + // function as the last param for the $animate methods so + // it's best to only allow string or array values for now + if (isObject(options)) { + if (options.tempClasses && isString(options.tempClasses)) { + options.tempClasses = options.tempClasses.split(/\s+/); + } + return options; + } + } + + function resolveElementClasses(element, cache, runningAnimations) { + runningAnimations = runningAnimations || {}; + + var lookup = {}; + forEach(runningAnimations, function(data, selector) { + forEach(selector.split(' '), function(s) { + lookup[s]=data; + }); + }); + + var hasClasses = Object.create(null); + forEach((element.attr('class') || '').split(/\s+/), function(className) { + hasClasses[className] = true; + }); + + var toAdd = [], toRemove = []; + forEach((cache && cache.classes) || [], function(status, className) { + var hasClass = hasClasses[className]; + var matchingAnimation = lookup[className] || {}; + + // When addClass and removeClass is called then $animate will check to + // see if addClass and removeClass cancel each other out. When there are + // more calls to removeClass than addClass then the count falls below 0 + // and then the removeClass animation will be allowed. Otherwise if the + // count is above 0 then that means an addClass animation will commence. + // Once an animation is allowed then the code will also check to see if + // there exists any on-going animation that is already adding or remvoing + // the matching CSS class. + if (status === false) { + //does it have the class or will it have the class + if (hasClass || matchingAnimation.event == 'addClass') { + toRemove.push(className); + } + } else if (status === true) { + //is the class missing or will it be removed? + if (!hasClass || matchingAnimation.event == 'removeClass') { + toAdd.push(className); + } + } + }); + + return (toAdd.length + toRemove.length) > 0 && [toAdd.join(' '), toRemove.join(' ')]; + } + + function lookup(name) { + if (name) { + var matches = [], + flagMap = {}, + classes = name.substr(1).split('.'); + + //the empty string value is the default animation + //operation which performs CSS transition and keyframe + //animations sniffing. This is always included for each + //element animation procedure if the browser supports + //transitions and/or keyframe animations. The default + //animation is added to the top of the list to prevent + //any previous animations from affecting the element styling + //prior to the element being animated. + if ($sniffer.transitions || $sniffer.animations) { + matches.push($injector.get(selectors[''])); + } + + for (var i=0; i < classes.length; i++) { + var klass = classes[i], + selectorFactoryName = selectors[klass]; + if (selectorFactoryName && !flagMap[klass]) { + matches.push($injector.get(selectorFactoryName)); + flagMap[klass] = true; + } + } + return matches; + } + } + + function animationRunner(element, animationEvent, className, options) { + //transcluded directives may sometimes fire an animation using only comment nodes + //best to catch this early on to prevent any animation operations from occurring + var node = element[0]; + if (!node) { + return; + } + + if (options) { + options.to = options.to || {}; + options.from = options.from || {}; + } + + var classNameAdd; + var classNameRemove; + if (isArray(className)) { + classNameAdd = className[0]; + classNameRemove = className[1]; + if (!classNameAdd) { + className = classNameRemove; + animationEvent = 'removeClass'; + } else if (!classNameRemove) { + className = classNameAdd; + animationEvent = 'addClass'; + } else { + className = classNameAdd + ' ' + classNameRemove; + } + } + + var isSetClassOperation = animationEvent == 'setClass'; + var isClassBased = isSetClassOperation + || animationEvent == 'addClass' + || animationEvent == 'removeClass' + || animationEvent == 'animate'; + + var currentClassName = element.attr('class'); + var classes = currentClassName + ' ' + className; + if (!isAnimatableClassName(classes)) { + return; + } + + var beforeComplete = noop, + beforeCancel = [], + before = [], + afterComplete = noop, + afterCancel = [], + after = []; + + var animationLookup = (' ' + classes).replace(/\s+/g,'.'); + forEach(lookup(animationLookup), function(animationFactory) { + var created = registerAnimation(animationFactory, animationEvent); + if (!created && isSetClassOperation) { + registerAnimation(animationFactory, 'addClass'); + registerAnimation(animationFactory, 'removeClass'); + } + }); + + function registerAnimation(animationFactory, event) { + var afterFn = animationFactory[event]; + var beforeFn = animationFactory['before' + event.charAt(0).toUpperCase() + event.substr(1)]; + if (afterFn || beforeFn) { + if (event == 'leave') { + beforeFn = afterFn; + //when set as null then animation knows to skip this phase + afterFn = null; + } + after.push({ + event: event, fn: afterFn + }); + before.push({ + event: event, fn: beforeFn + }); + return true; + } + } + + function run(fns, cancellations, allCompleteFn) { + var animations = []; + forEach(fns, function(animation) { + animation.fn && animations.push(animation); + }); + + var count = 0; + function afterAnimationComplete(index) { + if (cancellations) { + (cancellations[index] || noop)(); + if (++count < animations.length) return; + cancellations = null; + } + allCompleteFn(); + } + + //The code below adds directly to the array in order to work with + //both sync and async animations. Sync animations are when the done() + //operation is called right away. DO NOT REFACTOR! + forEach(animations, function(animation, index) { + var progress = function() { + afterAnimationComplete(index); + }; + switch (animation.event) { + case 'setClass': + cancellations.push(animation.fn(element, classNameAdd, classNameRemove, progress, options)); + break; + case 'animate': + cancellations.push(animation.fn(element, className, options.from, options.to, progress)); + break; + case 'addClass': + cancellations.push(animation.fn(element, classNameAdd || className, progress, options)); + break; + case 'removeClass': + cancellations.push(animation.fn(element, classNameRemove || className, progress, options)); + break; + default: + cancellations.push(animation.fn(element, progress, options)); + break; + } + }); + + if (cancellations && cancellations.length === 0) { + allCompleteFn(); + } + } + + return { + node: node, + event: animationEvent, + className: className, + isClassBased: isClassBased, + isSetClassOperation: isSetClassOperation, + applyStyles: function() { + if (options) { + element.css(angular.extend(options.from || {}, options.to || {})); + } + }, + before: function(allCompleteFn) { + beforeComplete = allCompleteFn; + run(before, beforeCancel, function() { + beforeComplete = noop; + allCompleteFn(); + }); + }, + after: function(allCompleteFn) { + afterComplete = allCompleteFn; + run(after, afterCancel, function() { + afterComplete = noop; + allCompleteFn(); + }); + }, + cancel: function() { + if (beforeCancel) { + forEach(beforeCancel, function(cancelFn) { + (cancelFn || noop)(true); + }); + beforeComplete(true); + } + if (afterCancel) { + forEach(afterCancel, function(cancelFn) { + (cancelFn || noop)(true); + }); + afterComplete(true); + } + } + }; + } + + /** + * @ngdoc service + * @name $animate + * @kind object + * + * @description + * The `$animate` service provides animation detection support while performing DOM operations (enter, leave and move) as well as during addClass and removeClass operations. + * When any of these operations are run, the $animate service + * will examine any JavaScript-defined animations (which are defined by using the $animateProvider provider object) + * as well as any CSS-defined animations against the CSS classes present on the element once the DOM operation is run. + * + * The `$animate` service is used behind the scenes with pre-existing directives and animation with these directives + * will work out of the box without any extra configuration. + * + * Requires the {@link ngAnimate `ngAnimate`} module to be installed. + * + * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application. + * ## Callback Promises + * With AngularJS 1.3, each of the animation methods, on the `$animate` service, return a promise when called. The + * promise itself is then resolved once the animation has completed itself, has been cancelled or has been + * skipped due to animations being disabled. (Note that even if the animation is cancelled it will still + * call the resolve function of the animation.) + * + * ```js + * $animate.enter(element, container).then(function() { + * //...this is called once the animation is complete... + * }); + * ``` + * + * Also note that, due to the nature of the callback promise, if any Angular-specific code (like changing the scope, + * location of the page, etc...) is executed within the callback promise then be sure to wrap the code using + * `$scope.$apply(...)`; + * + * ```js + * $animate.leave(element).then(function() { + * $scope.$apply(function() { + * $location.path('/new-page'); + * }); + * }); + * ``` + * + * An animation can also be cancelled by calling the `$animate.cancel(promise)` method with the provided + * promise that was returned when the animation was started. + * + * ```js + * var promise = $animate.addClass(element, 'super-long-animation'); + * promise.then(function() { + * //this will still be called even if cancelled + * }); + * + * element.on('click', function() { + * //tooo lazy to wait for the animation to end + * $animate.cancel(promise); + * }); + * ``` + * + * (Keep in mind that the promise cancellation is unique to `$animate` since promises in + * general cannot be cancelled.) + * + */ + return { + /** + * @ngdoc method + * @name $animate#animate + * @kind function + * + * @description + * Performs an inline animation on the element which applies the provided `to` and `from` CSS styles to the element. + * If any detected CSS transition, keyframe or JavaScript matches the provided `className` value then the animation + * will take on the provided styles. For example, if a transition animation is set for the given className then the + * provided `from` and `to` styles will be applied alongside the given transition. If a JavaScript animation is + * detected then the provided styles will be given in as function paramters. + * + * ```js + * ngModule.animation('.my-inline-animation', function() { + * return { + * animate : function(element, className, from, to, done) { + * //styles + * } + * } + * }); + * ``` + * + * Below is a breakdown of each step that occurs during the `animate` animation: + * + * | Animation Step | What the element class attribute looks like | + * |-----------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------| + * | 1. `$animate.animate(...)` is called | `class="my-animation"` | + * | 2. `$animate` waits for the next digest to start the animation | `class="my-animation ng-animate"` | + * | 3. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | + * | 4. the `className` class value is added to the element | `class="my-animation ng-animate className"` | + * | 5. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate className"` | + * | 6. `$animate` blocks all CSS transitions on the element to ensure the `.className` class styling is applied right away| `class="my-animation ng-animate className"` | + * | 7. `$animate` applies the provided collection of `from` CSS styles to the element | `class="my-animation ng-animate className"` | + * | 8. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate className"` | + * | 9. `$animate` removes the CSS transition block placed on the element | `class="my-animation ng-animate className"` | + * | 10. the `className-active` class is added (this triggers the CSS transition/animation) | `class="my-animation ng-animate className className-active"` | + * | 11. `$animate` applies the collection of `to` CSS styles to the element which are then handled by the transition | `class="my-animation ng-animate className className-active"` | + * | 12. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate className className-active"` | + * | 13. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | + * | 14. The returned promise is resolved. | `class="my-animation"` | + * + * @param {DOMElement} element the element that will be the focus of the enter animation + * @param {object} from a collection of CSS styles that will be applied to the element at the start of the animation + * @param {object} to a collection of CSS styles that the element will animate towards + * @param {string=} className an optional CSS class that will be added to the element for the duration of the animation (the default class is `ng-inline-animate`) + * @param {object=} options an optional collection of options that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + animate: function(element, from, to, className, options) { + className = className || 'ng-inline-animate'; + options = parseAnimateOptions(options) || {}; + options.from = to ? from : null; + options.to = to ? to : from; + + return runAnimationPostDigest(function(done) { + return performAnimation('animate', className, stripCommentsFromElement(element), null, null, noop, options, done); + }); + }, + + /** + * @ngdoc method + * @name $animate#enter + * @kind function + * + * @description + * Appends the element to the parentElement element that resides in the document and then runs the enter animation. Once + * the animation is started, the following CSS classes will be present on the element for the duration of the animation: + * + * Below is a breakdown of each step that occurs during enter animation: + * + * | Animation Step | What the element class attribute looks like | + * |-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------| + * | 1. `$animate.enter(...)` is called | `class="my-animation"` | + * | 2. element is inserted into the `parentElement` element or beside the `afterElement` element | `class="my-animation"` | + * | 3. `$animate` waits for the next digest to start the animation | `class="my-animation ng-animate"` | + * | 4. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | + * | 5. the `.ng-enter` class is added to the element | `class="my-animation ng-animate ng-enter"` | + * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate ng-enter"` | + * | 7. `$animate` blocks all CSS transitions on the element to ensure the `.ng-enter` class styling is applied right away | `class="my-animation ng-animate ng-enter"` | + * | 8. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate ng-enter"` | + * | 9. `$animate` removes the CSS transition block placed on the element | `class="my-animation ng-animate ng-enter"` | + * | 10. the `.ng-enter-active` class is added (this triggers the CSS transition/animation) | `class="my-animation ng-animate ng-enter ng-enter-active"` | + * | 11. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate ng-enter ng-enter-active"` | + * | 12. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | + * | 13. The returned promise is resolved. | `class="my-animation"` | + * + * @param {DOMElement} element the element that will be the focus of the enter animation + * @param {DOMElement} parentElement the parent element of the element that will be the focus of the enter animation + * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the enter animation + * @param {object=} options an optional collection of options that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + enter: function(element, parentElement, afterElement, options) { + options = parseAnimateOptions(options); + element = angular.element(element); + parentElement = prepareElement(parentElement); + afterElement = prepareElement(afterElement); + + classBasedAnimationsBlocked(element, true); + $delegate.enter(element, parentElement, afterElement); + return runAnimationPostDigest(function(done) { + return performAnimation('enter', 'ng-enter', stripCommentsFromElement(element), parentElement, afterElement, noop, options, done); + }); + }, + + /** + * @ngdoc method + * @name $animate#leave + * @kind function + * + * @description + * Runs the leave animation operation and, upon completion, removes the element from the DOM. Once + * the animation is started, the following CSS classes will be added for the duration of the animation: + * + * Below is a breakdown of each step that occurs during leave animation: + * + * | Animation Step | What the element class attribute looks like | + * |-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------| + * | 1. `$animate.leave(...)` is called | `class="my-animation"` | + * | 2. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | + * | 3. `$animate` waits for the next digest to start the animation | `class="my-animation ng-animate"` | + * | 4. the `.ng-leave` class is added to the element | `class="my-animation ng-animate ng-leave"` | + * | 5. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate ng-leave"` | + * | 6. `$animate` blocks all CSS transitions on the element to ensure the `.ng-leave` class styling is applied right away | `class="my-animation ng-animate ng-leave"` | + * | 7. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate ng-leave"` | + * | 8. `$animate` removes the CSS transition block placed on the element | `class="my-animation ng-animate ng-leave"` | + * | 9. the `.ng-leave-active` class is added (this triggers the CSS transition/animation) | `class="my-animation ng-animate ng-leave ng-leave-active"` | + * | 10. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate ng-leave ng-leave-active"` | + * | 11. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | + * | 12. The element is removed from the DOM | ... | + * | 13. The returned promise is resolved. | ... | + * + * @param {DOMElement} element the element that will be the focus of the leave animation + * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + leave: function(element, options) { + options = parseAnimateOptions(options); + element = angular.element(element); + + cancelChildAnimations(element); + classBasedAnimationsBlocked(element, true); + return runAnimationPostDigest(function(done) { + return performAnimation('leave', 'ng-leave', stripCommentsFromElement(element), null, null, function() { + $delegate.leave(element); + }, options, done); + }); + }, + + /** + * @ngdoc method + * @name $animate#move + * @kind function + * + * @description + * Fires the move DOM operation. Just before the animation starts, the animate service will either append it into the parentElement container or + * add the element directly after the afterElement element if present. Then the move animation will be run. Once + * the animation is started, the following CSS classes will be added for the duration of the animation: + * + * Below is a breakdown of each step that occurs during move animation: + * + * | Animation Step | What the element class attribute looks like | + * |----------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------| + * | 1. `$animate.move(...)` is called | `class="my-animation"` | + * | 2. element is moved into the parentElement element or beside the afterElement element | `class="my-animation"` | + * | 3. `$animate` waits for the next digest to start the animation | `class="my-animation ng-animate"` | + * | 4. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | + * | 5. the `.ng-move` class is added to the element | `class="my-animation ng-animate ng-move"` | + * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate ng-move"` | + * | 7. `$animate` blocks all CSS transitions on the element to ensure the `.ng-move` class styling is applied right away | `class="my-animation ng-animate ng-move"` | + * | 8. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate ng-move"` | + * | 9. `$animate` removes the CSS transition block placed on the element | `class="my-animation ng-animate ng-move"` | + * | 10. the `.ng-move-active` class is added (this triggers the CSS transition/animation) | `class="my-animation ng-animate ng-move ng-move-active"` | + * | 11. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate ng-move ng-move-active"` | + * | 12. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | + * | 13. The returned promise is resolved. | `class="my-animation"` | + * + * @param {DOMElement} element the element that will be the focus of the move animation + * @param {DOMElement} parentElement the parentElement element of the element that will be the focus of the move animation + * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the move animation + * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + move: function(element, parentElement, afterElement, options) { + options = parseAnimateOptions(options); + element = angular.element(element); + parentElement = prepareElement(parentElement); + afterElement = prepareElement(afterElement); + + cancelChildAnimations(element); + classBasedAnimationsBlocked(element, true); + $delegate.move(element, parentElement, afterElement); + return runAnimationPostDigest(function(done) { + return performAnimation('move', 'ng-move', stripCommentsFromElement(element), parentElement, afterElement, noop, options, done); + }); + }, + + /** + * @ngdoc method + * @name $animate#addClass + * + * @description + * Triggers a custom animation event based off the className variable and then attaches the className value to the element as a CSS class. + * Unlike the other animation methods, the animate service will suffix the className value with {@type -add} in order to provide + * the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if no CSS transitions + * or keyframes are defined on the -add-active or base CSS class). + * + * Below is a breakdown of each step that occurs during addClass animation: + * + * | Animation Step | What the element class attribute looks like | + * |--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| + * | 1. `$animate.addClass(element, 'super')` is called | `class="my-animation"` | + * | 2. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | + * | 3. the `.super-add` class is added to the element | `class="my-animation ng-animate super-add"` | + * | 4. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate super-add"` | + * | 5. the `.super` and `.super-add-active` classes are added (this triggers the CSS transition/animation) | `class="my-animation ng-animate super super-add super-add-active"` | + * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate super super-add super-add-active"` | + * | 7. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate super super-add super-add-active"` | + * | 8. The animation ends and all generated CSS classes are removed from the element | `class="my-animation super"` | + * | 9. The super class is kept on the element | `class="my-animation super"` | + * | 10. The returned promise is resolved. | `class="my-animation super"` | + * + * @param {DOMElement} element the element that will be animated + * @param {string} className the CSS class that will be added to the element and then animated + * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + addClass: function(element, className, options) { + return this.setClass(element, className, [], options); + }, + + /** + * @ngdoc method + * @name $animate#removeClass + * + * @description + * Triggers a custom animation event based off the className variable and then removes the CSS class provided by the className value + * from the element. Unlike the other animation methods, the animate service will suffix the className value with {@type -remove} in + * order to provide the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if + * no CSS transitions or keyframes are defined on the -remove or base CSS classes). + * + * Below is a breakdown of each step that occurs during removeClass animation: + * + * | Animation Step | What the element class attribute looks like | + * |----------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| + * | 1. `$animate.removeClass(element, 'super')` is called | `class="my-animation super"` | + * | 2. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation super ng-animate"` | + * | 3. the `.super-remove` class is added to the element | `class="my-animation super ng-animate super-remove"` | + * | 4. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation super ng-animate super-remove"` | + * | 5. the `.super-remove-active` classes are added and `.super` is removed (this triggers the CSS transition/animation) | `class="my-animation ng-animate super-remove super-remove-active"` | + * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate super-remove super-remove-active"` | + * | 7. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate super-remove super-remove-active"` | + * | 8. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | + * | 9. The returned promise is resolved. | `class="my-animation"` | + * + * + * @param {DOMElement} element the element that will be animated + * @param {string} className the CSS class that will be animated and then removed from the element + * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + removeClass: function(element, className, options) { + return this.setClass(element, [], className, options); + }, + + /** + * + * @ngdoc method + * @name $animate#setClass + * + * @description Adds and/or removes the given CSS classes to and from the element. + * Once complete, the `done()` callback will be fired (if provided). + * + * | Animation Step | What the element class attribute looks like | + * |----------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------| + * | 1. `$animate.setClass(element, 'on', 'off')` is called | `class="my-animation off"` | + * | 2. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate off"` | + * | 3. the `.on-add` and `.off-remove` classes are added to the element | `class="my-animation ng-animate on-add off-remove off"` | + * | 4. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate on-add off-remove off"` | + * | 5. the `.on`, `.on-add-active` and `.off-remove-active` classes are added and `.off` is removed (this triggers the CSS transition/animation) | `class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active"` | + * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active"` | + * | 7. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active"` | + * | 8. The animation ends and all generated CSS classes are removed from the element | `class="my-animation on"` | + * | 9. The returned promise is resolved. | `class="my-animation on"` | + * + * @param {DOMElement} element the element which will have its CSS classes changed + * removed from it + * @param {string} add the CSS classes which will be added to the element + * @param {string} remove the CSS class which will be removed from the element + * CSS classes have been set on the element + * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + setClass: function(element, add, remove, options) { + options = parseAnimateOptions(options); + + var STORAGE_KEY = '$$animateClasses'; + element = angular.element(element); + element = stripCommentsFromElement(element); + + if (classBasedAnimationsBlocked(element)) { + return $delegate.$$setClassImmediately(element, add, remove, options); + } + + // we're using a combined array for both the add and remove + // operations since the ORDER OF addClass and removeClass matters + var classes, cache = element.data(STORAGE_KEY); + var hasCache = !!cache; + if (!cache) { + cache = {}; + cache.classes = {}; + } + classes = cache.classes; + + add = isArray(add) ? add : add.split(' '); + forEach(add, function(c) { + if (c && c.length) { + classes[c] = true; + } + }); + + remove = isArray(remove) ? remove : remove.split(' '); + forEach(remove, function(c) { + if (c && c.length) { + classes[c] = false; + } + }); + + if (hasCache) { + if (options && cache.options) { + cache.options = angular.extend(cache.options || {}, options); + } + + //the digest cycle will combine all the animations into one function + return cache.promise; + } else { + element.data(STORAGE_KEY, cache = { + classes: classes, + options: options + }); + } + + return cache.promise = runAnimationPostDigest(function(done) { + var parentElement = element.parent(); + var elementNode = extractElementNode(element); + var parentNode = elementNode.parentNode; + // TODO(matsko): move this code into the animationsDisabled() function once #8092 is fixed + if (!parentNode || parentNode['$$NG_REMOVED'] || elementNode['$$NG_REMOVED']) { + done(); + return; + } + + var cache = element.data(STORAGE_KEY); + element.removeData(STORAGE_KEY); + + var state = element.data(NG_ANIMATE_STATE) || {}; + var classes = resolveElementClasses(element, cache, state.active); + return !classes + ? done() + : performAnimation('setClass', classes, element, parentElement, null, function() { + if (classes[0]) $delegate.$$addClassImmediately(element, classes[0]); + if (classes[1]) $delegate.$$removeClassImmediately(element, classes[1]); + }, cache.options, done); + }); + }, + + /** + * @ngdoc method + * @name $animate#cancel + * @kind function + * + * @param {Promise} animationPromise The animation promise that is returned when an animation is started. + * + * @description + * Cancels the provided animation. + */ + cancel: function(promise) { + promise.$$cancelFn(); + }, + + /** + * @ngdoc method + * @name $animate#enabled + * @kind function + * + * @param {boolean=} value If provided then set the animation on or off. + * @param {DOMElement=} element If provided then the element will be used to represent the enable/disable operation + * @return {boolean} Current animation state. + * + * @description + * Globally enables/disables animations. + * + */ + enabled: function(value, element) { + switch (arguments.length) { + case 2: + if (value) { + cleanup(element); + } else { + var data = element.data(NG_ANIMATE_STATE) || {}; + data.disabled = true; + element.data(NG_ANIMATE_STATE, data); + } + break; + + case 1: + rootAnimateState.disabled = !value; + break; + + default: + value = !rootAnimateState.disabled; + break; + } + return !!value; + } + }; + + /* + all animations call this shared animation triggering function internally. + The animationEvent variable refers to the JavaScript animation event that will be triggered + and the className value is the name of the animation that will be applied within the + CSS code. Element, `parentElement` and `afterElement` are provided DOM elements for the animation + and the onComplete callback will be fired once the animation is fully complete. + */ + function performAnimation(animationEvent, className, element, parentElement, afterElement, domOperation, options, doneCallback) { + var noopCancel = noop; + var runner = animationRunner(element, animationEvent, className, options); + if (!runner) { + fireDOMOperation(); + fireBeforeCallbackAsync(); + fireAfterCallbackAsync(); + closeAnimation(); + return noopCancel; + } + + animationEvent = runner.event; + className = runner.className; + var elementEvents = angular.element._data(runner.node); + elementEvents = elementEvents && elementEvents.events; + + if (!parentElement) { + parentElement = afterElement ? afterElement.parent() : element.parent(); + } + + //skip the animation if animations are disabled, a parent is already being animated, + //the element is not currently attached to the document body or then completely close + //the animation if any matching animations are not found at all. + //NOTE: IE8 + IE9 should close properly (run closeAnimation()) in case an animation was found. + if (animationsDisabled(element, parentElement)) { + fireDOMOperation(); + fireBeforeCallbackAsync(); + fireAfterCallbackAsync(); + closeAnimation(); + return noopCancel; + } + + var ngAnimateState = element.data(NG_ANIMATE_STATE) || {}; + var runningAnimations = ngAnimateState.active || {}; + var totalActiveAnimations = ngAnimateState.totalActive || 0; + var lastAnimation = ngAnimateState.last; + var skipAnimation = false; + + if (totalActiveAnimations > 0) { + var animationsToCancel = []; + if (!runner.isClassBased) { + if (animationEvent == 'leave' && runningAnimations['ng-leave']) { + skipAnimation = true; + } else { + //cancel all animations when a structural animation takes place + for (var klass in runningAnimations) { + animationsToCancel.push(runningAnimations[klass]); + } + ngAnimateState = {}; + cleanup(element, true); + } + } else if (lastAnimation.event == 'setClass') { + animationsToCancel.push(lastAnimation); + cleanup(element, className); + } else if (runningAnimations[className]) { + var current = runningAnimations[className]; + if (current.event == animationEvent) { + skipAnimation = true; + } else { + animationsToCancel.push(current); + cleanup(element, className); + } + } + + if (animationsToCancel.length > 0) { + forEach(animationsToCancel, function(operation) { + operation.cancel(); + }); + } + } + + if (runner.isClassBased + && !runner.isSetClassOperation + && animationEvent != 'animate' + && !skipAnimation) { + skipAnimation = (animationEvent == 'addClass') == element.hasClass(className); //opposite of XOR + } + + if (skipAnimation) { + fireDOMOperation(); + fireBeforeCallbackAsync(); + fireAfterCallbackAsync(); + fireDoneCallbackAsync(); + return noopCancel; + } + + runningAnimations = ngAnimateState.active || {}; + totalActiveAnimations = ngAnimateState.totalActive || 0; + + if (animationEvent == 'leave') { + //there's no need to ever remove the listener since the element + //will be removed (destroyed) after the leave animation ends or + //is cancelled midway + element.one('$destroy', function(e) { + var element = angular.element(this); + var state = element.data(NG_ANIMATE_STATE); + if (state) { + var activeLeaveAnimation = state.active['ng-leave']; + if (activeLeaveAnimation) { + activeLeaveAnimation.cancel(); + cleanup(element, 'ng-leave'); + } + } + }); + } + + //the ng-animate class does nothing, but it's here to allow for + //parent animations to find and cancel child animations when needed + $$jqLite.addClass(element, NG_ANIMATE_CLASS_NAME); + if (options && options.tempClasses) { + forEach(options.tempClasses, function(className) { + $$jqLite.addClass(element, className); + }); + } + + var localAnimationCount = globalAnimationCounter++; + totalActiveAnimations++; + runningAnimations[className] = runner; + + element.data(NG_ANIMATE_STATE, { + last: runner, + active: runningAnimations, + index: localAnimationCount, + totalActive: totalActiveAnimations + }); + + //first we run the before animations and when all of those are complete + //then we perform the DOM operation and run the next set of animations + fireBeforeCallbackAsync(); + runner.before(function(cancelled) { + var data = element.data(NG_ANIMATE_STATE); + cancelled = cancelled || + !data || !data.active[className] || + (runner.isClassBased && data.active[className].event != animationEvent); + + fireDOMOperation(); + if (cancelled === true) { + closeAnimation(); + } else { + fireAfterCallbackAsync(); + runner.after(closeAnimation); + } + }); + + return runner.cancel; + + function fireDOMCallback(animationPhase) { + var eventName = '$animate:' + animationPhase; + if (elementEvents && elementEvents[eventName] && elementEvents[eventName].length > 0) { + $$asyncCallback(function() { + element.triggerHandler(eventName, { + event: animationEvent, + className: className + }); + }); + } + } + + function fireBeforeCallbackAsync() { + fireDOMCallback('before'); + } + + function fireAfterCallbackAsync() { + fireDOMCallback('after'); + } + + function fireDoneCallbackAsync() { + fireDOMCallback('close'); + doneCallback(); + } + + //it is less complicated to use a flag than managing and canceling + //timeouts containing multiple callbacks. + function fireDOMOperation() { + if (!fireDOMOperation.hasBeenRun) { + fireDOMOperation.hasBeenRun = true; + domOperation(); + } + } + + function closeAnimation() { + if (!closeAnimation.hasBeenRun) { + if (runner) { //the runner doesn't exist if it fails to instantiate + runner.applyStyles(); + } + + closeAnimation.hasBeenRun = true; + if (options && options.tempClasses) { + forEach(options.tempClasses, function(className) { + $$jqLite.removeClass(element, className); + }); + } + + var data = element.data(NG_ANIMATE_STATE); + if (data) { + + /* only structural animations wait for reflow before removing an + animation, but class-based animations don't. An example of this + failing would be when a parent HTML tag has a ng-class attribute + causing ALL directives below to skip animations during the digest */ + if (runner && runner.isClassBased) { + cleanup(element, className); + } else { + $$asyncCallback(function() { + var data = element.data(NG_ANIMATE_STATE) || {}; + if (localAnimationCount == data.index) { + cleanup(element, className, animationEvent); + } + }); + element.data(NG_ANIMATE_STATE, data); + } + } + fireDoneCallbackAsync(); + } + } + } + + function cancelChildAnimations(element) { + var node = extractElementNode(element); + if (node) { + var nodes = angular.isFunction(node.getElementsByClassName) ? + node.getElementsByClassName(NG_ANIMATE_CLASS_NAME) : + node.querySelectorAll('.' + NG_ANIMATE_CLASS_NAME); + forEach(nodes, function(element) { + element = angular.element(element); + var data = element.data(NG_ANIMATE_STATE); + if (data && data.active) { + forEach(data.active, function(runner) { + runner.cancel(); + }); + } + }); + } + } + + function cleanup(element, className) { + if (isMatchingElement(element, $rootElement)) { + if (!rootAnimateState.disabled) { + rootAnimateState.running = false; + rootAnimateState.structural = false; + } + } else if (className) { + var data = element.data(NG_ANIMATE_STATE) || {}; + + var removeAnimations = className === true; + if (!removeAnimations && data.active && data.active[className]) { + data.totalActive--; + delete data.active[className]; + } + + if (removeAnimations || !data.totalActive) { + $$jqLite.removeClass(element, NG_ANIMATE_CLASS_NAME); + element.removeData(NG_ANIMATE_STATE); + } + } + } + + function animationsDisabled(element, parentElement) { + if (rootAnimateState.disabled) { + return true; + } + + if (isMatchingElement(element, $rootElement)) { + return rootAnimateState.running; + } + + var allowChildAnimations, parentRunningAnimation, hasParent; + do { + //the element did not reach the root element which means that it + //is not apart of the DOM. Therefore there is no reason to do + //any animations on it + if (parentElement.length === 0) break; + + var isRoot = isMatchingElement(parentElement, $rootElement); + var state = isRoot ? rootAnimateState : (parentElement.data(NG_ANIMATE_STATE) || {}); + if (state.disabled) { + return true; + } + + //no matter what, for an animation to work it must reach the root element + //this implies that the element is attached to the DOM when the animation is run + if (isRoot) { + hasParent = true; + } + + //once a flag is found that is strictly false then everything before + //it will be discarded and all child animations will be restricted + if (allowChildAnimations !== false) { + var animateChildrenFlag = parentElement.data(NG_ANIMATE_CHILDREN); + if (angular.isDefined(animateChildrenFlag)) { + allowChildAnimations = animateChildrenFlag; + } + } + + parentRunningAnimation = parentRunningAnimation || + state.running || + (state.last && !state.last.isClassBased); + } + while (parentElement = parentElement.parent()); + + return !hasParent || (!allowChildAnimations && parentRunningAnimation); + } + }]); + + $animateProvider.register('', ['$window', '$sniffer', '$timeout', '$$animateReflow', + function($window, $sniffer, $timeout, $$animateReflow) { + // Detect proper transitionend/animationend event names. + var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT; + + // If unprefixed events are not supported but webkit-prefixed are, use the latter. + // Otherwise, just use W3C names, browsers not supporting them at all will just ignore them. + // Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend` + // but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`. + // Register both events in case `window.onanimationend` is not supported because of that, + // do the same for `transitionend` as Safari is likely to exhibit similar behavior. + // Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit + // therefore there is no reason to test anymore for other vendor prefixes: http://caniuse.com/#search=transition + if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) { + CSS_PREFIX = '-webkit-'; + TRANSITION_PROP = 'WebkitTransition'; + TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend'; + } else { + TRANSITION_PROP = 'transition'; + TRANSITIONEND_EVENT = 'transitionend'; + } + + if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) { + CSS_PREFIX = '-webkit-'; + ANIMATION_PROP = 'WebkitAnimation'; + ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend'; + } else { + ANIMATION_PROP = 'animation'; + ANIMATIONEND_EVENT = 'animationend'; + } + + var DURATION_KEY = 'Duration'; + var PROPERTY_KEY = 'Property'; + var DELAY_KEY = 'Delay'; + var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount'; + var ANIMATION_PLAYSTATE_KEY = 'PlayState'; + var NG_ANIMATE_PARENT_KEY = '$$ngAnimateKey'; + var NG_ANIMATE_CSS_DATA_KEY = '$$ngAnimateCSS3Data'; + var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3; + var CLOSING_TIME_BUFFER = 1.5; + var ONE_SECOND = 1000; + + var lookupCache = {}; + var parentCounter = 0; + var animationReflowQueue = []; + var cancelAnimationReflow; + function clearCacheAfterReflow() { + if (!cancelAnimationReflow) { + cancelAnimationReflow = $$animateReflow(function() { + animationReflowQueue = []; + cancelAnimationReflow = null; + lookupCache = {}; + }); + } + } + + function afterReflow(element, callback) { + if (cancelAnimationReflow) { + cancelAnimationReflow(); + } + animationReflowQueue.push(callback); + cancelAnimationReflow = $$animateReflow(function() { + forEach(animationReflowQueue, function(fn) { + fn(); + }); + + animationReflowQueue = []; + cancelAnimationReflow = null; + lookupCache = {}; + }); + } + + var closingTimer = null; + var closingTimestamp = 0; + var animationElementQueue = []; + function animationCloseHandler(element, totalTime) { + var node = extractElementNode(element); + element = angular.element(node); + + //this item will be garbage collected by the closing + //animation timeout + animationElementQueue.push(element); + + //but it may not need to cancel out the existing timeout + //if the timestamp is less than the previous one + var futureTimestamp = Date.now() + totalTime; + if (futureTimestamp <= closingTimestamp) { + return; + } + + $timeout.cancel(closingTimer); + + closingTimestamp = futureTimestamp; + closingTimer = $timeout(function() { + closeAllAnimations(animationElementQueue); + animationElementQueue = []; + }, totalTime, false); + } + + function closeAllAnimations(elements) { + forEach(elements, function(element) { + var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY); + if (elementData) { + forEach(elementData.closeAnimationFns, function(fn) { + fn(); + }); + } + }); + } + + function getElementAnimationDetails(element, cacheKey) { + var data = cacheKey ? lookupCache[cacheKey] : null; + if (!data) { + var transitionDuration = 0; + var transitionDelay = 0; + var animationDuration = 0; + var animationDelay = 0; + + //we want all the styles defined before and after + forEach(element, function(element) { + if (element.nodeType == ELEMENT_NODE) { + var elementStyles = $window.getComputedStyle(element) || {}; + + var transitionDurationStyle = elementStyles[TRANSITION_PROP + DURATION_KEY]; + transitionDuration = Math.max(parseMaxTime(transitionDurationStyle), transitionDuration); + + var transitionDelayStyle = elementStyles[TRANSITION_PROP + DELAY_KEY]; + transitionDelay = Math.max(parseMaxTime(transitionDelayStyle), transitionDelay); + + var animationDelayStyle = elementStyles[ANIMATION_PROP + DELAY_KEY]; + animationDelay = Math.max(parseMaxTime(elementStyles[ANIMATION_PROP + DELAY_KEY]), animationDelay); + + var aDuration = parseMaxTime(elementStyles[ANIMATION_PROP + DURATION_KEY]); + + if (aDuration > 0) { + aDuration *= parseInt(elementStyles[ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY], 10) || 1; + } + animationDuration = Math.max(aDuration, animationDuration); + } + }); + data = { + total: 0, + transitionDelay: transitionDelay, + transitionDuration: transitionDuration, + animationDelay: animationDelay, + animationDuration: animationDuration + }; + if (cacheKey) { + lookupCache[cacheKey] = data; + } + } + return data; + } + + function parseMaxTime(str) { + var maxValue = 0; + var values = isString(str) ? + str.split(/\s*,\s*/) : + []; + forEach(values, function(value) { + maxValue = Math.max(parseFloat(value) || 0, maxValue); + }); + return maxValue; + } + + function getCacheKey(element) { + var parentElement = element.parent(); + var parentID = parentElement.data(NG_ANIMATE_PARENT_KEY); + if (!parentID) { + parentElement.data(NG_ANIMATE_PARENT_KEY, ++parentCounter); + parentID = parentCounter; + } + return parentID + '-' + extractElementNode(element).getAttribute('class'); + } + + function animateSetup(animationEvent, element, className, styles) { + var structural = ['ng-enter','ng-leave','ng-move'].indexOf(className) >= 0; + + var cacheKey = getCacheKey(element); + var eventCacheKey = cacheKey + ' ' + className; + var itemIndex = lookupCache[eventCacheKey] ? ++lookupCache[eventCacheKey].total : 0; + + var stagger = {}; + if (itemIndex > 0) { + var staggerClassName = className + '-stagger'; + var staggerCacheKey = cacheKey + ' ' + staggerClassName; + var applyClasses = !lookupCache[staggerCacheKey]; + + applyClasses && $$jqLite.addClass(element, staggerClassName); + + stagger = getElementAnimationDetails(element, staggerCacheKey); + + applyClasses && $$jqLite.removeClass(element, staggerClassName); + } + + $$jqLite.addClass(element, className); + + var formerData = element.data(NG_ANIMATE_CSS_DATA_KEY) || {}; + var timings = getElementAnimationDetails(element, eventCacheKey); + var transitionDuration = timings.transitionDuration; + var animationDuration = timings.animationDuration; + + if (structural && transitionDuration === 0 && animationDuration === 0) { + $$jqLite.removeClass(element, className); + return false; + } + + var blockTransition = styles || (structural && transitionDuration > 0); + var blockAnimation = animationDuration > 0 && + stagger.animationDelay > 0 && + stagger.animationDuration === 0; + + var closeAnimationFns = formerData.closeAnimationFns || []; + element.data(NG_ANIMATE_CSS_DATA_KEY, { + stagger: stagger, + cacheKey: eventCacheKey, + running: formerData.running || 0, + itemIndex: itemIndex, + blockTransition: blockTransition, + closeAnimationFns: closeAnimationFns + }); + + var node = extractElementNode(element); + + if (blockTransition) { + blockTransitions(node, true); + if (styles) { + element.css(styles); + } + } + + if (blockAnimation) { + blockAnimations(node, true); + } + + return true; + } + + function animateRun(animationEvent, element, className, activeAnimationComplete, styles) { + var node = extractElementNode(element); + var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY); + if (node.getAttribute('class').indexOf(className) == -1 || !elementData) { + activeAnimationComplete(); + return; + } + + var activeClassName = ''; + var pendingClassName = ''; + forEach(className.split(' '), function(klass, i) { + var prefix = (i > 0 ? ' ' : '') + klass; + activeClassName += prefix + '-active'; + pendingClassName += prefix + '-pending'; + }); + + var style = ''; + var appliedStyles = []; + var itemIndex = elementData.itemIndex; + var stagger = elementData.stagger; + var staggerTime = 0; + if (itemIndex > 0) { + var transitionStaggerDelay = 0; + if (stagger.transitionDelay > 0 && stagger.transitionDuration === 0) { + transitionStaggerDelay = stagger.transitionDelay * itemIndex; + } + + var animationStaggerDelay = 0; + if (stagger.animationDelay > 0 && stagger.animationDuration === 0) { + animationStaggerDelay = stagger.animationDelay * itemIndex; + appliedStyles.push(CSS_PREFIX + 'animation-play-state'); + } + + staggerTime = Math.round(Math.max(transitionStaggerDelay, animationStaggerDelay) * 100) / 100; + } + + if (!staggerTime) { + $$jqLite.addClass(element, activeClassName); + if (elementData.blockTransition) { + blockTransitions(node, false); + } + } + + var eventCacheKey = elementData.cacheKey + ' ' + activeClassName; + var timings = getElementAnimationDetails(element, eventCacheKey); + var maxDuration = Math.max(timings.transitionDuration, timings.animationDuration); + if (maxDuration === 0) { + $$jqLite.removeClass(element, activeClassName); + animateClose(element, className); + activeAnimationComplete(); + return; + } + + if (!staggerTime && styles && Object.keys(styles).length > 0) { + if (!timings.transitionDuration) { + element.css('transition', timings.animationDuration + 's linear all'); + appliedStyles.push('transition'); + } + element.css(styles); + } + + var maxDelay = Math.max(timings.transitionDelay, timings.animationDelay); + var maxDelayTime = maxDelay * ONE_SECOND; + + if (appliedStyles.length > 0) { + //the element being animated may sometimes contain comment nodes in + //the jqLite object, so we're safe to use a single variable to house + //the styles since there is always only one element being animated + var oldStyle = node.getAttribute('style') || ''; + if (oldStyle.charAt(oldStyle.length - 1) !== ';') { + oldStyle += ';'; + } + node.setAttribute('style', oldStyle + ' ' + style); + } + + var startTime = Date.now(); + var css3AnimationEvents = ANIMATIONEND_EVENT + ' ' + TRANSITIONEND_EVENT; + var animationTime = (maxDelay + maxDuration) * CLOSING_TIME_BUFFER; + var totalTime = (staggerTime + animationTime) * ONE_SECOND; + + var staggerTimeout; + if (staggerTime > 0) { + $$jqLite.addClass(element, pendingClassName); + staggerTimeout = $timeout(function() { + staggerTimeout = null; + + if (timings.transitionDuration > 0) { + blockTransitions(node, false); + } + if (timings.animationDuration > 0) { + blockAnimations(node, false); + } + + $$jqLite.addClass(element, activeClassName); + $$jqLite.removeClass(element, pendingClassName); + + if (styles) { + if (timings.transitionDuration === 0) { + element.css('transition', timings.animationDuration + 's linear all'); + } + element.css(styles); + appliedStyles.push('transition'); + } + }, staggerTime * ONE_SECOND, false); + } + + element.on(css3AnimationEvents, onAnimationProgress); + elementData.closeAnimationFns.push(function() { + onEnd(); + activeAnimationComplete(); + }); + + elementData.running++; + animationCloseHandler(element, totalTime); + return onEnd; + + // This will automatically be called by $animate so + // there is no need to attach this internally to the + // timeout done method. + function onEnd() { + element.off(css3AnimationEvents, onAnimationProgress); + $$jqLite.removeClass(element, activeClassName); + $$jqLite.removeClass(element, pendingClassName); + if (staggerTimeout) { + $timeout.cancel(staggerTimeout); + } + animateClose(element, className); + var node = extractElementNode(element); + for (var i in appliedStyles) { + node.style.removeProperty(appliedStyles[i]); + } + } + + function onAnimationProgress(event) { + event.stopPropagation(); + var ev = event.originalEvent || event; + var timeStamp = ev.$manualTimeStamp || ev.timeStamp || Date.now(); + + /* Firefox (or possibly just Gecko) likes to not round values up + * when a ms measurement is used for the animation */ + var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES)); + + /* $manualTimeStamp is a mocked timeStamp value which is set + * within browserTrigger(). This is only here so that tests can + * mock animations properly. Real events fallback to event.timeStamp, + * or, if they don't, then a timeStamp is automatically created for them. + * We're checking to see if the timeStamp surpasses the expected delay, + * but we're using elapsedTime instead of the timeStamp on the 2nd + * pre-condition since animations sometimes close off early */ + if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) { + activeAnimationComplete(); + } + } + } + + function blockTransitions(node, bool) { + node.style[TRANSITION_PROP + PROPERTY_KEY] = bool ? 'none' : ''; + } + + function blockAnimations(node, bool) { + node.style[ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY] = bool ? 'paused' : ''; + } + + function animateBefore(animationEvent, element, className, styles) { + if (animateSetup(animationEvent, element, className, styles)) { + return function(cancelled) { + cancelled && animateClose(element, className); + }; + } + } + + function animateAfter(animationEvent, element, className, afterAnimationComplete, styles) { + if (element.data(NG_ANIMATE_CSS_DATA_KEY)) { + return animateRun(animationEvent, element, className, afterAnimationComplete, styles); + } else { + animateClose(element, className); + afterAnimationComplete(); + } + } + + function animate(animationEvent, element, className, animationComplete, options) { + //If the animateSetup function doesn't bother returning a + //cancellation function then it means that there is no animation + //to perform at all + var preReflowCancellation = animateBefore(animationEvent, element, className, options.from); + if (!preReflowCancellation) { + clearCacheAfterReflow(); + animationComplete(); + return; + } + + //There are two cancellation functions: one is before the first + //reflow animation and the second is during the active state + //animation. The first function will take care of removing the + //data from the element which will not make the 2nd animation + //happen in the first place + var cancel = preReflowCancellation; + afterReflow(element, function() { + //once the reflow is complete then we point cancel to + //the new cancellation function which will remove all of the + //animation properties from the active animation + cancel = animateAfter(animationEvent, element, className, animationComplete, options.to); + }); + + return function(cancelled) { + (cancel || noop)(cancelled); + }; + } + + function animateClose(element, className) { + $$jqLite.removeClass(element, className); + var data = element.data(NG_ANIMATE_CSS_DATA_KEY); + if (data) { + if (data.running) { + data.running--; + } + if (!data.running || data.running === 0) { + element.removeData(NG_ANIMATE_CSS_DATA_KEY); + } + } + } + + return { + animate: function(element, className, from, to, animationCompleted, options) { + options = options || {}; + options.from = from; + options.to = to; + return animate('animate', element, className, animationCompleted, options); + }, + + enter: function(element, animationCompleted, options) { + options = options || {}; + return animate('enter', element, 'ng-enter', animationCompleted, options); + }, + + leave: function(element, animationCompleted, options) { + options = options || {}; + return animate('leave', element, 'ng-leave', animationCompleted, options); + }, + + move: function(element, animationCompleted, options) { + options = options || {}; + return animate('move', element, 'ng-move', animationCompleted, options); + }, + + beforeSetClass: function(element, add, remove, animationCompleted, options) { + options = options || {}; + var className = suffixClasses(remove, '-remove') + ' ' + + suffixClasses(add, '-add'); + var cancellationMethod = animateBefore('setClass', element, className, options.from); + if (cancellationMethod) { + afterReflow(element, animationCompleted); + return cancellationMethod; + } + clearCacheAfterReflow(); + animationCompleted(); + }, + + beforeAddClass: function(element, className, animationCompleted, options) { + options = options || {}; + var cancellationMethod = animateBefore('addClass', element, suffixClasses(className, '-add'), options.from); + if (cancellationMethod) { + afterReflow(element, animationCompleted); + return cancellationMethod; + } + clearCacheAfterReflow(); + animationCompleted(); + }, + + beforeRemoveClass: function(element, className, animationCompleted, options) { + options = options || {}; + var cancellationMethod = animateBefore('removeClass', element, suffixClasses(className, '-remove'), options.from); + if (cancellationMethod) { + afterReflow(element, animationCompleted); + return cancellationMethod; + } + clearCacheAfterReflow(); + animationCompleted(); + }, + + setClass: function(element, add, remove, animationCompleted, options) { + options = options || {}; + remove = suffixClasses(remove, '-remove'); + add = suffixClasses(add, '-add'); + var className = remove + ' ' + add; + return animateAfter('setClass', element, className, animationCompleted, options.to); + }, + + addClass: function(element, className, animationCompleted, options) { + options = options || {}; + return animateAfter('addClass', element, suffixClasses(className, '-add'), animationCompleted, options.to); + }, + + removeClass: function(element, className, animationCompleted, options) { + options = options || {}; + return animateAfter('removeClass', element, suffixClasses(className, '-remove'), animationCompleted, options.to); + } + }; + + function suffixClasses(classes, suffix) { + var className = ''; + classes = isArray(classes) ? classes : classes.split(/\s+/); + forEach(classes, function(klass, i) { + if (klass && klass.length > 0) { + className += (i > 0 ? ' ' : '') + klass + suffix; + } + }); + return className; + } + }]); + }]); + + +})(window, window.angular); diff --git a/bower_components/angular-animate/angular-animate.min.js b/bower_components/angular-animate/angular-animate.min.js new file mode 100644 index 0000000..c0f361b --- /dev/null +++ b/bower_components/angular-animate/angular-animate.min.js @@ -0,0 +1,33 @@ +/* + AngularJS v1.3.15 + (c) 2010-2014 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(N,f,W){'use strict';f.module("ngAnimate",["ng"]).directive("ngAnimateChildren",function(){return function(X,C,g){g=g.ngAnimateChildren;f.isString(g)&&0===g.length?C.data("$$ngAnimateChildren",!0):X.$watch(g,function(f){C.data("$$ngAnimateChildren",!!f)})}}).factory("$$animateReflow",["$$rAF","$document",function(f,C){return function(g){return f(function(){g()})}}]).config(["$provide","$animateProvider",function(X,C){function g(f){for(var n=0;n=C&&b>=x&&c()}var m=g(e);a=e.data("$$ngAnimateCSS3Data");if(-1!=m.getAttribute("class").indexOf(b)&&a){var k="",t="";n(b.split(" "),function(a, +b){var e=(0", + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/angular.js/issues" + }, + "homepage": "http://angularjs.org" +} diff --git a/bower_components/angular-aside/.bower.json b/bower_components/angular-aside/.bower.json new file mode 100644 index 0000000..b351907 --- /dev/null +++ b/bower_components/angular-aside/.bower.json @@ -0,0 +1,48 @@ +{ + "name": "angular-aside", + "version": "1.1.3", + "homepage": "https://github.com/dbtek/angular-aside", + "author": { + "name": "İsmail Demirbilek", + "email": "ce.demirbilek@gmail.com" + }, + "description": "Off canvas side menu to use with ui-bootstrap.", + "main": [ + "dist/js/angular-aside.js", + "dist/css/angular-aside.css" + ], + "keywords": [ + "aside", + "off", + "canvas", + "menu", + "ui", + "bootstrap" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests", + "Gruntfile.js", + "karma.conf.js", + "package.json" + ], + "dependencies": { + "angular-bootstrap": "~0.12.0" + }, + "devDependencies": { + "angular-mocks": "~1.2.27" + }, + "_release": "1.1.3", + "_resolution": { + "type": "version", + "tag": "1.1.3", + "commit": "346d6e86cfabddb9d367c6eafbd33e5b215dd77a" + }, + "_source": "git://github.com/dbtek/angular-aside.git", + "_target": "~1.1.3", + "_originalSource": "angular-aside" +} \ No newline at end of file diff --git a/bower_components/angular-aside/LICENSE b/bower_components/angular-aside/LICENSE new file mode 100644 index 0000000..cbc9d51 --- /dev/null +++ b/bower_components/angular-aside/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 İsmail Demirbilek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/bower_components/angular-aside/README.md b/bower_components/angular-aside/README.md new file mode 100644 index 0000000..58978d4 --- /dev/null +++ b/bower_components/angular-aside/README.md @@ -0,0 +1,49 @@ +angular-aside ![bower version](http://img.shields.io/bower/v/angular-aside.svg) +============= + +Off canvas side menu to use with ui-bootstrap. Extends ui-bootstrap's $modal provider. + +###[Live Demo](http://plnkr.co/edit/G7vMSv?p=preview) + +##Install + +- Install with bower: +```bash + $ bower install angular-aside +``` +- Include css/js in html. + + +##Usage + +```js + angular.module('myApp', ['ui.bootstrap', 'ngAside']); +``` + +```js +angular.module('myApp') + .controller('MyController', function($scope, $aside) { + var asideInstance = $aside.open({ + templateUrl: 'aside.html', + controller: 'AsideCtrl', + placement: 'left', + size: 'lg' + }); + }); +``` + +Supports all configuration that `$modal` has. Can be used with both `template` and `templateUrl`. For more info hit **Modal** section on [angular-ui bootstrap](http://angular-ui.github.io/bootstrap) documentation. + + +##Additional Config +- `placement` - Aside placement can be `'left'`, `'right'`, `'top'`, or `'bottom'`. + + +##Credits +- [Angular UI Bootstrap](angular-ui.github.io/bootstrap/) +- [Animate.css](http://daneden.github.io/animate.css/) + + +##Author + +İsmail Demirbilek ([@dbtek](https://twitter.com/dbtek)) diff --git a/bower_components/angular-aside/bower.json b/bower_components/angular-aside/bower.json new file mode 100644 index 0000000..0a0f9ff --- /dev/null +++ b/bower_components/angular-aside/bower.json @@ -0,0 +1,39 @@ +{ + "name": "angular-aside", + "version": "1.1.2", + "homepage": "https://github.com/dbtek/angular-aside", + "author": { + "name": "İsmail Demirbilek", + "email": "ce.demirbilek@gmail.com" + }, + "description": "Off canvas side menu to use with ui-bootstrap.", + "main": [ + "dist/js/angular-aside.js", + "dist/css/angular-aside.css" + ], + "keywords": [ + "aside", + "off", + "canvas", + "menu", + "ui", + "bootstrap" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests", + "Gruntfile.js", + "karma.conf.js", + "package.json" + ], + "dependencies": { + "angular-bootstrap": "~0.12.0" + }, + "devDependencies": { + "angular-mocks": "~1.2.27" + } +} diff --git a/bower_components/angular-aside/demo.html b/bower_components/angular-aside/demo.html new file mode 100644 index 0000000..408efc8 --- /dev/null +++ b/bower_components/angular-aside/demo.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + +
    +
    +

    Angular Aside

    +

    + Off canvas side menu to use with ui-bootstrap. Extends ui-bootstrap's $modal provider. +

    +

    + + Download + +
    + Tweet + +

    +
    +
      +
    • + made with by @dbtek +
    • +
    • + + github project +
    • +
    • + + license: MIT +
    • +
    +
    +
    +
    +

    Demo

    +

    + + + + + + + + +

    +
    +
    + +
    + +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/bower_components/angular-aside/dist/css/angular-aside.css b/bower_components/angular-aside/dist/css/angular-aside.css new file mode 100644 index 0000000..469c13a --- /dev/null +++ b/bower_components/angular-aside/dist/css/angular-aside.css @@ -0,0 +1,421 @@ +/*! + * angular-aside - v1.1.2 + * https://github.com/dbtek/angular-aside + * 2015-03-04 + * Copyright (c) 2015 İsmail Demirbilek + * License: MIT + */ + +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license - http://opensource.org/licenses/MIT + +Copyright (c) 2014 Daniel Eden +*/ + +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + -ms-transform: none; + transform: none; + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + -ms-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + -ms-transform: none; + transform: none; + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +@-webkit-keyframes fadeInTop { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInTop { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + -ms-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + -ms-transform: none; + transform: none; + } +} + +.fadeInTop { + -webkit-animation-name: fadeInTop; + animation-name: fadeInTop; +} + +@-webkit-keyframes fadeInBottom { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInBottom { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + -ms-transform: none; + transform: none; + } +} + +.fadeInBottom { + -webkit-animation-name: fadeInBottom; + animation-name: fadeInBottom; +} + +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes fadeOutLeft { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes fadeOutRight { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + + +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes fadeOutDown { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} +/* Common */ + +.ng-aside { + overflow-y: auto; + overflow-x: hidden; +} + +.ng-aside .modal-dialog { + position: absolute; + margin: 0; + padding: 0; +} + +.ng-aside.fade .modal-dialog { + -o-transition: none; + -moz-transition: none; + -ms-transition: none; + -webkit-transition: none; + transition: none; + /*CSS transforms*/ + -o-transform: none; + -moz-transform: none; + -ms-transform: none; + -webkit-transform: none; + transform: none; +} + +.ng-aside .modal-dialog .modal-content { + overflow-y: auto; + overflow-x: hidden; + border: none; + border-radius: 0; +} + +/* Horizontal */ + +.ng-aside.horizontal { + height: 100%; +} + +.ng-aside.horizontal .modal-dialog .modal-content { + height: 100%; +} + +.ng-aside.horizontal .modal-dialog { + position: absolute; + top: 0; + height: 100%; +} + +.modal-open .ng-aside.horizontal.left .modal-dialog { + animation: fadeOutLeft 250ms; + -webkit-animation: fadeOutLeft 250ms; + -moz-animation: fadeOutLeft 250ms; + -o-animation: fadeOutLeft 250ms; + -ms-animation: fadeOutLeft 250ms; +} + +.ng-aside.horizontal.left.in .modal-dialog { + animation: fadeInLeft 400ms; + -webkit-animation: fadeInLeft 400ms; + -moz-animation: fadeInLeft 400ms; + -o-animation: fadeInLeft 400ms; + -ms-animation: fadeInLeft 400ms; +} + +.ng-aside.horizontal.left .modal-dialog { + left: 0; +} + +.ng-aside.horizontal.right .modal-dialog { + animation: fadeOutRight 400ms; + -webkit-animation: fadeOutRight 400ms; + -moz-animation: fadeOutRight 400ms; + -o-animation: fadeOutRight 400ms; + -ms-animation: fadeOutRight 400ms; +} + +.ng-aside.horizontal.right.in .modal-dialog { + animation: fadeInRight 250ms; + -webkit-animation: fadeInRight 250ms; +} + +.ng-aside.horizontal.right .modal-dialog { + right: 0; +} + +/* Vertical */ + +.ng-aside.vertical { + width: 100% !important; + overflow: hidden; +} + +.ng-aside.vertical .modal-dialog { + left: 0; + right: 0; + width: 100% !important; +} + +.ng-aside.vertical .modal-dialog .modal-content { + max-height: 400px; +} + +.ng-aside.vertical.top .modal-dialog { + animation: fadeOutUp 250ms; + -webkit-animation: fadeOutUp 250ms; + -webkit-animation: fadeOutUp 250ms; + -moz-animation: fadeOutUp 250ms; + -o-animation: fadeOutUp 250ms; + -ms-animation: fadeOutUp 250ms; +} + +.ng-aside.vertical.top.in .modal-dialog { + animation: fadeInTop 250ms; + -webkit-animation: fadeInTop 250ms; + -webkit-animation: fadeInTop 250ms; + -moz-animation: fadeInTop 250ms; + -o-animation: fadeInTop 250ms; + -ms-animation: fadeInTop 250ms; +} + +.ng-aside.vertical.bottom .modal-dialog { + animation: fadeOutDown 250ms; + -webkit-animation: fadeOutDown 250ms; + -webkit-animation: fadeOutDown 250ms; + -moz-animation: fadeOutDown 250ms; + -o-animation: fadeOutDown 250ms; + -ms-animation: fadeOutDown 250ms; +} +.ng-aside.vertical.bottom.in .modal-dialog { + animation: fadeInBottom 250ms; + -webkit-animation: fadeInBottom 250ms; + -webkit-animation: fadeInBottom 250ms; + -moz-animation: fadeInBottom 250ms; + -o-animation: fadeInBottom 250ms; + -ms-animation: fadeInBottom 250ms; +} + +.ng-aside.vertical.bottom .modal-dialog { + bottom: 0; +} + +.ng-aside.vertical.top .modal-dialog { + top: 0; +} + +.ng-aside.vertical .modal-dialog .modal-content { + width: 100%; +} \ No newline at end of file diff --git a/bower_components/angular-aside/dist/css/angular-aside.min.css b/bower_components/angular-aside/dist/css/angular-aside.min.css new file mode 100644 index 0000000..a4ff744 --- /dev/null +++ b/bower_components/angular-aside/dist/css/angular-aside.min.css @@ -0,0 +1,14 @@ +/*! + * angular-aside - v1.1.2 + * https://github.com/dbtek/angular-aside + * 2015-03-04 + * Copyright (c) 2015 İsmail Demirbilek + * License: MIT + */ + +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license - http://opensource.org/licenses/MIT + +Copyright (c) 2014 Daniel Eden +*/@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInTop{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInTop{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInTop{-webkit-animation-name:fadeInTop;animation-name:fadeInTop}@-webkit-keyframes fadeInBottom{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInBottom{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInBottom{-webkit-animation-name:fadeInBottom;animation-name:fadeInBottom}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}.ng-aside{overflow-y:auto;overflow-x:hidden}.ng-aside .modal-dialog{position:absolute;margin:0;padding:0}.ng-aside.fade .modal-dialog{-o-transition:none;-moz-transition:none;-ms-transition:none;-webkit-transition:none;transition:none;-o-transform:none;-moz-transform:none;-ms-transform:none;-webkit-transform:none;transform:none}.ng-aside .modal-dialog .modal-content{overflow-y:auto;overflow-x:hidden;border:none;border-radius:0}.ng-aside.horizontal,.ng-aside.horizontal .modal-dialog .modal-content{height:100%}.ng-aside.horizontal .modal-dialog{position:absolute;top:0;height:100%}.modal-open .ng-aside.horizontal.left .modal-dialog{animation:fadeOutLeft 250ms;-webkit-animation:fadeOutLeft 250ms;-moz-animation:fadeOutLeft 250ms;-o-animation:fadeOutLeft 250ms;-ms-animation:fadeOutLeft 250ms}.ng-aside.horizontal.left.in .modal-dialog{animation:fadeInLeft 400ms;-webkit-animation:fadeInLeft 400ms;-moz-animation:fadeInLeft 400ms;-o-animation:fadeInLeft 400ms;-ms-animation:fadeInLeft 400ms}.ng-aside.horizontal.left .modal-dialog{left:0}.ng-aside.horizontal.right .modal-dialog{animation:fadeOutRight 400ms;-webkit-animation:fadeOutRight 400ms;-moz-animation:fadeOutRight 400ms;-o-animation:fadeOutRight 400ms;-ms-animation:fadeOutRight 400ms}.ng-aside.horizontal.right.in .modal-dialog{animation:fadeInRight 250ms;-webkit-animation:fadeInRight 250ms}.ng-aside.horizontal.right .modal-dialog{right:0}.ng-aside.vertical{width:100%!important;overflow:hidden}.ng-aside.vertical .modal-dialog{left:0;right:0;width:100%!important}.ng-aside.vertical .modal-dialog .modal-content{max-height:400px}.ng-aside.vertical.top .modal-dialog{animation:fadeOutUp 250ms;-webkit-animation:fadeOutUp 250ms;-webkit-animation:fadeOutUp 250ms;-moz-animation:fadeOutUp 250ms;-o-animation:fadeOutUp 250ms;-ms-animation:fadeOutUp 250ms}.ng-aside.vertical.top.in .modal-dialog{animation:fadeInTop 250ms;-webkit-animation:fadeInTop 250ms;-webkit-animation:fadeInTop 250ms;-moz-animation:fadeInTop 250ms;-o-animation:fadeInTop 250ms;-ms-animation:fadeInTop 250ms}.ng-aside.vertical.bottom .modal-dialog{animation:fadeOutDown 250ms;-webkit-animation:fadeOutDown 250ms;-webkit-animation:fadeOutDown 250ms;-moz-animation:fadeOutDown 250ms;-o-animation:fadeOutDown 250ms;-ms-animation:fadeOutDown 250ms}.ng-aside.vertical.bottom.in .modal-dialog{animation:fadeInBottom 250ms;-webkit-animation:fadeInBottom 250ms;-webkit-animation:fadeInBottom 250ms;-moz-animation:fadeInBottom 250ms;-o-animation:fadeInBottom 250ms;-ms-animation:fadeInBottom 250ms}.ng-aside.vertical.bottom .modal-dialog{bottom:0}.ng-aside.vertical.top .modal-dialog{top:0}.ng-aside.vertical .modal-dialog .modal-content{width:100%} \ No newline at end of file diff --git a/bower_components/angular-aside/dist/js/angular-aside.js b/bower_components/angular-aside/dist/js/angular-aside.js new file mode 100644 index 0000000..ef7d77a --- /dev/null +++ b/bower_components/angular-aside/dist/js/angular-aside.js @@ -0,0 +1,60 @@ + +/*! + * angular-aside - v1.1.2 + * https://github.com/dbtek/angular-aside + * 2015-03-04 + * Copyright (c) 2015 İsmail Demirbilek + * License: MIT + */ + +(function() { +/** + * @ngdoc overview + * @name ngAside + * @description + * Main module for aside component. + * @function + * @author İsmail Demirbilek + */ + angular.module('ngAside', ['ui.bootstrap.modal']); +})(); + +(function() { + angular.module('ngAside') + /** + * @ngdoc service + * @name ngAside.services:$aside + * @description + * Factory to create a modal instance to use it as aside. It simply wraps $modal by overriding open() method and sets a class on modal window. + * @function + */ + .factory('$aside', $aside); + + $aside.$inject = ['$modal']; + /* @ngInject */ + function $aside($modal) { + var defaults = this.defaults = { + placement: 'left' + }; + + var asideFactory = { + // override open method + open: function(config) { + var options = angular.extend({}, defaults, config); + // check placement is set correct + if(['left', 'right', 'bottom', 'top'].indexOf(options.placement) === -1) { + options.placement = defaults.placement; + } + var vertHoriz = ['left', 'right'].indexOf(options.placement) === -1 ? 'vertical' : 'horizontal'; + // set aside classes + options.windowClass = 'ng-aside ' + vertHoriz + ' ' + options.placement + (options.windowClass ? ' ' + options.windowClass : ''); + delete options.placement + return $modal.open(options); + } + }; + + // create $aside as extended $modal + var $aside = angular.extend({}, $modal, asideFactory); + return $aside; + } +})(); diff --git a/bower_components/angular-aside/dist/js/angular-aside.min.js b/bower_components/angular-aside/dist/js/angular-aside.min.js new file mode 100644 index 0000000..7f0ae92 --- /dev/null +++ b/bower_components/angular-aside/dist/js/angular-aside.min.js @@ -0,0 +1,8 @@ +/*! + * angular-aside - v1.1.2 + * https://github.com/dbtek/angular-aside + * 2015-03-04 + * Copyright (c) 2015 İsmail Demirbilek + * License: MIT + */ +!function(){angular.module("ngAside",["ui.bootstrap.modal"])}(),function(){function a(a){var b=this.defaults={placement:"left"},c={open:function(c){var d=angular.extend({},b,c);-1===["left","right","bottom","top"].indexOf(d.placement)&&(d.placement=b.placement);var e=-1===["left","right"].indexOf(d.placement)?"vertical":"horizontal";return d.windowClass="ng-aside "+e+" "+d.placement+(d.windowClass?" "+d.windowClass:""),delete d.placement,a.open(d)}},d=angular.extend({},a,c);return d}angular.module("ngAside").factory("$aside",a),a.$inject=["$modal"]}(); \ No newline at end of file diff --git a/bower_components/angular-aside/src/scripts/app.js b/bower_components/angular-aside/src/scripts/app.js new file mode 100644 index 0000000..d9f6e3c --- /dev/null +++ b/bower_components/angular-aside/src/scripts/app.js @@ -0,0 +1,13 @@ +(function() { + 'use strict'; + + /** + * @ngdoc overview + * @name ngAside + * @description + * Main module for aside component. + * @function + * @author İsmail Demirbilek + */ + angular.module('ngAside', ['ui.bootstrap.modal']); +})(); diff --git a/bower_components/angular-aside/src/scripts/services/aside.js b/bower_components/angular-aside/src/scripts/services/aside.js new file mode 100644 index 0000000..e1c12f9 --- /dev/null +++ b/bower_components/angular-aside/src/scripts/services/aside.js @@ -0,0 +1,39 @@ +(function() { + angular.module('ngAside') + /** + * @ngdoc service + * @name ngAside.services:$aside + * @description + * Factory to create a modal instance to use it as aside. It simply wraps $modal by overriding open() method and sets a class on modal window. + * @function + */ + .factory('$aside', $aside); + + $aside.$inject = ['$modal']; + /* @ngInject */ + function $aside($modal) { + var defaults = this.defaults = { + placement: 'left' + }; + + var asideFactory = { + // override open method + open: function(config) { + var options = angular.extend({}, defaults, config); + // check placement is set correct + if(['left', 'right', 'bottom', 'top'].indexOf(options.placement) === -1) { + options.placement = defaults.placement; + } + var vertHoriz = ['left', 'right'].indexOf(options.placement) === -1 ? 'vertical' : 'horizontal'; + // set aside classes + options.windowClass = 'ng-aside ' + vertHoriz + ' ' + options.placement + (options.windowClass ? ' ' + options.windowClass : ''); + delete options.placement + return $modal.open(options); + } + }; + + // create $aside as extended $modal + var $aside = angular.extend({}, $modal, asideFactory); + return $aside; + } +})(); diff --git a/bower_components/angular-aside/src/styles/animate.css b/bower_components/angular-aside/src/styles/animate.css new file mode 100644 index 0000000..41c6d05 --- /dev/null +++ b/bower_components/angular-aside/src/styles/animate.css @@ -0,0 +1,263 @@ +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license - http://opensource.org/licenses/MIT + +Copyright (c) 2014 Daniel Eden +*/ + +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + -ms-transform: none; + transform: none; + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + -ms-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + -ms-transform: none; + transform: none; + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +@-webkit-keyframes fadeInTop { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInTop { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + -ms-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + -ms-transform: none; + transform: none; + } +} + +.fadeInTop { + -webkit-animation-name: fadeInTop; + animation-name: fadeInTop; +} + +@-webkit-keyframes fadeInBottom { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInBottom { + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + -ms-transform: none; + transform: none; + } +} + +.fadeInBottom { + -webkit-animation-name: fadeInBottom; + animation-name: fadeInBottom; +} + +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes fadeOutLeft { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes fadeOutRight { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + + +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes fadeOutDown { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} \ No newline at end of file diff --git a/bower_components/angular-aside/src/styles/aside.css b/bower_components/angular-aside/src/styles/aside.css new file mode 100644 index 0000000..5820485 --- /dev/null +++ b/bower_components/angular-aside/src/styles/aside.css @@ -0,0 +1,150 @@ +/* Common */ + +.ng-aside { + overflow-y: auto; + overflow-x: hidden; +} + +.ng-aside .modal-dialog { + position: absolute; + margin: 0; + padding: 0; +} + +.ng-aside.fade .modal-dialog { + -o-transition: none; + -moz-transition: none; + -ms-transition: none; + -webkit-transition: none; + transition: none; + /*CSS transforms*/ + -o-transform: none; + -moz-transform: none; + -ms-transform: none; + -webkit-transform: none; + transform: none; +} + +.ng-aside .modal-dialog .modal-content { + overflow-y: auto; + overflow-x: hidden; + border: none; + border-radius: 0; +} + +/* Horizontal */ + +.ng-aside.horizontal { + height: 100%; +} + +.ng-aside.horizontal .modal-dialog .modal-content { + height: 100%; +} + +.ng-aside.horizontal .modal-dialog { + position: absolute; + top: 0; + height: 100%; +} + +.modal-open .ng-aside.horizontal.left .modal-dialog { + animation: fadeOutLeft 250ms; + -webkit-animation: fadeOutLeft 250ms; + -moz-animation: fadeOutLeft 250ms; + -o-animation: fadeOutLeft 250ms; + -ms-animation: fadeOutLeft 250ms; +} + +.ng-aside.horizontal.left.in .modal-dialog { + animation: fadeInLeft 400ms; + -webkit-animation: fadeInLeft 400ms; + -moz-animation: fadeInLeft 400ms; + -o-animation: fadeInLeft 400ms; + -ms-animation: fadeInLeft 400ms; +} + +.ng-aside.horizontal.left .modal-dialog { + left: 0; +} + +.ng-aside.horizontal.right .modal-dialog { + animation: fadeOutRight 400ms; + -webkit-animation: fadeOutRight 400ms; + -moz-animation: fadeOutRight 400ms; + -o-animation: fadeOutRight 400ms; + -ms-animation: fadeOutRight 400ms; +} + +.ng-aside.horizontal.right.in .modal-dialog { + animation: fadeInRight 250ms; + -webkit-animation: fadeInRight 250ms; +} + +.ng-aside.horizontal.right .modal-dialog { + right: 0; +} + +/* Vertical */ + +.ng-aside.vertical { + width: 100% !important; + overflow: hidden; +} + +.ng-aside.vertical .modal-dialog { + left: 0; + right: 0; + width: 100% !important; +} + +.ng-aside.vertical .modal-dialog .modal-content { + max-height: 400px; +} + +.ng-aside.vertical.top .modal-dialog { + animation: fadeOutUp 250ms; + -webkit-animation: fadeOutUp 250ms; + -webkit-animation: fadeOutUp 250ms; + -moz-animation: fadeOutUp 250ms; + -o-animation: fadeOutUp 250ms; + -ms-animation: fadeOutUp 250ms; +} + +.ng-aside.vertical.top.in .modal-dialog { + animation: fadeInTop 250ms; + -webkit-animation: fadeInTop 250ms; + -webkit-animation: fadeInTop 250ms; + -moz-animation: fadeInTop 250ms; + -o-animation: fadeInTop 250ms; + -ms-animation: fadeInTop 250ms; +} + +.ng-aside.vertical.bottom .modal-dialog { + animation: fadeOutDown 250ms; + -webkit-animation: fadeOutDown 250ms; + -webkit-animation: fadeOutDown 250ms; + -moz-animation: fadeOutDown 250ms; + -o-animation: fadeOutDown 250ms; + -ms-animation: fadeOutDown 250ms; +} +.ng-aside.vertical.bottom.in .modal-dialog { + animation: fadeInBottom 250ms; + -webkit-animation: fadeInBottom 250ms; + -webkit-animation: fadeInBottom 250ms; + -moz-animation: fadeInBottom 250ms; + -o-animation: fadeInBottom 250ms; + -ms-animation: fadeInBottom 250ms; +} + +.ng-aside.vertical.bottom .modal-dialog { + bottom: 0; +} + +.ng-aside.vertical.top .modal-dialog { + top: 0; +} + +.ng-aside.vertical .modal-dialog .modal-content { + width: 100%; +} \ No newline at end of file diff --git a/bower_components/angular-bootstrap-calendar/.bower.json b/bower_components/angular-bootstrap-calendar/.bower.json new file mode 100644 index 0000000..d14929c --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/.bower.json @@ -0,0 +1,46 @@ +{ + "name": "angular-bootstrap-calendar", + "version": "0.7.4", + "homepage": "https://github.com/mattlewis92/angular-bootstrap-calendar", + "authors": [ + "Matt Lewis " + ], + "description": "A pure AngularJS bootstrap themed responsive calendar that can display events and has views for year, month, week and day", + "main": [ + "dist/js/angular-bootstrap-calendar-tpls.min.js", + "dist/css/angular-bootstrap-calendar.min.css" + ], + "keywords": [ + "AngularJS", + "Bootstrap", + "Responsive", + "Calendar" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "docs/bower_components", + "test", + "tests" + ], + "dependencies": { + "angular": "~1.3.5", + "moment": "~2.8.4", + "angular-bootstrap": "~0.12.0", + "bootstrap": "~3.3.1" + }, + "resolutions": { + "angular": "~1.3.5" + }, + "_release": "0.7.4", + "_resolution": { + "type": "version", + "tag": "0.7.4", + "commit": "cf711a9408bbd3a6b00a6da6f9cdd94ca0764d58" + }, + "_source": "git://github.com/mattlewis92/angular-bootstrap-calendar.git", + "_target": "~0.7.0", + "_originalSource": "angular-bootstrap-calendar" +} \ No newline at end of file diff --git a/bower_components/angular-bootstrap-calendar/404.html b/bower_components/angular-bootstrap-calendar/404.html new file mode 100644 index 0000000..ec98e3c --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/404.html @@ -0,0 +1,157 @@ + + + + + Page Not Found :( + + + +
    +

    Not found :(

    +

    Sorry, but the page you were trying to view does not exist.

    +

    It looks like this was the result of either:

    +
      +
    • a mistyped address
    • +
    • an out-of-date link
    • +
    + + +
    + + diff --git a/bower_components/angular-bootstrap-calendar/LICENSE b/bower_components/angular-bootstrap-calendar/LICENSE new file mode 100644 index 0000000..ef26969 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/LICENSE @@ -0,0 +1,19 @@ +The MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/bower_components/angular-bootstrap-calendar/README.md b/bower_components/angular-bootstrap-calendar/README.md new file mode 100644 index 0000000..6ae250a --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/README.md @@ -0,0 +1,206 @@ +# Angular Bootstrap Calendar + +## Table of contents + +- [About](#about) +- [Installation](#installation) +- [Documentation](#documentation) +- [Demo](#demo) +- [Development](#development) +- [License](#licence) + +## About + +This plugin is an AngularJS port of the original jQuery bootstrap calendar that can be found here: +http://bootstrap-calendar.azurewebsites.net/ + +The layout and functionality is intended to be exactly the same, but without the overhead of including jQuery just for a calendar. + +All credits for the UI/UX of the calendar go to the original author. + +Pull requests are welcome. + +## Installation + +The calendar has a few dependencies, these are as follows, and must be included BEFORE the plugin files: + +* [AngularJS](https://angularjs.org/) 1.2+ +* [Bootstrap](http://getbootstrap.com/) 3+ (CSS only) +* [Moment.js](http://momentjs.com/) +* [ui-bootstrap](http://angular-ui.github.io/bootstrap/) (tooltip and collapse plugins only if you want a custom build) + +It is recommended that you install the plugin and its dependencies through bower: + +``` +bower install --save angular-bootstrap-calendar +``` + +You will then need to include the JS and CSS files for the plugin: + +``` + + + +

    + Edit events + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeStarts atEnds atRemove
    + + +

    + + + + +

    + +
    +

    + + + + +

    + +
    + + + + + + + + + + + + + + + + + + + + diff --git a/bower_components/angular-bootstrap-calendar/package.json b/bower_components/angular-bootstrap-calendar/package.json new file mode 100644 index 0000000..41fc647 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/package.json @@ -0,0 +1,26 @@ +{ + "name": "angular-bootstrap-calendar", + "version": "0.7.4", + "repository": "git@github.com:mattlewis92/angular-bootstrap-calendar.git", + "dependencies": {}, + "devDependencies": { + "gulp": "^3.8.8", + "gulp-angular-filesort": "^1.0.4", + "gulp-angular-templatecache": "^1.4.1", + "gulp-concat": "^2.4.1", + "gulp-connect": "^2.0.6", + "gulp-livereload": "~3.7.0", + "gulp-load-plugins": "~0.8.0", + "gulp-minify-css": "~0.4.5", + "gulp-minify-html": "^0.1.5", + "gulp-ng-annotate": "~0.5.2", + "gulp-rename": "^1.2.0", + "gulp-sourcemaps": "^1.2.2", + "gulp-uglify": "^1.0.1", + "open": "0.0.5", + "streamqueue": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } +} diff --git a/bower_components/angular-bootstrap-calendar/robots.txt b/bower_components/angular-bootstrap-calendar/robots.txt new file mode 100644 index 0000000..9417495 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/robots.txt @@ -0,0 +1,3 @@ +# robotstxt.org + +User-agent: * diff --git a/bower_components/angular-bootstrap-calendar/src/app.js b/bower_components/angular-bootstrap-calendar/src/app.js new file mode 100644 index 0000000..2963151 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/src/app.js @@ -0,0 +1,14 @@ +'use strict'; + +/** + * @ngdoc overview + * @name angularBootstrapCalendarApp + * @description + * # angularBootstrapCalendarApp + * + * Main module of the application. + */ +angular + .module('mwl.calendar', [ + 'ui.bootstrap' + ]); diff --git a/bower_components/angular-bootstrap-calendar/src/css/calendar.css b/bower_components/angular-bootstrap-calendar/src/css/calendar.css new file mode 100644 index 0000000..8cc87b3 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/src/css/calendar.css @@ -0,0 +1,551 @@ +[class*="cal-cell"] { + float: left; + margin-left: 0; + min-height: 1px; +} +.cal-row-fluid { + width: 100%; + *zoom: 1; +} +.cal-row-fluid:before, +.cal-row-fluid:after { + display: table; + content: ""; + line-height: 0; +} +.cal-row-fluid:after { + clear: both; +} +.cal-row-fluid [class*="cal-cell"] { + display: block; + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 0%; + *margin-left: -0.05213764337851929%; +} +.cal-row-fluid [class*="cal-cell"]:first-child { + margin-left: 0; +} +.cal-row-fluid .controls-row [class*="cal-cell"] + [class*="cal-cell"] { + margin-left: 0%; +} +.cal-row-fluid .cal-cell7 { + width: 100%; + *width: 99.94669509594883%; +} +.cal-row-fluid .cal-cell6 { + width: 85.71428571428571%; + *width: 85.66098081023453%; +} +.cal-row-fluid .cal-cell5 { + width: 71.42857142857142%; + *width: 71.37526652452024%; +} +.cal-row-fluid .cal-cell4 { + width: 57.14285714285714%; + *width: 57.089552238805965%; +} +.cal-row-fluid .cal-cell3 { + width: 42.857142857142854%; + *width: 42.80383795309168%; +} +.cal-row-fluid .cal-cell2 { + width: 28.57142857142857%; + *width: 28.518123667377395%; +} +.cal-row-fluid .cal-cell1 { + width: 14.285714285714285%; + *width: 14.232409381663112%; +} +.cal-week-box .cal-offset7, +.cal-row-fluid .cal-offset7, +.cal-row-fluid .cal-offset7:first-child { + margin-left: 100%; + *margin-left: 99.89339019189765%; +} +.cal-week-box .cal-offset6, +.cal-row-fluid .cal-offset6, +.cal-row-fluid .cal-offset6:first-child { + margin-left: 85.71428571428571%; + *margin-left: 85.60767590618336%; +} +.cal-week-box .cal-offset5, +.cal-row-fluid .cal-offset5, +.cal-row-fluid .cal-offset5:first-child { + margin-left: 71.42857142857142%; + *margin-left: 71.32196162046907%; +} +.cal-week-box .cal-offset4, +.cal-row-fluid .cal-offset4, +.cal-row-fluid .cal-offset4:first-child { + margin-left: 57.14285714285714%; + *margin-left: 57.03624733475479%; +} +.cal-week-box .cal-offset3, +.cal-row-fluid .cal-offset3, +.cal-row-fluid .cal-offset3:first-child { + margin-left: 42.857142857142854%; + *margin-left: 42.750533049040506%; +} +.cal-week-box .cal-offset2, +.cal-row-fluid .cal-offset2, +.cal-row-fluid .cal-offset2:first-child { + margin-left: 28.57142857142857%; + *margin-left: 28.46481876332622%; +} +.cal-week-box .cal-offset1, +.cal-row-fluid .cal-offset1, +.cal-row-fluid .cal-offset1:first-child { + margin-left: 14.285714285714285%; + *margin-left: 14.17910447761194%; +} +.cal-row-fluid .cal-cell1 { + width: 14.285714285714285%; + *width: 14.233576642335766%; +} +[class*="cal-cell"].hide, +.cal-row-fluid [class*="cal-cell"].hide { + display: none; +} +[class*="cal-cell"].pull-right, +.cal-row-fluid [class*="cal-cell"].pull-right { + float: right; +} +.cal-row-head [class*="cal-cell"]:first-child, +.cal-row-head [class*="cal-cell"] { + min-height: auto; + overflow: hidden; + text-overflow: ellipsis; +} +.cal-events-num { + margin-top: 20px; +} +.cal-month-day { + position: relative; + display: block; + width: 100%; +} +.cal-month-day .cal-events-num { + margin-left: 10px; + margin-top: 18px; +} +#cal-week-box { + position: absolute; + width: 70px; + left: -71px; + top: -1px; + padding: 8px 5px; + cursor: pointer; +} +.cal-day-tick { + position: absolute; + right: 50%; + bottom: -21px; + padding: 0px 5px; + cursor: pointer; + z-index: 5; + text-align: center; + width: 26px; + margin-right: -17px; +} +.cal-year-box #cal-day-tick { + margin-right: -7px; +} +.cal-slide-box { + position: relative; +} +.cal-slide-tick { + position: absolute; + width: 16px; + margin-left: -7px; + height: 9px; + top: -1px; + z-index: 1; +} +.cal-slide-tick.tick-month1 { + left: 12.5%; +} +.cal-slide-tick.tick-month2 { + left: 37.5%; +} +.cal-slide-tick.tick-month3 { + left: 62.5%; +} +.cal-slide-tick.tick-month4 { + left: 87.5%; +} +.cal-slide-tick.tick-day1 { + left: 7.14285714285715%; +} +.cal-slide-tick.tick-day2 { + left: 21.42857142857143%; +} +.cal-slide-tick.tick-day3 { + left: 35.71428571428572%; +} +.cal-slide-tick.tick-day4 { + left: 50%; +} +.cal-slide-tick.tick-day5 { + left: 64.2857142857143%; +} +.cal-slide-tick.tick-day6 { + left: 78.57142857142859%; +} +.cal-slide-tick.tick-day7 { + left: 92.85714285714285%; +} +.events-list { + position: absolute; + bottom: 0; + left: 0; + overflow: hidden; +} +.cal-slide-content ul.unstyled { + margin-bottom: 0; +} +.cal-week-box { + position: relative; +} +.cal-week-box [data-event-class] { + white-space: nowrap; + height: 30px; + margin: 1px 1px; + line-height: 30px; + text-overflow: ellipsis; + overflow: hidden; + padding-left: 10px; +} +.cal-week-box .cal-column { + position: absolute; + height: 100%; + z-index: -1; +} +.cal-week-box .arrow-before, +.cal-week-box .arrow-after { + position: relative; +} +.cal-week-box .arrow-after:after { + content: ""; + position: absolute; + top: 0px; + width: 0; + height: 0; + right: 0; + border-top: 15px solid #ffffff; + border-left: 8px solid; + border-bottom: 15px solid #FFFFFF; +} +.cal-week-box .arrow-before:before { + content: ""; + position: absolute; + top: 0px; + width: 0; + height: 0; + left: 1px; + border-top: 15px solid transparent; + border-left: 8px solid #FFFFFF; + border-bottom: 15px solid transparent; +} +.cal-day-box { + text-wrap: none; +} +.cal-day-box .cal-day-hour-part { + height: 30px; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + border-bottom: thin dashed #e1e1e1; +} +.cal-day-box .cal-day-hour .day-highlight { + height: 30px; +} +.cal-day-box .cal-hours { + font-weight: bolder; +} +.cal-day-box .cal-day-hour:nth-child(odd) { + background-color: #fafafa; +} +.cal-day-box .cal-day-panel { + position: relative; + padding-left: 60px; +} +.cal-day-box .cal-day-panel-hour { + position: absolute; + width: 100%; + margin-left: -60px; +} +.cal-day-box .day-event { + position: absolute; + width: 150px; + overflow: hidden; +} +.cal-day-box .day-event a { + font-size: 12px; +} +.cal-day-box .day-highlight { + padding-top: 2px; + padding-left: 8px; + padding-right: 8px; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + border: 1px solid #c3c3c3; + margin: 1px 1px; + overflow: hidden; + text-overflow: ellipsis; +} +.cal-day-box .day-highlight.dh-event-important { + border: 1px solid #ad2121; +} +.cal-day-box .day-highlight.dh-event-warning { + border: 1px solid #e3bc08; +} +.cal-day-box .day-highlight.dh-event-info { + border: 1px solid #1e90ff; +} +.cal-day-box .day-highlight.dh-event-inverse { + border: 1px solid #1b1b1b; +} +.cal-day-box .day-highlight.dh-event-success { + border: 1px solid #006400; +} +.cal-day-box .day-highlight.dh-event-special { + background-color: #ffe6ff; + border: 1px solid #800080; +} +.event { + display: block; + background-color: #c3c3c3; + width: 12px; + height: 12px; + margin-right: 2px; + margin-bottom: 2px; + -webkit-box-shadow: inset 0px 0px 5px 0px rgba(0, 0, 0, 0.4); + box-shadow: inset 0px 0px 5px 0px rgba(0, 0, 0, 0.4); + border-radius: 8px; + border: 1px solid #ffffff; +} +.event-block { + display: block; + background-color: #c3c3c3; + width: 20px; + height: 100%; +} +.cal-event-list .event.pull-left { + margin-top: 3px; +} +.event-important { + background-color: #ad2121; +} +.event-info { + background-color: #1e90ff; +} +.event-warning { + background-color: #e3bc08; +} +.event-inverse { + background-color: #1b1b1b; +} +.event-success { + background-color: #006400; +} +.event-special { + background-color: #800080; +} +.day-highlight:hover, +.day-highlight { + background-color: #dddddd; +} +.day-highlight.dh-event-important:hover, +.day-highlight.dh-event-important { + background-color: #fae3e3; +} +.day-highlight.dh-event-warning:hover, +.day-highlight.dh-event-warning { + background-color: #fdf1ba; +} +.day-highlight.dh-event-info:hover, +.day-highlight.dh-event-info { + background-color: #d1e8ff; +} +.day-highlight.dh-event-inverse:hover, +.day-highlight.dh-event-inverse { + background-color: #c1c1c1; +} +.day-highlight.dh-event-success:hover, +.day-highlight.dh-event-success { + background-color: #caffca; +} +.day-highlight.dh-event-special:hover, +.day-highlight.dh-event-special { + background-color: #ffe6ff; +} +.cal-row-head [class*="cal-cell"]:first-child, +.cal-row-head [class*="cal-cell"] { + font-weight: bolder; + text-align: center; + border: 0px solid; + padding: 5px 0; +} +.cal-row-head [class*="cal-cell"] small { + font-weight: normal; +} +.cal-year-box .row:hover, +.cal-row-fluid:hover { + background-color: #fafafa; +} +.cal-month-day { + height: 100px; +} +[class*="cal-cell"]:hover, .cell-focus { + background-color: #ededed; +} +.cal-year-box [class*="span"], +.cal-month-box [class*="cal-cell"] { + min-height: 100px; + border-right: 1px solid #e1e1e1; + position: relative; +} +.cal-year-box [class*="span"] { + min-height: 60px; +} +.cal-year-box .row [class*="col-"]:last-child, +.cal-month-box .cal-row [class*="cal-cell"]:last-child { + border-right: 0px; +} +.cal-year-box .row, +.cal-month-box .cal-row-fluid { + border-bottom: 1px solid #e1e1e1; + margin-left: 0px; + margin-right: 0px; +} +.cal-year-box .row:last-child, +.cal-month-box .cal-row-fluid:last-child { + border-bottom: 0px; +} +.cal-month-box, +.cal-year-box, +.cal-week-box { + border-top: 1px solid #e1e1e1; + border-bottom: 1px solid #e1e1e1; + border-right: 1px solid #e1e1e1; + border-left: 1px solid #e1e1e1; + border-radius: 2px; +} +.cal-month-box { + border-right: 0px; + border-bottom: 0px; +} +span[data-cal-date] { + font-size: 1.2em; + font-weight: normal; + opacity: 0.5; + transition: all 0.3s ease-in-out; + -webkit-transition: all 0.1s ease-in-out; + -moz-transition: all 0.1s ease-in-out; + -ms-transition: all 0.1s ease-in-out; + -o-transition: all 0.1s ease-in-out; + margin-top: 15px; + margin-right: 15px; +} +span[data-cal-date]:hover { + opacity: 1; +} +.cal-day-outmonth span[data-cal-date] { + opacity: 0.1; + cursor: default; +} +.cal-day-today { + background-color: #e8fde7; +} +.cal-day-today span[data-cal-date] { + color: darkgreen; +} +.cal-month-box .cal-day-today span[data-cal-date] { + font-size: 1.9em; +} +.cal-day-holiday span[data-cal-date] { + color: #800080; +} +.cal-day-weekend span[data-cal-date] { + color: darkred; +} +#cal-week-box { + border: 1px solid #e1e1e1; + border-right: 0px; + border-radius: 5px 0 0 5px; + background-color: #fafafa; + text-align: right; +} +.cal-week-box .cal-row-head { + border-bottom: 1px solid #e1e1e1; +} +.cal-day-tick { + border: 1px solid #e1e1e1; + border-top: 0px solid; + border-radius: 0 0 5px 5px; + background-color: #ededed; + text-align: center; +} +.cal-day-tick .fa { + display: none; +} +.cal-slide-box { + border-top: 0px solid #8c8c8c; +} +.cal-slide-content { + padding: 20px; + color: #ffffff; + background-color: #555555; + -webkit-box-shadow: inset 0px 0px 15px 0px rgba(0, 0, 0, 0.5); + box-shadow: inset 0px 0px 15px 0px rgba(0, 0, 0, 0.5); +} +.cal-slide-content a.event-item { + color: #ffffff; + font-weight: normal; +} +a.event-item-edit, a.event-item-delete { + padding-left: 5px; +} +.cal-year-box .cal-slide-content a.event-item, .cal-year-box a.event-item-edit, .cal-year-box a.event-item-delete { + position: relative; + top: -3px; +} +.events-list { + max-height: 47px; + padding-left: 5px; +} +.cal-column { + border-left: 1px solid #e1e1e1; +} +a.cal-event-week { + text-decoration: none; + color: #151515; +} +.badge-important { + background-color: #b94a48; +} + +.pointer { + cursor:pointer; +} + +.cal-year-box:last-child { + border-bottom: 0px; +} + +@media (max-width: 991px) { + + .cal-year-box [class*="span"]:nth-child(2) { + border-right: 0px; + } + + .cal-year-box [class*="span"]:nth-child(1), .cal-year-box [class*="span"]:nth-child(2) { + border-bottom: 1px solid #e1e1e1; + } + +} diff --git a/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendar.js b/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendar.js new file mode 100644 index 0000000..902ede5 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendar.js @@ -0,0 +1,85 @@ +'use strict'; + +/** + * @ngdoc directive + * @name angularBootstrapCalendarApp.directive:mwlCalendar + * @description + * # mwlCalendar + */ +angular.module('mwl.calendar') + .directive('mwlCalendar', function () { + return { + templateUrl: 'templates/main.html', + restrict: 'EA', + scope: { + events: '=calendarEvents', + view: '=calendarView', + currentDay: '=calendarCurrentDay', + control: '=calendarControl', + eventClick: '&calendarEventClick', + eventEditClick: '&calendarEditEventClick', + eventDeleteClick: '&calendarDeleteEventClick', + editEventHtml: '=calendarEditEventHtml', + deleteEventHtml: '=calendarDeleteEventHtml', + autoOpen: '=calendarAutoOpen', + useIsoWeek: '=calendarUseIsoWeek', + eventLabel: '@calendarEventLabel', + timeLabel: '@calendarTimeLabel', + dayViewStart:'@calendarDayViewStart', + dayViewEnd:'@calendarDayViewEnd', + weekTitleLabel: '@calendarWeekTitleLabel', + timespanClick: '&calendarTimespanClick' + }, + controller: function($scope, $timeout, $locale, moment) { + + var self = this; + + this.titleFunctions = {}; + + this.changeView = function(view, newDay) { + $scope.view = view; + $scope.currentDay = newDay; + }; + + $scope.control = $scope.control || {}; + + $scope.control.prev = function() { + $scope.currentDay = moment($scope.currentDay).subtract(1, $scope.view).toDate(); + }; + + $scope.control.next = function() { + $scope.currentDay = moment($scope.currentDay).add(1, $scope.view).toDate(); + }; + + $scope.control.getTitle = function() { + if (!self.titleFunctions[$scope.view]) { + return ''; + } + return self.titleFunctions[$scope.view]($scope.currentDay); + }; + + //Auto update the calendar when the locale changes + var firstRunWatcher = true; + var unbindWatcher = $scope.$watch(function() { + return moment.locale() + $locale.id; + }, function() { + if (firstRunWatcher) { //dont run the first time the calendar is initialised + firstRunWatcher = false; + return; + } + var originalView = angular.copy($scope.view); + $scope.view = 'redraw'; + $timeout(function() { //bit of a hacky way to redraw the calendar, should be refactored at some point + $scope.view = originalView; + }); + }); + + //Remove the watcher when the calendar is destroyed + var unbindDestroyListener = $scope.$on('$destroy', function() { + unbindDestroyListener(); + unbindWatcher(); + }); + + } + }; + }); diff --git a/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendarday.js b/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendarday.js new file mode 100644 index 0000000..7ebfa4a --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendarday.js @@ -0,0 +1,51 @@ +'use strict'; + +/** + * @ngdoc directive + * @name angularBootstrapCalendarApp.directive:mwlCalendarDay + * @description + * # mwlCalendarDay + */ +angular.module('mwl.calendar') + .directive('mwlCalendarDay', function($filter, moment, calendarHelper) { + return { + templateUrl: 'templates/day.html', + restrict: 'EA', + require: '^mwlCalendar', + scope: { + events: '=calendarEvents', + currentDay: '=calendarCurrentDay', + eventClick: '=calendarEventClick', + eventLabel: '@calendarEventLabel', + timeLabel: '@calendarTimeLabel', + dayViewStart:'@calendarDayViewStart', + dayViewEnd:'@calendarDayViewEnd' + }, + link: function postLink(scope, element, attrs, calendarCtrl) { + + var dayViewStart = moment(scope.dayViewStart || '00:00', 'HH:mm'); + var dayViewEnd = moment(scope.dayViewEnd || '23:00', 'HH:mm'); + + scope.days = []; + var dayCounter = moment(dayViewStart); + for (var i = 0; i <= dayViewEnd.diff(dayViewStart, 'hours'); i++) { + scope.days.push({ + label: dayCounter.format('ha') + }); + dayCounter.add(1, 'hour'); + } + + calendarCtrl.titleFunctions.day = function(currentDay) { + return $filter('date')(currentDay, 'EEEE d MMMM, yyyy'); + }; + + function updateView() { + scope.view = calendarHelper.getDayView(scope.events, scope.currentDay, dayViewStart.hours(), dayViewEnd.hours()); + } + + scope.$watch('currentDay', updateView); + scope.$watch('events', updateView, true); + + } + }; + }); diff --git a/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendarmonth.js b/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendarmonth.js new file mode 100644 index 0000000..5714c20 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendarmonth.js @@ -0,0 +1,108 @@ +'use strict'; + +/** + * @ngdoc directive + * @name angularBootstrapCalendarApp.directive:mwlCalendarMonth + * @description + * # mwlCalendarMonth + */ +angular.module('mwl.calendar') + .directive('mwlCalendarMonth', function ($sce, $timeout, $filter, moment, calendarHelper) { + return { + templateUrl: 'templates/month.html', + restrict: 'EA', + require: '^mwlCalendar', + scope: { + events: '=calendarEvents', + currentDay: '=calendarCurrentDay', + eventClick: '=calendarEventClick', + eventEditClick: '=calendarEditEventClick', + eventDeleteClick: '=calendarDeleteEventClick', + editEventHtml: '=calendarEditEventHtml', + deleteEventHtml: '=calendarDeleteEventHtml', + autoOpen: '=calendarAutoOpen', + useIsoWeek: '=calendarUseIsoWeek', + timespanClick: '=calendarTimespanClick' + }, + link: function postLink(scope, element, attrs, calendarCtrl) { + + var firstRun = false; + + scope.$sce = $sce; + + calendarCtrl.titleFunctions.month = function(currentDay) { + return $filter('date')(currentDay, 'MMMM yyyy'); + }; + + function updateView() { + scope.view = calendarHelper.getMonthView(scope.events, scope.currentDay, scope.useIsoWeek); + + //Auto open the calendar to the current day if set + if (scope.autoOpen && !firstRun) { + scope.view.forEach(function(week, rowIndex) { + week.forEach(function(day, cellIndex) { + if (day.inMonth && moment(scope.currentDay).startOf('day').isSame(day.date.startOf('day'))) { + scope.dayClicked(rowIndex, cellIndex, true); + $timeout(function() { + firstRun = false; + }); + } + }); + }); + } + + } + + scope.$watch('currentDay', updateView); + scope.$watch('events', updateView, true); + + scope.weekDays = calendarHelper.getWeekDayNames(false, scope.useIsoWeek); + + scope.dayClicked = function(rowIndex, cellIndex, firstRun) { + + if (!firstRun) { + scope.timespanClick({$date: scope.view[rowIndex][cellIndex].date.startOf('day').toDate()}); + } + + var handler = calendarHelper.toggleEventBreakdown(scope.view, rowIndex, cellIndex); + scope.view = handler.view; + scope.openEvents = handler.openEvents; + + }; + + scope.drillDown = function(day) { + calendarCtrl.changeView('day', moment(scope.currentDay).clone().date(day).toDate()); + }; + + scope.highlightEvent = function(event, shouldAddClass) { + + scope.view = scope.view.map(function(week) { + + week.isOpened = false; + + return week.map(function(day) { + + delete day.highlightClass; + day.isOpened = false; + + if (shouldAddClass) { + var dayContainsEvent = day.events.filter(function(e) { + return e.$id == event.$id; + }).length > 0; + + if (dayContainsEvent) { + day.highlightClass = 'day-highlight dh-event-' + event.type; + } + } + + return day; + + }); + + }); + + }; + + } + }; + }); diff --git a/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendarweek.js b/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendarweek.js new file mode 100644 index 0000000..7b30b59 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendarweek.js @@ -0,0 +1,43 @@ +'use strict'; + +/** + * @ngdoc directive + * @name angularBootstrapCalendarApp.directive:mwlCalendarWeek + * @description + * # mwlCalendarWeek + */ +angular.module('mwl.calendar') + .directive('mwlCalendarWeek', function(moment, calendarHelper) { + return { + templateUrl: 'templates/week.html', + restrict: 'EA', + require: '^mwlCalendar', + scope: { + events: '=calendarEvents', + currentDay: '=calendarCurrentDay', + eventClick: '=calendarEventClick', + useIsoWeek: '=calendarUseIsoWeek', + weekTitleLabel: '@calendarWeekTitleLabel' + }, + link: function postLink(scope, element, attrs, calendarCtrl) { + + var titleLabel = scope.weekTitleLabel || 'Week {week} of {year}'; + + calendarCtrl.titleFunctions.week = function(currentDay) { + return titleLabel.replace('{week}', moment(currentDay).week()).replace('{year}', moment(currentDay).format('YYYY')); + }; + + function updateView() { + scope.view = calendarHelper.getWeekView(scope.events, scope.currentDay, scope.useIsoWeek); + } + + scope.drillDown = function(day) { + calendarCtrl.changeView('day', moment(scope.currentDay).clone().date(day).toDate()); + }; + + scope.$watch('currentDay', updateView); + scope.$watch('events', updateView, true); + + } + }; + }); diff --git a/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendaryear.js b/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendaryear.js new file mode 100644 index 0000000..cf253ba --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/src/directives/mwlcalendaryear.js @@ -0,0 +1,75 @@ +'use strict'; + +/** + * @ngdoc directive + * @name angularBootstrapCalendarApp.directive:mwlCalendarYear + * @description + * # mwlCalendarYear + */ +angular.module('mwl.calendar') + .directive('mwlCalendarYear', function($sce, $timeout, calendarHelper, moment) { + return { + templateUrl: 'templates/year.html', + restrict: 'EA', + require: '^mwlCalendar', + scope: { + events: '=calendarEvents', + currentDay: '=calendarCurrentDay', + eventClick: '=calendarEventClick', + eventEditClick: '=calendarEditEventClick', + eventDeleteClick: '=calendarDeleteEventClick', + editEventHtml: '=calendarEditEventHtml', + deleteEventHtml: '=calendarDeleteEventHtml', + autoOpen: '=calendarAutoOpen', + timespanClick: '=calendarTimespanClick' + }, + link: function postLink(scope, element, attrs, calendarCtrl) { + + var firstRun = false; + + scope.$sce = $sce; + + calendarCtrl.titleFunctions.year = function(currentDay) { + return moment(currentDay).format('YYYY'); + }; + + function updateView() { + scope.view = calendarHelper.getYearView(scope.events, scope.currentDay); + + //Auto open the calendar to the current day if set + if (scope.autoOpen && !firstRun) { + scope.view.forEach(function(row, rowIndex) { + row.forEach(function(year, cellIndex) { + if (year.label == moment(scope.currentDay).format('MMMM')) { + scope.monthClicked(rowIndex, cellIndex, true); + $timeout(function() { + firstRun = false; + }); + } + }); + }); + } + } + + scope.$watch('currentDay', updateView); + scope.$watch('events', updateView, true); + + scope.monthClicked = function(yearIndex, monthIndex, firstRun) { + + if (!firstRun) { + scope.timespanClick({$date: scope.view[yearIndex][monthIndex].date.startOf('month').toDate()}); + } + + var handler = calendarHelper.toggleEventBreakdown(scope.view, yearIndex, monthIndex); + scope.view = handler.view; + scope.openEvents = handler.openEvents; + + }; + + scope.drillDown = function(month) { + calendarCtrl.changeView('month', moment(scope.currentDay).clone().month(month).toDate()); + }; + + } + }; + }); diff --git a/bower_components/angular-bootstrap-calendar/src/filters/truncateEventTitle.js b/bower_components/angular-bootstrap-calendar/src/filters/truncateEventTitle.js new file mode 100644 index 0000000..3db0851 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/src/filters/truncateEventTitle.js @@ -0,0 +1,18 @@ +'use strict'; + + +angular.module('mwl.calendar') + .filter('truncateEventTitle', function() { + + return function(string, length, boxHeight) { + if (!string) return ''; + + //Only truncate if if actually needs truncating + if (string.length >= length && string.length / 20 > boxHeight / 30) { + return string.substr(0, length) + '...'; + } else { + return string; + } + }; + + }); diff --git a/bower_components/angular-bootstrap-calendar/src/services/calendarhelper.js b/bower_components/angular-bootstrap-calendar/src/services/calendarhelper.js new file mode 100644 index 0000000..4565b46 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/src/services/calendarhelper.js @@ -0,0 +1,350 @@ +'use strict'; + +/** + * @ngdoc service + * @name angularBootstrapCalendarApp.calendarHelper + * @description + * # calendarHelper + * Service in the angularBootstrapCalendarApp. + */ +angular.module('mwl.calendar') + .service('calendarHelper', function calendarHelper($filter, moment) { + + var self = this; + + function isISOWeekBasedOnLocale() { + return moment().startOf('week').day() === 1; + } + + function isISOWeek(userValue) { + //If a manual override has been set in the directive, use that + if (angular.isDefined(userValue)) return userValue; + //Otherwise fallback to the locale + return isISOWeekBasedOnLocale(); + } + + this.getMonthNames = function(short) { + + var format = short ? 'MMM' : 'MMMM'; + + var months = []; + for (var i = 0; i <= 11; i++) { + months.push($filter('date')(new Date(2014, i), format)); + } + + return months; + + }; + + this.getWeekDayNames = function(short, useISOWeek) { + + var format = short ? 'EEE' : 'EEEE'; + + var weekdays = []; + var startDay = isISOWeek(useISOWeek) ? 22 : 21; + for (var i = 0; i <= 6; i++) { + weekdays.push($filter('date')(new Date(2014, 8, startDay + i), format)); + } + + return weekdays; + + }; + + this.eventIsInPeriod = function(eventStart, eventEnd, periodStart, periodEnd) { + + return ( + moment(eventStart).isAfter(moment(periodStart)) && + moment(eventStart).isBefore(moment(periodEnd)) + ) || ( + moment(eventEnd).isAfter(moment(periodStart)) && + moment(eventEnd).isBefore(moment(periodEnd)) + ) || ( + moment(eventStart).isBefore(moment(periodStart)) && + moment(eventEnd).isAfter(moment(periodEnd)) + ) || ( + moment(eventStart).isSame(moment(periodStart)) + ) || ( + moment(eventEnd).isSame(moment(periodEnd)) + ); + + }; + + this.getYearView = function(events, currentDay) { + + var grid = []; + var months = self.getMonthNames(); + + for (var i = 0; i < 3; i++) { + var row = []; + for (var j = 0; j < 4; j++) { + var monthIndex = 12 - months.length; + var startPeriod = new Date(moment(currentDay).format('YYYY'), monthIndex, 1); + var endPeriod = moment(startPeriod).add(1, 'month').subtract(1, 'second').toDate(); + + row.push({ + label: months.shift(), + monthIndex: monthIndex, + isToday: moment(startPeriod).startOf('month').isSame(moment().startOf('month')), + events: events.filter(function(event) { + return self.eventIsInPeriod(event.starts_at, event.ends_at, startPeriod, endPeriod); + }), + date: moment(startPeriod).startOf('month') + }); + } + grid.push(row); + } + + return grid; + + }; + + this.getMonthView = function(events, currentDay, useISOWeek) { + + var dateOffset = isISOWeek(useISOWeek) ? 1 : 0; + + function getWeekDayIndex() { + var day = startOfMonth.day() - dateOffset; + if (day < 0) day = 6; + return day; + } + + var startOfMonth = moment(currentDay).startOf('month'); + var numberOfDaysInMonth = moment(currentDay).endOf('month').date(); + + var grid = []; + var buildRow = new Array(7); + var eventsWithIds = events.map(function(event, index) { + event.$id = index; + return event; + }); + + for (var i = 1; i <= numberOfDaysInMonth; i++) { + + if (i == 1) { + var weekdayIndex = getWeekDayIndex(startOfMonth); + var prefillMonth = startOfMonth.clone(); + while (weekdayIndex > 0) { + weekdayIndex--; + prefillMonth = prefillMonth.subtract(1, 'day'); + buildRow[weekdayIndex] = { + label: prefillMonth.date(), + date: prefillMonth.clone(), + inMonth: false, + events: [] + }; + } + } + + buildRow[getWeekDayIndex(startOfMonth)] = { + label: startOfMonth.date(), + inMonth: true, + isToday: moment().startOf('day').isSame(startOfMonth), + date: startOfMonth.clone(), + events: eventsWithIds.filter(function(event) { + return self.eventIsInPeriod(event.starts_at, event.ends_at, startOfMonth.clone().startOf('day'), startOfMonth.clone().endOf('day')); + }) + }; + + if (i == numberOfDaysInMonth) { + var weekdayIndex = getWeekDayIndex(startOfMonth); + var postfillMonth = startOfMonth.clone(); + while (weekdayIndex < 6) { + weekdayIndex++; + postfillMonth = postfillMonth.add(1, 'day'); + buildRow[weekdayIndex] = { + label: postfillMonth.date(), + date: postfillMonth.clone(), + inMonth: false, + events: [] + }; + } + } + + if (getWeekDayIndex(startOfMonth) === 6 || i == numberOfDaysInMonth) { + grid.push(buildRow); + buildRow = new Array(7); + } + + startOfMonth = startOfMonth.add(1, 'day'); + + } + + return grid; + + }; + + this.getWeekView = function(events, currentDay, useISOWeek) { + + var dateOffset = isISOWeek(useISOWeek) ? 1 : 0; + var columns = new Array(7); + var weekDays = self.getWeekDayNames(false, useISOWeek); + var currentWeekDayIndex = currentDay.getDay(); + var beginningOfWeek, endOfWeek; + + for (var i = currentWeekDayIndex; i >= 0; i--) { + var date = moment(currentDay).subtract(currentWeekDayIndex - i, 'days').add(dateOffset, 'day').toDate(); + columns[i] = { + weekDay: weekDays[i], + day: $filter('date')(date, 'd'), + date: $filter('date')(date, 'd MMM'), + isToday: moment(date).startOf('day').isSame(moment().startOf('day')) + }; + if (i == 0) { + beginningOfWeek = date; + } else if (i == 6) { + endOfWeek = date; + } + } + + for (var i = currentWeekDayIndex + 1; i < 7; i++) { + var date = moment(currentDay).add(i - currentWeekDayIndex, 'days').add(dateOffset, 'day').toDate(); + columns[i] = { + weekDay: weekDays[i], + day: $filter('date')(date, 'd'), + date: $filter('date')(date, 'd MMM'), + isToday: moment(date).startOf('day').isSame(moment().startOf('day')) + }; + if (i == 0) { + beginningOfWeek = date; + } else if (i == 6) { + endOfWeek = date; + } + } + + endOfWeek = moment(endOfWeek).endOf('day').toDate(); + beginningOfWeek = moment(beginningOfWeek).startOf('day').toDate(); + + var eventsSorted = events.filter(function(event) { + return self.eventIsInPeriod(event.starts_at, event.ends_at, beginningOfWeek, endOfWeek); + }).map(function(event) { + + var eventStart = moment(event.starts_at).startOf('day'); + var eventEnd = moment(event.ends_at).startOf('day'); + var weekViewStart = moment(beginningOfWeek).startOf('day'); + var weekViewEnd = moment(endOfWeek).startOf('day'); + + var offset, span; + + if (eventStart.isBefore(weekViewStart) || eventStart.isSame(weekViewStart)) { + offset = 0; + } else { + offset = eventStart.diff(weekViewStart, 'days'); + } + + if (eventEnd.isAfter(weekViewEnd)) { + eventEnd = weekViewEnd; + } + + if (eventStart.isBefore(weekViewStart)) { + eventStart = weekViewStart; + } + + span = moment(eventEnd).diff(eventStart, 'days') + 1; + + event.daySpan = span; + event.dayOffset = offset; + return event; + }); + + return {columns: columns, events: eventsSorted}; + + }; + + this.getDayView = function(events, currentDay, dayStartHour, dayEndHour) { + + var calendarStart = moment(currentDay).startOf('day').add(dayStartHour, 'hours'); + var calendarEnd = moment(currentDay).startOf('day').add(dayEndHour, 'hours'); + var calendarHeight = (dayEndHour - dayStartHour + 1) * 60; + var buckets = []; + + return events.filter(function(event) { + return self.eventIsInPeriod(event.starts_at, event.ends_at, moment(currentDay).startOf('day').toDate(), moment(currentDay).endOf('day').toDate()); + }).map(function(event) { + if (moment(event.starts_at).isBefore(calendarStart)) { + event.top = 0; + } else { + event.top = moment(event.starts_at).startOf('minute').diff(calendarStart.startOf('minute'), 'minutes') - 2; + } + + if (moment(event.ends_at).isAfter(calendarEnd)) { + event.height = calendarHeight - event.top; + } else { + var diffStart = event.starts_at; + if (moment(event.starts_at).isBefore(calendarStart)) { + diffStart = calendarStart.toDate(); + } + event.height = moment(event.ends_at).diff(diffStart, 'minutes'); + } + + if (event.top - event.height > calendarHeight) { + event.height = 0; + } + + event.left = 0; + + return event; + }).filter(function(event) { + return event.height > 0; + }).map(function(event) { + + var cannotFitInABucket = true; + buckets.forEach(function(bucket, bucketIndex) { + var canFitInThisBucket = true; + + bucket.forEach(function(bucketItem) { + if (self.eventIsInPeriod(event.starts_at, event.ends_at, bucketItem.starts_at, bucketItem.ends_at) || self.eventIsInPeriod(bucketItem.starts_at, bucketItem.ends_at, event.starts_at, event.ends_at)) { + canFitInThisBucket = false; + } + }); + + if (canFitInThisBucket && cannotFitInABucket) { + cannotFitInABucket = false; + event.left = bucketIndex * 150; + buckets[bucketIndex].push(event); + } + + }); + + if (cannotFitInABucket) { + event.left = buckets.length * 150; + buckets.push([event]); + } + + return event; + + }); + + }; + + this.toggleEventBreakdown = function(view, rowIndex, cellIndex) { + + var openEvents = []; + + function closeAllOpenItems() { + view = view.map(function(row) { + row.isOpened = false; + return row.map(function(cell) { + cell.isOpened = false; + return cell; + }); + }); + } + + if (view[rowIndex][cellIndex].events.length > 0) { + + var isCellOpened = view[rowIndex][cellIndex].isOpened; + + closeAllOpenItems(); + + view[rowIndex][cellIndex].isOpened = !isCellOpened; + view[rowIndex].isOpened = !isCellOpened; + openEvents = view[rowIndex][cellIndex].events; + } else { + closeAllOpenItems(); + } + + return {view: view, openEvents: openEvents}; + + }; + + }); diff --git a/bower_components/angular-bootstrap-calendar/src/services/moment.js b/bower_components/angular-bootstrap-calendar/src/services/moment.js new file mode 100644 index 0000000..1671f42 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/src/services/moment.js @@ -0,0 +1,11 @@ +'use strict'; + +/** + * @ngdoc service + * @name angularBootstrapCalendarApp.moment + * @description + * # moment + * Constant in the angularBootstrapCalendarApp. + */ +angular.module('mwl.calendar') + .constant('moment', window.moment); diff --git a/bower_components/angular-bootstrap-calendar/templates/day.html b/bower_components/angular-bootstrap-calendar/templates/day.html new file mode 100644 index 0000000..f81d2cb --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/templates/day.html @@ -0,0 +1,42 @@ +
    +
    +
    {{ timeLabel || 'Time' }}
    +
    {{ eventLabel || 'Events' }}
    +
    + + +
    +
    + +
    + +
    +
    {{ day.label }}
    +
    +
    + +
    +
    +
    +
    + +
    + +
    + + +
    + + + + {{ event.title | truncateEventTitle:20:event.height }} + + +
    + +
    + +
    diff --git a/bower_components/angular-bootstrap-calendar/templates/main.html b/bower_components/angular-bootstrap-calendar/templates/main.html new file mode 100644 index 0000000..36b9874 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/templates/main.html @@ -0,0 +1,51 @@ +
    + +
    The value passed to calendar-view is not set
    + + + + + + + + +
    diff --git a/bower_components/angular-bootstrap-calendar/templates/month.html b/bower_components/angular-bootstrap-calendar/templates/month.html new file mode 100644 index 0000000..cb6f81d --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/templates/month.html @@ -0,0 +1,75 @@ +
    + +
    {{ day }}
    + +
    +
    + +
    +
    +
    +
    + {{ day.events.length }} + {{ day.label }} +
    + + +
    +
    + +
    + +
    +
    +
    + +
    +
    +
      + +
    • + +   + + {{ event.title }} + + + + + + + +
    • + +
    +
    +
    +
    + +
    diff --git a/bower_components/angular-bootstrap-calendar/templates/week.html b/bower_components/angular-bootstrap-calendar/templates/week.html new file mode 100644 index 0000000..357d002 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/templates/week.html @@ -0,0 +1,22 @@ +
    +
    + +
    {{ column.weekDay }}
    + + {{ column.date }} + +
    + + +
    + +
    +
    + + {{ event.title }} + +
    +
    + + +
    diff --git a/bower_components/angular-bootstrap-calendar/templates/year.html b/bower_components/angular-bootstrap-calendar/templates/year.html new file mode 100644 index 0000000..f4e7979 --- /dev/null +++ b/bower_components/angular-bootstrap-calendar/templates/year.html @@ -0,0 +1,53 @@ +
    +
    +
    +
    + {{ month.label }} + + {{ month.events.length }} + +
    + + +
    + +
    +
    +
    + +
    +
      + +
    • + +   + + {{ event.title }} + + + + + + + +
    • + +
    +
    +
    +
    + +
    diff --git a/bower_components/angular-bootstrap-nav-tree/.bower.json b/bower_components/angular-bootstrap-nav-tree/.bower.json new file mode 100644 index 0000000..b6bc349 --- /dev/null +++ b/bower_components/angular-bootstrap-nav-tree/.bower.json @@ -0,0 +1,47 @@ +{ + "name": "angular-bootstrap-nav-tree", + "description": "A Tree Control for AngularJS, using CSS animation and Bootstrap style", + "main": [ + "dist/abn_tree_directive.js", + "dist/abn_tree.css" + ], + "licence": "MIT", + "keywords": [ + "angularjs", + "bootstrap", + "tree", + "widget" + ], + "authors": [ + "Nick Perkins" + ], + "homepage": "https://github.com/nickperkinslondon/angular-bootstrap-nav-tree", + "repository": { + "type": "git", + "url": "git://github.com/nickperkinslondon/angular-bootstrap-nav-tree" + }, + "ignore": [ + "src", + "temp", + "test", + ".gitignore", + "Gruntfile.coffee", + "Gruntfile.js", + "bower.json", + "package.json", + "README.md" + ], + "dependencies": { + "angular": ">=1.0", + "bootstrap": ">=2.3" + }, + "_release": "7fb14dd72d", + "_resolution": { + "type": "branch", + "branch": "master", + "commit": "7fb14dd72da5ec7f18266de40806486c14826e8d" + }, + "_source": "git://github.com/nickperkinslondon/angular-bootstrap-nav-tree.git", + "_target": "*", + "_originalSource": "angular-bootstrap-nav-tree" +} \ No newline at end of file diff --git a/bower_components/angular-bootstrap-nav-tree/LICENSE b/bower_components/angular-bootstrap-nav-tree/LICENSE new file mode 100644 index 0000000..46aee02 --- /dev/null +++ b/bower_components/angular-bootstrap-nav-tree/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Nick Perkins + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/bower_components/angular-bootstrap-nav-tree/bower.json b/bower_components/angular-bootstrap-nav-tree/bower.json new file mode 100644 index 0000000..5b4f9e2 --- /dev/null +++ b/bower_components/angular-bootstrap-nav-tree/bower.json @@ -0,0 +1,29 @@ +{ + "name": "angular-bootstrap-nav-tree", + "version": "0.2.0", + "description":"A Tree Control for AngularJS, using CSS animation and Bootstrap style", + "main":["dist/abn_tree_directive.js","dist/abn_tree.css"], + "licence":"MIT", + "keywords":["angularjs","bootstrap","tree","widget"], + "authors":["Nick Perkins"], + "homepage" :"https://github.com/nickperkinslondon/angular-bootstrap-nav-tree", + "repository":{ + "type":"git", + "url":"git://github.com/nickperkinslondon/angular-bootstrap-nav-tree" + }, + "ignore": [ + "src", + "temp", + "test", + ".gitignore", + "Gruntfile.coffee", + "Gruntfile.js", + "bower.json", + "package.json", + "README.md" + ], + "dependencies": { + "angular": ">=1.0", + "bootstrap": ">=2.3" + } +} diff --git a/bower_components/angular-bootstrap-nav-tree/dist/abn_tree.css b/bower_components/angular-bootstrap-nav-tree/dist/abn_tree.css new file mode 100644 index 0000000..48864e9 --- /dev/null +++ b/bower_components/angular-bootstrap-nav-tree/dist/abn_tree.css @@ -0,0 +1,121 @@ +/* + abn-tree.css + + style for the angular-bootstrap-nav-tree + for both Bootstrap 2 and Bootstrap 3 + +*/ + + + +/* ------------------------------------------ +AngularJS Animations... + +The first selector is for Angular 1.1.5 +The second selector is for Angular 1.2.0 + +*/ +.abn-tree-animate-enter, +li.abn-tree-row.ng-enter { + transition: 200ms linear all; + position: relative; + display: block; + opacity: 0; + max-height:0px; +} +.abn-tree-animate-enter.abn-tree-animate-enter-active, +li.abn-tree-row.ng-enter-active{ + opacity: 1; + max-height:30px; +} + +.abn-tree-animate-leave, +li.abn-tree-row.ng-leave { + transition: 200ms linear all; + position: relative; + display: block; + height:30px; + max-height: 30px; + opacity: 1; +} +.abn-tree-animate-leave.abn-tree-animate-leave-active, +li.abn-tree-row.ng-leave-active { + height: 0px; + max-height:0px; + opacity: 0; +} + + +/* +------------------------------------------ +Angular 1.2.0 Animation +*/ + + +.abn-tree-animate.ng-enter{ + +} +.abn-tree-animate.ng-enter{ + +} + + + + +/* + end animation stuff +----------------------------------------- + begin normal css stuff +*/ +ul.abn-tree li.abn-tree-row { + padding: 0px; + margin:0px; +} + +ul.abn-tree li.abn-tree-row a { + padding: 3px 10px; +} + +ul.abn-tree i.indented { + padding: 2px; +} + +.abn-tree { + cursor: pointer; +} +ul.nav.abn-tree .level-1 .indented { + position: relative; + left: 0px; +} +ul.nav.abn-tree .level-2 .indented { + position: relative; + left: 20px; +} +ul.nav.abn-tree .level-3 .indented { + position: relative; + left: 40px; +} +ul.nav.abn-tree .level-4 .indented { + position: relative; + left: 60px; +} +ul.nav.abn-tree .level-5 .indented { + position: relative; + left: 80px; +} +ul.nav.abn-tree .level-6 .indented { + position: relative; + left: 100px; +} +ul.nav.nav-list.abn-tree .level-7 .indented { + position: relative; + left: 120px; +} +ul.nav.nav-list.abn-tree .level-8 .indented { + position: relative; + left: 140px; +} +ul.nav.nav-list.abn-tree .level-9 .indented { + position: relative; + left: 160px; +} diff --git a/bower_components/angular-bootstrap-nav-tree/dist/abn_tree_directive.js b/bower_components/angular-bootstrap-nav-tree/dist/abn_tree_directive.js new file mode 100644 index 0000000..f309995 --- /dev/null +++ b/bower_components/angular-bootstrap-nav-tree/dist/abn_tree_directive.js @@ -0,0 +1,492 @@ +(function() { + var module, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + module = angular.module('angularBootstrapNavTree', []); + + module.directive('abnTree', [ + '$timeout', function($timeout) { + return { + restrict: 'E', + template: "
      \n
    • {{ row.label }}
    • \n
    ", + replace: true, + scope: { + treeData: '=', + onSelect: '&', + initialSelection: '@', + treeControl: '=' + }, + link: function(scope, element, attrs) { + var error, expand_all_parents, expand_level, for_all_ancestors, for_each_branch, get_parent, n, on_treeData_change, select_branch, selected_branch, tree; + error = function(s) { + console.log('ERROR:' + s); + debugger; + return void 0; + }; + if (attrs.iconExpand == null) { + attrs.iconExpand = 'icon-plus glyphicon glyphicon-plus fa fa-plus'; + } + if (attrs.iconCollapse == null) { + attrs.iconCollapse = 'icon-minus glyphicon glyphicon-minus fa fa-minus'; + } + if (attrs.iconLeaf == null) { + attrs.iconLeaf = 'icon-file glyphicon glyphicon-file fa fa-file'; + } + if (attrs.expandLevel == null) { + attrs.expandLevel = '3'; + } + expand_level = parseInt(attrs.expandLevel, 10); + if (!scope.treeData) { + alert('no treeData defined for the tree!'); + return; + } + if (scope.treeData.length == null) { + if (treeData.label != null) { + scope.treeData = [treeData]; + } else { + alert('treeData should be an array of root branches'); + return; + } + } + for_each_branch = function(f) { + var do_f, root_branch, _i, _len, _ref, _results; + do_f = function(branch, level) { + var child, _i, _len, _ref, _results; + f(branch, level); + if (branch.children != null) { + _ref = branch.children; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + _results.push(do_f(child, level + 1)); + } + return _results; + } + }; + _ref = scope.treeData; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + root_branch = _ref[_i]; + _results.push(do_f(root_branch, 1)); + } + return _results; + }; + selected_branch = null; + select_branch = function(branch) { + if (!branch) { + if (selected_branch != null) { + selected_branch.selected = false; + } + selected_branch = null; + return; + } + if (branch !== selected_branch) { + if (selected_branch != null) { + selected_branch.selected = false; + } + branch.selected = true; + selected_branch = branch; + expand_all_parents(branch); + if (branch.onSelect != null) { + return $timeout(function() { + return branch.onSelect(branch); + }); + } else { + if (scope.onSelect != null) { + return $timeout(function() { + return scope.onSelect({ + branch: branch + }); + }); + } + } + } + }; + scope.user_clicks_branch = function(branch) { + if (branch !== selected_branch) { + return select_branch(branch); + } + }; + get_parent = function(child) { + var parent; + parent = void 0; + if (child.parent_uid) { + for_each_branch(function(b) { + if (b.uid === child.parent_uid) { + return parent = b; + } + }); + } + return parent; + }; + for_all_ancestors = function(child, fn) { + var parent; + parent = get_parent(child); + if (parent != null) { + fn(parent); + return for_all_ancestors(parent, fn); + } + }; + expand_all_parents = function(child) { + return for_all_ancestors(child, function(b) { + return b.expanded = true; + }); + }; + scope.tree_rows = []; + on_treeData_change = function() { + var add_branch_to_list, root_branch, _i, _len, _ref, _results; + for_each_branch(function(b, level) { + if (!b.uid) { + return b.uid = "" + Math.random(); + } + }); + console.log('UIDs are set.'); + for_each_branch(function(b) { + var child, _i, _len, _ref, _results; + if (angular.isArray(b.children)) { + _ref = b.children; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + _results.push(child.parent_uid = b.uid); + } + return _results; + } + }); + scope.tree_rows = []; + for_each_branch(function(branch) { + var child, f; + if (branch.children) { + if (branch.children.length > 0) { + f = function(e) { + if (typeof e === 'string') { + return { + label: e, + children: [] + }; + } else { + return e; + } + }; + return branch.children = (function() { + var _i, _len, _ref, _results; + _ref = branch.children; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + _results.push(f(child)); + } + return _results; + })(); + } + } else { + return branch.children = []; + } + }); + add_branch_to_list = function(level, branch, visible) { + var child, child_visible, tree_icon, _i, _len, _ref, _results; + if (branch.expanded == null) { + branch.expanded = false; + } + if (branch.classes == null) { + branch.classes = []; + } + if (!branch.noLeaf && (!branch.children || branch.children.length === 0)) { + tree_icon = attrs.iconLeaf; + if (__indexOf.call(branch.classes, "leaf") < 0) { + branch.classes.push("leaf"); + } + } else { + if (branch.expanded) { + tree_icon = attrs.iconCollapse; + } else { + tree_icon = attrs.iconExpand; + } + } + scope.tree_rows.push({ + level: level, + branch: branch, + label: branch.label, + classes: branch.classes, + tree_icon: tree_icon, + visible: visible + }); + if (branch.children != null) { + _ref = branch.children; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + child_visible = visible && branch.expanded; + _results.push(add_branch_to_list(level + 1, child, child_visible)); + } + return _results; + } + }; + _ref = scope.treeData; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + root_branch = _ref[_i]; + _results.push(add_branch_to_list(1, root_branch, true)); + } + return _results; + }; + scope.$watch('treeData', on_treeData_change, true); + if (attrs.initialSelection != null) { + for_each_branch(function(b) { + if (b.label === attrs.initialSelection) { + return $timeout(function() { + return select_branch(b); + }); + } + }); + } + n = scope.treeData.length; + console.log('num root branches = ' + n); + for_each_branch(function(b, level) { + b.level = level; + return b.expanded = b.level < expand_level; + }); + if (scope.treeControl != null) { + if (angular.isObject(scope.treeControl)) { + tree = scope.treeControl; + tree.expand_all = function() { + return for_each_branch(function(b, level) { + return b.expanded = true; + }); + }; + tree.collapse_all = function() { + return for_each_branch(function(b, level) { + return b.expanded = false; + }); + }; + tree.get_first_branch = function() { + n = scope.treeData.length; + if (n > 0) { + return scope.treeData[0]; + } + }; + tree.select_first_branch = function() { + var b; + b = tree.get_first_branch(); + return tree.select_branch(b); + }; + tree.get_selected_branch = function() { + return selected_branch; + }; + tree.get_parent_branch = function(b) { + return get_parent(b); + }; + tree.select_branch = function(b) { + select_branch(b); + return b; + }; + tree.get_children = function(b) { + return b.children; + }; + tree.select_parent_branch = function(b) { + var p; + if (b == null) { + b = tree.get_selected_branch(); + } + if (b != null) { + p = tree.get_parent_branch(b); + if (p != null) { + tree.select_branch(p); + return p; + } + } + }; + tree.add_branch = function(parent, new_branch) { + if (parent != null) { + parent.children.push(new_branch); + parent.expanded = true; + } else { + scope.treeData.push(new_branch); + } + return new_branch; + }; + tree.add_root_branch = function(new_branch) { + tree.add_branch(null, new_branch); + return new_branch; + }; + tree.expand_branch = function(b) { + if (b == null) { + b = tree.get_selected_branch(); + } + if (b != null) { + b.expanded = true; + return b; + } + }; + tree.collapse_branch = function(b) { + if (b == null) { + b = selected_branch; + } + if (b != null) { + b.expanded = false; + return b; + } + }; + tree.get_siblings = function(b) { + var p, siblings; + if (b == null) { + b = selected_branch; + } + if (b != null) { + p = tree.get_parent_branch(b); + if (p) { + siblings = p.children; + } else { + siblings = scope.treeData; + } + return siblings; + } + }; + tree.get_next_sibling = function(b) { + var i, siblings; + if (b == null) { + b = selected_branch; + } + if (b != null) { + siblings = tree.get_siblings(b); + n = siblings.length; + i = siblings.indexOf(b); + if (i < n) { + return siblings[i + 1]; + } + } + }; + tree.get_prev_sibling = function(b) { + var i, siblings; + if (b == null) { + b = selected_branch; + } + siblings = tree.get_siblings(b); + n = siblings.length; + i = siblings.indexOf(b); + if (i > 0) { + return siblings[i - 1]; + } + }; + tree.select_next_sibling = function(b) { + var next; + if (b == null) { + b = selected_branch; + } + if (b != null) { + next = tree.get_next_sibling(b); + if (next != null) { + return tree.select_branch(next); + } + } + }; + tree.select_prev_sibling = function(b) { + var prev; + if (b == null) { + b = selected_branch; + } + if (b != null) { + prev = tree.get_prev_sibling(b); + if (prev != null) { + return tree.select_branch(prev); + } + } + }; + tree.get_first_child = function(b) { + var _ref; + if (b == null) { + b = selected_branch; + } + if (b != null) { + if (((_ref = b.children) != null ? _ref.length : void 0) > 0) { + return b.children[0]; + } + } + }; + tree.get_closest_ancestor_next_sibling = function(b) { + var next, parent; + next = tree.get_next_sibling(b); + if (next != null) { + return next; + } else { + parent = tree.get_parent_branch(b); + return tree.get_closest_ancestor_next_sibling(parent); + } + }; + tree.get_next_branch = function(b) { + var next; + if (b == null) { + b = selected_branch; + } + if (b != null) { + next = tree.get_first_child(b); + if (next != null) { + return next; + } else { + next = tree.get_closest_ancestor_next_sibling(b); + return next; + } + } + }; + tree.select_next_branch = function(b) { + var next; + if (b == null) { + b = selected_branch; + } + if (b != null) { + next = tree.get_next_branch(b); + if (next != null) { + tree.select_branch(next); + return next; + } + } + }; + tree.last_descendant = function(b) { + var last_child; + if (b == null) { + debugger; + } + n = b.children.length; + if (n === 0) { + return b; + } else { + last_child = b.children[n - 1]; + return tree.last_descendant(last_child); + } + }; + tree.get_prev_branch = function(b) { + var parent, prev_sibling; + if (b == null) { + b = selected_branch; + } + if (b != null) { + prev_sibling = tree.get_prev_sibling(b); + if (prev_sibling != null) { + return tree.last_descendant(prev_sibling); + } else { + parent = tree.get_parent_branch(b); + return parent; + } + } + }; + return tree.select_prev_branch = function(b) { + var prev; + if (b == null) { + b = selected_branch; + } + if (b != null) { + prev = tree.get_prev_branch(b); + if (prev != null) { + tree.select_branch(prev); + return prev; + } + } + }; + } + } + } + }; + } + ]); + +}).call(this); diff --git a/bower_components/angular-bootstrap/.bower.json b/bower_components/angular-bootstrap/.bower.json new file mode 100644 index 0000000..e7ce3ee --- /dev/null +++ b/bower_components/angular-bootstrap/.bower.json @@ -0,0 +1,31 @@ +{ + "author": { + "name": "https://github.com/angular-ui/bootstrap/graphs/contributors" + }, + "name": "angular-bootstrap", + "keywords": [ + "angular", + "angular-ui", + "bootstrap" + ], + "license": "MIT", + "ignore": [], + "description": "Native AngularJS (Angular) directives for Bootstrap.", + "version": "0.12.1", + "main": [ + "./ui-bootstrap-tpls.js" + ], + "dependencies": { + "angular": ">=1 <1.3.0" + }, + "homepage": "https://github.com/angular-ui/bootstrap-bower", + "_release": "0.12.1", + "_resolution": { + "type": "version", + "tag": "0.12.1", + "commit": "ab14fbaaf3d592f8e76018f0666c5af6f68ebaa3" + }, + "_source": "git://github.com/angular-ui/bootstrap-bower.git", + "_target": "~0.12.1", + "_originalSource": "angular-bootstrap" +} \ No newline at end of file diff --git a/bower_components/angular-bootstrap/bower.json b/bower_components/angular-bootstrap/bower.json new file mode 100644 index 0000000..8f6991b --- /dev/null +++ b/bower_components/angular-bootstrap/bower.json @@ -0,0 +1,19 @@ +{ + "author": { + "name": "https://github.com/angular-ui/bootstrap/graphs/contributors" + }, + "name": "angular-bootstrap", + "keywords": [ + "angular", + "angular-ui", + "bootstrap" + ], + "license": "MIT", + "ignore": [], + "description": "Native AngularJS (Angular) directives for Bootstrap.", + "version": "0.12.1", + "main": ["./ui-bootstrap-tpls.js"], + "dependencies": { + "angular": ">=1 <1.3.0" + } +} diff --git a/bower_components/angular-bootstrap/ui-bootstrap-tpls.js b/bower_components/angular-bootstrap/ui-bootstrap-tpls.js new file mode 100644 index 0000000..eda964c --- /dev/null +++ b/bower_components/angular-bootstrap/ui-bootstrap-tpls.js @@ -0,0 +1,4211 @@ +/* + * angular-ui-bootstrap + * http://angular-ui.github.io/bootstrap/ + + * Version: 0.12.1 - 2015-02-20 + * License: MIT + */ +angular.module("ui.bootstrap", ["ui.bootstrap.tpls", "ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]); +angular.module("ui.bootstrap.tpls", ["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]); +angular.module('ui.bootstrap.transition', []) + +/** + * $transition service provides a consistent interface to trigger CSS 3 transitions and to be informed when they complete. + * @param {DOMElement} element The DOMElement that will be animated. + * @param {string|object|function} trigger The thing that will cause the transition to start: + * - As a string, it represents the css class to be added to the element. + * - As an object, it represents a hash of style attributes to be applied to the element. + * - As a function, it represents a function to be called that will cause the transition to occur. + * @return {Promise} A promise that is resolved when the transition finishes. + */ +.factory('$transition', ['$q', '$timeout', '$rootScope', function($q, $timeout, $rootScope) { + + var $transition = function(element, trigger, options) { + options = options || {}; + var deferred = $q.defer(); + var endEventName = $transition[options.animation ? 'animationEndEventName' : 'transitionEndEventName']; + + var transitionEndHandler = function(event) { + $rootScope.$apply(function() { + element.unbind(endEventName, transitionEndHandler); + deferred.resolve(element); + }); + }; + + if (endEventName) { + element.bind(endEventName, transitionEndHandler); + } + + // Wrap in a timeout to allow the browser time to update the DOM before the transition is to occur + $timeout(function() { + if ( angular.isString(trigger) ) { + element.addClass(trigger); + } else if ( angular.isFunction(trigger) ) { + trigger(element); + } else if ( angular.isObject(trigger) ) { + element.css(trigger); + } + //If browser does not support transitions, instantly resolve + if ( !endEventName ) { + deferred.resolve(element); + } + }); + + // Add our custom cancel function to the promise that is returned + // We can call this if we are about to run a new transition, which we know will prevent this transition from ending, + // i.e. it will therefore never raise a transitionEnd event for that transition + deferred.promise.cancel = function() { + if ( endEventName ) { + element.unbind(endEventName, transitionEndHandler); + } + deferred.reject('Transition cancelled'); + }; + + return deferred.promise; + }; + + // Work out the name of the transitionEnd event + var transElement = document.createElement('trans'); + var transitionEndEventNames = { + 'WebkitTransition': 'webkitTransitionEnd', + 'MozTransition': 'transitionend', + 'OTransition': 'oTransitionEnd', + 'transition': 'transitionend' + }; + var animationEndEventNames = { + 'WebkitTransition': 'webkitAnimationEnd', + 'MozTransition': 'animationend', + 'OTransition': 'oAnimationEnd', + 'transition': 'animationend' + }; + function findEndEventName(endEventNames) { + for (var name in endEventNames){ + if (transElement.style[name] !== undefined) { + return endEventNames[name]; + } + } + } + $transition.transitionEndEventName = findEndEventName(transitionEndEventNames); + $transition.animationEndEventName = findEndEventName(animationEndEventNames); + return $transition; +}]); + +angular.module('ui.bootstrap.collapse', ['ui.bootstrap.transition']) + + .directive('collapse', ['$transition', function ($transition) { + + return { + link: function (scope, element, attrs) { + + var initialAnimSkip = true; + var currentTransition; + + function doTransition(change) { + var newTransition = $transition(element, change); + if (currentTransition) { + currentTransition.cancel(); + } + currentTransition = newTransition; + newTransition.then(newTransitionDone, newTransitionDone); + return newTransition; + + function newTransitionDone() { + // Make sure it's this transition, otherwise, leave it alone. + if (currentTransition === newTransition) { + currentTransition = undefined; + } + } + } + + function expand() { + if (initialAnimSkip) { + initialAnimSkip = false; + expandDone(); + } else { + element.removeClass('collapse').addClass('collapsing'); + doTransition({ height: element[0].scrollHeight + 'px' }).then(expandDone); + } + } + + function expandDone() { + element.removeClass('collapsing'); + element.addClass('collapse in'); + element.css({height: 'auto'}); + } + + function collapse() { + if (initialAnimSkip) { + initialAnimSkip = false; + collapseDone(); + element.css({height: 0}); + } else { + // CSS transitions don't work with height: auto, so we have to manually change the height to a specific value + element.css({ height: element[0].scrollHeight + 'px' }); + //trigger reflow so a browser realizes that height was updated from auto to a specific value + var x = element[0].offsetWidth; + + element.removeClass('collapse in').addClass('collapsing'); + + doTransition({ height: 0 }).then(collapseDone); + } + } + + function collapseDone() { + element.removeClass('collapsing'); + element.addClass('collapse'); + } + + scope.$watch(attrs.collapse, function (shouldCollapse) { + if (shouldCollapse) { + collapse(); + } else { + expand(); + } + }); + } + }; + }]); + +angular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse']) + +.constant('accordionConfig', { + closeOthers: true +}) + +.controller('AccordionController', ['$scope', '$attrs', 'accordionConfig', function ($scope, $attrs, accordionConfig) { + + // This array keeps track of the accordion groups + this.groups = []; + + // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to + this.closeOthers = function(openGroup) { + var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers; + if ( closeOthers ) { + angular.forEach(this.groups, function (group) { + if ( group !== openGroup ) { + group.isOpen = false; + } + }); + } + }; + + // This is called from the accordion-group directive to add itself to the accordion + this.addGroup = function(groupScope) { + var that = this; + this.groups.push(groupScope); + + groupScope.$on('$destroy', function (event) { + that.removeGroup(groupScope); + }); + }; + + // This is called from the accordion-group directive when to remove itself + this.removeGroup = function(group) { + var index = this.groups.indexOf(group); + if ( index !== -1 ) { + this.groups.splice(index, 1); + } + }; + +}]) + +// The accordion directive simply sets up the directive controller +// and adds an accordion CSS class to itself element. +.directive('accordion', function () { + return { + restrict:'EA', + controller:'AccordionController', + transclude: true, + replace: false, + templateUrl: 'template/accordion/accordion.html' + }; +}) + +// The accordion-group directive indicates a block of html that will expand and collapse in an accordion +.directive('accordionGroup', function() { + return { + require:'^accordion', // We need this directive to be inside an accordion + restrict:'EA', + transclude:true, // It transcludes the contents of the directive into the template + replace: true, // The element containing the directive will be replaced with the template + templateUrl:'template/accordion/accordion-group.html', + scope: { + heading: '@', // Interpolate the heading attribute onto this scope + isOpen: '=?', + isDisabled: '=?' + }, + controller: function() { + this.setHeading = function(element) { + this.heading = element; + }; + }, + link: function(scope, element, attrs, accordionCtrl) { + accordionCtrl.addGroup(scope); + + scope.$watch('isOpen', function(value) { + if ( value ) { + accordionCtrl.closeOthers(scope); + } + }); + + scope.toggleOpen = function() { + if ( !scope.isDisabled ) { + scope.isOpen = !scope.isOpen; + } + }; + } + }; +}) + +// Use accordion-heading below an accordion-group to provide a heading containing HTML +// +// Heading containing HTML - +// +.directive('accordionHeading', function() { + return { + restrict: 'EA', + transclude: true, // Grab the contents to be used as the heading + template: '', // In effect remove this element! + replace: true, + require: '^accordionGroup', + link: function(scope, element, attr, accordionGroupCtrl, transclude) { + // Pass the heading to the accordion-group controller + // so that it can be transcluded into the right place in the template + // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat] + accordionGroupCtrl.setHeading(transclude(scope, function() {})); + } + }; +}) + +// Use in the accordion-group template to indicate where you want the heading to be transcluded +// You must provide the property on the accordion-group controller that will hold the transcluded element +//
    +//
    ...
    +// ... +//
    +.directive('accordionTransclude', function() { + return { + require: '^accordionGroup', + link: function(scope, element, attr, controller) { + scope.$watch(function() { return controller[attr.accordionTransclude]; }, function(heading) { + if ( heading ) { + element.html(''); + element.append(heading); + } + }); + } + }; +}); + +angular.module('ui.bootstrap.alert', []) + +.controller('AlertController', ['$scope', '$attrs', function ($scope, $attrs) { + $scope.closeable = 'close' in $attrs; + this.close = $scope.close; +}]) + +.directive('alert', function () { + return { + restrict:'EA', + controller:'AlertController', + templateUrl:'template/alert/alert.html', + transclude:true, + replace:true, + scope: { + type: '@', + close: '&' + } + }; +}) + +.directive('dismissOnTimeout', ['$timeout', function($timeout) { + return { + require: 'alert', + link: function(scope, element, attrs, alertCtrl) { + $timeout(function(){ + alertCtrl.close(); + }, parseInt(attrs.dismissOnTimeout, 10)); + } + }; +}]); + +angular.module('ui.bootstrap.bindHtml', []) + + .directive('bindHtmlUnsafe', function () { + return function (scope, element, attr) { + element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe); + scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) { + element.html(value || ''); + }); + }; + }); +angular.module('ui.bootstrap.buttons', []) + +.constant('buttonConfig', { + activeClass: 'active', + toggleEvent: 'click' +}) + +.controller('ButtonsController', ['buttonConfig', function(buttonConfig) { + this.activeClass = buttonConfig.activeClass || 'active'; + this.toggleEvent = buttonConfig.toggleEvent || 'click'; +}]) + +.directive('btnRadio', function () { + return { + require: ['btnRadio', 'ngModel'], + controller: 'ButtonsController', + link: function (scope, element, attrs, ctrls) { + var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + //model -> UI + ngModelCtrl.$render = function () { + element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio))); + }; + + //ui->model + element.bind(buttonsCtrl.toggleEvent, function () { + var isActive = element.hasClass(buttonsCtrl.activeClass); + + if (!isActive || angular.isDefined(attrs.uncheckable)) { + scope.$apply(function () { + ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.btnRadio)); + ngModelCtrl.$render(); + }); + } + }); + } + }; +}) + +.directive('btnCheckbox', function () { + return { + require: ['btnCheckbox', 'ngModel'], + controller: 'ButtonsController', + link: function (scope, element, attrs, ctrls) { + var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + function getTrueValue() { + return getCheckboxValue(attrs.btnCheckboxTrue, true); + } + + function getFalseValue() { + return getCheckboxValue(attrs.btnCheckboxFalse, false); + } + + function getCheckboxValue(attributeValue, defaultValue) { + var val = scope.$eval(attributeValue); + return angular.isDefined(val) ? val : defaultValue; + } + + //model -> UI + ngModelCtrl.$render = function () { + element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue())); + }; + + //ui->model + element.bind(buttonsCtrl.toggleEvent, function () { + scope.$apply(function () { + ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue()); + ngModelCtrl.$render(); + }); + }); + } + }; +}); + +/** +* @ngdoc overview +* @name ui.bootstrap.carousel +* +* @description +* AngularJS version of an image carousel. +* +*/ +angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition']) +.controller('CarouselController', ['$scope', '$timeout', '$interval', '$transition', function ($scope, $timeout, $interval, $transition) { + var self = this, + slides = self.slides = $scope.slides = [], + currentIndex = -1, + currentInterval, isPlaying; + self.currentSlide = null; + + var destroyed = false; + /* direction: "prev" or "next" */ + self.select = $scope.select = function(nextSlide, direction) { + var nextIndex = slides.indexOf(nextSlide); + //Decide direction if it's not given + if (direction === undefined) { + direction = nextIndex > currentIndex ? 'next' : 'prev'; + } + if (nextSlide && nextSlide !== self.currentSlide) { + if ($scope.$currentTransition) { + $scope.$currentTransition.cancel(); + //Timeout so ng-class in template has time to fix classes for finished slide + $timeout(goNext); + } else { + goNext(); + } + } + function goNext() { + // Scope has been destroyed, stop here. + if (destroyed) { return; } + //If we have a slide to transition from and we have a transition type and we're allowed, go + if (self.currentSlide && angular.isString(direction) && !$scope.noTransition && nextSlide.$element) { + //We shouldn't do class manip in here, but it's the same weird thing bootstrap does. need to fix sometime + nextSlide.$element.addClass(direction); + var reflow = nextSlide.$element[0].offsetWidth; //force reflow + + //Set all other slides to stop doing their stuff for the new transition + angular.forEach(slides, function(slide) { + angular.extend(slide, {direction: '', entering: false, leaving: false, active: false}); + }); + angular.extend(nextSlide, {direction: direction, active: true, entering: true}); + angular.extend(self.currentSlide||{}, {direction: direction, leaving: true}); + + $scope.$currentTransition = $transition(nextSlide.$element, {}); + //We have to create new pointers inside a closure since next & current will change + (function(next,current) { + $scope.$currentTransition.then( + function(){ transitionDone(next, current); }, + function(){ transitionDone(next, current); } + ); + }(nextSlide, self.currentSlide)); + } else { + transitionDone(nextSlide, self.currentSlide); + } + self.currentSlide = nextSlide; + currentIndex = nextIndex; + //every time you change slides, reset the timer + restartTimer(); + } + function transitionDone(next, current) { + angular.extend(next, {direction: '', active: true, leaving: false, entering: false}); + angular.extend(current||{}, {direction: '', active: false, leaving: false, entering: false}); + $scope.$currentTransition = null; + } + }; + $scope.$on('$destroy', function () { + destroyed = true; + }); + + /* Allow outside people to call indexOf on slides array */ + self.indexOfSlide = function(slide) { + return slides.indexOf(slide); + }; + + $scope.next = function() { + var newIndex = (currentIndex + 1) % slides.length; + + //Prevent this user-triggered transition from occurring if there is already one in progress + if (!$scope.$currentTransition) { + return self.select(slides[newIndex], 'next'); + } + }; + + $scope.prev = function() { + var newIndex = currentIndex - 1 < 0 ? slides.length - 1 : currentIndex - 1; + + //Prevent this user-triggered transition from occurring if there is already one in progress + if (!$scope.$currentTransition) { + return self.select(slides[newIndex], 'prev'); + } + }; + + $scope.isActive = function(slide) { + return self.currentSlide === slide; + }; + + $scope.$watch('interval', restartTimer); + $scope.$on('$destroy', resetTimer); + + function restartTimer() { + resetTimer(); + var interval = +$scope.interval; + if (!isNaN(interval) && interval > 0) { + currentInterval = $interval(timerFn, interval); + } + } + + function resetTimer() { + if (currentInterval) { + $interval.cancel(currentInterval); + currentInterval = null; + } + } + + function timerFn() { + var interval = +$scope.interval; + if (isPlaying && !isNaN(interval) && interval > 0) { + $scope.next(); + } else { + $scope.pause(); + } + } + + $scope.play = function() { + if (!isPlaying) { + isPlaying = true; + restartTimer(); + } + }; + $scope.pause = function() { + if (!$scope.noPause) { + isPlaying = false; + resetTimer(); + } + }; + + self.addSlide = function(slide, element) { + slide.$element = element; + slides.push(slide); + //if this is the first slide or the slide is set to active, select it + if(slides.length === 1 || slide.active) { + self.select(slides[slides.length-1]); + if (slides.length == 1) { + $scope.play(); + } + } else { + slide.active = false; + } + }; + + self.removeSlide = function(slide) { + //get the index of the slide inside the carousel + var index = slides.indexOf(slide); + slides.splice(index, 1); + if (slides.length > 0 && slide.active) { + if (index >= slides.length) { + self.select(slides[index-1]); + } else { + self.select(slides[index]); + } + } else if (currentIndex > index) { + currentIndex--; + } + }; + +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.carousel.directive:carousel + * @restrict EA + * + * @description + * Carousel is the outer container for a set of image 'slides' to showcase. + * + * @param {number=} interval The time, in milliseconds, that it will take the carousel to go to the next slide. + * @param {boolean=} noTransition Whether to disable transitions on the carousel. + * @param {boolean=} noPause Whether to disable pausing on the carousel (by default, the carousel interval pauses on hover). + * + * @example + + + + + +
    +

    Beautiful!

    +
    +
    + + +
    +

    D'aww!

    +
    +
    +
    +
    + + .carousel-indicators { + top: auto; + bottom: 15px; + } + +
    + */ +.directive('carousel', [function() { + return { + restrict: 'EA', + transclude: true, + replace: true, + controller: 'CarouselController', + require: 'carousel', + templateUrl: 'template/carousel/carousel.html', + scope: { + interval: '=', + noTransition: '=', + noPause: '=' + } + }; +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.carousel.directive:slide + * @restrict EA + * + * @description + * Creates a slide inside a {@link ui.bootstrap.carousel.directive:carousel carousel}. Must be placed as a child of a carousel element. + * + * @param {boolean=} active Model binding, whether or not this slide is currently active. + * + * @example + + +
    + + + +
    +

    Slide {{$index}}

    +

    {{slide.text}}

    +
    +
    +
    + Interval, in milliseconds: +
    Enter a negative number to stop the interval. +
    +
    + +function CarouselDemoCtrl($scope) { + $scope.myInterval = 5000; +} + + + .carousel-indicators { + top: auto; + bottom: 15px; + } + +
    +*/ + +.directive('slide', function() { + return { + require: '^carousel', + restrict: 'EA', + transclude: true, + replace: true, + templateUrl: 'template/carousel/slide.html', + scope: { + active: '=?' + }, + link: function (scope, element, attrs, carouselCtrl) { + carouselCtrl.addSlide(scope, element); + //when the scope is destroyed then remove the slide from the current slides array + scope.$on('$destroy', function() { + carouselCtrl.removeSlide(scope); + }); + + scope.$watch('active', function(active) { + if (active) { + carouselCtrl.select(scope); + } + }); + } + }; +}); + +angular.module('ui.bootstrap.dateparser', []) + +.service('dateParser', ['$locale', 'orderByFilter', function($locale, orderByFilter) { + + this.parsers = {}; + + var formatCodeToRegex = { + 'yyyy': { + regex: '\\d{4}', + apply: function(value) { this.year = +value; } + }, + 'yy': { + regex: '\\d{2}', + apply: function(value) { this.year = +value + 2000; } + }, + 'y': { + regex: '\\d{1,4}', + apply: function(value) { this.year = +value; } + }, + 'MMMM': { + regex: $locale.DATETIME_FORMATS.MONTH.join('|'), + apply: function(value) { this.month = $locale.DATETIME_FORMATS.MONTH.indexOf(value); } + }, + 'MMM': { + regex: $locale.DATETIME_FORMATS.SHORTMONTH.join('|'), + apply: function(value) { this.month = $locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value); } + }, + 'MM': { + regex: '0[1-9]|1[0-2]', + apply: function(value) { this.month = value - 1; } + }, + 'M': { + regex: '[1-9]|1[0-2]', + apply: function(value) { this.month = value - 1; } + }, + 'dd': { + regex: '[0-2][0-9]{1}|3[0-1]{1}', + apply: function(value) { this.date = +value; } + }, + 'd': { + regex: '[1-2]?[0-9]{1}|3[0-1]{1}', + apply: function(value) { this.date = +value; } + }, + 'EEEE': { + regex: $locale.DATETIME_FORMATS.DAY.join('|') + }, + 'EEE': { + regex: $locale.DATETIME_FORMATS.SHORTDAY.join('|') + } + }; + + function createParser(format) { + var map = [], regex = format.split(''); + + angular.forEach(formatCodeToRegex, function(data, code) { + var index = format.indexOf(code); + + if (index > -1) { + format = format.split(''); + + regex[index] = '(' + data.regex + ')'; + format[index] = '$'; // Custom symbol to define consumed part of format + for (var i = index + 1, n = index + code.length; i < n; i++) { + regex[i] = ''; + format[i] = '$'; + } + format = format.join(''); + + map.push({ index: index, apply: data.apply }); + } + }); + + return { + regex: new RegExp('^' + regex.join('') + '$'), + map: orderByFilter(map, 'index') + }; + } + + this.parse = function(input, format) { + if ( !angular.isString(input) || !format ) { + return input; + } + + format = $locale.DATETIME_FORMATS[format] || format; + + if ( !this.parsers[format] ) { + this.parsers[format] = createParser(format); + } + + var parser = this.parsers[format], + regex = parser.regex, + map = parser.map, + results = input.match(regex); + + if ( results && results.length ) { + var fields = { year: 1900, month: 0, date: 1, hours: 0 }, dt; + + for( var i = 1, n = results.length; i < n; i++ ) { + var mapper = map[i-1]; + if ( mapper.apply ) { + mapper.apply.call(fields, results[i]); + } + } + + if ( isValid(fields.year, fields.month, fields.date) ) { + dt = new Date( fields.year, fields.month, fields.date, fields.hours); + } + + return dt; + } + }; + + // Check if date is valid for specific month (and year for February). + // Month: 0 = Jan, 1 = Feb, etc + function isValid(year, month, date) { + if ( month === 1 && date > 28) { + return date === 29 && ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0); + } + + if ( month === 3 || month === 5 || month === 8 || month === 10) { + return date < 31; + } + + return true; + } +}]); + +angular.module('ui.bootstrap.position', []) + +/** + * A set of utility methods that can be use to retrieve position of DOM elements. + * It is meant to be used where we need to absolute-position DOM elements in + * relation to other, existing elements (this is the case for tooltips, popovers, + * typeahead suggestions etc.). + */ + .factory('$position', ['$document', '$window', function ($document, $window) { + + function getStyle(el, cssprop) { + if (el.currentStyle) { //IE + return el.currentStyle[cssprop]; + } else if ($window.getComputedStyle) { + return $window.getComputedStyle(el)[cssprop]; + } + // finally try and get inline style + return el.style[cssprop]; + } + + /** + * Checks if a given element is statically positioned + * @param element - raw DOM element + */ + function isStaticPositioned(element) { + return (getStyle(element, 'position') || 'static' ) === 'static'; + } + + /** + * returns the closest, non-statically positioned parentOffset of a given element + * @param element + */ + var parentOffsetEl = function (element) { + var docDomEl = $document[0]; + var offsetParent = element.offsetParent || docDomEl; + while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent || docDomEl; + }; + + return { + /** + * Provides read-only equivalent of jQuery's position function: + * http://api.jquery.com/position/ + */ + position: function (element) { + var elBCR = this.offset(element); + var offsetParentBCR = { top: 0, left: 0 }; + var offsetParentEl = parentOffsetEl(element[0]); + if (offsetParentEl != $document[0]) { + offsetParentBCR = this.offset(angular.element(offsetParentEl)); + offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop; + offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft; + } + + var boundingClientRect = element[0].getBoundingClientRect(); + return { + width: boundingClientRect.width || element.prop('offsetWidth'), + height: boundingClientRect.height || element.prop('offsetHeight'), + top: elBCR.top - offsetParentBCR.top, + left: elBCR.left - offsetParentBCR.left + }; + }, + + /** + * Provides read-only equivalent of jQuery's offset function: + * http://api.jquery.com/offset/ + */ + offset: function (element) { + var boundingClientRect = element[0].getBoundingClientRect(); + return { + width: boundingClientRect.width || element.prop('offsetWidth'), + height: boundingClientRect.height || element.prop('offsetHeight'), + top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop), + left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft) + }; + }, + + /** + * Provides coordinates for the targetEl in relation to hostEl + */ + positionElements: function (hostEl, targetEl, positionStr, appendToBody) { + + var positionStrParts = positionStr.split('-'); + var pos0 = positionStrParts[0], pos1 = positionStrParts[1] || 'center'; + + var hostElPos, + targetElWidth, + targetElHeight, + targetElPos; + + hostElPos = appendToBody ? this.offset(hostEl) : this.position(hostEl); + + targetElWidth = targetEl.prop('offsetWidth'); + targetElHeight = targetEl.prop('offsetHeight'); + + var shiftWidth = { + center: function () { + return hostElPos.left + hostElPos.width / 2 - targetElWidth / 2; + }, + left: function () { + return hostElPos.left; + }, + right: function () { + return hostElPos.left + hostElPos.width; + } + }; + + var shiftHeight = { + center: function () { + return hostElPos.top + hostElPos.height / 2 - targetElHeight / 2; + }, + top: function () { + return hostElPos.top; + }, + bottom: function () { + return hostElPos.top + hostElPos.height; + } + }; + + switch (pos0) { + case 'right': + targetElPos = { + top: shiftHeight[pos1](), + left: shiftWidth[pos0]() + }; + break; + case 'left': + targetElPos = { + top: shiftHeight[pos1](), + left: hostElPos.left - targetElWidth + }; + break; + case 'bottom': + targetElPos = { + top: shiftHeight[pos0](), + left: shiftWidth[pos1]() + }; + break; + default: + targetElPos = { + top: hostElPos.top - targetElHeight, + left: shiftWidth[pos1]() + }; + break; + } + + return targetElPos; + } + }; + }]); + +angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootstrap.position']) + +.constant('datepickerConfig', { + formatDay: 'dd', + formatMonth: 'MMMM', + formatYear: 'yyyy', + formatDayHeader: 'EEE', + formatDayTitle: 'MMMM yyyy', + formatMonthTitle: 'yyyy', + datepickerMode: 'day', + minMode: 'day', + maxMode: 'year', + showWeeks: true, + startingDay: 0, + yearRange: 20, + minDate: null, + maxDate: null +}) + +.controller('DatepickerController', ['$scope', '$attrs', '$parse', '$interpolate', '$timeout', '$log', 'dateFilter', 'datepickerConfig', function($scope, $attrs, $parse, $interpolate, $timeout, $log, dateFilter, datepickerConfig) { + var self = this, + ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl; + + // Modes chain + this.modes = ['day', 'month', 'year']; + + // Configuration attributes + angular.forEach(['formatDay', 'formatMonth', 'formatYear', 'formatDayHeader', 'formatDayTitle', 'formatMonthTitle', + 'minMode', 'maxMode', 'showWeeks', 'startingDay', 'yearRange'], function( key, index ) { + self[key] = angular.isDefined($attrs[key]) ? (index < 8 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key])) : datepickerConfig[key]; + }); + + // Watchable date attributes + angular.forEach(['minDate', 'maxDate'], function( key ) { + if ( $attrs[key] ) { + $scope.$parent.$watch($parse($attrs[key]), function(value) { + self[key] = value ? new Date(value) : null; + self.refreshView(); + }); + } else { + self[key] = datepickerConfig[key] ? new Date(datepickerConfig[key]) : null; + } + }); + + $scope.datepickerMode = $scope.datepickerMode || datepickerConfig.datepickerMode; + $scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000); + this.activeDate = angular.isDefined($attrs.initDate) ? $scope.$parent.$eval($attrs.initDate) : new Date(); + + $scope.isActive = function(dateObject) { + if (self.compare(dateObject.date, self.activeDate) === 0) { + $scope.activeDateId = dateObject.uid; + return true; + } + return false; + }; + + this.init = function( ngModelCtrl_ ) { + ngModelCtrl = ngModelCtrl_; + + ngModelCtrl.$render = function() { + self.render(); + }; + }; + + this.render = function() { + if ( ngModelCtrl.$modelValue ) { + var date = new Date( ngModelCtrl.$modelValue ), + isValid = !isNaN(date); + + if ( isValid ) { + this.activeDate = date; + } else { + $log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); + } + ngModelCtrl.$setValidity('date', isValid); + } + this.refreshView(); + }; + + this.refreshView = function() { + if ( this.element ) { + this._refreshView(); + + var date = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null; + ngModelCtrl.$setValidity('date-disabled', !date || (this.element && !this.isDisabled(date))); + } + }; + + this.createDateObject = function(date, format) { + var model = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null; + return { + date: date, + label: dateFilter(date, format), + selected: model && this.compare(date, model) === 0, + disabled: this.isDisabled(date), + current: this.compare(date, new Date()) === 0 + }; + }; + + this.isDisabled = function( date ) { + return ((this.minDate && this.compare(date, this.minDate) < 0) || (this.maxDate && this.compare(date, this.maxDate) > 0) || ($attrs.dateDisabled && $scope.dateDisabled({date: date, mode: $scope.datepickerMode}))); + }; + + // Split array into smaller arrays + this.split = function(arr, size) { + var arrays = []; + while (arr.length > 0) { + arrays.push(arr.splice(0, size)); + } + return arrays; + }; + + $scope.select = function( date ) { + if ( $scope.datepickerMode === self.minMode ) { + var dt = ngModelCtrl.$modelValue ? new Date( ngModelCtrl.$modelValue ) : new Date(0, 0, 0, 0, 0, 0, 0); + dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() ); + ngModelCtrl.$setViewValue( dt ); + ngModelCtrl.$render(); + } else { + self.activeDate = date; + $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) - 1 ]; + } + }; + + $scope.move = function( direction ) { + var year = self.activeDate.getFullYear() + direction * (self.step.years || 0), + month = self.activeDate.getMonth() + direction * (self.step.months || 0); + self.activeDate.setFullYear(year, month, 1); + self.refreshView(); + }; + + $scope.toggleMode = function( direction ) { + direction = direction || 1; + + if (($scope.datepickerMode === self.maxMode && direction === 1) || ($scope.datepickerMode === self.minMode && direction === -1)) { + return; + } + + $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) + direction ]; + }; + + // Key event mapper + $scope.keys = { 13:'enter', 32:'space', 33:'pageup', 34:'pagedown', 35:'end', 36:'home', 37:'left', 38:'up', 39:'right', 40:'down' }; + + var focusElement = function() { + $timeout(function() { + self.element[0].focus(); + }, 0 , false); + }; + + // Listen for focus requests from popup directive + $scope.$on('datepicker.focus', focusElement); + + $scope.keydown = function( evt ) { + var key = $scope.keys[evt.which]; + + if ( !key || evt.shiftKey || evt.altKey ) { + return; + } + + evt.preventDefault(); + evt.stopPropagation(); + + if (key === 'enter' || key === 'space') { + if ( self.isDisabled(self.activeDate)) { + return; // do nothing + } + $scope.select(self.activeDate); + focusElement(); + } else if (evt.ctrlKey && (key === 'up' || key === 'down')) { + $scope.toggleMode(key === 'up' ? 1 : -1); + focusElement(); + } else { + self.handleKeyDown(key, evt); + self.refreshView(); + } + }; +}]) + +.directive( 'datepicker', function () { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/datepicker.html', + scope: { + datepickerMode: '=?', + dateDisabled: '&' + }, + require: ['datepicker', '?^ngModel'], + controller: 'DatepickerController', + link: function(scope, element, attrs, ctrls) { + var datepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + datepickerCtrl.init( ngModelCtrl ); + } + } + }; +}) + +.directive('daypicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/day.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + scope.showWeeks = ctrl.showWeeks; + + ctrl.step = { months: 1 }; + ctrl.element = element; + + var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + function getDaysInMonth( year, month ) { + return ((month === 1) && (year % 4 === 0) && ((year % 100 !== 0) || (year % 400 === 0))) ? 29 : DAYS_IN_MONTH[month]; + } + + function getDates(startDate, n) { + var dates = new Array(n), current = new Date(startDate), i = 0; + current.setHours(12); // Prevent repeated dates because of timezone bug + while ( i < n ) { + dates[i++] = new Date(current); + current.setDate( current.getDate() + 1 ); + } + return dates; + } + + ctrl._refreshView = function() { + var year = ctrl.activeDate.getFullYear(), + month = ctrl.activeDate.getMonth(), + firstDayOfMonth = new Date(year, month, 1), + difference = ctrl.startingDay - firstDayOfMonth.getDay(), + numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference, + firstDate = new Date(firstDayOfMonth); + + if ( numDisplayedFromPreviousMonth > 0 ) { + firstDate.setDate( - numDisplayedFromPreviousMonth + 1 ); + } + + // 42 is the number of days on a six-month calendar + var days = getDates(firstDate, 42); + for (var i = 0; i < 42; i ++) { + days[i] = angular.extend(ctrl.createDateObject(days[i], ctrl.formatDay), { + secondary: days[i].getMonth() !== month, + uid: scope.uniqueId + '-' + i + }); + } + + scope.labels = new Array(7); + for (var j = 0; j < 7; j++) { + scope.labels[j] = { + abbr: dateFilter(days[j].date, ctrl.formatDayHeader), + full: dateFilter(days[j].date, 'EEEE') + }; + } + + scope.title = dateFilter(ctrl.activeDate, ctrl.formatDayTitle); + scope.rows = ctrl.split(days, 7); + + if ( scope.showWeeks ) { + scope.weekNumbers = []; + var weekNumber = getISO8601WeekNumber( scope.rows[0][0].date ), + numWeeks = scope.rows.length; + while( scope.weekNumbers.push(weekNumber++) < numWeeks ) {} + } + }; + + ctrl.compare = function(date1, date2) { + return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) ); + }; + + function getISO8601WeekNumber(date) { + var checkDate = new Date(date); + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday + var time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + } + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getDate(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 7; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 7; + } else if (key === 'pageup' || key === 'pagedown') { + var month = ctrl.activeDate.getMonth() + (key === 'pageup' ? - 1 : 1); + ctrl.activeDate.setMonth(month, 1); + date = Math.min(getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()), date); + } else if (key === 'home') { + date = 1; + } else if (key === 'end') { + date = getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()); + } + ctrl.activeDate.setDate(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.directive('monthpicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/month.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + ctrl.step = { years: 1 }; + ctrl.element = element; + + ctrl._refreshView = function() { + var months = new Array(12), + year = ctrl.activeDate.getFullYear(); + + for ( var i = 0; i < 12; i++ ) { + months[i] = angular.extend(ctrl.createDateObject(new Date(year, i, 1), ctrl.formatMonth), { + uid: scope.uniqueId + '-' + i + }); + } + + scope.title = dateFilter(ctrl.activeDate, ctrl.formatMonthTitle); + scope.rows = ctrl.split(months, 3); + }; + + ctrl.compare = function(date1, date2) { + return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() ); + }; + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getMonth(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 3; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 3; + } else if (key === 'pageup' || key === 'pagedown') { + var year = ctrl.activeDate.getFullYear() + (key === 'pageup' ? - 1 : 1); + ctrl.activeDate.setFullYear(year); + } else if (key === 'home') { + date = 0; + } else if (key === 'end') { + date = 11; + } + ctrl.activeDate.setMonth(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.directive('yearpicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/year.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + var range = ctrl.yearRange; + + ctrl.step = { years: range }; + ctrl.element = element; + + function getStartingYear( year ) { + return parseInt((year - 1) / range, 10) * range + 1; + } + + ctrl._refreshView = function() { + var years = new Array(range); + + for ( var i = 0, start = getStartingYear(ctrl.activeDate.getFullYear()); i < range; i++ ) { + years[i] = angular.extend(ctrl.createDateObject(new Date(start + i, 0, 1), ctrl.formatYear), { + uid: scope.uniqueId + '-' + i + }); + } + + scope.title = [years[0].label, years[range - 1].label].join(' - '); + scope.rows = ctrl.split(years, 5); + }; + + ctrl.compare = function(date1, date2) { + return date1.getFullYear() - date2.getFullYear(); + }; + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getFullYear(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 5; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 5; + } else if (key === 'pageup' || key === 'pagedown') { + date += (key === 'pageup' ? - 1 : 1) * ctrl.step.years; + } else if (key === 'home') { + date = getStartingYear( ctrl.activeDate.getFullYear() ); + } else if (key === 'end') { + date = getStartingYear( ctrl.activeDate.getFullYear() ) + range - 1; + } + ctrl.activeDate.setFullYear(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.constant('datepickerPopupConfig', { + datepickerPopup: 'yyyy-MM-dd', + currentText: 'Today', + clearText: 'Clear', + closeText: 'Done', + closeOnDateSelection: true, + appendToBody: false, + showButtonBar: true +}) + +.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'dateParser', 'datepickerPopupConfig', +function ($compile, $parse, $document, $position, dateFilter, dateParser, datepickerPopupConfig) { + return { + restrict: 'EA', + require: 'ngModel', + scope: { + isOpen: '=?', + currentText: '@', + clearText: '@', + closeText: '@', + dateDisabled: '&' + }, + link: function(scope, element, attrs, ngModel) { + var dateFormat, + closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? scope.$parent.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection, + appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? scope.$parent.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody; + + scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? scope.$parent.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar; + + scope.getText = function( key ) { + return scope[key + 'Text'] || datepickerPopupConfig[key + 'Text']; + }; + + attrs.$observe('datepickerPopup', function(value) { + dateFormat = value || datepickerPopupConfig.datepickerPopup; + ngModel.$render(); + }); + + // popup element used to display calendar + var popupEl = angular.element('
    '); + popupEl.attr({ + 'ng-model': 'date', + 'ng-change': 'dateSelection()' + }); + + function cameltoDash( string ){ + return string.replace(/([A-Z])/g, function($1) { return '-' + $1.toLowerCase(); }); + } + + // datepicker element + var datepickerEl = angular.element(popupEl.children()[0]); + if ( attrs.datepickerOptions ) { + angular.forEach(scope.$parent.$eval(attrs.datepickerOptions), function( value, option ) { + datepickerEl.attr( cameltoDash(option), value ); + }); + } + + scope.watchData = {}; + angular.forEach(['minDate', 'maxDate', 'datepickerMode'], function( key ) { + if ( attrs[key] ) { + var getAttribute = $parse(attrs[key]); + scope.$parent.$watch(getAttribute, function(value){ + scope.watchData[key] = value; + }); + datepickerEl.attr(cameltoDash(key), 'watchData.' + key); + + // Propagate changes from datepicker to outside + if ( key === 'datepickerMode' ) { + var setAttribute = getAttribute.assign; + scope.$watch('watchData.' + key, function(value, oldvalue) { + if ( value !== oldvalue ) { + setAttribute(scope.$parent, value); + } + }); + } + } + }); + if (attrs.dateDisabled) { + datepickerEl.attr('date-disabled', 'dateDisabled({ date: date, mode: mode })'); + } + + function parseDate(viewValue) { + if (!viewValue) { + ngModel.$setValidity('date', true); + return null; + } else if (angular.isDate(viewValue) && !isNaN(viewValue)) { + ngModel.$setValidity('date', true); + return viewValue; + } else if (angular.isString(viewValue)) { + var date = dateParser.parse(viewValue, dateFormat) || new Date(viewValue); + if (isNaN(date)) { + ngModel.$setValidity('date', false); + return undefined; + } else { + ngModel.$setValidity('date', true); + return date; + } + } else { + ngModel.$setValidity('date', false); + return undefined; + } + } + ngModel.$parsers.unshift(parseDate); + + // Inner change + scope.dateSelection = function(dt) { + if (angular.isDefined(dt)) { + scope.date = dt; + } + ngModel.$setViewValue(scope.date); + ngModel.$render(); + + if ( closeOnDateSelection ) { + scope.isOpen = false; + element[0].focus(); + } + }; + + element.bind('input change keyup', function() { + scope.$apply(function() { + scope.date = ngModel.$modelValue; + }); + }); + + // Outter change + ngModel.$render = function() { + var date = ngModel.$viewValue ? dateFilter(ngModel.$viewValue, dateFormat) : ''; + element.val(date); + scope.date = parseDate( ngModel.$modelValue ); + }; + + var documentClickBind = function(event) { + if (scope.isOpen && event.target !== element[0]) { + scope.$apply(function() { + scope.isOpen = false; + }); + } + }; + + var keydown = function(evt, noApply) { + scope.keydown(evt); + }; + element.bind('keydown', keydown); + + scope.keydown = function(evt) { + if (evt.which === 27) { + evt.preventDefault(); + evt.stopPropagation(); + scope.close(); + } else if (evt.which === 40 && !scope.isOpen) { + scope.isOpen = true; + } + }; + + scope.$watch('isOpen', function(value) { + if (value) { + scope.$broadcast('datepicker.focus'); + scope.position = appendToBody ? $position.offset(element) : $position.position(element); + scope.position.top = scope.position.top + element.prop('offsetHeight'); + + $document.bind('click', documentClickBind); + } else { + $document.unbind('click', documentClickBind); + } + }); + + scope.select = function( date ) { + if (date === 'today') { + var today = new Date(); + if (angular.isDate(ngModel.$modelValue)) { + date = new Date(ngModel.$modelValue); + date.setFullYear(today.getFullYear(), today.getMonth(), today.getDate()); + } else { + date = new Date(today.setHours(0, 0, 0, 0)); + } + } + scope.dateSelection( date ); + }; + + scope.close = function() { + scope.isOpen = false; + element[0].focus(); + }; + + var $popup = $compile(popupEl)(scope); + // Prevent jQuery cache memory leak (template is now redundant after linking) + popupEl.remove(); + + if ( appendToBody ) { + $document.find('body').append($popup); + } else { + element.after($popup); + } + + scope.$on('$destroy', function() { + $popup.remove(); + element.unbind('keydown', keydown); + $document.unbind('click', documentClickBind); + }); + } + }; +}]) + +.directive('datepickerPopupWrap', function() { + return { + restrict:'EA', + replace: true, + transclude: true, + templateUrl: 'template/datepicker/popup.html', + link:function (scope, element, attrs) { + element.bind('click', function(event) { + event.preventDefault(); + event.stopPropagation(); + }); + } + }; +}); + +angular.module('ui.bootstrap.dropdown', []) + +.constant('dropdownConfig', { + openClass: 'open' +}) + +.service('dropdownService', ['$document', function($document) { + var openScope = null; + + this.open = function( dropdownScope ) { + if ( !openScope ) { + $document.bind('click', closeDropdown); + $document.bind('keydown', escapeKeyBind); + } + + if ( openScope && openScope !== dropdownScope ) { + openScope.isOpen = false; + } + + openScope = dropdownScope; + }; + + this.close = function( dropdownScope ) { + if ( openScope === dropdownScope ) { + openScope = null; + $document.unbind('click', closeDropdown); + $document.unbind('keydown', escapeKeyBind); + } + }; + + var closeDropdown = function( evt ) { + // This method may still be called during the same mouse event that + // unbound this event handler. So check openScope before proceeding. + if (!openScope) { return; } + + var toggleElement = openScope.getToggleElement(); + if ( evt && toggleElement && toggleElement[0].contains(evt.target) ) { + return; + } + + openScope.$apply(function() { + openScope.isOpen = false; + }); + }; + + var escapeKeyBind = function( evt ) { + if ( evt.which === 27 ) { + openScope.focusToggleElement(); + closeDropdown(); + } + }; +}]) + +.controller('DropdownController', ['$scope', '$attrs', '$parse', 'dropdownConfig', 'dropdownService', '$animate', function($scope, $attrs, $parse, dropdownConfig, dropdownService, $animate) { + var self = this, + scope = $scope.$new(), // create a child scope so we are not polluting original one + openClass = dropdownConfig.openClass, + getIsOpen, + setIsOpen = angular.noop, + toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop; + + this.init = function( element ) { + self.$element = element; + + if ( $attrs.isOpen ) { + getIsOpen = $parse($attrs.isOpen); + setIsOpen = getIsOpen.assign; + + $scope.$watch(getIsOpen, function(value) { + scope.isOpen = !!value; + }); + } + }; + + this.toggle = function( open ) { + return scope.isOpen = arguments.length ? !!open : !scope.isOpen; + }; + + // Allow other directives to watch status + this.isOpen = function() { + return scope.isOpen; + }; + + scope.getToggleElement = function() { + return self.toggleElement; + }; + + scope.focusToggleElement = function() { + if ( self.toggleElement ) { + self.toggleElement[0].focus(); + } + }; + + scope.$watch('isOpen', function( isOpen, wasOpen ) { + $animate[isOpen ? 'addClass' : 'removeClass'](self.$element, openClass); + + if ( isOpen ) { + scope.focusToggleElement(); + dropdownService.open( scope ); + } else { + dropdownService.close( scope ); + } + + setIsOpen($scope, isOpen); + if (angular.isDefined(isOpen) && isOpen !== wasOpen) { + toggleInvoker($scope, { open: !!isOpen }); + } + }); + + $scope.$on('$locationChangeSuccess', function() { + scope.isOpen = false; + }); + + $scope.$on('$destroy', function() { + scope.$destroy(); + }); +}]) + +.directive('dropdown', function() { + return { + controller: 'DropdownController', + link: function(scope, element, attrs, dropdownCtrl) { + dropdownCtrl.init( element ); + } + }; +}) + +.directive('dropdownToggle', function() { + return { + require: '?^dropdown', + link: function(scope, element, attrs, dropdownCtrl) { + if ( !dropdownCtrl ) { + return; + } + + dropdownCtrl.toggleElement = element; + + var toggleDropdown = function(event) { + event.preventDefault(); + + if ( !element.hasClass('disabled') && !attrs.disabled ) { + scope.$apply(function() { + dropdownCtrl.toggle(); + }); + } + }; + + element.bind('click', toggleDropdown); + + // WAI-ARIA + element.attr({ 'aria-haspopup': true, 'aria-expanded': false }); + scope.$watch(dropdownCtrl.isOpen, function( isOpen ) { + element.attr('aria-expanded', !!isOpen); + }); + + scope.$on('$destroy', function() { + element.unbind('click', toggleDropdown); + }); + } + }; +}); + +angular.module('ui.bootstrap.modal', ['ui.bootstrap.transition']) + +/** + * A helper, internal data structure that acts as a map but also allows getting / removing + * elements in the LIFO order + */ + .factory('$$stackedMap', function () { + return { + createNew: function () { + var stack = []; + + return { + add: function (key, value) { + stack.push({ + key: key, + value: value + }); + }, + get: function (key) { + for (var i = 0; i < stack.length; i++) { + if (key == stack[i].key) { + return stack[i]; + } + } + }, + keys: function() { + var keys = []; + for (var i = 0; i < stack.length; i++) { + keys.push(stack[i].key); + } + return keys; + }, + top: function () { + return stack[stack.length - 1]; + }, + remove: function (key) { + var idx = -1; + for (var i = 0; i < stack.length; i++) { + if (key == stack[i].key) { + idx = i; + break; + } + } + return stack.splice(idx, 1)[0]; + }, + removeTop: function () { + return stack.splice(stack.length - 1, 1)[0]; + }, + length: function () { + return stack.length; + } + }; + } + }; + }) + +/** + * A helper directive for the $modal service. It creates a backdrop element. + */ + .directive('modalBackdrop', ['$timeout', function ($timeout) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/modal/backdrop.html', + link: function (scope, element, attrs) { + scope.backdropClass = attrs.backdropClass || ''; + + scope.animate = false; + + //trigger CSS transitions + $timeout(function () { + scope.animate = true; + }); + } + }; + }]) + + .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) { + return { + restrict: 'EA', + scope: { + index: '@', + animate: '=' + }, + replace: true, + transclude: true, + templateUrl: function(tElement, tAttrs) { + return tAttrs.templateUrl || 'template/modal/window.html'; + }, + link: function (scope, element, attrs) { + element.addClass(attrs.windowClass || ''); + scope.size = attrs.size; + + $timeout(function () { + // trigger CSS transitions + scope.animate = true; + + /** + * Auto-focusing of a freshly-opened modal element causes any child elements + * with the autofocus attribute to lose focus. This is an issue on touch + * based devices which will show and then hide the onscreen keyboard. + * Attempts to refocus the autofocus element via JavaScript will not reopen + * the onscreen keyboard. Fixed by updated the focusing logic to only autofocus + * the modal element if the modal does not contain an autofocus element. + */ + if (!element[0].querySelectorAll('[autofocus]').length) { + element[0].focus(); + } + }); + + scope.close = function (evt) { + var modal = $modalStack.getTop(); + if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) { + evt.preventDefault(); + evt.stopPropagation(); + $modalStack.dismiss(modal.key, 'backdrop click'); + } + }; + } + }; + }]) + + .directive('modalTransclude', function () { + return { + link: function($scope, $element, $attrs, controller, $transclude) { + $transclude($scope.$parent, function(clone) { + $element.empty(); + $element.append(clone); + }); + } + }; + }) + + .factory('$modalStack', ['$transition', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap', + function ($transition, $timeout, $document, $compile, $rootScope, $$stackedMap) { + + var OPENED_MODAL_CLASS = 'modal-open'; + + var backdropDomEl, backdropScope; + var openedWindows = $$stackedMap.createNew(); + var $modalStack = {}; + + function backdropIndex() { + var topBackdropIndex = -1; + var opened = openedWindows.keys(); + for (var i = 0; i < opened.length; i++) { + if (openedWindows.get(opened[i]).value.backdrop) { + topBackdropIndex = i; + } + } + return topBackdropIndex; + } + + $rootScope.$watch(backdropIndex, function(newBackdropIndex){ + if (backdropScope) { + backdropScope.index = newBackdropIndex; + } + }); + + function removeModalWindow(modalInstance) { + + var body = $document.find('body').eq(0); + var modalWindow = openedWindows.get(modalInstance).value; + + //clean up the stack + openedWindows.remove(modalInstance); + + //remove window DOM element + removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, 300, function() { + modalWindow.modalScope.$destroy(); + body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0); + checkRemoveBackdrop(); + }); + } + + function checkRemoveBackdrop() { + //remove backdrop if no longer needed + if (backdropDomEl && backdropIndex() == -1) { + var backdropScopeRef = backdropScope; + removeAfterAnimate(backdropDomEl, backdropScope, 150, function () { + backdropScopeRef.$destroy(); + backdropScopeRef = null; + }); + backdropDomEl = undefined; + backdropScope = undefined; + } + } + + function removeAfterAnimate(domEl, scope, emulateTime, done) { + // Closing animation + scope.animate = false; + + var transitionEndEventName = $transition.transitionEndEventName; + if (transitionEndEventName) { + // transition out + var timeout = $timeout(afterAnimating, emulateTime); + + domEl.bind(transitionEndEventName, function () { + $timeout.cancel(timeout); + afterAnimating(); + scope.$apply(); + }); + } else { + // Ensure this call is async + $timeout(afterAnimating); + } + + function afterAnimating() { + if (afterAnimating.done) { + return; + } + afterAnimating.done = true; + + domEl.remove(); + if (done) { + done(); + } + } + } + + $document.bind('keydown', function (evt) { + var modal; + + if (evt.which === 27) { + modal = openedWindows.top(); + if (modal && modal.value.keyboard) { + evt.preventDefault(); + $rootScope.$apply(function () { + $modalStack.dismiss(modal.key, 'escape key press'); + }); + } + } + }); + + $modalStack.open = function (modalInstance, modal) { + + openedWindows.add(modalInstance, { + deferred: modal.deferred, + modalScope: modal.scope, + backdrop: modal.backdrop, + keyboard: modal.keyboard + }); + + var body = $document.find('body').eq(0), + currBackdropIndex = backdropIndex(); + + if (currBackdropIndex >= 0 && !backdropDomEl) { + backdropScope = $rootScope.$new(true); + backdropScope.index = currBackdropIndex; + var angularBackgroundDomEl = angular.element('
    '); + angularBackgroundDomEl.attr('backdrop-class', modal.backdropClass); + backdropDomEl = $compile(angularBackgroundDomEl)(backdropScope); + body.append(backdropDomEl); + } + + var angularDomEl = angular.element('
    '); + angularDomEl.attr({ + 'template-url': modal.windowTemplateUrl, + 'window-class': modal.windowClass, + 'size': modal.size, + 'index': openedWindows.length() - 1, + 'animate': 'animate' + }).html(modal.content); + + var modalDomEl = $compile(angularDomEl)(modal.scope); + openedWindows.top().value.modalDomEl = modalDomEl; + body.append(modalDomEl); + body.addClass(OPENED_MODAL_CLASS); + }; + + $modalStack.close = function (modalInstance, result) { + var modalWindow = openedWindows.get(modalInstance); + if (modalWindow) { + modalWindow.value.deferred.resolve(result); + removeModalWindow(modalInstance); + } + }; + + $modalStack.dismiss = function (modalInstance, reason) { + var modalWindow = openedWindows.get(modalInstance); + if (modalWindow) { + modalWindow.value.deferred.reject(reason); + removeModalWindow(modalInstance); + } + }; + + $modalStack.dismissAll = function (reason) { + var topModal = this.getTop(); + while (topModal) { + this.dismiss(topModal.key, reason); + topModal = this.getTop(); + } + }; + + $modalStack.getTop = function () { + return openedWindows.top(); + }; + + return $modalStack; + }]) + + .provider('$modal', function () { + + var $modalProvider = { + options: { + backdrop: true, //can be also false or 'static' + keyboard: true + }, + $get: ['$injector', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$modalStack', + function ($injector, $rootScope, $q, $http, $templateCache, $controller, $modalStack) { + + var $modal = {}; + + function getTemplatePromise(options) { + return options.template ? $q.when(options.template) : + $http.get(angular.isFunction(options.templateUrl) ? (options.templateUrl)() : options.templateUrl, + {cache: $templateCache}).then(function (result) { + return result.data; + }); + } + + function getResolvePromises(resolves) { + var promisesArr = []; + angular.forEach(resolves, function (value) { + if (angular.isFunction(value) || angular.isArray(value)) { + promisesArr.push($q.when($injector.invoke(value))); + } + }); + return promisesArr; + } + + $modal.open = function (modalOptions) { + + var modalResultDeferred = $q.defer(); + var modalOpenedDeferred = $q.defer(); + + //prepare an instance of a modal to be injected into controllers and returned to a caller + var modalInstance = { + result: modalResultDeferred.promise, + opened: modalOpenedDeferred.promise, + close: function (result) { + $modalStack.close(modalInstance, result); + }, + dismiss: function (reason) { + $modalStack.dismiss(modalInstance, reason); + } + }; + + //merge and clean up options + modalOptions = angular.extend({}, $modalProvider.options, modalOptions); + modalOptions.resolve = modalOptions.resolve || {}; + + //verify options + if (!modalOptions.template && !modalOptions.templateUrl) { + throw new Error('One of template or templateUrl options is required.'); + } + + var templateAndResolvePromise = + $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve))); + + + templateAndResolvePromise.then(function resolveSuccess(tplAndVars) { + + var modalScope = (modalOptions.scope || $rootScope).$new(); + modalScope.$close = modalInstance.close; + modalScope.$dismiss = modalInstance.dismiss; + + var ctrlInstance, ctrlLocals = {}; + var resolveIter = 1; + + //controllers + if (modalOptions.controller) { + ctrlLocals.$scope = modalScope; + ctrlLocals.$modalInstance = modalInstance; + angular.forEach(modalOptions.resolve, function (value, key) { + ctrlLocals[key] = tplAndVars[resolveIter++]; + }); + + ctrlInstance = $controller(modalOptions.controller, ctrlLocals); + if (modalOptions.controllerAs) { + modalScope[modalOptions.controllerAs] = ctrlInstance; + } + } + + $modalStack.open(modalInstance, { + scope: modalScope, + deferred: modalResultDeferred, + content: tplAndVars[0], + backdrop: modalOptions.backdrop, + keyboard: modalOptions.keyboard, + backdropClass: modalOptions.backdropClass, + windowClass: modalOptions.windowClass, + windowTemplateUrl: modalOptions.windowTemplateUrl, + size: modalOptions.size + }); + + }, function resolveError(reason) { + modalResultDeferred.reject(reason); + }); + + templateAndResolvePromise.then(function () { + modalOpenedDeferred.resolve(true); + }, function () { + modalOpenedDeferred.reject(false); + }); + + return modalInstance; + }; + + return $modal; + }] + }; + + return $modalProvider; + }); + +angular.module('ui.bootstrap.pagination', []) + +.controller('PaginationController', ['$scope', '$attrs', '$parse', function ($scope, $attrs, $parse) { + var self = this, + ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl + setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop; + + this.init = function(ngModelCtrl_, config) { + ngModelCtrl = ngModelCtrl_; + this.config = config; + + ngModelCtrl.$render = function() { + self.render(); + }; + + if ($attrs.itemsPerPage) { + $scope.$parent.$watch($parse($attrs.itemsPerPage), function(value) { + self.itemsPerPage = parseInt(value, 10); + $scope.totalPages = self.calculateTotalPages(); + }); + } else { + this.itemsPerPage = config.itemsPerPage; + } + }; + + this.calculateTotalPages = function() { + var totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / this.itemsPerPage); + return Math.max(totalPages || 0, 1); + }; + + this.render = function() { + $scope.page = parseInt(ngModelCtrl.$viewValue, 10) || 1; + }; + + $scope.selectPage = function(page) { + if ( $scope.page !== page && page > 0 && page <= $scope.totalPages) { + ngModelCtrl.$setViewValue(page); + ngModelCtrl.$render(); + } + }; + + $scope.getText = function( key ) { + return $scope[key + 'Text'] || self.config[key + 'Text']; + }; + $scope.noPrevious = function() { + return $scope.page === 1; + }; + $scope.noNext = function() { + return $scope.page === $scope.totalPages; + }; + + $scope.$watch('totalItems', function() { + $scope.totalPages = self.calculateTotalPages(); + }); + + $scope.$watch('totalPages', function(value) { + setNumPages($scope.$parent, value); // Readonly variable + + if ( $scope.page > value ) { + $scope.selectPage(value); + } else { + ngModelCtrl.$render(); + } + }); +}]) + +.constant('paginationConfig', { + itemsPerPage: 10, + boundaryLinks: false, + directionLinks: true, + firstText: 'First', + previousText: 'Previous', + nextText: 'Next', + lastText: 'Last', + rotate: true +}) + +.directive('pagination', ['$parse', 'paginationConfig', function($parse, paginationConfig) { + return { + restrict: 'EA', + scope: { + totalItems: '=', + firstText: '@', + previousText: '@', + nextText: '@', + lastText: '@' + }, + require: ['pagination', '?ngModel'], + controller: 'PaginationController', + templateUrl: 'template/pagination/pagination.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if (!ngModelCtrl) { + return; // do nothing if no ng-model + } + + // Setup configuration parameters + var maxSize = angular.isDefined(attrs.maxSize) ? scope.$parent.$eval(attrs.maxSize) : paginationConfig.maxSize, + rotate = angular.isDefined(attrs.rotate) ? scope.$parent.$eval(attrs.rotate) : paginationConfig.rotate; + scope.boundaryLinks = angular.isDefined(attrs.boundaryLinks) ? scope.$parent.$eval(attrs.boundaryLinks) : paginationConfig.boundaryLinks; + scope.directionLinks = angular.isDefined(attrs.directionLinks) ? scope.$parent.$eval(attrs.directionLinks) : paginationConfig.directionLinks; + + paginationCtrl.init(ngModelCtrl, paginationConfig); + + if (attrs.maxSize) { + scope.$parent.$watch($parse(attrs.maxSize), function(value) { + maxSize = parseInt(value, 10); + paginationCtrl.render(); + }); + } + + // Create page object used in template + function makePage(number, text, isActive) { + return { + number: number, + text: text, + active: isActive + }; + } + + function getPages(currentPage, totalPages) { + var pages = []; + + // Default page limits + var startPage = 1, endPage = totalPages; + var isMaxSized = ( angular.isDefined(maxSize) && maxSize < totalPages ); + + // recompute if maxSize + if ( isMaxSized ) { + if ( rotate ) { + // Current page is displayed in the middle of the visible ones + startPage = Math.max(currentPage - Math.floor(maxSize/2), 1); + endPage = startPage + maxSize - 1; + + // Adjust if limit is exceeded + if (endPage > totalPages) { + endPage = totalPages; + startPage = endPage - maxSize + 1; + } + } else { + // Visible pages are paginated with maxSize + startPage = ((Math.ceil(currentPage / maxSize) - 1) * maxSize) + 1; + + // Adjust last page if limit is exceeded + endPage = Math.min(startPage + maxSize - 1, totalPages); + } + } + + // Add page number links + for (var number = startPage; number <= endPage; number++) { + var page = makePage(number, number, number === currentPage); + pages.push(page); + } + + // Add links to move between page sets + if ( isMaxSized && ! rotate ) { + if ( startPage > 1 ) { + var previousPageSet = makePage(startPage - 1, '...', false); + pages.unshift(previousPageSet); + } + + if ( endPage < totalPages ) { + var nextPageSet = makePage(endPage + 1, '...', false); + pages.push(nextPageSet); + } + } + + return pages; + } + + var originalRender = paginationCtrl.render; + paginationCtrl.render = function() { + originalRender(); + if (scope.page > 0 && scope.page <= scope.totalPages) { + scope.pages = getPages(scope.page, scope.totalPages); + } + }; + } + }; +}]) + +.constant('pagerConfig', { + itemsPerPage: 10, + previousText: '« Previous', + nextText: 'Next »', + align: true +}) + +.directive('pager', ['pagerConfig', function(pagerConfig) { + return { + restrict: 'EA', + scope: { + totalItems: '=', + previousText: '@', + nextText: '@' + }, + require: ['pager', '?ngModel'], + controller: 'PaginationController', + templateUrl: 'template/pagination/pager.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if (!ngModelCtrl) { + return; // do nothing if no ng-model + } + + scope.align = angular.isDefined(attrs.align) ? scope.$parent.$eval(attrs.align) : pagerConfig.align; + paginationCtrl.init(ngModelCtrl, pagerConfig); + } + }; +}]); + +/** + * The following features are still outstanding: animation as a + * function, placement as a function, inside, support for more triggers than + * just mouse enter/leave, html tooltips, and selector delegation. + */ +angular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] ) + +/** + * The $tooltip service creates tooltip- and popover-like directives as well as + * houses global options for them. + */ +.provider( '$tooltip', function () { + // The default options tooltip and popover. + var defaultOptions = { + placement: 'top', + animation: true, + popupDelay: 0 + }; + + // Default hide triggers for each show trigger + var triggerMap = { + 'mouseenter': 'mouseleave', + 'click': 'click', + 'focus': 'blur' + }; + + // The options specified to the provider globally. + var globalOptions = {}; + + /** + * `options({})` allows global configuration of all tooltips in the + * application. + * + * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) { + * // place tooltips left instead of top by default + * $tooltipProvider.options( { placement: 'left' } ); + * }); + */ + this.options = function( value ) { + angular.extend( globalOptions, value ); + }; + + /** + * This allows you to extend the set of trigger mappings available. E.g.: + * + * $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' ); + */ + this.setTriggers = function setTriggers ( triggers ) { + angular.extend( triggerMap, triggers ); + }; + + /** + * This is a helper function for translating camel-case to snake-case. + */ + function snake_case(name){ + var regexp = /[A-Z]/g; + var separator = '-'; + return name.replace(regexp, function(letter, pos) { + return (pos ? separator : '') + letter.toLowerCase(); + }); + } + + /** + * Returns the actual instance of the $tooltip service. + * TODO support multiple triggers + */ + this.$get = [ '$window', '$compile', '$timeout', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $document, $position, $interpolate ) { + return function $tooltip ( type, prefix, defaultTriggerShow ) { + var options = angular.extend( {}, defaultOptions, globalOptions ); + + /** + * Returns an object of show and hide triggers. + * + * If a trigger is supplied, + * it is used to show the tooltip; otherwise, it will use the `trigger` + * option passed to the `$tooltipProvider.options` method; else it will + * default to the trigger supplied to this directive factory. + * + * The hide trigger is based on the show trigger. If the `trigger` option + * was passed to the `$tooltipProvider.options` method, it will use the + * mapped trigger from `triggerMap` or the passed trigger if the map is + * undefined; otherwise, it uses the `triggerMap` value of the show + * trigger; else it will just use the show trigger. + */ + function getTriggers ( trigger ) { + var show = trigger || options.trigger || defaultTriggerShow; + var hide = triggerMap[show] || show; + return { + show: show, + hide: hide + }; + } + + var directiveName = snake_case( type ); + + var startSym = $interpolate.startSymbol(); + var endSym = $interpolate.endSymbol(); + var template = + '
    '+ + '
    '; + + return { + restrict: 'EA', + compile: function (tElem, tAttrs) { + var tooltipLinker = $compile( template ); + + return function link ( scope, element, attrs ) { + var tooltip; + var tooltipLinkedScope; + var transitionTimeout; + var popupTimeout; + var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false; + var triggers = getTriggers( undefined ); + var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']); + var ttScope = scope.$new(true); + + var positionTooltip = function () { + + var ttPosition = $position.positionElements(element, tooltip, ttScope.placement, appendToBody); + ttPosition.top += 'px'; + ttPosition.left += 'px'; + + // Now set the calculated positioning. + tooltip.css( ttPosition ); + }; + + // By default, the tooltip is not open. + // TODO add ability to start tooltip opened + ttScope.isOpen = false; + + function toggleTooltipBind () { + if ( ! ttScope.isOpen ) { + showTooltipBind(); + } else { + hideTooltipBind(); + } + } + + // Show the tooltip with delay if specified, otherwise show it immediately + function showTooltipBind() { + if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) { + return; + } + + prepareTooltip(); + + if ( ttScope.popupDelay ) { + // Do nothing if the tooltip was already scheduled to pop-up. + // This happens if show is triggered multiple times before any hide is triggered. + if (!popupTimeout) { + popupTimeout = $timeout( show, ttScope.popupDelay, false ); + popupTimeout.then(function(reposition){reposition();}); + } + } else { + show()(); + } + } + + function hideTooltipBind () { + scope.$apply(function () { + hide(); + }); + } + + // Show the tooltip popup element. + function show() { + + popupTimeout = null; + + // If there is a pending remove transition, we must cancel it, lest the + // tooltip be mysteriously removed. + if ( transitionTimeout ) { + $timeout.cancel( transitionTimeout ); + transitionTimeout = null; + } + + // Don't show empty tooltips. + if ( ! ttScope.content ) { + return angular.noop; + } + + createTooltip(); + + // Set the initial positioning. + tooltip.css({ top: 0, left: 0, display: 'block' }); + ttScope.$digest(); + + positionTooltip(); + + // And show the tooltip. + ttScope.isOpen = true; + ttScope.$digest(); // digest required as $apply is not called + + // Return positioning function as promise callback for correct + // positioning after draw. + return positionTooltip; + } + + // Hide the tooltip popup element. + function hide() { + // First things first: we don't show it anymore. + ttScope.isOpen = false; + + //if tooltip is going to be shown after delay, we must cancel this + $timeout.cancel( popupTimeout ); + popupTimeout = null; + + // And now we remove it from the DOM. However, if we have animation, we + // need to wait for it to expire beforehand. + // FIXME: this is a placeholder for a port of the transitions library. + if ( ttScope.animation ) { + if (!transitionTimeout) { + transitionTimeout = $timeout(removeTooltip, 500); + } + } else { + removeTooltip(); + } + } + + function createTooltip() { + // There can only be one tooltip element per directive shown at once. + if (tooltip) { + removeTooltip(); + } + tooltipLinkedScope = ttScope.$new(); + tooltip = tooltipLinker(tooltipLinkedScope, function (tooltip) { + if ( appendToBody ) { + $document.find( 'body' ).append( tooltip ); + } else { + element.after( tooltip ); + } + }); + } + + function removeTooltip() { + transitionTimeout = null; + if (tooltip) { + tooltip.remove(); + tooltip = null; + } + if (tooltipLinkedScope) { + tooltipLinkedScope.$destroy(); + tooltipLinkedScope = null; + } + } + + function prepareTooltip() { + prepPlacement(); + prepPopupDelay(); + } + + /** + * Observe the relevant attributes. + */ + attrs.$observe( type, function ( val ) { + ttScope.content = val; + + if (!val && ttScope.isOpen ) { + hide(); + } + }); + + attrs.$observe( prefix+'Title', function ( val ) { + ttScope.title = val; + }); + + function prepPlacement() { + var val = attrs[ prefix + 'Placement' ]; + ttScope.placement = angular.isDefined( val ) ? val : options.placement; + } + + function prepPopupDelay() { + var val = attrs[ prefix + 'PopupDelay' ]; + var delay = parseInt( val, 10 ); + ttScope.popupDelay = ! isNaN(delay) ? delay : options.popupDelay; + } + + var unregisterTriggers = function () { + element.unbind(triggers.show, showTooltipBind); + element.unbind(triggers.hide, hideTooltipBind); + }; + + function prepTriggers() { + var val = attrs[ prefix + 'Trigger' ]; + unregisterTriggers(); + + triggers = getTriggers( val ); + + if ( triggers.show === triggers.hide ) { + element.bind( triggers.show, toggleTooltipBind ); + } else { + element.bind( triggers.show, showTooltipBind ); + element.bind( triggers.hide, hideTooltipBind ); + } + } + prepTriggers(); + + var animation = scope.$eval(attrs[prefix + 'Animation']); + ttScope.animation = angular.isDefined(animation) ? !!animation : options.animation; + + var appendToBodyVal = scope.$eval(attrs[prefix + 'AppendToBody']); + appendToBody = angular.isDefined(appendToBodyVal) ? appendToBodyVal : appendToBody; + + // if a tooltip is attached to we need to remove it on + // location change as its parent scope will probably not be destroyed + // by the change. + if ( appendToBody ) { + scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () { + if ( ttScope.isOpen ) { + hide(); + } + }); + } + + // Make sure tooltip is destroyed and removed. + scope.$on('$destroy', function onDestroyTooltip() { + $timeout.cancel( transitionTimeout ); + $timeout.cancel( popupTimeout ); + unregisterTriggers(); + removeTooltip(); + ttScope = null; + }); + }; + } + }; + }; + }]; +}) + +.directive( 'tooltipPopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/tooltip/tooltip-popup.html' + }; +}) + +.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'tooltip', 'tooltip', 'mouseenter' ); +}]) + +.directive( 'tooltipHtmlUnsafePopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html' + }; +}) + +.directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' ); +}]); + +/** + * The following features are still outstanding: popup delay, animation as a + * function, placement as a function, inside, support for more triggers than + * just mouse enter/leave, html popovers, and selector delegatation. + */ +angular.module( 'ui.bootstrap.popover', [ 'ui.bootstrap.tooltip' ] ) + +.directive( 'popoverPopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/popover/popover.html' + }; +}) + +.directive( 'popover', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'popover', 'popover', 'click' ); +}]); + +angular.module('ui.bootstrap.progressbar', []) + +.constant('progressConfig', { + animate: true, + max: 100 +}) + +.controller('ProgressController', ['$scope', '$attrs', 'progressConfig', function($scope, $attrs, progressConfig) { + var self = this, + animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate; + + this.bars = []; + $scope.max = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : progressConfig.max; + + this.addBar = function(bar, element) { + if ( !animate ) { + element.css({'transition': 'none'}); + } + + this.bars.push(bar); + + bar.$watch('value', function( value ) { + bar.percent = +(100 * value / $scope.max).toFixed(2); + }); + + bar.$on('$destroy', function() { + element = null; + self.removeBar(bar); + }); + }; + + this.removeBar = function(bar) { + this.bars.splice(this.bars.indexOf(bar), 1); + }; +}]) + +.directive('progress', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + controller: 'ProgressController', + require: 'progress', + scope: {}, + templateUrl: 'template/progressbar/progress.html' + }; +}) + +.directive('bar', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + require: '^progress', + scope: { + value: '=', + type: '@' + }, + templateUrl: 'template/progressbar/bar.html', + link: function(scope, element, attrs, progressCtrl) { + progressCtrl.addBar(scope, element); + } + }; +}) + +.directive('progressbar', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + controller: 'ProgressController', + scope: { + value: '=', + type: '@' + }, + templateUrl: 'template/progressbar/progressbar.html', + link: function(scope, element, attrs, progressCtrl) { + progressCtrl.addBar(scope, angular.element(element.children()[0])); + } + }; +}); +angular.module('ui.bootstrap.rating', []) + +.constant('ratingConfig', { + max: 5, + stateOn: null, + stateOff: null +}) + +.controller('RatingController', ['$scope', '$attrs', 'ratingConfig', function($scope, $attrs, ratingConfig) { + var ngModelCtrl = { $setViewValue: angular.noop }; + + this.init = function(ngModelCtrl_) { + ngModelCtrl = ngModelCtrl_; + ngModelCtrl.$render = this.render; + + this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn; + this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff; + + var ratingStates = angular.isDefined($attrs.ratingStates) ? $scope.$parent.$eval($attrs.ratingStates) : + new Array( angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max ); + $scope.range = this.buildTemplateObjects(ratingStates); + }; + + this.buildTemplateObjects = function(states) { + for (var i = 0, n = states.length; i < n; i++) { + states[i] = angular.extend({ index: i }, { stateOn: this.stateOn, stateOff: this.stateOff }, states[i]); + } + return states; + }; + + $scope.rate = function(value) { + if ( !$scope.readonly && value >= 0 && value <= $scope.range.length ) { + ngModelCtrl.$setViewValue(value); + ngModelCtrl.$render(); + } + }; + + $scope.enter = function(value) { + if ( !$scope.readonly ) { + $scope.value = value; + } + $scope.onHover({value: value}); + }; + + $scope.reset = function() { + $scope.value = ngModelCtrl.$viewValue; + $scope.onLeave(); + }; + + $scope.onKeydown = function(evt) { + if (/(37|38|39|40)/.test(evt.which)) { + evt.preventDefault(); + evt.stopPropagation(); + $scope.rate( $scope.value + (evt.which === 38 || evt.which === 39 ? 1 : -1) ); + } + }; + + this.render = function() { + $scope.value = ngModelCtrl.$viewValue; + }; +}]) + +.directive('rating', function() { + return { + restrict: 'EA', + require: ['rating', 'ngModel'], + scope: { + readonly: '=?', + onHover: '&', + onLeave: '&' + }, + controller: 'RatingController', + templateUrl: 'template/rating/rating.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var ratingCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + ratingCtrl.init( ngModelCtrl ); + } + } + }; +}); + +/** + * @ngdoc overview + * @name ui.bootstrap.tabs + * + * @description + * AngularJS version of the tabs directive. + */ + +angular.module('ui.bootstrap.tabs', []) + +.controller('TabsetController', ['$scope', function TabsetCtrl($scope) { + var ctrl = this, + tabs = ctrl.tabs = $scope.tabs = []; + + ctrl.select = function(selectedTab) { + angular.forEach(tabs, function(tab) { + if (tab.active && tab !== selectedTab) { + tab.active = false; + tab.onDeselect(); + } + }); + selectedTab.active = true; + selectedTab.onSelect(); + }; + + ctrl.addTab = function addTab(tab) { + tabs.push(tab); + // we can't run the select function on the first tab + // since that would select it twice + if (tabs.length === 1) { + tab.active = true; + } else if (tab.active) { + ctrl.select(tab); + } + }; + + ctrl.removeTab = function removeTab(tab) { + var index = tabs.indexOf(tab); + //Select a new tab if the tab to be removed is selected and not destroyed + if (tab.active && tabs.length > 1 && !destroyed) { + //If this is the last tab, select the previous tab. else, the next tab. + var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1; + ctrl.select(tabs[newActiveIndex]); + } + tabs.splice(index, 1); + }; + + var destroyed; + $scope.$on('$destroy', function() { + destroyed = true; + }); +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tabset + * @restrict EA + * + * @description + * Tabset is the outer container for the tabs directive + * + * @param {boolean=} vertical Whether or not to use vertical styling for the tabs. + * @param {boolean=} justified Whether or not to use justified styling for the tabs. + * + * @example + + + + First Content! + Second Content! + +
    + + First Vertical Content! + Second Vertical Content! + + + First Justified Content! + Second Justified Content! + +
    +
    + */ +.directive('tabset', function() { + return { + restrict: 'EA', + transclude: true, + replace: true, + scope: { + type: '@' + }, + controller: 'TabsetController', + templateUrl: 'template/tabs/tabset.html', + link: function(scope, element, attrs) { + scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false; + scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false; + } + }; +}) + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tab + * @restrict EA + * + * @param {string=} heading The visible heading, or title, of the tab. Set HTML headings with {@link ui.bootstrap.tabs.directive:tabHeading tabHeading}. + * @param {string=} select An expression to evaluate when the tab is selected. + * @param {boolean=} active A binding, telling whether or not this tab is selected. + * @param {boolean=} disabled A binding, telling whether or not this tab is disabled. + * + * @description + * Creates a tab with a heading and content. Must be placed within a {@link ui.bootstrap.tabs.directive:tabset tabset}. + * + * @example + + +
    + + +
    + + First Tab + + Alert me! + Second Tab, with alert callback and html heading! + + + {{item.content}} + + +
    +
    + + function TabsDemoCtrl($scope) { + $scope.items = [ + { title:"Dynamic Title 1", content:"Dynamic Item 0" }, + { title:"Dynamic Title 2", content:"Dynamic Item 1", disabled: true } + ]; + + $scope.alertMe = function() { + setTimeout(function() { + alert("You've selected the alert tab!"); + }); + }; + }; + +
    + */ + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tabHeading + * @restrict EA + * + * @description + * Creates an HTML heading for a {@link ui.bootstrap.tabs.directive:tab tab}. Must be placed as a child of a tab element. + * + * @example + + + + + HTML in my titles?! + And some content, too! + + + Icon heading?!? + That's right. + + + + + */ +.directive('tab', ['$parse', function($parse) { + return { + require: '^tabset', + restrict: 'EA', + replace: true, + templateUrl: 'template/tabs/tab.html', + transclude: true, + scope: { + active: '=?', + heading: '@', + onSelect: '&select', //This callback is called in contentHeadingTransclude + //once it inserts the tab's content into the dom + onDeselect: '&deselect' + }, + controller: function() { + //Empty controller so other directives can require being 'under' a tab + }, + compile: function(elm, attrs, transclude) { + return function postLink(scope, elm, attrs, tabsetCtrl) { + scope.$watch('active', function(active) { + if (active) { + tabsetCtrl.select(scope); + } + }); + + scope.disabled = false; + if ( attrs.disabled ) { + scope.$parent.$watch($parse(attrs.disabled), function(value) { + scope.disabled = !! value; + }); + } + + scope.select = function() { + if ( !scope.disabled ) { + scope.active = true; + } + }; + + tabsetCtrl.addTab(scope); + scope.$on('$destroy', function() { + tabsetCtrl.removeTab(scope); + }); + + //We need to transclude later, once the content container is ready. + //when this link happens, we're inside a tab heading. + scope.$transcludeFn = transclude; + }; + } + }; +}]) + +.directive('tabHeadingTransclude', [function() { + return { + restrict: 'A', + require: '^tab', + link: function(scope, elm, attrs, tabCtrl) { + scope.$watch('headingElement', function updateHeadingElement(heading) { + if (heading) { + elm.html(''); + elm.append(heading); + } + }); + } + }; +}]) + +.directive('tabContentTransclude', function() { + return { + restrict: 'A', + require: '^tabset', + link: function(scope, elm, attrs) { + var tab = scope.$eval(attrs.tabContentTransclude); + + //Now our tab is ready to be transcluded: both the tab heading area + //and the tab content area are loaded. Transclude 'em both. + tab.$transcludeFn(tab.$parent, function(contents) { + angular.forEach(contents, function(node) { + if (isTabHeading(node)) { + //Let tabHeadingTransclude know. + tab.headingElement = node; + } else { + elm.append(node); + } + }); + }); + } + }; + function isTabHeading(node) { + return node.tagName && ( + node.hasAttribute('tab-heading') || + node.hasAttribute('data-tab-heading') || + node.tagName.toLowerCase() === 'tab-heading' || + node.tagName.toLowerCase() === 'data-tab-heading' + ); + } +}) + +; + +angular.module('ui.bootstrap.timepicker', []) + +.constant('timepickerConfig', { + hourStep: 1, + minuteStep: 1, + showMeridian: true, + meridians: null, + readonlyInput: false, + mousewheel: true +}) + +.controller('TimepickerController', ['$scope', '$attrs', '$parse', '$log', '$locale', 'timepickerConfig', function($scope, $attrs, $parse, $log, $locale, timepickerConfig) { + var selected = new Date(), + ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl + meridians = angular.isDefined($attrs.meridians) ? $scope.$parent.$eval($attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS; + + this.init = function( ngModelCtrl_, inputs ) { + ngModelCtrl = ngModelCtrl_; + ngModelCtrl.$render = this.render; + + var hoursInputEl = inputs.eq(0), + minutesInputEl = inputs.eq(1); + + var mousewheel = angular.isDefined($attrs.mousewheel) ? $scope.$parent.$eval($attrs.mousewheel) : timepickerConfig.mousewheel; + if ( mousewheel ) { + this.setupMousewheelEvents( hoursInputEl, minutesInputEl ); + } + + $scope.readonlyInput = angular.isDefined($attrs.readonlyInput) ? $scope.$parent.$eval($attrs.readonlyInput) : timepickerConfig.readonlyInput; + this.setupInputEvents( hoursInputEl, minutesInputEl ); + }; + + var hourStep = timepickerConfig.hourStep; + if ($attrs.hourStep) { + $scope.$parent.$watch($parse($attrs.hourStep), function(value) { + hourStep = parseInt(value, 10); + }); + } + + var minuteStep = timepickerConfig.minuteStep; + if ($attrs.minuteStep) { + $scope.$parent.$watch($parse($attrs.minuteStep), function(value) { + minuteStep = parseInt(value, 10); + }); + } + + // 12H / 24H mode + $scope.showMeridian = timepickerConfig.showMeridian; + if ($attrs.showMeridian) { + $scope.$parent.$watch($parse($attrs.showMeridian), function(value) { + $scope.showMeridian = !!value; + + if ( ngModelCtrl.$error.time ) { + // Evaluate from template + var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate(); + if (angular.isDefined( hours ) && angular.isDefined( minutes )) { + selected.setHours( hours ); + refresh(); + } + } else { + updateTemplate(); + } + }); + } + + // Get $scope.hours in 24H mode if valid + function getHoursFromTemplate ( ) { + var hours = parseInt( $scope.hours, 10 ); + var valid = ( $scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24); + if ( !valid ) { + return undefined; + } + + if ( $scope.showMeridian ) { + if ( hours === 12 ) { + hours = 0; + } + if ( $scope.meridian === meridians[1] ) { + hours = hours + 12; + } + } + return hours; + } + + function getMinutesFromTemplate() { + var minutes = parseInt($scope.minutes, 10); + return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined; + } + + function pad( value ) { + return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value; + } + + // Respond on mousewheel spin + this.setupMousewheelEvents = function( hoursInputEl, minutesInputEl ) { + var isScrollingUp = function(e) { + if (e.originalEvent) { + e = e.originalEvent; + } + //pick correct delta variable depending on event + var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY; + return (e.detail || delta > 0); + }; + + hoursInputEl.bind('mousewheel wheel', function(e) { + $scope.$apply( (isScrollingUp(e)) ? $scope.incrementHours() : $scope.decrementHours() ); + e.preventDefault(); + }); + + minutesInputEl.bind('mousewheel wheel', function(e) { + $scope.$apply( (isScrollingUp(e)) ? $scope.incrementMinutes() : $scope.decrementMinutes() ); + e.preventDefault(); + }); + + }; + + this.setupInputEvents = function( hoursInputEl, minutesInputEl ) { + if ( $scope.readonlyInput ) { + $scope.updateHours = angular.noop; + $scope.updateMinutes = angular.noop; + return; + } + + var invalidate = function(invalidHours, invalidMinutes) { + ngModelCtrl.$setViewValue( null ); + ngModelCtrl.$setValidity('time', false); + if (angular.isDefined(invalidHours)) { + $scope.invalidHours = invalidHours; + } + if (angular.isDefined(invalidMinutes)) { + $scope.invalidMinutes = invalidMinutes; + } + }; + + $scope.updateHours = function() { + var hours = getHoursFromTemplate(); + + if ( angular.isDefined(hours) ) { + selected.setHours( hours ); + refresh( 'h' ); + } else { + invalidate(true); + } + }; + + hoursInputEl.bind('blur', function(e) { + if ( !$scope.invalidHours && $scope.hours < 10) { + $scope.$apply( function() { + $scope.hours = pad( $scope.hours ); + }); + } + }); + + $scope.updateMinutes = function() { + var minutes = getMinutesFromTemplate(); + + if ( angular.isDefined(minutes) ) { + selected.setMinutes( minutes ); + refresh( 'm' ); + } else { + invalidate(undefined, true); + } + }; + + minutesInputEl.bind('blur', function(e) { + if ( !$scope.invalidMinutes && $scope.minutes < 10 ) { + $scope.$apply( function() { + $scope.minutes = pad( $scope.minutes ); + }); + } + }); + + }; + + this.render = function() { + var date = ngModelCtrl.$modelValue ? new Date( ngModelCtrl.$modelValue ) : null; + + if ( isNaN(date) ) { + ngModelCtrl.$setValidity('time', false); + $log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); + } else { + if ( date ) { + selected = date; + } + makeValid(); + updateTemplate(); + } + }; + + // Call internally when we know that model is valid. + function refresh( keyboardChange ) { + makeValid(); + ngModelCtrl.$setViewValue( new Date(selected) ); + updateTemplate( keyboardChange ); + } + + function makeValid() { + ngModelCtrl.$setValidity('time', true); + $scope.invalidHours = false; + $scope.invalidMinutes = false; + } + + function updateTemplate( keyboardChange ) { + var hours = selected.getHours(), minutes = selected.getMinutes(); + + if ( $scope.showMeridian ) { + hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system + } + + $scope.hours = keyboardChange === 'h' ? hours : pad(hours); + $scope.minutes = keyboardChange === 'm' ? minutes : pad(minutes); + $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1]; + } + + function addMinutes( minutes ) { + var dt = new Date( selected.getTime() + minutes * 60000 ); + selected.setHours( dt.getHours(), dt.getMinutes() ); + refresh(); + } + + $scope.incrementHours = function() { + addMinutes( hourStep * 60 ); + }; + $scope.decrementHours = function() { + addMinutes( - hourStep * 60 ); + }; + $scope.incrementMinutes = function() { + addMinutes( minuteStep ); + }; + $scope.decrementMinutes = function() { + addMinutes( - minuteStep ); + }; + $scope.toggleMeridian = function() { + addMinutes( 12 * 60 * (( selected.getHours() < 12 ) ? 1 : -1) ); + }; +}]) + +.directive('timepicker', function () { + return { + restrict: 'EA', + require: ['timepicker', '?^ngModel'], + controller:'TimepickerController', + replace: true, + scope: {}, + templateUrl: 'template/timepicker/timepicker.html', + link: function(scope, element, attrs, ctrls) { + var timepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + timepickerCtrl.init( ngModelCtrl, element.find('input') ); + } + } + }; +}); + +angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap.bindHtml']) + +/** + * A helper service that can parse typeahead's syntax (string provided by users) + * Extracted to a separate service for ease of unit testing + */ + .factory('typeaheadParser', ['$parse', function ($parse) { + + // 00000111000000000000022200000000000000003333333333333330000000000044000 + var TYPEAHEAD_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/; + + return { + parse:function (input) { + + var match = input.match(TYPEAHEAD_REGEXP); + if (!match) { + throw new Error( + 'Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_"' + + ' but got "' + input + '".'); + } + + return { + itemName:match[3], + source:$parse(match[4]), + viewMapper:$parse(match[2] || match[1]), + modelMapper:$parse(match[1]) + }; + } + }; +}]) + + .directive('typeahead', ['$compile', '$parse', '$q', '$timeout', '$document', '$position', 'typeaheadParser', + function ($compile, $parse, $q, $timeout, $document, $position, typeaheadParser) { + + var HOT_KEYS = [9, 13, 27, 38, 40]; + + return { + require:'ngModel', + link:function (originalScope, element, attrs, modelCtrl) { + + //SUPPORTED ATTRIBUTES (OPTIONS) + + //minimal no of characters that needs to be entered before typeahead kicks-in + var minSearch = originalScope.$eval(attrs.typeaheadMinLength) || 1; + + //minimal wait time after last character typed before typehead kicks-in + var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0; + + //should it restrict model values to the ones selected from the popup only? + var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false; + + //binding to a variable that indicates if matches are being retrieved asynchronously + var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop; + + //a callback executed when a match is selected + var onSelectCallback = $parse(attrs.typeaheadOnSelect); + + var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined; + + var appendToBody = attrs.typeaheadAppendToBody ? originalScope.$eval(attrs.typeaheadAppendToBody) : false; + + var focusFirst = originalScope.$eval(attrs.typeaheadFocusFirst) !== false; + + //INTERNAL VARIABLES + + //model setter executed upon match selection + var $setModelValue = $parse(attrs.ngModel).assign; + + //expressions used by typeahead + var parserResult = typeaheadParser.parse(attrs.typeahead); + + var hasFocus; + + //create a child scope for the typeahead directive so we are not polluting original scope + //with typeahead-specific data (matches, query etc.) + var scope = originalScope.$new(); + originalScope.$on('$destroy', function(){ + scope.$destroy(); + }); + + // WAI-ARIA + var popupId = 'typeahead-' + scope.$id + '-' + Math.floor(Math.random() * 10000); + element.attr({ + 'aria-autocomplete': 'list', + 'aria-expanded': false, + 'aria-owns': popupId + }); + + //pop-up element used to display matches + var popUpEl = angular.element('
    '); + popUpEl.attr({ + id: popupId, + matches: 'matches', + active: 'activeIdx', + select: 'select(activeIdx)', + query: 'query', + position: 'position' + }); + //custom item template + if (angular.isDefined(attrs.typeaheadTemplateUrl)) { + popUpEl.attr('template-url', attrs.typeaheadTemplateUrl); + } + + var resetMatches = function() { + scope.matches = []; + scope.activeIdx = -1; + element.attr('aria-expanded', false); + }; + + var getMatchId = function(index) { + return popupId + '-option-' + index; + }; + + // Indicate that the specified match is the active (pre-selected) item in the list owned by this typeahead. + // This attribute is added or removed automatically when the `activeIdx` changes. + scope.$watch('activeIdx', function(index) { + if (index < 0) { + element.removeAttr('aria-activedescendant'); + } else { + element.attr('aria-activedescendant', getMatchId(index)); + } + }); + + var getMatchesAsync = function(inputValue) { + + var locals = {$viewValue: inputValue}; + isLoadingSetter(originalScope, true); + $q.when(parserResult.source(originalScope, locals)).then(function(matches) { + + //it might happen that several async queries were in progress if a user were typing fast + //but we are interested only in responses that correspond to the current view value + var onCurrentRequest = (inputValue === modelCtrl.$viewValue); + if (onCurrentRequest && hasFocus) { + if (matches.length > 0) { + + scope.activeIdx = focusFirst ? 0 : -1; + scope.matches.length = 0; + + //transform labels + for(var i=0; i= minSearch) { + if (waitTime > 0) { + cancelPreviousTimeout(); + scheduleSearchWithTimeout(inputValue); + } else { + getMatchesAsync(inputValue); + } + } else { + isLoadingSetter(originalScope, false); + cancelPreviousTimeout(); + resetMatches(); + } + + if (isEditable) { + return inputValue; + } else { + if (!inputValue) { + // Reset in case user had typed something previously. + modelCtrl.$setValidity('editable', true); + return inputValue; + } else { + modelCtrl.$setValidity('editable', false); + return undefined; + } + } + }); + + modelCtrl.$formatters.push(function (modelValue) { + + var candidateViewValue, emptyViewValue; + var locals = {}; + + if (inputFormatter) { + + locals.$model = modelValue; + return inputFormatter(originalScope, locals); + + } else { + + //it might happen that we don't have enough info to properly render input value + //we need to check for this situation and simply return model value if we can't apply custom formatting + locals[parserResult.itemName] = modelValue; + candidateViewValue = parserResult.viewMapper(originalScope, locals); + locals[parserResult.itemName] = undefined; + emptyViewValue = parserResult.viewMapper(originalScope, locals); + + return candidateViewValue!== emptyViewValue ? candidateViewValue : modelValue; + } + }); + + scope.select = function (activeIdx) { + //called from within the $digest() cycle + var locals = {}; + var model, item; + + locals[parserResult.itemName] = item = scope.matches[activeIdx].model; + model = parserResult.modelMapper(originalScope, locals); + $setModelValue(originalScope, model); + modelCtrl.$setValidity('editable', true); + + onSelectCallback(originalScope, { + $item: item, + $model: model, + $label: parserResult.viewMapper(originalScope, locals) + }); + + resetMatches(); + + //return focus to the input element if a match was selected via a mouse click event + // use timeout to avoid $rootScope:inprog error + $timeout(function() { element[0].focus(); }, 0, false); + }; + + //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27) + element.bind('keydown', function (evt) { + + //typeahead is open and an "interesting" key was pressed + if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) { + return; + } + + // if there's nothing selected (i.e. focusFirst) and enter is hit, don't do anything + if (scope.activeIdx == -1 && (evt.which === 13 || evt.which === 9)) { + return; + } + + evt.preventDefault(); + + if (evt.which === 40) { + scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length; + scope.$digest(); + + } else if (evt.which === 38) { + scope.activeIdx = (scope.activeIdx > 0 ? scope.activeIdx : scope.matches.length) - 1; + scope.$digest(); + + } else if (evt.which === 13 || evt.which === 9) { + scope.$apply(function () { + scope.select(scope.activeIdx); + }); + + } else if (evt.which === 27) { + evt.stopPropagation(); + + resetMatches(); + scope.$digest(); + } + }); + + element.bind('blur', function (evt) { + hasFocus = false; + }); + + // Keep reference to click handler to unbind it. + var dismissClickHandler = function (evt) { + if (element[0] !== evt.target) { + resetMatches(); + scope.$digest(); + } + }; + + $document.bind('click', dismissClickHandler); + + originalScope.$on('$destroy', function(){ + $document.unbind('click', dismissClickHandler); + if (appendToBody) { + $popup.remove(); + } + }); + + var $popup = $compile(popUpEl)(scope); + if (appendToBody) { + $document.find('body').append($popup); + } else { + element.after($popup); + } + } + }; + +}]) + + .directive('typeaheadPopup', function () { + return { + restrict:'EA', + scope:{ + matches:'=', + query:'=', + active:'=', + position:'=', + select:'&' + }, + replace:true, + templateUrl:'template/typeahead/typeahead-popup.html', + link:function (scope, element, attrs) { + + scope.templateUrl = attrs.templateUrl; + + scope.isOpen = function () { + return scope.matches.length > 0; + }; + + scope.isActive = function (matchIdx) { + return scope.active == matchIdx; + }; + + scope.selectActive = function (matchIdx) { + scope.active = matchIdx; + }; + + scope.selectMatch = function (activeIdx) { + scope.select({activeIdx:activeIdx}); + }; + } + }; + }) + + .directive('typeaheadMatch', ['$http', '$templateCache', '$compile', '$parse', function ($http, $templateCache, $compile, $parse) { + return { + restrict:'EA', + scope:{ + index:'=', + match:'=', + query:'=' + }, + link:function (scope, element, attrs) { + var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'template/typeahead/typeahead-match.html'; + $http.get(tplUrl, {cache: $templateCache}).success(function(tplContent){ + element.replaceWith($compile(tplContent.trim())(scope)); + }); + } + }; + }]) + + .filter('typeaheadHighlight', function() { + + function escapeRegexp(queryToEscape) { + return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); + } + + return function(matchItem, query) { + return query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; + }; + }); + +angular.module("template/accordion/accordion-group.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/accordion/accordion-group.html", + "
    \n" + + "
    \n" + + "

    \n" + + " {{heading}}\n" + + "

    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/accordion/accordion.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/accordion/accordion.html", + "
    "); +}]); + +angular.module("template/alert/alert.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/alert/alert.html", + "
    \n" + + " \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/carousel/carousel.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/carousel/carousel.html", + "
    \n" + + "
      1\">\n" + + "
    1. \n" + + "
    \n" + + "
    \n" + + " 1\">\n" + + " 1\">\n" + + "
    \n" + + ""); +}]); + +angular.module("template/carousel/slide.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/carousel/slide.html", + "
    \n" + + ""); +}]); + +angular.module("template/datepicker/datepicker.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/datepicker.html", + "
    \n" + + " \n" + + " \n" + + " \n" + + "
    "); +}]); + +angular.module("template/datepicker/day.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/day.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
    {{label.abbr}}
    {{ weekNumbers[$index] }}\n" + + " \n" + + "
    \n" + + ""); +}]); + +angular.module("template/datepicker/month.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/month.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
    \n" + + " \n" + + "
    \n" + + ""); +}]); + +angular.module("template/datepicker/popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/popup.html", + "
      \n" + + "
    • \n" + + "
    • \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
    • \n" + + "
    \n" + + ""); +}]); + +angular.module("template/datepicker/year.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/year.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
    \n" + + " \n" + + "
    \n" + + ""); +}]); + +angular.module("template/modal/backdrop.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/modal/backdrop.html", + "
    \n" + + ""); +}]); + +angular.module("template/modal/window.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/modal/window.html", + "
    \n" + + "
    \n" + + "
    "); +}]); + +angular.module("template/pagination/pager.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/pagination/pager.html", + "
      \n" + + "
    • {{getText('previous')}}
    • \n" + + "
    • {{getText('next')}}
    • \n" + + "
    "); +}]); + +angular.module("template/pagination/pagination.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/pagination/pagination.html", + "
      \n" + + "
    • {{getText('first')}}
    • \n" + + "
    • {{getText('previous')}}
    • \n" + + "
    • {{page.text}}
    • \n" + + "
    • {{getText('next')}}
    • \n" + + "
    • {{getText('last')}}
    • \n" + + "
    "); +}]); + +angular.module("template/tooltip/tooltip-html-unsafe-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tooltip/tooltip-html-unsafe-popup.html", + "
    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/tooltip/tooltip-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tooltip/tooltip-popup.html", + "
    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/popover/popover.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/popover/popover.html", + "
    \n" + + "
    \n" + + "\n" + + "
    \n" + + "

    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/progressbar/bar.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/progressbar/bar.html", + "
    "); +}]); + +angular.module("template/progressbar/progress.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/progressbar/progress.html", + "
    "); +}]); + +angular.module("template/progressbar/progressbar.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/progressbar/progressbar.html", + "
    \n" + + "
    \n" + + "
    "); +}]); + +angular.module("template/rating/rating.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/rating/rating.html", + "\n" + + " \n" + + " ({{ $index < value ? '*' : ' ' }})\n" + + " \n" + + ""); +}]); + +angular.module("template/tabs/tab.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tabs/tab.html", + "
  • \n" + + " {{heading}}\n" + + "
  • \n" + + ""); +}]); + +angular.module("template/tabs/tabset.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tabs/tabset.html", + "
    \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + ""); +}]); + +angular.module("template/timepicker/timepicker.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/timepicker/timepicker.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
       
      \n" + + " \n" + + " :\n" + + " \n" + + "
       
      \n" + + ""); +}]); + +angular.module("template/typeahead/typeahead-match.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/typeahead/typeahead-match.html", + ""); +}]); + +angular.module("template/typeahead/typeahead-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/typeahead/typeahead-popup.html", + "
        \n" + + "
      • \n" + + "
        \n" + + "
      • \n" + + "
      \n" + + ""); +}]); diff --git a/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js b/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js new file mode 100644 index 0000000..41fc2cb --- /dev/null +++ b/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js @@ -0,0 +1,10 @@ +/* + * angular-ui-bootstrap + * http://angular-ui.github.io/bootstrap/ + + * Version: 0.12.1 - 2015-02-20 + * License: MIT + */ +angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function(a,b,c){function d(a){for(var b in a)if(void 0!==f.style[b])return a[b]}var e=function(d,f,g){g=g||{};var h=a.defer(),i=e[g.animation?"animationEndEventName":"transitionEndEventName"],j=function(){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(f)?d.addClass(f):angular.isFunction(f)?f(d):angular.isObject(f)&&d.css(f),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},f=document.createElement("trans"),g={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},h={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return e.transitionEndEventName=d(g),e.animationEndEventName=d(h),e}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function(a){return{link:function(b,c,d){function e(b){function d(){j===e&&(j=void 0)}var e=a(c,b);return j&&j.cancel(),j=e,e.then(d,d),e}function f(){k?(k=!1,g()):(c.removeClass("collapse").addClass("collapsing"),e({height:c[0].scrollHeight+"px"}).then(g))}function g(){c.removeClass("collapsing"),c.addClass("collapse in"),c.css({height:"auto"})}function h(){if(k)k=!1,i(),c.css({height:0});else{c.css({height:c[0].scrollHeight+"px"});{c[0].offsetWidth}c.removeClass("collapse in").addClass("collapsing"),e({height:0}).then(i)}}function i(){c.removeClass("collapsing"),c.addClass("collapse")}var j,k=!0;b.$watch(d.collapse,function(a){a?h():f()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.$watch("isOpen",function(b){b&&d.closeOthers(a)}),a.toggleOpen=function(){a.isDisabled||(a.isOpen=!a.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,function(){}))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.html(""),b.append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable="close"in b,this.close=a.close}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}).directive("dismissOnTimeout",["$timeout",function(a){return{require:"alert",link:function(b,c,d,e){a(function(){e.close()},parseInt(d.dismissOnTimeout,10))}}}]),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){var d=b.hasClass(e.activeClass);(!d||angular.isDefined(c.uncheckable))&&a.$apply(function(){f.$setViewValue(d?null:a.$eval(c.btnRadio)),f.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$interval","$transition",function(a,b,c,d){function e(){f();var b=+a.interval;!isNaN(b)&&b>0&&(h=c(g,b))}function f(){h&&(c.cancel(h),h=null)}function g(){var b=+a.interval;i&&!isNaN(b)&&b>0?a.next():a.pause()}var h,i,j=this,k=j.slides=a.slides=[],l=-1;j.currentSlide=null;var m=!1;j.select=a.select=function(c,f){function g(){if(!m){if(j.currentSlide&&angular.isString(f)&&!a.noTransition&&c.$element){c.$element.addClass(f);{c.$element[0].offsetWidth}angular.forEach(k,function(a){angular.extend(a,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(c,{direction:f,active:!0,entering:!0}),angular.extend(j.currentSlide||{},{direction:f,leaving:!0}),a.$currentTransition=d(c.$element,{}),function(b,c){a.$currentTransition.then(function(){h(b,c)},function(){h(b,c)})}(c,j.currentSlide)}else h(c,j.currentSlide);j.currentSlide=c,l=i,e()}}function h(b,c){angular.extend(b,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(c||{},{direction:"",active:!1,leaving:!1,entering:!1}),a.$currentTransition=null}var i=k.indexOf(c);void 0===f&&(f=i>l?"next":"prev"),c&&c!==j.currentSlide&&(a.$currentTransition?(a.$currentTransition.cancel(),b(g)):g())},a.$on("$destroy",function(){m=!0}),j.indexOfSlide=function(a){return k.indexOf(a)},a.next=function(){var b=(l+1)%k.length;return a.$currentTransition?void 0:j.select(k[b],"next")},a.prev=function(){var b=0>l-1?k.length-1:l-1;return a.$currentTransition?void 0:j.select(k[b],"prev")},a.isActive=function(a){return j.currentSlide===a},a.$watch("interval",e),a.$on("$destroy",f),a.play=function(){i||(i=!0,e())},a.pause=function(){a.noPause||(i=!1,f())},j.addSlide=function(b,c){b.$element=c,k.push(b),1===k.length||b.active?(j.select(k[k.length-1]),1==k.length&&a.play()):b.active=!1},j.removeSlide=function(a){var b=k.indexOf(a);k.splice(b,1),k.length>0&&a.active?j.select(b>=k.length?k[b-1]:k[b]):l>b&&l--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",function(){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{active:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)}),a.$watch("active",function(b){b&&d.select(a)})}}}),angular.module("ui.bootstrap.dateparser",[]).service("dateParser",["$locale","orderByFilter",function(a,b){function c(a){var c=[],d=a.split("");return angular.forEach(e,function(b,e){var f=a.indexOf(e);if(f>-1){a=a.split(""),d[f]="("+b.regex+")",a[f]="$";for(var g=f+1,h=f+e.length;h>g;g++)d[g]="",a[g]="$";a=a.join(""),c.push({index:f,apply:b.apply})}}),{regex:new RegExp("^"+d.join("")+"$"),map:b(c,"index")}}function d(a,b,c){return 1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}this.parsers={};var e={yyyy:{regex:"\\d{4}",apply:function(a){this.year=+a}},yy:{regex:"\\d{2}",apply:function(a){this.year=+a+2e3}},y:{regex:"\\d{1,4}",apply:function(a){this.year=+a}},MMMM:{regex:a.DATETIME_FORMATS.MONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.MONTH.indexOf(b)}},MMM:{regex:a.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.SHORTMONTH.indexOf(b)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1}},M:{regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},EEEE:{regex:a.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:a.DATETIME_FORMATS.SHORTDAY.join("|")}};this.parse=function(b,e){if(!angular.isString(b)||!e)return b;e=a.DATETIME_FORMATS[e]||e,this.parsers[e]||(this.parsers[e]=c(e));var f=this.parsers[e],g=f.regex,h=f.map,i=b.match(g);if(i&&i.length){for(var j,k={year:1900,month:0,date:1,hours:0},l=1,m=i.length;m>l;l++){var n=h[l-1];n.apply&&n.apply.call(k,i[l])}return d(k.year,k.month,k.date)&&(j=new Date(k.year,k.month,k.date,k.hours)),j}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].documentElement.scrollLeft)}},positionElements:function(a,b,c,d){var e,f,g,h,i=c.split("-"),j=i[0],k=i[1]||"center";e=d?this.offset(a):this.position(a),f=b.prop("offsetWidth"),g=b.prop("offsetHeight");var l={center:function(){return e.left+e.width/2-f/2},left:function(){return e.left},right:function(){return e.left+e.width}},m={center:function(){return e.top+e.height/2-g/2},top:function(){return e.top},bottom:function(){return e.top+e.height}};switch(j){case"right":h={top:m[k](),left:l[j]()};break;case"left":h={top:m[k](),left:e.left-f};break;case"bottom":h={top:m[j](),left:l[k]()};break;default:h={top:e.top-g,left:l[k]()}}return h}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$timeout","$log","dateFilter","datepickerConfig",function(a,b,c,d,e,f,g,h){var i=this,j={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","minMode","maxMode","showWeeks","startingDay","yearRange"],function(c,e){i[c]=angular.isDefined(b[c])?8>e?d(b[c])(a.$parent):a.$parent.$eval(b[c]):h[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){i[d]=a?new Date(a):null,i.refreshView()}):i[d]=h[d]?new Date(h[d]):null}),a.datepickerMode=a.datepickerMode||h.datepickerMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),this.activeDate=angular.isDefined(b.initDate)?a.$parent.$eval(b.initDate):new Date,a.isActive=function(b){return 0===i.compare(b.date,i.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(a){j=a,j.$render=function(){i.render()}},this.render=function(){if(j.$modelValue){var a=new Date(j.$modelValue),b=!isNaN(a);b?this.activeDate=a:f.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'),j.$setValidity("date",b)}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=j.$modelValue?new Date(j.$modelValue):null;j.$setValidity("date-disabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=j.$modelValue?new Date(j.$modelValue):null;return{date:a,label:g(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===i.minMode){var c=j.$modelValue?new Date(j.$modelValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),j.$setViewValue(c),j.$render()}else i.activeDate=b,a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=i.activeDate.getFullYear()+a*(i.step.years||0),c=i.activeDate.getMonth()+a*(i.step.months||0);i.activeDate.setFullYear(b,c,1),i.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===i.maxMode&&1===b||a.datepickerMode===i.minMode&&-1===b||(a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var k=function(){e(function(){i.element[0].focus()},0,!1)};a.$on("datepicker.focus",k),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),b.stopPropagation(),"enter"===c||"space"===c){if(i.isDisabled(i.activeDate))return;a.select(i.activeDate),k()}else!b.ctrlKey||"up"!==c&&"down"!==c?(i.handleKeyDown(c,b),i.refreshView()):(a.toggleMode("up"===c?1:-1),k())}}]).directive("datepicker",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{datepickerMode:"=?",dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}).directive("daypicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/day.html",require:"^datepicker",link:function(b,c,d,e){function f(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?i[b]:29}function g(a,b){var c=new Array(b),d=new Date(a),e=0;for(d.setHours(12);b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}b.showWeeks=e.showWeeks,e.step={months:1},e.element=c;var i=[31,28,31,30,31,30,31,31,30,31,30,31];e._refreshView=function(){var c=e.activeDate.getFullYear(),d=e.activeDate.getMonth(),f=new Date(c,d,1),i=e.startingDay-f.getDay(),j=i>0?7-i:-i,k=new Date(f);j>0&&k.setDate(-j+1);for(var l=g(k,42),m=0;42>m;m++)l[m]=angular.extend(e.createDateObject(l[m],e.formatDay),{secondary:l[m].getMonth()!==d,uid:b.uniqueId+"-"+m});b.labels=new Array(7);for(var n=0;7>n;n++)b.labels[n]={abbr:a(l[n].date,e.formatDayHeader),full:a(l[n].date,"EEEE")};if(b.title=a(e.activeDate,e.formatDayTitle),b.rows=e.split(l,7),b.showWeeks){b.weekNumbers=[];for(var o=h(b.rows[0][0].date),p=b.rows.length;b.weekNumbers.push(o++)f;f++)c[f]=angular.extend(e.createDateObject(new Date(d,f,1),e.formatMonth),{uid:b.uniqueId+"-"+f});b.title=a(e.activeDate,e.formatMonthTitle),b.rows=e.split(c,3)},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},e.handleKeyDown=function(a){var b=e.activeDate.getMonth();if("left"===a)b-=1;else if("up"===a)b-=3;else if("right"===a)b+=1;else if("down"===a)b+=3;else if("pageup"===a||"pagedown"===a){var c=e.activeDate.getFullYear()+("pageup"===a?-1:1);e.activeDate.setFullYear(c)}else"home"===a?b=0:"end"===a&&(b=11);e.activeDate.setMonth(b)},e.refreshView()}}}]).directive("yearpicker",["dateFilter",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/year.html",require:"^datepicker",link:function(a,b,c,d){function e(a){return parseInt((a-1)/f,10)*f+1}var f=d.yearRange;d.step={years:f},d.element=b,d._refreshView=function(){for(var b=new Array(f),c=0,g=e(d.activeDate.getFullYear());f>c;c++)b[c]=angular.extend(d.createDateObject(new Date(g+c,0,1),d.formatYear),{uid:a.uniqueId+"-"+c});a.title=[b[0].label,b[f-1].label].join(" - "),a.rows=d.split(b,5)},d.compare=function(a,b){return a.getFullYear()-b.getFullYear()},d.handleKeyDown=function(a){var b=d.activeDate.getFullYear();"left"===a?b-=1:"up"===a?b-=5:"right"===a?b+=1:"down"===a?b+=5:"pageup"===a||"pagedown"===a?b+=("pageup"===a?-1:1)*d.step.years:"home"===a?b=e(d.activeDate.getFullYear()):"end"===a&&(b=e(d.activeDate.getFullYear())+f-1),d.activeDate.setFullYear(b)},d.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","dateParser","datepickerPopupConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&"},link:function(h,i,j,k){function l(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function m(a){if(a){if(angular.isDate(a)&&!isNaN(a))return k.$setValidity("date",!0),a;if(angular.isString(a)){var b=f.parse(a,n)||new Date(a);return isNaN(b)?void k.$setValidity("date",!1):(k.$setValidity("date",!0),b)}return void k.$setValidity("date",!1)}return k.$setValidity("date",!0),null}var n,o=angular.isDefined(j.closeOnDateSelection)?h.$parent.$eval(j.closeOnDateSelection):g.closeOnDateSelection,p=angular.isDefined(j.datepickerAppendToBody)?h.$parent.$eval(j.datepickerAppendToBody):g.appendToBody;h.showButtonBar=angular.isDefined(j.showButtonBar)?h.$parent.$eval(j.showButtonBar):g.showButtonBar,h.getText=function(a){return h[a+"Text"]||g[a+"Text"]},j.$observe("datepickerPopup",function(a){n=a||g.datepickerPopup,k.$render()});var q=angular.element("
      ");q.attr({"ng-model":"date","ng-change":"dateSelection()"});var r=angular.element(q.children()[0]);j.datepickerOptions&&angular.forEach(h.$parent.$eval(j.datepickerOptions),function(a,b){r.attr(l(b),a)}),h.watchData={},angular.forEach(["minDate","maxDate","datepickerMode"],function(a){if(j[a]){var c=b(j[a]);if(h.$parent.$watch(c,function(b){h.watchData[a]=b}),r.attr(l(a),"watchData."+a),"datepickerMode"===a){var d=c.assign;h.$watch("watchData."+a,function(a,b){a!==b&&d(h.$parent,a)})}}}),j.dateDisabled&&r.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),k.$parsers.unshift(m),h.dateSelection=function(a){angular.isDefined(a)&&(h.date=a),k.$setViewValue(h.date),k.$render(),o&&(h.isOpen=!1,i[0].focus())},i.bind("input change keyup",function(){h.$apply(function(){h.date=k.$modelValue})}),k.$render=function(){var a=k.$viewValue?e(k.$viewValue,n):"";i.val(a),h.date=m(k.$modelValue)};var s=function(a){h.isOpen&&a.target!==i[0]&&h.$apply(function(){h.isOpen=!1})},t=function(a){h.keydown(a)};i.bind("keydown",t),h.keydown=function(a){27===a.which?(a.preventDefault(),a.stopPropagation(),h.close()):40!==a.which||h.isOpen||(h.isOpen=!0)},h.$watch("isOpen",function(a){a?(h.$broadcast("datepicker.focus"),h.position=p?d.offset(i):d.position(i),h.position.top=h.position.top+i.prop("offsetHeight"),c.bind("click",s)):c.unbind("click",s)}),h.select=function(a){if("today"===a){var b=new Date;angular.isDate(k.$modelValue)?(a=new Date(k.$modelValue),a.setFullYear(b.getFullYear(),b.getMonth(),b.getDate())):a=new Date(b.setHours(0,0,0,0))}h.dateSelection(a)},h.close=function(){h.isOpen=!1,i[0].focus()};var u=a(q)(h);q.remove(),p?c.find("body").append(u):i.after(u),h.$on("$destroy",function(){u.remove(),i.unbind("keydown",t),c.unbind("click",s)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdown",[]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document",function(a){var b=null;this.open=function(e){b||(a.bind("click",c),a.bind("keydown",d)),b&&b!==e&&(b.isOpen=!1),b=e},this.close=function(e){b===e&&(b=null,a.unbind("click",c),a.unbind("keydown",d))};var c=function(a){if(b){var c=b.getToggleElement();a&&c&&c[0].contains(a.target)||b.$apply(function(){b.isOpen=!1})}},d=function(a){27===a.which&&(b.focusToggleElement(),c())}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate",function(a,b,c,d,e,f){var g,h=this,i=a.$new(),j=d.openClass,k=angular.noop,l=b.onToggle?c(b.onToggle):angular.noop;this.init=function(d){h.$element=d,b.isOpen&&(g=c(b.isOpen),k=g.assign,a.$watch(g,function(a){i.isOpen=!!a}))},this.toggle=function(a){return i.isOpen=arguments.length?!!a:!i.isOpen},this.isOpen=function(){return i.isOpen},i.getToggleElement=function(){return h.toggleElement},i.focusToggleElement=function(){h.toggleElement&&h.toggleElement[0].focus()},i.$watch("isOpen",function(b,c){f[b?"addClass":"removeClass"](h.$element,j),b?(i.focusToggleElement(),e.open(i)):e.close(i),k(a,b),angular.isDefined(b)&&b!==c&&l(a,{open:!!b})}),a.$on("$locationChangeSuccess",function(){i.isOpen=!1}),a.$on("$destroy",function(){i.$destroy()})}]).directive("dropdown",function(){return{controller:"DropdownController",link:function(a,b,c,d){d.init(b)}}}).directive("dropdownToggle",function(){return{require:"?^dropdown",link:function(a,b,c,d){if(d){d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c0),i()})}function i(){if(k&&-1==g()){var a=l;j(k,l,150,function(){a.$destroy(),a=null}),k=void 0,l=void 0}}function j(c,d,e,f){function g(){g.done||(g.done=!0,c.remove(),f&&f())}d.animate=!1;var h=a.transitionEndEventName;if(h){var i=b(g,e);c.bind(h,function(){b.cancel(i),g(),d.$apply()})}else b(g)}var k,l,m="modal-open",n=f.createNew(),o={};return e.$watch(g,function(a){l&&(l.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=n.top(),b&&b.value.keyboard&&(a.preventDefault(),e.$apply(function(){o.dismiss(b.key,"escape key press")})))}),o.open=function(a,b){n.add(a,{deferred:b.deferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var f=c.find("body").eq(0),h=g();if(h>=0&&!k){l=e.$new(!0),l.index=h;var i=angular.element("
      ");i.attr("backdrop-class",b.backdropClass),k=d(i)(l),f.append(k)}var j=angular.element("
      ");j.attr({"template-url":b.windowTemplateUrl,"window-class":b.windowClass,size:b.size,index:n.length()-1,animate:"animate"}).html(b.content);var o=d(j)(b.scope);n.top().value.modalDomEl=o,f.append(o),f.addClass(m)},o.close=function(a,b){var c=n.get(a);c&&(c.value.deferred.resolve(b),h(a))},o.dismiss=function(a,b){var c=n.get(a);c&&(c.value.deferred.reject(b),h(a))},o.dismissAll=function(a){for(var b=this.getTop();b;)this.dismiss(b.key,a),b=this.getTop()},o.getTop=function(){return n.top()},o}]).provider("$modal",function(){var a={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function(b,c,d,e,f,g,h){function i(a){return a.template?d.when(a.template):e.get(angular.isFunction(a.templateUrl)?a.templateUrl():a.templateUrl,{cache:f}).then(function(a){return a.data})}function j(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var k={};return k.open=function(b){var e=d.defer(),f=d.defer(),k={result:e.promise,opened:f.promise,close:function(a){h.close(k,a)},dismiss:function(a){h.dismiss(k,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var l=d.all([i(b)].concat(j(b.resolve)));return l.then(function(a){var d=(b.scope||c).$new();d.$close=k.close,d.$dismiss=k.dismiss;var f,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=k,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),f=g(b.controller,i),b.controllerAs&&(d[b.controllerAs]=f)),h.open(k,{scope:d,deferred:e,content:a[0],backdrop:b.backdrop,keyboard:b.keyboard,backdropClass:b.backdropClass,windowClass:b.windowClass,windowTemplateUrl:b.windowTemplateUrl,size:b.size})},function(a){e.reject(a)}),l.then(function(){f.resolve(!0)},function(){f.reject(!1)}),k},k}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(a,b,c){var d=this,e={$setViewValue:angular.noop},f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(f,g){e=f,this.config=g,e.$render=function(){d.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){d.itemsPerPage=parseInt(b,10),a.totalPages=d.calculateTotalPages()}):this.itemsPerPage=g.itemsPerPage},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(e.$viewValue,10)||1},a.selectPage=function(b){a.page!==b&&b>0&&b<=a.totalPages&&(e.$setViewValue(b),e.$render())},a.getText=function(b){return a[b+"Text"]||d.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages},a.$watch("totalItems",function(){a.totalPages=d.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),a.page>b?a.selectPage(b):e.$render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c){return{number:a,text:b,active:c}}function h(a,b){var c=[],d=1,e=b,f=angular.isDefined(k)&&b>k;f&&(l?(d=Math.max(a-Math.floor(k/2),1),e=d+k-1,e>b&&(e=b,d=e-k+1)):(d=(Math.ceil(a/k)-1)*k+1,e=Math.min(d+k-1,b)));for(var h=d;e>=h;h++){var i=g(h,h,h===a);c.push(i)}if(f&&!l){if(d>1){var j=g(d-1,"...",!1);c.unshift(j)}if(b>e){var m=g(e+1,"...",!1);c.push(m)}}return c}var i=f[0],j=f[1];if(j){var k=angular.isDefined(e.maxSize)?c.$parent.$eval(e.maxSize):b.maxSize,l=angular.isDefined(e.rotate)?c.$parent.$eval(e.rotate):b.rotate;c.boundaryLinks=angular.isDefined(e.boundaryLinks)?c.$parent.$eval(e.boundaryLinks):b.boundaryLinks,c.directionLinks=angular.isDefined(e.directionLinks)?c.$parent.$eval(e.directionLinks):b.directionLinks,i.init(j,b),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){k=parseInt(a,10),i.render() +});var m=i.render;i.render=function(){m(),c.page>0&&c.page<=c.totalPages&&(c.pages=h(c.page,c.totalPages))}}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@"},require:["pager","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&(b.align=angular.isDefined(d.align)?b.$parent.$eval(d.align):a.align,f.init(g,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$document","$position","$interpolate",function(e,f,g,h,i,j){return function(e,k,l){function m(a){var b=a||n.trigger||l,d=c[b]||b;return{show:b,hide:d}}var n=angular.extend({},b,d),o=a(e),p=j.startSymbol(),q=j.endSymbol(),r="
      ';return{restrict:"EA",compile:function(){var a=f(r);return function(b,c,d){function f(){D.isOpen?l():j()}function j(){(!C||b.$eval(d[k+"Enable"]))&&(s(),D.popupDelay?z||(z=g(o,D.popupDelay,!1),z.then(function(a){a()})):o()())}function l(){b.$apply(function(){p()})}function o(){return z=null,y&&(g.cancel(y),y=null),D.content?(q(),w.css({top:0,left:0,display:"block"}),D.$digest(),E(),D.isOpen=!0,D.$digest(),E):angular.noop}function p(){D.isOpen=!1,g.cancel(z),z=null,D.animation?y||(y=g(r,500)):r()}function q(){w&&r(),x=D.$new(),w=a(x,function(a){A?h.find("body").append(a):c.after(a)})}function r(){y=null,w&&(w.remove(),w=null),x&&(x.$destroy(),x=null)}function s(){t(),u()}function t(){var a=d[k+"Placement"];D.placement=angular.isDefined(a)?a:n.placement}function u(){var a=d[k+"PopupDelay"],b=parseInt(a,10);D.popupDelay=isNaN(b)?n.popupDelay:b}function v(){var a=d[k+"Trigger"];F(),B=m(a),B.show===B.hide?c.bind(B.show,f):(c.bind(B.show,j),c.bind(B.hide,l))}var w,x,y,z,A=angular.isDefined(n.appendToBody)?n.appendToBody:!1,B=m(void 0),C=angular.isDefined(d[k+"Enable"]),D=b.$new(!0),E=function(){var a=i.positionElements(c,w,D.placement,A);a.top+="px",a.left+="px",w.css(a)};D.isOpen=!1,d.$observe(e,function(a){D.content=a,!a&&D.isOpen&&p()}),d.$observe(k+"Title",function(a){D.title=a});var F=function(){c.unbind(B.show,j),c.unbind(B.hide,l)};v();var G=b.$eval(d[k+"Animation"]);D.animation=angular.isDefined(G)?!!G:n.animation;var H=b.$eval(d[k+"AppendToBody"]);A=angular.isDefined(H)?H:A,A&&b.$on("$locationChangeSuccess",function(){D.isOpen&&p()}),b.$on("$destroy",function(){g.cancel(y),g.cancel(z),F(),r(),D=null})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function(a){return a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(a,b,c){var d=this,e=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max,this.addBar=function(b,c){e||c.css({transition:"none"}),this.bars.push(b),b.$watch("value",function(c){b.percent=+(100*c/a.max).toFixed(2)}),b.$on("$destroy",function(){c=null,d.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},templateUrl:"template/progressbar/progress.html"}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","ratingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(f)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff},a[b]);return a},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("rating",function(){return{restrict:"EA",require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(b){b.active&&b!==a&&(b.active=!1,b.onDeselect())}),a.active=!0,a.onSelect()},b.addTab=function(a){c.push(a),1===c.length?a.active=!0:a.active&&b.select(a)},b.removeTab=function(a){var e=c.indexOf(a);if(a.active&&c.length>1&&!d){var f=e==c.length-1?e-1:e+1;b.select(c[f])}c.splice(e,1)};var d;a.$on("$destroy",function(){d=!0})}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1}}}).directive("tab",["$parse",function(a){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(b,c,d){return function(b,c,e,f){b.$watch("active",function(a){a&&f.select(b)}),b.disabled=!1,e.disabled&&b.$parent.$watch(a(e.disabled),function(a){b.disabled=!!a}),b.select=function(){b.disabled||(b.active=!0)},f.addTab(b),b.$on("$destroy",function(){f.removeTab(b)}),b.$transcludeFn=d}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).controller("TimepickerController",["$scope","$attrs","$parse","$log","$locale","timepickerConfig",function(a,b,c,d,e,f){function g(){var b=parseInt(a.hours,10),c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c?(a.showMeridian&&(12===b&&(b=0),a.meridian===p[1]&&(b+=12)),b):void 0}function h(){var b=parseInt(a.minutes,10);return b>=0&&60>b?b:void 0}function i(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a}function j(a){k(),o.$setViewValue(new Date(n)),l(a)}function k(){o.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1}function l(b){var c=n.getHours(),d=n.getMinutes();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:i(c),a.minutes="m"===b?d:i(d),a.meridian=n.getHours()<12?p[0]:p[1]}function m(a){var b=new Date(n.getTime()+6e4*a);n.setHours(b.getHours(),b.getMinutes()),j()}var n=new Date,o={$setViewValue:angular.noop},p=angular.isDefined(b.meridians)?a.$parent.$eval(b.meridians):f.meridians||e.DATETIME_FORMATS.AMPMS;this.init=function(c,d){o=c,o.$render=this.render;var e=d.eq(0),g=d.eq(1),h=angular.isDefined(b.mousewheel)?a.$parent.$eval(b.mousewheel):f.mousewheel;h&&this.setupMousewheelEvents(e,g),a.readonlyInput=angular.isDefined(b.readonlyInput)?a.$parent.$eval(b.readonlyInput):f.readonlyInput,this.setupInputEvents(e,g)};var q=f.hourStep;b.hourStep&&a.$parent.$watch(c(b.hourStep),function(a){q=parseInt(a,10)});var r=f.minuteStep;b.minuteStep&&a.$parent.$watch(c(b.minuteStep),function(a){r=parseInt(a,10)}),a.showMeridian=f.showMeridian,b.showMeridian&&a.$parent.$watch(c(b.showMeridian),function(b){if(a.showMeridian=!!b,o.$error.time){var c=g(),d=h();angular.isDefined(c)&&angular.isDefined(d)&&(n.setHours(c),j())}else l()}),this.setupMousewheelEvents=function(b,c){var d=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()})},this.setupInputEvents=function(b,c){if(a.readonlyInput)return a.updateHours=angular.noop,void(a.updateMinutes=angular.noop);var d=function(b,c){o.$setViewValue(null),o.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c)};a.updateHours=function(){var a=g();angular.isDefined(a)?(n.setHours(a),j("h")):d(!0)},b.bind("blur",function(){!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=i(a.hours)})}),a.updateMinutes=function(){var a=h();angular.isDefined(a)?(n.setMinutes(a),j("m")):d(void 0,!0)},c.bind("blur",function(){!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=i(a.minutes)})})},this.render=function(){var a=o.$modelValue?new Date(o.$modelValue):null;isNaN(a)?(o.$setValidity("time",!1),d.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(n=a),k(),l())},a.incrementHours=function(){m(60*q)},a.decrementHours=function(){m(60*-q)},a.incrementMinutes=function(){m(r)},a.decrementMinutes=function(){m(-r)},a.toggleMeridian=function(){m(720*(n.getHours()<12?1:-1))}}]).directive("timepicker",function(){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?i.$eval(k.typeaheadAppendToBody):!1,u=i.$eval(k.typeaheadFocusFirst)!==!1,v=b(k.ngModel).assign,w=g.parse(k.typeahead),x=i.$new();i.$on("$destroy",function(){x.$destroy()});var y="typeahead-"+x.$id+"-"+Math.floor(1e4*Math.random());j.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":y});var z=angular.element("
      ");z.attr({id:y,matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&z.attr("template-url",k.typeaheadTemplateUrl);var A=function(){x.matches=[],x.activeIdx=-1,j.attr("aria-expanded",!1)},B=function(a){return y+"-option-"+a};x.$watch("activeIdx",function(a){0>a?j.removeAttr("aria-activedescendant"):j.attr("aria-activedescendant",B(a))});var C=function(a){var b={$viewValue:a};q(i,!0),c.when(w.source(i,b)).then(function(c){var d=a===l.$viewValue;if(d&&m)if(c.length>0){x.activeIdx=u?0:-1,x.matches.length=0;for(var e=0;e=n?o>0?(F(),E(a)):C(a):(q(i,!1),F(),A()),p?a:a?void l.$setValidity("editable",!1):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return s?(d.$model=a,s(i,d)):(d[w.itemName]=a,b=w.viewMapper(i,d),d[w.itemName]=void 0,c=w.viewMapper(i,d),b!==c?b:a)}),x.select=function(a){var b,c,e={};e[w.itemName]=c=x.matches[a].model,b=w.modelMapper(i,e),v(i,b),l.$setValidity("editable",!0),r(i,{$item:c,$model:b,$label:w.viewMapper(i,e)}),A(),d(function(){j[0].focus()},0,!1)},j.bind("keydown",function(a){0!==x.matches.length&&-1!==h.indexOf(a.which)&&(-1!=x.activeIdx||13!==a.which&&9!==a.which)&&(a.preventDefault(),40===a.which?(x.activeIdx=(x.activeIdx+1)%x.matches.length,x.$digest()):38===a.which?(x.activeIdx=(x.activeIdx>0?x.activeIdx:x.matches.length)-1,x.$digest()):13===a.which||9===a.which?x.$apply(function(){x.select(x.activeIdx)}):27===a.which&&(a.stopPropagation(),A(),x.$digest()))}),j.bind("blur",function(){m=!1});var G=function(a){j[0]!==a.target&&(A(),x.$digest())};e.bind("click",G),i.$on("$destroy",function(){e.unbind("click",G),t&&H.remove()});var H=a(z)(x);t?e.find("body").append(H):j.after(H)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function(a,b,c,d){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(e,f,g){var h=d(g.templateUrl)(e.$parent)||"template/typeahead/typeahead-match.html";a.get(h,{cache:b}).success(function(a){f.replaceWith(c(a.trim())(e))})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?(""+b).replace(new RegExp(a(c),"gi"),"$&"):b}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'
      \n
      \n

      \n {{heading}}\n

      \n
      \n
      \n
      \n
      \n
      \n')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'
      ')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html",'
      \n \n
      \n
      \n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'
      \n
        \n
      1. \n
      \n
      \n \n \n
      \n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html","
      \n")}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'
      \n \n \n \n
      ')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/day.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      {{label.abbr}}
      {{ weekNumbers[$index] }}\n \n
      \n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/month.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n
      \n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html",'
        \n
      • \n
      • \n \n \n \n \n \n
      • \n
      \n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/year.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n
      \n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'
      \n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'
      \n
      \n
      ')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'
        \n
      • {{getText(\'previous\')}}
      • \n
      • {{getText(\'next\')}}
      • \n
      ')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'
        \n
      • {{getText(\'first\')}}
      • \n
      • {{getText(\'previous\')}}
      • \n
      • {{page.text}}
      • \n
      • {{getText(\'next\')}}
      • \n
      • {{getText(\'last\')}}
      • \n
      ')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-unsafe-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'
      ')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'
      ')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'
      \n
      \n
      ')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'\n \n ({{ $index < value ? \'*\' : \' \' }})\n \n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'
    • \n {{heading}}\n
    • \n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'
      \n
        \n
        \n
        \n
        \n
        \n
        \n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
         
        \n \n :\n \n
         
        \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'') +}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html",'
          \n
        • \n
          \n
        • \n
        \n')}]); \ No newline at end of file diff --git a/bower_components/angular-bootstrap/ui-bootstrap.js b/bower_components/angular-bootstrap/ui-bootstrap.js new file mode 100644 index 0000000..d0f02df --- /dev/null +++ b/bower_components/angular-bootstrap/ui-bootstrap.js @@ -0,0 +1,3900 @@ +/* + * angular-ui-bootstrap + * http://angular-ui.github.io/bootstrap/ + + * Version: 0.12.1 - 2015-02-20 + * License: MIT + */ +angular.module("ui.bootstrap", ["ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]); +angular.module('ui.bootstrap.transition', []) + +/** + * $transition service provides a consistent interface to trigger CSS 3 transitions and to be informed when they complete. + * @param {DOMElement} element The DOMElement that will be animated. + * @param {string|object|function} trigger The thing that will cause the transition to start: + * - As a string, it represents the css class to be added to the element. + * - As an object, it represents a hash of style attributes to be applied to the element. + * - As a function, it represents a function to be called that will cause the transition to occur. + * @return {Promise} A promise that is resolved when the transition finishes. + */ +.factory('$transition', ['$q', '$timeout', '$rootScope', function($q, $timeout, $rootScope) { + + var $transition = function(element, trigger, options) { + options = options || {}; + var deferred = $q.defer(); + var endEventName = $transition[options.animation ? 'animationEndEventName' : 'transitionEndEventName']; + + var transitionEndHandler = function(event) { + $rootScope.$apply(function() { + element.unbind(endEventName, transitionEndHandler); + deferred.resolve(element); + }); + }; + + if (endEventName) { + element.bind(endEventName, transitionEndHandler); + } + + // Wrap in a timeout to allow the browser time to update the DOM before the transition is to occur + $timeout(function() { + if ( angular.isString(trigger) ) { + element.addClass(trigger); + } else if ( angular.isFunction(trigger) ) { + trigger(element); + } else if ( angular.isObject(trigger) ) { + element.css(trigger); + } + //If browser does not support transitions, instantly resolve + if ( !endEventName ) { + deferred.resolve(element); + } + }); + + // Add our custom cancel function to the promise that is returned + // We can call this if we are about to run a new transition, which we know will prevent this transition from ending, + // i.e. it will therefore never raise a transitionEnd event for that transition + deferred.promise.cancel = function() { + if ( endEventName ) { + element.unbind(endEventName, transitionEndHandler); + } + deferred.reject('Transition cancelled'); + }; + + return deferred.promise; + }; + + // Work out the name of the transitionEnd event + var transElement = document.createElement('trans'); + var transitionEndEventNames = { + 'WebkitTransition': 'webkitTransitionEnd', + 'MozTransition': 'transitionend', + 'OTransition': 'oTransitionEnd', + 'transition': 'transitionend' + }; + var animationEndEventNames = { + 'WebkitTransition': 'webkitAnimationEnd', + 'MozTransition': 'animationend', + 'OTransition': 'oAnimationEnd', + 'transition': 'animationend' + }; + function findEndEventName(endEventNames) { + for (var name in endEventNames){ + if (transElement.style[name] !== undefined) { + return endEventNames[name]; + } + } + } + $transition.transitionEndEventName = findEndEventName(transitionEndEventNames); + $transition.animationEndEventName = findEndEventName(animationEndEventNames); + return $transition; +}]); + +angular.module('ui.bootstrap.collapse', ['ui.bootstrap.transition']) + + .directive('collapse', ['$transition', function ($transition) { + + return { + link: function (scope, element, attrs) { + + var initialAnimSkip = true; + var currentTransition; + + function doTransition(change) { + var newTransition = $transition(element, change); + if (currentTransition) { + currentTransition.cancel(); + } + currentTransition = newTransition; + newTransition.then(newTransitionDone, newTransitionDone); + return newTransition; + + function newTransitionDone() { + // Make sure it's this transition, otherwise, leave it alone. + if (currentTransition === newTransition) { + currentTransition = undefined; + } + } + } + + function expand() { + if (initialAnimSkip) { + initialAnimSkip = false; + expandDone(); + } else { + element.removeClass('collapse').addClass('collapsing'); + doTransition({ height: element[0].scrollHeight + 'px' }).then(expandDone); + } + } + + function expandDone() { + element.removeClass('collapsing'); + element.addClass('collapse in'); + element.css({height: 'auto'}); + } + + function collapse() { + if (initialAnimSkip) { + initialAnimSkip = false; + collapseDone(); + element.css({height: 0}); + } else { + // CSS transitions don't work with height: auto, so we have to manually change the height to a specific value + element.css({ height: element[0].scrollHeight + 'px' }); + //trigger reflow so a browser realizes that height was updated from auto to a specific value + var x = element[0].offsetWidth; + + element.removeClass('collapse in').addClass('collapsing'); + + doTransition({ height: 0 }).then(collapseDone); + } + } + + function collapseDone() { + element.removeClass('collapsing'); + element.addClass('collapse'); + } + + scope.$watch(attrs.collapse, function (shouldCollapse) { + if (shouldCollapse) { + collapse(); + } else { + expand(); + } + }); + } + }; + }]); + +angular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse']) + +.constant('accordionConfig', { + closeOthers: true +}) + +.controller('AccordionController', ['$scope', '$attrs', 'accordionConfig', function ($scope, $attrs, accordionConfig) { + + // This array keeps track of the accordion groups + this.groups = []; + + // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to + this.closeOthers = function(openGroup) { + var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers; + if ( closeOthers ) { + angular.forEach(this.groups, function (group) { + if ( group !== openGroup ) { + group.isOpen = false; + } + }); + } + }; + + // This is called from the accordion-group directive to add itself to the accordion + this.addGroup = function(groupScope) { + var that = this; + this.groups.push(groupScope); + + groupScope.$on('$destroy', function (event) { + that.removeGroup(groupScope); + }); + }; + + // This is called from the accordion-group directive when to remove itself + this.removeGroup = function(group) { + var index = this.groups.indexOf(group); + if ( index !== -1 ) { + this.groups.splice(index, 1); + } + }; + +}]) + +// The accordion directive simply sets up the directive controller +// and adds an accordion CSS class to itself element. +.directive('accordion', function () { + return { + restrict:'EA', + controller:'AccordionController', + transclude: true, + replace: false, + templateUrl: 'template/accordion/accordion.html' + }; +}) + +// The accordion-group directive indicates a block of html that will expand and collapse in an accordion +.directive('accordionGroup', function() { + return { + require:'^accordion', // We need this directive to be inside an accordion + restrict:'EA', + transclude:true, // It transcludes the contents of the directive into the template + replace: true, // The element containing the directive will be replaced with the template + templateUrl:'template/accordion/accordion-group.html', + scope: { + heading: '@', // Interpolate the heading attribute onto this scope + isOpen: '=?', + isDisabled: '=?' + }, + controller: function() { + this.setHeading = function(element) { + this.heading = element; + }; + }, + link: function(scope, element, attrs, accordionCtrl) { + accordionCtrl.addGroup(scope); + + scope.$watch('isOpen', function(value) { + if ( value ) { + accordionCtrl.closeOthers(scope); + } + }); + + scope.toggleOpen = function() { + if ( !scope.isDisabled ) { + scope.isOpen = !scope.isOpen; + } + }; + } + }; +}) + +// Use accordion-heading below an accordion-group to provide a heading containing HTML +// +// Heading containing HTML - +// +.directive('accordionHeading', function() { + return { + restrict: 'EA', + transclude: true, // Grab the contents to be used as the heading + template: '', // In effect remove this element! + replace: true, + require: '^accordionGroup', + link: function(scope, element, attr, accordionGroupCtrl, transclude) { + // Pass the heading to the accordion-group controller + // so that it can be transcluded into the right place in the template + // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat] + accordionGroupCtrl.setHeading(transclude(scope, function() {})); + } + }; +}) + +// Use in the accordion-group template to indicate where you want the heading to be transcluded +// You must provide the property on the accordion-group controller that will hold the transcluded element +//
        +//
        ...
        +// ... +//
        +.directive('accordionTransclude', function() { + return { + require: '^accordionGroup', + link: function(scope, element, attr, controller) { + scope.$watch(function() { return controller[attr.accordionTransclude]; }, function(heading) { + if ( heading ) { + element.html(''); + element.append(heading); + } + }); + } + }; +}); + +angular.module('ui.bootstrap.alert', []) + +.controller('AlertController', ['$scope', '$attrs', function ($scope, $attrs) { + $scope.closeable = 'close' in $attrs; + this.close = $scope.close; +}]) + +.directive('alert', function () { + return { + restrict:'EA', + controller:'AlertController', + templateUrl:'template/alert/alert.html', + transclude:true, + replace:true, + scope: { + type: '@', + close: '&' + } + }; +}) + +.directive('dismissOnTimeout', ['$timeout', function($timeout) { + return { + require: 'alert', + link: function(scope, element, attrs, alertCtrl) { + $timeout(function(){ + alertCtrl.close(); + }, parseInt(attrs.dismissOnTimeout, 10)); + } + }; +}]); + +angular.module('ui.bootstrap.bindHtml', []) + + .directive('bindHtmlUnsafe', function () { + return function (scope, element, attr) { + element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe); + scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) { + element.html(value || ''); + }); + }; + }); +angular.module('ui.bootstrap.buttons', []) + +.constant('buttonConfig', { + activeClass: 'active', + toggleEvent: 'click' +}) + +.controller('ButtonsController', ['buttonConfig', function(buttonConfig) { + this.activeClass = buttonConfig.activeClass || 'active'; + this.toggleEvent = buttonConfig.toggleEvent || 'click'; +}]) + +.directive('btnRadio', function () { + return { + require: ['btnRadio', 'ngModel'], + controller: 'ButtonsController', + link: function (scope, element, attrs, ctrls) { + var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + //model -> UI + ngModelCtrl.$render = function () { + element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio))); + }; + + //ui->model + element.bind(buttonsCtrl.toggleEvent, function () { + var isActive = element.hasClass(buttonsCtrl.activeClass); + + if (!isActive || angular.isDefined(attrs.uncheckable)) { + scope.$apply(function () { + ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.btnRadio)); + ngModelCtrl.$render(); + }); + } + }); + } + }; +}) + +.directive('btnCheckbox', function () { + return { + require: ['btnCheckbox', 'ngModel'], + controller: 'ButtonsController', + link: function (scope, element, attrs, ctrls) { + var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + function getTrueValue() { + return getCheckboxValue(attrs.btnCheckboxTrue, true); + } + + function getFalseValue() { + return getCheckboxValue(attrs.btnCheckboxFalse, false); + } + + function getCheckboxValue(attributeValue, defaultValue) { + var val = scope.$eval(attributeValue); + return angular.isDefined(val) ? val : defaultValue; + } + + //model -> UI + ngModelCtrl.$render = function () { + element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue())); + }; + + //ui->model + element.bind(buttonsCtrl.toggleEvent, function () { + scope.$apply(function () { + ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue()); + ngModelCtrl.$render(); + }); + }); + } + }; +}); + +/** +* @ngdoc overview +* @name ui.bootstrap.carousel +* +* @description +* AngularJS version of an image carousel. +* +*/ +angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition']) +.controller('CarouselController', ['$scope', '$timeout', '$interval', '$transition', function ($scope, $timeout, $interval, $transition) { + var self = this, + slides = self.slides = $scope.slides = [], + currentIndex = -1, + currentInterval, isPlaying; + self.currentSlide = null; + + var destroyed = false; + /* direction: "prev" or "next" */ + self.select = $scope.select = function(nextSlide, direction) { + var nextIndex = slides.indexOf(nextSlide); + //Decide direction if it's not given + if (direction === undefined) { + direction = nextIndex > currentIndex ? 'next' : 'prev'; + } + if (nextSlide && nextSlide !== self.currentSlide) { + if ($scope.$currentTransition) { + $scope.$currentTransition.cancel(); + //Timeout so ng-class in template has time to fix classes for finished slide + $timeout(goNext); + } else { + goNext(); + } + } + function goNext() { + // Scope has been destroyed, stop here. + if (destroyed) { return; } + //If we have a slide to transition from and we have a transition type and we're allowed, go + if (self.currentSlide && angular.isString(direction) && !$scope.noTransition && nextSlide.$element) { + //We shouldn't do class manip in here, but it's the same weird thing bootstrap does. need to fix sometime + nextSlide.$element.addClass(direction); + var reflow = nextSlide.$element[0].offsetWidth; //force reflow + + //Set all other slides to stop doing their stuff for the new transition + angular.forEach(slides, function(slide) { + angular.extend(slide, {direction: '', entering: false, leaving: false, active: false}); + }); + angular.extend(nextSlide, {direction: direction, active: true, entering: true}); + angular.extend(self.currentSlide||{}, {direction: direction, leaving: true}); + + $scope.$currentTransition = $transition(nextSlide.$element, {}); + //We have to create new pointers inside a closure since next & current will change + (function(next,current) { + $scope.$currentTransition.then( + function(){ transitionDone(next, current); }, + function(){ transitionDone(next, current); } + ); + }(nextSlide, self.currentSlide)); + } else { + transitionDone(nextSlide, self.currentSlide); + } + self.currentSlide = nextSlide; + currentIndex = nextIndex; + //every time you change slides, reset the timer + restartTimer(); + } + function transitionDone(next, current) { + angular.extend(next, {direction: '', active: true, leaving: false, entering: false}); + angular.extend(current||{}, {direction: '', active: false, leaving: false, entering: false}); + $scope.$currentTransition = null; + } + }; + $scope.$on('$destroy', function () { + destroyed = true; + }); + + /* Allow outside people to call indexOf on slides array */ + self.indexOfSlide = function(slide) { + return slides.indexOf(slide); + }; + + $scope.next = function() { + var newIndex = (currentIndex + 1) % slides.length; + + //Prevent this user-triggered transition from occurring if there is already one in progress + if (!$scope.$currentTransition) { + return self.select(slides[newIndex], 'next'); + } + }; + + $scope.prev = function() { + var newIndex = currentIndex - 1 < 0 ? slides.length - 1 : currentIndex - 1; + + //Prevent this user-triggered transition from occurring if there is already one in progress + if (!$scope.$currentTransition) { + return self.select(slides[newIndex], 'prev'); + } + }; + + $scope.isActive = function(slide) { + return self.currentSlide === slide; + }; + + $scope.$watch('interval', restartTimer); + $scope.$on('$destroy', resetTimer); + + function restartTimer() { + resetTimer(); + var interval = +$scope.interval; + if (!isNaN(interval) && interval > 0) { + currentInterval = $interval(timerFn, interval); + } + } + + function resetTimer() { + if (currentInterval) { + $interval.cancel(currentInterval); + currentInterval = null; + } + } + + function timerFn() { + var interval = +$scope.interval; + if (isPlaying && !isNaN(interval) && interval > 0) { + $scope.next(); + } else { + $scope.pause(); + } + } + + $scope.play = function() { + if (!isPlaying) { + isPlaying = true; + restartTimer(); + } + }; + $scope.pause = function() { + if (!$scope.noPause) { + isPlaying = false; + resetTimer(); + } + }; + + self.addSlide = function(slide, element) { + slide.$element = element; + slides.push(slide); + //if this is the first slide or the slide is set to active, select it + if(slides.length === 1 || slide.active) { + self.select(slides[slides.length-1]); + if (slides.length == 1) { + $scope.play(); + } + } else { + slide.active = false; + } + }; + + self.removeSlide = function(slide) { + //get the index of the slide inside the carousel + var index = slides.indexOf(slide); + slides.splice(index, 1); + if (slides.length > 0 && slide.active) { + if (index >= slides.length) { + self.select(slides[index-1]); + } else { + self.select(slides[index]); + } + } else if (currentIndex > index) { + currentIndex--; + } + }; + +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.carousel.directive:carousel + * @restrict EA + * + * @description + * Carousel is the outer container for a set of image 'slides' to showcase. + * + * @param {number=} interval The time, in milliseconds, that it will take the carousel to go to the next slide. + * @param {boolean=} noTransition Whether to disable transitions on the carousel. + * @param {boolean=} noPause Whether to disable pausing on the carousel (by default, the carousel interval pauses on hover). + * + * @example + + + + + +
        +

        Beautiful!

        +
        +
        + + +
        +

        D'aww!

        +
        +
        +
        +
        + + .carousel-indicators { + top: auto; + bottom: 15px; + } + +
        + */ +.directive('carousel', [function() { + return { + restrict: 'EA', + transclude: true, + replace: true, + controller: 'CarouselController', + require: 'carousel', + templateUrl: 'template/carousel/carousel.html', + scope: { + interval: '=', + noTransition: '=', + noPause: '=' + } + }; +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.carousel.directive:slide + * @restrict EA + * + * @description + * Creates a slide inside a {@link ui.bootstrap.carousel.directive:carousel carousel}. Must be placed as a child of a carousel element. + * + * @param {boolean=} active Model binding, whether or not this slide is currently active. + * + * @example + + +
        + + + +
        +

        Slide {{$index}}

        +

        {{slide.text}}

        +
        +
        +
        + Interval, in milliseconds: +
        Enter a negative number to stop the interval. +
        +
        + +function CarouselDemoCtrl($scope) { + $scope.myInterval = 5000; +} + + + .carousel-indicators { + top: auto; + bottom: 15px; + } + +
        +*/ + +.directive('slide', function() { + return { + require: '^carousel', + restrict: 'EA', + transclude: true, + replace: true, + templateUrl: 'template/carousel/slide.html', + scope: { + active: '=?' + }, + link: function (scope, element, attrs, carouselCtrl) { + carouselCtrl.addSlide(scope, element); + //when the scope is destroyed then remove the slide from the current slides array + scope.$on('$destroy', function() { + carouselCtrl.removeSlide(scope); + }); + + scope.$watch('active', function(active) { + if (active) { + carouselCtrl.select(scope); + } + }); + } + }; +}); + +angular.module('ui.bootstrap.dateparser', []) + +.service('dateParser', ['$locale', 'orderByFilter', function($locale, orderByFilter) { + + this.parsers = {}; + + var formatCodeToRegex = { + 'yyyy': { + regex: '\\d{4}', + apply: function(value) { this.year = +value; } + }, + 'yy': { + regex: '\\d{2}', + apply: function(value) { this.year = +value + 2000; } + }, + 'y': { + regex: '\\d{1,4}', + apply: function(value) { this.year = +value; } + }, + 'MMMM': { + regex: $locale.DATETIME_FORMATS.MONTH.join('|'), + apply: function(value) { this.month = $locale.DATETIME_FORMATS.MONTH.indexOf(value); } + }, + 'MMM': { + regex: $locale.DATETIME_FORMATS.SHORTMONTH.join('|'), + apply: function(value) { this.month = $locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value); } + }, + 'MM': { + regex: '0[1-9]|1[0-2]', + apply: function(value) { this.month = value - 1; } + }, + 'M': { + regex: '[1-9]|1[0-2]', + apply: function(value) { this.month = value - 1; } + }, + 'dd': { + regex: '[0-2][0-9]{1}|3[0-1]{1}', + apply: function(value) { this.date = +value; } + }, + 'd': { + regex: '[1-2]?[0-9]{1}|3[0-1]{1}', + apply: function(value) { this.date = +value; } + }, + 'EEEE': { + regex: $locale.DATETIME_FORMATS.DAY.join('|') + }, + 'EEE': { + regex: $locale.DATETIME_FORMATS.SHORTDAY.join('|') + } + }; + + function createParser(format) { + var map = [], regex = format.split(''); + + angular.forEach(formatCodeToRegex, function(data, code) { + var index = format.indexOf(code); + + if (index > -1) { + format = format.split(''); + + regex[index] = '(' + data.regex + ')'; + format[index] = '$'; // Custom symbol to define consumed part of format + for (var i = index + 1, n = index + code.length; i < n; i++) { + regex[i] = ''; + format[i] = '$'; + } + format = format.join(''); + + map.push({ index: index, apply: data.apply }); + } + }); + + return { + regex: new RegExp('^' + regex.join('') + '$'), + map: orderByFilter(map, 'index') + }; + } + + this.parse = function(input, format) { + if ( !angular.isString(input) || !format ) { + return input; + } + + format = $locale.DATETIME_FORMATS[format] || format; + + if ( !this.parsers[format] ) { + this.parsers[format] = createParser(format); + } + + var parser = this.parsers[format], + regex = parser.regex, + map = parser.map, + results = input.match(regex); + + if ( results && results.length ) { + var fields = { year: 1900, month: 0, date: 1, hours: 0 }, dt; + + for( var i = 1, n = results.length; i < n; i++ ) { + var mapper = map[i-1]; + if ( mapper.apply ) { + mapper.apply.call(fields, results[i]); + } + } + + if ( isValid(fields.year, fields.month, fields.date) ) { + dt = new Date( fields.year, fields.month, fields.date, fields.hours); + } + + return dt; + } + }; + + // Check if date is valid for specific month (and year for February). + // Month: 0 = Jan, 1 = Feb, etc + function isValid(year, month, date) { + if ( month === 1 && date > 28) { + return date === 29 && ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0); + } + + if ( month === 3 || month === 5 || month === 8 || month === 10) { + return date < 31; + } + + return true; + } +}]); + +angular.module('ui.bootstrap.position', []) + +/** + * A set of utility methods that can be use to retrieve position of DOM elements. + * It is meant to be used where we need to absolute-position DOM elements in + * relation to other, existing elements (this is the case for tooltips, popovers, + * typeahead suggestions etc.). + */ + .factory('$position', ['$document', '$window', function ($document, $window) { + + function getStyle(el, cssprop) { + if (el.currentStyle) { //IE + return el.currentStyle[cssprop]; + } else if ($window.getComputedStyle) { + return $window.getComputedStyle(el)[cssprop]; + } + // finally try and get inline style + return el.style[cssprop]; + } + + /** + * Checks if a given element is statically positioned + * @param element - raw DOM element + */ + function isStaticPositioned(element) { + return (getStyle(element, 'position') || 'static' ) === 'static'; + } + + /** + * returns the closest, non-statically positioned parentOffset of a given element + * @param element + */ + var parentOffsetEl = function (element) { + var docDomEl = $document[0]; + var offsetParent = element.offsetParent || docDomEl; + while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent || docDomEl; + }; + + return { + /** + * Provides read-only equivalent of jQuery's position function: + * http://api.jquery.com/position/ + */ + position: function (element) { + var elBCR = this.offset(element); + var offsetParentBCR = { top: 0, left: 0 }; + var offsetParentEl = parentOffsetEl(element[0]); + if (offsetParentEl != $document[0]) { + offsetParentBCR = this.offset(angular.element(offsetParentEl)); + offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop; + offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft; + } + + var boundingClientRect = element[0].getBoundingClientRect(); + return { + width: boundingClientRect.width || element.prop('offsetWidth'), + height: boundingClientRect.height || element.prop('offsetHeight'), + top: elBCR.top - offsetParentBCR.top, + left: elBCR.left - offsetParentBCR.left + }; + }, + + /** + * Provides read-only equivalent of jQuery's offset function: + * http://api.jquery.com/offset/ + */ + offset: function (element) { + var boundingClientRect = element[0].getBoundingClientRect(); + return { + width: boundingClientRect.width || element.prop('offsetWidth'), + height: boundingClientRect.height || element.prop('offsetHeight'), + top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop), + left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft) + }; + }, + + /** + * Provides coordinates for the targetEl in relation to hostEl + */ + positionElements: function (hostEl, targetEl, positionStr, appendToBody) { + + var positionStrParts = positionStr.split('-'); + var pos0 = positionStrParts[0], pos1 = positionStrParts[1] || 'center'; + + var hostElPos, + targetElWidth, + targetElHeight, + targetElPos; + + hostElPos = appendToBody ? this.offset(hostEl) : this.position(hostEl); + + targetElWidth = targetEl.prop('offsetWidth'); + targetElHeight = targetEl.prop('offsetHeight'); + + var shiftWidth = { + center: function () { + return hostElPos.left + hostElPos.width / 2 - targetElWidth / 2; + }, + left: function () { + return hostElPos.left; + }, + right: function () { + return hostElPos.left + hostElPos.width; + } + }; + + var shiftHeight = { + center: function () { + return hostElPos.top + hostElPos.height / 2 - targetElHeight / 2; + }, + top: function () { + return hostElPos.top; + }, + bottom: function () { + return hostElPos.top + hostElPos.height; + } + }; + + switch (pos0) { + case 'right': + targetElPos = { + top: shiftHeight[pos1](), + left: shiftWidth[pos0]() + }; + break; + case 'left': + targetElPos = { + top: shiftHeight[pos1](), + left: hostElPos.left - targetElWidth + }; + break; + case 'bottom': + targetElPos = { + top: shiftHeight[pos0](), + left: shiftWidth[pos1]() + }; + break; + default: + targetElPos = { + top: hostElPos.top - targetElHeight, + left: shiftWidth[pos1]() + }; + break; + } + + return targetElPos; + } + }; + }]); + +angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootstrap.position']) + +.constant('datepickerConfig', { + formatDay: 'dd', + formatMonth: 'MMMM', + formatYear: 'yyyy', + formatDayHeader: 'EEE', + formatDayTitle: 'MMMM yyyy', + formatMonthTitle: 'yyyy', + datepickerMode: 'day', + minMode: 'day', + maxMode: 'year', + showWeeks: true, + startingDay: 0, + yearRange: 20, + minDate: null, + maxDate: null +}) + +.controller('DatepickerController', ['$scope', '$attrs', '$parse', '$interpolate', '$timeout', '$log', 'dateFilter', 'datepickerConfig', function($scope, $attrs, $parse, $interpolate, $timeout, $log, dateFilter, datepickerConfig) { + var self = this, + ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl; + + // Modes chain + this.modes = ['day', 'month', 'year']; + + // Configuration attributes + angular.forEach(['formatDay', 'formatMonth', 'formatYear', 'formatDayHeader', 'formatDayTitle', 'formatMonthTitle', + 'minMode', 'maxMode', 'showWeeks', 'startingDay', 'yearRange'], function( key, index ) { + self[key] = angular.isDefined($attrs[key]) ? (index < 8 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key])) : datepickerConfig[key]; + }); + + // Watchable date attributes + angular.forEach(['minDate', 'maxDate'], function( key ) { + if ( $attrs[key] ) { + $scope.$parent.$watch($parse($attrs[key]), function(value) { + self[key] = value ? new Date(value) : null; + self.refreshView(); + }); + } else { + self[key] = datepickerConfig[key] ? new Date(datepickerConfig[key]) : null; + } + }); + + $scope.datepickerMode = $scope.datepickerMode || datepickerConfig.datepickerMode; + $scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000); + this.activeDate = angular.isDefined($attrs.initDate) ? $scope.$parent.$eval($attrs.initDate) : new Date(); + + $scope.isActive = function(dateObject) { + if (self.compare(dateObject.date, self.activeDate) === 0) { + $scope.activeDateId = dateObject.uid; + return true; + } + return false; + }; + + this.init = function( ngModelCtrl_ ) { + ngModelCtrl = ngModelCtrl_; + + ngModelCtrl.$render = function() { + self.render(); + }; + }; + + this.render = function() { + if ( ngModelCtrl.$modelValue ) { + var date = new Date( ngModelCtrl.$modelValue ), + isValid = !isNaN(date); + + if ( isValid ) { + this.activeDate = date; + } else { + $log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); + } + ngModelCtrl.$setValidity('date', isValid); + } + this.refreshView(); + }; + + this.refreshView = function() { + if ( this.element ) { + this._refreshView(); + + var date = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null; + ngModelCtrl.$setValidity('date-disabled', !date || (this.element && !this.isDisabled(date))); + } + }; + + this.createDateObject = function(date, format) { + var model = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null; + return { + date: date, + label: dateFilter(date, format), + selected: model && this.compare(date, model) === 0, + disabled: this.isDisabled(date), + current: this.compare(date, new Date()) === 0 + }; + }; + + this.isDisabled = function( date ) { + return ((this.minDate && this.compare(date, this.minDate) < 0) || (this.maxDate && this.compare(date, this.maxDate) > 0) || ($attrs.dateDisabled && $scope.dateDisabled({date: date, mode: $scope.datepickerMode}))); + }; + + // Split array into smaller arrays + this.split = function(arr, size) { + var arrays = []; + while (arr.length > 0) { + arrays.push(arr.splice(0, size)); + } + return arrays; + }; + + $scope.select = function( date ) { + if ( $scope.datepickerMode === self.minMode ) { + var dt = ngModelCtrl.$modelValue ? new Date( ngModelCtrl.$modelValue ) : new Date(0, 0, 0, 0, 0, 0, 0); + dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() ); + ngModelCtrl.$setViewValue( dt ); + ngModelCtrl.$render(); + } else { + self.activeDate = date; + $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) - 1 ]; + } + }; + + $scope.move = function( direction ) { + var year = self.activeDate.getFullYear() + direction * (self.step.years || 0), + month = self.activeDate.getMonth() + direction * (self.step.months || 0); + self.activeDate.setFullYear(year, month, 1); + self.refreshView(); + }; + + $scope.toggleMode = function( direction ) { + direction = direction || 1; + + if (($scope.datepickerMode === self.maxMode && direction === 1) || ($scope.datepickerMode === self.minMode && direction === -1)) { + return; + } + + $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) + direction ]; + }; + + // Key event mapper + $scope.keys = { 13:'enter', 32:'space', 33:'pageup', 34:'pagedown', 35:'end', 36:'home', 37:'left', 38:'up', 39:'right', 40:'down' }; + + var focusElement = function() { + $timeout(function() { + self.element[0].focus(); + }, 0 , false); + }; + + // Listen for focus requests from popup directive + $scope.$on('datepicker.focus', focusElement); + + $scope.keydown = function( evt ) { + var key = $scope.keys[evt.which]; + + if ( !key || evt.shiftKey || evt.altKey ) { + return; + } + + evt.preventDefault(); + evt.stopPropagation(); + + if (key === 'enter' || key === 'space') { + if ( self.isDisabled(self.activeDate)) { + return; // do nothing + } + $scope.select(self.activeDate); + focusElement(); + } else if (evt.ctrlKey && (key === 'up' || key === 'down')) { + $scope.toggleMode(key === 'up' ? 1 : -1); + focusElement(); + } else { + self.handleKeyDown(key, evt); + self.refreshView(); + } + }; +}]) + +.directive( 'datepicker', function () { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/datepicker.html', + scope: { + datepickerMode: '=?', + dateDisabled: '&' + }, + require: ['datepicker', '?^ngModel'], + controller: 'DatepickerController', + link: function(scope, element, attrs, ctrls) { + var datepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + datepickerCtrl.init( ngModelCtrl ); + } + } + }; +}) + +.directive('daypicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/day.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + scope.showWeeks = ctrl.showWeeks; + + ctrl.step = { months: 1 }; + ctrl.element = element; + + var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + function getDaysInMonth( year, month ) { + return ((month === 1) && (year % 4 === 0) && ((year % 100 !== 0) || (year % 400 === 0))) ? 29 : DAYS_IN_MONTH[month]; + } + + function getDates(startDate, n) { + var dates = new Array(n), current = new Date(startDate), i = 0; + current.setHours(12); // Prevent repeated dates because of timezone bug + while ( i < n ) { + dates[i++] = new Date(current); + current.setDate( current.getDate() + 1 ); + } + return dates; + } + + ctrl._refreshView = function() { + var year = ctrl.activeDate.getFullYear(), + month = ctrl.activeDate.getMonth(), + firstDayOfMonth = new Date(year, month, 1), + difference = ctrl.startingDay - firstDayOfMonth.getDay(), + numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference, + firstDate = new Date(firstDayOfMonth); + + if ( numDisplayedFromPreviousMonth > 0 ) { + firstDate.setDate( - numDisplayedFromPreviousMonth + 1 ); + } + + // 42 is the number of days on a six-month calendar + var days = getDates(firstDate, 42); + for (var i = 0; i < 42; i ++) { + days[i] = angular.extend(ctrl.createDateObject(days[i], ctrl.formatDay), { + secondary: days[i].getMonth() !== month, + uid: scope.uniqueId + '-' + i + }); + } + + scope.labels = new Array(7); + for (var j = 0; j < 7; j++) { + scope.labels[j] = { + abbr: dateFilter(days[j].date, ctrl.formatDayHeader), + full: dateFilter(days[j].date, 'EEEE') + }; + } + + scope.title = dateFilter(ctrl.activeDate, ctrl.formatDayTitle); + scope.rows = ctrl.split(days, 7); + + if ( scope.showWeeks ) { + scope.weekNumbers = []; + var weekNumber = getISO8601WeekNumber( scope.rows[0][0].date ), + numWeeks = scope.rows.length; + while( scope.weekNumbers.push(weekNumber++) < numWeeks ) {} + } + }; + + ctrl.compare = function(date1, date2) { + return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) ); + }; + + function getISO8601WeekNumber(date) { + var checkDate = new Date(date); + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday + var time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + } + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getDate(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 7; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 7; + } else if (key === 'pageup' || key === 'pagedown') { + var month = ctrl.activeDate.getMonth() + (key === 'pageup' ? - 1 : 1); + ctrl.activeDate.setMonth(month, 1); + date = Math.min(getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()), date); + } else if (key === 'home') { + date = 1; + } else if (key === 'end') { + date = getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()); + } + ctrl.activeDate.setDate(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.directive('monthpicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/month.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + ctrl.step = { years: 1 }; + ctrl.element = element; + + ctrl._refreshView = function() { + var months = new Array(12), + year = ctrl.activeDate.getFullYear(); + + for ( var i = 0; i < 12; i++ ) { + months[i] = angular.extend(ctrl.createDateObject(new Date(year, i, 1), ctrl.formatMonth), { + uid: scope.uniqueId + '-' + i + }); + } + + scope.title = dateFilter(ctrl.activeDate, ctrl.formatMonthTitle); + scope.rows = ctrl.split(months, 3); + }; + + ctrl.compare = function(date1, date2) { + return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() ); + }; + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getMonth(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 3; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 3; + } else if (key === 'pageup' || key === 'pagedown') { + var year = ctrl.activeDate.getFullYear() + (key === 'pageup' ? - 1 : 1); + ctrl.activeDate.setFullYear(year); + } else if (key === 'home') { + date = 0; + } else if (key === 'end') { + date = 11; + } + ctrl.activeDate.setMonth(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.directive('yearpicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/year.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + var range = ctrl.yearRange; + + ctrl.step = { years: range }; + ctrl.element = element; + + function getStartingYear( year ) { + return parseInt((year - 1) / range, 10) * range + 1; + } + + ctrl._refreshView = function() { + var years = new Array(range); + + for ( var i = 0, start = getStartingYear(ctrl.activeDate.getFullYear()); i < range; i++ ) { + years[i] = angular.extend(ctrl.createDateObject(new Date(start + i, 0, 1), ctrl.formatYear), { + uid: scope.uniqueId + '-' + i + }); + } + + scope.title = [years[0].label, years[range - 1].label].join(' - '); + scope.rows = ctrl.split(years, 5); + }; + + ctrl.compare = function(date1, date2) { + return date1.getFullYear() - date2.getFullYear(); + }; + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getFullYear(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 5; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 5; + } else if (key === 'pageup' || key === 'pagedown') { + date += (key === 'pageup' ? - 1 : 1) * ctrl.step.years; + } else if (key === 'home') { + date = getStartingYear( ctrl.activeDate.getFullYear() ); + } else if (key === 'end') { + date = getStartingYear( ctrl.activeDate.getFullYear() ) + range - 1; + } + ctrl.activeDate.setFullYear(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.constant('datepickerPopupConfig', { + datepickerPopup: 'yyyy-MM-dd', + currentText: 'Today', + clearText: 'Clear', + closeText: 'Done', + closeOnDateSelection: true, + appendToBody: false, + showButtonBar: true +}) + +.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'dateParser', 'datepickerPopupConfig', +function ($compile, $parse, $document, $position, dateFilter, dateParser, datepickerPopupConfig) { + return { + restrict: 'EA', + require: 'ngModel', + scope: { + isOpen: '=?', + currentText: '@', + clearText: '@', + closeText: '@', + dateDisabled: '&' + }, + link: function(scope, element, attrs, ngModel) { + var dateFormat, + closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? scope.$parent.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection, + appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? scope.$parent.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody; + + scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? scope.$parent.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar; + + scope.getText = function( key ) { + return scope[key + 'Text'] || datepickerPopupConfig[key + 'Text']; + }; + + attrs.$observe('datepickerPopup', function(value) { + dateFormat = value || datepickerPopupConfig.datepickerPopup; + ngModel.$render(); + }); + + // popup element used to display calendar + var popupEl = angular.element('
        '); + popupEl.attr({ + 'ng-model': 'date', + 'ng-change': 'dateSelection()' + }); + + function cameltoDash( string ){ + return string.replace(/([A-Z])/g, function($1) { return '-' + $1.toLowerCase(); }); + } + + // datepicker element + var datepickerEl = angular.element(popupEl.children()[0]); + if ( attrs.datepickerOptions ) { + angular.forEach(scope.$parent.$eval(attrs.datepickerOptions), function( value, option ) { + datepickerEl.attr( cameltoDash(option), value ); + }); + } + + scope.watchData = {}; + angular.forEach(['minDate', 'maxDate', 'datepickerMode'], function( key ) { + if ( attrs[key] ) { + var getAttribute = $parse(attrs[key]); + scope.$parent.$watch(getAttribute, function(value){ + scope.watchData[key] = value; + }); + datepickerEl.attr(cameltoDash(key), 'watchData.' + key); + + // Propagate changes from datepicker to outside + if ( key === 'datepickerMode' ) { + var setAttribute = getAttribute.assign; + scope.$watch('watchData.' + key, function(value, oldvalue) { + if ( value !== oldvalue ) { + setAttribute(scope.$parent, value); + } + }); + } + } + }); + if (attrs.dateDisabled) { + datepickerEl.attr('date-disabled', 'dateDisabled({ date: date, mode: mode })'); + } + + function parseDate(viewValue) { + if (!viewValue) { + ngModel.$setValidity('date', true); + return null; + } else if (angular.isDate(viewValue) && !isNaN(viewValue)) { + ngModel.$setValidity('date', true); + return viewValue; + } else if (angular.isString(viewValue)) { + var date = dateParser.parse(viewValue, dateFormat) || new Date(viewValue); + if (isNaN(date)) { + ngModel.$setValidity('date', false); + return undefined; + } else { + ngModel.$setValidity('date', true); + return date; + } + } else { + ngModel.$setValidity('date', false); + return undefined; + } + } + ngModel.$parsers.unshift(parseDate); + + // Inner change + scope.dateSelection = function(dt) { + if (angular.isDefined(dt)) { + scope.date = dt; + } + ngModel.$setViewValue(scope.date); + ngModel.$render(); + + if ( closeOnDateSelection ) { + scope.isOpen = false; + element[0].focus(); + } + }; + + element.bind('input change keyup', function() { + scope.$apply(function() { + scope.date = ngModel.$modelValue; + }); + }); + + // Outter change + ngModel.$render = function() { + var date = ngModel.$viewValue ? dateFilter(ngModel.$viewValue, dateFormat) : ''; + element.val(date); + scope.date = parseDate( ngModel.$modelValue ); + }; + + var documentClickBind = function(event) { + if (scope.isOpen && event.target !== element[0]) { + scope.$apply(function() { + scope.isOpen = false; + }); + } + }; + + var keydown = function(evt, noApply) { + scope.keydown(evt); + }; + element.bind('keydown', keydown); + + scope.keydown = function(evt) { + if (evt.which === 27) { + evt.preventDefault(); + evt.stopPropagation(); + scope.close(); + } else if (evt.which === 40 && !scope.isOpen) { + scope.isOpen = true; + } + }; + + scope.$watch('isOpen', function(value) { + if (value) { + scope.$broadcast('datepicker.focus'); + scope.position = appendToBody ? $position.offset(element) : $position.position(element); + scope.position.top = scope.position.top + element.prop('offsetHeight'); + + $document.bind('click', documentClickBind); + } else { + $document.unbind('click', documentClickBind); + } + }); + + scope.select = function( date ) { + if (date === 'today') { + var today = new Date(); + if (angular.isDate(ngModel.$modelValue)) { + date = new Date(ngModel.$modelValue); + date.setFullYear(today.getFullYear(), today.getMonth(), today.getDate()); + } else { + date = new Date(today.setHours(0, 0, 0, 0)); + } + } + scope.dateSelection( date ); + }; + + scope.close = function() { + scope.isOpen = false; + element[0].focus(); + }; + + var $popup = $compile(popupEl)(scope); + // Prevent jQuery cache memory leak (template is now redundant after linking) + popupEl.remove(); + + if ( appendToBody ) { + $document.find('body').append($popup); + } else { + element.after($popup); + } + + scope.$on('$destroy', function() { + $popup.remove(); + element.unbind('keydown', keydown); + $document.unbind('click', documentClickBind); + }); + } + }; +}]) + +.directive('datepickerPopupWrap', function() { + return { + restrict:'EA', + replace: true, + transclude: true, + templateUrl: 'template/datepicker/popup.html', + link:function (scope, element, attrs) { + element.bind('click', function(event) { + event.preventDefault(); + event.stopPropagation(); + }); + } + }; +}); + +angular.module('ui.bootstrap.dropdown', []) + +.constant('dropdownConfig', { + openClass: 'open' +}) + +.service('dropdownService', ['$document', function($document) { + var openScope = null; + + this.open = function( dropdownScope ) { + if ( !openScope ) { + $document.bind('click', closeDropdown); + $document.bind('keydown', escapeKeyBind); + } + + if ( openScope && openScope !== dropdownScope ) { + openScope.isOpen = false; + } + + openScope = dropdownScope; + }; + + this.close = function( dropdownScope ) { + if ( openScope === dropdownScope ) { + openScope = null; + $document.unbind('click', closeDropdown); + $document.unbind('keydown', escapeKeyBind); + } + }; + + var closeDropdown = function( evt ) { + // This method may still be called during the same mouse event that + // unbound this event handler. So check openScope before proceeding. + if (!openScope) { return; } + + var toggleElement = openScope.getToggleElement(); + if ( evt && toggleElement && toggleElement[0].contains(evt.target) ) { + return; + } + + openScope.$apply(function() { + openScope.isOpen = false; + }); + }; + + var escapeKeyBind = function( evt ) { + if ( evt.which === 27 ) { + openScope.focusToggleElement(); + closeDropdown(); + } + }; +}]) + +.controller('DropdownController', ['$scope', '$attrs', '$parse', 'dropdownConfig', 'dropdownService', '$animate', function($scope, $attrs, $parse, dropdownConfig, dropdownService, $animate) { + var self = this, + scope = $scope.$new(), // create a child scope so we are not polluting original one + openClass = dropdownConfig.openClass, + getIsOpen, + setIsOpen = angular.noop, + toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop; + + this.init = function( element ) { + self.$element = element; + + if ( $attrs.isOpen ) { + getIsOpen = $parse($attrs.isOpen); + setIsOpen = getIsOpen.assign; + + $scope.$watch(getIsOpen, function(value) { + scope.isOpen = !!value; + }); + } + }; + + this.toggle = function( open ) { + return scope.isOpen = arguments.length ? !!open : !scope.isOpen; + }; + + // Allow other directives to watch status + this.isOpen = function() { + return scope.isOpen; + }; + + scope.getToggleElement = function() { + return self.toggleElement; + }; + + scope.focusToggleElement = function() { + if ( self.toggleElement ) { + self.toggleElement[0].focus(); + } + }; + + scope.$watch('isOpen', function( isOpen, wasOpen ) { + $animate[isOpen ? 'addClass' : 'removeClass'](self.$element, openClass); + + if ( isOpen ) { + scope.focusToggleElement(); + dropdownService.open( scope ); + } else { + dropdownService.close( scope ); + } + + setIsOpen($scope, isOpen); + if (angular.isDefined(isOpen) && isOpen !== wasOpen) { + toggleInvoker($scope, { open: !!isOpen }); + } + }); + + $scope.$on('$locationChangeSuccess', function() { + scope.isOpen = false; + }); + + $scope.$on('$destroy', function() { + scope.$destroy(); + }); +}]) + +.directive('dropdown', function() { + return { + controller: 'DropdownController', + link: function(scope, element, attrs, dropdownCtrl) { + dropdownCtrl.init( element ); + } + }; +}) + +.directive('dropdownToggle', function() { + return { + require: '?^dropdown', + link: function(scope, element, attrs, dropdownCtrl) { + if ( !dropdownCtrl ) { + return; + } + + dropdownCtrl.toggleElement = element; + + var toggleDropdown = function(event) { + event.preventDefault(); + + if ( !element.hasClass('disabled') && !attrs.disabled ) { + scope.$apply(function() { + dropdownCtrl.toggle(); + }); + } + }; + + element.bind('click', toggleDropdown); + + // WAI-ARIA + element.attr({ 'aria-haspopup': true, 'aria-expanded': false }); + scope.$watch(dropdownCtrl.isOpen, function( isOpen ) { + element.attr('aria-expanded', !!isOpen); + }); + + scope.$on('$destroy', function() { + element.unbind('click', toggleDropdown); + }); + } + }; +}); + +angular.module('ui.bootstrap.modal', ['ui.bootstrap.transition']) + +/** + * A helper, internal data structure that acts as a map but also allows getting / removing + * elements in the LIFO order + */ + .factory('$$stackedMap', function () { + return { + createNew: function () { + var stack = []; + + return { + add: function (key, value) { + stack.push({ + key: key, + value: value + }); + }, + get: function (key) { + for (var i = 0; i < stack.length; i++) { + if (key == stack[i].key) { + return stack[i]; + } + } + }, + keys: function() { + var keys = []; + for (var i = 0; i < stack.length; i++) { + keys.push(stack[i].key); + } + return keys; + }, + top: function () { + return stack[stack.length - 1]; + }, + remove: function (key) { + var idx = -1; + for (var i = 0; i < stack.length; i++) { + if (key == stack[i].key) { + idx = i; + break; + } + } + return stack.splice(idx, 1)[0]; + }, + removeTop: function () { + return stack.splice(stack.length - 1, 1)[0]; + }, + length: function () { + return stack.length; + } + }; + } + }; + }) + +/** + * A helper directive for the $modal service. It creates a backdrop element. + */ + .directive('modalBackdrop', ['$timeout', function ($timeout) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/modal/backdrop.html', + link: function (scope, element, attrs) { + scope.backdropClass = attrs.backdropClass || ''; + + scope.animate = false; + + //trigger CSS transitions + $timeout(function () { + scope.animate = true; + }); + } + }; + }]) + + .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) { + return { + restrict: 'EA', + scope: { + index: '@', + animate: '=' + }, + replace: true, + transclude: true, + templateUrl: function(tElement, tAttrs) { + return tAttrs.templateUrl || 'template/modal/window.html'; + }, + link: function (scope, element, attrs) { + element.addClass(attrs.windowClass || ''); + scope.size = attrs.size; + + $timeout(function () { + // trigger CSS transitions + scope.animate = true; + + /** + * Auto-focusing of a freshly-opened modal element causes any child elements + * with the autofocus attribute to lose focus. This is an issue on touch + * based devices which will show and then hide the onscreen keyboard. + * Attempts to refocus the autofocus element via JavaScript will not reopen + * the onscreen keyboard. Fixed by updated the focusing logic to only autofocus + * the modal element if the modal does not contain an autofocus element. + */ + if (!element[0].querySelectorAll('[autofocus]').length) { + element[0].focus(); + } + }); + + scope.close = function (evt) { + var modal = $modalStack.getTop(); + if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) { + evt.preventDefault(); + evt.stopPropagation(); + $modalStack.dismiss(modal.key, 'backdrop click'); + } + }; + } + }; + }]) + + .directive('modalTransclude', function () { + return { + link: function($scope, $element, $attrs, controller, $transclude) { + $transclude($scope.$parent, function(clone) { + $element.empty(); + $element.append(clone); + }); + } + }; + }) + + .factory('$modalStack', ['$transition', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap', + function ($transition, $timeout, $document, $compile, $rootScope, $$stackedMap) { + + var OPENED_MODAL_CLASS = 'modal-open'; + + var backdropDomEl, backdropScope; + var openedWindows = $$stackedMap.createNew(); + var $modalStack = {}; + + function backdropIndex() { + var topBackdropIndex = -1; + var opened = openedWindows.keys(); + for (var i = 0; i < opened.length; i++) { + if (openedWindows.get(opened[i]).value.backdrop) { + topBackdropIndex = i; + } + } + return topBackdropIndex; + } + + $rootScope.$watch(backdropIndex, function(newBackdropIndex){ + if (backdropScope) { + backdropScope.index = newBackdropIndex; + } + }); + + function removeModalWindow(modalInstance) { + + var body = $document.find('body').eq(0); + var modalWindow = openedWindows.get(modalInstance).value; + + //clean up the stack + openedWindows.remove(modalInstance); + + //remove window DOM element + removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, 300, function() { + modalWindow.modalScope.$destroy(); + body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0); + checkRemoveBackdrop(); + }); + } + + function checkRemoveBackdrop() { + //remove backdrop if no longer needed + if (backdropDomEl && backdropIndex() == -1) { + var backdropScopeRef = backdropScope; + removeAfterAnimate(backdropDomEl, backdropScope, 150, function () { + backdropScopeRef.$destroy(); + backdropScopeRef = null; + }); + backdropDomEl = undefined; + backdropScope = undefined; + } + } + + function removeAfterAnimate(domEl, scope, emulateTime, done) { + // Closing animation + scope.animate = false; + + var transitionEndEventName = $transition.transitionEndEventName; + if (transitionEndEventName) { + // transition out + var timeout = $timeout(afterAnimating, emulateTime); + + domEl.bind(transitionEndEventName, function () { + $timeout.cancel(timeout); + afterAnimating(); + scope.$apply(); + }); + } else { + // Ensure this call is async + $timeout(afterAnimating); + } + + function afterAnimating() { + if (afterAnimating.done) { + return; + } + afterAnimating.done = true; + + domEl.remove(); + if (done) { + done(); + } + } + } + + $document.bind('keydown', function (evt) { + var modal; + + if (evt.which === 27) { + modal = openedWindows.top(); + if (modal && modal.value.keyboard) { + evt.preventDefault(); + $rootScope.$apply(function () { + $modalStack.dismiss(modal.key, 'escape key press'); + }); + } + } + }); + + $modalStack.open = function (modalInstance, modal) { + + openedWindows.add(modalInstance, { + deferred: modal.deferred, + modalScope: modal.scope, + backdrop: modal.backdrop, + keyboard: modal.keyboard + }); + + var body = $document.find('body').eq(0), + currBackdropIndex = backdropIndex(); + + if (currBackdropIndex >= 0 && !backdropDomEl) { + backdropScope = $rootScope.$new(true); + backdropScope.index = currBackdropIndex; + var angularBackgroundDomEl = angular.element('
        '); + angularBackgroundDomEl.attr('backdrop-class', modal.backdropClass); + backdropDomEl = $compile(angularBackgroundDomEl)(backdropScope); + body.append(backdropDomEl); + } + + var angularDomEl = angular.element('
        '); + angularDomEl.attr({ + 'template-url': modal.windowTemplateUrl, + 'window-class': modal.windowClass, + 'size': modal.size, + 'index': openedWindows.length() - 1, + 'animate': 'animate' + }).html(modal.content); + + var modalDomEl = $compile(angularDomEl)(modal.scope); + openedWindows.top().value.modalDomEl = modalDomEl; + body.append(modalDomEl); + body.addClass(OPENED_MODAL_CLASS); + }; + + $modalStack.close = function (modalInstance, result) { + var modalWindow = openedWindows.get(modalInstance); + if (modalWindow) { + modalWindow.value.deferred.resolve(result); + removeModalWindow(modalInstance); + } + }; + + $modalStack.dismiss = function (modalInstance, reason) { + var modalWindow = openedWindows.get(modalInstance); + if (modalWindow) { + modalWindow.value.deferred.reject(reason); + removeModalWindow(modalInstance); + } + }; + + $modalStack.dismissAll = function (reason) { + var topModal = this.getTop(); + while (topModal) { + this.dismiss(topModal.key, reason); + topModal = this.getTop(); + } + }; + + $modalStack.getTop = function () { + return openedWindows.top(); + }; + + return $modalStack; + }]) + + .provider('$modal', function () { + + var $modalProvider = { + options: { + backdrop: true, //can be also false or 'static' + keyboard: true + }, + $get: ['$injector', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$modalStack', + function ($injector, $rootScope, $q, $http, $templateCache, $controller, $modalStack) { + + var $modal = {}; + + function getTemplatePromise(options) { + return options.template ? $q.when(options.template) : + $http.get(angular.isFunction(options.templateUrl) ? (options.templateUrl)() : options.templateUrl, + {cache: $templateCache}).then(function (result) { + return result.data; + }); + } + + function getResolvePromises(resolves) { + var promisesArr = []; + angular.forEach(resolves, function (value) { + if (angular.isFunction(value) || angular.isArray(value)) { + promisesArr.push($q.when($injector.invoke(value))); + } + }); + return promisesArr; + } + + $modal.open = function (modalOptions) { + + var modalResultDeferred = $q.defer(); + var modalOpenedDeferred = $q.defer(); + + //prepare an instance of a modal to be injected into controllers and returned to a caller + var modalInstance = { + result: modalResultDeferred.promise, + opened: modalOpenedDeferred.promise, + close: function (result) { + $modalStack.close(modalInstance, result); + }, + dismiss: function (reason) { + $modalStack.dismiss(modalInstance, reason); + } + }; + + //merge and clean up options + modalOptions = angular.extend({}, $modalProvider.options, modalOptions); + modalOptions.resolve = modalOptions.resolve || {}; + + //verify options + if (!modalOptions.template && !modalOptions.templateUrl) { + throw new Error('One of template or templateUrl options is required.'); + } + + var templateAndResolvePromise = + $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve))); + + + templateAndResolvePromise.then(function resolveSuccess(tplAndVars) { + + var modalScope = (modalOptions.scope || $rootScope).$new(); + modalScope.$close = modalInstance.close; + modalScope.$dismiss = modalInstance.dismiss; + + var ctrlInstance, ctrlLocals = {}; + var resolveIter = 1; + + //controllers + if (modalOptions.controller) { + ctrlLocals.$scope = modalScope; + ctrlLocals.$modalInstance = modalInstance; + angular.forEach(modalOptions.resolve, function (value, key) { + ctrlLocals[key] = tplAndVars[resolveIter++]; + }); + + ctrlInstance = $controller(modalOptions.controller, ctrlLocals); + if (modalOptions.controllerAs) { + modalScope[modalOptions.controllerAs] = ctrlInstance; + } + } + + $modalStack.open(modalInstance, { + scope: modalScope, + deferred: modalResultDeferred, + content: tplAndVars[0], + backdrop: modalOptions.backdrop, + keyboard: modalOptions.keyboard, + backdropClass: modalOptions.backdropClass, + windowClass: modalOptions.windowClass, + windowTemplateUrl: modalOptions.windowTemplateUrl, + size: modalOptions.size + }); + + }, function resolveError(reason) { + modalResultDeferred.reject(reason); + }); + + templateAndResolvePromise.then(function () { + modalOpenedDeferred.resolve(true); + }, function () { + modalOpenedDeferred.reject(false); + }); + + return modalInstance; + }; + + return $modal; + }] + }; + + return $modalProvider; + }); + +angular.module('ui.bootstrap.pagination', []) + +.controller('PaginationController', ['$scope', '$attrs', '$parse', function ($scope, $attrs, $parse) { + var self = this, + ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl + setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop; + + this.init = function(ngModelCtrl_, config) { + ngModelCtrl = ngModelCtrl_; + this.config = config; + + ngModelCtrl.$render = function() { + self.render(); + }; + + if ($attrs.itemsPerPage) { + $scope.$parent.$watch($parse($attrs.itemsPerPage), function(value) { + self.itemsPerPage = parseInt(value, 10); + $scope.totalPages = self.calculateTotalPages(); + }); + } else { + this.itemsPerPage = config.itemsPerPage; + } + }; + + this.calculateTotalPages = function() { + var totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / this.itemsPerPage); + return Math.max(totalPages || 0, 1); + }; + + this.render = function() { + $scope.page = parseInt(ngModelCtrl.$viewValue, 10) || 1; + }; + + $scope.selectPage = function(page) { + if ( $scope.page !== page && page > 0 && page <= $scope.totalPages) { + ngModelCtrl.$setViewValue(page); + ngModelCtrl.$render(); + } + }; + + $scope.getText = function( key ) { + return $scope[key + 'Text'] || self.config[key + 'Text']; + }; + $scope.noPrevious = function() { + return $scope.page === 1; + }; + $scope.noNext = function() { + return $scope.page === $scope.totalPages; + }; + + $scope.$watch('totalItems', function() { + $scope.totalPages = self.calculateTotalPages(); + }); + + $scope.$watch('totalPages', function(value) { + setNumPages($scope.$parent, value); // Readonly variable + + if ( $scope.page > value ) { + $scope.selectPage(value); + } else { + ngModelCtrl.$render(); + } + }); +}]) + +.constant('paginationConfig', { + itemsPerPage: 10, + boundaryLinks: false, + directionLinks: true, + firstText: 'First', + previousText: 'Previous', + nextText: 'Next', + lastText: 'Last', + rotate: true +}) + +.directive('pagination', ['$parse', 'paginationConfig', function($parse, paginationConfig) { + return { + restrict: 'EA', + scope: { + totalItems: '=', + firstText: '@', + previousText: '@', + nextText: '@', + lastText: '@' + }, + require: ['pagination', '?ngModel'], + controller: 'PaginationController', + templateUrl: 'template/pagination/pagination.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if (!ngModelCtrl) { + return; // do nothing if no ng-model + } + + // Setup configuration parameters + var maxSize = angular.isDefined(attrs.maxSize) ? scope.$parent.$eval(attrs.maxSize) : paginationConfig.maxSize, + rotate = angular.isDefined(attrs.rotate) ? scope.$parent.$eval(attrs.rotate) : paginationConfig.rotate; + scope.boundaryLinks = angular.isDefined(attrs.boundaryLinks) ? scope.$parent.$eval(attrs.boundaryLinks) : paginationConfig.boundaryLinks; + scope.directionLinks = angular.isDefined(attrs.directionLinks) ? scope.$parent.$eval(attrs.directionLinks) : paginationConfig.directionLinks; + + paginationCtrl.init(ngModelCtrl, paginationConfig); + + if (attrs.maxSize) { + scope.$parent.$watch($parse(attrs.maxSize), function(value) { + maxSize = parseInt(value, 10); + paginationCtrl.render(); + }); + } + + // Create page object used in template + function makePage(number, text, isActive) { + return { + number: number, + text: text, + active: isActive + }; + } + + function getPages(currentPage, totalPages) { + var pages = []; + + // Default page limits + var startPage = 1, endPage = totalPages; + var isMaxSized = ( angular.isDefined(maxSize) && maxSize < totalPages ); + + // recompute if maxSize + if ( isMaxSized ) { + if ( rotate ) { + // Current page is displayed in the middle of the visible ones + startPage = Math.max(currentPage - Math.floor(maxSize/2), 1); + endPage = startPage + maxSize - 1; + + // Adjust if limit is exceeded + if (endPage > totalPages) { + endPage = totalPages; + startPage = endPage - maxSize + 1; + } + } else { + // Visible pages are paginated with maxSize + startPage = ((Math.ceil(currentPage / maxSize) - 1) * maxSize) + 1; + + // Adjust last page if limit is exceeded + endPage = Math.min(startPage + maxSize - 1, totalPages); + } + } + + // Add page number links + for (var number = startPage; number <= endPage; number++) { + var page = makePage(number, number, number === currentPage); + pages.push(page); + } + + // Add links to move between page sets + if ( isMaxSized && ! rotate ) { + if ( startPage > 1 ) { + var previousPageSet = makePage(startPage - 1, '...', false); + pages.unshift(previousPageSet); + } + + if ( endPage < totalPages ) { + var nextPageSet = makePage(endPage + 1, '...', false); + pages.push(nextPageSet); + } + } + + return pages; + } + + var originalRender = paginationCtrl.render; + paginationCtrl.render = function() { + originalRender(); + if (scope.page > 0 && scope.page <= scope.totalPages) { + scope.pages = getPages(scope.page, scope.totalPages); + } + }; + } + }; +}]) + +.constant('pagerConfig', { + itemsPerPage: 10, + previousText: '« Previous', + nextText: 'Next »', + align: true +}) + +.directive('pager', ['pagerConfig', function(pagerConfig) { + return { + restrict: 'EA', + scope: { + totalItems: '=', + previousText: '@', + nextText: '@' + }, + require: ['pager', '?ngModel'], + controller: 'PaginationController', + templateUrl: 'template/pagination/pager.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if (!ngModelCtrl) { + return; // do nothing if no ng-model + } + + scope.align = angular.isDefined(attrs.align) ? scope.$parent.$eval(attrs.align) : pagerConfig.align; + paginationCtrl.init(ngModelCtrl, pagerConfig); + } + }; +}]); + +/** + * The following features are still outstanding: animation as a + * function, placement as a function, inside, support for more triggers than + * just mouse enter/leave, html tooltips, and selector delegation. + */ +angular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] ) + +/** + * The $tooltip service creates tooltip- and popover-like directives as well as + * houses global options for them. + */ +.provider( '$tooltip', function () { + // The default options tooltip and popover. + var defaultOptions = { + placement: 'top', + animation: true, + popupDelay: 0 + }; + + // Default hide triggers for each show trigger + var triggerMap = { + 'mouseenter': 'mouseleave', + 'click': 'click', + 'focus': 'blur' + }; + + // The options specified to the provider globally. + var globalOptions = {}; + + /** + * `options({})` allows global configuration of all tooltips in the + * application. + * + * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) { + * // place tooltips left instead of top by default + * $tooltipProvider.options( { placement: 'left' } ); + * }); + */ + this.options = function( value ) { + angular.extend( globalOptions, value ); + }; + + /** + * This allows you to extend the set of trigger mappings available. E.g.: + * + * $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' ); + */ + this.setTriggers = function setTriggers ( triggers ) { + angular.extend( triggerMap, triggers ); + }; + + /** + * This is a helper function for translating camel-case to snake-case. + */ + function snake_case(name){ + var regexp = /[A-Z]/g; + var separator = '-'; + return name.replace(regexp, function(letter, pos) { + return (pos ? separator : '') + letter.toLowerCase(); + }); + } + + /** + * Returns the actual instance of the $tooltip service. + * TODO support multiple triggers + */ + this.$get = [ '$window', '$compile', '$timeout', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $document, $position, $interpolate ) { + return function $tooltip ( type, prefix, defaultTriggerShow ) { + var options = angular.extend( {}, defaultOptions, globalOptions ); + + /** + * Returns an object of show and hide triggers. + * + * If a trigger is supplied, + * it is used to show the tooltip; otherwise, it will use the `trigger` + * option passed to the `$tooltipProvider.options` method; else it will + * default to the trigger supplied to this directive factory. + * + * The hide trigger is based on the show trigger. If the `trigger` option + * was passed to the `$tooltipProvider.options` method, it will use the + * mapped trigger from `triggerMap` or the passed trigger if the map is + * undefined; otherwise, it uses the `triggerMap` value of the show + * trigger; else it will just use the show trigger. + */ + function getTriggers ( trigger ) { + var show = trigger || options.trigger || defaultTriggerShow; + var hide = triggerMap[show] || show; + return { + show: show, + hide: hide + }; + } + + var directiveName = snake_case( type ); + + var startSym = $interpolate.startSymbol(); + var endSym = $interpolate.endSymbol(); + var template = + '
        '+ + '
        '; + + return { + restrict: 'EA', + compile: function (tElem, tAttrs) { + var tooltipLinker = $compile( template ); + + return function link ( scope, element, attrs ) { + var tooltip; + var tooltipLinkedScope; + var transitionTimeout; + var popupTimeout; + var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false; + var triggers = getTriggers( undefined ); + var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']); + var ttScope = scope.$new(true); + + var positionTooltip = function () { + + var ttPosition = $position.positionElements(element, tooltip, ttScope.placement, appendToBody); + ttPosition.top += 'px'; + ttPosition.left += 'px'; + + // Now set the calculated positioning. + tooltip.css( ttPosition ); + }; + + // By default, the tooltip is not open. + // TODO add ability to start tooltip opened + ttScope.isOpen = false; + + function toggleTooltipBind () { + if ( ! ttScope.isOpen ) { + showTooltipBind(); + } else { + hideTooltipBind(); + } + } + + // Show the tooltip with delay if specified, otherwise show it immediately + function showTooltipBind() { + if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) { + return; + } + + prepareTooltip(); + + if ( ttScope.popupDelay ) { + // Do nothing if the tooltip was already scheduled to pop-up. + // This happens if show is triggered multiple times before any hide is triggered. + if (!popupTimeout) { + popupTimeout = $timeout( show, ttScope.popupDelay, false ); + popupTimeout.then(function(reposition){reposition();}); + } + } else { + show()(); + } + } + + function hideTooltipBind () { + scope.$apply(function () { + hide(); + }); + } + + // Show the tooltip popup element. + function show() { + + popupTimeout = null; + + // If there is a pending remove transition, we must cancel it, lest the + // tooltip be mysteriously removed. + if ( transitionTimeout ) { + $timeout.cancel( transitionTimeout ); + transitionTimeout = null; + } + + // Don't show empty tooltips. + if ( ! ttScope.content ) { + return angular.noop; + } + + createTooltip(); + + // Set the initial positioning. + tooltip.css({ top: 0, left: 0, display: 'block' }); + ttScope.$digest(); + + positionTooltip(); + + // And show the tooltip. + ttScope.isOpen = true; + ttScope.$digest(); // digest required as $apply is not called + + // Return positioning function as promise callback for correct + // positioning after draw. + return positionTooltip; + } + + // Hide the tooltip popup element. + function hide() { + // First things first: we don't show it anymore. + ttScope.isOpen = false; + + //if tooltip is going to be shown after delay, we must cancel this + $timeout.cancel( popupTimeout ); + popupTimeout = null; + + // And now we remove it from the DOM. However, if we have animation, we + // need to wait for it to expire beforehand. + // FIXME: this is a placeholder for a port of the transitions library. + if ( ttScope.animation ) { + if (!transitionTimeout) { + transitionTimeout = $timeout(removeTooltip, 500); + } + } else { + removeTooltip(); + } + } + + function createTooltip() { + // There can only be one tooltip element per directive shown at once. + if (tooltip) { + removeTooltip(); + } + tooltipLinkedScope = ttScope.$new(); + tooltip = tooltipLinker(tooltipLinkedScope, function (tooltip) { + if ( appendToBody ) { + $document.find( 'body' ).append( tooltip ); + } else { + element.after( tooltip ); + } + }); + } + + function removeTooltip() { + transitionTimeout = null; + if (tooltip) { + tooltip.remove(); + tooltip = null; + } + if (tooltipLinkedScope) { + tooltipLinkedScope.$destroy(); + tooltipLinkedScope = null; + } + } + + function prepareTooltip() { + prepPlacement(); + prepPopupDelay(); + } + + /** + * Observe the relevant attributes. + */ + attrs.$observe( type, function ( val ) { + ttScope.content = val; + + if (!val && ttScope.isOpen ) { + hide(); + } + }); + + attrs.$observe( prefix+'Title', function ( val ) { + ttScope.title = val; + }); + + function prepPlacement() { + var val = attrs[ prefix + 'Placement' ]; + ttScope.placement = angular.isDefined( val ) ? val : options.placement; + } + + function prepPopupDelay() { + var val = attrs[ prefix + 'PopupDelay' ]; + var delay = parseInt( val, 10 ); + ttScope.popupDelay = ! isNaN(delay) ? delay : options.popupDelay; + } + + var unregisterTriggers = function () { + element.unbind(triggers.show, showTooltipBind); + element.unbind(triggers.hide, hideTooltipBind); + }; + + function prepTriggers() { + var val = attrs[ prefix + 'Trigger' ]; + unregisterTriggers(); + + triggers = getTriggers( val ); + + if ( triggers.show === triggers.hide ) { + element.bind( triggers.show, toggleTooltipBind ); + } else { + element.bind( triggers.show, showTooltipBind ); + element.bind( triggers.hide, hideTooltipBind ); + } + } + prepTriggers(); + + var animation = scope.$eval(attrs[prefix + 'Animation']); + ttScope.animation = angular.isDefined(animation) ? !!animation : options.animation; + + var appendToBodyVal = scope.$eval(attrs[prefix + 'AppendToBody']); + appendToBody = angular.isDefined(appendToBodyVal) ? appendToBodyVal : appendToBody; + + // if a tooltip is attached to we need to remove it on + // location change as its parent scope will probably not be destroyed + // by the change. + if ( appendToBody ) { + scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () { + if ( ttScope.isOpen ) { + hide(); + } + }); + } + + // Make sure tooltip is destroyed and removed. + scope.$on('$destroy', function onDestroyTooltip() { + $timeout.cancel( transitionTimeout ); + $timeout.cancel( popupTimeout ); + unregisterTriggers(); + removeTooltip(); + ttScope = null; + }); + }; + } + }; + }; + }]; +}) + +.directive( 'tooltipPopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/tooltip/tooltip-popup.html' + }; +}) + +.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'tooltip', 'tooltip', 'mouseenter' ); +}]) + +.directive( 'tooltipHtmlUnsafePopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html' + }; +}) + +.directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' ); +}]); + +/** + * The following features are still outstanding: popup delay, animation as a + * function, placement as a function, inside, support for more triggers than + * just mouse enter/leave, html popovers, and selector delegatation. + */ +angular.module( 'ui.bootstrap.popover', [ 'ui.bootstrap.tooltip' ] ) + +.directive( 'popoverPopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/popover/popover.html' + }; +}) + +.directive( 'popover', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'popover', 'popover', 'click' ); +}]); + +angular.module('ui.bootstrap.progressbar', []) + +.constant('progressConfig', { + animate: true, + max: 100 +}) + +.controller('ProgressController', ['$scope', '$attrs', 'progressConfig', function($scope, $attrs, progressConfig) { + var self = this, + animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate; + + this.bars = []; + $scope.max = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : progressConfig.max; + + this.addBar = function(bar, element) { + if ( !animate ) { + element.css({'transition': 'none'}); + } + + this.bars.push(bar); + + bar.$watch('value', function( value ) { + bar.percent = +(100 * value / $scope.max).toFixed(2); + }); + + bar.$on('$destroy', function() { + element = null; + self.removeBar(bar); + }); + }; + + this.removeBar = function(bar) { + this.bars.splice(this.bars.indexOf(bar), 1); + }; +}]) + +.directive('progress', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + controller: 'ProgressController', + require: 'progress', + scope: {}, + templateUrl: 'template/progressbar/progress.html' + }; +}) + +.directive('bar', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + require: '^progress', + scope: { + value: '=', + type: '@' + }, + templateUrl: 'template/progressbar/bar.html', + link: function(scope, element, attrs, progressCtrl) { + progressCtrl.addBar(scope, element); + } + }; +}) + +.directive('progressbar', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + controller: 'ProgressController', + scope: { + value: '=', + type: '@' + }, + templateUrl: 'template/progressbar/progressbar.html', + link: function(scope, element, attrs, progressCtrl) { + progressCtrl.addBar(scope, angular.element(element.children()[0])); + } + }; +}); +angular.module('ui.bootstrap.rating', []) + +.constant('ratingConfig', { + max: 5, + stateOn: null, + stateOff: null +}) + +.controller('RatingController', ['$scope', '$attrs', 'ratingConfig', function($scope, $attrs, ratingConfig) { + var ngModelCtrl = { $setViewValue: angular.noop }; + + this.init = function(ngModelCtrl_) { + ngModelCtrl = ngModelCtrl_; + ngModelCtrl.$render = this.render; + + this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn; + this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff; + + var ratingStates = angular.isDefined($attrs.ratingStates) ? $scope.$parent.$eval($attrs.ratingStates) : + new Array( angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max ); + $scope.range = this.buildTemplateObjects(ratingStates); + }; + + this.buildTemplateObjects = function(states) { + for (var i = 0, n = states.length; i < n; i++) { + states[i] = angular.extend({ index: i }, { stateOn: this.stateOn, stateOff: this.stateOff }, states[i]); + } + return states; + }; + + $scope.rate = function(value) { + if ( !$scope.readonly && value >= 0 && value <= $scope.range.length ) { + ngModelCtrl.$setViewValue(value); + ngModelCtrl.$render(); + } + }; + + $scope.enter = function(value) { + if ( !$scope.readonly ) { + $scope.value = value; + } + $scope.onHover({value: value}); + }; + + $scope.reset = function() { + $scope.value = ngModelCtrl.$viewValue; + $scope.onLeave(); + }; + + $scope.onKeydown = function(evt) { + if (/(37|38|39|40)/.test(evt.which)) { + evt.preventDefault(); + evt.stopPropagation(); + $scope.rate( $scope.value + (evt.which === 38 || evt.which === 39 ? 1 : -1) ); + } + }; + + this.render = function() { + $scope.value = ngModelCtrl.$viewValue; + }; +}]) + +.directive('rating', function() { + return { + restrict: 'EA', + require: ['rating', 'ngModel'], + scope: { + readonly: '=?', + onHover: '&', + onLeave: '&' + }, + controller: 'RatingController', + templateUrl: 'template/rating/rating.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var ratingCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + ratingCtrl.init( ngModelCtrl ); + } + } + }; +}); + +/** + * @ngdoc overview + * @name ui.bootstrap.tabs + * + * @description + * AngularJS version of the tabs directive. + */ + +angular.module('ui.bootstrap.tabs', []) + +.controller('TabsetController', ['$scope', function TabsetCtrl($scope) { + var ctrl = this, + tabs = ctrl.tabs = $scope.tabs = []; + + ctrl.select = function(selectedTab) { + angular.forEach(tabs, function(tab) { + if (tab.active && tab !== selectedTab) { + tab.active = false; + tab.onDeselect(); + } + }); + selectedTab.active = true; + selectedTab.onSelect(); + }; + + ctrl.addTab = function addTab(tab) { + tabs.push(tab); + // we can't run the select function on the first tab + // since that would select it twice + if (tabs.length === 1) { + tab.active = true; + } else if (tab.active) { + ctrl.select(tab); + } + }; + + ctrl.removeTab = function removeTab(tab) { + var index = tabs.indexOf(tab); + //Select a new tab if the tab to be removed is selected and not destroyed + if (tab.active && tabs.length > 1 && !destroyed) { + //If this is the last tab, select the previous tab. else, the next tab. + var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1; + ctrl.select(tabs[newActiveIndex]); + } + tabs.splice(index, 1); + }; + + var destroyed; + $scope.$on('$destroy', function() { + destroyed = true; + }); +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tabset + * @restrict EA + * + * @description + * Tabset is the outer container for the tabs directive + * + * @param {boolean=} vertical Whether or not to use vertical styling for the tabs. + * @param {boolean=} justified Whether or not to use justified styling for the tabs. + * + * @example + + + + First Content! + Second Content! + +
        + + First Vertical Content! + Second Vertical Content! + + + First Justified Content! + Second Justified Content! + +
        +
        + */ +.directive('tabset', function() { + return { + restrict: 'EA', + transclude: true, + replace: true, + scope: { + type: '@' + }, + controller: 'TabsetController', + templateUrl: 'template/tabs/tabset.html', + link: function(scope, element, attrs) { + scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false; + scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false; + } + }; +}) + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tab + * @restrict EA + * + * @param {string=} heading The visible heading, or title, of the tab. Set HTML headings with {@link ui.bootstrap.tabs.directive:tabHeading tabHeading}. + * @param {string=} select An expression to evaluate when the tab is selected. + * @param {boolean=} active A binding, telling whether or not this tab is selected. + * @param {boolean=} disabled A binding, telling whether or not this tab is disabled. + * + * @description + * Creates a tab with a heading and content. Must be placed within a {@link ui.bootstrap.tabs.directive:tabset tabset}. + * + * @example + + +
        + + +
        + + First Tab + + Alert me! + Second Tab, with alert callback and html heading! + + + {{item.content}} + + +
        +
        + + function TabsDemoCtrl($scope) { + $scope.items = [ + { title:"Dynamic Title 1", content:"Dynamic Item 0" }, + { title:"Dynamic Title 2", content:"Dynamic Item 1", disabled: true } + ]; + + $scope.alertMe = function() { + setTimeout(function() { + alert("You've selected the alert tab!"); + }); + }; + }; + +
        + */ + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tabHeading + * @restrict EA + * + * @description + * Creates an HTML heading for a {@link ui.bootstrap.tabs.directive:tab tab}. Must be placed as a child of a tab element. + * + * @example + + + + + HTML in my titles?! + And some content, too! + + + Icon heading?!? + That's right. + + + + + */ +.directive('tab', ['$parse', function($parse) { + return { + require: '^tabset', + restrict: 'EA', + replace: true, + templateUrl: 'template/tabs/tab.html', + transclude: true, + scope: { + active: '=?', + heading: '@', + onSelect: '&select', //This callback is called in contentHeadingTransclude + //once it inserts the tab's content into the dom + onDeselect: '&deselect' + }, + controller: function() { + //Empty controller so other directives can require being 'under' a tab + }, + compile: function(elm, attrs, transclude) { + return function postLink(scope, elm, attrs, tabsetCtrl) { + scope.$watch('active', function(active) { + if (active) { + tabsetCtrl.select(scope); + } + }); + + scope.disabled = false; + if ( attrs.disabled ) { + scope.$parent.$watch($parse(attrs.disabled), function(value) { + scope.disabled = !! value; + }); + } + + scope.select = function() { + if ( !scope.disabled ) { + scope.active = true; + } + }; + + tabsetCtrl.addTab(scope); + scope.$on('$destroy', function() { + tabsetCtrl.removeTab(scope); + }); + + //We need to transclude later, once the content container is ready. + //when this link happens, we're inside a tab heading. + scope.$transcludeFn = transclude; + }; + } + }; +}]) + +.directive('tabHeadingTransclude', [function() { + return { + restrict: 'A', + require: '^tab', + link: function(scope, elm, attrs, tabCtrl) { + scope.$watch('headingElement', function updateHeadingElement(heading) { + if (heading) { + elm.html(''); + elm.append(heading); + } + }); + } + }; +}]) + +.directive('tabContentTransclude', function() { + return { + restrict: 'A', + require: '^tabset', + link: function(scope, elm, attrs) { + var tab = scope.$eval(attrs.tabContentTransclude); + + //Now our tab is ready to be transcluded: both the tab heading area + //and the tab content area are loaded. Transclude 'em both. + tab.$transcludeFn(tab.$parent, function(contents) { + angular.forEach(contents, function(node) { + if (isTabHeading(node)) { + //Let tabHeadingTransclude know. + tab.headingElement = node; + } else { + elm.append(node); + } + }); + }); + } + }; + function isTabHeading(node) { + return node.tagName && ( + node.hasAttribute('tab-heading') || + node.hasAttribute('data-tab-heading') || + node.tagName.toLowerCase() === 'tab-heading' || + node.tagName.toLowerCase() === 'data-tab-heading' + ); + } +}) + +; + +angular.module('ui.bootstrap.timepicker', []) + +.constant('timepickerConfig', { + hourStep: 1, + minuteStep: 1, + showMeridian: true, + meridians: null, + readonlyInput: false, + mousewheel: true +}) + +.controller('TimepickerController', ['$scope', '$attrs', '$parse', '$log', '$locale', 'timepickerConfig', function($scope, $attrs, $parse, $log, $locale, timepickerConfig) { + var selected = new Date(), + ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl + meridians = angular.isDefined($attrs.meridians) ? $scope.$parent.$eval($attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS; + + this.init = function( ngModelCtrl_, inputs ) { + ngModelCtrl = ngModelCtrl_; + ngModelCtrl.$render = this.render; + + var hoursInputEl = inputs.eq(0), + minutesInputEl = inputs.eq(1); + + var mousewheel = angular.isDefined($attrs.mousewheel) ? $scope.$parent.$eval($attrs.mousewheel) : timepickerConfig.mousewheel; + if ( mousewheel ) { + this.setupMousewheelEvents( hoursInputEl, minutesInputEl ); + } + + $scope.readonlyInput = angular.isDefined($attrs.readonlyInput) ? $scope.$parent.$eval($attrs.readonlyInput) : timepickerConfig.readonlyInput; + this.setupInputEvents( hoursInputEl, minutesInputEl ); + }; + + var hourStep = timepickerConfig.hourStep; + if ($attrs.hourStep) { + $scope.$parent.$watch($parse($attrs.hourStep), function(value) { + hourStep = parseInt(value, 10); + }); + } + + var minuteStep = timepickerConfig.minuteStep; + if ($attrs.minuteStep) { + $scope.$parent.$watch($parse($attrs.minuteStep), function(value) { + minuteStep = parseInt(value, 10); + }); + } + + // 12H / 24H mode + $scope.showMeridian = timepickerConfig.showMeridian; + if ($attrs.showMeridian) { + $scope.$parent.$watch($parse($attrs.showMeridian), function(value) { + $scope.showMeridian = !!value; + + if ( ngModelCtrl.$error.time ) { + // Evaluate from template + var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate(); + if (angular.isDefined( hours ) && angular.isDefined( minutes )) { + selected.setHours( hours ); + refresh(); + } + } else { + updateTemplate(); + } + }); + } + + // Get $scope.hours in 24H mode if valid + function getHoursFromTemplate ( ) { + var hours = parseInt( $scope.hours, 10 ); + var valid = ( $scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24); + if ( !valid ) { + return undefined; + } + + if ( $scope.showMeridian ) { + if ( hours === 12 ) { + hours = 0; + } + if ( $scope.meridian === meridians[1] ) { + hours = hours + 12; + } + } + return hours; + } + + function getMinutesFromTemplate() { + var minutes = parseInt($scope.minutes, 10); + return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined; + } + + function pad( value ) { + return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value; + } + + // Respond on mousewheel spin + this.setupMousewheelEvents = function( hoursInputEl, minutesInputEl ) { + var isScrollingUp = function(e) { + if (e.originalEvent) { + e = e.originalEvent; + } + //pick correct delta variable depending on event + var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY; + return (e.detail || delta > 0); + }; + + hoursInputEl.bind('mousewheel wheel', function(e) { + $scope.$apply( (isScrollingUp(e)) ? $scope.incrementHours() : $scope.decrementHours() ); + e.preventDefault(); + }); + + minutesInputEl.bind('mousewheel wheel', function(e) { + $scope.$apply( (isScrollingUp(e)) ? $scope.incrementMinutes() : $scope.decrementMinutes() ); + e.preventDefault(); + }); + + }; + + this.setupInputEvents = function( hoursInputEl, minutesInputEl ) { + if ( $scope.readonlyInput ) { + $scope.updateHours = angular.noop; + $scope.updateMinutes = angular.noop; + return; + } + + var invalidate = function(invalidHours, invalidMinutes) { + ngModelCtrl.$setViewValue( null ); + ngModelCtrl.$setValidity('time', false); + if (angular.isDefined(invalidHours)) { + $scope.invalidHours = invalidHours; + } + if (angular.isDefined(invalidMinutes)) { + $scope.invalidMinutes = invalidMinutes; + } + }; + + $scope.updateHours = function() { + var hours = getHoursFromTemplate(); + + if ( angular.isDefined(hours) ) { + selected.setHours( hours ); + refresh( 'h' ); + } else { + invalidate(true); + } + }; + + hoursInputEl.bind('blur', function(e) { + if ( !$scope.invalidHours && $scope.hours < 10) { + $scope.$apply( function() { + $scope.hours = pad( $scope.hours ); + }); + } + }); + + $scope.updateMinutes = function() { + var minutes = getMinutesFromTemplate(); + + if ( angular.isDefined(minutes) ) { + selected.setMinutes( minutes ); + refresh( 'm' ); + } else { + invalidate(undefined, true); + } + }; + + minutesInputEl.bind('blur', function(e) { + if ( !$scope.invalidMinutes && $scope.minutes < 10 ) { + $scope.$apply( function() { + $scope.minutes = pad( $scope.minutes ); + }); + } + }); + + }; + + this.render = function() { + var date = ngModelCtrl.$modelValue ? new Date( ngModelCtrl.$modelValue ) : null; + + if ( isNaN(date) ) { + ngModelCtrl.$setValidity('time', false); + $log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); + } else { + if ( date ) { + selected = date; + } + makeValid(); + updateTemplate(); + } + }; + + // Call internally when we know that model is valid. + function refresh( keyboardChange ) { + makeValid(); + ngModelCtrl.$setViewValue( new Date(selected) ); + updateTemplate( keyboardChange ); + } + + function makeValid() { + ngModelCtrl.$setValidity('time', true); + $scope.invalidHours = false; + $scope.invalidMinutes = false; + } + + function updateTemplate( keyboardChange ) { + var hours = selected.getHours(), minutes = selected.getMinutes(); + + if ( $scope.showMeridian ) { + hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system + } + + $scope.hours = keyboardChange === 'h' ? hours : pad(hours); + $scope.minutes = keyboardChange === 'm' ? minutes : pad(minutes); + $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1]; + } + + function addMinutes( minutes ) { + var dt = new Date( selected.getTime() + minutes * 60000 ); + selected.setHours( dt.getHours(), dt.getMinutes() ); + refresh(); + } + + $scope.incrementHours = function() { + addMinutes( hourStep * 60 ); + }; + $scope.decrementHours = function() { + addMinutes( - hourStep * 60 ); + }; + $scope.incrementMinutes = function() { + addMinutes( minuteStep ); + }; + $scope.decrementMinutes = function() { + addMinutes( - minuteStep ); + }; + $scope.toggleMeridian = function() { + addMinutes( 12 * 60 * (( selected.getHours() < 12 ) ? 1 : -1) ); + }; +}]) + +.directive('timepicker', function () { + return { + restrict: 'EA', + require: ['timepicker', '?^ngModel'], + controller:'TimepickerController', + replace: true, + scope: {}, + templateUrl: 'template/timepicker/timepicker.html', + link: function(scope, element, attrs, ctrls) { + var timepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + timepickerCtrl.init( ngModelCtrl, element.find('input') ); + } + } + }; +}); + +angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap.bindHtml']) + +/** + * A helper service that can parse typeahead's syntax (string provided by users) + * Extracted to a separate service for ease of unit testing + */ + .factory('typeaheadParser', ['$parse', function ($parse) { + + // 00000111000000000000022200000000000000003333333333333330000000000044000 + var TYPEAHEAD_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/; + + return { + parse:function (input) { + + var match = input.match(TYPEAHEAD_REGEXP); + if (!match) { + throw new Error( + 'Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_"' + + ' but got "' + input + '".'); + } + + return { + itemName:match[3], + source:$parse(match[4]), + viewMapper:$parse(match[2] || match[1]), + modelMapper:$parse(match[1]) + }; + } + }; +}]) + + .directive('typeahead', ['$compile', '$parse', '$q', '$timeout', '$document', '$position', 'typeaheadParser', + function ($compile, $parse, $q, $timeout, $document, $position, typeaheadParser) { + + var HOT_KEYS = [9, 13, 27, 38, 40]; + + return { + require:'ngModel', + link:function (originalScope, element, attrs, modelCtrl) { + + //SUPPORTED ATTRIBUTES (OPTIONS) + + //minimal no of characters that needs to be entered before typeahead kicks-in + var minSearch = originalScope.$eval(attrs.typeaheadMinLength) || 1; + + //minimal wait time after last character typed before typehead kicks-in + var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0; + + //should it restrict model values to the ones selected from the popup only? + var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false; + + //binding to a variable that indicates if matches are being retrieved asynchronously + var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop; + + //a callback executed when a match is selected + var onSelectCallback = $parse(attrs.typeaheadOnSelect); + + var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined; + + var appendToBody = attrs.typeaheadAppendToBody ? originalScope.$eval(attrs.typeaheadAppendToBody) : false; + + var focusFirst = originalScope.$eval(attrs.typeaheadFocusFirst) !== false; + + //INTERNAL VARIABLES + + //model setter executed upon match selection + var $setModelValue = $parse(attrs.ngModel).assign; + + //expressions used by typeahead + var parserResult = typeaheadParser.parse(attrs.typeahead); + + var hasFocus; + + //create a child scope for the typeahead directive so we are not polluting original scope + //with typeahead-specific data (matches, query etc.) + var scope = originalScope.$new(); + originalScope.$on('$destroy', function(){ + scope.$destroy(); + }); + + // WAI-ARIA + var popupId = 'typeahead-' + scope.$id + '-' + Math.floor(Math.random() * 10000); + element.attr({ + 'aria-autocomplete': 'list', + 'aria-expanded': false, + 'aria-owns': popupId + }); + + //pop-up element used to display matches + var popUpEl = angular.element('
        '); + popUpEl.attr({ + id: popupId, + matches: 'matches', + active: 'activeIdx', + select: 'select(activeIdx)', + query: 'query', + position: 'position' + }); + //custom item template + if (angular.isDefined(attrs.typeaheadTemplateUrl)) { + popUpEl.attr('template-url', attrs.typeaheadTemplateUrl); + } + + var resetMatches = function() { + scope.matches = []; + scope.activeIdx = -1; + element.attr('aria-expanded', false); + }; + + var getMatchId = function(index) { + return popupId + '-option-' + index; + }; + + // Indicate that the specified match is the active (pre-selected) item in the list owned by this typeahead. + // This attribute is added or removed automatically when the `activeIdx` changes. + scope.$watch('activeIdx', function(index) { + if (index < 0) { + element.removeAttr('aria-activedescendant'); + } else { + element.attr('aria-activedescendant', getMatchId(index)); + } + }); + + var getMatchesAsync = function(inputValue) { + + var locals = {$viewValue: inputValue}; + isLoadingSetter(originalScope, true); + $q.when(parserResult.source(originalScope, locals)).then(function(matches) { + + //it might happen that several async queries were in progress if a user were typing fast + //but we are interested only in responses that correspond to the current view value + var onCurrentRequest = (inputValue === modelCtrl.$viewValue); + if (onCurrentRequest && hasFocus) { + if (matches.length > 0) { + + scope.activeIdx = focusFirst ? 0 : -1; + scope.matches.length = 0; + + //transform labels + for(var i=0; i= minSearch) { + if (waitTime > 0) { + cancelPreviousTimeout(); + scheduleSearchWithTimeout(inputValue); + } else { + getMatchesAsync(inputValue); + } + } else { + isLoadingSetter(originalScope, false); + cancelPreviousTimeout(); + resetMatches(); + } + + if (isEditable) { + return inputValue; + } else { + if (!inputValue) { + // Reset in case user had typed something previously. + modelCtrl.$setValidity('editable', true); + return inputValue; + } else { + modelCtrl.$setValidity('editable', false); + return undefined; + } + } + }); + + modelCtrl.$formatters.push(function (modelValue) { + + var candidateViewValue, emptyViewValue; + var locals = {}; + + if (inputFormatter) { + + locals.$model = modelValue; + return inputFormatter(originalScope, locals); + + } else { + + //it might happen that we don't have enough info to properly render input value + //we need to check for this situation and simply return model value if we can't apply custom formatting + locals[parserResult.itemName] = modelValue; + candidateViewValue = parserResult.viewMapper(originalScope, locals); + locals[parserResult.itemName] = undefined; + emptyViewValue = parserResult.viewMapper(originalScope, locals); + + return candidateViewValue!== emptyViewValue ? candidateViewValue : modelValue; + } + }); + + scope.select = function (activeIdx) { + //called from within the $digest() cycle + var locals = {}; + var model, item; + + locals[parserResult.itemName] = item = scope.matches[activeIdx].model; + model = parserResult.modelMapper(originalScope, locals); + $setModelValue(originalScope, model); + modelCtrl.$setValidity('editable', true); + + onSelectCallback(originalScope, { + $item: item, + $model: model, + $label: parserResult.viewMapper(originalScope, locals) + }); + + resetMatches(); + + //return focus to the input element if a match was selected via a mouse click event + // use timeout to avoid $rootScope:inprog error + $timeout(function() { element[0].focus(); }, 0, false); + }; + + //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27) + element.bind('keydown', function (evt) { + + //typeahead is open and an "interesting" key was pressed + if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) { + return; + } + + // if there's nothing selected (i.e. focusFirst) and enter is hit, don't do anything + if (scope.activeIdx == -1 && (evt.which === 13 || evt.which === 9)) { + return; + } + + evt.preventDefault(); + + if (evt.which === 40) { + scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length; + scope.$digest(); + + } else if (evt.which === 38) { + scope.activeIdx = (scope.activeIdx > 0 ? scope.activeIdx : scope.matches.length) - 1; + scope.$digest(); + + } else if (evt.which === 13 || evt.which === 9) { + scope.$apply(function () { + scope.select(scope.activeIdx); + }); + + } else if (evt.which === 27) { + evt.stopPropagation(); + + resetMatches(); + scope.$digest(); + } + }); + + element.bind('blur', function (evt) { + hasFocus = false; + }); + + // Keep reference to click handler to unbind it. + var dismissClickHandler = function (evt) { + if (element[0] !== evt.target) { + resetMatches(); + scope.$digest(); + } + }; + + $document.bind('click', dismissClickHandler); + + originalScope.$on('$destroy', function(){ + $document.unbind('click', dismissClickHandler); + if (appendToBody) { + $popup.remove(); + } + }); + + var $popup = $compile(popUpEl)(scope); + if (appendToBody) { + $document.find('body').append($popup); + } else { + element.after($popup); + } + } + }; + +}]) + + .directive('typeaheadPopup', function () { + return { + restrict:'EA', + scope:{ + matches:'=', + query:'=', + active:'=', + position:'=', + select:'&' + }, + replace:true, + templateUrl:'template/typeahead/typeahead-popup.html', + link:function (scope, element, attrs) { + + scope.templateUrl = attrs.templateUrl; + + scope.isOpen = function () { + return scope.matches.length > 0; + }; + + scope.isActive = function (matchIdx) { + return scope.active == matchIdx; + }; + + scope.selectActive = function (matchIdx) { + scope.active = matchIdx; + }; + + scope.selectMatch = function (activeIdx) { + scope.select({activeIdx:activeIdx}); + }; + } + }; + }) + + .directive('typeaheadMatch', ['$http', '$templateCache', '$compile', '$parse', function ($http, $templateCache, $compile, $parse) { + return { + restrict:'EA', + scope:{ + index:'=', + match:'=', + query:'=' + }, + link:function (scope, element, attrs) { + var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'template/typeahead/typeahead-match.html'; + $http.get(tplUrl, {cache: $templateCache}).success(function(tplContent){ + element.replaceWith($compile(tplContent.trim())(scope)); + }); + } + }; + }]) + + .filter('typeaheadHighlight', function() { + + function escapeRegexp(queryToEscape) { + return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); + } + + return function(matchItem, query) { + return query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; + }; + }); diff --git a/bower_components/angular-bootstrap/ui-bootstrap.min.js b/bower_components/angular-bootstrap/ui-bootstrap.min.js new file mode 100644 index 0000000..a6383c4 --- /dev/null +++ b/bower_components/angular-bootstrap/ui-bootstrap.min.js @@ -0,0 +1,9 @@ +/* + * angular-ui-bootstrap + * http://angular-ui.github.io/bootstrap/ + + * Version: 0.12.1 - 2015-02-20 + * License: MIT + */ +angular.module("ui.bootstrap",["ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function(a,b,c){function d(a){for(var b in a)if(void 0!==f.style[b])return a[b]}var e=function(d,f,g){g=g||{};var h=a.defer(),i=e[g.animation?"animationEndEventName":"transitionEndEventName"],j=function(){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(f)?d.addClass(f):angular.isFunction(f)?f(d):angular.isObject(f)&&d.css(f),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},f=document.createElement("trans"),g={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},h={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return e.transitionEndEventName=d(g),e.animationEndEventName=d(h),e}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function(a){return{link:function(b,c,d){function e(b){function d(){j===e&&(j=void 0)}var e=a(c,b);return j&&j.cancel(),j=e,e.then(d,d),e}function f(){k?(k=!1,g()):(c.removeClass("collapse").addClass("collapsing"),e({height:c[0].scrollHeight+"px"}).then(g))}function g(){c.removeClass("collapsing"),c.addClass("collapse in"),c.css({height:"auto"})}function h(){if(k)k=!1,i(),c.css({height:0});else{c.css({height:c[0].scrollHeight+"px"});{c[0].offsetWidth}c.removeClass("collapse in").addClass("collapsing"),e({height:0}).then(i)}}function i(){c.removeClass("collapsing"),c.addClass("collapse")}var j,k=!0;b.$watch(d.collapse,function(a){a?h():f()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.$watch("isOpen",function(b){b&&d.closeOthers(a)}),a.toggleOpen=function(){a.isDisabled||(a.isOpen=!a.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,function(){}))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.html(""),b.append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable="close"in b,this.close=a.close}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}).directive("dismissOnTimeout",["$timeout",function(a){return{require:"alert",link:function(b,c,d,e){a(function(){e.close()},parseInt(d.dismissOnTimeout,10))}}}]),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){var d=b.hasClass(e.activeClass);(!d||angular.isDefined(c.uncheckable))&&a.$apply(function(){f.$setViewValue(d?null:a.$eval(c.btnRadio)),f.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$interval","$transition",function(a,b,c,d){function e(){f();var b=+a.interval;!isNaN(b)&&b>0&&(h=c(g,b))}function f(){h&&(c.cancel(h),h=null)}function g(){var b=+a.interval;i&&!isNaN(b)&&b>0?a.next():a.pause()}var h,i,j=this,k=j.slides=a.slides=[],l=-1;j.currentSlide=null;var m=!1;j.select=a.select=function(c,f){function g(){if(!m){if(j.currentSlide&&angular.isString(f)&&!a.noTransition&&c.$element){c.$element.addClass(f);{c.$element[0].offsetWidth}angular.forEach(k,function(a){angular.extend(a,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(c,{direction:f,active:!0,entering:!0}),angular.extend(j.currentSlide||{},{direction:f,leaving:!0}),a.$currentTransition=d(c.$element,{}),function(b,c){a.$currentTransition.then(function(){h(b,c)},function(){h(b,c)})}(c,j.currentSlide)}else h(c,j.currentSlide);j.currentSlide=c,l=i,e()}}function h(b,c){angular.extend(b,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(c||{},{direction:"",active:!1,leaving:!1,entering:!1}),a.$currentTransition=null}var i=k.indexOf(c);void 0===f&&(f=i>l?"next":"prev"),c&&c!==j.currentSlide&&(a.$currentTransition?(a.$currentTransition.cancel(),b(g)):g())},a.$on("$destroy",function(){m=!0}),j.indexOfSlide=function(a){return k.indexOf(a)},a.next=function(){var b=(l+1)%k.length;return a.$currentTransition?void 0:j.select(k[b],"next")},a.prev=function(){var b=0>l-1?k.length-1:l-1;return a.$currentTransition?void 0:j.select(k[b],"prev")},a.isActive=function(a){return j.currentSlide===a},a.$watch("interval",e),a.$on("$destroy",f),a.play=function(){i||(i=!0,e())},a.pause=function(){a.noPause||(i=!1,f())},j.addSlide=function(b,c){b.$element=c,k.push(b),1===k.length||b.active?(j.select(k[k.length-1]),1==k.length&&a.play()):b.active=!1},j.removeSlide=function(a){var b=k.indexOf(a);k.splice(b,1),k.length>0&&a.active?j.select(b>=k.length?k[b-1]:k[b]):l>b&&l--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",function(){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{active:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)}),a.$watch("active",function(b){b&&d.select(a)})}}}),angular.module("ui.bootstrap.dateparser",[]).service("dateParser",["$locale","orderByFilter",function(a,b){function c(a){var c=[],d=a.split("");return angular.forEach(e,function(b,e){var f=a.indexOf(e);if(f>-1){a=a.split(""),d[f]="("+b.regex+")",a[f]="$";for(var g=f+1,h=f+e.length;h>g;g++)d[g]="",a[g]="$";a=a.join(""),c.push({index:f,apply:b.apply})}}),{regex:new RegExp("^"+d.join("")+"$"),map:b(c,"index")}}function d(a,b,c){return 1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}this.parsers={};var e={yyyy:{regex:"\\d{4}",apply:function(a){this.year=+a}},yy:{regex:"\\d{2}",apply:function(a){this.year=+a+2e3}},y:{regex:"\\d{1,4}",apply:function(a){this.year=+a}},MMMM:{regex:a.DATETIME_FORMATS.MONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.MONTH.indexOf(b)}},MMM:{regex:a.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.SHORTMONTH.indexOf(b)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1}},M:{regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},EEEE:{regex:a.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:a.DATETIME_FORMATS.SHORTDAY.join("|")}};this.parse=function(b,e){if(!angular.isString(b)||!e)return b;e=a.DATETIME_FORMATS[e]||e,this.parsers[e]||(this.parsers[e]=c(e));var f=this.parsers[e],g=f.regex,h=f.map,i=b.match(g);if(i&&i.length){for(var j,k={year:1900,month:0,date:1,hours:0},l=1,m=i.length;m>l;l++){var n=h[l-1];n.apply&&n.apply.call(k,i[l])}return d(k.year,k.month,k.date)&&(j=new Date(k.year,k.month,k.date,k.hours)),j}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].documentElement.scrollLeft)}},positionElements:function(a,b,c,d){var e,f,g,h,i=c.split("-"),j=i[0],k=i[1]||"center";e=d?this.offset(a):this.position(a),f=b.prop("offsetWidth"),g=b.prop("offsetHeight");var l={center:function(){return e.left+e.width/2-f/2},left:function(){return e.left},right:function(){return e.left+e.width}},m={center:function(){return e.top+e.height/2-g/2},top:function(){return e.top},bottom:function(){return e.top+e.height}};switch(j){case"right":h={top:m[k](),left:l[j]()};break;case"left":h={top:m[k](),left:e.left-f};break;case"bottom":h={top:m[j](),left:l[k]()};break;default:h={top:e.top-g,left:l[k]()}}return h}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$timeout","$log","dateFilter","datepickerConfig",function(a,b,c,d,e,f,g,h){var i=this,j={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","minMode","maxMode","showWeeks","startingDay","yearRange"],function(c,e){i[c]=angular.isDefined(b[c])?8>e?d(b[c])(a.$parent):a.$parent.$eval(b[c]):h[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){i[d]=a?new Date(a):null,i.refreshView()}):i[d]=h[d]?new Date(h[d]):null}),a.datepickerMode=a.datepickerMode||h.datepickerMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),this.activeDate=angular.isDefined(b.initDate)?a.$parent.$eval(b.initDate):new Date,a.isActive=function(b){return 0===i.compare(b.date,i.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(a){j=a,j.$render=function(){i.render()}},this.render=function(){if(j.$modelValue){var a=new Date(j.$modelValue),b=!isNaN(a);b?this.activeDate=a:f.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'),j.$setValidity("date",b)}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=j.$modelValue?new Date(j.$modelValue):null;j.$setValidity("date-disabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=j.$modelValue?new Date(j.$modelValue):null;return{date:a,label:g(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===i.minMode){var c=j.$modelValue?new Date(j.$modelValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),j.$setViewValue(c),j.$render()}else i.activeDate=b,a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=i.activeDate.getFullYear()+a*(i.step.years||0),c=i.activeDate.getMonth()+a*(i.step.months||0);i.activeDate.setFullYear(b,c,1),i.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===i.maxMode&&1===b||a.datepickerMode===i.minMode&&-1===b||(a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var k=function(){e(function(){i.element[0].focus()},0,!1)};a.$on("datepicker.focus",k),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),b.stopPropagation(),"enter"===c||"space"===c){if(i.isDisabled(i.activeDate))return;a.select(i.activeDate),k()}else!b.ctrlKey||"up"!==c&&"down"!==c?(i.handleKeyDown(c,b),i.refreshView()):(a.toggleMode("up"===c?1:-1),k())}}]).directive("datepicker",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{datepickerMode:"=?",dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}).directive("daypicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/day.html",require:"^datepicker",link:function(b,c,d,e){function f(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?i[b]:29}function g(a,b){var c=new Array(b),d=new Date(a),e=0;for(d.setHours(12);b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}b.showWeeks=e.showWeeks,e.step={months:1},e.element=c;var i=[31,28,31,30,31,30,31,31,30,31,30,31];e._refreshView=function(){var c=e.activeDate.getFullYear(),d=e.activeDate.getMonth(),f=new Date(c,d,1),i=e.startingDay-f.getDay(),j=i>0?7-i:-i,k=new Date(f);j>0&&k.setDate(-j+1);for(var l=g(k,42),m=0;42>m;m++)l[m]=angular.extend(e.createDateObject(l[m],e.formatDay),{secondary:l[m].getMonth()!==d,uid:b.uniqueId+"-"+m});b.labels=new Array(7);for(var n=0;7>n;n++)b.labels[n]={abbr:a(l[n].date,e.formatDayHeader),full:a(l[n].date,"EEEE")};if(b.title=a(e.activeDate,e.formatDayTitle),b.rows=e.split(l,7),b.showWeeks){b.weekNumbers=[];for(var o=h(b.rows[0][0].date),p=b.rows.length;b.weekNumbers.push(o++)f;f++)c[f]=angular.extend(e.createDateObject(new Date(d,f,1),e.formatMonth),{uid:b.uniqueId+"-"+f});b.title=a(e.activeDate,e.formatMonthTitle),b.rows=e.split(c,3)},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},e.handleKeyDown=function(a){var b=e.activeDate.getMonth();if("left"===a)b-=1;else if("up"===a)b-=3;else if("right"===a)b+=1;else if("down"===a)b+=3;else if("pageup"===a||"pagedown"===a){var c=e.activeDate.getFullYear()+("pageup"===a?-1:1);e.activeDate.setFullYear(c)}else"home"===a?b=0:"end"===a&&(b=11);e.activeDate.setMonth(b)},e.refreshView()}}}]).directive("yearpicker",["dateFilter",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/year.html",require:"^datepicker",link:function(a,b,c,d){function e(a){return parseInt((a-1)/f,10)*f+1}var f=d.yearRange;d.step={years:f},d.element=b,d._refreshView=function(){for(var b=new Array(f),c=0,g=e(d.activeDate.getFullYear());f>c;c++)b[c]=angular.extend(d.createDateObject(new Date(g+c,0,1),d.formatYear),{uid:a.uniqueId+"-"+c});a.title=[b[0].label,b[f-1].label].join(" - "),a.rows=d.split(b,5)},d.compare=function(a,b){return a.getFullYear()-b.getFullYear()},d.handleKeyDown=function(a){var b=d.activeDate.getFullYear();"left"===a?b-=1:"up"===a?b-=5:"right"===a?b+=1:"down"===a?b+=5:"pageup"===a||"pagedown"===a?b+=("pageup"===a?-1:1)*d.step.years:"home"===a?b=e(d.activeDate.getFullYear()):"end"===a&&(b=e(d.activeDate.getFullYear())+f-1),d.activeDate.setFullYear(b)},d.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","dateParser","datepickerPopupConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&"},link:function(h,i,j,k){function l(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function m(a){if(a){if(angular.isDate(a)&&!isNaN(a))return k.$setValidity("date",!0),a;if(angular.isString(a)){var b=f.parse(a,n)||new Date(a);return isNaN(b)?void k.$setValidity("date",!1):(k.$setValidity("date",!0),b)}return void k.$setValidity("date",!1)}return k.$setValidity("date",!0),null}var n,o=angular.isDefined(j.closeOnDateSelection)?h.$parent.$eval(j.closeOnDateSelection):g.closeOnDateSelection,p=angular.isDefined(j.datepickerAppendToBody)?h.$parent.$eval(j.datepickerAppendToBody):g.appendToBody;h.showButtonBar=angular.isDefined(j.showButtonBar)?h.$parent.$eval(j.showButtonBar):g.showButtonBar,h.getText=function(a){return h[a+"Text"]||g[a+"Text"]},j.$observe("datepickerPopup",function(a){n=a||g.datepickerPopup,k.$render()});var q=angular.element("
        ");q.attr({"ng-model":"date","ng-change":"dateSelection()"});var r=angular.element(q.children()[0]);j.datepickerOptions&&angular.forEach(h.$parent.$eval(j.datepickerOptions),function(a,b){r.attr(l(b),a)}),h.watchData={},angular.forEach(["minDate","maxDate","datepickerMode"],function(a){if(j[a]){var c=b(j[a]);if(h.$parent.$watch(c,function(b){h.watchData[a]=b}),r.attr(l(a),"watchData."+a),"datepickerMode"===a){var d=c.assign;h.$watch("watchData."+a,function(a,b){a!==b&&d(h.$parent,a)})}}}),j.dateDisabled&&r.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),k.$parsers.unshift(m),h.dateSelection=function(a){angular.isDefined(a)&&(h.date=a),k.$setViewValue(h.date),k.$render(),o&&(h.isOpen=!1,i[0].focus())},i.bind("input change keyup",function(){h.$apply(function(){h.date=k.$modelValue})}),k.$render=function(){var a=k.$viewValue?e(k.$viewValue,n):"";i.val(a),h.date=m(k.$modelValue)};var s=function(a){h.isOpen&&a.target!==i[0]&&h.$apply(function(){h.isOpen=!1})},t=function(a){h.keydown(a)};i.bind("keydown",t),h.keydown=function(a){27===a.which?(a.preventDefault(),a.stopPropagation(),h.close()):40!==a.which||h.isOpen||(h.isOpen=!0)},h.$watch("isOpen",function(a){a?(h.$broadcast("datepicker.focus"),h.position=p?d.offset(i):d.position(i),h.position.top=h.position.top+i.prop("offsetHeight"),c.bind("click",s)):c.unbind("click",s)}),h.select=function(a){if("today"===a){var b=new Date;angular.isDate(k.$modelValue)?(a=new Date(k.$modelValue),a.setFullYear(b.getFullYear(),b.getMonth(),b.getDate())):a=new Date(b.setHours(0,0,0,0))}h.dateSelection(a)},h.close=function(){h.isOpen=!1,i[0].focus()};var u=a(q)(h);q.remove(),p?c.find("body").append(u):i.after(u),h.$on("$destroy",function(){u.remove(),i.unbind("keydown",t),c.unbind("click",s)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdown",[]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document",function(a){var b=null;this.open=function(e){b||(a.bind("click",c),a.bind("keydown",d)),b&&b!==e&&(b.isOpen=!1),b=e},this.close=function(e){b===e&&(b=null,a.unbind("click",c),a.unbind("keydown",d))};var c=function(a){if(b){var c=b.getToggleElement();a&&c&&c[0].contains(a.target)||b.$apply(function(){b.isOpen=!1})}},d=function(a){27===a.which&&(b.focusToggleElement(),c())}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate",function(a,b,c,d,e,f){var g,h=this,i=a.$new(),j=d.openClass,k=angular.noop,l=b.onToggle?c(b.onToggle):angular.noop;this.init=function(d){h.$element=d,b.isOpen&&(g=c(b.isOpen),k=g.assign,a.$watch(g,function(a){i.isOpen=!!a}))},this.toggle=function(a){return i.isOpen=arguments.length?!!a:!i.isOpen},this.isOpen=function(){return i.isOpen},i.getToggleElement=function(){return h.toggleElement},i.focusToggleElement=function(){h.toggleElement&&h.toggleElement[0].focus()},i.$watch("isOpen",function(b,c){f[b?"addClass":"removeClass"](h.$element,j),b?(i.focusToggleElement(),e.open(i)):e.close(i),k(a,b),angular.isDefined(b)&&b!==c&&l(a,{open:!!b})}),a.$on("$locationChangeSuccess",function(){i.isOpen=!1}),a.$on("$destroy",function(){i.$destroy()})}]).directive("dropdown",function(){return{controller:"DropdownController",link:function(a,b,c,d){d.init(b)}}}).directive("dropdownToggle",function(){return{require:"?^dropdown",link:function(a,b,c,d){if(d){d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c0),i()})}function i(){if(k&&-1==g()){var a=l;j(k,l,150,function(){a.$destroy(),a=null}),k=void 0,l=void 0}}function j(c,d,e,f){function g(){g.done||(g.done=!0,c.remove(),f&&f())}d.animate=!1;var h=a.transitionEndEventName;if(h){var i=b(g,e);c.bind(h,function(){b.cancel(i),g(),d.$apply()})}else b(g)}var k,l,m="modal-open",n=f.createNew(),o={};return e.$watch(g,function(a){l&&(l.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=n.top(),b&&b.value.keyboard&&(a.preventDefault(),e.$apply(function(){o.dismiss(b.key,"escape key press")})))}),o.open=function(a,b){n.add(a,{deferred:b.deferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var f=c.find("body").eq(0),h=g();if(h>=0&&!k){l=e.$new(!0),l.index=h;var i=angular.element("
        ");i.attr("backdrop-class",b.backdropClass),k=d(i)(l),f.append(k)}var j=angular.element("
        ");j.attr({"template-url":b.windowTemplateUrl,"window-class":b.windowClass,size:b.size,index:n.length()-1,animate:"animate"}).html(b.content);var o=d(j)(b.scope);n.top().value.modalDomEl=o,f.append(o),f.addClass(m)},o.close=function(a,b){var c=n.get(a);c&&(c.value.deferred.resolve(b),h(a))},o.dismiss=function(a,b){var c=n.get(a);c&&(c.value.deferred.reject(b),h(a))},o.dismissAll=function(a){for(var b=this.getTop();b;)this.dismiss(b.key,a),b=this.getTop()},o.getTop=function(){return n.top()},o}]).provider("$modal",function(){var a={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function(b,c,d,e,f,g,h){function i(a){return a.template?d.when(a.template):e.get(angular.isFunction(a.templateUrl)?a.templateUrl():a.templateUrl,{cache:f}).then(function(a){return a.data})}function j(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var k={};return k.open=function(b){var e=d.defer(),f=d.defer(),k={result:e.promise,opened:f.promise,close:function(a){h.close(k,a)},dismiss:function(a){h.dismiss(k,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var l=d.all([i(b)].concat(j(b.resolve)));return l.then(function(a){var d=(b.scope||c).$new();d.$close=k.close,d.$dismiss=k.dismiss;var f,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=k,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),f=g(b.controller,i),b.controllerAs&&(d[b.controllerAs]=f)),h.open(k,{scope:d,deferred:e,content:a[0],backdrop:b.backdrop,keyboard:b.keyboard,backdropClass:b.backdropClass,windowClass:b.windowClass,windowTemplateUrl:b.windowTemplateUrl,size:b.size})},function(a){e.reject(a)}),l.then(function(){f.resolve(!0)},function(){f.reject(!1)}),k},k}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(a,b,c){var d=this,e={$setViewValue:angular.noop},f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(f,g){e=f,this.config=g,e.$render=function(){d.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){d.itemsPerPage=parseInt(b,10),a.totalPages=d.calculateTotalPages()}):this.itemsPerPage=g.itemsPerPage},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(e.$viewValue,10)||1},a.selectPage=function(b){a.page!==b&&b>0&&b<=a.totalPages&&(e.$setViewValue(b),e.$render())},a.getText=function(b){return a[b+"Text"]||d.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages},a.$watch("totalItems",function(){a.totalPages=d.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),a.page>b?a.selectPage(b):e.$render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c){return{number:a,text:b,active:c}}function h(a,b){var c=[],d=1,e=b,f=angular.isDefined(k)&&b>k;f&&(l?(d=Math.max(a-Math.floor(k/2),1),e=d+k-1,e>b&&(e=b,d=e-k+1)):(d=(Math.ceil(a/k)-1)*k+1,e=Math.min(d+k-1,b)));for(var h=d;e>=h;h++){var i=g(h,h,h===a);c.push(i)}if(f&&!l){if(d>1){var j=g(d-1,"...",!1);c.unshift(j)}if(b>e){var m=g(e+1,"...",!1);c.push(m)}}return c}var i=f[0],j=f[1];if(j){var k=angular.isDefined(e.maxSize)?c.$parent.$eval(e.maxSize):b.maxSize,l=angular.isDefined(e.rotate)?c.$parent.$eval(e.rotate):b.rotate;c.boundaryLinks=angular.isDefined(e.boundaryLinks)?c.$parent.$eval(e.boundaryLinks):b.boundaryLinks,c.directionLinks=angular.isDefined(e.directionLinks)?c.$parent.$eval(e.directionLinks):b.directionLinks,i.init(j,b),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){k=parseInt(a,10),i.render()});var m=i.render;i.render=function(){m(),c.page>0&&c.page<=c.totalPages&&(c.pages=h(c.page,c.totalPages))}}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@"},require:["pager","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&(b.align=angular.isDefined(d.align)?b.$parent.$eval(d.align):a.align,f.init(g,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase() +})}var b={placement:"top",animation:!0,popupDelay:0},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$document","$position","$interpolate",function(e,f,g,h,i,j){return function(e,k,l){function m(a){var b=a||n.trigger||l,d=c[b]||b;return{show:b,hide:d}}var n=angular.extend({},b,d),o=a(e),p=j.startSymbol(),q=j.endSymbol(),r="
        ';return{restrict:"EA",compile:function(){var a=f(r);return function(b,c,d){function f(){D.isOpen?l():j()}function j(){(!C||b.$eval(d[k+"Enable"]))&&(s(),D.popupDelay?z||(z=g(o,D.popupDelay,!1),z.then(function(a){a()})):o()())}function l(){b.$apply(function(){p()})}function o(){return z=null,y&&(g.cancel(y),y=null),D.content?(q(),w.css({top:0,left:0,display:"block"}),D.$digest(),E(),D.isOpen=!0,D.$digest(),E):angular.noop}function p(){D.isOpen=!1,g.cancel(z),z=null,D.animation?y||(y=g(r,500)):r()}function q(){w&&r(),x=D.$new(),w=a(x,function(a){A?h.find("body").append(a):c.after(a)})}function r(){y=null,w&&(w.remove(),w=null),x&&(x.$destroy(),x=null)}function s(){t(),u()}function t(){var a=d[k+"Placement"];D.placement=angular.isDefined(a)?a:n.placement}function u(){var a=d[k+"PopupDelay"],b=parseInt(a,10);D.popupDelay=isNaN(b)?n.popupDelay:b}function v(){var a=d[k+"Trigger"];F(),B=m(a),B.show===B.hide?c.bind(B.show,f):(c.bind(B.show,j),c.bind(B.hide,l))}var w,x,y,z,A=angular.isDefined(n.appendToBody)?n.appendToBody:!1,B=m(void 0),C=angular.isDefined(d[k+"Enable"]),D=b.$new(!0),E=function(){var a=i.positionElements(c,w,D.placement,A);a.top+="px",a.left+="px",w.css(a)};D.isOpen=!1,d.$observe(e,function(a){D.content=a,!a&&D.isOpen&&p()}),d.$observe(k+"Title",function(a){D.title=a});var F=function(){c.unbind(B.show,j),c.unbind(B.hide,l)};v();var G=b.$eval(d[k+"Animation"]);D.animation=angular.isDefined(G)?!!G:n.animation;var H=b.$eval(d[k+"AppendToBody"]);A=angular.isDefined(H)?H:A,A&&b.$on("$locationChangeSuccess",function(){D.isOpen&&p()}),b.$on("$destroy",function(){g.cancel(y),g.cancel(z),F(),r(),D=null})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function(a){return a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(a,b,c){var d=this,e=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max,this.addBar=function(b,c){e||c.css({transition:"none"}),this.bars.push(b),b.$watch("value",function(c){b.percent=+(100*c/a.max).toFixed(2)}),b.$on("$destroy",function(){c=null,d.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},templateUrl:"template/progressbar/progress.html"}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","ratingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(f)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff},a[b]);return a},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("rating",function(){return{restrict:"EA",require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(b){b.active&&b!==a&&(b.active=!1,b.onDeselect())}),a.active=!0,a.onSelect()},b.addTab=function(a){c.push(a),1===c.length?a.active=!0:a.active&&b.select(a)},b.removeTab=function(a){var e=c.indexOf(a);if(a.active&&c.length>1&&!d){var f=e==c.length-1?e-1:e+1;b.select(c[f])}c.splice(e,1)};var d;a.$on("$destroy",function(){d=!0})}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1}}}).directive("tab",["$parse",function(a){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(b,c,d){return function(b,c,e,f){b.$watch("active",function(a){a&&f.select(b)}),b.disabled=!1,e.disabled&&b.$parent.$watch(a(e.disabled),function(a){b.disabled=!!a}),b.select=function(){b.disabled||(b.active=!0)},f.addTab(b),b.$on("$destroy",function(){f.removeTab(b)}),b.$transcludeFn=d}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).controller("TimepickerController",["$scope","$attrs","$parse","$log","$locale","timepickerConfig",function(a,b,c,d,e,f){function g(){var b=parseInt(a.hours,10),c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c?(a.showMeridian&&(12===b&&(b=0),a.meridian===p[1]&&(b+=12)),b):void 0}function h(){var b=parseInt(a.minutes,10);return b>=0&&60>b?b:void 0}function i(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a}function j(a){k(),o.$setViewValue(new Date(n)),l(a)}function k(){o.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1}function l(b){var c=n.getHours(),d=n.getMinutes();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:i(c),a.minutes="m"===b?d:i(d),a.meridian=n.getHours()<12?p[0]:p[1]}function m(a){var b=new Date(n.getTime()+6e4*a);n.setHours(b.getHours(),b.getMinutes()),j()}var n=new Date,o={$setViewValue:angular.noop},p=angular.isDefined(b.meridians)?a.$parent.$eval(b.meridians):f.meridians||e.DATETIME_FORMATS.AMPMS;this.init=function(c,d){o=c,o.$render=this.render;var e=d.eq(0),g=d.eq(1),h=angular.isDefined(b.mousewheel)?a.$parent.$eval(b.mousewheel):f.mousewheel;h&&this.setupMousewheelEvents(e,g),a.readonlyInput=angular.isDefined(b.readonlyInput)?a.$parent.$eval(b.readonlyInput):f.readonlyInput,this.setupInputEvents(e,g)};var q=f.hourStep;b.hourStep&&a.$parent.$watch(c(b.hourStep),function(a){q=parseInt(a,10)});var r=f.minuteStep;b.minuteStep&&a.$parent.$watch(c(b.minuteStep),function(a){r=parseInt(a,10)}),a.showMeridian=f.showMeridian,b.showMeridian&&a.$parent.$watch(c(b.showMeridian),function(b){if(a.showMeridian=!!b,o.$error.time){var c=g(),d=h();angular.isDefined(c)&&angular.isDefined(d)&&(n.setHours(c),j())}else l()}),this.setupMousewheelEvents=function(b,c){var d=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()})},this.setupInputEvents=function(b,c){if(a.readonlyInput)return a.updateHours=angular.noop,void(a.updateMinutes=angular.noop);var d=function(b,c){o.$setViewValue(null),o.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c)};a.updateHours=function(){var a=g();angular.isDefined(a)?(n.setHours(a),j("h")):d(!0)},b.bind("blur",function(){!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=i(a.hours)})}),a.updateMinutes=function(){var a=h();angular.isDefined(a)?(n.setMinutes(a),j("m")):d(void 0,!0)},c.bind("blur",function(){!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=i(a.minutes)})})},this.render=function(){var a=o.$modelValue?new Date(o.$modelValue):null;isNaN(a)?(o.$setValidity("time",!1),d.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(n=a),k(),l())},a.incrementHours=function(){m(60*q)},a.decrementHours=function(){m(60*-q)},a.incrementMinutes=function(){m(r)},a.decrementMinutes=function(){m(-r)},a.toggleMeridian=function(){m(720*(n.getHours()<12?1:-1))}}]).directive("timepicker",function(){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?i.$eval(k.typeaheadAppendToBody):!1,u=i.$eval(k.typeaheadFocusFirst)!==!1,v=b(k.ngModel).assign,w=g.parse(k.typeahead),x=i.$new();i.$on("$destroy",function(){x.$destroy()});var y="typeahead-"+x.$id+"-"+Math.floor(1e4*Math.random());j.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":y});var z=angular.element("
        ");z.attr({id:y,matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&z.attr("template-url",k.typeaheadTemplateUrl);var A=function(){x.matches=[],x.activeIdx=-1,j.attr("aria-expanded",!1)},B=function(a){return y+"-option-"+a};x.$watch("activeIdx",function(a){0>a?j.removeAttr("aria-activedescendant"):j.attr("aria-activedescendant",B(a))});var C=function(a){var b={$viewValue:a};q(i,!0),c.when(w.source(i,b)).then(function(c){var d=a===l.$viewValue;if(d&&m)if(c.length>0){x.activeIdx=u?0:-1,x.matches.length=0;for(var e=0;e=n?o>0?(F(),E(a)):C(a):(q(i,!1),F(),A()),p?a:a?void l.$setValidity("editable",!1):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return s?(d.$model=a,s(i,d)):(d[w.itemName]=a,b=w.viewMapper(i,d),d[w.itemName]=void 0,c=w.viewMapper(i,d),b!==c?b:a)}),x.select=function(a){var b,c,e={};e[w.itemName]=c=x.matches[a].model,b=w.modelMapper(i,e),v(i,b),l.$setValidity("editable",!0),r(i,{$item:c,$model:b,$label:w.viewMapper(i,e)}),A(),d(function(){j[0].focus()},0,!1)},j.bind("keydown",function(a){0!==x.matches.length&&-1!==h.indexOf(a.which)&&(-1!=x.activeIdx||13!==a.which&&9!==a.which)&&(a.preventDefault(),40===a.which?(x.activeIdx=(x.activeIdx+1)%x.matches.length,x.$digest()):38===a.which?(x.activeIdx=(x.activeIdx>0?x.activeIdx:x.matches.length)-1,x.$digest()):13===a.which||9===a.which?x.$apply(function(){x.select(x.activeIdx)}):27===a.which&&(a.stopPropagation(),A(),x.$digest()))}),j.bind("blur",function(){m=!1});var G=function(a){j[0]!==a.target&&(A(),x.$digest())};e.bind("click",G),i.$on("$destroy",function(){e.unbind("click",G),t&&H.remove()});var H=a(z)(x);t?e.find("body").append(H):j.after(H)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function(a,b,c,d){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(e,f,g){var h=d(g.templateUrl)(e.$parent)||"template/typeahead/typeahead-match.html";a.get(h,{cache:b}).success(function(a){f.replaceWith(c(a.trim())(e))})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?(""+b).replace(new RegExp(a(c),"gi"),"$&"):b}}); \ No newline at end of file diff --git a/bower_components/angular-breadcrumb/.bower.json b/bower_components/angular-breadcrumb/.bower.json new file mode 100644 index 0000000..c8aba20 --- /dev/null +++ b/bower_components/angular-breadcrumb/.bower.json @@ -0,0 +1,43 @@ +{ + "name": "angular-breadcrumb", + "description": "AngularJS module that generates a breadcrumb from ui-router's states", + "version": "0.3.3", + "main": "release/angular-breadcrumb.js", + "ignore": [ + "sample", + "src", + "test", + ".bowerrc", + ".coveralls.yml", + ".gitignore", + ".jshintrc", + ".travis.yml", + "gruntfile.js", + "bower.json", + "karma.conf.js", + "libpeerconnection.log", + "package.json", + "README.md" + ], + "dependencies": { + "angular": ">=1.0.8", + "angular-ui-router": ">=0.2.0" + }, + "devDependencies": { + "bootstrap": "~2.3.2", + "angular-ui-bootstrap-bower": "~0.8.0", + "underscore": "~1.5.1", + "angular-mocks": ">=1.0.8", + "angular-sanitize": ">=1.0.8" + }, + "homepage": "https://github.com/ncuillery/angular-breadcrumb", + "_release": "0.3.3", + "_resolution": { + "type": "version", + "tag": "v0.3.3", + "commit": "884d9acb2059993e721e44e790969d783a1b6ce9" + }, + "_source": "git://github.com/ncuillery/angular-breadcrumb.git", + "_target": "~0.3.3", + "_originalSource": "angular-breadcrumb" +} \ No newline at end of file diff --git a/bower_components/angular-breadcrumb/.editorconfig b/bower_components/angular-breadcrumb/.editorconfig new file mode 100644 index 0000000..16480f1 --- /dev/null +++ b/bower_components/angular-breadcrumb/.editorconfig @@ -0,0 +1,16 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/bower_components/angular-breadcrumb/.npmignore b/bower_components/angular-breadcrumb/.npmignore new file mode 100644 index 0000000..86b9872 --- /dev/null +++ b/bower_components/angular-breadcrumb/.npmignore @@ -0,0 +1,15 @@ +sample +src +test +.idea +bower_components +coverage +testDependencies +.bowerrc +.coveralls.yml +.gitignore +.jshintrc +.travis.yml +gruntfile.js +karma.conf.js +libpeerconnection.log diff --git a/bower_components/angular-breadcrumb/CHANGELOG.md b/bower_components/angular-breadcrumb/CHANGELOG.md new file mode 100644 index 0000000..0d0e67c --- /dev/null +++ b/bower_components/angular-breadcrumb/CHANGELOG.md @@ -0,0 +1,125 @@ + +### 0.3.3 (2014-12-16) + + +#### Bug Fixes + +* **ncyBreadcrumb:** define `$$templates` with var instead of attaching it to `window` ([c35c9d25](http://github.com/ncuillery/angular-breadcrumb/commit/c35c9d255b5e2585d225a961d1efdb51d18f6a55), closes [#55](http://github.com/ncuillery/angular-breadcrumb/issues/55)) + + + +### 0.3.2 (2014-11-15) + +* **npm:** nothing, it's only a blank release due to a network problem during the last `npm publish` (f...ing npm doesn't allow a republish with the same version number [npm-registry-couchapp#148](https://github.com/npm/npm-registry-couchapp/issues/148)). + + +### 0.3.1 (2014-11-15) + + +#### Bug Fixes + +* **npm:** update package.json after (unclean) npm publish ([ab8161c2](http://github.com/ncuillery/angular-breadcrumb/commit/ab8161c25f98613f725b5e5ff8fe147acd60b365), closes [#52](http://github.com/ncuillery/angular-breadcrumb/issues/52)) +* **sample:** Send correct url params for the room link in booking view ([876de49a](http://github.com/ncuillery/angular-breadcrumb/commit/876de49a9c5d6e2d75714a606238e9041ed49baf)) + + + +## 0.3.0 (2014-10-29) + + +#### Bug Fixes + +* organize state-level options in `ncyBreadcrumb` key instead of `data` ([1ea436d3](http://github.com/ncuillery/angular-breadcrumb/commit/1ea436d3f6d5470b7ae3e71e71259dbd2422bc00), closes [#30](http://github.com/ncuillery/angular-breadcrumb/issues/30)) +* curly braces appearing on title of sample app ([855e76cb](http://github.com/ncuillery/angular-breadcrumb/commit/855e76cb33fda607fa3caa230564b77b48262c40)) + + +#### Features + +* Add a global option to include abstract states ([6f0461ea](http://github.com/ncuillery/angular-breadcrumb/commit/6f0461ea7db36d8e10c29ed10de1f1c08d215a19), closes [#35](http://github.com/ncuillery/angular-breadcrumb/issues/35), [#28](http://github.com/ncuillery/angular-breadcrumb/issues/28)) +* **$breadcrumb:** + * Support url params when using `ncyBreadcrumb.parent` property ([55730045](http://github.com/ncuillery/angular-breadcrumb/commit/55730045dcf3b4fb1048c67f1e18953505563ed4), closes [#46](http://github.com/ncuillery/angular-breadcrumb/issues/46)) + * add the customization of the parent state with a function ([ada09015](http://github.com/ncuillery/angular-breadcrumb/commit/ada09015c49f05a94349dabf078f1ed621811aaa), closes [#32](http://github.com/ncuillery/angular-breadcrumb/issues/32)) +* **ncyBreadcrumbLast:** Add a new directive rendering the last step ([1eef24fb](http://github.com/ncuillery/angular-breadcrumb/commit/1eef24fbe862a1e3308181c38f50755843cf4426), closes [#37](http://github.com/ncuillery/angular-breadcrumb/issues/37)) + + +#### Breaking Changes + +* state-level options has been moved under the custom key +`ncyBreadcrumb` in state's configuration. + +To migrate the code follow the example below: +``` +// Before +$stateProvider.state('A', { + url: '/a', + data: { + ncyBreadcrumbLabel: 'State A' + } +}); +``` + +``` +// After +$stateProvider.state('A', { + url: '/a', + ncyBreadcrumb: { + label: 'State A' + } +}); +``` +See [API reference](https://github.com/ncuillery/angular-breadcrumb/wiki/API-Reference) for more informations. + ([1ea436d3](http://github.com/ncuillery/angular-breadcrumb/commit/1ea436d3f6d5470b7ae3e71e71259dbd2422bc00)) + + + +### 0.2.3 (2014-07-26) + + +#### Bug Fixes + +* **$breadcrumb:** use `$stateParams` in case of unhierarchical states ([1c3c05e0](http://github.com/ncuillery/angular-breadcrumb/commit/1c3c05e0acac191fe2e76db2ef18da339caefaaa), closes [#29](http://github.com/ncuillery/angular-breadcrumb/issues/29)) + + + +### 0.2.2 (2014-06-23) + + +#### Bug Fixes + +* catch the `$viewContentLoaded` earlier ([bb47dd54](http://github.com/ncuillery/angular-breadcrumb/commit/bb47dd54deb5efc579ccb9b1575e686803dee1c5), closes [#14](http://github.com/ncuillery/angular-breadcrumb/issues/14)) +* **sample:** + * make the CRU(D) about rooms working ([3ca89ec7](http://github.com/ncuillery/angular-breadcrumb/commit/3ca89ec771fd20dc4ab2d733612bdcfb96ced703)) + * prevent direct URL access to a day disabled in the datepicker ([95236916](http://github.com/ncuillery/angular-breadcrumb/commit/95236916e00b19464a3dfe3584ef1b18da9ffb25), closes [#17](http://github.com/ncuillery/angular-breadcrumb/issues/17)) + * use the same variable in the datepicker and from url params for state `booking.day` ([646f7060](http://github.com/ncuillery/angular-breadcrumb/commit/646f70607e494f0e5e3c2483ed69f689684b2742), closes [#16](http://github.com/ncuillery/angular-breadcrumb/issues/16)) + + +#### Features + +* **ncyBreadcrumb:** watch every expression founded in labels ([1363515e](http://github.com/ncuillery/angular-breadcrumb/commit/1363515e20977ce2f39a1f5e5e1d701f0d7af296), closes [#20](http://github.com/ncuillery/angular-breadcrumb/issues/20)) + + + +### 0.2.1 (2014-05-16) + + +#### Bug Fixes + +* **$breadcrumb:** check if a state has a parent when looking for an inheritated property ([77e668b5](http://github.com/ncuillery/angular-breadcrumb/commit/77e668b5eb759570a64c2a885e81580953af3201), closes [#11](http://github.com/ncuillery/angular-breadcrumb/issues/11)) + + + +### 0.2.0 (2014-05-08) + + +#### Bug Fixes + +* **$breadcrumb:** remove abstract states from breadcrumb ([8a06c5ab](http://github.com/ncuillery/angular-breadcrumb/commit/8a06c5abce749027d48f7309d1aabea1e447dfd5), closes [#8](http://github.com/ncuillery/angular-breadcrumb/issues/8)) +* **ncyBreadcrumb:** display the correct breadcrumb in case of direct access ([e1f455ba](http://github.com/ncuillery/angular-breadcrumb/commit/e1f455ba4def97d3fc76b53772867b5f9daf4232), closes [#10](http://github.com/ncuillery/angular-breadcrumb/issues/10)) + + +#### Features + +* **$breadcrumb:** + * add a configuration property for skipping a state in the breadcrumb ([dd255d90](http://github.com/ncuillery/angular-breadcrumb/commit/dd255d906c4231f44b48f066d4db197a9c6b9e27), closes [#9](http://github.com/ncuillery/angular-breadcrumb/issues/9)) + * allow chain of states customization ([028e493a](http://github.com/ncuillery/angular-breadcrumb/commit/028e493a1ebcae5ae60b8a9d42b949262000d7df), closes [#7](http://github.com/ncuillery/angular-breadcrumb/issues/7)) +* **ncyBreadcrumb:** add 'Element' declaration style '' ([b51441ea](http://github.com/ncuillery/angular-breadcrumb/commit/b51441eafb1659b782fea1f8668c7f455e1d6b4d)) + diff --git a/bower_components/angular-breadcrumb/CONTRIBUTING.md b/bower_components/angular-breadcrumb/CONTRIBUTING.md new file mode 100644 index 0000000..720c4f1 --- /dev/null +++ b/bower_components/angular-breadcrumb/CONTRIBUTING.md @@ -0,0 +1,52 @@ +# Contributing to angular-breadcrumb + +I am very glad to see this project living with PR from contributors who trust in it. Here is some guidelines to keep the contributions useful and efficient. + +## Development hints + +### Installation +- Checkout the repository +- Run `npm install` +- Run `bower install` + +### Test running +This module uses the classic AngularJS stack with: + +- Karma (test runner) +- Jasmine (assertion framework) +- angular-mocks (AngularJS module for testing) + +Run the test with the grunt task `grunt test`. It runs the tests with different versions of AngularJS. + +### Test developing +Tests are build around modules with a specific `$stateProvider` configuration: + +- [Basic configuration](https://github.com/ncuillery/angular-breadcrumb/blob/master/test/mock/test-modules.js#L6): Basic definitions (no template, no controller) +- [Interpolation configuration](https://github.com/ncuillery/angular-breadcrumb/blob/master/test/mock/test-modules.js#L21): States with bindings in `ncyBreadcrumbLabel` +- [HTML configuration](https://github.com/ncuillery/angular-breadcrumb/blob/master/test/mock/test-modules.js#L36): States with HTML in `ncyBreadcrumbLabel` +- [Sample configuration](https://github.com/ncuillery/angular-breadcrumb/blob/master/test/mock/test-modules.js#L41): Bridge towards the sample app configuration for using in tests +- [UI-router's configuration](https://github.com/ncuillery/angular-breadcrumb/blob/master/test/mock/test-ui-router-sample.js#L9): Clone of the UI-router sample app (complemented with breadcrumb configuration) + +Theses modules are loaded by Karma and they are available in test specifications. + +Specifications are generally related to the directive `ncyBreadcrumb` or the service `$breadcrumb`. + +### Sample +If you are not familiar with JS testing. You can run the [sample](http://ncuillery.github.io/angular-breadcrumb/#/sample) locally for testing purposes by using `grunt sample`. Sources are live-reloaded after each changes. + +## Submitting a Pull Request +- Fork the [repository](https://github.com/ncuillery/angular-breadcrumb/) +- Make your changes in a new git branch following the coding rules below. +- Run the grunt default task (by typing `grunt` or `grunt default`): it will run the tests and build the module in `dist` directory) +- Commit the changes (including the `dist` directory) by using the commit conventions explained below. +- Push and make the PR + + +## Coding rules +- When making changes on the source file, please check that your changes are covered by the tests. If not, create a new test case. + + +## Commit conventions +angular-breadcrumb uses the same strict conventions as AngularJS and UI-router. These conventions are explained [here](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#-git-commit-guidelines). + +It is very important to fit these conventions especially for types `fix` and `feature` which are used by the CHANGELOG.md generation (it uses the [grunt-conventional-changelog](https://github.com/btford/grunt-conventional-changelog)). diff --git a/bower_components/angular-breadcrumb/Gruntfile.js b/bower_components/angular-breadcrumb/Gruntfile.js new file mode 100644 index 0000000..7e1652b --- /dev/null +++ b/bower_components/angular-breadcrumb/Gruntfile.js @@ -0,0 +1,254 @@ +'use strict'; + +var LIVERELOAD_PORT = 35729; +var lrSnippet = require('connect-livereload')({ port: LIVERELOAD_PORT }); +var mountFolder = function (connect, dir) { + return connect.static(require('path').resolve(dir)); +}; + +module.exports = function (grunt) { + + // Project configuration. + grunt.initConfig({ + // Metadata. + pkg: grunt.file.readJSON('package.json'), + headerDev: '/*! <%= pkg.name %> - v<%= pkg.version %>-dev-<%= grunt.template.today("yyyy-mm-dd") %>\n', + headerRelease: '/*! <%= pkg.name %> - v<%= pkg.version %>\n', + banner: '<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' + + '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' + + ' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> */\n', + // Task configuration. + concat: { + dev: { + options: { + banner: '<%= headerDev %><%= banner %>\n(function (window, angular, undefined) {\n', + footer: '})(window, window.angular);\n', + stripBanners: true + }, + src: ['src/<%= pkg.name %>.js'], + dest: 'dist/<%= pkg.name %>.js' + }, + release: { + options: { + banner: '<%= headerRelease %><%= banner %>\n(function (window, angular, undefined) {\n', + footer: '})(window, window.angular);\n', + stripBanners: true + }, + src: ['src/<%= pkg.name %>.js'], + dest: 'release/<%= pkg.name %>.js' + } + }, + uglify: { + dev: { + options: { + banner: '<%= headerDev %><%= banner %>' + }, + src: '<%= concat.dev.dest %>', + dest: 'dist/<%= pkg.name %>.min.js' + }, + release: { + options: { + banner: '<%= headerRelease %><%= banner %>' + }, + src: '<%= concat.release.dest %>', + dest: 'release/<%= pkg.name %>.min.js' + } + }, + karma: { + unit: { + configFile: 'karma.conf.js' + } + }, + jshint: { + options: { + jshintrc: '.jshintrc' + }, + gruntfile: { + src: 'Gruntfile.js' + }, + sources: { + options: { + jshintrc: 'src/.jshintrc' + }, + src: ['src/**/*.js'] + }, + test: { + src: ['test/**/*.js'] + } + }, + watch: { + gruntfile: { + files: '<%= jshint.gruntfile.src %>', + tasks: ['jshint:gruntfile'] + }, + sources: { + files: '<%= jshint.sources.src %>', + tasks: ['jshint:sources', 'karma'] + }, + test: { + files: '<%= jshint.test.src %>', + tasks: ['jshint:test', 'karma'] + }, + sample: { + options: { + livereload: LIVERELOAD_PORT + }, + tasks: 'copy:breadcrumb', + files: [ + 'sample/*.{css,js,html}', + 'sample/controllers/*.{css,js,html}', + 'sample/views/*.{css,js,html}', + 'src/*.js' + ] + } + }, + copy: { + breadcrumb: { + files: [ + { + flatten: true, + expand: true, + src: [ + 'src/angular-breadcrumb.js' + ], + dest: 'sample/asset/' + } + ] + }, + asset: { + files: [ + { + flatten: true, + expand: true, + src: [ + 'dist/angular-breadcrumb.js', + 'bower_components/angular/angular.js', + 'bower_components/angular-ui-router/release/angular-ui-router.js', + 'bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js', + 'bower_components/bootstrap.css/css/bootstrap.css', + 'bower_components/underscore/underscore.js' + ], + dest: 'sample/asset/' + } + ] + }, + img: { + files: [ + { + flatten: true, + expand: true, + src: [ + 'bower_components/bootstrap.css/img/glyphicons-halflings.png' + ], + dest: 'sample/img/' + } + ] + } + }, + connect: { + options: { + port: 9000, + hostname: 'localhost' + }, + livereload: { + options: { + middleware: function (connect) { + return [ + lrSnippet, + mountFolder(connect, 'sample') + ]; + } + } + } + }, + open: { + server: { + url: 'http://localhost:<%= connect.options.port %>/index.html' + } + }, + bump: { + options: { + files: ['package.json', 'bower.json'], + updateConfigs: ['pkg'] + } + }, + clean: { + release: ["sample/*.zip"], + test: ["testDependencies/*"] + }, + compress: { + release: { + options: { + archive: 'sample/<%= pkg.name %>-<%= pkg.version %>.zip' + }, + files: [ + {expand: true, cwd: 'release/', src: ['*.js']} + ] + } + }, + replace: { + release: { + src: ['sample/views/home.html'], + overwrite: true, + replacements: [{ + from: /angular-breadcrumb-[0-9]+\.[0-9]+\.[0-9]+\.zip/g, + to: "angular-breadcrumb-<%= pkg.version %>.zip" + }, + { + from: /\([0-9]+\.[0-9]+\.[0-9]+\)/g, + to: "(<%= pkg.version %>)" + }] + } + }, + shell: { + testMinimal: { + command: 'bower install angular#=1.0.8 angular-mocks#=1.0.8 angular-sanitize#=1.0.8 --config.directory=. --config.cwd=testDependencies' + }, + test1dot2: { + command: 'bower install angular#=1.2.18 angular-mocks#=1.2.18 angular-sanitize#=1.2.18 --config.directory=. --config.cwd=testDependencies' + } + } + + }); + + // These plugins provide necessary tasks. + grunt.loadNpmTasks('grunt-bump'); + grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-compress'); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-jshint'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-copy'); + grunt.loadNpmTasks('grunt-contrib-connect'); + grunt.loadNpmTasks('grunt-conventional-changelog'); + grunt.loadNpmTasks('grunt-karma'); + grunt.loadNpmTasks('grunt-open'); + grunt.loadNpmTasks('grunt-shell'); + grunt.loadNpmTasks('grunt-text-replace'); + + grunt.registerTask('test', ['jshint', 'testMin', 'test1dot2']); + grunt.registerTask('testMin', ['clean:test', 'shell:testMinimal', 'karma']); + grunt.registerTask('test1dot2', ['clean:test', 'shell:test1dot2', 'karma']); + + grunt.registerTask('default', ['test', 'concat:dev', 'uglify:dev']); + + grunt.registerTask('sample', ['concat:dev', 'copy:asset', 'copy:img', 'connect:livereload', 'open', 'watch']); + + grunt.registerTask('release-prepare', 'Update all files for a release', function(target) { + if(!target) { + target = 'patch'; + } + grunt.task.run( + 'bump-only:' + target, // Version update + 'test', // Tests + 'concat:release', // Concat with release banner + 'uglify:release', // Minify with release banner + 'changelog', // Changelog update + 'clean:release', // Delete old version download file + 'compress:release', // New version download file + 'replace:release' // Update version in download button (link & label) + ); + }); + +}; diff --git a/bower_components/angular-breadcrumb/LICENSE-MIT b/bower_components/angular-breadcrumb/LICENSE-MIT new file mode 100644 index 0000000..2634550 --- /dev/null +++ b/bower_components/angular-breadcrumb/LICENSE-MIT @@ -0,0 +1,22 @@ +Copyright (c) 2013 Nicolas Cuillery + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/bower_components/angular-breadcrumb/bower.json b/bower_components/angular-breadcrumb/bower.json new file mode 100644 index 0000000..e76d3c3 --- /dev/null +++ b/bower_components/angular-breadcrumb/bower.json @@ -0,0 +1,33 @@ +{ + "name": "angular-breadcrumb", + "description": "AngularJS module that generates a breadcrumb from ui-router's states", + "version": "0.3.3", + "main": "release/angular-breadcrumb.js", + "ignore": [ + "sample", + "src", + "test", + ".bowerrc", + ".coveralls.yml", + ".gitignore", + ".jshintrc", + ".travis.yml", + "gruntfile.js", + "bower.json", + "karma.conf.js", + "libpeerconnection.log", + "package.json", + "README.md" + ], + "dependencies": { + "angular": ">=1.0.8", + "angular-ui-router": ">=0.2.0" + }, + "devDependencies": { + "bootstrap": "~2.3.2", + "angular-ui-bootstrap-bower": "~0.8.0", + "underscore": "~1.5.1", + "angular-mocks": ">=1.0.8", + "angular-sanitize": ">=1.0.8" + } +} diff --git a/bower_components/angular-breadcrumb/dist/angular-breadcrumb.js b/bower_components/angular-breadcrumb/dist/angular-breadcrumb.js new file mode 100644 index 0000000..5a9374b --- /dev/null +++ b/bower_components/angular-breadcrumb/dist/angular-breadcrumb.js @@ -0,0 +1,284 @@ +/*! angular-breadcrumb - v0.3.2-dev-2014-12-14 +* http://ncuillery.github.io/angular-breadcrumb +* Copyright (c) 2014 Nicolas Cuillery; Licensed MIT */ + +(function (window, angular, undefined) { +'use strict'; + +function isAOlderThanB(scopeA, scopeB) { + if(angular.equals(scopeA.length, scopeB.length)) { + return scopeA > scopeB; + } else { + return scopeA.length > scopeB.length; + } +} + +function parseStateRef(ref) { + var parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/); + if (!parsed || parsed.length !== 4) { throw new Error("Invalid state ref '" + ref + "'"); } + return { state: parsed[1], paramExpr: parsed[3] || null }; +} + +function $Breadcrumb() { + + var $$options = { + prefixStateName: null, + template: 'bootstrap3', + templateUrl: null, + includeAbstract : false + }; + + this.setOptions = function(options) { + angular.extend($$options, options); + }; + + this.$get = ['$state', '$stateParams', '$rootScope', function($state, $stateParams, $rootScope) { + + var $lastViewScope = $rootScope; + + // Early catch of $viewContentLoaded event + $rootScope.$on('$viewContentLoaded', function (event) { + // With nested views, the event occur several times, in "wrong" order + if(isAOlderThanB(event.targetScope.$id, $lastViewScope.$id)) { + $lastViewScope = event.targetScope; + } + }); + + // Get the parent state + var $$parentState = function(state) { + // Check if state has explicit parent OR we try guess parent from its name + var name = state.parent || (/^(.+)\.[^.]+$/.exec(state.name) || [])[1]; + // If we were able to figure out parent name then get this state + return name; + }; + + // Add the state in the chain if not already in and if not abstract + var $$addStateInChain = function(chain, stateRef) { + var conf, + parentParams, + ref = parseStateRef(stateRef); + + for(var i=0, l=chain.length; i' + + '
      • ' + + '{{step.ncyBreadcrumbLabel}} ' + + '{{step.ncyBreadcrumbLabel}}' + + '/' + + '
      • ' + + '', + bootstrap3: '
          ' + + '
        1. ' + + '{{step.ncyBreadcrumbLabel}} ' + + '{{step.ncyBreadcrumbLabel}}' + + '
        2. ' + + '
        ' + }; + + return { + restrict: 'AE', + replace: true, + scope: {}, + template: $breadcrumb.getTemplate($$templates), + templateUrl: $breadcrumb.getTemplateUrl(), + link: { + post: function postLink(scope) { + var labelWatchers = []; + + var renderBreadcrumb = function() { + deregisterWatchers(labelWatchers); + var viewScope = $breadcrumb.$getLastViewScope(); + scope.steps = $breadcrumb.getStatesChain(); + angular.forEach(scope.steps, function (step) { + if (step.ncyBreadcrumb && step.ncyBreadcrumb.label) { + var parseLabel = $interpolate(step.ncyBreadcrumb.label); + step.ncyBreadcrumbLabel = parseLabel(viewScope); + // Watcher for further viewScope updates + registerWatchers(labelWatchers, parseLabel, viewScope, step); + } else { + step.ncyBreadcrumbLabel = step.name; + } + }); + }; + + $rootScope.$on('$viewContentLoaded', function () { + renderBreadcrumb(); + }); + + // View(s) may be already loaded while the directive's linking + renderBreadcrumb(); + } + } + }; +} +BreadcrumbDirective.$inject = ['$interpolate', '$breadcrumb', '$rootScope']; + +function BreadcrumbLastDirective($interpolate, $breadcrumb, $rootScope) { + + return { + restrict: 'A', + scope: {}, + template: '{{ncyBreadcrumbLabel}}', + compile: function(cElement, cAttrs) { + + // Override the default template if ncyBreadcrumbLast has a value + var template = cElement.attr(cAttrs.$attr.ncyBreadcrumbLast); + if(template) { + cElement.html(template); + } + + return { + post: function postLink(scope) { + var labelWatchers = []; + + var renderLabel = function() { + deregisterWatchers(labelWatchers); + var viewScope = $breadcrumb.$getLastViewScope(); + var lastStep = $breadcrumb.getLastStep(); + if(lastStep) { + scope.ncyBreadcrumbLink = lastStep.ncyBreadcrumbLink; + if (lastStep.ncyBreadcrumb && lastStep.ncyBreadcrumb.label) { + var parseLabel = $interpolate(lastStep.ncyBreadcrumb.label); + scope.ncyBreadcrumbLabel = parseLabel(viewScope); + // Watcher for further viewScope updates + // Tricky last arg: the last step is the entire scope of the directive ! + registerWatchers(labelWatchers, parseLabel, viewScope, scope); + } else { + scope.ncyBreadcrumbLabel = lastStep.name; + } + } + }; + + $rootScope.$on('$viewContentLoaded', function () { + renderLabel(); + }); + + // View(s) may be already loaded while the directive's linking + renderLabel(); + } + }; + + } + }; +} +BreadcrumbLastDirective.$inject = ['$interpolate', '$breadcrumb', '$rootScope']; + +angular.module('ncy-angular-breadcrumb', ['ui.router.state']) + .provider('$breadcrumb', $Breadcrumb) + .directive('ncyBreadcrumb', BreadcrumbDirective) + .directive('ncyBreadcrumbLast', BreadcrumbLastDirective); +})(window, window.angular); diff --git a/bower_components/angular-breadcrumb/dist/angular-breadcrumb.min.js b/bower_components/angular-breadcrumb/dist/angular-breadcrumb.min.js new file mode 100644 index 0000000..45a177e --- /dev/null +++ b/bower_components/angular-breadcrumb/dist/angular-breadcrumb.min.js @@ -0,0 +1,4 @@ +/*! angular-breadcrumb - v0.3.2-dev-2014-12-14 +* http://ncuillery.github.io/angular-breadcrumb +* Copyright (c) 2014 Nicolas Cuillery; Licensed MIT */ +!function(a,b,c){"use strict";function d(a,c){return b.equals(a.length,c.length)?a>c:a.length>c.length}function e(a){var b=a.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/);if(!b||4!==b.length)throw new Error("Invalid state ref '"+a+"'");return{state:b[1],paramExpr:b[3]||null}}function f(){var a={prefixStateName:null,template:"bootstrap3",templateUrl:null,includeAbstract:!1};this.setOptions=function(c){b.extend(a,c)},this.$get=["$state","$stateParams","$rootScope",function(b,f,g){var h=g;g.$on("$viewContentLoaded",function(a){d(a.targetScope.$id,h.$id)&&(h=a.targetScope)});var i=function(a){var b=a.parent||(/^(.+)\.[^.]+$/.exec(a.name)||[])[1];return b},j=function(c,d){for(var g,i,j=e(d),k=0,l=c.length;l>k;k+=1)if(c[k].name===j.state)return;g=b.get(j.state),g.abstract&&!a.includeAbstract||g.ncyBreadcrumb&&g.ncyBreadcrumb.skip||(j.paramExpr&&(i=h.$eval(j.paramExpr)),g.ncyBreadcrumbLink=b.href(j.state,i||f||{}),c.unshift(g))},k=function(a){var c=e(a),d=b.get(c.state);if(d.ncyBreadcrumb&&d.ncyBreadcrumb.parent){var f="function"==typeof d.ncyBreadcrumb.parent,g=f?d.ncyBreadcrumb.parent(h):d.ncyBreadcrumb.parent;if(g)return g}return i(d)};return{getTemplate:function(b){return a.templateUrl?null:b[a.template]?b[a.template]:a.template},getTemplateUrl:function(){return a.templateUrl},getStatesChain:function(c){for(var d=[],e=b.$current.self.name;e;e=k(e))if(j(d,e),c&&d.length)return d;return a.prefixStateName&&j(d,a.prefixStateName),d},getLastStep:function(){var a=this.getStatesChain(!0);return a.length?a[0]:c},$getLastViewScope:function(){return h}}}]}function g(a,c,d){var e={bootstrap2:'
        • {{step.ncyBreadcrumbLabel}} {{step.ncyBreadcrumbLabel}}/
        ',bootstrap3:'
        1. {{step.ncyBreadcrumbLabel}} {{step.ncyBreadcrumbLabel}}
        '};return{restrict:"AE",replace:!0,scope:{},template:c.getTemplate(e),templateUrl:c.getTemplateUrl(),link:{post:function(e){var f=[],g=function(){k(f);var d=c.$getLastViewScope();e.steps=c.getStatesChain(),b.forEach(e.steps,function(b){if(b.ncyBreadcrumb&&b.ncyBreadcrumb.label){var c=a(b.ncyBreadcrumb.label);b.ncyBreadcrumbLabel=c(d),j(f,c,d,b)}else b.ncyBreadcrumbLabel=b.name})};d.$on("$viewContentLoaded",function(){g()}),g()}}}}function h(a,b,c){return{restrict:"A",scope:{},template:"{{ncyBreadcrumbLabel}}",compile:function(d,e){var f=d.attr(e.$attr.ncyBreadcrumbLast);return f&&d.html(f),{post:function(d){var e=[],f=function(){k(e);var c=b.$getLastViewScope(),f=b.getLastStep();if(f)if(d.ncyBreadcrumbLink=f.ncyBreadcrumbLink,f.ncyBreadcrumb&&f.ncyBreadcrumb.label){var g=a(f.ncyBreadcrumb.label);d.ncyBreadcrumbLabel=g(c),j(e,g,c,d)}else d.ncyBreadcrumbLabel=f.name};c.$on("$viewContentLoaded",function(){f()}),f()}}}}}var i=function(a){if(a.expressions)return a.expressions;var c=[];return b.forEach(a.parts,function(a){b.isFunction(a)&&c.push(a.exp)}),c},j=function(a,c,d,e){b.forEach(i(c),function(b){var f=d.$watch(b,function(){e.ncyBreadcrumbLabel=c(d)});a.push(f)})},k=function(a){b.forEach(a,function(a){a()}),a=[]};g.$inject=["$interpolate","$breadcrumb","$rootScope"],h.$inject=["$interpolate","$breadcrumb","$rootScope"],b.module("ncy-angular-breadcrumb",["ui.router.state"]).provider("$breadcrumb",f).directive("ncyBreadcrumb",g).directive("ncyBreadcrumbLast",h)}(window,window.angular); \ No newline at end of file diff --git a/bower_components/angular-breadcrumb/release/angular-breadcrumb.js b/bower_components/angular-breadcrumb/release/angular-breadcrumb.js new file mode 100644 index 0000000..ce93f7a --- /dev/null +++ b/bower_components/angular-breadcrumb/release/angular-breadcrumb.js @@ -0,0 +1,284 @@ +/*! angular-breadcrumb - v0.3.3 +* http://ncuillery.github.io/angular-breadcrumb +* Copyright (c) 2014 Nicolas Cuillery; Licensed MIT */ + +(function (window, angular, undefined) { +'use strict'; + +function isAOlderThanB(scopeA, scopeB) { + if(angular.equals(scopeA.length, scopeB.length)) { + return scopeA > scopeB; + } else { + return scopeA.length > scopeB.length; + } +} + +function parseStateRef(ref) { + var parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/); + if (!parsed || parsed.length !== 4) { throw new Error("Invalid state ref '" + ref + "'"); } + return { state: parsed[1], paramExpr: parsed[3] || null }; +} + +function $Breadcrumb() { + + var $$options = { + prefixStateName: null, + template: 'bootstrap3', + templateUrl: null, + includeAbstract : false + }; + + this.setOptions = function(options) { + angular.extend($$options, options); + }; + + this.$get = ['$state', '$stateParams', '$rootScope', function($state, $stateParams, $rootScope) { + + var $lastViewScope = $rootScope; + + // Early catch of $viewContentLoaded event + $rootScope.$on('$viewContentLoaded', function (event) { + // With nested views, the event occur several times, in "wrong" order + if(isAOlderThanB(event.targetScope.$id, $lastViewScope.$id)) { + $lastViewScope = event.targetScope; + } + }); + + // Get the parent state + var $$parentState = function(state) { + // Check if state has explicit parent OR we try guess parent from its name + var name = state.parent || (/^(.+)\.[^.]+$/.exec(state.name) || [])[1]; + // If we were able to figure out parent name then get this state + return name; + }; + + // Add the state in the chain if not already in and if not abstract + var $$addStateInChain = function(chain, stateRef) { + var conf, + parentParams, + ref = parseStateRef(stateRef); + + for(var i=0, l=chain.length; i' + + '
      • ' + + '{{step.ncyBreadcrumbLabel}} ' + + '{{step.ncyBreadcrumbLabel}}' + + '/' + + '
      • ' + + '', + bootstrap3: '
          ' + + '
        1. ' + + '{{step.ncyBreadcrumbLabel}} ' + + '{{step.ncyBreadcrumbLabel}}' + + '
        2. ' + + '
        ' + }; + + return { + restrict: 'AE', + replace: true, + scope: {}, + template: $breadcrumb.getTemplate($$templates), + templateUrl: $breadcrumb.getTemplateUrl(), + link: { + post: function postLink(scope) { + var labelWatchers = []; + + var renderBreadcrumb = function() { + deregisterWatchers(labelWatchers); + var viewScope = $breadcrumb.$getLastViewScope(); + scope.steps = $breadcrumb.getStatesChain(); + angular.forEach(scope.steps, function (step) { + if (step.ncyBreadcrumb && step.ncyBreadcrumb.label) { + var parseLabel = $interpolate(step.ncyBreadcrumb.label); + step.ncyBreadcrumbLabel = parseLabel(viewScope); + // Watcher for further viewScope updates + registerWatchers(labelWatchers, parseLabel, viewScope, step); + } else { + step.ncyBreadcrumbLabel = step.name; + } + }); + }; + + $rootScope.$on('$viewContentLoaded', function () { + renderBreadcrumb(); + }); + + // View(s) may be already loaded while the directive's linking + renderBreadcrumb(); + } + } + }; +} +BreadcrumbDirective.$inject = ['$interpolate', '$breadcrumb', '$rootScope']; + +function BreadcrumbLastDirective($interpolate, $breadcrumb, $rootScope) { + + return { + restrict: 'A', + scope: {}, + template: '{{ncyBreadcrumbLabel}}', + compile: function(cElement, cAttrs) { + + // Override the default template if ncyBreadcrumbLast has a value + var template = cElement.attr(cAttrs.$attr.ncyBreadcrumbLast); + if(template) { + cElement.html(template); + } + + return { + post: function postLink(scope) { + var labelWatchers = []; + + var renderLabel = function() { + deregisterWatchers(labelWatchers); + var viewScope = $breadcrumb.$getLastViewScope(); + var lastStep = $breadcrumb.getLastStep(); + if(lastStep) { + scope.ncyBreadcrumbLink = lastStep.ncyBreadcrumbLink; + if (lastStep.ncyBreadcrumb && lastStep.ncyBreadcrumb.label) { + var parseLabel = $interpolate(lastStep.ncyBreadcrumb.label); + scope.ncyBreadcrumbLabel = parseLabel(viewScope); + // Watcher for further viewScope updates + // Tricky last arg: the last step is the entire scope of the directive ! + registerWatchers(labelWatchers, parseLabel, viewScope, scope); + } else { + scope.ncyBreadcrumbLabel = lastStep.name; + } + } + }; + + $rootScope.$on('$viewContentLoaded', function () { + renderLabel(); + }); + + // View(s) may be already loaded while the directive's linking + renderLabel(); + } + }; + + } + }; +} +BreadcrumbLastDirective.$inject = ['$interpolate', '$breadcrumb', '$rootScope']; + +angular.module('ncy-angular-breadcrumb', ['ui.router.state']) + .provider('$breadcrumb', $Breadcrumb) + .directive('ncyBreadcrumb', BreadcrumbDirective) + .directive('ncyBreadcrumbLast', BreadcrumbLastDirective); +})(window, window.angular); diff --git a/bower_components/angular-breadcrumb/release/angular-breadcrumb.min.js b/bower_components/angular-breadcrumb/release/angular-breadcrumb.min.js new file mode 100644 index 0000000..7c65c08 --- /dev/null +++ b/bower_components/angular-breadcrumb/release/angular-breadcrumb.min.js @@ -0,0 +1,4 @@ +/*! angular-breadcrumb - v0.3.3 +* http://ncuillery.github.io/angular-breadcrumb +* Copyright (c) 2014 Nicolas Cuillery; Licensed MIT */ +!function(a,b,c){"use strict";function d(a,c){return b.equals(a.length,c.length)?a>c:a.length>c.length}function e(a){var b=a.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/);if(!b||4!==b.length)throw new Error("Invalid state ref '"+a+"'");return{state:b[1],paramExpr:b[3]||null}}function f(){var a={prefixStateName:null,template:"bootstrap3",templateUrl:null,includeAbstract:!1};this.setOptions=function(c){b.extend(a,c)},this.$get=["$state","$stateParams","$rootScope",function(b,f,g){var h=g;g.$on("$viewContentLoaded",function(a){d(a.targetScope.$id,h.$id)&&(h=a.targetScope)});var i=function(a){var b=a.parent||(/^(.+)\.[^.]+$/.exec(a.name)||[])[1];return b},j=function(c,d){for(var g,i,j=e(d),k=0,l=c.length;l>k;k+=1)if(c[k].name===j.state)return;g=b.get(j.state),g.abstract&&!a.includeAbstract||g.ncyBreadcrumb&&g.ncyBreadcrumb.skip||(j.paramExpr&&(i=h.$eval(j.paramExpr)),g.ncyBreadcrumbLink=b.href(j.state,i||f||{}),c.unshift(g))},k=function(a){var c=e(a),d=b.get(c.state);if(d.ncyBreadcrumb&&d.ncyBreadcrumb.parent){var f="function"==typeof d.ncyBreadcrumb.parent,g=f?d.ncyBreadcrumb.parent(h):d.ncyBreadcrumb.parent;if(g)return g}return i(d)};return{getTemplate:function(b){return a.templateUrl?null:b[a.template]?b[a.template]:a.template},getTemplateUrl:function(){return a.templateUrl},getStatesChain:function(c){for(var d=[],e=b.$current.self.name;e;e=k(e))if(j(d,e),c&&d.length)return d;return a.prefixStateName&&j(d,a.prefixStateName),d},getLastStep:function(){var a=this.getStatesChain(!0);return a.length?a[0]:c},$getLastViewScope:function(){return h}}}]}function g(a,c,d){var e={bootstrap2:'
        • {{step.ncyBreadcrumbLabel}} {{step.ncyBreadcrumbLabel}}/
        ',bootstrap3:'
        1. {{step.ncyBreadcrumbLabel}} {{step.ncyBreadcrumbLabel}}
        '};return{restrict:"AE",replace:!0,scope:{},template:c.getTemplate(e),templateUrl:c.getTemplateUrl(),link:{post:function(e){var f=[],g=function(){k(f);var d=c.$getLastViewScope();e.steps=c.getStatesChain(),b.forEach(e.steps,function(b){if(b.ncyBreadcrumb&&b.ncyBreadcrumb.label){var c=a(b.ncyBreadcrumb.label);b.ncyBreadcrumbLabel=c(d),j(f,c,d,b)}else b.ncyBreadcrumbLabel=b.name})};d.$on("$viewContentLoaded",function(){g()}),g()}}}}function h(a,b,c){return{restrict:"A",scope:{},template:"{{ncyBreadcrumbLabel}}",compile:function(d,e){var f=d.attr(e.$attr.ncyBreadcrumbLast);return f&&d.html(f),{post:function(d){var e=[],f=function(){k(e);var c=b.$getLastViewScope(),f=b.getLastStep();if(f)if(d.ncyBreadcrumbLink=f.ncyBreadcrumbLink,f.ncyBreadcrumb&&f.ncyBreadcrumb.label){var g=a(f.ncyBreadcrumb.label);d.ncyBreadcrumbLabel=g(c),j(e,g,c,d)}else d.ncyBreadcrumbLabel=f.name};c.$on("$viewContentLoaded",function(){f()}),f()}}}}}var i=function(a){if(a.expressions)return a.expressions;var c=[];return b.forEach(a.parts,function(a){b.isFunction(a)&&c.push(a.exp)}),c},j=function(a,c,d,e){b.forEach(i(c),function(b){var f=d.$watch(b,function(){e.ncyBreadcrumbLabel=c(d)});a.push(f)})},k=function(a){b.forEach(a,function(a){a()}),a=[]};g.$inject=["$interpolate","$breadcrumb","$rootScope"],h.$inject=["$interpolate","$breadcrumb","$rootScope"],b.module("ncy-angular-breadcrumb",["ui.router.state"]).provider("$breadcrumb",f).directive("ncyBreadcrumb",g).directive("ncyBreadcrumbLast",h)}(window,window.angular); \ No newline at end of file diff --git a/bower_components/angular-ckeditor/.bower.json b/bower_components/angular-ckeditor/.bower.json new file mode 100644 index 0000000..d403653 --- /dev/null +++ b/bower_components/angular-ckeditor/.bower.json @@ -0,0 +1,39 @@ +{ + "name": "angular-ckeditor", + "main": "angular-ckeditor.js", + "version": "0.3.2", + "homepage": "https://github.com/lemonde/angular-ckeditor", + "authors": [ + "Team Le8 " + ], + "description": "CKEditor directive for Angular.", + "keywords": [ + "angular", + "directive", + "ckeditor" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "package.json", + "karma.conf.js", + "node_modules", + "bower_components", + "Gruntfile.js", + "test" + ], + "devDependencies": { + "angular-mocks": "~1.3.8", + "ckeditor": "#full/4.4.2", + "jquery": "~2.1.3" + }, + "_release": "0.3.2", + "_resolution": { + "type": "version", + "tag": "v0.3.2", + "commit": "47ebfe4a4b1aa9e7fe39cea71e4c103f692d0f9f" + }, + "_source": "git://github.com/lemonde/angular-ckeditor.git", + "_target": "~0.3.2", + "_originalSource": "angular-ckeditor" +} \ No newline at end of file diff --git a/bower_components/angular-ckeditor/CHANGELOG.md b/bower_components/angular-ckeditor/CHANGELOG.md new file mode 100644 index 0000000..bcf612b --- /dev/null +++ b/bower_components/angular-ckeditor/CHANGELOG.md @@ -0,0 +1,22 @@ + +v0.3.2 +- dependencies update + +v0.3.1 +- updated minified version + +v0.3.0 +- stricter dependencies +- added jshint and editorconfig +- model value is defaulted to '' in both ways to avoid loops in some rare cases +- added tests +- more doc in README +- Warning : I forgot to update minified version for tag 0.3.0 :-( + +v0.2.0 +- enable inline editing only if contenteditable is true + +v0.1.1 +- refactor directive using a controller + +Initial release diff --git a/bower_components/angular-ckeditor/README.md b/bower_components/angular-ckeditor/README.md new file mode 100644 index 0000000..6ced0a1 --- /dev/null +++ b/bower_components/angular-ckeditor/README.md @@ -0,0 +1,81 @@ +# angular-ckeditor + +[![Build Status](https://travis-ci.org/lemonde/angular-ckeditor.svg?branch=master)](https://travis-ci.org/lemonde/angular-ckeditor) +[![Dependency Status](https://david-dm.org/lemonde/angular-ckeditor.svg?theme=shields.io)](https://david-dm.org/lemonde/angular-ckeditor) +[![devDependency Status](https://david-dm.org/lemonde/angular-ckeditor/dev-status.svg?theme=shields.io)](https://david-dm.org/lemonde/angular-ckeditor#info=devDependencies) + +CKEditor directive for Angular. + +## Install + +### Using bower + +```sh +bower install angular-ckeditor +``` + +Note : obviously this plugin expects the presence of AngularJS and CKEditor. + + +## Usage + +HTML: + +```html + + + + +
        +
        +
        +``` + +JavaScript: + +```js +angular.module('controllers.ckeditor', ['ckeditor']) +.controller('CkeditorCtrl', function ($scope) { + + // Editor options. + $scope.options = { + language: 'en', + allowedContent: true, + entities: false + }; + + // Called when the editor is completely ready. + $scope.onReady = function () { + // ... + }; +}); +``` + +### "ckeditor" directive + +- "ckeditor" Specify editor options. Accepts an Object. +- "ng-model" Binded scope variable. +- "ready" Called when the editor is completely ready. Accepts an Angular expression. +- Inline editing mode is enabled if element has a `contenteditable` attribute set to true. + +**IMPORTANT NOTICE** +Angular-ckeditor uses `ng-model`. If you add an `ng-if` on the element to whom this directive is attached, changes in the editor won't be forwarded to your code anymore, due to the extra scope created by `ng-if`. A solution is to explicitely bypass the extra scope : `ng-model="$parent.model"`. See http://stackoverflow.com/questions/18342917/angularjs-ng-model-doesnt-work-inside-ng-if + + +## See also +You may find this other directive useful : https://github.com/lemonde/angular-ckeditor-placeholder + +## License + +MIT + +## Contributing +* clone repo +* ensure your editor is decent and pick up the `.editorconfig` and `.jshintrc` files +* `npm install` +* `npm test` +* add tests, add features +* `grunt` (to generate minified version) +* send a PR + +Thanks ! diff --git a/bower_components/angular-ckeditor/angular-ckeditor.js b/bower_components/angular-ckeditor/angular-ckeditor.js new file mode 100644 index 0000000..f5413a2 --- /dev/null +++ b/bower_components/angular-ckeditor/angular-ckeditor.js @@ -0,0 +1,140 @@ +(function (root, factory) { + // AMD + if (typeof define === 'function' && define.amd) define(['angular'], factory); + // Global + else factory(angular); +}(this, function (angular) { + + angular + .module('ckeditor', []) + .directive('ckeditor', ['$parse', ckeditorDirective]); + + // Create setImmediate function. + var setImmediate = window && window.setImmediate ? window.setImmediate : function (fn) { + setTimeout(fn, 0); + }; + + /** + * CKEditor directive. + * + * @example + *
        + */ + + function ckeditorDirective($parse) { + return { + restrict: 'A', + require: ['ckeditor', 'ngModel'], + controller: [ + '$scope', + '$element', + '$attrs', + '$parse', + '$q', + ckeditorController + ], + link: function (scope, element, attrs, ctrls) { + var ckeditor = ctrls[0]; + var ngModel = ctrls[1]; + + // Initialize the editor when it is ready. + ckeditor.ready().then(function initialize() { + // Sync view on specific events. + ['dataReady', 'change', 'saveSnapshot'].forEach(function (event) { + ckeditor.$on(event, function syncView() { + ngModel.$setViewValue(ckeditor.instance.getData() || ''); + }); + }); + + // Put editor out of readonly. + ckeditor.instance.setReadOnly(false); + + // Defer the ready handler calling to ensure that the editor is + // completely ready and populated with data. + setImmediate(function () { + $parse(attrs.ready)(scope); + }); + }); + + // Set editor data when view data change. + ngModel.$render = function syncEditor() { + ckeditor.ready().then(function () { + ckeditor.instance.setData(ngModel.$viewValue || ''); + }); + }; + } + }; + } + + /** + * CKEditor controller. + */ + + function ckeditorController($scope, $element, $attrs, $parse, $q) { + // Create editor instance. + var config = $parse($attrs.ckeditor)($scope) || {}; + var editorElement = $element[0]; + var instance; + if (editorElement.hasAttribute('contenteditable') && + editorElement.getAttribute('contenteditable').toLowerCase() == 'true') { + instance = this.instance = CKEDITOR.inline(editorElement, config); + } + else { + instance = this.instance = CKEDITOR.replace(editorElement, config); + } + + /** + * Listen on events of a given type. + * This make all event asynchrone and wrapped in $scope.$apply. + * + * @param {String} event + * @param {Function} listener + * @returns {Function} Deregistration function for this listener. + */ + + this.$on = function $on(event, listener) { + // Wrap primus event with $rootScope.$apply. + instance.on(event, asyncListener); + + function asyncListener() { + var args = arguments; + setImmediate(function () { + applyListener.apply(null, args); + }); + } + + function applyListener() { + var args = arguments; + $scope.$apply(function () { + listener.apply(null, args); + }); + } + + // Return the deregistration function + return function $off() { + instance.removeListener(event, applyListener); + }; + }; + + /** + * Check if the editor if ready. + * + * @returns {Promise} + */ + + this.ready = function ready() { + if (this.readyDefer) return this.readyDefer.promise; + + var readyDefer = this.readyDefer = $q.defer(); + if (this.instance.status === 'ready') readyDefer.resolve(); + else this.$on('instanceReady', readyDefer.resolve); + + return readyDefer.promise; + }; + + // Destroy editor when the scope is destroyed. + $scope.$on('$destroy', function onDestroy() { + instance.destroy(false); + }); + } +})); diff --git a/bower_components/angular-ckeditor/angular-ckeditor.min.js b/bower_components/angular-ckeditor/angular-ckeditor.min.js new file mode 100644 index 0000000..116612f --- /dev/null +++ b/bower_components/angular-ckeditor/angular-ckeditor.min.js @@ -0,0 +1,2 @@ +!function(a,b){"function"==typeof define&&define.amd?define(["angular"],b):b(angular)}(this,function(a){function b(a){return{restrict:"A",require:["ckeditor","ngModel"],controller:["$scope","$element","$attrs","$parse","$q",c],link:function(b,c,e,f){var g=f[0],h=f[1];g.ready().then(function(){["dataReady","change","saveSnapshot"].forEach(function(a){g.$on(a,function(){h.$setViewValue(g.instance.getData()||"")})}),g.instance.setReadOnly(!1),d(function(){a(e.ready)(b)})}),h.$render=function(){g.ready().then(function(){g.instance.setData(h.$viewValue||"")})}}}}function c(a,b,c,e,f){var g,h=e(c.ckeditor)(a)||{},i=b[0];g=this.instance=i.hasAttribute("contenteditable")&&"true"==i.getAttribute("contenteditable").toLowerCase()?CKEDITOR.inline(i,h):CKEDITOR.replace(i,h),this.$on=function(b,c){function e(){var a=arguments;d(function(){f.apply(null,a)})}function f(){var b=arguments;a.$apply(function(){c.apply(null,b)})}return g.on(b,e),function(){g.removeListener(b,f)}},this.ready=function(){if(this.readyDefer)return this.readyDefer.promise;var a=this.readyDefer=f.defer();return"ready"===this.instance.status?a.resolve():this.$on("instanceReady",a.resolve),a.promise},a.$on("$destroy",function(){g.destroy(!1)})}a.module("ckeditor",[]).directive("ckeditor",["$parse",b]);var d=window&&window.setImmediate?window.setImmediate:function(a){setTimeout(a,0)}}); +//# sourceMappingURL=angular-ckeditor.min.map \ No newline at end of file diff --git a/bower_components/angular-ckeditor/angular-ckeditor.min.map b/bower_components/angular-ckeditor/angular-ckeditor.min.map new file mode 100644 index 0000000..1cf3a1d --- /dev/null +++ b/bower_components/angular-ckeditor/angular-ckeditor.min.map @@ -0,0 +1 @@ +{"version":3,"file":"angular-ckeditor.min.js","sources":["angular-ckeditor.js"],"names":["root","factory","define","amd","angular","this","ckeditorDirective","$parse","restrict","require","controller","ckeditorController","link","scope","element","attrs","ctrls","ckeditor","ngModel","ready","then","forEach","event","$on","$setViewValue","instance","getData","setReadOnly","setImmediate","$render","setData","$viewValue","$scope","$element","$attrs","$q","config","editorElement","hasAttribute","getAttribute","toLowerCase","CKEDITOR","inline","replace","listener","asyncListener","args","arguments","applyListener","apply","$apply","on","removeListener","readyDefer","promise","defer","status","resolve","destroy","module","directive","window","fn","setTimeout"],"mappings":"CAAC,SAAUA,EAAMC,GAEO,kBAAXC,SAAyBA,OAAOC,IAAKD,QAAQ,WAAYD,GAE/DA,EAAQG,UACbC,KAAM,SAAUD,GAkBhB,QAASE,GAAkBC,GACzB,OACEC,SAAU,IACVC,SAAU,WAAY,WACtBC,YACE,SACA,WACA,SACA,SACA,KACAC,GAEFC,KAAM,SAAUC,EAAOC,EAASC,EAAOC,GACrC,GAAIC,GAAWD,EAAM,GACjBE,EAAUF,EAAM,EAGpBC,GAASE,QAAQC,KAAK,YAEnB,YAAa,SAAU,gBAAgBC,QAAQ,SAAUC,GACxDL,EAASM,IAAID,EAAO,WAClBJ,EAAQM,cAAcP,EAASQ,SAASC,WAAa,QAKzDT,EAASQ,SAASE,aAAY,GAI9BC,EAAa,WACXrB,EAAOQ,EAAMI,OAAON,OAKxBK,EAAQW,QAAU,WAChBZ,EAASE,QAAQC,KAAK,WACpBH,EAASQ,SAASK,QAAQZ,EAAQa,YAAc,SAW1D,QAASpB,GAAmBqB,EAAQC,EAAUC,EAAQ3B,EAAQ4B,GAE5D,GAEIV,GAFAW,EAAS7B,EAAO2B,EAAOjB,UAAUe,OACjCK,EAAgBJ,EAAS,EAI3BR,GAAWpB,KAAKoB,SAFdY,EAAcC,aAAa,oBACoC,QAA/DD,EAAcE,aAAa,mBAAmBC,cACrBC,SAASC,OAAOL,EAAeD,GAG/BK,SAASE,QAAQN,EAAeD,GAY7D/B,KAAKkB,IAAM,SAAaD,EAAOsB,GAI7B,QAASC,KACP,GAAIC,GAAOC,SACXnB,GAAa,WACXoB,EAAcC,MAAM,KAAMH,KAI9B,QAASE,KACP,GAAIF,GAAOC,SACXf,GAAOkB,OAAO,WACZN,EAASK,MAAM,KAAMH,KAKzB,MAjBArB,GAAS0B,GAAG7B,EAAOuB,GAiBZ,WACLpB,EAAS2B,eAAe9B,EAAO0B,KAUnC3C,KAAKc,MAAQ,WACX,GAAId,KAAKgD,WAAY,MAAOhD,MAAKgD,WAAWC,OAE5C,IAAID,GAAahD,KAAKgD,WAAalB,EAAGoB,OAItC,OAH6B,UAAzBlD,KAAKoB,SAAS+B,OAAoBH,EAAWI,UAC5CpD,KAAKkB,IAAI,gBAAiB8B,EAAWI,SAEnCJ,EAAWC,SAIpBtB,EAAOT,IAAI,WAAY,WACrBE,EAASiC,SAAQ,KAjIrBtD,EACCuD,OAAO,eACPC,UAAU,YAAa,SAAUtD,GAGlC,IAAIsB,GAAeiC,QAAUA,OAAOjC,aAAeiC,OAAOjC,aAAe,SAAUkC,GACjFC,WAAWD,EAAI"} \ No newline at end of file diff --git a/bower_components/angular-ckeditor/bower.json b/bower_components/angular-ckeditor/bower.json new file mode 100644 index 0000000..451a5a0 --- /dev/null +++ b/bower_components/angular-ckeditor/bower.json @@ -0,0 +1,30 @@ +{ + "name": "angular-ckeditor", + "main": "angular-ckeditor.js", + "version": "0.3.2", + "homepage": "https://github.com/lemonde/angular-ckeditor", + "authors": [ + "Team Le8 " + ], + "description": "CKEditor directive for Angular.", + "keywords": [ + "angular", + "directive", + "ckeditor" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "package.json", + "karma.conf.js", + "node_modules", + "bower_components", + "Gruntfile.js", + "test" + ], + "devDependencies": { + "angular-mocks": "~1.3.8", + "ckeditor": "#full/4.4.2", + "jquery": "~2.1.3" + } +} diff --git a/bower_components/angular-cookie/.bower.json b/bower_components/angular-cookie/.bower.json new file mode 100644 index 0000000..a9e91be --- /dev/null +++ b/bower_components/angular-cookie/.bower.json @@ -0,0 +1,41 @@ +{ + "name": "angular-cookie", + "main": "angular-cookie.js", + "version": "4.1.0", + "homepage": "https://github.com/ivpusic/angular-cookie", + "authors": [ + "ivpusic " + ], + "description": "angular module for accessing browser cookies", + "keywords": [ + "cookie", + "angular" + ], + "license": "MIT", + "location": "git@github.com:ivpusic/angular-cookie.git", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests", + "example", + "karma.conf.js", + "LICENSE", + "README.md", + "Gruntfile.js" + ], + "dependencies": { + "angular": "*" + }, + "_release": "4.1.0", + "_resolution": { + "type": "version", + "tag": "v4.1.0", + "commit": "514a9df3ead0d60149c62231169adfc903e34489" + }, + "_source": "https://github.com/ivpusic/angular-cookie.git", + "_target": "^4.1.0", + "_originalSource": "angular-cookie", + "_direct": true +} \ No newline at end of file diff --git a/bower_components/angular-cookie/angular-cookie.js b/bower_components/angular-cookie/angular-cookie.js new file mode 100644 index 0000000..34a706f --- /dev/null +++ b/bower_components/angular-cookie/angular-cookie.js @@ -0,0 +1,125 @@ +/* + * Copyright 2013 Ivan Pusic + * Contributors: + * Matjaz Lipus + */ +angular.module('ivpusic.cookie', ['ipCookie']); +angular.module('ipCookie', ['ng']). +factory('ipCookie', ['$document', + function ($document) { + 'use strict'; + + function tryDecodeURIComponent(value) { + try { + return decodeURIComponent(value); + } catch(e) { + // Ignore any invalid uri component + } + } + + return (function () { + function cookieFun(key, value, options) { + + var cookies, + list, + i, + cookie, + pos, + name, + hasCookies, + all, + expiresFor; + + options = options || {}; + var dec = options.decode || tryDecodeURIComponent; + var enc = options.encode || encodeURIComponent; + + if (value !== undefined) { + // we are setting value + value = typeof value === 'object' ? JSON.stringify(value) : String(value); + + if (typeof options.expires === 'number') { + expiresFor = options.expires; + options.expires = new Date(); + // Trying to delete a cookie; set a date far in the past + if (expiresFor === -1) { + options.expires = new Date('Thu, 01 Jan 1970 00:00:00 GMT'); + // A new + } else if (options.expirationUnit !== undefined) { + if (options.expirationUnit === 'hours') { + options.expires.setHours(options.expires.getHours() + expiresFor); + } else if (options.expirationUnit === 'minutes') { + options.expires.setMinutes(options.expires.getMinutes() + expiresFor); + } else if (options.expirationUnit === 'seconds') { + options.expires.setSeconds(options.expires.getSeconds() + expiresFor); + } else if (options.expirationUnit === 'milliseconds') { + options.expires.setMilliseconds(options.expires.getMilliseconds() + expiresFor); + } else { + options.expires.setDate(options.expires.getDate() + expiresFor); + } + } else { + options.expires.setDate(options.expires.getDate() + expiresFor); + } + } + return ($document[0].cookie = [ + enc(key), + '=', + enc(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + list = []; + all = $document[0].cookie; + if (all) { + list = all.split('; '); + } + + cookies = {}; + hasCookies = false; + + for (i = 0; i < list.length; ++i) { + if (list[i]) { + cookie = list[i]; + pos = cookie.indexOf('='); + name = cookie.substring(0, pos); + value = dec(cookie.substring(pos + 1)); + if(angular.isUndefined(value)) + continue; + + if (key === undefined || key === name) { + try { + cookies[name] = JSON.parse(value); + } catch (e) { + cookies[name] = value; + } + if (key === name) { + return cookies[name]; + } + hasCookies = true; + } + } + } + if (hasCookies && key === undefined) { + return cookies; + } + } + cookieFun.remove = function (key, options) { + var hasCookie = cookieFun(key) !== undefined; + + if (hasCookie) { + if (!options) { + options = {}; + } + options.expires = -1; + cookieFun(key, '', options); + } + return hasCookie; + }; + return cookieFun; + }()); + } +]); diff --git a/bower_components/angular-cookie/angular-cookie.min.js b/bower_components/angular-cookie/angular-cookie.min.js new file mode 100644 index 0000000..f105260 --- /dev/null +++ b/bower_components/angular-cookie/angular-cookie.min.js @@ -0,0 +1 @@ +angular.module("ivpusic.cookie",["ipCookie"]),angular.module("ipCookie",["ng"]).factory("ipCookie",["$document",function(e){"use strict";function i(e){try{return decodeURIComponent(e)}catch(i){}}return function(){function t(t,n,r){var o,s,p,u,a,c,d,x,f;r=r||{};var g=r.decode||i,l=r.encode||encodeURIComponent;if(void 0!==n)return n="object"==typeof n?JSON.stringify(n):n+"","number"==typeof r.expires&&(f=r.expires,r.expires=new Date,-1===f?r.expires=new Date("Thu, 01 Jan 1970 00:00:00 GMT"):void 0!==r.expirationUnit?"hours"===r.expirationUnit?r.expires.setHours(r.expires.getHours()+f):"minutes"===r.expirationUnit?r.expires.setMinutes(r.expires.getMinutes()+f):"seconds"===r.expirationUnit?r.expires.setSeconds(r.expires.getSeconds()+f):"milliseconds"===r.expirationUnit?r.expires.setMilliseconds(r.expires.getMilliseconds()+f):r.expires.setDate(r.expires.getDate()+f):r.expires.setDate(r.expires.getDate()+f)),e[0].cookie=[l(t),"=",l(n),r.expires?"; expires="+r.expires.toUTCString():"",r.path?"; path="+r.path:"",r.domain?"; domain="+r.domain:"",r.secure?"; secure":""].join("");for(s=[],x=e[0].cookie,x&&(s=x.split("; ")),o={},d=!1,p=0;s.length>p;++p)if(s[p]){if(u=s[p],a=u.indexOf("="),c=u.substring(0,a),n=g(u.substring(a+1)),angular.isUndefined(n))continue;if(void 0===t||t===c){try{o[c]=JSON.parse(n)}catch(m){o[c]=n}if(t===c)return o[c];d=!0}}return d&&void 0===t?o:void 0}return t.remove=function(e,i){var n=void 0!==t(e);return n&&(i||(i={}),i.expires=-1,t(e,"",i)),n},t}()}]); \ No newline at end of file diff --git a/bower_components/angular-cookie/bower.json b/bower_components/angular-cookie/bower.json new file mode 100644 index 0000000..98fc548 --- /dev/null +++ b/bower_components/angular-cookie/bower.json @@ -0,0 +1,31 @@ +{ + "name": "angular-cookie", + "main": "angular-cookie.js", + "version": "4.1.0", + "homepage": "https://github.com/ivpusic/angular-cookie", + "authors": [ + "ivpusic " + ], + "description": "angular module for accessing browser cookies", + "keywords": [ + "cookie", + "angular" + ], + "license": "MIT", + "location": "git@github.com:ivpusic/angular-cookie.git", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests", + "example", + "karma.conf.js", + "LICENSE", + "README.md", + "Gruntfile.js" + ], + "dependencies": { + "angular": "*" + } +} diff --git a/bower_components/angular-cookie/index.js b/bower_components/angular-cookie/index.js new file mode 100644 index 0000000..a2a34c9 --- /dev/null +++ b/bower_components/angular-cookie/index.js @@ -0,0 +1,2 @@ +require('./angular-cookie'); +module.exports = 'ipCookie'; diff --git a/bower_components/angular-cookie/package.json b/bower_components/angular-cookie/package.json new file mode 100644 index 0000000..553193d --- /dev/null +++ b/bower_components/angular-cookie/package.json @@ -0,0 +1,38 @@ +{ + "name": "angular-cookie", + "version": "4.1.0", + "description": "Lightweight Angular module for access to cookies", + "main": "index.js", + "directories": { + "example": "example", + "test": "test" + }, + "devDependencies": { + "grunt-contrib-connect": "^0.5.0", + "grunt": "^0.4.5", + "bower": "^1.3.12", + "grunt-minified": "^0.0.6", + "lodash": "^3.10.0", + "install": "^0.1.7", + "npm": "^1.3.26", + "require": "^0.5.0", + "mocha": "^1.20.1" + }, + "scripts": { + "test": "mocha" + }, + "repository": { + "type": "git", + "url": "https://github.com/ivpusic/angular-cookie.git" + }, + "keywords": [ + "angular", + "cookie" + ], + "author": "Ivan Pusic", + "license": "MIT", + "bugs": { + "url": "https://github.com/ivpusic/angular-cookie/issues" + }, + "homepage": "https://github.com/ivpusic/angular-cookie" +} diff --git a/bower_components/angular-cookies/.bower.json b/bower_components/angular-cookies/.bower.json new file mode 100644 index 0000000..4998231 --- /dev/null +++ b/bower_components/angular-cookies/.bower.json @@ -0,0 +1,19 @@ +{ + "name": "angular-cookies", + "version": "1.3.15", + "main": "./angular-cookies.js", + "ignore": [], + "dependencies": { + "angular": "1.3.15" + }, + "homepage": "https://github.com/angular/bower-angular-cookies", + "_release": "1.3.15", + "_resolution": { + "type": "version", + "tag": "v1.3.15", + "commit": "846700fd8e45eefa1a43cf1865bcb7aaf95a68e0" + }, + "_source": "git://github.com/angular/bower-angular-cookies.git", + "_target": "~1.3.15", + "_originalSource": "angular-cookies" +} \ No newline at end of file diff --git a/bower_components/angular-cookies/README.md b/bower_components/angular-cookies/README.md new file mode 100644 index 0000000..7b190d3 --- /dev/null +++ b/bower_components/angular-cookies/README.md @@ -0,0 +1,68 @@ +# packaged angular-cookies + +This repo is for distribution on `npm` and `bower`. The source for this module is in the +[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngCookies). +Please file issues and pull requests against that repo. + +## Install + +You can install this package either with `npm` or with `bower`. + +### npm + +```shell +npm install angular-cookies +``` + +Then add `ngCookies` as a dependency for your app: + +```javascript +angular.module('myApp', [require('angular-cookies')]); +``` + +### bower + +```shell +bower install angular-cookies +``` + +Add a ` +``` + +Then add `ngCookies` as a dependency for your app: + +```javascript +angular.module('myApp', ['ngCookies']); +``` + +## Documentation + +Documentation is available on the +[AngularJS docs site](http://docs.angularjs.org/api/ngCookies). + +## License + +The MIT License + +Copyright (c) 2010-2015 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/bower_components/angular-cookies/angular-cookies.js b/bower_components/angular-cookies/angular-cookies.js new file mode 100644 index 0000000..03b352b --- /dev/null +++ b/bower_components/angular-cookies/angular-cookies.js @@ -0,0 +1,206 @@ +/** + * @license AngularJS v1.3.15 + * (c) 2010-2014 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) {'use strict'; + +/** + * @ngdoc module + * @name ngCookies + * @description + * + * # ngCookies + * + * The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies. + * + * + *
        + * + * See {@link ngCookies.$cookies `$cookies`} and + * {@link ngCookies.$cookieStore `$cookieStore`} for usage. + */ + + +angular.module('ngCookies', ['ng']). + /** + * @ngdoc service + * @name $cookies + * + * @description + * Provides read/write access to browser's cookies. + * + * Only a simple Object is exposed and by adding or removing properties to/from this object, new + * cookies are created/deleted at the end of current $eval. + * The object's properties can only be strings. + * + * Requires the {@link ngCookies `ngCookies`} module to be installed. + * + * @example + * + * ```js + * angular.module('cookiesExample', ['ngCookies']) + * .controller('ExampleController', ['$cookies', function($cookies) { + * // Retrieving a cookie + * var favoriteCookie = $cookies.myFavorite; + * // Setting a cookie + * $cookies.myFavorite = 'oatmeal'; + * }]); + * ``` + */ + factory('$cookies', ['$rootScope', '$browser', function($rootScope, $browser) { + var cookies = {}, + lastCookies = {}, + lastBrowserCookies, + runEval = false, + copy = angular.copy, + isUndefined = angular.isUndefined; + + //creates a poller fn that copies all cookies from the $browser to service & inits the service + $browser.addPollFn(function() { + var currentCookies = $browser.cookies(); + if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl + lastBrowserCookies = currentCookies; + copy(currentCookies, lastCookies); + copy(currentCookies, cookies); + if (runEval) $rootScope.$apply(); + } + })(); + + runEval = true; + + //at the end of each eval, push cookies + //TODO: this should happen before the "delayed" watches fire, because if some cookies are not + // strings or browser refuses to store some cookies, we update the model in the push fn. + $rootScope.$watch(push); + + return cookies; + + + /** + * Pushes all the cookies from the service to the browser and verifies if all cookies were + * stored. + */ + function push() { + var name, + value, + browserCookies, + updated; + + //delete any cookies deleted in $cookies + for (name in lastCookies) { + if (isUndefined(cookies[name])) { + $browser.cookies(name, undefined); + } + } + + //update all cookies updated in $cookies + for (name in cookies) { + value = cookies[name]; + if (!angular.isString(value)) { + value = '' + value; + cookies[name] = value; + } + if (value !== lastCookies[name]) { + $browser.cookies(name, value); + updated = true; + } + } + + //verify what was actually stored + if (updated) { + updated = false; + browserCookies = $browser.cookies(); + + for (name in cookies) { + if (cookies[name] !== browserCookies[name]) { + //delete or reset all cookies that the browser dropped from $cookies + if (isUndefined(browserCookies[name])) { + delete cookies[name]; + } else { + cookies[name] = browserCookies[name]; + } + updated = true; + } + } + } + } + }]). + + + /** + * @ngdoc service + * @name $cookieStore + * @requires $cookies + * + * @description + * Provides a key-value (string-object) storage, that is backed by session cookies. + * Objects put or retrieved from this storage are automatically serialized or + * deserialized by angular's toJson/fromJson. + * + * Requires the {@link ngCookies `ngCookies`} module to be installed. + * + * @example + * + * ```js + * angular.module('cookieStoreExample', ['ngCookies']) + * .controller('ExampleController', ['$cookieStore', function($cookieStore) { + * // Put cookie + * $cookieStore.put('myFavorite','oatmeal'); + * // Get cookie + * var favoriteCookie = $cookieStore.get('myFavorite'); + * // Removing a cookie + * $cookieStore.remove('myFavorite'); + * }]); + * ``` + */ + factory('$cookieStore', ['$cookies', function($cookies) { + + return { + /** + * @ngdoc method + * @name $cookieStore#get + * + * @description + * Returns the value of given cookie key + * + * @param {string} key Id to use for lookup. + * @returns {Object} Deserialized cookie value. + */ + get: function(key) { + var value = $cookies[key]; + return value ? angular.fromJson(value) : value; + }, + + /** + * @ngdoc method + * @name $cookieStore#put + * + * @description + * Sets a value for given cookie key + * + * @param {string} key Id for the `value`. + * @param {Object} value Value to be stored. + */ + put: function(key, value) { + $cookies[key] = angular.toJson(value); + }, + + /** + * @ngdoc method + * @name $cookieStore#remove + * + * @description + * Remove given cookie + * + * @param {string} key Id of the key-value pair to delete. + */ + remove: function(key) { + delete $cookies[key]; + } + }; + + }]); + + +})(window, window.angular); diff --git a/bower_components/angular-cookies/angular-cookies.min.js b/bower_components/angular-cookies/angular-cookies.min.js new file mode 100644 index 0000000..bbfc72d --- /dev/null +++ b/bower_components/angular-cookies/angular-cookies.min.js @@ -0,0 +1,8 @@ +/* + AngularJS v1.3.15 + (c) 2010-2014 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(p,f,n){'use strict';f.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(e,b){var c={},g={},h,k=!1,l=f.copy,m=f.isUndefined;b.addPollFn(function(){var a=b.cookies();h!=a&&(h=a,l(a,g),l(a,c),k&&e.$apply())})();k=!0;e.$watch(function(){var a,d,e;for(a in g)m(c[a])&&b.cookies(a,n);for(a in c)d=c[a],f.isString(d)||(d=""+d,c[a]=d),d!==g[a]&&(b.cookies(a,d),e=!0);if(e)for(a in d=b.cookies(),c)c[a]!==d[a]&&(m(d[a])?delete c[a]:c[a]=d[a])});return c}]).factory("$cookieStore", +["$cookies",function(e){return{get:function(b){return(b=e[b])?f.fromJson(b):b},put:function(b,c){e[b]=f.toJson(c)},remove:function(b){delete e[b]}}}])})(window,window.angular); +//# sourceMappingURL=angular-cookies.min.js.map diff --git a/bower_components/angular-cookies/angular-cookies.min.js.map b/bower_components/angular-cookies/angular-cookies.min.js.map new file mode 100644 index 0000000..677960c --- /dev/null +++ b/bower_components/angular-cookies/angular-cookies.min.js.map @@ -0,0 +1,8 @@ +{ +"version":3, +"file":"angular-cookies.min.js", +"lineCount":7, +"mappings":"A;;;;;aAKC,SAAQ,CAACA,CAAD,CAASC,CAAT,CAAkBC,CAAlB,CAA6B,CAmBtCD,CAAAE,OAAA,CAAe,WAAf,CAA4B,CAAC,IAAD,CAA5B,CAAAC,QAAA,CA0BW,UA1BX,CA0BuB,CAAC,YAAD,CAAe,UAAf,CAA2B,QAAQ,CAACC,CAAD,CAAaC,CAAb,CAAuB,CAAA,IACvEC,EAAU,EAD6D,CAEvEC,EAAc,EAFyD,CAGvEC,CAHuE,CAIvEC,EAAU,CAAA,CAJ6D,CAKvEC,EAAOV,CAAAU,KALgE,CAMvEC,EAAcX,CAAAW,YAGlBN,EAAAO,UAAA,CAAmB,QAAQ,EAAG,CAC5B,IAAIC,EAAiBR,CAAAC,QAAA,EACjBE,EAAJ,EAA0BK,CAA1B,GACEL,CAGA,CAHqBK,CAGrB,CAFAH,CAAA,CAAKG,CAAL,CAAqBN,CAArB,CAEA,CADAG,CAAA,CAAKG,CAAL,CAAqBP,CAArB,CACA,CAAIG,CAAJ,EAAaL,CAAAU,OAAA,EAJf,CAF4B,CAA9B,CAAA,EAUAL,EAAA,CAAU,CAAA,CAKVL,EAAAW,OAAA,CASAC,QAAa,EAAG,CAAA,IACVC,CADU,CAEVC,CAFU,CAIVC,CAGJ,KAAKF,CAAL,GAAaV,EAAb,CACMI,CAAA,CAAYL,CAAA,CAAQW,CAAR,CAAZ,CAAJ,EACEZ,CAAAC,QAAA,CAAiBW,CAAjB,CAAuBhB,CAAvB,CAKJ,KAAKgB,CAAL,GAAaX,EAAb,CACEY,CAKA,CALQZ,CAAA,CAAQW,CAAR,CAKR,CAJKjB,CAAAoB,SAAA,CAAiBF,CAAjB,CAIL,GAHEA,CACA,CADQ,EACR,CADaA,CACb,CAAAZ,CAAA,CAAQW,CAAR,CAAA,CAAgBC,CAElB,EAAIA,CAAJ,GAAcX,CAAA,CAAYU,CAAZ,CAAd,GACEZ,CAAAC,QAAA,CAAiBW,CAAjB,CAAuBC,CAAvB,CACA,CAAAC,CAAA,CAAU,CAAA,CAFZ,CAOF,IAAIA,CAAJ,CAIE,IAAKF,CAAL,GAFAI,EAEaf,CAFID,CAAAC,QAAA,EAEJA,CAAAA,CAAb,CACMA,CAAA,CAAQW,CAAR,CAAJ,GAAsBI,CAAA,CAAeJ,CAAf,CAAtB,GAEMN,CAAA,CAAYU,CAAA,CAAeJ,CAAf,CAAZ,CAAJ,CACE,OAAOX,CAAA,CAAQW,CAAR,CADT,CAGEX,CAAA,CAAQW,CAAR,CAHF,CAGkBI,CAAA,CAAeJ,CAAf,CALpB,CAhCU,CAThB,CAEA,OAAOX,EA1BoE,CAA1D,CA1BvB,CAAAH,QAAA,CAoIW,cApIX;AAoI2B,CAAC,UAAD,CAAa,QAAQ,CAACmB,CAAD,CAAW,CAErD,MAAO,CAWLC,IAAKA,QAAQ,CAACC,CAAD,CAAM,CAEjB,MAAO,CADHN,CACG,CADKI,CAAA,CAASE,CAAT,CACL,EAAQxB,CAAAyB,SAAA,CAAiBP,CAAjB,CAAR,CAAkCA,CAFxB,CAXd,CA0BLQ,IAAKA,QAAQ,CAACF,CAAD,CAAMN,CAAN,CAAa,CACxBI,CAAA,CAASE,CAAT,CAAA,CAAgBxB,CAAA2B,OAAA,CAAeT,CAAf,CADQ,CA1BrB,CAuCLU,OAAQA,QAAQ,CAACJ,CAAD,CAAM,CACpB,OAAOF,CAAA,CAASE,CAAT,CADa,CAvCjB,CAF8C,CAAhC,CApI3B,CAnBsC,CAArC,CAAD,CAwMGzB,MAxMH,CAwMWA,MAAAC,QAxMX;", +"sources":["angular-cookies.js"], +"names":["window","angular","undefined","module","factory","$rootScope","$browser","cookies","lastCookies","lastBrowserCookies","runEval","copy","isUndefined","addPollFn","currentCookies","$apply","$watch","push","name","value","updated","isString","browserCookies","$cookies","get","key","fromJson","put","toJson","remove"] +} diff --git a/bower_components/angular-cookies/bower.json b/bower_components/angular-cookies/bower.json new file mode 100644 index 0000000..326d037 --- /dev/null +++ b/bower_components/angular-cookies/bower.json @@ -0,0 +1,9 @@ +{ + "name": "angular-cookies", + "version": "1.3.15", + "main": "./angular-cookies.js", + "ignore": [], + "dependencies": { + "angular": "1.3.15" + } +} diff --git a/bower_components/angular-cookies/index.js b/bower_components/angular-cookies/index.js new file mode 100644 index 0000000..6576675 --- /dev/null +++ b/bower_components/angular-cookies/index.js @@ -0,0 +1,2 @@ +require('./angular-cookies'); +module.exports = 'ngCookies'; diff --git a/bower_components/angular-cookies/package.json b/bower_components/angular-cookies/package.json new file mode 100644 index 0000000..acddef7 --- /dev/null +++ b/bower_components/angular-cookies/package.json @@ -0,0 +1,26 @@ +{ + "name": "angular-cookies", + "version": "1.3.15", + "description": "AngularJS module for cookies", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/angular/angular.js.git" + }, + "keywords": [ + "angular", + "framework", + "browser", + "cookies", + "client-side" + ], + "author": "Angular Core Team ", + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/angular.js/issues" + }, + "homepage": "http://angularjs.org" +} diff --git a/bower_components/angular-elastic/.bower.json b/bower_components/angular-elastic/.bower.json new file mode 100644 index 0000000..3d3dfca --- /dev/null +++ b/bower_components/angular-elastic/.bower.json @@ -0,0 +1,23 @@ +{ + "name": "angular-elastic", + "version": "2.4.2", + "main": "elastic.js", + "ignore": [ + "**/.*", + "node_modules", + "components" + ], + "dependencies": { + "angular": ">=1.0.6" + }, + "homepage": "https://github.com/monospaced/angular-elastic", + "_release": "2.4.2", + "_resolution": { + "type": "version", + "tag": "v2.4.2", + "commit": "721a7c05ce488175627307be5d80bd6ddbda0a9d" + }, + "_source": "git://github.com/monospaced/angular-elastic.git", + "_target": "~2.4.2", + "_originalSource": "angular-elastic" +} \ No newline at end of file diff --git a/bower_components/angular-elastic/LICENCE.txt b/bower_components/angular-elastic/LICENCE.txt new file mode 100644 index 0000000..f410120 --- /dev/null +++ b/bower_components/angular-elastic/LICENCE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Monospaced + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/bower_components/angular-elastic/README.md b/bower_components/angular-elastic/README.md new file mode 100644 index 0000000..e127520 --- /dev/null +++ b/bower_components/angular-elastic/README.md @@ -0,0 +1,88 @@ +Angular Elastic +=============== + +Elastic (autosize) textareas for AngularJS, without jQuery dependency. + +[See it in action](http://monospaced.github.io/angular-elastic). + +Usage +----- + +as attribute + + + +as class + + + +optionally append whitespace to the end of the height calculation (an extra newline improves the apperance when animating) + + + + + +or configure whitespace globally + + app.config(['msdElasticConfig', function(config) { + config.append = '\n\n'; + }]) + +Install +------- + + bower install angular-elastic + + npm install angular-elastic + +Include the `elastic.js` script provided by this component in your app. + +Make sure to add `monospaced.elastic` to your app’s module dependencies. + +``` +angular + .module('yourApp', [ + 'monospaced.elastic' + ]); +```` + +Support +------- + +__Modern browsers__ only—Internet Explorer 6, 7 & 8 retain their default textarea behaviour. + +Demo +---------------- + +* [monospaced.github.io/angular-elastic](http://monospaced.github.io/angular-elastic) +* [plunker](http://plnkr.co/edit/9y6YLriAwsK9hqdu72WT?p=preview) + + +How it works +------------ + +By creating a hidden textarea that mirrors the textarea to which the directive was applied, Angular Elastic can measure the required height and adjust the textarea accordingly. Adjustments are done on: + +* Keystroke events +* Window resize events +* Model changes + +This works well in most cases with no additional code required other than described in the Usage section above. However, it may occur that the adjustment must be invoked manually at a time that is not covered by the events listed above. E.g. textareas with the style `display: none;` may not have a valid width in Safari which produces incorrect adjustments. In this case the adjustment needs to be invoked once these textareas become visible. For that Angular Elastic listens to the `elastic:adjust` event on its scope. To invoke the adjustment for all textareas covered by Angular Elastic use: + + $rootScope.$broadcast('elastic:adjust'); + +Inspiration +---------------- + +* [jQuery Autosize](http://www.jacklmoore.com/autosize/) + +* [jQuery Elastic](http://unwrongest.com/projects/elastic/) + diff --git a/bower_components/angular-elastic/bower.json b/bower_components/angular-elastic/bower.json new file mode 100644 index 0000000..25216d9 --- /dev/null +++ b/bower_components/angular-elastic/bower.json @@ -0,0 +1,13 @@ +{ + "name": "angular-elastic", + "version": "2.4.2", + "main": "elastic.js", + "ignore": [ + "**/.*", + "node_modules", + "components" + ], + "dependencies": { + "angular": ">=1.0.6" + } +} \ No newline at end of file diff --git a/bower_components/angular-elastic/elastic.js b/bower_components/angular-elastic/elastic.js new file mode 100644 index 0000000..2aa6be1 --- /dev/null +++ b/bower_components/angular-elastic/elastic.js @@ -0,0 +1,215 @@ +/* + * angular-elastic v2.4.2 + * (c) 2014 Monospaced http://monospaced.com + * License: MIT + */ + +angular.module('monospaced.elastic', []) + + .constant('msdElasticConfig', { + append: '' + }) + + .directive('msdElastic', [ + '$timeout', '$window', 'msdElasticConfig', + function($timeout, $window, config) { + 'use strict'; + + return { + require: 'ngModel', + restrict: 'A, C', + link: function(scope, element, attrs, ngModel) { + + // cache a reference to the DOM element + var ta = element[0], + $ta = element; + + // ensure the element is a textarea, and browser is capable + if (ta.nodeName !== 'TEXTAREA' || !$window.getComputedStyle) { + return; + } + + // set these properties before measuring dimensions + $ta.css({ + 'overflow': 'hidden', + 'overflow-y': 'hidden', + 'word-wrap': 'break-word' + }); + + // force text reflow + var text = ta.value; + ta.value = ''; + ta.value = text; + + var append = attrs.msdElastic ? attrs.msdElastic.replace(/\\n/g, '\n') : config.append, + $win = angular.element($window), + mirrorInitStyle = 'position: absolute; top: -999px; right: auto; bottom: auto;' + + 'left: 0; overflow: hidden; -webkit-box-sizing: content-box;' + + '-moz-box-sizing: content-box; box-sizing: content-box;' + + 'min-height: 0 !important; height: 0 !important; padding: 0;' + + 'word-wrap: break-word; border: 0;', + $mirror = angular.element(' +

        + Hide | + Show | + Change model +

        + +

        +

        + +

        + + + + https://github.com/monospaced/angular-elastic
        + Monospaced Labs +
        + + + + + + \ No newline at end of file diff --git a/bower_components/angular-elastic/package.json b/bower_components/angular-elastic/package.json new file mode 100644 index 0000000..cd91dae --- /dev/null +++ b/bower_components/angular-elastic/package.json @@ -0,0 +1,32 @@ +{ + "name": "angular-elastic", + "version": "2.4.2", + "description": "Elastic (autosize) textareas for AngularJS, without jQuery dependency.", + "keywords": [ + "angular", + "angularjs", + "textarea", + "elastic", + "autosize" + ], + "homepage": "http://monospaced.github.io/angular-elastic/", + "main": "elastic", + "bugs": "http://github.com/monospaced/angular-elastic/issues", + "license" : "MIT", + "repository" : { + "type" : "git", + "url" : "http://github.com/monospaced/angular-elastic" + }, + "author": { + "name" : "Scott Boyle", + "email" : "scott@monospaced.com", + "url" : "http://scottboyle.co.uk/about" + }, + "files": [ + "elastic.js", + "package.json" + ], + "dependencies": { + "angular": ">=1.0.6" + } +} \ No newline at end of file diff --git a/bower_components/angular-file-upload/.bower.json b/bower_components/angular-file-upload/.bower.json new file mode 100644 index 0000000..af6fc9d --- /dev/null +++ b/bower_components/angular-file-upload/.bower.json @@ -0,0 +1,28 @@ +{ + "name": "angular-file-upload", + "version": "1.1.5", + "main": "angular-file-upload.js", + "homepage": "https://github.com/nervgh/angular-file-upload", + "ignore": [ + "examples" + ], + "dependencies": { + "angular": "~1.2.11", + "es5-shim": ">=3.4.0" + }, + "keywords": [ + "angular", + "file", + "upload", + "module" + ], + "_release": "1.1.5", + "_resolution": { + "type": "version", + "tag": "v1.1.5", + "commit": "6c832bbdd0e5b084848ad4246c1e7b44dc2a532f" + }, + "_source": "git://github.com/nervgh/angular-file-upload.git", + "_target": "~1.1.5", + "_originalSource": "angular-file-upload" +} \ No newline at end of file diff --git a/bower_components/angular-file-upload/.gitignore b/bower_components/angular-file-upload/.gitignore new file mode 100644 index 0000000..54f92bf --- /dev/null +++ b/bower_components/angular-file-upload/.gitignore @@ -0,0 +1,5 @@ +.temp +.idea +*.iml +node_modules +bower_components diff --git a/bower_components/angular-file-upload/.jshintrc b/bower_components/angular-file-upload/.jshintrc new file mode 100644 index 0000000..348b239 --- /dev/null +++ b/bower_components/angular-file-upload/.jshintrc @@ -0,0 +1,22 @@ +{ + "camelcase" : true, + "indent": 4, + "strict": true, + "undef": true, + "unused": true, + "quotmark": "single", + "maxlen": 120, + "trailing": true, + "curly": true, + + "devel": true, + + "browser":true, + "jquery":true, + "predef": [ + "angular", + "define", + "require", + "app" + ] +} \ No newline at end of file diff --git a/bower_components/angular-file-upload/Gruntfile.coffee b/bower_components/angular-file-upload/Gruntfile.coffee new file mode 100644 index 0000000..a3a34ed --- /dev/null +++ b/bower_components/angular-file-upload/Gruntfile.coffee @@ -0,0 +1,58 @@ +path = require 'path' + +# Build configurations. +module.exports = (grunt) -> + grunt.initConfig + + # Metadata + pkg: grunt.file.readJSON('package.json'), + + banner: '/*\n' + + ' <%= pkg.name %> v<%= pkg.version %>\n' + + ' <%= pkg.homepage %>\n' + + '*/\n' + + # Deletes built file and temp directories. + clean: + working: + src: [ + 'angular-file-upload.*' + ] + + uglify: + + # concat js files before minification + js: + src: ['angular-file-upload.js'] + dest: 'angular-file-upload.min.js' + options: + banner: '<%= banner %>' + sourceMap: (fileName) -> + fileName.replace /\.js$/, '.map' + concat: + + # concat js files before minification + js: + options: + banner: '<%= banner %>' + stripBanners: true + src: [ + 'src/intro.js', + 'src/module.js', + 'src/outro.js' + ] + dest: 'angular-file-upload.js' + + # Register grunt tasks supplied by grunt-contrib-*. + # Referenced in package.json. + # https://github.com/gruntjs/grunt-contrib + grunt.loadNpmTasks 'grunt-contrib-clean' + grunt.loadNpmTasks 'grunt-contrib-copy' + grunt.loadNpmTasks 'grunt-contrib-uglify' + grunt.loadNpmTasks 'grunt-contrib-concat' + + grunt.registerTask 'default', [ + 'clean' + 'concat' + 'uglify' + ] diff --git a/bower_components/angular-file-upload/README.md b/bower_components/angular-file-upload/README.md new file mode 100644 index 0000000..d4bf4c5 --- /dev/null +++ b/bower_components/angular-file-upload/README.md @@ -0,0 +1,24 @@ +# Angular File Upload + +--- + +## About + +**Angular File Upload** is a module for the [AngularJS](http://angularjs.org/) framework. Supports drag-n-drop upload, upload progress, validation filters and a file upload queue. It supports native HTML5 uploads, but degrades to a legacy iframe upload method for older browsers. Works with any server side platform which supports standard HTML form uploads. + +When files are selected or dropped into the component, one or more filters are applied. Files which pass all filters are added to the queue. When file is added to the queue, for him is created instance of `{FileItem}` and uploader options are copied into this object. After, items in the queue (FileItems) are ready for uploading. + +You could find this module in bower like [_angular file upload_](http://bower.io/search/?q=angular%20file). + +## Demos +1. [Simple example](http://nervgh.github.io/pages/angular-file-upload/examples/simple) +2. [Uploads only images (with canvas preview)](http://nervgh.github.io/pages/angular-file-upload/examples/image-preview) +3. [Without bootstrap example](http://nervgh.github.io/pages/angular-file-upload/examples/without-bootstrap) + +## More Info + +1. [Introduction](https://github.com/nervgh/angular-file-upload/wiki/Introduction) +2. [Module API](https://github.com/nervgh/angular-file-upload/wiki/Module-API) +3. [FAQ](https://github.com/nervgh/angular-file-upload/wiki/FAQ) +4. [Migrate from 0.x.x to 1.x.x](https://github.com/nervgh/angular-file-upload/wiki/Migrate-from-0.x.x-to-1.x.x) +5. [RubyGem](https://github.com/marthyn/angularjs-file-upload-rails) diff --git a/bower_components/angular-file-upload/angular-file-upload.js b/bower_components/angular-file-upload/angular-file-upload.js new file mode 100644 index 0000000..cbb3500 --- /dev/null +++ b/bower_components/angular-file-upload/angular-file-upload.js @@ -0,0 +1,1332 @@ +/* + angular-file-upload v1.1.5 + https://github.com/nervgh/angular-file-upload +*/ +(function(angular, factory) { + if (typeof define === 'function' && define.amd) { + define('angular-file-upload', ['angular'], function(angular) { + return factory(angular); + }); + } else { + return factory(angular); + } +}(typeof angular === 'undefined' ? null : angular, function(angular) { + +var module = angular.module('angularFileUpload', []); + +'use strict'; + +/** + * Classes + * + * FileUploader + * FileUploader.FileLikeObject + * FileUploader.FileItem + * FileUploader.FileDirective + * FileUploader.FileSelect + * FileUploader.FileDrop + * FileUploader.FileOver + */ + +module + + + .value('fileUploaderOptions', { + url: '/', + alias: 'file', + headers: {}, + queue: [], + progress: 0, + autoUpload: false, + removeAfterUpload: false, + method: 'POST', + filters: [], + formData: [], + queueLimit: Number.MAX_VALUE, + withCredentials: false + }) + + + .factory('FileUploader', ['fileUploaderOptions', '$rootScope', '$http', '$window', '$compile', + function(fileUploaderOptions, $rootScope, $http, $window, $compile) { + /** + * Creates an instance of FileUploader + * @param {Object} [options] + * @constructor + */ + function FileUploader(options) { + var settings = angular.copy(fileUploaderOptions); + angular.extend(this, settings, options, { + isUploading: false, + _nextIndex: 0, + _failFilterIndex: -1, + _directives: {select: [], drop: [], over: []} + }); + + // add default filters + this.filters.unshift({name: 'queueLimit', fn: this._queueLimitFilter}); + this.filters.unshift({name: 'folder', fn: this._folderFilter}); + } + /********************** + * PUBLIC + **********************/ + /** + * Checks a support the html5 uploader + * @returns {Boolean} + * @readonly + */ + FileUploader.prototype.isHTML5 = !!($window.File && $window.FormData); + /** + * Adds items to the queue + * @param {File|HTMLInputElement|Object|FileList|Array} files + * @param {Object} [options] + * @param {Array|String} filters + */ + FileUploader.prototype.addToQueue = function(files, options, filters) { + var list = this.isArrayLikeObject(files) ? files: [files]; + var arrayOfFilters = this._getFilters(filters); + var count = this.queue.length; + var addedFileItems = []; + + angular.forEach(list, function(some /*{File|HTMLInputElement|Object}*/) { + var temp = new FileUploader.FileLikeObject(some); + + if (this._isValidFile(temp, arrayOfFilters, options)) { + var fileItem = new FileUploader.FileItem(this, some, options); + addedFileItems.push(fileItem); + this.queue.push(fileItem); + this._onAfterAddingFile(fileItem); + } else { + var filter = this.filters[this._failFilterIndex]; + this._onWhenAddingFileFailed(temp, filter, options); + } + }, this); + + if(this.queue.length !== count) { + this._onAfterAddingAll(addedFileItems); + this.progress = this._getTotalProgress(); + } + + this._render(); + if (this.autoUpload) this.uploadAll(); + }; + /** + * Remove items from the queue. Remove last: index = -1 + * @param {FileItem|Number} value + */ + FileUploader.prototype.removeFromQueue = function(value) { + var index = this.getIndexOfItem(value); + var item = this.queue[index]; + if (item.isUploading) item.cancel(); + this.queue.splice(index, 1); + item._destroy(); + this.progress = this._getTotalProgress(); + }; + /** + * Clears the queue + */ + FileUploader.prototype.clearQueue = function() { + while(this.queue.length) { + this.queue[0].remove(); + } + this.progress = 0; + }; + /** + * Uploads a item from the queue + * @param {FileItem|Number} value + */ + FileUploader.prototype.uploadItem = function(value) { + var index = this.getIndexOfItem(value); + var item = this.queue[index]; + var transport = this.isHTML5 ? '_xhrTransport' : '_iframeTransport'; + + item._prepareToUploading(); + if(this.isUploading) return; + + this.isUploading = true; + this[transport](item); + }; + /** + * Cancels uploading of item from the queue + * @param {FileItem|Number} value + */ + FileUploader.prototype.cancelItem = function(value) { + var index = this.getIndexOfItem(value); + var item = this.queue[index]; + var prop = this.isHTML5 ? '_xhr' : '_form'; + if (item && item.isUploading) item[prop].abort(); + }; + /** + * Uploads all not uploaded items of queue + */ + FileUploader.prototype.uploadAll = function() { + var items = this.getNotUploadedItems().filter(function(item) { + return !item.isUploading; + }); + if (!items.length) return; + + angular.forEach(items, function(item) { + item._prepareToUploading(); + }); + items[0].upload(); + }; + /** + * Cancels all uploads + */ + FileUploader.prototype.cancelAll = function() { + var items = this.getNotUploadedItems(); + angular.forEach(items, function(item) { + item.cancel(); + }); + }; + /** + * Returns "true" if value an instance of File + * @param {*} value + * @returns {Boolean} + * @private + */ + FileUploader.prototype.isFile = function(value) { + var fn = $window.File; + return (fn && value instanceof fn); + }; + /** + * Returns "true" if value an instance of FileLikeObject + * @param {*} value + * @returns {Boolean} + * @private + */ + FileUploader.prototype.isFileLikeObject = function(value) { + return value instanceof FileUploader.FileLikeObject; + }; + /** + * Returns "true" if value is array like object + * @param {*} value + * @returns {Boolean} + */ + FileUploader.prototype.isArrayLikeObject = function(value) { + return (angular.isObject(value) && 'length' in value); + }; + /** + * Returns a index of item from the queue + * @param {Item|Number} value + * @returns {Number} + */ + FileUploader.prototype.getIndexOfItem = function(value) { + return angular.isNumber(value) ? value : this.queue.indexOf(value); + }; + /** + * Returns not uploaded items + * @returns {Array} + */ + FileUploader.prototype.getNotUploadedItems = function() { + return this.queue.filter(function(item) { + return !item.isUploaded; + }); + }; + /** + * Returns items ready for upload + * @returns {Array} + */ + FileUploader.prototype.getReadyItems = function() { + return this.queue + .filter(function(item) { + return (item.isReady && !item.isUploading); + }) + .sort(function(item1, item2) { + return item1.index - item2.index; + }); + }; + /** + * Destroys instance of FileUploader + */ + FileUploader.prototype.destroy = function() { + angular.forEach(this._directives, function(key) { + angular.forEach(this._directives[key], function(object) { + object.destroy(); + }, this); + }, this); + }; + /** + * Callback + * @param {Array} fileItems + */ + FileUploader.prototype.onAfterAddingAll = function(fileItems) {}; + /** + * Callback + * @param {FileItem} fileItem + */ + FileUploader.prototype.onAfterAddingFile = function(fileItem) {}; + /** + * Callback + * @param {File|Object} item + * @param {Object} filter + * @param {Object} options + * @private + */ + FileUploader.prototype.onWhenAddingFileFailed = function(item, filter, options) {}; + /** + * Callback + * @param {FileItem} fileItem + */ + FileUploader.prototype.onBeforeUploadItem = function(fileItem) {}; + /** + * Callback + * @param {FileItem} fileItem + * @param {Number} progress + */ + FileUploader.prototype.onProgressItem = function(fileItem, progress) {}; + /** + * Callback + * @param {Number} progress + */ + FileUploader.prototype.onProgressAll = function(progress) {}; + /** + * Callback + * @param {FileItem} item + * @param {*} response + * @param {Number} status + * @param {Object} headers + */ + FileUploader.prototype.onSuccessItem = function(item, response, status, headers) {}; + /** + * Callback + * @param {FileItem} item + * @param {*} response + * @param {Number} status + * @param {Object} headers + */ + FileUploader.prototype.onErrorItem = function(item, response, status, headers) {}; + /** + * Callback + * @param {FileItem} item + * @param {*} response + * @param {Number} status + * @param {Object} headers + */ + FileUploader.prototype.onCancelItem = function(item, response, status, headers) {}; + /** + * Callback + * @param {FileItem} item + * @param {*} response + * @param {Number} status + * @param {Object} headers + */ + FileUploader.prototype.onCompleteItem = function(item, response, status, headers) {}; + /** + * Callback + */ + FileUploader.prototype.onCompleteAll = function() {}; + /********************** + * PRIVATE + **********************/ + /** + * Returns the total progress + * @param {Number} [value] + * @returns {Number} + * @private + */ + FileUploader.prototype._getTotalProgress = function(value) { + if(this.removeAfterUpload) return value || 0; + + var notUploaded = this.getNotUploadedItems().length; + var uploaded = notUploaded ? this.queue.length - notUploaded : this.queue.length; + var ratio = 100 / this.queue.length; + var current = (value || 0) * ratio / 100; + + return Math.round(uploaded * ratio + current); + }; + /** + * Returns array of filters + * @param {Array|String} filters + * @returns {Array} + * @private + */ + FileUploader.prototype._getFilters = function(filters) { + if (angular.isUndefined(filters)) return this.filters; + if (angular.isArray(filters)) return filters; + var names = filters.match(/[^\s,]+/g); + return this.filters.filter(function(filter) { + return names.indexOf(filter.name) !== -1; + }, this); + }; + /** + * Updates html + * @private + */ + FileUploader.prototype._render = function() { + if (!$rootScope.$$phase) $rootScope.$apply(); + }; + /** + * Returns "true" if item is a file (not folder) + * @param {File|FileLikeObject} item + * @returns {Boolean} + * @private + */ + FileUploader.prototype._folderFilter = function(item) { + return !!(item.size || item.type); + }; + /** + * Returns "true" if the limit has not been reached + * @returns {Boolean} + * @private + */ + FileUploader.prototype._queueLimitFilter = function() { + return this.queue.length < this.queueLimit; + }; + /** + * Returns "true" if file pass all filters + * @param {File|Object} file + * @param {Array} filters + * @param {Object} options + * @returns {Boolean} + * @private + */ + FileUploader.prototype._isValidFile = function(file, filters, options) { + this._failFilterIndex = -1; + return !filters.length ? true : filters.every(function(filter) { + this._failFilterIndex++; + return filter.fn.call(this, file, options); + }, this); + }; + /** + * Checks whether upload successful + * @param {Number} status + * @returns {Boolean} + * @private + */ + FileUploader.prototype._isSuccessCode = function(status) { + return (status >= 200 && status < 300) || status === 304; + }; + /** + * Transforms the server response + * @param {*} response + * @param {Object} headers + * @returns {*} + * @private + */ + FileUploader.prototype._transformResponse = function(response, headers) { + var headersGetter = this._headersGetter(headers); + angular.forEach($http.defaults.transformResponse, function(transformFn) { + response = transformFn(response, headersGetter); + }); + return response; + }; + /** + * Parsed response headers + * @param headers + * @returns {Object} + * @see https://github.com/angular/angular.js/blob/master/src/ng/http.js + * @private + */ + FileUploader.prototype._parseHeaders = function(headers) { + var parsed = {}, key, val, i; + + if (!headers) return parsed; + + angular.forEach(headers.split('\n'), function(line) { + i = line.indexOf(':'); + key = line.slice(0, i).trim().toLowerCase(); + val = line.slice(i + 1).trim(); + + if (key) { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + }); + + return parsed; + }; + /** + * Returns function that returns headers + * @param {Object} parsedHeaders + * @returns {Function} + * @private + */ + FileUploader.prototype._headersGetter = function(parsedHeaders) { + return function(name) { + if (name) { + return parsedHeaders[name.toLowerCase()] || null; + } + return parsedHeaders; + }; + }; + /** + * The XMLHttpRequest transport + * @param {FileItem} item + * @private + */ + FileUploader.prototype._xhrTransport = function(item) { + var xhr = item._xhr = new XMLHttpRequest(); + var form = new FormData(); + var that = this; + + that._onBeforeUploadItem(item); + + angular.forEach(item.formData, function(obj) { + angular.forEach(obj, function(value, key) { + form.append(key, value); + }); + }); + + form.append(item.alias, item._file, item.file.name); + + xhr.upload.onprogress = function(event) { + var progress = Math.round(event.lengthComputable ? event.loaded * 100 / event.total : 0); + that._onProgressItem(item, progress); + }; + + xhr.onload = function() { + var headers = that._parseHeaders(xhr.getAllResponseHeaders()); + var response = that._transformResponse(xhr.response, headers); + var gist = that._isSuccessCode(xhr.status) ? 'Success' : 'Error'; + var method = '_on' + gist + 'Item'; + that[method](item, response, xhr.status, headers); + that._onCompleteItem(item, response, xhr.status, headers); + }; + + xhr.onerror = function() { + var headers = that._parseHeaders(xhr.getAllResponseHeaders()); + var response = that._transformResponse(xhr.response, headers); + that._onErrorItem(item, response, xhr.status, headers); + that._onCompleteItem(item, response, xhr.status, headers); + }; + + xhr.onabort = function() { + var headers = that._parseHeaders(xhr.getAllResponseHeaders()); + var response = that._transformResponse(xhr.response, headers); + that._onCancelItem(item, response, xhr.status, headers); + that._onCompleteItem(item, response, xhr.status, headers); + }; + + xhr.open(item.method, item.url, true); + + xhr.withCredentials = item.withCredentials; + + angular.forEach(item.headers, function(value, name) { + xhr.setRequestHeader(name, value); + }); + + xhr.send(form); + this._render(); + }; + /** + * The IFrame transport + * @param {FileItem} item + * @private + */ + FileUploader.prototype._iframeTransport = function(item) { + var form = angular.element('
        '); + var iframe = angular.element('');return a.join("")})}},fileButton:function(b,c,d){var g=this;if(!(arguments.length<3)){a.call(this,c);if(c.validate)this.validate=c.validate;var e=CKEDITOR.tools.extend({}, +c),j=e.onClick;e.className=(e.className?e.className+" ":"")+"cke_dialog_ui_button";e.onClick=function(a){var d=c["for"];if(!j||j.call(this,a)!==false){b.getContentElement(d[0],d[1]).submit();this.disable()}};b.on("load",function(){b.getContentElement(c["for"][0],c["for"][1])._.buttons.push(g)});CKEDITOR.ui.dialog.button.call(this,b,e,d)}},html:function(){var a=/^\s*<[\w:]+\s+([^>]*)?>/,b=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,c=/\/$/;return function(d,g,e){if(!(arguments.length<3)){var j=[], +m=g.html;m.charAt(0)!="<"&&(m=""+m+"");var l=g.focus;if(l){var p=this.focus;this.focus=function(){(typeof l=="function"?l:p).call(this);this.fire("focus")};if(g.isFocusable)this.isFocusable=this.isFocusable;this.keyboardFocusable=true}CKEDITOR.ui.dialog.uiElement.call(this,d,g,j,"span",null,null,"");j=j.join("").match(a);m=m.match(b)||["","",""];if(c.test(m[1])){m[1]=m[1].slice(0,-1);m[2]="/"+m[2]}e.push([m[1]," ",j[1]||"",m[2]].join(""))}}}(),fieldset:function(a,b,c,d,g){var e=g.label; +this._={children:b};CKEDITOR.ui.dialog.uiElement.call(this,a,g,d,"fieldset",null,null,function(){var a=[];e&&a.push(""+e+"");for(var b=0;b0;)a.remove(0);return this},keyboardFocusable:true},g,true);CKEDITOR.ui.dialog.checkbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getInputElement:function(){return this._.checkbox.getElement()},setValue:function(a,b){this.getInputElement().$.checked=a;!b&&this.fire("change",{value:a})},getValue:function(){return this.getInputElement().$.checked}, +accessKeyUp:function(){this.setValue(!this.getValue())},eventProcessors:{onChange:function(a,b){if(!CKEDITOR.env.ie||CKEDITOR.env.version>8)return c.onChange.apply(this,arguments);a.on("load",function(){var a=this._.checkbox.getElement();a.on("propertychange",function(b){b=b.data.$;b.propertyName=="checked"&&this.fire("change",{value:a.$.checked})},this)},this);this.on("change",b);return null}},keyboardFocusable:true},g,true);CKEDITOR.ui.dialog.radio.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement, +{setValue:function(a,b){for(var c=this._.children,d,g=0;g0?new CKEDITOR.dom.element(a.$.forms[0].elements[0]):this.getElement()},submit:function(){this.getInputElement().getParent().$.submit();return this},getAction:function(){return this.getInputElement().getParent().$.action},registerEvents:function(a){var b=/^on([A-Z]\w+)/,c,d=function(a,b,c,d){a.on("formLoaded",function(){a.getInputElement().on(c,d,a)})},g;for(g in a)if(c=g.match(b))this.eventProcessors[g]?this.eventProcessors[g].call(this,this._.dialog,a[g]):d(this,this._.dialog, +c[1].toLowerCase(),a[g]);return this},reset:function(){function a(){c.$.open();var f="";d.size&&(f=d.size-(CKEDITOR.env.ie?7:0));var t=b.frameId+"_input";c.$.write(['',' + ``` + +- `tabReplace` and `useBR` that were used in different places are also unified + into the global options object and are to be set using `configure(options)`. + This function is documented in our [API docs][]. Also note that these + parameters are gone from `highlightBlock` and `fixMarkup` which are now also + rely on `configure`. + +- We removed public-facing (though undocumented) object `hljs.LANGUAGES` which + was used to register languages with the library in favor of two new methods: + `registerLanguage` and `getLanguage`. Both are documented in our [API docs][]. + +- Result returned from `highlight` and `highlightAuto` no longer contains two + separate attributes contributing to relevance score, `relevance` and + `keyword_count`. They are now unified in `relevance`. + +Another technically compatible change that nonetheless might need attention: + +- The structure of the NPM package was refactored, so if you had installed it + locally, you'll have to update your paths. The usual `require('highlight.js')` + works as before. This is contributed by [Dmitry Smolin][]. + +New features: + +- Languages now can be recognized by multiple names like "js" for JavaScript or + "html" for, well, HTML (which earlier insisted on calling it "xml"). These + aliases can be specified in the class attribute of the code container in your + HTML as well as in various API calls. For now there are only a few very common + aliases but we'll expand it in the future. All of them are listed in the + [class reference][]. + +- Language detection can now be restricted to a subset of languages relevant in + a given context — a web page or even a single highlighting call. This is + especially useful for node.js build that includes all the known languages. + Another example is a StackOverflow-style site where users specify languages + as tags rather than in the markdown-formatted code snippets. This is + documented in the [API reference][] (see methods `highlightAuto` and + `configure`). + +- Language definition syntax streamlined with [variants][] and + [beginKeywords][]. + +New languages and styles: + +- *Oxygene* by [Carlo Kok][] +- *Mathematica* by [Daniel Kvasnička][] +- *Autohotkey* by [Seongwon Lee][] +- *Atelier* family of styles in 10 variants by [Bram de Haan][] +- *Paraíso* styles by [Jan T. Sott][] + +Miscelleanous improvements: + +- Highlighting `=>` prompts in Clojure. +- [Jeremy Hull][] fixed a lot of styles for consistency. +- Finally, highlighting PHP and HTML [mixed in peculiar ways][php-html]. +- Objective C and C# now properly highlight titles in method definition. +- Big overhaul of relevance counting for a number of languages. Please do report + bugs about mis-detection of non-trivial code snippets! + +[cr]: http://highlightjs.readthedocs.org/en/latest/css-classes-reference.html +[api docs]: http://highlightjs.readthedocs.org/en/latest/api.html +[variants]: https://groups.google.com/d/topic/highlightjs/VoGC9-1p5vk/discussion +[beginKeywords]: https://github.com/isagalaev/highlight.js/commit/6c7fdea002eb3949577a85b3f7930137c7c3038d +[php-html]: https://twitter.com/highlightjs/status/408890903017689088 + +[Carlo Kok]: https://github.com/carlokok +[Bram de Haan]: https://github.com/atelierbram +[Daniel Kvasnička]: https://github.com/dkvasnicka +[Dmitry Smolin]: https://github.com/dimsmol +[Jeremy Hull]: https://github.com/sourrust +[Seongwon Lee]: https://github.com/dlimpid +[Jan T. Sott]: https://github.com/idleberg + + +## Version 7.5 + +A catch-up release dealing with some of the accumulated contributions. This one +is probably will be the last before the 8.0 which will be slightly backwards +incompatible regarding some advanced use-cases. + +One outstanding change in this version is the addition of 6 languages to the +[hosted script][d]: Markdown, ObjectiveC, CoffeeScript, Apache, Nginx and +Makefile. It now weighs about 6K more but we're going to keep it under 30K. + +New languages: + +- OCaml by [Mehdi Dogguy][mehdid] and [Nicolas Braud-Santoni][nbraud] +- [LiveCode Server][lcs] by [Ralf Bitter][revig] +- Scilab by [Sylvestre Ledru][sylvestre] +- basic support for Makefile by [Ivan Sagalaev][isagalaev] + +Improvements: + +- Ruby's got support for characters like `?A`, `?1`, `?\012` etc. and `%r{..}` + regexps. +- Clojure now allows a function call in the beginning of s-expressions + `(($filter "myCount") (arr 1 2 3 4 5))`. +- Haskell's got new keywords and now recognizes more things like pragmas, + preprocessors, modules, containers, FFIs etc. Thanks to [Zena Treep][treep] + for the implementation and to [Jeremy Hull][sourrust] for guiding it. +- Miscelleanous fixes in PHP, Brainfuck, SCSS, Asciidoc, CMake, Python and F#. + +[mehdid]: https://github.com/mehdid +[nbraud]: https://github.com/nbraud +[revig]: https://github.com/revig +[lcs]: http://livecode.com/developers/guides/server/ +[sylvestre]: https://github.com/sylvestre +[isagalaev]: https://github.com/isagalaev +[treep]: https://github.com/treep +[sourrust]: https://github.com/sourrust +[d]: http://highlightjs.org/download/ + + +## New core developers + +The latest long period of almost complete inactivity in the project coincided +with growing interest to it led to a decision that now seems completely obvious: +we need more core developers. + +So without further ado let me welcome to the core team two long-time +contributors: [Jeremy Hull][] and [Oleg +Efimov][]. + +Hope now we'll be able to work through stuff faster! + +P.S. The historical commit is [here][1] for the record. + +[Jeremy Hull]: https://github.com/sourrust +[Oleg Efimov]: https://github.com/sannis +[1]: https://github.com/isagalaev/highlight.js/commit/f3056941bda56d2b72276b97bc0dd5f230f2473f + + +## Version 7.4 + +This long overdue version is a snapshot of the current source tree with all the +changes that happened during the past year. Sorry for taking so long! + +Along with the changes in code highlight.js has finally got its new home at +, moving from its craddle on Software Maniacs which it +outgrew a long time ago. Be sure to report any bugs about the site to +. + +On to what's new… + +New languages: + +- Handlebars templates by [Robin Ward][] +- Oracle Rules Language by [Jason Jacobson][] +- F# by [Joans Follesø][] +- AsciiDoc and Haml by [Dan Allen][] +- Lasso by [Eric Knibbe][] +- SCSS by [Kurt Emch][] +- VB.NET by [Poren Chiang][] +- Mizar by [Kelley van Evert][] + +[Robin Ward]: https://github.com/eviltrout +[Jason Jacobson]: https://github.com/jayce7 +[Joans Follesø]: https://github.com/follesoe +[Dan Allen]: https://github.com/mojavelinux +[Eric Knibbe]: https://github.com/EricFromCanada +[Kurt Emch]: https://github.com/kemch +[Poren Chiang]: https://github.com/rschiang +[Kelley van Evert]: https://github.com/kelleyvanevert + +New style themes: + +- Monokai Sublime by [noformnocontent][] +- Railscasts by [Damien White][] +- Obsidian by [Alexander Marenin][] +- Docco by [Simon Madine][] +- Mono Blue by [Ivan Sagalaev][] (uses a single color hue for everything) +- Foundation by [Dan Allen][] + +[noformnocontent]: http://nn.mit-license.org/ +[Damien White]: https://github.com/visoft +[Alexander Marenin]: https://github.com/ioncreature +[Simon Madine]: https://github.com/thingsinjars +[Ivan Sagalaev]: https://github.com/isagalaev + +Other notable changes: + +- Corrected many corner cases in CSS. +- Dropped Python 2 version of the build tool. +- Implemented building for the AMD format. +- Updated Rust keywords (thanks to [Dmitry Medvinsky][]). +- Literal regexes can now be used in language definitions. +- CoffeeScript highlighting is now significantly more robust and rich due to + input from [Cédric Néhémie][]. + +[Dmitry Medvinsky]: https://github.com/dmedvinsky +[Cédric Néhémie]: https://github.com/abe33 + + +## Version 7.3 + +- Since this version highlight.js no longer works in IE version 8 and older. + It's made it possible to reduce the library size and dramatically improve code + readability and made it easier to maintain. Time to go forward! + +- New languages: AppleScript (by [Nathan Grigg][ng] and [Dr. Drang][dd]) and + Brainfuck (by [Evgeny Stepanischev][bolk]). + +- Improvements to existing languages: + + - interpreter prompt in Python (`>>>` and `...`) + - @-properties and classes in CoffeeScript + - E4X in JavaScript (by [Oleg Efimov][oe]) + - new keywords in Perl (by [Kirk Kimmel][kk]) + - big Ruby syntax update (by [Vasily Polovnyov][vast]) + - small fixes in Bash + +- Also Oleg Efimov did a great job of moving all the docs for language and style + developers and contributors from the old wiki under the source code in the + "docs" directory. Now these docs are nicely presented at + . + +[ng]: https://github.com/nathan11g +[dd]: https://github.com/drdrang +[bolk]: https://github.com/bolknote +[oe]: https://github.com/Sannis +[kk]: https://github.com/kimmel +[vast]: https://github.com/vast + + +## Version 7.2 + +A regular bug-fix release without any significant new features. Enjoy! + + +## Version 7.1 + +A Summer crop: + +- [Marc Fornos][mf] made the definition for Clojure along with the matching + style Rainbow (which, of course, works for other languages too). +- CoffeeScript support continues to improve getting support for regular + expressions. +- Yoshihide Jimbo ported to highlight.js [five Tomorrow styles][tm] from the + [project by Chris Kempson][tm0]. +- Thanks to [Casey Duncun][cd] the library can now be built in the popular + [AMD format][amd]. +- And last but not least, we've got a fair number of correctness and consistency + fixes, including a pretty significant refactoring of Ruby. + +[mf]: https://github.com/mfornos +[tm]: http://jmblog.github.com/color-themes-for-highlightjs/ +[tm0]: https://github.com/ChrisKempson/Tomorrow-Theme +[cd]: https://github.com/caseman +[amd]: http://requirejs.org/docs/whyamd.html + + +## Version 7.0 + +The reason for the new major version update is a global change of keyword syntax +which resulted in the library getting smaller once again. For example, the +hosted build is 2K less than at the previous version while supporting two new +languages. + +Notable changes: + +- The library now works not only in a browser but also with [node.js][]. It is + installable with `npm install highlight.js`. [API][] docs are available on our + wiki. + +- The new unique feature (apparently) among syntax highlighters is highlighting + *HTTP* headers and an arbitrary language in the request body. The most useful + languages here are *XML* and *JSON* both of which highlight.js does support. + Here's [the detailed post][p] about the feature. + +- Two new style themes: a dark "south" *[Pojoaque][]* by Jason Tate and an + emulation of*XCode* IDE by [Angel Olloqui][ao]. + +- Three new languages: *D* by [Aleksandar Ružičić][ar], *R* by [Joe Cheng][jc] + and *GLSL* by [Sergey Tikhomirov][st]. + +- *Nginx* syntax has become a million times smaller and more universal thanks to + remaking it in a more generic manner that doesn't require listing all the + directives in the known universe. + +- Function titles are now highlighted in *PHP*. + +- *Haskell* and *VHDL* were significantly reworked to be more rich and correct + by their respective maintainers [Jeremy Hull][sr] and [Igor Kalnitsky][ik]. + +And last but not least, many bugs have been fixed around correctness and +language detection. + +Overall highlight.js currently supports 51 languages and 20 style themes. + +[node.js]: http://nodejs.org/ +[api]: http://softwaremaniacs.org/wiki/doku.php/highlight.js:api +[p]: http://softwaremaniacs.org/blog/2012/05/10/http-and-json-in-highlight-js/en/ +[pojoaque]: http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html +[ao]: https://github.com/angelolloqui +[ar]: https://github.com/raleksandar +[jc]: https://github.com/jcheng5 +[st]: https://github.com/tikhomirov +[sr]: https://github.com/sourrust +[ik]: https://github.com/ikalnitsky + + +## Version 6.2 + +A lot of things happened in highlight.js since the last version! We've got nine +new contributors, the discussion group came alive, and the main branch on GitHub +now counts more than 350 followers. Here are most significant results coming +from all this activity: + +- 5 (five!) new languages: Rust, ActionScript, CoffeeScript, MatLab and + experimental support for markdown. Thanks go to [Andrey Vlasovskikh][av], + [Alexander Myadzel][am], [Dmytrii Nagirniak][dn], [Oleg Efimov][oe], [Denis + Bardadym][db] and [John Crepezzi][jc]. + +- 2 new style themes: Monokai by [Luigi Maselli][lm] and stylistic imitation of + another well-known highlighter Google Code Prettify by [Aahan Krish][ak]. + +- A vast number of [correctness fixes and code refactorings][log], mostly made + by [Oleg Efimov][oe] and [Evgeny Stepanischev][es]. + +[av]: https://github.com/vlasovskikh +[am]: https://github.com/myadzel +[dn]: https://github.com/dnagir +[oe]: https://github.com/Sannis +[db]: https://github.com/btd +[jc]: https://github.com/seejohnrun +[lm]: http://grigio.org/ +[ak]: https://github.com/geekpanth3r +[es]: https://github.com/bolknote +[log]: https://github.com/isagalaev/highlight.js/commits/ + + +## Version 6.1 — Solarized + +[Jeremy Hull][jh] has implemented my dream feature — a port of [Solarized][] +style theme famous for being based on the intricate color theory to achieve +correct contrast and color perception. It is now available for highlight.js in +both variants — light and dark. + +This version also adds a new original style Arta. Its author pumbur maintains a +[heavily modified fork of highlight.js][pb] on GitHub. + +[jh]: https://github.com/sourrust +[solarized]: http://ethanschoonover.com/solarized +[pb]: https://github.com/pumbur/highlight.js + + +## Version 6.0 + +New major version of the highlighter has been built on a significantly +refactored syntax. Due to this it's even smaller than the previous one while +supporting more languages! + +New languages are: + +- Haskell by [Jeremy Hull][sourrust] +- Erlang in two varieties — module and REPL — made collectively by [Nikolay + Zakharov][desh], [Dmitry Kovega][arhibot] and [Sergey Ignatov][ignatov] +- Objective C by [Valerii Hiora][vhbit] +- Vala by [Antono Vasiljev][antono] +- Go by [Stephan Kountso][steplg] + +[sourrust]: https://github.com/sourrust +[desh]: http://desh.su/ +[arhibot]: https://github.com/arhibot +[ignatov]: https://github.com/ignatov +[vhbit]: https://github.com/vhbit +[antono]: https://github.com/antono +[steplg]: https://github.com/steplg + +Also this version is marginally faster and fixes a number of small long-standing +bugs. + +Developer overview of the new language syntax is available in a [blog post about +recent beta release][beta]. + +[beta]: http://softwaremaniacs.org/blog/2011/04/25/highlight-js-60-beta/en/ + +P.S. New version is not yet available on a Yandex' CDN, so for now you have to +download [your own copy][d]. + +[d]: /soft/highlight/en/download/ + + +## Version 5.14 + +Fixed bugs in HTML/XML detection and relevance introduced in previous +refactoring. + +Also test.html now shows the second best result of language detection by +relevance. + + +## Version 5.13 + +Past weekend began with a couple of simple additions for existing languages but +ended up in a big code refactoring bringing along nice improvements for language +developers. + +### For users + +- Description of C++ has got new keywords from the upcoming [C++ 0x][] standard. +- Description of HTML has got new tags from [HTML 5][]. +- CSS-styles have been unified to use consistent padding and also have lost + pop-outs with names of detected languages. +- [Igor Kalnitsky][ik] has sent two new language descriptions: CMake и VHDL. + +This makes total number of languages supported by highlight.js to reach 35. + +Bug fixes: + +- Custom classes on `
        ` tags are not being overridden anymore
        +- More correct highlighting of code blocks inside non-`
        ` containers:
        +  highlighter now doesn't insist on replacing them with its own container and
        +  just replaces the contents.
        +- Small fixes in browser compatibility and heuristics.
        +
        +[c++ 0x]: http://ru.wikipedia.org/wiki/C%2B%2B0x
        +[html 5]: http://en.wikipedia.org/wiki/HTML5
        +[ik]: http://kalnitsky.org.ua/
        +
        +### For developers
        +
        +The most significant change is the ability to include language submodes right
        +under `contains` instead of defining explicit named submodes in the main array:
        +
        +    contains: [
        +      'string',
        +      'number',
        +      {begin: '\\n', end: hljs.IMMEDIATE_RE}
        +    ]
        +
        +This is useful for auxiliary modes needed only in one place to define parsing.
        +Note that such modes often don't have `className` and hence won't generate a
        +separate `` in the resulting markup. This is similar in effect to
        +`noMarkup: true`. All existing languages have been refactored accordingly.
        +
        +Test file test.html has at last become a real test. Now it not only puts the
        +detected language name under the code snippet but also tests if it matches the
        +expected one. Test summary is displayed right above all language snippets.
        +
        +
        +## CDN
        +
        +Fine people at [Yandex][] agreed to host highlight.js on their big fast servers.
        +[Link up][l]!
        +
        +[yandex]: http://yandex.com/
        +[l]: http://softwaremaniacs.org/soft/highlight/en/download/
        +
        +
        +## Version 5.10 — "Paris".
        +
        +Though I'm on a vacation in Paris, I decided to release a new version with a
        +couple of small fixes:
        +
        +- Tomas Vitvar discovered that TAB replacement doesn't always work when used
        +  with custom markup in code
        +- SQL parsing is even more rigid now and doesn't step over SmallTalk in tests
        +
        +
        +## Version 5.9
        +
        +A long-awaited version is finally released.
        +
        +New languages:
        +
        +- Andrew Fedorov made a definition for Lua
        +- a long-time highlight.js contributor [Peter Leonov][pl] made a definition for
        +  Nginx config
        +- [Vladimir Moskva][vm] made a definition for TeX
        +
        +[pl]: http://kung-fu-tzu.ru/
        +[vm]: http://fulc.ru/
        +
        +Fixes for existing languages:
        +
        +- [Loren Segal][ls] reworked the Ruby definition and added highlighting for
        +  [YARD][] inline documentation
        +- the definition of SQL has become more solid and now it shouldn't be overly
        +  greedy when it comes to language detection
        +
        +[ls]: http://gnuu.org/
        +[yard]: http://yardoc.org/
        +
        +The highlighter has become more usable as a library allowing to do highlighting
        +from initialization code of JS frameworks and in ajax methods (see.
        +readme.eng.txt).
        +
        +Also this version drops support for the [WordPress][wp] plugin. Everyone is
        +welcome to [pick up its maintenance][p] if needed.
        +
        +[wp]: http://wordpress.org/
        +[p]: http://bazaar.launchpad.net/~isagalaev/+junk/highlight/annotate/342/src/wp_highlight.js.php
        +
        +
        +## Version 5.8
        +
        +- Jan Berkel has contributed a definition for Scala. +1 to hotness!
        +- All CSS-styles are rewritten to work only inside `
        ` tags to avoid
        +  conflicts with host site styles.
        +
        +
        +## Version 5.7.
        +
        +Fixed escaping of quotes in VBScript strings.
        +
        +
        +## Version 5.5
        +
        +This version brings a small change: now .ini-files allow digits, underscores and
        +square brackets in key names.
        +
        +
        +## Version 5.4
        +
        +Fixed small but upsetting bug in the packer which caused incorrect highlighting
        +of explicitly specified languages. Thanks to Andrew Fedorov for precise
        +diagnostics!
        +
        +
        +## Version 5.3
        +
        +The version to fulfil old promises.
        +
        +The most significant change is that highlight.js now preserves custom user
        +markup in code along with its own highlighting markup. This means that now it's
        +possible to use, say, links in code. Thanks to [Vladimir Dolzhenko][vd] for the
        +[initial proposal][1] and for making a proof-of-concept patch.
        +
        +Also in this version:
        +
        +- [Vasily Polovnyov][vp] has sent a GitHub-like style and has implemented
        +  support for CSS @-rules and Ruby symbols.
        +- Yura Zaripov has sent two styles: Brown Paper and School Book.
        +- Oleg Volchkov has sent a definition for [Parser 3][p3].
        +
        +[1]: http://softwaremaniacs.org/forum/highlightjs/6612/
        +[p3]: http://www.parser.ru/
        +[vp]: http://vasily.polovnyov.ru/
        +[vd]: http://dolzhenko.blogspot.com/
        +
        +
        +## Version 5.2
        +
        +- at last it's possible to replace indentation TABs with something sensible (e.g. 2 or 4 spaces)
        +- new keywords and built-ins for 1C by Sergey Baranov
        +- a couple of small fixes to Apache highlighting
        +
        +
        +## Version 5.1
        +
        +This is one of those nice version consisting entirely of new and shiny
        +contributions!
        +
        +- [Vladimir Ermakov][vooon] created highlighting for AVR Assembler
        +- [Ruslan Keba][rukeba] created highlighting for Apache config file. Also his
        +  original visual style for it is now available for all highlight.js languages
        +  under the name "Magula".
        +- [Shuen-Huei Guan][drake] (aka Drake) sent new keywords for RenderMan
        +  languages. Also thanks go to [Konstantin Evdokimenko][ke] for his advice on
        +  the matter.
        +
        +[vooon]: http://vehq.ru/about/
        +[rukeba]: http://rukeba.com/
        +[drake]: http://drakeguan.org/
        +[ke]: http://k-evdokimenko.moikrug.ru/
        +
        +
        +## Version 5.0
        +
        +The main change in the new major version of highlight.js is a mechanism for
        +packing several languages along with the library itself into a single compressed
        +file. Now sites using several languages will load considerably faster because
        +the library won't dynamically include additional files while loading.
        +
        +Also this version fixes a long-standing bug with Javascript highlighting that
        +couldn't distinguish between regular expressions and division operations.
        +
        +And as usually there were a couple of minor correctness fixes.
        +
        +Great thanks to all contributors! Keep using highlight.js.
        +
        +
        +## Version 4.3
        +
        +This version comes with two contributions from [Jason Diamond][jd]:
        +
        +- language definition for C# (yes! it was a long-missed thing!)
        +- Visual Studio-like highlighting style
        +
        +Plus there are a couple of minor bug fixes for parsing HTML and XML attributes.
        +
        +[jd]: http://jason.diamond.name/weblog/
        +
        +
        +## Version 4.2
        +
        +The biggest news is highlighting for Lisp, courtesy of Vasily Polovnyov. It's
        +somewhat experimental meaning that for highlighting "keywords" it doesn't use
        +any pre-defined set of a Lisp dialect. Instead it tries to highlight first word
        +in parentheses wherever it makes sense. I'd like to ask people programming in
        +Lisp to confirm if it's a good idea and send feedback to [the forum][f].
        +
        +Other changes:
        +
        +- Smalltalk was excluded from DEFAULT_LANGUAGES to save traffic
        +- [Vladimir Epifanov][voldmar] has implemented javascript style switcher for
        +  test.html
        +- comments now allowed inside Ruby function definition
        +- [MEL][] language from [Shuen-Huei Guan][drake]
        +- whitespace now allowed between `
        ` and ``
        +- better auto-detection of C++ and PHP
        +- HTML allows embedded VBScript (`<% .. %>`)
        +
        +[f]: http://softwaremaniacs.org/forum/highlightjs/
        +[voldmar]: http://voldmar.ya.ru/
        +[mel]: http://en.wikipedia.org/wiki/Maya_Embedded_Language
        +[drake]: http://drakeguan.org/
        +
        +
        +## Version 4.1
        +
        +Languages:
        +
        +- Bash from Vah
        +- DOS bat-files from Alexander Makarov (Sam)
        +- Diff files from Vasily Polovnyov
        +- Ini files from myself though initial idea was from Sam
        +
        +Styles:
        +
        +- Zenburn from Vladimir Epifanov, this is an imitation of a
        +  [well-known theme for Vim][zenburn].
        +- Ascetic from myself, as a realization of ideals of non-flashy highlighting:
        +  just one color in only three gradations :-)
        +
        +In other news. [One small bug][bug] was fixed, built-in keywords were added for
        +Python and C++ which improved auto-detection for the latter (it was shame that
        +[my wife's blog][alenacpp] had issues with it from time to time). And lastly
        +thanks go to Sam for getting rid of my stylistic comments in code that were
        +getting in the way of [JSMin][].
        +
        +[zenburn]: http://en.wikipedia.org/wiki/Zenburn
        +[alenacpp]: http://alenacpp.blogspot.com/
        +[bug]: http://softwaremaniacs.org/forum/viewtopic.php?id=1823
        +[jsmin]: http://code.google.com/p/jsmin-php/
        +
        +
        +## Version 4.0
        +
        +New major version is a result of vast refactoring and of many contributions.
        +
        +Visible new features:
        +
        +- Highlighting of embedded languages. Currently is implemented highlighting of
        +  Javascript and CSS inside HTML.
        +- Bundled 5 ready-made style themes!
        +
        +Invisible new features:
        +
        +- Highlight.js no longer pollutes global namespace. Only one object and one
        +  function for backward compatibility.
        +- Performance is further increased by about 15%.
        +
        +Changing of a major version number caused by a new format of language definition
        +files. If you use some third-party language files they should be updated.
        +
        +
        +## Version 3.5
        +
        +A very nice version in my opinion fixing a number of small bugs and slightly
        +increased speed in a couple of corner cases. Thanks to everybody who reports
        +bugs in he [forum][f] and by email!
        +
        +There is also a new language — XML. A custom XML formerly was detected as HTML
        +and didn't highlight custom tags. In this version I tried to make custom XML to
        +be detected and highlighted by its own rules. Which by the way include such
        +things as CDATA sections and processing instructions (``).
        +
        +[f]: http://softwaremaniacs.org/forum/viewforum.php?id=6
        +
        +
        +## Version 3.3
        +
        +[Vladimir Gubarkov][xonix] has provided an interesting and useful addition.
        +File export.html contains a little program that shows and allows to copy and
        +paste an HTML code generated by the highlighter for any code snippet. This can
        +be useful in situations when one can't use the script itself on a site.
        +
        +
        +[xonix]: http://xonixx.blogspot.com/
        +
        +
        +## Version 3.2 consists completely of contributions:
        +
        +- Vladimir Gubarkov has described SmallTalk
        +- Yuri Ivanov has described 1C
        +- Peter Leonov has packaged the highlighter as a Firefox extension
        +- Vladimir Ermakov has compiled a mod for phpBB
        +
        +Many thanks to you all!
        +
        +
        +## Version 3.1
        +
        +Three new languages are available: Django templates, SQL and Axapta. The latter
        +two are sent by [Dmitri Roudakov][1]. However I've almost entirely rewrote an
        +SQL definition but I'd never started it be it from the ground up :-)
        +
        +The engine itself has got a long awaited feature of grouping keywords
        +("keyword", "built-in function", "literal"). No more hacks!
        +
        +[1]: http://roudakov.ru/
        +
        +
        +## Version 3.0
        +
        +It is major mainly because now highlight.js has grown large and has become
        +modular. Now when you pass it a list of languages to highlight it will
        +dynamically load into a browser only those languages.
        +
        +Also:
        +
        +- Konstantin Evdokimenko of [RibKit][] project has created a highlighting for
        +  RenderMan Shading Language and RenderMan Interface Bytestream. Yay for more
        +  languages!
        +- Heuristics for C++ and HTML got better.
        +- I've implemented (at last) a correct handling of backslash escapes in C-like
        +  languages.
        +
        +There is also a small backwards incompatible change in the new version. The
        +function initHighlighting that was used to initialize highlighting instead of
        +initHighlightingOnLoad a long time ago no longer works. If you by chance still
        +use it — replace it with the new one.
        +
        +[RibKit]: http://ribkit.sourceforge.net/
        +
        +
        +## Version 2.9
        +
        +Highlight.js is a parser, not just a couple of regular expressions. That said
        +I'm glad to announce that in the new version 2.9 has support for:
        +
        +- in-string substitutions for Ruby -- `#{...}`
        +- strings from from numeric symbol codes (like #XX) for Delphi
        +
        +
        +## Version 2.8
        +
        +A maintenance release with more tuned heuristics. Fully backwards compatible.
        +
        +
        +## Version 2.7
        +
        +- Nikita Ledyaev presents highlighting for VBScript, yay!
        +- A couple of bugs with escaping in strings were fixed thanks to Mickle
        +- Ongoing tuning of heuristics
        +
        +Fixed bugs were rather unpleasant so I encourage everyone to upgrade!
        +
        +
        +## Version 2.4
        +
        +- Peter Leonov provides another improved highlighting for Perl
        +- Javascript gets a new kind of keywords — "literals". These are the words
        +  "true", "false" and "null"
        +
        +Also highlight.js homepage now lists sites that use the library. Feel free to
        +add your site by [dropping me a message][mail] until I find the time to build a
        +submit form.
        +
        +[mail]: mailto:Maniac@SoftwareManiacs.Org
        +
        +
        +## Version 2.3
        +
        +This version fixes IE breakage in previous version. My apologies to all who have
        +already downloaded that one!
        +
        +
        +## Version 2.2
        +
        +- added highlighting for Javascript
        +- at last fixed parsing of Delphi's escaped apostrophes in strings
        +- in Ruby fixed highlighting of keywords 'def' and 'class', same for 'sub' in
        +  Perl
        +
        +
        +## Version 2.0
        +
        +- Ruby support by [Anton Kovalyov][ak]
        +- speed increased by orders of magnitude due to new way of parsing
        +- this same way allows now correct highlighting of keywords in some tricky
        +  places (like keyword "End" at the end of Delphi classes)
        +
        +[ak]: http://anton.kovalyov.net/
        +
        +
        +## Version 1.0
        +
        +Version 1.0 of javascript syntax highlighter is released!
        +
        +It's the first version available with English description. Feel free to post
        +your comments and question to [highlight.js forum][forum]. And don't be afraid
        +if you find there some fancy Cyrillic letters -- it's for Russian users too :-)
        +
        +[forum]: http://softwaremaniacs.org/forum/viewforum.php?id=6
        diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/LICENSE b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/LICENSE
        new file mode 100644
        index 0000000..422deb7
        --- /dev/null
        +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/LICENSE
        @@ -0,0 +1,24 @@
        +Copyright (c) 2006, Ivan Sagalaev
        +All rights reserved.
        +Redistribution and use in source and binary forms, with or without
        +modification, are permitted provided that the following conditions are met:
        +
        +    * Redistributions of source code must retain the above copyright
        +      notice, this list of conditions and the following disclaimer.
        +    * Redistributions in binary form must reproduce the above copyright
        +      notice, this list of conditions and the following disclaimer in the
        +      documentation and/or other materials provided with the distribution.
        +    * Neither the name of highlight.js nor the names of its contributors 
        +      may be used to endorse or promote products derived from this software 
        +      without specific prior written permission.
        +
        +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
        +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
        +DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
        +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
        +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
        +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
        +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/README.ru.md b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/README.ru.md
        new file mode 100644
        index 0000000..0d0e0fe
        --- /dev/null
        +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/README.ru.md
        @@ -0,0 +1,171 @@
        +# Highlight.js
        +
        +Highlight.js нужен для подсветки синтаксиса в примерах кода в блогах,
        +форумах и вообще на любых веб-страницах. Пользоваться им очень просто,
        +потому что работает он автоматически: сам находит блоки кода, сам
        +определяет язык, сам подсвечивает.
        +
        +Автоопределением языка можно управлять, когда оно не справляется само (см.
        +дальше "Эвристика").
        +
        +
        +## Простое использование
        +
        +Подключите библиотеку и стиль на страницу и повесть вызов подсветки на
        +загрузку страницы:
        +
        +```html
        +
        +
        +
        +```
        +
        +Весь код на странице, обрамлённый в теги `
         .. 
        ` +будет автоматически подсвечен. Если вы используете другие теги или хотите +подсвечивать блоки кода динамически, читайте "Инициализацию вручную" ниже. + +- Вы можете скачать собственную версию "highlight.pack.js" или сослаться + на захостенный файл, как описано на странице загрузки: + + +- Стилевые темы можно найти в загруженном архиве или также использовать + захостенные. Чтобы сделать собственный стиль для своего сайта, вам + будет полезен [CSS classes reference][cr], который тоже есть в архиве. + +[cr]: http://highlightjs.readthedocs.org/en/latest/css-classes-reference.html + + +## node.js + +Highlight.js можно использовать в node.js. Библиотеку со всеми возможными языками можно +установить с NPM: + + npm install highlight.js + +Также её можно собрать из исходников с только теми языками, которые нужны: + + python3 tools/build.py -tnode lang1 lang2 .. + +Использование библиотеки: + +```javascript +var hljs = require('highlight.js'); + +// Если вы знаете язык +hljs.highlight(lang, code).value; + +// Автоопределение языка +hljs.highlightAuto(code).value; +``` + + +## AMD + +Highlight.js можно использовать с загрузчиком AMD-модулей. Для этого его +нужно собрать из исходников следующей командой: + +```bash +$ python3 tools/build.py -tamd lang1 lang2 .. +``` + +Она создаст файл `build/highlight.pack.js`, который является загружаемым +AMD-модулем и содержит все выбранные при сборке языки. Используется он так: + +```javascript +require(["highlight.js/build/highlight.pack"], function(hljs){ + + // Если вы знаете язык + hljs.highlight(lang, code).value; + + // Автоопределение языка + hljs.highlightAuto(code).value; +}); +``` + + +## Замена TABов + +Также вы можете заменить символы TAB ('\x09'), используемые для отступов, на +фиксированное количество пробелов или на отдельный ``, чтобы задать ему +какой-нибудь специальный стиль: + +```html + +``` + + +## Инициализация вручную + +Если вы используете другие теги для блоков кода, вы можете инициализировать их +явно с помощью функции `highlightBlock(code)`. Она принимает DOM-элемент с +текстом расцвечиваемого кода и опционально - строчку для замены символов TAB. + +Например с использованием jQuery код инициализации может выглядеть так: + +```javascript +$(document).ready(function() { + $('pre code').each(function(i, e) {hljs.highlightBlock(e)}); +}); +``` + +`highlightBlock` можно также использовать, чтобы подсветить блоки кода, +добавленные на страницу динамически. Только убедитесь, что вы не делаете этого +повторно для уже раскрашенных блоков. + +Если ваш блок кода использует `
        ` вместо переводов строки (т.е. если это не +`
        `), включите опцию `useBR`:
        +
        +```javascript
        +hljs.configure({useBR: true});
        +$('div.code').each(function(i, e) {hljs.highlightBlock(e)});
        +```
        +
        +
        +## Эвристика
        +
        +Определение языка, на котором написан фрагмент, делается с помощью
        +довольно простой эвристики: программа пытается расцветить фрагмент всеми
        +языками подряд, и для каждого языка считает количество подошедших
        +синтаксически конструкций и ключевых слов. Для какого языка нашлось больше,
        +тот и выбирается.
        +
        +Это означает, что в коротких фрагментах высока вероятность ошибки, что
        +периодически и случается. Чтобы указать язык фрагмента явно, надо написать
        +его название в виде класса к элементу ``:
        +
        +```html
        +
        ...
        +``` + +Можно использовать рекомендованные в HTML5 названия классов: +"language-html", "language-php". Также можно назначать классы на элемент +`
        `.
        +
        +Чтобы запретить расцветку фрагмента вообще, используется класс "no-highlight":
        +
        +```html
        +
        ...
        +``` + + +## Экспорт + +В файле export.html находится небольшая программка, которая показывает и дает +скопировать непосредственно HTML-код подсветки для любого заданного фрагмента кода. +Это может понадобится например на сайте, на котором нельзя подключить сам скрипт +highlight.js. + + +## Координаты + +- Версия: 8.0 +- URL: http://highlightjs.org/ + +Лицензионное соглашение читайте в файле LICENSE. +Список авторов и соавторов читайте в файле AUTHORS.ru.txt diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/highlight.pack.js b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/highlight.pack.js new file mode 100644 index 0000000..45d02a9 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/highlight.pack.js @@ -0,0 +1 @@ +var hljs=new function(){function k(v){return v.replace(/&/gm,"&").replace(//gm,">")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\n/g,""):w.nodeValue}if(t(w)=="br"){return"\n"}return d(w)}).join("")}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^language-/,"")});return v.filter(function(x){return j(x)||x=="no-highlight"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)=="br"){z+=1}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset"}function E(G){F+=""}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b=D.bK.split(" ").join("|")}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?\\b("+F.b+")\\b\\.?":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T";U+=Z+'">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode=="continuous"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,"",true):"";if(V.rB){D+=T;C=""}else{if(V.eB){D+=k(U)+T;C=""}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=""}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C="";if(W.starts){P(W.starts,"")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme "'+X+'" for mode "'+(I.cN||"")+'"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: "'+S+'"')}m(M);var I=R||M;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=""}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"
        ")}return v}function p(z){var y=d(z);var A=r(z);if(A=="no-highlight"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS("http://www.w3.org/1999/xhtml","pre");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=" hljs "+(!A&&v.language||"");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("bash",function(b){var a={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)\}/}]};var d={cN:"string",b:/"/,e:/"/,c:[b.BE,a,{cN:"variable",b:/\$\(/,e:/\)/,c:[b.BE]}]};var c={cN:"string",b:/'/,e:/'/};return{l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[b.inherit(b.TM,{b:/\w[\w\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage("cs",function(b){var a="abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield";return{k:a,c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|"},{cN:"xmlDocTag",b:""}]},b.CLCM,b.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},b.ASM,b.QSM,b.CNM,{bK:"protected public private internal",e:/[{;=]/,k:a,c:[{bK:"class namespace interface",starts:{c:[b.TM]}},{b:b.IR+"\\s*\\(",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage("ruby",function(e){var h="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor";var a={cN:"yardoctag",b:"@[A-Za-z]+"};var i={cN:"comment",v:[{b:"#",e:"$",c:[a]},{b:"^\\=begin",e:"^\\=end",c:[a],r:10},{b:"^__END__",e:"\\n$"}]};var c={cN:"subst",b:"#\\{",e:"}",k:g};var d={cN:"string",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:"%[qw]?\\(",e:"\\)"},{b:"%[qw]?\\[",e:"\\]"},{b:"%[qw]?{",e:"}"},{b:"%[qw]?<",e:">",r:10},{b:"%[qw]?/",e:"/",r:10},{b:"%[qw]?%",e:"%",r:10},{b:"%[qw]?-",e:"-",r:10},{b:"%[qw]?\\|",e:"\\|",r:10},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]};var b={cN:"params",b:"\\(",e:"\\)",k:g};var f=[d,i,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]},i]},{cN:"function",bK:"def",e:" |$|;",r:0,c:[e.inherit(e.TM,{b:h}),b,i]},{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[d,{b:h}],r:0},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:[i,{cN:"regexp",c:[e.BE,c],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];c.c=f;b.c=f;return{k:g,c:f}});hljs.registerLanguage("diff",function(a){return{c:[{cN:"chunk",r:10,v:[{b:/^\@\@ +\-\d+,\d+ +\+\d+,\d+ +\@\@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"header",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}});hljs.registerLanguage("javascript",function(a){return{aliases:["js"],k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require"},c:[{cN:"pi",b:/^\s*('|")use strict('|")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/;/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+a.IR,r:0}]}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/]+/}]}]}]};return{aliases:["html"],cI:true,c:[{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"|$)",e:">",k:{title:"style"},c:[b],starts:{e:"",rE:true,sL:"css"}},{cN:"tag",b:"|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},d,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"",c:[{cN:"title",b:"[^ /><]+",r:0},b]}]}});hljs.registerLanguage("markdown",function(a){return{c:[{cN:"header",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{cN:"horizontal_rule",b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].+?[\\)\\]]",rB:true,c:[{cN:"link_label",b:"\\[",e:"\\]",eB:true,rE:true,r:0},{cN:"link_url",b:"\\]\\(",e:"\\)",eB:true,eE:true},{cN:"link_reference",b:"\\]\\[",e:"\\]",eB:true,eE:true,}],r:10},{b:"^\\[.+\\]:",e:"$",rB:true,c:[{cN:"link_reference",b:"\\[",e:"\\]",eB:true,eE:true},{cN:"link_url",b:"\\s",e:"$"}]}]}});hljs.registerLanguage("css",function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}});hljs.registerLanguage("http",function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}});hljs.registerLanguage("java",function(b){var a="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws";return{k:a,i:/<\//,c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}],r:10},b.CLCM,b.CBLCLM,b.ASM,b.QSM,{bK:"protected public private",e:/[{;=]/,k:a,c:[{cN:"class",bK:"class interface",eW:true,i:/[:"<>]/,c:[{bK:"extends implements",r:10},b.UTM]},{b:b.UIR+"\\s*\\(",rB:true,c:[b.UTM]}]},b.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("php",function(b){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var a={cN:"preprocessor",b:/<\?(php)?|\?>/};var c={cN:"string",c:[b.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[b.CLCM,b.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"},a]},{cN:"comment",b:"__halt_compiler.+?;",eW:true,k:"__halt_compiler",l:b.UIR},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[b.BE]},a,e,{cN:"function",bK:"function",e:/[;{]/,i:"\\$|\\[|%",c:[b.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e,b.CBLCLM,c,d]}]},{cN:"class",bK:"class interface",e:"{",i:/[:\(\$"]/,c:[{bK:"extends implements",r:10},b.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[b.UTM]},{bK:"use",e:";",c:[b.UTM]},{b:"=>"},c,d]}});hljs.registerLanguage("python",function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var b={cN:"string",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/,},{b:/(b|br)"/,e:/"/,},a.ASM,a.QSM]};var d={cN:"number",r:0,v:[{b:a.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:a.CNR+"[lLjJ]?"}]};var e={cN:"params",b:/\(/,e:/\)/,c:["self",f,d,b]};var c={e:/:/,i:/[${=;\n]/,c:[a.UTM,e]};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:"function",bK:"def",r:10}),a.inherit(c,{cN:"class",bK:"class"}),{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("sql",function(a){return{cI:true,i:/[<>]/,c:[{cN:"operator",b:"\\b(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant|merge)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row merge matched database",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}});hljs.registerLanguage("ini",function(a){return{cI:true,i:/\S/,c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage("perl",function(c){var d="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var f={cN:"subst",b:"[$@]\\{",e:"\\}",k:d};var g={b:"->{",e:"}"};var a={cN:"variable",v:[{b:/\$\d/},{b:/[\$\%\@\*](\^\w\b|#\w+(\:\:\w+)*|{\w+}|\w+(\:\:\w*)*)/},{b:/[\$\%\@\*][^\s\w{]/,r:0}]};var e={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},g,{cN:"string",c:h,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[c.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[c.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+c.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[c.HCM,e,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[c.BE],r:0}]},{cN:"sub",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",r:5},{cN:"operator",b:"-\\w\\b",r:0}];f.c=b;g.c=b;return{k:d,c:b}});hljs.registerLanguage("objectivec",function(a){var d={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign self synchronized id nonatomic super unichar IBOutlet IBAction strong weak @private @protected @public @try @property @end @throw @catch @finally @synthesize @dynamic @selector @optional @required",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};var c=/[a-zA-Z@][a-zA-Z0-9_]*/;var b="@interface @class @protocol @implementation";return{k:d,l:c,i:""}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",b:"("+b.split(" ").join("|")+")\\b",e:"({|$)",k:b,l:c,c:[a.UTM]},{cN:"variable",b:"\\."+a.UIR,r:0}]}});hljs.registerLanguage("coffeescript",function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f=c.inherit(c.TM,{b:a});var e={cN:"subst",b:/#\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/"""/,e:/"""/,c:[c.BE,e]},{b:/"/,e:/"/,c:[c.BE,e]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[e,c.HCM]},{b:"//[gim]*",r:0},{b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"}]},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:true,i:/[:="\[\]]/,c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true,r:0}])}});hljs.registerLanguage("nginx",function(c){var b={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+c.UIR}]};var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[c.HCM,{cN:"string",c:[c.BE,b],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",c:[c.BE,b],v:[{b:"\\s\\^",e:"\\s|{|;",rE:true},{b:"~\\*?\\s+",e:"\\s|{|;",rE:true},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},b]};return{c:[c.HCM,{b:c.UIR+"\\s",e:";|{",rB:true,c:[c.inherit(c.UTM,{starts:a})],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("json",function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}});hljs.registerLanguage("apache",function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,c:[a.HCM,{cN:"tag",b:""},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,a.QSM]}}],i:/\S/}});hljs.registerLanguage("cpp",function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf"};return{aliases:["c"],k:b,i:"",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}});hljs.registerLanguage("makefile",function(a){var b={cN:"variable",b:/\$\(/,e:/\)/,c:[a.BE]};return{c:[a.HCM,{b:/^\w+\s*\W*=/,rB:true,r:0,starts:{cN:"constant",e:/\s*\W*=/,eE:true,starts:{e:/$/,r:0,c:[b],}}},{cN:"title",b:/^[\w]+:\s*$/},{cN:"phony",b:/^\.PHONY:/,e:/$/,k:".PHONY",l:/[\.\w]+/},{b:/^\t+/,e:/$/,c:[a.QSM,b]}]}}); diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/arta.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/arta.css new file mode 100644 index 0000000..02db86a --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/arta.css @@ -0,0 +1,160 @@ +/* +Date: 17.V.2011 +Author: pumbur +*/ + +.hljs +{ + display: block; padding: 0.5em; + background: #222; +} + +.profile .hljs-header *, +.ini .hljs-title, +.nginx .hljs-title +{ + color: #fff; +} + +.hljs-comment, +.hljs-javadoc, +.hljs-preprocessor, +.hljs-preprocessor .hljs-title, +.hljs-pragma, +.hljs-shebang, +.profile .hljs-summary, +.diff, +.hljs-pi, +.hljs-doctype, +.hljs-tag, +.hljs-template_comment, +.css .hljs-rules, +.tex .hljs-special +{ + color: #444; +} + +.hljs-string, +.hljs-symbol, +.diff .hljs-change, +.hljs-regexp, +.xml .hljs-attribute, +.smalltalk .hljs-char, +.xml .hljs-value, +.ini .hljs-value, +.clojure .hljs-attribute, +.coffeescript .hljs-attribute +{ + color: #ffcc33; +} + +.hljs-number, +.hljs-addition +{ + color: #00cc66; +} + +.hljs-built_in, +.hljs-literal, +.vhdl .hljs-typename, +.go .hljs-constant, +.go .hljs-typename, +.ini .hljs-keyword, +.lua .hljs-title, +.perl .hljs-variable, +.php .hljs-variable, +.mel .hljs-variable, +.django .hljs-variable, +.css .funtion, +.smalltalk .method, +.hljs-hexcolor, +.hljs-important, +.hljs-flow, +.hljs-inheritance, +.parser3 .hljs-variable +{ + color: #32AAEE; +} + +.hljs-keyword, +.hljs-tag .hljs-title, +.css .hljs-tag, +.css .hljs-class, +.css .hljs-id, +.css .hljs-pseudo, +.css .hljs-attr_selector, +.lisp .hljs-title, +.clojure .hljs-built_in, +.hljs-winutils, +.tex .hljs-command, +.hljs-request, +.hljs-status +{ + color: #6644aa; +} + +.hljs-title, +.ruby .hljs-constant, +.vala .hljs-constant, +.hljs-parent, +.hljs-deletion, +.hljs-template_tag, +.css .hljs-keyword, +.objectivec .hljs-class .hljs-id, +.smalltalk .hljs-class, +.lisp .hljs-keyword, +.apache .hljs-tag, +.nginx .hljs-variable, +.hljs-envvar, +.bash .hljs-variable, +.go .hljs-built_in, +.vbscript .hljs-built_in, +.lua .hljs-built_in, +.rsl .hljs-built_in, +.tail, +.avrasm .hljs-label, +.tex .hljs-formula, +.tex .hljs-formula * +{ + color: #bb1166; +} + +.hljs-yardoctag, +.hljs-phpdoc, +.profile .hljs-header, +.ini .hljs-title, +.apache .hljs-tag, +.parser3 .hljs-title +{ + font-weight: bold; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata +{ + opacity: 0.6; +} + +.hljs, +.javascript, +.css, +.xml, +.hljs-subst, +.diff .hljs-chunk, +.css .hljs-value, +.css .hljs-attribute, +.lisp .hljs-string, +.lisp .hljs-number, +.tail .hljs-params, +.hljs-container, +.haskell *, +.erlang *, +.erlang_repl * +{ + color: #aaa; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/ascetic.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/ascetic.css new file mode 100644 index 0000000..532d683 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/ascetic.css @@ -0,0 +1,50 @@ +/* + +Original style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; padding: 0.5em; + background: white; color: black; +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-filter .hljs-argument, +.hljs-addition, +.hljs-change, +.apache .hljs-tag, +.apache .hljs-cbracket, +.nginx .hljs-built_in, +.tex .hljs-formula { + color: #888; +} + +.hljs-comment, +.hljs-template_comment, +.hljs-shebang, +.hljs-doctype, +.hljs-pi, +.hljs-javadoc, +.hljs-deletion, +.apache .hljs-sqbracket { + color: #CCC; +} + +.hljs-keyword, +.hljs-tag .hljs-title, +.ini .hljs-title, +.lisp .hljs-title, +.clojure .hljs-title, +.http .hljs-title, +.nginx .hljs-title, +.css .hljs-tag, +.hljs-winutils, +.hljs-flow, +.apache .hljs-tag, +.tex .hljs-command, +.hljs-request, +.hljs-status { + font-weight: bold; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.dark.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.dark.css new file mode 100644 index 0000000..a25b308 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.dark.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Dune Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Dune Dark Comment */ +.hljs-comment, +.hljs-title { + color: #999580; +} + +/* Atelier Dune Dark Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #d73737; +} + +/* Atelier Dune Dark Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #b65611; +} + +/* Atelier Dune Dark Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #cfb017; +} + +/* Atelier Dune Dark Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #60ac39; +} + +/* Atelier Dune Dark Aqua */ +.css .hljs-hexcolor { + color: #1fad83; +} + +/* Atelier Dune Dark Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #6684e1; +} + +/* Atelier Dune Dark Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b854d4; +} + +.hljs { + display: block; + background: #292824; + color: #a6a28c; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.light.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.light.css new file mode 100644 index 0000000..66483c9 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.light.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Dune Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Dune Light Comment */ +.hljs-comment, +.hljs-title { + color: #7d7a68; +} + +/* Atelier Dune Light Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #d73737; +} + +/* Atelier Dune Light Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #b65611; +} + +/* Atelier Dune Light Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #cfb017; +} + +/* Atelier Dune Light Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #60ac39; +} + +/* Atelier Dune Light Aqua */ +.css .hljs-hexcolor { + color: #1fad83; +} + +/* Atelier Dune Light Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #6684e1; +} + +/* Atelier Dune Light Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b854d4; +} + +.hljs { + display: block; + background: #fefbec; + color: #6e6b5e; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.dark.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.dark.css new file mode 100644 index 0000000..9331e41 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.dark.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Forest Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Forest Dark Comment */ +.hljs-comment, +.hljs-title { + color: #9c9491; +} + +/* Atelier Forest Dark Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #f22c40; +} + +/* Atelier Forest Dark Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #df5320; +} + +/* Atelier Forest Dark Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #d5911a; +} + +/* Atelier Forest Dark Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #5ab738; +} + +/* Atelier Forest Dark Aqua */ +.css .hljs-hexcolor { + color: #00ad9c; +} + +/* Atelier Forest Dark Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #407ee7; +} + +/* Atelier Forest Dark Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #6666ea; +} + +.hljs { + display: block; + background: #2c2421; + color: #a8a19f; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.light.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.light.css new file mode 100644 index 0000000..9898ec4 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.light.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Forest Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Forest Light Comment */ +.hljs-comment, +.hljs-title { + color: #766e6b; +} + +/* Atelier Forest Light Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #f22c40; +} + +/* Atelier Forest Light Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #df5320; +} + +/* Atelier Forest Light Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #d5911a; +} + +/* Atelier Forest Light Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #5ab738; +} + +/* Atelier Forest Light Aqua */ +.css .hljs-hexcolor { + color: #00ad9c; +} + +/* Atelier Forest Light Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #407ee7; +} + +/* Atelier Forest Light Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #6666ea; +} + +.hljs { + display: block; + background: #f1efee; + color: #68615e; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.dark.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.dark.css new file mode 100644 index 0000000..1544f62 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.dark.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Heath Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Heath Dark Comment */ +.hljs-comment, +.hljs-title { + color: #9e8f9e; +} + +/* Atelier Heath Dark Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #ca402b; +} + +/* Atelier Heath Dark Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #a65926; +} + +/* Atelier Heath Dark Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #bb8a35; +} + +/* Atelier Heath Dark Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #379a37; +} + +/* Atelier Heath Dark Aqua */ +.css .hljs-hexcolor { + color: #159393; +} + +/* Atelier Heath Dark Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #516aec; +} + +/* Atelier Heath Dark Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #7b59c0; +} + +.hljs { + display: block; + background: #292329; + color: #ab9bab; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.light.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.light.css new file mode 100644 index 0000000..c45bfe8 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.light.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Heath Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Heath Light Comment */ +.hljs-comment, +.hljs-title { + color: #776977; +} + +/* Atelier Heath Light Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #ca402b; +} + +/* Atelier Heath Light Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #a65926; +} + +/* Atelier Heath Light Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #bb8a35; +} + +/* Atelier Heath Light Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #379a37; +} + +/* Atelier Heath Light Aqua */ +.css .hljs-hexcolor { + color: #159393; +} + +/* Atelier Heath Light Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #516aec; +} + +/* Atelier Heath Light Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #7b59c0; +} + +.hljs { + display: block; + background: #f7f3f7; + color: #695d69; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.dark.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.dark.css new file mode 100644 index 0000000..f7b6138 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.dark.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Lakeside Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside/) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Lakeside Dark Comment */ +.hljs-comment, +.hljs-title { + color: #7195a8; +} + +/* Atelier Lakeside Dark Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #d22d72; +} + +/* Atelier Lakeside Dark Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #935c25; +} + +/* Atelier Lakeside Dark Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #8a8a0f; +} + +/* Atelier Lakeside Dark Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #568c3b; +} + +/* Atelier Lakeside Dark Aqua */ +.css .hljs-hexcolor { + color: #2d8f6f; +} + +/* Atelier Lakeside Dark Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #257fad; +} + +/* Atelier Lakeside Dark Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #5d5db1; +} + +.hljs { + display: block; + background: #1f292e; + color: #7ea2b4; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.light.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.light.css new file mode 100644 index 0000000..955b333 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.light.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Lakeside Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside/) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Lakeside Light Comment */ +.hljs-comment, +.hljs-title { + color: #5a7b8c; +} + +/* Atelier Lakeside Light Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #d22d72; +} + +/* Atelier Lakeside Light Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #935c25; +} + +/* Atelier Lakeside Light Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #8a8a0f; +} + +/* Atelier Lakeside Light Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #568c3b; +} + +/* Atelier Lakeside Light Aqua */ +.css .hljs-hexcolor { + color: #2d8f6f; +} + +/* Atelier Lakeside Light Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #257fad; +} + +/* Atelier Lakeside Light Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #5d5db1; +} + +.hljs { + display: block; + background: #ebf8ff; + color: #516d7b; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.dark.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.dark.css new file mode 100644 index 0000000..5688b15 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.dark.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Seaside Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside/) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Seaside Dark Comment */ +.hljs-comment, +.hljs-title { + color: #809980; +} + +/* Atelier Seaside Dark Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #e6193c; +} + +/* Atelier Seaside Dark Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #87711d; +} + +/* Atelier Seaside Dark Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #c3c322; +} + +/* Atelier Seaside Dark Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #29a329; +} + +/* Atelier Seaside Dark Aqua */ +.css .hljs-hexcolor { + color: #1999b3; +} + +/* Atelier Seaside Dark Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #3d62f5; +} + +/* Atelier Seaside Dark Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #ad2bee; +} + +.hljs { + display: block; + background: #242924; + color: #8ca68c; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.light.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.light.css new file mode 100644 index 0000000..8731808 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.light.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Seaside Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside/) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Seaside Light Comment */ +.hljs-comment, +.hljs-title { + color: #687d68; +} + +/* Atelier Seaside Light Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #e6193c; +} + +/* Atelier Seaside Light Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #87711d; +} + +/* Atelier Seaside Light Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #c3c322; +} + +/* Atelier Seaside Light Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #29a329; +} + +/* Atelier Seaside Light Aqua */ +.css .hljs-hexcolor { + color: #1999b3; +} + +/* Atelier Seaside Light Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #3d62f5; +} + +/* Atelier Seaside Light Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #ad2bee; +} + +.hljs { + display: block; + background: #f0fff0; + color: #5e6e5e; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_paper.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_paper.css new file mode 100644 index 0000000..f9541c3 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_paper.css @@ -0,0 +1,105 @@ +/* + +Brown Paper style from goldblog.com.ua (c) Zaripov Yura + +*/ + +.hljs { + display: block; padding: 0.5em; + background:#b7a68e url(./brown_papersq.png); +} + +.hljs-keyword, +.hljs-literal, +.hljs-change, +.hljs-winutils, +.hljs-flow, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.tex .hljs-special, +.hljs-request, +.hljs-status { + color:#005599; + font-weight:bold; +} + +.hljs, +.hljs-subst, +.hljs-tag .hljs-keyword { + color: #363C69; +} + +.hljs-string, +.hljs-title, +.haskell .hljs-type, +.hljs-tag .hljs-value, +.css .hljs-rules .hljs-value, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.ruby .hljs-class .hljs-parent, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-javadoc, +.ruby .hljs-string, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-addition, +.hljs-stream, +.hljs-envvar, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-number { + color: #2C009F; +} + +.hljs-comment, +.java .hljs-annotation, +.python .hljs-decorator, +.hljs-template_comment, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-shebang, +.apache .hljs-sqbracket, +.nginx .hljs-built_in, +.tex .hljs-formula { + color: #802022; +} + +.hljs-keyword, +.hljs-literal, +.css .hljs-id, +.hljs-phpdoc, +.hljs-title, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.diff .hljs-header, +.hljs-chunk, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.tex .hljs-command { + font-weight: bold; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.8; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_papersq.png b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_papersq.png new file mode 100644 index 0000000..3813903 Binary files /dev/null and b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_papersq.png differ diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/dark.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/dark.css new file mode 100644 index 0000000..8e76cdd --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/dark.css @@ -0,0 +1,105 @@ +/* + +Dark style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #444; +} + +.hljs-keyword, +.hljs-literal, +.hljs-change, +.hljs-winutils, +.hljs-flow, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.tex .hljs-special { + color: white; +} + +.hljs, +.hljs-subst { + color: #DDD; +} + +.hljs-string, +.hljs-title, +.haskell .hljs-type, +.ini .hljs-title, +.hljs-tag .hljs-value, +.css .hljs-rules .hljs-value, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.ruby .hljs-class .hljs-parent, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-javadoc, +.ruby .hljs-string, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-addition, +.hljs-stream, +.hljs-envvar, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-command, +.hljs-prompt, +.coffeescript .hljs-attribute { + color: #D88; +} + +.hljs-comment, +.java .hljs-annotation, +.python .hljs-decorator, +.hljs-template_comment, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-shebang, +.apache .hljs-sqbracket, +.tex .hljs-formula { + color: #777; +} + +.hljs-keyword, +.hljs-literal, +.hljs-title, +.css .hljs-id, +.hljs-phpdoc, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.diff .hljs-header, +.hljs-chunk, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.tex .hljs-special, +.hljs-request, +.hljs-status { + font-weight: bold; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/default.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/default.css new file mode 100644 index 0000000..3d8485b --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/default.css @@ -0,0 +1,153 @@ +/* + +Original style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #F0F0F0; +} + +.hljs, +.hljs-subst, +.hljs-tag .hljs-title, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title { + color: black; +} + +.hljs-string, +.hljs-title, +.hljs-constant, +.hljs-parent, +.hljs-tag .hljs-value, +.hljs-rules .hljs-value, +.hljs-rules .hljs-value .hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.haml .hljs-symbol, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-aggregate, +.hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-addition, +.hljs-flow, +.hljs-stream, +.bash .hljs-variable, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-command, +.tex .hljs-special, +.erlang_repl .hljs-function_or_atom, +.asciidoc .hljs-header, +.markdown .hljs-header, +.coffeescript .hljs-attribute { + color: #800; +} + +.smartquote, +.hljs-comment, +.hljs-annotation, +.hljs-template_comment, +.diff .hljs-header, +.hljs-chunk, +.asciidoc .hljs-blockquote, +.markdown .hljs-blockquote { + color: #888; +} + +.hljs-number, +.hljs-date, +.hljs-regexp, +.hljs-literal, +.hljs-hexcolor, +.smalltalk .hljs-symbol, +.smalltalk .hljs-char, +.go .hljs-constant, +.hljs-change, +.lasso .hljs-variable, +.makefile .hljs-variable, +.asciidoc .hljs-bullet, +.markdown .hljs-bullet, +.asciidoc .hljs-link_url, +.markdown .hljs-link_url { + color: #080; +} + +.hljs-label, +.hljs-javadoc, +.ruby .hljs-string, +.hljs-decorator, +.hljs-filter .hljs-argument, +.hljs-localvars, +.hljs-array, +.hljs-attr_selector, +.hljs-important, +.hljs-pseudo, +.hljs-pi, +.haml .hljs-bullet, +.hljs-doctype, +.hljs-deletion, +.hljs-envvar, +.hljs-shebang, +.apache .hljs-sqbracket, +.nginx .hljs-built_in, +.tex .hljs-formula, +.erlang_repl .hljs-reserved, +.hljs-prompt, +.asciidoc .hljs-link_label, +.markdown .hljs-link_label, +.vhdl .hljs-attribute, +.clojure .hljs-attribute, +.asciidoc .hljs-attribute, +.lasso .hljs-attribute, +.coffeescript .hljs-property, +.hljs-phony { + color: #88F +} + +.hljs-keyword, +.hljs-id, +.hljs-title, +.hljs-built_in, +.hljs-aggregate, +.css .hljs-tag, +.hljs-javadoctag, +.hljs-phpdoc, +.hljs-yardoctag, +.smalltalk .hljs-class, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.go .hljs-typename, +.tex .hljs-command, +.asciidoc .hljs-strong, +.markdown .hljs-strong, +.hljs-request, +.hljs-status { + font-weight: bold; +} + +.asciidoc .hljs-emphasis, +.markdown .hljs-emphasis { + font-style: italic; +} + +.nginx .hljs-built_in { + font-weight: normal; +} + +.coffeescript .javascript, +.javascript .xml, +.lasso .markup, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/docco.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/docco.css new file mode 100644 index 0000000..993fd26 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/docco.css @@ -0,0 +1,132 @@ +/* +Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars) +*/ + +.hljs { + display: block; padding: 0.5em; + color: #000; + background: #f8f8ff +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-javadoc { + color: #408080; + font-style: italic +} + +.hljs-keyword, +.assignment, +.hljs-literal, +.css .rule .hljs-keyword, +.hljs-winutils, +.javascript .hljs-title, +.lisp .hljs-title, +.hljs-subst { + color: #954121; +} + +.hljs-number, +.hljs-hexcolor { + color: #40a070 +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula { + color: #219161; +} + +.hljs-title, +.hljs-id { + color: #19469D; +} +.hljs-params { + color: #00F; +} + +.javascript .hljs-title, +.lisp .hljs-title, +.hljs-subst { + font-weight: normal +} + +.hljs-class .hljs-title, +.haskell .hljs-label, +.tex .hljs-command { + color: #458; + font-weight: bold +} + +.hljs-tag, +.hljs-tag .hljs-title, +.hljs-rules .hljs-property, +.django .hljs-tag .hljs-keyword { + color: #000080; + font-weight: normal +} + +.hljs-attribute, +.hljs-variable, +.instancevar, +.lisp .hljs-body { + color: #008080 +} + +.hljs-regexp { + color: #B68 +} + +.hljs-class { + color: #458; + font-weight: bold +} + +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.ruby .hljs-symbol .hljs-keyword, +.ruby .hljs-symbol .keymethods, +.lisp .hljs-keyword, +.tex .hljs-special, +.input_number { + color: #990073 +} + +.builtin, +.constructor, +.hljs-built_in, +.lisp .hljs-title { + color: #0086b3 +} + +.hljs-preprocessor, +.hljs-pragma, +.hljs-pi, +.hljs-doctype, +.hljs-shebang, +.hljs-cdata { + color: #999; + font-weight: bold +} + +.hljs-deletion { + background: #fdd +} + +.hljs-addition { + background: #dfd +} + +.diff .hljs-change { + background: #0086b3 +} + +.hljs-chunk { + color: #aaa +} + +.tex .hljs-formula { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/far.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/far.css new file mode 100644 index 0000000..ecac3c9 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/far.css @@ -0,0 +1,113 @@ +/* + +FAR Style (c) MajestiC + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #000080; +} + +.hljs, +.hljs-subst { + color: #0FF; +} + +.hljs-string, +.ruby .hljs-string, +.haskell .hljs-type, +.hljs-tag .hljs-value, +.css .hljs-rules .hljs-value, +.css .hljs-rules .hljs-value .hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-addition, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-command, +.clojure .hljs-title, +.coffeescript .hljs-attribute { + color: #FF0; +} + +.hljs-keyword, +.css .hljs-id, +.hljs-title, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.xml .hljs-tag .hljs-title, +.hljs-winutils, +.hljs-flow, +.hljs-change, +.hljs-envvar, +.bash .hljs-variable, +.tex .hljs-special, +.clojure .hljs-built_in { + color: #FFF; +} + +.hljs-comment, +.hljs-phpdoc, +.hljs-javadoc, +.java .hljs-annotation, +.hljs-template_comment, +.hljs-deletion, +.apache .hljs-sqbracket, +.tex .hljs-formula { + color: #888; +} + +.hljs-number, +.hljs-date, +.hljs-regexp, +.hljs-literal, +.smalltalk .hljs-symbol, +.smalltalk .hljs-char, +.clojure .hljs-attribute { + color: #0F0; +} + +.python .hljs-decorator, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.xml .hljs-pi, +.diff .hljs-header, +.hljs-chunk, +.hljs-shebang, +.nginx .hljs-built_in, +.hljs-prompt { + color: #008080; +} + +.hljs-keyword, +.css .hljs-id, +.hljs-title, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.hljs-winutils, +.hljs-flow, +.apache .hljs-tag, +.nginx .hljs-built_in, +.tex .hljs-command, +.tex .hljs-special, +.hljs-request, +.hljs-status { + font-weight: bold; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/foundation.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/foundation.css new file mode 100644 index 0000000..bc8d4df --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/foundation.css @@ -0,0 +1,133 @@ +/* +Description: Foundation 4 docs style for highlight.js +Author: Dan Allen +Website: http://foundation.zurb.com/docs/ +Version: 1.0 +Date: 2013-04-02 +*/ + +.hljs { + display: block; padding: 0.5em; + background: #eee; +} + +.hljs-header, +.hljs-decorator, +.hljs-annotation { + color: #000077; +} + +.hljs-horizontal_rule, +.hljs-link_url, +.hljs-emphasis, +.hljs-attribute { + color: #070; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-link_label, +.hljs-strong, +.hljs-value, +.hljs-string, +.scss .hljs-value .hljs-string { + color: #d14; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-blockquote, +.hljs-comment { + color: #998; + font-style: italic; +} + +.asciidoc .hljs-title, +.hljs-function .hljs-title { + color: #900; +} + +.hljs-class { + color: #458; +} + +.hljs-id, +.hljs-pseudo, +.hljs-constant, +.hljs-hexcolor { + color: teal; +} + +.hljs-variable { + color: #336699; +} + +.hljs-bullet, +.hljs-javadoc { + color: #997700; +} + +.hljs-pi, +.hljs-doctype { + color: #3344bb; +} + +.hljs-code, +.hljs-number { + color: #099; +} + +.hljs-important { + color: #f00; +} + +.smartquote, +.hljs-label { + color: #970; +} + +.hljs-preprocessor, +.hljs-pragma { + color: #579; +} + +.hljs-reserved, +.hljs-keyword, +.scss .hljs-value { + color: #000; +} + +.hljs-regexp { + background-color: #fff0ff; + color: #880088; +} + +.hljs-symbol { + color: #990073; +} + +.hljs-symbol .hljs-string { + color: #a60; +} + +.hljs-tag { + color: #007700; +} + +.hljs-at_rule, +.hljs-at_rule .hljs-keyword { + color: #088; +} + +.hljs-at_rule .hljs-preprocessor { + color: #808; +} + +.scss .hljs-tag, +.scss .hljs-attribute { + color: #339; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/github.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/github.css new file mode 100644 index 0000000..71967a3 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/github.css @@ -0,0 +1,125 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; padding: 0.5em; + color: #333; + background: #f8f8f8 +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-javadoc { + color: #998; + font-style: italic +} + +.hljs-keyword, +.css .rule .hljs-keyword, +.hljs-winutils, +.javascript .hljs-title, +.nginx .hljs-title, +.hljs-subst, +.hljs-request, +.hljs-status { + color: #333; + font-weight: bold +} + +.hljs-number, +.hljs-hexcolor, +.ruby .hljs-constant { + color: #099; +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula { + color: #d14 +} + +.hljs-title, +.hljs-id, +.coffeescript .hljs-params, +.scss .hljs-preprocessor { + color: #900; + font-weight: bold +} + +.javascript .hljs-title, +.lisp .hljs-title, +.clojure .hljs-title, +.hljs-subst { + font-weight: normal +} + +.hljs-class .hljs-title, +.haskell .hljs-type, +.vhdl .hljs-literal, +.tex .hljs-command { + color: #458; + font-weight: bold +} + +.hljs-tag, +.hljs-tag .hljs-title, +.hljs-rules .hljs-property, +.django .hljs-tag .hljs-keyword { + color: #000080; + font-weight: normal +} + +.hljs-attribute, +.hljs-variable, +.lisp .hljs-body { + color: #008080 +} + +.hljs-regexp { + color: #009926 +} + +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.lisp .hljs-keyword, +.tex .hljs-special, +.hljs-prompt { + color: #990073 +} + +.hljs-built_in, +.lisp .hljs-title, +.clojure .hljs-built_in { + color: #0086b3 +} + +.hljs-preprocessor, +.hljs-pragma, +.hljs-pi, +.hljs-doctype, +.hljs-shebang, +.hljs-cdata { + color: #999; + font-weight: bold +} + +.hljs-deletion { + background: #fdd +} + +.hljs-addition { + background: #dfd +} + +.diff .hljs-change { + background: #0086b3 +} + +.hljs-chunk { + color: #aaa +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/googlecode.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/googlecode.css new file mode 100644 index 0000000..45b8b3b --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/googlecode.css @@ -0,0 +1,147 @@ +/* + +Google Code style (c) Aahan Krish + +*/ + +.hljs { + display: block; padding: 0.5em; + background: white; color: black; +} + +.hljs-comment, +.hljs-template_comment, +.hljs-javadoc, +.hljs-comment * { + color: #800; +} + +.hljs-keyword, +.method, +.hljs-list .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.hljs-tag .hljs-title, +.setting .hljs-value, +.hljs-winutils, +.tex .hljs-command, +.http .hljs-title, +.hljs-request, +.hljs-status { + color: #008; +} + +.hljs-envvar, +.tex .hljs-special { + color: #660; +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-cdata, +.hljs-filter .hljs-argument, +.hljs-attr_selector, +.apache .hljs-cbracket, +.hljs-date, +.hljs-regexp, +.coffeescript .hljs-attribute { + color: #080; +} + +.hljs-sub .hljs-identifier, +.hljs-pi, +.hljs-tag, +.hljs-tag .hljs-keyword, +.hljs-decorator, +.ini .hljs-title, +.hljs-shebang, +.hljs-prompt, +.hljs-hexcolor, +.hljs-rules .hljs-value, +.css .hljs-value .hljs-number, +.hljs-literal, +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-number, +.css .hljs-function, +.clojure .hljs-attribute { + color: #066; +} + +.hljs-class .hljs-title, +.haskell .hljs-type, +.smalltalk .hljs-class, +.hljs-javadoctag, +.hljs-yardoctag, +.hljs-phpdoc, +.hljs-typename, +.hljs-tag .hljs-attribute, +.hljs-doctype, +.hljs-class .hljs-id, +.hljs-built_in, +.setting, +.hljs-params, +.hljs-variable, +.clojure .hljs-title { + color: #606; +} + +.css .hljs-tag, +.hljs-rules .hljs-property, +.hljs-pseudo, +.hljs-subst { + color: #000; +} + +.css .hljs-class, +.css .hljs-id { + color: #9B703F; +} + +.hljs-value .hljs-important { + color: #ff7700; + font-weight: bold; +} + +.hljs-rules .hljs-keyword { + color: #C5AF75; +} + +.hljs-annotation, +.apache .hljs-sqbracket, +.nginx .hljs-built_in { + color: #9B859D; +} + +.hljs-preprocessor, +.hljs-preprocessor *, +.hljs-pragma { + color: #444; +} + +.tex .hljs-formula { + background-color: #EEE; + font-style: italic; +} + +.diff .hljs-header, +.hljs-chunk { + color: #808080; + font-weight: bold; +} + +.diff .hljs-change { + background-color: #BCCFF9; +} + +.hljs-addition { + background-color: #BAEEBA; +} + +.hljs-deletion { + background-color: #FFC8BD; +} + +.hljs-comment .hljs-yardoctag { + font-weight: bold; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/idea.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/idea.css new file mode 100644 index 0000000..77352f4 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/idea.css @@ -0,0 +1,122 @@ +/* + +Intellij Idea-like styling (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; padding: 0.5em; + color: #000; + background: #fff; +} + +.hljs-subst, +.hljs-title { + font-weight: normal; + color: #000; +} + +.hljs-comment, +.hljs-template_comment, +.hljs-javadoc, +.diff .hljs-header { + color: #808080; + font-style: italic; +} + +.hljs-annotation, +.hljs-decorator, +.hljs-preprocessor, +.hljs-pragma, +.hljs-doctype, +.hljs-pi, +.hljs-chunk, +.hljs-shebang, +.apache .hljs-cbracket, +.hljs-prompt, +.http .hljs-title { + color: #808000; +} + +.hljs-tag, +.hljs-pi { + background: #efefef; +} + +.hljs-tag .hljs-title, +.hljs-id, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-literal, +.hljs-keyword, +.hljs-hexcolor, +.css .hljs-function, +.ini .hljs-title, +.css .hljs-class, +.hljs-list .hljs-title, +.clojure .hljs-title, +.nginx .hljs-title, +.tex .hljs-command, +.hljs-request, +.hljs-status { + font-weight: bold; + color: #000080; +} + +.hljs-attribute, +.hljs-rules .hljs-keyword, +.hljs-number, +.hljs-date, +.hljs-regexp, +.tex .hljs-special { + font-weight: bold; + color: #0000ff; +} + +.hljs-number, +.hljs-regexp { + font-weight: normal; +} + +.hljs-string, +.hljs-value, +.hljs-filter .hljs-argument, +.css .hljs-function .hljs-params, +.apache .hljs-tag { + color: #008000; + font-weight: bold; +} + +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-char, +.tex .hljs-formula { + color: #000; + background: #d0eded; + font-style: italic; +} + +.hljs-phpdoc, +.hljs-yardoctag, +.hljs-javadoctag { + text-decoration: underline; +} + +.hljs-variable, +.hljs-envvar, +.apache .hljs-sqbracket, +.nginx .hljs-built_in { + color: #660e7a; +} + +.hljs-addition { + background: #baeeba; +} + +.hljs-deletion { + background: #ffc8bd; +} + +.diff .hljs-change { + background: #bccff9; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/ir_black.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/ir_black.css new file mode 100644 index 0000000..cc64ef5 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/ir_black.css @@ -0,0 +1,105 @@ +/* + IR_Black style (c) Vasily Mikhailitchenko +*/ + +.hljs { + display: block; padding: 0.5em; + background: #000; color: #f8f8f8; +} + +.hljs-shebang, +.hljs-comment, +.hljs-template_comment, +.hljs-javadoc { + color: #7c7c7c; +} + +.hljs-keyword, +.hljs-tag, +.tex .hljs-command, +.hljs-request, +.hljs-status, +.clojure .hljs-attribute { + color: #96CBFE; +} + +.hljs-sub .hljs-keyword, +.method, +.hljs-list .hljs-title, +.nginx .hljs-title { + color: #FFFFB6; +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-cdata, +.hljs-filter .hljs-argument, +.hljs-attr_selector, +.apache .hljs-cbracket, +.hljs-date, +.coffeescript .hljs-attribute { + color: #A8FF60; +} + +.hljs-subst { + color: #DAEFA3; +} + +.hljs-regexp { + color: #E9C062; +} + +.hljs-title, +.hljs-sub .hljs-identifier, +.hljs-pi, +.hljs-decorator, +.tex .hljs-special, +.haskell .hljs-type, +.hljs-constant, +.smalltalk .hljs-class, +.hljs-javadoctag, +.hljs-yardoctag, +.hljs-phpdoc, +.nginx .hljs-built_in { + color: #FFFFB6; +} + +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-number, +.hljs-variable, +.vbscript, +.hljs-literal { + color: #C6C5FE; +} + +.css .hljs-tag { + color: #96CBFE; +} + +.css .hljs-rules .hljs-property, +.css .hljs-id { + color: #FFFFB6; +} + +.css .hljs-class { + color: #FFF; +} + +.hljs-hexcolor { + color: #C6C5FE; +} + +.hljs-number { + color:#FF73FD; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.7; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/magula.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/magula.css new file mode 100644 index 0000000..45aff24 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/magula.css @@ -0,0 +1,122 @@ +/* +Description: Magula style for highligh.js +Author: Ruslan Keba +Website: http://rukeba.com/ +Version: 1.0 +Date: 2009-01-03 +Music: Aphex Twin / Xtal +*/ + +.hljs { + display: block; padding: 0.5em; + background-color: #f4f4f4; +} + +.hljs, +.hljs-subst, +.lisp .hljs-title, +.clojure .hljs-built_in { + color: black; +} + +.hljs-string, +.hljs-title, +.hljs-parent, +.hljs-tag .hljs-value, +.hljs-rules .hljs-value, +.hljs-rules .hljs-value .hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-aggregate, +.hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-addition, +.hljs-flow, +.hljs-stream, +.bash .hljs-variable, +.apache .hljs-cbracket, +.coffeescript .hljs-attribute { + color: #050; +} + +.hljs-comment, +.hljs-annotation, +.hljs-template_comment, +.diff .hljs-header, +.hljs-chunk { + color: #777; +} + +.hljs-number, +.hljs-date, +.hljs-regexp, +.hljs-literal, +.smalltalk .hljs-symbol, +.smalltalk .hljs-char, +.hljs-change, +.tex .hljs-special { + color: #800; +} + +.hljs-label, +.hljs-javadoc, +.ruby .hljs-string, +.hljs-decorator, +.hljs-filter .hljs-argument, +.hljs-localvars, +.hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-envvar, +.hljs-shebang, +.apache .hljs-sqbracket, +.nginx .hljs-built_in, +.tex .hljs-formula, +.hljs-prompt, +.clojure .hljs-attribute { + color: #00e; +} + +.hljs-keyword, +.hljs-id, +.hljs-phpdoc, +.hljs-title, +.hljs-built_in, +.hljs-aggregate, +.smalltalk .hljs-class, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.xml .hljs-tag, +.tex .hljs-command, +.hljs-request, +.hljs-status { + font-weight: bold; + color: navy; +} + +.nginx .hljs-built_in { + font-weight: normal; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + +/* --- */ +.apache .hljs-tag { + font-weight: bold; + color: blue; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/mono-blue.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/mono-blue.css new file mode 100644 index 0000000..4152d82 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/mono-blue.css @@ -0,0 +1,62 @@ +/* + Five-color theme from a single blue hue. +*/ +.hljs { + display: block; padding: 0.5em; + background: #EAEEF3; color: #00193A; +} + +.hljs-keyword, +.hljs-title, +.hljs-important, +.hljs-request, +.hljs-header, +.hljs-javadoctag { + font-weight: bold; +} + +.hljs-comment, +.hljs-chunk, +.hljs-template_comment { + color: #738191; +} + +.hljs-string, +.hljs-title, +.hljs-parent, +.hljs-built_in, +.hljs-literal, +.hljs-filename, +.hljs-value, +.hljs-addition, +.hljs-tag, +.hljs-argument, +.hljs-link_label, +.hljs-blockquote, +.hljs-header { + color: #0048AB; +} + +.hljs-decorator, +.hljs-prompt, +.hljs-yardoctag, +.hljs-subst, +.hljs-symbol, +.hljs-doctype, +.hljs-regexp, +.hljs-preprocessor, +.hljs-pragma, +.hljs-pi, +.hljs-attribute, +.hljs-attr_selector, +.hljs-javadoc, +.hljs-xmlDocTag, +.hljs-deletion, +.hljs-shebang, +.hljs-string .hljs-variable, +.hljs-link_url, +.hljs-bullet, +.hljs-sqbracket, +.hljs-phony { + color: #4C81C9; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai.css new file mode 100644 index 0000000..4e49bef --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai.css @@ -0,0 +1,127 @@ +/* +Monokai style - ported by Luigi Maselli - http://grigio.org +*/ + +.hljs { + display: block; padding: 0.5em; + background: #272822; +} + +.hljs-tag, +.hljs-tag .hljs-title, +.hljs-keyword, +.hljs-literal, +.hljs-strong, +.hljs-change, +.hljs-winutils, +.hljs-flow, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.tex .hljs-special { + color: #F92672; +} + +.hljs { + color: #DDD; +} + +.hljs .hljs-constant, +.asciidoc .hljs-code { + color: #66D9EF; +} + +.hljs-code, +.hljs-class .hljs-title, +.hljs-header { + color: white; +} + +.hljs-link_label, +.hljs-attribute, +.hljs-symbol, +.hljs-symbol .hljs-string, +.hljs-value, +.hljs-regexp { + color: #BF79DB; +} + +.hljs-link_url, +.hljs-tag .hljs-value, +.hljs-string, +.hljs-bullet, +.hljs-subst, +.hljs-title, +.hljs-emphasis, +.haskell .hljs-type, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-class .hljs-parent, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-javadoc, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-addition, +.hljs-stream, +.hljs-envvar, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-command, +.hljs-prompt { + color: #A6E22E; +} + +.hljs-comment, +.java .hljs-annotation, +.smartquote, +.hljs-blockquote, +.hljs-horizontal_rule, +.python .hljs-decorator, +.hljs-template_comment, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-shebang, +.apache .hljs-sqbracket, +.tex .hljs-formula { + color: #75715E; +} + +.hljs-keyword, +.hljs-literal, +.css .hljs-id, +.hljs-phpdoc, +.hljs-title, +.hljs-header, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.diff .hljs-header, +.hljs-chunk, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.tex .hljs-special, +.hljs-request, +.hljs-status { + font-weight: bold; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai_sublime.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai_sublime.css new file mode 100644 index 0000000..7b0eb2e --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai_sublime.css @@ -0,0 +1,149 @@ +/* + +Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/ + +*/ + +.hljs { + display: block; + padding: 0.5em; + background: #23241f; +} + +.hljs, +.hljs-tag, +.css .hljs-rules, +.css .hljs-value, +.css .hljs-function +.hljs-preprocessor, +.hljs-pragma { + color: #f8f8f2; +} + +.hljs-strongemphasis, +.hljs-strong, +.hljs-emphasis { + color: #a8a8a2; +} + +.hljs-bullet, +.hljs-blockquote, +.hljs-horizontal_rule, +.hljs-number, +.hljs-regexp, +.alias .hljs-keyword, +.hljs-literal, +.hljs-hexcolor { + color: #ae81ff; +} + +.hljs-tag .hljs-value, +.hljs-code, +.hljs-title, +.css .hljs-class, +.hljs-class .hljs-title:last-child { + color: #a6e22e; +} + +.hljs-link_url { + font-size: 80%; +} + +.hljs-strong, +.hljs-strongemphasis { + font-weight: bold; +} + +.hljs-emphasis, +.hljs-strongemphasis, +.hljs-class .hljs-title:last-child { + font-style: italic; +} + +.hljs-keyword, +.hljs-function, +.hljs-change, +.hljs-winutils, +.hljs-flow, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.tex .hljs-special, +.hljs-header, +.hljs-attribute, +.hljs-symbol, +.hljs-symbol .hljs-string, +.hljs-tag .hljs-title, +.hljs-value, +.alias .hljs-keyword:first-child, +.css .hljs-tag, +.css .unit, +.css .hljs-important { + color: #F92672; +} + +.hljs-function .hljs-keyword, +.hljs-class .hljs-keyword:first-child, +.hljs-constant, +.css .hljs-attribute { + color: #66d9ef; +} + +.hljs-variable, +.hljs-params, +.hljs-class .hljs-title { + color: #f8f8f2; +} + +.hljs-string, +.css .hljs-id, +.hljs-subst, +.haskell .hljs-type, +.ruby .hljs-class .hljs-parent, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-addition, +.hljs-stream, +.hljs-envvar, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-command, +.hljs-prompt, +.hljs-link_label, +.hljs-link_url { + color: #e6db74; +} + +.hljs-comment, +.hljs-javadoc, +.java .hljs-annotation, +.python .hljs-decorator, +.hljs-template_comment, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-shebang, +.apache .hljs-sqbracket, +.tex .hljs-formula { + color: #75715e; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata, +.xml .php, +.php .xml { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/obsidian.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/obsidian.css new file mode 100644 index 0000000..1174e4c --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/obsidian.css @@ -0,0 +1,154 @@ +/** + * Obsidian style + * ported by Alexander Marenin (http://github.com/ioncreature) + */ + +.hljs { + display: block; padding: 0.5em; + background: #282B2E; +} + +.hljs-keyword, +.hljs-literal, +.hljs-change, +.hljs-winutils, +.hljs-flow, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.css .hljs-id, +.tex .hljs-special { + color: #93C763; +} + +.hljs-number { + color: #FFCD22; +} + +.hljs { + color: #E0E2E4; +} + +.css .hljs-tag, +.css .hljs-pseudo { + color: #D0D2B5; +} + +.hljs-attribute, +.hljs .hljs-constant { + color: #668BB0; +} + +.xml .hljs-attribute { + color: #B3B689; +} + +.xml .hljs-tag .hljs-value { + color: #E8E2B7; +} + +.hljs-code, +.hljs-class .hljs-title, +.hljs-header { + color: white; +} + +.hljs-class, +.hljs-hexcolor { + color: #93C763; +} + +.hljs-regexp { + color: #D39745; +} + +.hljs-at_rule, +.hljs-at_rule .hljs-keyword { + color: #A082BD; +} + +.hljs-doctype { + color: #557182; +} + +.hljs-link_url, +.hljs-tag, +.hljs-tag .hljs-title, +.hljs-bullet, +.hljs-subst, +.hljs-emphasis, +.haskell .hljs-type, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-class .hljs-parent, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-javadoc, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-addition, +.hljs-stream, +.hljs-envvar, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-command, +.hljs-prompt { + color: #8CBBAD; +} + +.hljs-string { + color: #EC7600; +} + +.hljs-comment, +.java .hljs-annotation, +.hljs-blockquote, +.hljs-horizontal_rule, +.python .hljs-decorator, +.hljs-template_comment, +.hljs-pi, +.hljs-deletion, +.hljs-shebang, +.apache .hljs-sqbracket, +.tex .hljs-formula { + color: #818E96; +} + +.hljs-keyword, +.hljs-literal, +.css .hljs-id, +.hljs-phpdoc, +.hljs-title, +.hljs-header, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.diff .hljs-header, +.hljs-chunk, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.tex .hljs-special, +.hljs-request, +.hljs-at_rule .hljs-keyword, +.hljs-status { + font-weight: bold; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.dark.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.dark.css new file mode 100644 index 0000000..bbbccdd --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.dark.css @@ -0,0 +1,93 @@ +/* + Paraíso (dark) + Created by Jan T. Sott (http://github.com/idleberg) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) +*/ + +/* Paraíso Comment */ +.hljs-comment, +.hljs-title { + color: #8d8687; +} + +/* Paraíso Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #ef6155; +} + +/* Paraíso Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #f99b15; +} + +/* Paraíso Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #fec418; +} + +/* Paraíso Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #48b685; +} + +/* Paraíso Aqua */ +.css .hljs-hexcolor { + color: #5bc4bf; +} + +/* Paraíso Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #06b6ef; +} + +/* Paraíso Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #815ba4; +} + +.hljs { + display: block; + background: #2f1e2e; + color: #a39e9b; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.light.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.light.css new file mode 100644 index 0000000..494fcb4 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.light.css @@ -0,0 +1,93 @@ +/* + Paraíso (light) + Created by Jan T. Sott (http://github.com/idleberg) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) +*/ + +/* Paraíso Comment */ +.hljs-comment, +.hljs-title { + color: #776e71; +} + +/* Paraíso Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #ef6155; +} + +/* Paraíso Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #f99b15; +} + +/* Paraíso Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #fec418; +} + +/* Paraíso Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #48b685; +} + +/* Paraíso Aqua */ +.css .hljs-hexcolor { + color: #5bc4bf; +} + +/* Paraíso Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #06b6ef; +} + +/* Paraíso Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #815ba4; +} + +.hljs { + display: block; + background: #e7e9db; + color: #4f424c; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.css new file mode 100644 index 0000000..6ee925d --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.css @@ -0,0 +1,106 @@ +/* + +Pojoaque Style by Jason Tate +http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html +Based on Solarized Style from http://ethanschoonover.com/solarized + +*/ + +.hljs { + display: block; padding: 0.5em; + color: #DCCF8F; + background: url(./pojoaque.jpg) repeat scroll left top #181914; +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-doctype, +.lisp .hljs-string, +.hljs-javadoc { + color: #586e75; + font-style: italic; +} + +.hljs-keyword, +.css .rule .hljs-keyword, +.hljs-winutils, +.javascript .hljs-title, +.method, +.hljs-addition, +.css .hljs-tag, +.clojure .hljs-title, +.nginx .hljs-title { + color: #B64926; +} + +.hljs-number, +.hljs-command, +.hljs-string, +.hljs-tag .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula, +.hljs-regexp, +.hljs-hexcolor { + color: #468966; +} + +.hljs-title, +.hljs-localvars, +.hljs-function .hljs-title, +.hljs-chunk, +.hljs-decorator, +.hljs-built_in, +.lisp .hljs-title, +.clojure .hljs-built_in, +.hljs-identifier, +.hljs-id { + color: #FFB03B; +} + +.hljs-attribute, +.hljs-variable, +.lisp .hljs-body, +.smalltalk .hljs-number, +.hljs-constant, +.hljs-class .hljs-title, +.hljs-parent, +.haskell .hljs-type { + color: #b58900; +} + +.css .hljs-attribute { + color: #b89859; +} + +.css .hljs-number, +.css .hljs-hexcolor { + color: #DCCF8F; +} + +.css .hljs-class { + color: #d3a60c; +} + +.hljs-preprocessor, +.hljs-pragma, +.hljs-pi, +.hljs-shebang, +.hljs-symbol, +.hljs-symbol .hljs-string, +.diff .hljs-change, +.hljs-special, +.hljs-attr_selector, +.hljs-important, +.hljs-subst, +.hljs-cdata { + color: #cb4b16; +} + +.hljs-deletion { + color: #dc322f; +} + +.tex .hljs-formula { + background: #073642; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.jpg b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.jpg new file mode 100644 index 0000000..9c07d4a Binary files /dev/null and b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.jpg differ diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/railscasts.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/railscasts.css new file mode 100644 index 0000000..6a38064 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/railscasts.css @@ -0,0 +1,182 @@ +/* + +Railscasts-like style (c) Visoft, Inc. (Damien White) + +*/ + +.hljs { + display: block; + padding: 0.5em; + background: #232323; + color: #E6E1DC; +} + +.hljs-comment, +.hljs-template_comment, +.hljs-javadoc, +.hljs-shebang { + color: #BC9458; + font-style: italic; +} + +.hljs-keyword, +.ruby .hljs-function .hljs-keyword, +.hljs-request, +.hljs-status, +.nginx .hljs-title, +.method, +.hljs-list .hljs-title { + color: #C26230; +} + +.hljs-string, +.hljs-number, +.hljs-regexp, +.hljs-tag .hljs-value, +.hljs-cdata, +.hljs-filter .hljs-argument, +.hljs-attr_selector, +.apache .hljs-cbracket, +.hljs-date, +.tex .hljs-command, +.markdown .hljs-link_label { + color: #A5C261; +} + +.hljs-subst { + color: #519F50; +} + +.hljs-tag, +.hljs-tag .hljs-keyword, +.hljs-tag .hljs-title, +.hljs-doctype, +.hljs-sub .hljs-identifier, +.hljs-pi, +.input_number { + color: #E8BF6A; +} + +.hljs-identifier { + color: #D0D0FF; +} + +.hljs-class .hljs-title, +.haskell .hljs-type, +.smalltalk .hljs-class, +.hljs-javadoctag, +.hljs-yardoctag, +.hljs-phpdoc { + text-decoration: none; +} + +.hljs-constant { + color: #DA4939; +} + + +.hljs-symbol, +.hljs-built_in, +.ruby .hljs-symbol .hljs-string, +.ruby .hljs-symbol .hljs-identifier, +.markdown .hljs-link_url, +.hljs-attribute { + color: #6D9CBE; +} + +.markdown .hljs-link_url { + text-decoration: underline; +} + + + +.hljs-params, +.hljs-variable, +.clojure .hljs-attribute { + color: #D0D0FF; +} + +.css .hljs-tag, +.hljs-rules .hljs-property, +.hljs-pseudo, +.tex .hljs-special { + color: #CDA869; +} + +.css .hljs-class { + color: #9B703F; +} + +.hljs-rules .hljs-keyword { + color: #C5AF75; +} + +.hljs-rules .hljs-value { + color: #CF6A4C; +} + +.css .hljs-id { + color: #8B98AB; +} + +.hljs-annotation, +.apache .hljs-sqbracket, +.nginx .hljs-built_in { + color: #9B859D; +} + +.hljs-preprocessor, +.hljs-preprocessor *, +.hljs-pragma { + color: #8996A8 !important; +} + +.hljs-hexcolor, +.css .hljs-value .hljs-number { + color: #A5C261; +} + +.hljs-title, +.hljs-decorator, +.css .hljs-function { + color: #FFC66D; +} + +.diff .hljs-header, +.hljs-chunk { + background-color: #2F33AB; + color: #E6E1DC; + display: inline-block; + width: 100%; +} + +.diff .hljs-change { + background-color: #4A410D; + color: #F8F8F8; + display: inline-block; + width: 100%; +} + +.hljs-addition { + background-color: #144212; + color: #E6E1DC; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #600; + color: #E6E1DC; + display: inline-block; + width: 100%; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.7; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/rainbow.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/rainbow.css new file mode 100644 index 0000000..d9ffef6 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/rainbow.css @@ -0,0 +1,112 @@ +/* + +Style with support for rainbow parens + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #474949; color: #D1D9E1; +} + + +.hljs-body, +.hljs-collection { + color: #D1D9E1; +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-doctype, +.lisp .hljs-string, +.hljs-javadoc { + color: #969896; + font-style: italic; +} + +.hljs-keyword, +.clojure .hljs-attribute, +.hljs-winutils, +.javascript .hljs-title, +.hljs-addition, +.css .hljs-tag { + color: #cc99cc; +} + +.hljs-number { color: #f99157; } + +.hljs-command, +.hljs-string, +.hljs-tag .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula, +.hljs-regexp, +.hljs-hexcolor { + color: #8abeb7; +} + +.hljs-title, +.hljs-localvars, +.hljs-function .hljs-title, +.hljs-chunk, +.hljs-decorator, +.hljs-built_in, +.lisp .hljs-title, +.hljs-identifier +{ + color: #b5bd68; +} + +.hljs-class .hljs-keyword +{ + color: #f2777a; +} + +.hljs-variable, +.lisp .hljs-body, +.smalltalk .hljs-number, +.hljs-constant, +.hljs-class .hljs-title, +.hljs-parent, +.haskell .hljs-label, +.hljs-id, +.lisp .hljs-title, +.clojure .hljs-title .hljs-built_in { + color: #ffcc66; +} + +.hljs-tag .hljs-title, +.hljs-rules .hljs-property, +.django .hljs-tag .hljs-keyword, +.clojure .hljs-title .hljs-built_in { + font-weight: bold; +} + +.hljs-attribute, +.clojure .hljs-title { + color: #81a2be; +} + +.hljs-preprocessor, +.hljs-pragma, +.hljs-pi, +.hljs-shebang, +.hljs-symbol, +.hljs-symbol .hljs-string, +.diff .hljs-change, +.hljs-special, +.hljs-attr_selector, +.hljs-important, +.hljs-subst, +.hljs-cdata { + color: #f99157; +} + +.hljs-deletion { + color: #dc322f; +} + +.tex .hljs-formula { + background: #eee8d5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.css new file mode 100644 index 0000000..98a3bd2 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.css @@ -0,0 +1,113 @@ +/* + +School Book style from goldblog.com.ua (c) Zaripov Yura + +*/ + +.hljs { + display: block; padding: 15px 0.5em 0.5em 30px; + font-size: 11px !important; + line-height:16px !important; +} + +pre{ + background:#f6f6ae url(./school_book.png); + border-top: solid 2px #d2e8b9; + border-bottom: solid 1px #d2e8b9; +} + +.hljs-keyword, +.hljs-literal, +.hljs-change, +.hljs-winutils, +.hljs-flow, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.tex .hljs-special { + color:#005599; + font-weight:bold; +} + +.hljs, +.hljs-subst, +.hljs-tag .hljs-keyword { + color: #3E5915; +} + +.hljs-string, +.hljs-title, +.haskell .hljs-type, +.hljs-tag .hljs-value, +.css .hljs-rules .hljs-value, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.ruby .hljs-class .hljs-parent, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-javadoc, +.ruby .hljs-string, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-addition, +.hljs-stream, +.hljs-envvar, +.apache .hljs-tag, +.apache .hljs-cbracket, +.nginx .hljs-built_in, +.tex .hljs-command, +.coffeescript .hljs-attribute { + color: #2C009F; +} + +.hljs-comment, +.java .hljs-annotation, +.python .hljs-decorator, +.hljs-template_comment, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-shebang, +.apache .hljs-sqbracket { + color: #E60415; +} + +.hljs-keyword, +.hljs-literal, +.css .hljs-id, +.hljs-phpdoc, +.hljs-title, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.xml .hljs-tag .hljs-title, +.diff .hljs-header, +.hljs-chunk, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.tex .hljs-command, +.hljs-request, +.hljs-status { + font-weight: bold; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.png b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.png new file mode 100644 index 0000000..956e979 Binary files /dev/null and b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.png differ diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_dark.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_dark.css new file mode 100644 index 0000000..f520533 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_dark.css @@ -0,0 +1,107 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + padding: 0.5em; + background: #002b36; + color: #839496; +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-doctype, +.hljs-pi, +.lisp .hljs-string, +.hljs-javadoc { + color: #586e75; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-winutils, +.method, +.hljs-addition, +.css .hljs-tag, +.hljs-request, +.hljs-status, +.nginx .hljs-title { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-command, +.hljs-string, +.hljs-tag .hljs-value, +.hljs-rules .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula, +.hljs-regexp, +.hljs-hexcolor, +.hljs-link_url { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-localvars, +.hljs-chunk, +.hljs-decorator, +.hljs-built_in, +.hljs-identifier, +.vhdl .hljs-literal, +.hljs-id, +.css .hljs-function { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-variable, +.lisp .hljs-body, +.smalltalk .hljs-number, +.hljs-constant, +.hljs-class .hljs-title, +.hljs-parent, +.haskell .hljs-type, +.hljs-link_reference { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-preprocessor, +.hljs-preprocessor .hljs-keyword, +.hljs-pragma, +.hljs-shebang, +.hljs-symbol, +.hljs-symbol .hljs-string, +.diff .hljs-change, +.hljs-special, +.hljs-attr_selector, +.hljs-subst, +.hljs-cdata, +.clojure .hljs-title, +.css .hljs-pseudo, +.hljs-header { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-deletion, +.hljs-important { + color: #dc322f; +} + +/* Solarized Violet */ +.hljs-link_label { + color: #6c71c4; +} + +.tex .hljs-formula { + background: #073642; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_light.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_light.css new file mode 100644 index 0000000..ad70474 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_light.css @@ -0,0 +1,107 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + padding: 0.5em; + background: #fdf6e3; + color: #657b83; +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-doctype, +.hljs-pi, +.lisp .hljs-string, +.hljs-javadoc { + color: #93a1a1; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-winutils, +.method, +.hljs-addition, +.css .hljs-tag, +.hljs-request, +.hljs-status, +.nginx .hljs-title { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-command, +.hljs-string, +.hljs-tag .hljs-value, +.hljs-rules .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula, +.hljs-regexp, +.hljs-hexcolor, +.hljs-link_url { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-localvars, +.hljs-chunk, +.hljs-decorator, +.hljs-built_in, +.hljs-identifier, +.vhdl .hljs-literal, +.hljs-id, +.css .hljs-function { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-variable, +.lisp .hljs-body, +.smalltalk .hljs-number, +.hljs-constant, +.hljs-class .hljs-title, +.hljs-parent, +.haskell .hljs-type, +.hljs-link_reference { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-preprocessor, +.hljs-preprocessor .hljs-keyword, +.hljs-pragma, +.hljs-shebang, +.hljs-symbol, +.hljs-symbol .hljs-string, +.diff .hljs-change, +.hljs-special, +.hljs-attr_selector, +.hljs-subst, +.hljs-cdata, +.clojure .hljs-title, +.css .hljs-pseudo, +.hljs-header { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-deletion, +.hljs-important { + color: #dc322f; +} + +/* Solarized Violet */ +.hljs-link_label { + color: #6c71c4; +} + +.tex .hljs-formula { + background: #eee8d5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/sunburst.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/sunburst.css new file mode 100644 index 0000000..07b30c2 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/sunburst.css @@ -0,0 +1,160 @@ +/* + +Sunburst-like style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #000; color: #f8f8f8; +} + +.hljs-comment, +.hljs-template_comment, +.hljs-javadoc { + color: #aeaeae; + font-style: italic; +} + +.hljs-keyword, +.ruby .hljs-function .hljs-keyword, +.hljs-request, +.hljs-status, +.nginx .hljs-title { + color: #E28964; +} + +.hljs-function .hljs-keyword, +.hljs-sub .hljs-keyword, +.method, +.hljs-list .hljs-title { + color: #99CF50; +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-cdata, +.hljs-filter .hljs-argument, +.hljs-attr_selector, +.apache .hljs-cbracket, +.hljs-date, +.tex .hljs-command, +.coffeescript .hljs-attribute { + color: #65B042; +} + +.hljs-subst { + color: #DAEFA3; +} + +.hljs-regexp { + color: #E9C062; +} + +.hljs-title, +.hljs-sub .hljs-identifier, +.hljs-pi, +.hljs-tag, +.hljs-tag .hljs-keyword, +.hljs-decorator, +.hljs-shebang, +.hljs-prompt { + color: #89BDFF; +} + +.hljs-class .hljs-title, +.haskell .hljs-type, +.smalltalk .hljs-class, +.hljs-javadoctag, +.hljs-yardoctag, +.hljs-phpdoc { + text-decoration: underline; +} + +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-number { + color: #3387CC; +} + +.hljs-params, +.hljs-variable, +.clojure .hljs-attribute { + color: #3E87E3; +} + +.css .hljs-tag, +.hljs-rules .hljs-property, +.hljs-pseudo, +.tex .hljs-special { + color: #CDA869; +} + +.css .hljs-class { + color: #9B703F; +} + +.hljs-rules .hljs-keyword { + color: #C5AF75; +} + +.hljs-rules .hljs-value { + color: #CF6A4C; +} + +.css .hljs-id { + color: #8B98AB; +} + +.hljs-annotation, +.apache .hljs-sqbracket, +.nginx .hljs-built_in { + color: #9B859D; +} + +.hljs-preprocessor, +.hljs-pragma { + color: #8996A8; +} + +.hljs-hexcolor, +.css .hljs-value .hljs-number { + color: #DD7B3B; +} + +.css .hljs-function { + color: #DAD085; +} + +.diff .hljs-header, +.hljs-chunk, +.tex .hljs-formula { + background-color: #0E2231; + color: #F8F8F8; + font-style: italic; +} + +.diff .hljs-change { + background-color: #4A410D; + color: #F8F8F8; +} + +.hljs-addition { + background-color: #253B22; + color: #F8F8F8; +} + +.hljs-deletion { + background-color: #420E09; + color: #F8F8F8; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-blue.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-blue.css new file mode 100644 index 0000000..dfe2675 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-blue.css @@ -0,0 +1,93 @@ +/* Tomorrow Night Blue Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-title { + color: #7285b7; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #ff9da4; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #ffc58f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #ffeead; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #d1f1a9; +} + +/* Tomorrow Aqua */ +.css .hljs-hexcolor { + color: #99ffff; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #bbdaff; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #ebbbff; +} + +.hljs { + display: block; + background: #002451; + color: white; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-bright.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-bright.css new file mode 100644 index 0000000..4ad5d25 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-bright.css @@ -0,0 +1,92 @@ +/* Tomorrow Night Bright Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-title { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #d54e53; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #e78c45; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #e7c547; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b9ca4a; +} + +/* Tomorrow Aqua */ +.css .hljs-hexcolor { + color: #70c0b1; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #7aa6da; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #c397d8; +} + +.hljs { + display: block; + background: black; + color: #eaeaea; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-eighties.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-eighties.css new file mode 100644 index 0000000..08b49c6 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-eighties.css @@ -0,0 +1,92 @@ +/* Tomorrow Night Eighties Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-title { + color: #999999; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #f2777a; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #f99157; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #ffcc66; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #99cc99; +} + +/* Tomorrow Aqua */ +.css .hljs-hexcolor { + color: #66cccc; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #6699cc; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #cc99cc; +} + +.hljs { + display: block; + background: #2d2d2d; + color: #cccccc; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night.css new file mode 100644 index 0000000..c269b17 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night.css @@ -0,0 +1,93 @@ +/* Tomorrow Night Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-title { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #de935f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b5bd68; +} + +/* Tomorrow Aqua */ +.css .hljs-hexcolor { + color: #8abeb7; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b294bb; +} + +.hljs { + display: block; + background: #1d1f21; + color: #c5c8c6; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow.css new file mode 100644 index 0000000..3bdead6 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow.css @@ -0,0 +1,90 @@ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-title { + color: #8e908c; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #c82829; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #f5871f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #eab700; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #718c00; +} + +/* Tomorrow Aqua */ +.css .hljs-hexcolor { + color: #3e999f; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #4271ae; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #8959a8; +} + +.hljs { + display: block; + background: white; + color: #4d4d4c; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/vs.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/vs.css new file mode 100644 index 0000000..bf33f0f --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/vs.css @@ -0,0 +1,89 @@ +/* + +Visual Studio-like style based on original C# coloring by Jason Diamond + +*/ +.hljs { + display: block; padding: 0.5em; + background: white; color: black; +} + +.hljs-comment, +.hljs-annotation, +.hljs-template_comment, +.diff .hljs-header, +.hljs-chunk, +.apache .hljs-cbracket { + color: #008000; +} + +.hljs-keyword, +.hljs-id, +.hljs-built_in, +.smalltalk .hljs-class, +.hljs-winutils, +.bash .hljs-variable, +.tex .hljs-command, +.hljs-request, +.hljs-status, +.nginx .hljs-title, +.xml .hljs-tag, +.xml .hljs-tag .hljs-value { + color: #00f; +} + +.hljs-string, +.hljs-title, +.hljs-parent, +.hljs-tag .hljs-value, +.hljs-rules .hljs-value, +.hljs-rules .hljs-value .hljs-number, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-aggregate, +.hljs-template_tag, +.django .hljs-variable, +.hljs-addition, +.hljs-flow, +.hljs-stream, +.apache .hljs-tag, +.hljs-date, +.tex .hljs-formula, +.coffeescript .hljs-attribute { + color: #a31515; +} + +.ruby .hljs-string, +.hljs-decorator, +.hljs-filter .hljs-argument, +.hljs-localvars, +.hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-envvar, +.hljs-shebang, +.hljs-preprocessor, +.hljs-pragma, +.userType, +.apache .hljs-sqbracket, +.nginx .hljs-built_in, +.tex .hljs-special, +.hljs-prompt { + color: #2b91af; +} + +.hljs-phpdoc, +.hljs-javadoc, +.hljs-xmlDocTag { + color: #808080; +} + +.vhdl .hljs-typename { font-weight: bold; } +.vhdl .hljs-string { color: #666666; } +.vhdl .hljs-literal { color: #a31515; } +.vhdl .hljs-attribute { color: #00B0E8; } + +.xml .hljs-attribute { color: #f00; } diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/xcode.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/xcode.css new file mode 100644 index 0000000..57bd748 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/xcode.css @@ -0,0 +1,158 @@ +/* + +XCode style (c) Angel Garcia + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #fff; color: black; +} + +.hljs-comment, +.hljs-template_comment, +.hljs-javadoc, +.hljs-comment * { + color: #006a00; +} + +.hljs-keyword, +.hljs-literal, +.nginx .hljs-title { + color: #aa0d91; +} +.method, +.hljs-list .hljs-title, +.hljs-tag .hljs-title, +.setting .hljs-value, +.hljs-winutils, +.tex .hljs-command, +.http .hljs-title, +.hljs-request, +.hljs-status { + color: #008; +} + +.hljs-envvar, +.tex .hljs-special { + color: #660; +} + +.hljs-string { + color: #c41a16; +} +.hljs-tag .hljs-value, +.hljs-cdata, +.hljs-filter .hljs-argument, +.hljs-attr_selector, +.apache .hljs-cbracket, +.hljs-date, +.hljs-regexp { + color: #080; +} + +.hljs-sub .hljs-identifier, +.hljs-pi, +.hljs-tag, +.hljs-tag .hljs-keyword, +.hljs-decorator, +.ini .hljs-title, +.hljs-shebang, +.hljs-prompt, +.hljs-hexcolor, +.hljs-rules .hljs-value, +.css .hljs-value .hljs-number, +.hljs-symbol, +.hljs-symbol .hljs-string, +.hljs-number, +.css .hljs-function, +.clojure .hljs-title, +.clojure .hljs-built_in, +.hljs-function .hljs-title, +.coffeescript .hljs-attribute { + color: #1c00cf; +} + +.hljs-class .hljs-title, +.haskell .hljs-type, +.smalltalk .hljs-class, +.hljs-javadoctag, +.hljs-yardoctag, +.hljs-phpdoc, +.hljs-typename, +.hljs-tag .hljs-attribute, +.hljs-doctype, +.hljs-class .hljs-id, +.hljs-built_in, +.setting, +.hljs-params, +.clojure .hljs-attribute { + color: #5c2699; +} + +.hljs-variable { + color: #3f6e74; +} +.css .hljs-tag, +.hljs-rules .hljs-property, +.hljs-pseudo, +.hljs-subst { + color: #000; +} + +.css .hljs-class, +.css .hljs-id { + color: #9B703F; +} + +.hljs-value .hljs-important { + color: #ff7700; + font-weight: bold; +} + +.hljs-rules .hljs-keyword { + color: #C5AF75; +} + +.hljs-annotation, +.apache .hljs-sqbracket, +.nginx .hljs-built_in { + color: #9B859D; +} + +.hljs-preprocessor, +.hljs-preprocessor *, +.hljs-pragma { + color: #643820; +} + +.tex .hljs-formula { + background-color: #EEE; + font-style: italic; +} + +.diff .hljs-header, +.hljs-chunk { + color: #808080; + font-weight: bold; +} + +.diff .hljs-change { + background-color: #BCCFF9; +} + +.hljs-addition { + background-color: #BAEEBA; +} + +.hljs-deletion { + background-color: #FFC8BD; +} + +.hljs-comment .hljs-yardoctag { + font-weight: bold; +} + +.method .hljs-id { + color: #000; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/zenburn.css b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/zenburn.css new file mode 100644 index 0000000..163484b --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/lib/highlight/styles/zenburn.css @@ -0,0 +1,116 @@ +/* + +Zenburn style from voldmar.ru (c) Vladimir Epifanov +based on dark.css by Ivan Sagalaev + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #3F3F3F; + color: #DCDCDC; +} + +.hljs-keyword, +.hljs-tag, +.css .hljs-class, +.css .hljs-id, +.lisp .hljs-title, +.nginx .hljs-title, +.hljs-request, +.hljs-status, +.clojure .hljs-attribute { + color: #E3CEAB; +} + +.django .hljs-template_tag, +.django .hljs-variable, +.django .hljs-filter .hljs-argument { + color: #DCDCDC; +} + +.hljs-number, +.hljs-date { + color: #8CD0D3; +} + +.dos .hljs-envvar, +.dos .hljs-stream, +.hljs-variable, +.apache .hljs-sqbracket { + color: #EFDCBC; +} + +.dos .hljs-flow, +.diff .hljs-change, +.python .exception, +.python .hljs-built_in, +.hljs-literal, +.tex .hljs-special { + color: #EFEFAF; +} + +.diff .hljs-chunk, +.hljs-subst { + color: #8F8F8F; +} + +.dos .hljs-keyword, +.python .hljs-decorator, +.hljs-title, +.haskell .hljs-type, +.diff .hljs-header, +.ruby .hljs-class .hljs-parent, +.apache .hljs-tag, +.nginx .hljs-built_in, +.tex .hljs-command, +.hljs-prompt { + color: #efef8f; +} + +.dos .hljs-winutils, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.ruby .hljs-string { + color: #DCA3A3; +} + +.diff .hljs-deletion, +.hljs-string, +.hljs-tag .hljs-value, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.sql .hljs-aggregate, +.hljs-javadoc, +.smalltalk .hljs-class, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.css .hljs-rules .hljs-value, +.hljs-attr_selector, +.hljs-pseudo, +.apache .hljs-cbracket, +.tex .hljs-formula, +.coffeescript .hljs-attribute { + color: #CC9393; +} + +.hljs-shebang, +.diff .hljs-addition, +.hljs-comment, +.java .hljs-annotation, +.hljs-template_comment, +.hljs-pi, +.hljs-doctype { + color: #7F9F7F; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/bower_components/ckeditor/plugins/codesnippet/plugin.js b/bower_components/ckeditor/plugins/codesnippet/plugin.js new file mode 100644 index 0000000..d007ae6 --- /dev/null +++ b/bower_components/ckeditor/plugins/codesnippet/plugin.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function d(a){CKEDITOR.tools.extend(this,a);this.queue=[];this.init?this.init(CKEDITOR.tools.bind(function(){for(var a;a=this.queue.pop();)a.call(this);this.ready=!0},this)):this.ready=!0}function l(a){var b=a.config.codeSnippet_codeClass,c=/\r?\n/g,h=new CKEDITOR.dom.element("textarea");a.widgets.add("codeSnippet",{allowedContent:"pre; code(language-*)",requiredContent:"pre",styleableElements:"pre",template:'
        ',dialog:"codeSnippet",pathName:a.lang.codesnippet.pathName, +mask:!0,parts:{pre:"pre",code:"code"},highlight:function(){var e=this,f=this.data,b=function(a){e.parts.code.setHtml(k?a:a.replace(c,"
        "))};b(CKEDITOR.tools.htmlEncode(f.code));a._.codesnippet.highlighter.highlight(f.code,f.lang,function(e){a.fire("lockSnapshot");b(e);a.fire("unlockSnapshot")})},data:function(){var a=this.data,b=this.oldData;a.code&&this.parts.code.setHtml(CKEDITOR.tools.htmlEncode(a.code));b&&a.lang!=b.lang&&this.parts.code.removeClass("language-"+b.lang);a.lang&&(this.parts.code.addClass("language-"+ +a.lang),this.highlight());this.oldData=CKEDITOR.tools.copy(a)},upcast:function(e,f){if("pre"==e.name){for(var c=[],d=e.children,i,j=d.length-1;0<=j;j--)i=d[j],(i.type!=CKEDITOR.NODE_TEXT||!i.value.match(m))&&c.push(i);var g;if(!(1!=c.length||"code"!=(g=c[0]).name))if(!(1!=g.children.length||g.children[0].type!=CKEDITOR.NODE_TEXT)){if(c=a._.codesnippet.langsRegex.exec(g.attributes["class"]))f.lang=c[1];h.setHtml(g.getHtml());f.code=h.getValue();g.addClass(b);return e}}},downcast:function(a){var c= +a.getFirst("code");c.children.length=0;c.removeClass(b);c.add(new CKEDITOR.htmlParser.text(CKEDITOR.tools.htmlEncode(this.data.code)));return a}});var m=/^[\s\n\r]*$/}var k=!CKEDITOR.env.ie||8
        ',f.auto,'
        ');for(e=0;e");var d=i[e].split("/"),l=d[0],n=d[1]||l;d[1]||(l="#"+l.replace(/^(.)(.)(.)$/,"$1$1$2$2$3$3"));d=c.lang.colorbutton.colors[n]||n;h.push('')}k&&h.push('");h.push("
        ',f.more,"
        ");return h.join("")}function p(c){return"false"==c.getAttribute("contentEditable")||c.getAttribute("data-nostyle")}var j=c.config,f=c.lang.colorbutton;CKEDITOR.env.hc||(o("TextColor","fore",f.textColorTitle,10),o("BGColor","back",f.bgColorTitle,20))}});CKEDITOR.config.colorButton_colors="000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF"; +CKEDITOR.config.colorButton_foreStyle={element:"span",styles:{color:"#(color)"},overrides:[{element:"font",attributes:{color:null}}]};CKEDITOR.config.colorButton_backStyle={element:"span",styles:{"background-color":"#(color)"}}; \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/dialogs/colordialog.js b/bower_components/ckeditor/plugins/colordialog/dialogs/colordialog.js new file mode 100644 index 0000000..51a49f4 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/dialogs/colordialog.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("colordialog",function(t){function n(){f.getById(o).removeStyle("background-color");p.getContentElement("picker","selectedColor").setValue("");j&&j.removeAttribute("aria-selected");j=null}function u(a){var a=a.data.getTarget(),b;if("td"==a.getName()&&(b=a.getChild(0).getHtml()))j=a,j.setAttribute("aria-selected",!0),p.getContentElement("picker","selectedColor").setValue(b)}function y(a){for(var a=a.replace(/^#/,""),b=0,c=[];2>=b;b++)c[b]=parseInt(a.substr(2*b,2),16);return"#"+ +(165<=0.2126*c[0]+0.7152*c[1]+0.0722*c[2]?"000":"fff")}function v(a){!a.name&&(a=new CKEDITOR.event(a));var b=!/mouse/.test(a.name),c=a.data.getTarget(),e;if("td"==c.getName()&&(e=c.getChild(0).getHtml()))q(a),b?g=c:w=c,b&&(c.setStyle("border-color",y(e)),c.setStyle("border-style","dotted")),f.getById(k).setStyle("background-color",e),f.getById(l).setHtml(e)}function q(a){if(a=!/mouse/.test(a.name)&&g){var b=a.getChild(0).getHtml();a.setStyle("border-color",b);a.setStyle("border-style","solid")}!g&& +!w&&(f.getById(k).removeStyle("background-color"),f.getById(l).setHtml(" "))}function z(a){var b=a.data,c=b.getTarget(),e=b.getKeystroke(),d="rtl"==t.lang.dir;switch(e){case 38:if(a=c.getParent().getPrevious())a=a.getChild([c.getIndex()]),a.focus();b.preventDefault();break;case 40:if(a=c.getParent().getNext())(a=a.getChild([c.getIndex()]))&&1==a.type&&a.focus();b.preventDefault();break;case 32:case 13:u(a);b.preventDefault();break;case d?37:39:if(a=c.getNext())1==a.type&&(a.focus(),b.preventDefault(!0)); +else if(a=c.getParent().getNext())if((a=a.getChild([0]))&&1==a.type)a.focus(),b.preventDefault(!0);break;case d?39:37:if(a=c.getPrevious())a.focus(),b.preventDefault(!0);else if(a=c.getParent().getPrevious())a=a.getLast(),a.focus(),b.preventDefault(!0)}}var r=CKEDITOR.dom.element,f=CKEDITOR.document,h=t.lang.colordialog,p,x={type:"html",html:" "},j,g,w,m=function(a){return CKEDITOR.tools.getNextId()+"_"+a},k=m("hicolor"),l=m("hicolortext"),o=m("selhicolor"),i;(function(){function a(a,d){for(var s= +a;sg;g++)b(e.$,"#"+c[f]+c[g]+c[s])}}function b(a,c){var b=new r(a.insertCell(-1));b.setAttribute("class","ColorCell");b.setAttribute("tabIndex",-1);b.setAttribute("role","gridcell");b.on("keydown",z);b.on("click",u);b.on("focus",v);b.on("blur",q);b.setStyle("background-color",c);b.setStyle("border","1px solid "+c);b.setStyle("width","14px");b.setStyle("height","14px");var d=m("color_table_cell"); +b.setAttribute("aria-labelledby",d);b.append(CKEDITOR.dom.element.createFromHtml(''+c+"",CKEDITOR.document))}i=CKEDITOR.dom.element.createFromHtml('
        '+h.options+'
        ');i.on("mouseover",v);i.on("mouseout",q);var c="00 33 66 99 cc ff".split(" ");a(0,0);a(3,0);a(0, +3);a(3,3);var e=new r(i.$.insertRow(-1));e.setAttribute("role","row");for(var d=0;6>d;d++)b(e.$,"#"+c[d]+c[d]+c[d]);for(d=0;12>d;d++)b(e.$,"#000000")})();return{title:h.title,minWidth:360,minHeight:220,onLoad:function(){p=this},onHide:function(){n();var a=g.getChild(0).getHtml();g.setStyle("border-color",a);g.setStyle("border-style","solid");f.getById(k).removeStyle("background-color");f.getById(l).setHtml(" ");g=null},contents:[{id:"picker",label:h.title,accessKey:"I",elements:[{type:"hbox", +padding:0,widths:["70%","10%","30%"],children:[{type:"html",html:"
        ",onLoad:function(){CKEDITOR.document.getById(this.domId).append(i)},focus:function(){(g||this.getElement().getElementsByTag("td").getItem(0)).focus()}},x,{type:"vbox",padding:0,widths:["70%","5%","25%"],children:[{type:"html",html:""+h.highlight+'
         
        '+h.selected+'
        '}, +{type:"text",label:h.selected,labelStyle:"display:none",id:"selectedColor",style:"width: 76px;margin-top:4px",onChange:function(){try{f.getById(o).setStyle("background-color",this.getValue())}catch(a){n()}}},x,{type:"button",id:"clear",label:h.clear,onClick:n}]}]}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/af.js b/bower_components/ckeditor/plugins/colordialog/lang/af.js new file mode 100644 index 0000000..9a6d574 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","af",{clear:"Herstel",highlight:"Aktief",options:"Kleuropsies",selected:"Geselekteer",title:"Kies kleur"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/ar.js b/bower_components/ckeditor/plugins/colordialog/lang/ar.js new file mode 100644 index 0000000..3b4a497 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","ar",{clear:"مسح",highlight:"تحديد",options:"اختيارات الألوان",selected:"اللون المختار",title:"اختر اللون"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/bg.js b/bower_components/ckeditor/plugins/colordialog/lang/bg.js new file mode 100644 index 0000000..f57a3a9 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","bg",{clear:"Изчистване",highlight:"Осветяване",options:"Цветови опции",selected:"Изберете цвят",title:"Изберете цвят"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/bn.js b/bower_components/ckeditor/plugins/colordialog/lang/bn.js new file mode 100644 index 0000000..1cd5097 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","bn",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/bs.js b/bower_components/ckeditor/plugins/colordialog/lang/bs.js new file mode 100644 index 0000000..e8ea577 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","bs",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/ca.js b/bower_components/ckeditor/plugins/colordialog/lang/ca.js new file mode 100644 index 0000000..9e76e9e --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","ca",{clear:"Neteja",highlight:"Destacat",options:"Opcions del color",selected:"Color Seleccionat",title:"Seleccioni el color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/cs.js b/bower_components/ckeditor/plugins/colordialog/lang/cs.js new file mode 100644 index 0000000..4de1f1f --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","cs",{clear:"Vyčistit",highlight:"Zvýraznit",options:"Nastavení barvy",selected:"Vybráno",title:"Výběr barvy"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/cy.js b/bower_components/ckeditor/plugins/colordialog/lang/cy.js new file mode 100644 index 0000000..6536226 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","cy",{clear:"Clirio",highlight:"Uwcholeuo",options:"Opsiynau Lliw",selected:"Lliw a Ddewiswyd",title:"Dewis lliw"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/da.js b/bower_components/ckeditor/plugins/colordialog/lang/da.js new file mode 100644 index 0000000..df1c5c8 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","da",{clear:"Nulstil",highlight:"Markér",options:"Farvemuligheder",selected:"Valgt farve",title:"Vælg farve"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/de.js b/bower_components/ckeditor/plugins/colordialog/lang/de.js new file mode 100644 index 0000000..7ccd5b6 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","de",{clear:"Entfernen",highlight:"Hervorheben",options:"Farbeoptionen",selected:"Ausgewählte Farbe",title:"Farbe wählen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/el.js b/bower_components/ckeditor/plugins/colordialog/lang/el.js new file mode 100644 index 0000000..1447a1c --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","el",{clear:"Εκκαθάριση",highlight:"Σήμανση",options:"Επιλογές Χρωμάτων",selected:"Επιλεγμένο Χρώμα",title:"Επιλογή χρώματος"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/en-au.js b/bower_components/ckeditor/plugins/colordialog/lang/en-au.js new file mode 100644 index 0000000..cdde12b --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","en-au",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/en-ca.js b/bower_components/ckeditor/plugins/colordialog/lang/en-ca.js new file mode 100644 index 0000000..535acfc --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","en-ca",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/en-gb.js b/bower_components/ckeditor/plugins/colordialog/lang/en-gb.js new file mode 100644 index 0000000..1ec95ff --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","en-gb",{clear:"Clear",highlight:"Highlight",options:"Colour Options",selected:"Selected Colour",title:"Select colour"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/en.js b/bower_components/ckeditor/plugins/colordialog/lang/en.js new file mode 100644 index 0000000..21a79bc --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","en",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/eo.js b/bower_components/ckeditor/plugins/colordialog/lang/eo.js new file mode 100644 index 0000000..aaa8cf9 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","eo",{clear:"Forigi",highlight:"Detaloj",options:"Opcioj pri koloroj",selected:"Selektita koloro",title:"Selekti koloron"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/es.js b/bower_components/ckeditor/plugins/colordialog/lang/es.js new file mode 100644 index 0000000..ae4688f --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","es",{clear:"Borrar",highlight:"Muestra",options:"Opciones de colores",selected:"Elegido",title:"Elegir color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/et.js b/bower_components/ckeditor/plugins/colordialog/lang/et.js new file mode 100644 index 0000000..4a51ac6 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","et",{clear:"Eemalda",highlight:"Näidis",options:"Värvi valikud",selected:"Valitud värv",title:"Värvi valimine"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/eu.js b/bower_components/ckeditor/plugins/colordialog/lang/eu.js new file mode 100644 index 0000000..09a9129 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","eu",{clear:"Garbitu",highlight:"Nabarmendu",options:"Kolore Aukerak",selected:"Hautatutako Kolorea",title:"Kolorea Hautatu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/fa.js b/bower_components/ckeditor/plugins/colordialog/lang/fa.js new file mode 100644 index 0000000..8b0de9d --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","fa",{clear:"پاک کردن",highlight:"متمایز",options:"گزینه​های رنگ",selected:"رنگ انتخاب شده",title:"انتخاب رنگ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/fi.js b/bower_components/ckeditor/plugins/colordialog/lang/fi.js new file mode 100644 index 0000000..8a9a1fe --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","fi",{clear:"Poista",highlight:"Korostus",options:"Värin ominaisuudet",selected:"Valittu",title:"Valitse väri"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/fo.js b/bower_components/ckeditor/plugins/colordialog/lang/fo.js new file mode 100644 index 0000000..575a9d4 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","fo",{clear:"Strika",highlight:"Framheva",options:"Litmøguleikar",selected:"Valdur litur",title:"Vel lit"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/fr-ca.js b/bower_components/ckeditor/plugins/colordialog/lang/fr-ca.js new file mode 100644 index 0000000..d321a83 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","fr-ca",{clear:"Effacer",highlight:"Surligner",options:"Options de couleur",selected:"Couleur sélectionnée",title:"Choisir une couleur"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/fr.js b/bower_components/ckeditor/plugins/colordialog/lang/fr.js new file mode 100644 index 0000000..b99e1b9 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","fr",{clear:"Effacer",highlight:"Détails",options:"Option des couleurs",selected:"Couleur choisie",title:"Choisir une couleur"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/gl.js b/bower_components/ckeditor/plugins/colordialog/lang/gl.js new file mode 100644 index 0000000..13fcd5f --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","gl",{clear:"Limpar",highlight:"Resaltar",options:"Opcións de cor",selected:"Cor seleccionado",title:"Seleccione unha cor"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/gu.js b/bower_components/ckeditor/plugins/colordialog/lang/gu.js new file mode 100644 index 0000000..658cb5a --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","gu",{clear:"સાફ કરવું",highlight:"હાઈઈટ",options:"રંગના વિકલ્પ",selected:"પસંદ કરેલો રંગ",title:"રંગ પસંદ કરો"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/he.js b/bower_components/ckeditor/plugins/colordialog/lang/he.js new file mode 100644 index 0000000..c570071 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","he",{clear:"ניקוי",highlight:"סימון",options:"אפשרויות צבע",selected:"בחירה",title:"בחירת צבע"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/hi.js b/bower_components/ckeditor/plugins/colordialog/lang/hi.js new file mode 100644 index 0000000..d14f1a8 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","hi",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/hr.js b/bower_components/ckeditor/plugins/colordialog/lang/hr.js new file mode 100644 index 0000000..5a99c46 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","hr",{clear:"Očisti",highlight:"Istaknuto",options:"Opcije boje",selected:"Odabrana boja",title:"Odaberi boju"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/hu.js b/bower_components/ckeditor/plugins/colordialog/lang/hu.js new file mode 100644 index 0000000..f905e8f --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","hu",{clear:"Ürítés",highlight:"Nagyítás",options:"Szín opciók",selected:"Kiválasztott",title:"Válasszon színt"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/is.js b/bower_components/ckeditor/plugins/colordialog/lang/is.js new file mode 100644 index 0000000..3504439 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","is",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/it.js b/bower_components/ckeditor/plugins/colordialog/lang/it.js new file mode 100644 index 0000000..cb5ca86 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","it",{clear:"cancella",highlight:"Evidenzia",options:"Opzioni colore",selected:"Seleziona il colore",title:"Selezionare il colore"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/ja.js b/bower_components/ckeditor/plugins/colordialog/lang/ja.js new file mode 100644 index 0000000..01f2851 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","ja",{clear:"クリア",highlight:"ハイライト",options:"カラーオプション",selected:"選択された色",title:"色選択"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/ka.js b/bower_components/ckeditor/plugins/colordialog/lang/ka.js new file mode 100644 index 0000000..d11c484 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","ka",{clear:"გასუფთავება",highlight:"ჩვენება",options:"ფერის პარამეტრები",selected:"არჩეული ფერი",title:"ფერის შეცვლა"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/km.js b/bower_components/ckeditor/plugins/colordialog/lang/km.js new file mode 100644 index 0000000..9be3d0f --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","km",{clear:"សម្អាត",highlight:"បន្លិច​ពណ៌",options:"ជម្រើស​ពណ៌",selected:"ពណ៌​ដែល​បាន​រើស",title:"រើស​ពណ៌"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/ko.js b/bower_components/ckeditor/plugins/colordialog/lang/ko.js new file mode 100644 index 0000000..25715bf --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","ko",{clear:"제거",highlight:"하이라이트",options:"색상 옵션",selected:"색상 선택됨",title:"색상 선택"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/ku.js b/bower_components/ckeditor/plugins/colordialog/lang/ku.js new file mode 100644 index 0000000..5b59075 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","ku",{clear:"پاکیکەوە",highlight:"نیشانکردن",options:"هەڵبژاردەی ڕەنگەکان",selected:"ڕەنگی هەڵبژێردراو",title:"هەڵبژاردنی ڕەنگ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/lt.js b/bower_components/ckeditor/plugins/colordialog/lang/lt.js new file mode 100644 index 0000000..4e3f250 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","lt",{clear:"Išvalyti",highlight:"Paryškinti",options:"Spalvos nustatymai",selected:"Pasirinkta spalva",title:"Pasirinkite spalvą"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/lv.js b/bower_components/ckeditor/plugins/colordialog/lang/lv.js new file mode 100644 index 0000000..0e4c7b8 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","lv",{clear:"Notīrīt",highlight:"Paraugs",options:"Krāsas uzstādījumi",selected:"Izvēlētā krāsa",title:"Izvēlies krāsu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/mk.js b/bower_components/ckeditor/plugins/colordialog/lang/mk.js new file mode 100644 index 0000000..870e232 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","mk",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/mn.js b/bower_components/ckeditor/plugins/colordialog/lang/mn.js new file mode 100644 index 0000000..0547d82 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","mn",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/ms.js b/bower_components/ckeditor/plugins/colordialog/lang/ms.js new file mode 100644 index 0000000..65c6e81 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","ms",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/nb.js b/bower_components/ckeditor/plugins/colordialog/lang/nb.js new file mode 100644 index 0000000..dab73fd --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","nb",{clear:"Tøm",highlight:"Merk",options:"Alternativer for farge",selected:"Valgt",title:"Velg farge"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/nl.js b/bower_components/ckeditor/plugins/colordialog/lang/nl.js new file mode 100644 index 0000000..c2ed122 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","nl",{clear:"Wissen",highlight:"Actief",options:"Kleuropties",selected:"Geselecteerde kleur",title:"Selecteer kleur"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/no.js b/bower_components/ckeditor/plugins/colordialog/lang/no.js new file mode 100644 index 0000000..7a85302 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","no",{clear:"Tøm",highlight:"Merk",options:"Alternativer for farge",selected:"Valgt",title:"Velg farge"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/pl.js b/bower_components/ckeditor/plugins/colordialog/lang/pl.js new file mode 100644 index 0000000..3be00f6 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","pl",{clear:"Wyczyść",highlight:"Zaznacz",options:"Opcje koloru",selected:"Wybrany",title:"Wybierz kolor"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/pt-br.js b/bower_components/ckeditor/plugins/colordialog/lang/pt-br.js new file mode 100644 index 0000000..90c14fd --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","pt-br",{clear:"Limpar",highlight:"Grifar",options:"Opções de Cor",selected:"Cor Selecionada",title:"Selecione uma Cor"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/pt.js b/bower_components/ckeditor/plugins/colordialog/lang/pt.js new file mode 100644 index 0000000..ac36645 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","pt",{clear:"Limpar",highlight:"Realçar",options:"Opções de cor",selected:"Cor selecionada",title:"Selecionar cor"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/ro.js b/bower_components/ckeditor/plugins/colordialog/lang/ro.js new file mode 100644 index 0000000..85d83ff --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","ro",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/ru.js b/bower_components/ckeditor/plugins/colordialog/lang/ru.js new file mode 100644 index 0000000..7fe16d2 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","ru",{clear:"Очистить",highlight:"Под курсором",options:"Настройки цвета",selected:"Выбранный цвет",title:"Выберите цвет"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/si.js b/bower_components/ckeditor/plugins/colordialog/lang/si.js new file mode 100644 index 0000000..54bb692 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","si",{clear:"පැහැදිලි",highlight:"මතුකර පෙන්වන්න",options:"වර්ණ විකල්ප",selected:"තෙරු වර්ණ",title:"වර්ණ තෝරන්න"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/sk.js b/bower_components/ckeditor/plugins/colordialog/lang/sk.js new file mode 100644 index 0000000..be5f13a --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","sk",{clear:"Vyčistiť",highlight:"Zvýrazniť",options:"Možnosti farby",selected:"Vybraná farba",title:"Vyberte farbu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/sl.js b/bower_components/ckeditor/plugins/colordialog/lang/sl.js new file mode 100644 index 0000000..610c269 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","sl",{clear:"Počisti",highlight:"Poudarjeno",options:"Barvne Možnosti",selected:"Izbrano",title:"Izberi barvo"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/sq.js b/bower_components/ckeditor/plugins/colordialog/lang/sq.js new file mode 100644 index 0000000..f739ac4 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","sq",{clear:"Pastro",highlight:"Thekso",options:"Përzgjedhjet e Ngjyrave",selected:"Ngjyra e Përzgjedhur",title:"Përzgjidh një ngjyrë"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/sr-latn.js b/bower_components/ckeditor/plugins/colordialog/lang/sr-latn.js new file mode 100644 index 0000000..cd518c9 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","sr-latn",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/sr.js b/bower_components/ckeditor/plugins/colordialog/lang/sr.js new file mode 100644 index 0000000..227ed2e --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","sr",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/sv.js b/bower_components/ckeditor/plugins/colordialog/lang/sv.js new file mode 100644 index 0000000..d527156 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","sv",{clear:"Rensa",highlight:"Markera",options:"Färgalternativ",selected:"Vald färg",title:"Välj färg"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/th.js b/bower_components/ckeditor/plugins/colordialog/lang/th.js new file mode 100644 index 0000000..8f352d9 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","th",{clear:"Clear",highlight:"Highlight",options:"Color Options",selected:"Selected Color",title:"Select color"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/tr.js b/bower_components/ckeditor/plugins/colordialog/lang/tr.js new file mode 100644 index 0000000..c416c06 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","tr",{clear:"Temizle",highlight:"İşaretle",options:"Renk Seçenekleri",selected:"Seçilmiş",title:"Renk seç"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/tt.js b/bower_components/ckeditor/plugins/colordialog/lang/tt.js new file mode 100644 index 0000000..df9d32a --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","tt",{clear:"Бушату",highlight:"Билгеләү",options:"Төс көйләүләре",selected:"Сайланган төсләр",title:"Төс сайлау"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/ug.js b/bower_components/ckeditor/plugins/colordialog/lang/ug.js new file mode 100644 index 0000000..f89a948 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","ug",{clear:"تازىلا",highlight:"يورۇت",options:"رەڭ تاللانمىسى",selected:"رەڭ تاللاڭ",title:"رەڭ تاللاڭ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/uk.js b/bower_components/ckeditor/plugins/colordialog/lang/uk.js new file mode 100644 index 0000000..c59d1de --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","uk",{clear:"Очистити",highlight:"Колір, на який вказує курсор",options:"Опції кольорів",selected:"Обраний колір",title:"Обрати колір"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/vi.js b/bower_components/ckeditor/plugins/colordialog/lang/vi.js new file mode 100644 index 0000000..dae8623 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","vi",{clear:"Xóa bỏ",highlight:"Màu chọn",options:"Tùy chọn màu",selected:"Màu đã chọn",title:"Chọn màu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/zh-cn.js b/bower_components/ckeditor/plugins/colordialog/lang/zh-cn.js new file mode 100644 index 0000000..25e3b00 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","zh-cn",{clear:"清除",highlight:"高亮",options:"颜色选项",selected:"选择颜色",title:"选择颜色"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/lang/zh.js b/bower_components/ckeditor/plugins/colordialog/lang/zh.js new file mode 100644 index 0000000..57868b9 --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("colordialog","zh",{clear:"清除",highlight:"高亮",options:"色彩選項",selected:"選取的色彩",title:"選取色彩"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/colordialog/plugin.js b/bower_components/ckeditor/plugins/colordialog/plugin.js new file mode 100644 index 0000000..45b58ac --- /dev/null +++ b/bower_components/ckeditor/plugins/colordialog/plugin.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.colordialog={requires:"dialog",lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",init:function(b){var c=new CKEDITOR.dialogCommand("colordialog");c.editorFocus=!1;b.addCommand("colordialog",c);CKEDITOR.dialog.add("colordialog",this.path+"dialogs/colordialog.js");b.getColorFromDialog=function(c,f){var d=function(a){this.removeListener("ok", +d);this.removeListener("cancel",d);a="ok"==a.name?this.getValueOf("picker","selectedColor"):null;c.call(f,a)},e=function(a){a.on("ok",d);a.on("cancel",d)};b.execCommand("colordialog");if(b._.storedDialogs&&b._.storedDialogs.colordialog)e(b._.storedDialogs.colordialog);else CKEDITOR.on("dialogDefinition",function(a){if("colordialog"==a.data.name){var b=a.data.definition;a.removeListener();b.onLoad=CKEDITOR.tools.override(b.onLoad,function(a){return function(){e(this);b.onLoad=a;"function"==typeof a&& +a.call(this)}})}})}}};CKEDITOR.plugins.add("colordialog",CKEDITOR.plugins.colordialog); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/_translationstatus.txt b/bower_components/ckeditor/plugins/devtools/lang/_translationstatus.txt new file mode 100644 index 0000000..5da931c --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/_translationstatus.txt @@ -0,0 +1,27 @@ +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license + +bg.js Found: 5 Missing: 0 +cs.js Found: 5 Missing: 0 +cy.js Found: 5 Missing: 0 +da.js Found: 5 Missing: 0 +de.js Found: 5 Missing: 0 +el.js Found: 5 Missing: 0 +eo.js Found: 5 Missing: 0 +et.js Found: 5 Missing: 0 +fa.js Found: 5 Missing: 0 +fi.js Found: 5 Missing: 0 +fr.js Found: 5 Missing: 0 +gu.js Found: 5 Missing: 0 +he.js Found: 5 Missing: 0 +hr.js Found: 5 Missing: 0 +it.js Found: 5 Missing: 0 +nb.js Found: 5 Missing: 0 +nl.js Found: 5 Missing: 0 +no.js Found: 5 Missing: 0 +pl.js Found: 5 Missing: 0 +tr.js Found: 5 Missing: 0 +ug.js Found: 5 Missing: 0 +uk.js Found: 5 Missing: 0 +vi.js Found: 5 Missing: 0 +zh-cn.js Found: 5 Missing: 0 diff --git a/bower_components/ckeditor/plugins/devtools/lang/ar.js b/bower_components/ckeditor/plugins/devtools/lang/ar.js new file mode 100644 index 0000000..9355fc1 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/ar.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","ar",{title:"معلومات العنصر",dialogName:"إسم نافذة الحوار",tabName:"إسم التبويب",elementId:"إسم العنصر",elementType:"نوع العنصر"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/bg.js b/bower_components/ckeditor/plugins/devtools/lang/bg.js new file mode 100644 index 0000000..5746bca --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/bg.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","bg",{title:"Информация за елемента",dialogName:"Име на диалоговия прозорец",tabName:"Име на таб",elementId:"ID на елемента",elementType:"Тип на елемента"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/ca.js b/bower_components/ckeditor/plugins/devtools/lang/ca.js new file mode 100644 index 0000000..4064597 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/ca.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","ca",{title:"Informació de l'element",dialogName:"Nom de la finestra de quadre de diàleg",tabName:"Nom de la pestanya",elementId:"ID de l'element",elementType:"Tipus d'element"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/cs.js b/bower_components/ckeditor/plugins/devtools/lang/cs.js new file mode 100644 index 0000000..b218c49 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/cs.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","cs",{title:"Informace o prvku",dialogName:"Název dialogového okna",tabName:"Název karty",elementId:"ID prvku",elementType:"Typ prvku"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/cy.js b/bower_components/ckeditor/plugins/devtools/lang/cy.js new file mode 100644 index 0000000..de29267 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/cy.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","cy",{title:"Gwybodaeth am yr Elfen",dialogName:"Enw ffenestr y deialog",tabName:"Enw'r tab",elementId:"ID yr Elfen",elementType:"Math yr elfen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/da.js b/bower_components/ckeditor/plugins/devtools/lang/da.js new file mode 100644 index 0000000..481af36 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/da.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","da",{title:"Information på elementet",dialogName:"Dialogboks",tabName:"Tab beskrivelse",elementId:"ID på element",elementType:"Type af element"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/de.js b/bower_components/ckeditor/plugins/devtools/lang/de.js new file mode 100644 index 0000000..b892abb --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/de.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","de",{title:"Elementinformation",dialogName:"Dialogfenstername",tabName:"Reitername",elementId:"Element ID",elementType:"Elementtyp"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/el.js b/bower_components/ckeditor/plugins/devtools/lang/el.js new file mode 100644 index 0000000..6159451 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/el.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","el",{title:"Πληροφορίες Στοιχείου",dialogName:"Όνομα παραθύρου διαλόγου",tabName:"Όνομα καρτέλας",elementId:"Αναγνωριστικό Στοιχείου",elementType:"Τύπος στοιχείου"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/en-gb.js b/bower_components/ckeditor/plugins/devtools/lang/en-gb.js new file mode 100644 index 0000000..a5a0fae --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/en-gb.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","en-gb",{title:"Element Information",dialogName:"Dialogue window name",tabName:"Tab name",elementId:"Element ID",elementType:"Element type"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/en.js b/bower_components/ckeditor/plugins/devtools/lang/en.js new file mode 100644 index 0000000..3b0c0ec --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/en.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","en",{title:"Element Information",dialogName:"Dialog window name",tabName:"Tab name",elementId:"Element ID",elementType:"Element type"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/eo.js b/bower_components/ckeditor/plugins/devtools/lang/eo.js new file mode 100644 index 0000000..58b9a32 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/eo.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","eo",{title:"Informo pri la elemento",dialogName:"Nomo de la dialogfenestro",tabName:"Langetnomo",elementId:"ID de la elemento",elementType:"Tipo de la elemento"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/es.js b/bower_components/ckeditor/plugins/devtools/lang/es.js new file mode 100644 index 0000000..2cb40de --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/es.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","es",{title:"Información del Elemento",dialogName:"Nombre de la ventana de diálogo",tabName:"Nombre de la pestaña",elementId:"ID del Elemento",elementType:"Tipo del elemento"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/et.js b/bower_components/ckeditor/plugins/devtools/lang/et.js new file mode 100644 index 0000000..3257e0e --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/et.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","et",{title:"Elemendi andmed",dialogName:"Dialoogiakna nimi",tabName:"Saki nimi",elementId:"Elemendi ID",elementType:"Elemendi liik"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/eu.js b/bower_components/ckeditor/plugins/devtools/lang/eu.js new file mode 100644 index 0000000..dcd0f25 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/eu.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","eu",{title:"Elementuaren Informazioa",dialogName:"Elkarrizketa leihoaren izena",tabName:"Fitxaren izena",elementId:"Elementuaren ID-a",elementType:"Elementu mota"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/fa.js b/bower_components/ckeditor/plugins/devtools/lang/fa.js new file mode 100644 index 0000000..548f368 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/fa.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","fa",{title:"اطلاعات عنصر",dialogName:"نام پنجره محاوره‌ای",tabName:"نام برگه",elementId:"ID عنصر",elementType:"نوع عنصر"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/fi.js b/bower_components/ckeditor/plugins/devtools/lang/fi.js new file mode 100644 index 0000000..a519460 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/fi.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","fi",{title:"Elementin tiedot",dialogName:"Dialogi-ikkunan nimi",tabName:"Välilehden nimi",elementId:"Elementin ID",elementType:"Elementin tyyppi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/fr-ca.js b/bower_components/ckeditor/plugins/devtools/lang/fr-ca.js new file mode 100644 index 0000000..4832c1f --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/fr-ca.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","fr-ca",{title:"Information de l'élément",dialogName:"Nom de la fenêtre",tabName:"Nom de l'onglet",elementId:"ID de l'élément",elementType:"Type de l'élément"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/fr.js b/bower_components/ckeditor/plugins/devtools/lang/fr.js new file mode 100644 index 0000000..2422708 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/fr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","fr",{title:"Information sur l'élément",dialogName:"Nom de la fenêtre de dialogue",tabName:"Nom de l'onglet",elementId:"ID de l'élément",elementType:"Type de l'élément"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/gl.js b/bower_components/ckeditor/plugins/devtools/lang/gl.js new file mode 100644 index 0000000..bc4743e --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/gl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","gl",{title:"Información do elemento",dialogName:"Nome da xanela de diálogo",tabName:"Nome da lapela",elementId:"ID do elemento",elementType:"Tipo do elemento"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/gu.js b/bower_components/ckeditor/plugins/devtools/lang/gu.js new file mode 100644 index 0000000..a92cba2 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/gu.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","gu",{title:"પ્રાથમિક માહિતી",dialogName:"વિન્ડોનું નામ",tabName:"ટેબનું નામ",elementId:"પ્રાથમિક આઈડી",elementType:"પ્રાથમિક પ્રકાર"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/he.js b/bower_components/ckeditor/plugins/devtools/lang/he.js new file mode 100644 index 0000000..9c44035 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/he.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","he",{title:"מידע על האלמנט",dialogName:"שם הדיאלוג",tabName:"שם הטאב",elementId:"ID של האלמנט",elementType:"סוג האלמנט"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/hr.js b/bower_components/ckeditor/plugins/devtools/lang/hr.js new file mode 100644 index 0000000..24f0b98 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/hr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","hr",{title:"Informacije elementa",dialogName:"Naziv prozora za dijalog",tabName:"Naziva jahača",elementId:"ID elementa",elementType:"Vrsta elementa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/hu.js b/bower_components/ckeditor/plugins/devtools/lang/hu.js new file mode 100644 index 0000000..e76bdac --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/hu.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","hu",{title:"Elem információ",dialogName:"Párbeszédablak neve",tabName:"Fül neve",elementId:"Elem ID",elementType:"Elem típusa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/id.js b/bower_components/ckeditor/plugins/devtools/lang/id.js new file mode 100644 index 0000000..7a827c5 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/id.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","id",{title:"Informasi Elemen",dialogName:"Nama jendela dialog",tabName:"Nama tab",elementId:"ID Elemen",elementType:"Tipe elemen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/it.js b/bower_components/ckeditor/plugins/devtools/lang/it.js new file mode 100644 index 0000000..2a54807 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/it.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","it",{title:"Informazioni elemento",dialogName:"Nome finestra di dialogo",tabName:"Nome Tab",elementId:"ID Elemento",elementType:"Tipo elemento"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/ja.js b/bower_components/ckeditor/plugins/devtools/lang/ja.js new file mode 100644 index 0000000..6c19cf9 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/ja.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","ja",{title:"エレメント情報",dialogName:"ダイアログウィンドウ名",tabName:"タブ名",elementId:"エレメントID",elementType:"要素タイプ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/km.js b/bower_components/ckeditor/plugins/devtools/lang/km.js new file mode 100644 index 0000000..20f7e68 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/km.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","km",{title:"ព័ត៌មាន​នៃ​ធាតុ",dialogName:"ឈ្មោះ​ប្រអប់​វីនដូ",tabName:"ឈ្មោះ​ផ្ទាំង",elementId:"អត្តលេខ​ធាតុ",elementType:"ប្រភេទ​ធាតុ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/ko.js b/bower_components/ckeditor/plugins/devtools/lang/ko.js new file mode 100644 index 0000000..9215191 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/ko.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","ko",{title:"구성 요소 정보",dialogName:"다이얼로그 윈도우 이름",tabName:"탭 이름",elementId:"요소 ID",elementType:"요소 형식"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/ku.js b/bower_components/ckeditor/plugins/devtools/lang/ku.js new file mode 100644 index 0000000..8ff78d6 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/ku.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","ku",{title:"زانیاری توخم",dialogName:"ناوی پەنجەرەی دیالۆگ",tabName:"ناوی بازدەر تاب",elementId:"ناسنامەی توخم",elementType:"جۆری توخم"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/lt.js b/bower_components/ckeditor/plugins/devtools/lang/lt.js new file mode 100644 index 0000000..9074f69 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/lt.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","lt",{title:"Elemento informacija",dialogName:"Dialogo lango pavadinimas",tabName:"Auselės pavadinimas",elementId:"Elemento ID",elementType:"Elemento tipas"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/lv.js b/bower_components/ckeditor/plugins/devtools/lang/lv.js new file mode 100644 index 0000000..2929c6c --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/lv.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","lv",{title:"Elementa informācija",dialogName:"Dialoga loga nosaukums",tabName:"Cilnes nosaukums",elementId:"Elementa ID",elementType:"Elementa tips"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/nb.js b/bower_components/ckeditor/plugins/devtools/lang/nb.js new file mode 100644 index 0000000..a408087 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/nb.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","nb",{title:"Elementinformasjon",dialogName:"Navn på dialogvindu",tabName:"Navn på fane",elementId:"Element-ID",elementType:"Elementtype"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/nl.js b/bower_components/ckeditor/plugins/devtools/lang/nl.js new file mode 100644 index 0000000..3f062b9 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/nl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","nl",{title:"Elementinformatie",dialogName:"Naam dialoogvenster",tabName:"Tabnaam",elementId:"Element ID",elementType:"Elementtype"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/no.js b/bower_components/ckeditor/plugins/devtools/lang/no.js new file mode 100644 index 0000000..ecc2e5a --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/no.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","no",{title:"Elementinformasjon",dialogName:"Navn på dialogvindu",tabName:"Navn på fane",elementId:"Element-ID",elementType:"Elementtype"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/pl.js b/bower_components/ckeditor/plugins/devtools/lang/pl.js new file mode 100644 index 0000000..dad1ef0 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/pl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","pl",{title:"Informacja o elemencie",dialogName:"Nazwa okna dialogowego",tabName:"Nazwa zakładki",elementId:"ID elementu",elementType:"Typ elementu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/pt-br.js b/bower_components/ckeditor/plugins/devtools/lang/pt-br.js new file mode 100644 index 0000000..65dadf0 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/pt-br.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","pt-br",{title:"Informação do Elemento",dialogName:"Nome da janela de diálogo",tabName:"Nome da aba",elementId:"ID do Elemento",elementType:"Tipo do elemento"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/pt.js b/bower_components/ckeditor/plugins/devtools/lang/pt.js new file mode 100644 index 0000000..562cba9 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/pt.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","pt",{title:"Informação do elemento",dialogName:"Nome da janela de diálogo",tabName:"Nome do separador",elementId:"ID do elemento",elementType:"Tipo de Elemento"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/ru.js b/bower_components/ckeditor/plugins/devtools/lang/ru.js new file mode 100644 index 0000000..4e37375 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/ru.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","ru",{title:"Информация об элементе",dialogName:"Имя окна диалога",tabName:"Имя вкладки",elementId:"ID элемента",elementType:"Тип элемента"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/si.js b/bower_components/ckeditor/plugins/devtools/lang/si.js new file mode 100644 index 0000000..c8a5199 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/si.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","si",{title:"මුලද්‍රව්‍ය ",dialogName:"දෙබස් කවුළුවේ නම",tabName:"තීරුවේ නම",elementId:"මුලද්‍රව්‍ය කේතය",elementType:"මුලද්‍රව්‍ය වර්ගය"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/sk.js b/bower_components/ckeditor/plugins/devtools/lang/sk.js new file mode 100644 index 0000000..61583f0 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/sk.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","sk",{title:"Informácie o prvku",dialogName:"Názov okna dialógu",tabName:"Názov záložky",elementId:"ID prvku",elementType:"Typ prvku"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/sl.js b/bower_components/ckeditor/plugins/devtools/lang/sl.js new file mode 100644 index 0000000..092bf8f --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/sl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","sl",{title:"Podatki elementa",dialogName:"Ime pogovornega okna",tabName:"Ime zavihka",elementId:"ID elementa",elementType:"Tip elementa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/sq.js b/bower_components/ckeditor/plugins/devtools/lang/sq.js new file mode 100644 index 0000000..794b939 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/sq.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","sq",{title:"Të dhënat e elementit",dialogName:"Emri i dritares së dialogut",tabName:"Emri i fletës",elementId:"ID e elementit",elementType:"Lloji i elementit"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/sv.js b/bower_components/ckeditor/plugins/devtools/lang/sv.js new file mode 100644 index 0000000..9258458 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/sv.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","sv",{title:"Elementinformation",dialogName:"Dialogrutans namn",tabName:"Fliknamn",elementId:"Elementet-ID",elementType:"Elementet-typ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/tr.js b/bower_components/ckeditor/plugins/devtools/lang/tr.js new file mode 100644 index 0000000..0e40959 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/tr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","tr",{title:"Eleman Bilgisi",dialogName:"İletişim pencere ismi",tabName:"Sekme adı",elementId:"Eleman ID",elementType:"Eleman türü"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/tt.js b/bower_components/ckeditor/plugins/devtools/lang/tt.js new file mode 100644 index 0000000..1360d5d --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/tt.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","tt",{title:"Элемент тасвирламасы",dialogName:"Диалог тәрәзәсе исеме",tabName:"Өстәмә бит исеме",elementId:"Элемент идентификаторы",elementType:"Элемент төре"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/ug.js b/bower_components/ckeditor/plugins/devtools/lang/ug.js new file mode 100644 index 0000000..2509224 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/ug.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","ug",{title:"ئېلېمېنت ئۇچۇرى",dialogName:"سۆزلەشكۈ كۆزنەك ئاتى",tabName:"Tab ئاتى",elementId:"ئېلېمېنت كىملىكى",elementType:"ئېلېمېنت تىپى"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/uk.js b/bower_components/ckeditor/plugins/devtools/lang/uk.js new file mode 100644 index 0000000..f833bee --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/uk.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","uk",{title:"Відомості про Елемент",dialogName:"Заголовок діалогового вікна",tabName:"Назва вкладки",elementId:"Ідентифікатор Елемента",elementType:"Тип Елемента"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/vi.js b/bower_components/ckeditor/plugins/devtools/lang/vi.js new file mode 100644 index 0000000..795cb80 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/vi.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","vi",{title:"Thông tin thành ph",dialogName:"Tên hộp tho",tabName:"Tên th",elementId:"Mã thành ph",elementType:"Loại thành ph"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/zh-cn.js b/bower_components/ckeditor/plugins/devtools/lang/zh-cn.js new file mode 100644 index 0000000..4231f20 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/zh-cn.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","zh-cn",{title:"元素信息",dialogName:"对话框窗口名称",tabName:"选项卡名称",elementId:"元素 ID",elementType:"元素类型"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/lang/zh.js b/bower_components/ckeditor/plugins/devtools/lang/zh.js new file mode 100644 index 0000000..5ef9b3d --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/lang/zh.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("devtools","zh",{title:"元件資訊",dialogName:"對話視窗名稱",tabName:"標籤名稱",elementId:"元件 ID",elementType:"元件類型"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/devtools/plugin.js b/bower_components/ckeditor/plugins/devtools/plugin.js new file mode 100644 index 0000000..e558937 --- /dev/null +++ b/bower_components/ckeditor/plugins/devtools/plugin.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.add("devtools",{lang:"ar,bg,ca,cs,cy,da,de,el,en,en-gb,eo,es,et,eu,fa,fi,fr,fr-ca,gl,gu,he,hr,hu,id,it,ja,km,ko,ku,lt,lv,nb,nl,no,pl,pt,pt-br,ru,si,sk,sl,sq,sv,tr,tt,ug,uk,vi,zh,zh-cn",init:function(i){i._.showDialogDefinitionTooltips=1},onLoad:function(){CKEDITOR.document.appendStyleText(CKEDITOR.config.devtools_styles||"#cke_tooltip { padding: 5px; border: 2px solid #333; background: #ffffff }#cke_tooltip h2 { font-size: 1.1em; border-bottom: 1px solid; margin: 0; padding: 1px; }#cke_tooltip ul { padding: 0pt; list-style-type: none; }")}}); +(function(){function i(a,c,b,f){var a=a.lang.devtools,j=''+(b?b.type:"content")+"",c="

        "+a.title+"

        • "+a.dialogName+" : "+c.getName()+"
        • "+a.tabName+" : "+f+"
        • ";b&&(c+="
        • "+a.elementId+" : "+b.id+"
        • ");c+="
        • "+a.elementType+" : "+j+"
        • ";return c+"
        "}function k(d, +c,b,f,j,g){var e=c.getDocumentPosition(),h={"z-index":CKEDITOR.dialog._.currentZIndex+10,top:e.y+c.getSize("height")+"px"};a.setHtml(d(b,f,j,g));a.show();"rtl"==b.lang.dir?(d=CKEDITOR.document.getWindow().getViewPaneSize(),h.right=d.width-e.x-c.getSize("width")+"px"):h.left=e.x+"px";a.setStyles(h)}var a;CKEDITOR.on("reset",function(){a&&a.remove();a=null});CKEDITOR.on("dialogDefinition",function(d){var c=d.editor;if(c._.showDialogDefinitionTooltips){a||(a=CKEDITOR.dom.element.createFromHtml('
        ', +CKEDITOR.document),a.hide(),a.on("mouseover",function(){this.show()}),a.on("mouseout",function(){this.hide()}),a.appendTo(CKEDITOR.document.getBody()));var b=d.data.definition.dialog,f=c.config.devtools_textCallback||i;b.on("load",function(){for(var d=b.parts.tabs.getChildren(),g,e=0,h=d.count();e');a.ui.space("contents").append(b);b=a.editable(b);b.detach=CKEDITOR.tools.override(b.detach,function(a){return function(){a.apply(this,arguments);this.remove()}});a.setData(a.getData(1),c);a.fire("contentDom")})}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/dialogs/docprops.js b/bower_components/ckeditor/plugins/docprops/dialogs/docprops.js new file mode 100644 index 0000000..06ab51a --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/dialogs/docprops.js @@ -0,0 +1,25 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("docProps",function(g){function p(a,d){var e=function(){b(this);d(this,this._.parentDialog)},b=function(a){a.removeListener("ok",e);a.removeListener("cancel",b)},f=function(a){a.on("ok",e);a.on("cancel",b)};g.execCommand(a);if(g._.storedDialogs.colordialog)f(g._.storedDialogs.colordialog);else CKEDITOR.on("dialogDefinition",function(b){if(b.data.name==a){var d=b.data.definition;b.removeListener();d.onLoad=CKEDITOR.tools.override(d.onLoad,function(a){return function(){f(this);d.onLoad= +a;"function"==typeof a&&a.call(this)}})}})}function l(){var a=this.getDialog().getContentElement("general",this.id+"Other");a&&("other"==this.getValue()?(a.getInputElement().removeAttribute("readOnly"),a.focus(),a.getElement().removeClass("cke_disabled")):(a.getInputElement().setAttribute("readOnly",!0),a.getElement().addClass("cke_disabled")))}function i(a,d,e){return function(b,f,c){f=k;b="undefined"!=typeof e?e:this.getValue();!b&&a in f?f[a].remove():b&&a in f?f[a].setAttribute("content",b):b&& +(f=new CKEDITOR.dom.element("meta",g.document),f.setAttribute(d?"http-equiv":"name",a),f.setAttribute("content",b),c.append(f))}}function j(a,d){return function(){var e=k,e=a in e?e[a].getAttribute("content")||"":"";if(d)return e;this.setValue(e);return null}}function m(a){return function(d,e,b,f){f.removeAttribute("margin"+a);d=this.getValue();""!==d?f.setStyle("margin-"+a,CKEDITOR.tools.cssLength(d)):f.removeStyle("margin-"+a)}}function n(a,d,e){a.removeStyle(d);a.getComputedStyle(d)!=e&&a.setStyle(d, +e)}var c=g.lang.docprops,h=g.lang.common,k={},o=function(a,d,e){return{type:"hbox",padding:0,widths:["60%","40%"],children:[CKEDITOR.tools.extend({type:"text",id:a,label:c[d]},e||{},1),{type:"button",id:a+"Choose",label:c.chooseColor,className:"colorChooser",onClick:function(){var b=this;p("colordialog",function(d){var e=b.getDialog();e.getContentElement(e._.currentTabId,a).setValue(d.getContentElement("picker","selectedColor").getValue())})}}]}},q="javascript:void((function(){"+encodeURIComponent("document.open();"+ +(CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"")+'document.write( \''+c.previewHtml+"' );document.close();")+"})())";return{title:c.title,minHeight:330,minWidth:500,onShow:function(){for(var a=g.document,d=a.getElementsByTag("html").getItem(0),e=a.getHead(),b=a.getBody(),f={},c=a.getElementsByTag("meta"),h=c.count(),i=0;i'],["XHTML 1.0 Transitional",''],["XHTML 1.0 Strict",''],["XHTML 1.0 Frameset",''], +["HTML 5",""],["HTML 4.01 Transitional",''],["HTML 4.01 Strict",''],["HTML 4.01 Frameset",''],["HTML 3.2",''],["HTML 2.0",''],[c.other, +"other"]],onChange:l,setup:function(){if(g.docType&&(this.setValue(g.docType),!this.getValue())){this.setValue("other");var a=this.getDialog().getContentElement("general","docTypeOther");a&&a.setValue(g.docType)}l.call(this)},commit:function(a,d,c,b,f){f||(a=this.getValue(),d=this.getDialog().getContentElement("general","docTypeOther"),g.docType="other"==a?d?d.getValue():"":a)}},{type:"text",id:"docTypeOther",label:c.docTypeOther}]},{type:"checkbox",id:"xhtmlDec",label:c.xhtmlDec,setup:function(){this.setValue(!!g.xmlDeclaration)}, +commit:function(a,d,c,b,f){f||(this.getValue()?(g.xmlDeclaration='',d.setAttribute("xmlns","http://www.w3.org/1999/xhtml")):(g.xmlDeclaration="",d.removeAttribute("xmlns")))}}]},{id:"design",label:c.design,elements:[{type:"hbox",widths:["60%","40%"],children:[{type:"vbox",children:[o("txtColor","txtColor",{setup:function(a,d,c,b){this.setValue(b.getComputedStyle("color"))},commit:function(a,d,c,b,f){if(this.isChanged()|| +f)b.removeAttribute("text"),(a=this.getValue())?b.setStyle("color",a):b.removeStyle("color")}}),o("bgColor","bgColor",{setup:function(a,d,c,b){a=b.getComputedStyle("background-color")||"";this.setValue("transparent"==a?"":a)},commit:function(a,d,c,b,f){if(this.isChanged()||f)b.removeAttribute("bgcolor"),(a=this.getValue())?b.setStyle("background-color",a):n(b,"background-color","transparent")}}),{type:"hbox",widths:["60%","40%"],padding:1,children:[{type:"text",id:"bgImage",label:c.bgImage,setup:function(a, +d,c,b){a=b.getComputedStyle("background-image")||"";a="none"==a?"":a.replace(/url\(\s*(["']?)\s*([^\)]*)\s*\1\s*\)/i,function(a,b,d){return d});this.setValue(a)},commit:function(a,d,c,b){b.removeAttribute("background");(a=this.getValue())?b.setStyle("background-image","url("+a+")"):n(b,"background-image","none")}},{type:"button",id:"bgImageChoose",label:h.browseServer,style:"display:inline-block;margin-top:10px;",hidden:!0,filebrowser:"design:bgImage"}]},{type:"checkbox",id:"bgFixed",label:c.bgFixed, +setup:function(a,d,c,b){this.setValue("fixed"==b.getComputedStyle("background-attachment"))},commit:function(a,d,c,b){this.getValue()?b.setStyle("background-attachment","fixed"):n(b,"background-attachment","scroll")}}]},{type:"vbox",children:[{type:"html",id:"marginTitle",html:'
        '+c.margin+"
        "},{type:"text",id:"marginTop",label:c.marginTop,style:"width: 80px; text-align: center",align:"center",inputStyle:"text-align: center", +setup:function(a,d,c,b){this.setValue(b.getStyle("margin-top")||b.getAttribute("margintop")||"")},commit:m("top")},{type:"hbox",children:[{type:"text",id:"marginLeft",label:c.marginLeft,style:"width: 80px; text-align: center",align:"center",inputStyle:"text-align: center",setup:function(a,d,c,b){this.setValue(b.getStyle("margin-left")||b.getAttribute("marginleft")||"")},commit:m("left")},{type:"text",id:"marginRight",label:c.marginRight,style:"width: 80px; text-align: center",align:"center",inputStyle:"text-align: center", +setup:function(a,d,c,b){this.setValue(b.getStyle("margin-right")||b.getAttribute("marginright")||"")},commit:m("right")}]},{type:"text",id:"marginBottom",label:c.marginBottom,style:"width: 80px; text-align: center",align:"center",inputStyle:"text-align: center",setup:function(a,c,e,b){this.setValue(b.getStyle("margin-bottom")||b.getAttribute("marginbottom")||"")},commit:m("bottom")}]}]}]},{id:"meta",label:c.meta,elements:[{type:"textarea",id:"metaKeywords",label:c.metaKeywords,setup:j("keywords"), +commit:i("keywords")},{type:"textarea",id:"metaDescription",label:c.metaDescription,setup:j("description"),commit:i("description")},{type:"text",id:"metaAuthor",label:c.metaAuthor,setup:j("author"),commit:i("author")},{type:"text",id:"metaCopyright",label:c.metaCopyright,setup:j("copyright"),commit:i("copyright")}]},{id:"preview",label:h.preview,elements:[{type:"html",id:"previewHtml",html:'',onLoad:function(){var a= +this.getElement();this.getDialog().on("selectPage",function(c){if("preview"==c.data.page){var e=this;setTimeout(function(){var b=a.getFrameDocument(),c=b.getElementsByTag("html").getItem(0),d=b.getHead(),g=b.getBody();e.commitContent(b,c,d,g,1)},50)}});a.getAscendant("table").setStyle("height","100%")}}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/icons/docprops-rtl.png b/bower_components/ckeditor/plugins/docprops/icons/docprops-rtl.png new file mode 100644 index 0000000..ed286a2 Binary files /dev/null and b/bower_components/ckeditor/plugins/docprops/icons/docprops-rtl.png differ diff --git a/bower_components/ckeditor/plugins/docprops/icons/docprops.png b/bower_components/ckeditor/plugins/docprops/icons/docprops.png new file mode 100644 index 0000000..8bfdcb9 Binary files /dev/null and b/bower_components/ckeditor/plugins/docprops/icons/docprops.png differ diff --git a/bower_components/ckeditor/plugins/docprops/icons/hidpi/docprops-rtl.png b/bower_components/ckeditor/plugins/docprops/icons/hidpi/docprops-rtl.png new file mode 100644 index 0000000..4a966da Binary files /dev/null and b/bower_components/ckeditor/plugins/docprops/icons/hidpi/docprops-rtl.png differ diff --git a/bower_components/ckeditor/plugins/docprops/icons/hidpi/docprops.png b/bower_components/ckeditor/plugins/docprops/icons/hidpi/docprops.png new file mode 100644 index 0000000..a66c869 Binary files /dev/null and b/bower_components/ckeditor/plugins/docprops/icons/hidpi/docprops.png differ diff --git a/bower_components/ckeditor/plugins/docprops/lang/af.js b/bower_components/ckeditor/plugins/docprops/lang/af.js new file mode 100644 index 0000000..dbda4d7 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/af.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","af",{bgColor:"Agtergrond kleur",bgFixed:"Vasgeklemde Agtergrond",bgImage:"Agtergrond Beeld URL",charset:"Karakterstel Kodeering",charsetASCII:"ASCII",charsetCE:"Sentraal Europa",charsetCR:"Cyrillic",charsetCT:"Chinees Traditioneel (Big5)",charsetGR:"Grieks",charsetJP:"Japanees",charsetKR:"Koreans",charsetOther:"Ander Karakterstel Kodeering",charsetTR:"Turks",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Kies",design:"Design",docTitle:"Bladsy Opskrif", +docType:"Dokument Opskrif Soort",docTypeOther:"Ander Dokument Opskrif Soort",label:"Dokument Eienskappe",margin:"Bladsy Rante",marginBottom:"Onder",marginLeft:"Links",marginRight:"Regs",marginTop:"Bo",meta:"Meta Data",metaAuthor:"Skrywer",metaCopyright:"Kopiereg",metaDescription:"Dokument Beskrywing",metaKeywords:"Dokument Index Sleutelwoorde(comma verdeelt)",other:"",previewHtml:'

        This is some sample text. You are using CKEditor.

        ',title:"Dokument Eienskappe", +txtColor:"Tekskleur",xhtmlDec:"Voeg XHTML verklaring by"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/ar.js b/bower_components/ckeditor/plugins/docprops/lang/ar.js new file mode 100644 index 0000000..bd26b49 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/ar.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("docprops","ar",{bgColor:"لون الخلفية",bgFixed:"جعلها علامة مائية",bgImage:"رابط الصورة الخلفية",charset:"ترميز الحروف",charsetASCII:"ASCII",charsetCE:"أوروبا الوسطى",charsetCR:"السيريلية",charsetCT:"الصينية التقليدية (Big5)",charsetGR:"اليونانية",charsetJP:"اليابانية",charsetKR:"الكورية",charsetOther:"ترميز آخر",charsetTR:"التركية",charsetUN:"Unicode (UTF-8)",charsetWE:"أوروبا الغربية",chooseColor:"اختر",design:"تصميم",docTitle:"عنوان الصفحة",docType:"ترويسة نوع الصفحة", +docTypeOther:"ترويسة نوع صفحة أخرى",label:"خصائص الصفحة",margin:"هوامش الصفحة",marginBottom:"سفلي",marginLeft:"أيسر",marginRight:"أيمن",marginTop:"علوي",meta:"المعرّفات الرأسية",metaAuthor:"الكاتب",metaCopyright:"المالك",metaDescription:"وصف الصفحة",metaKeywords:"الكلمات الأساسية (مفصولة بفواصل)َ",other:"<أخرى>",previewHtml:'

        هذه مجرد كتابة بسيطةمن أجل التمثيل. CKEditor.

        ',title:"خصائص الصفحة",txtColor:"لون النص",xhtmlDec:"تضمين إعلانات لغة XHTMLَ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/bg.js b/bower_components/ckeditor/plugins/docprops/lang/bg.js new file mode 100644 index 0000000..5faba47 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/bg.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","bg",{bgColor:"Фон",bgFixed:"Non-scrolling (Fixed) Background",bgImage:"Background Image URL",charset:"Кодова таблица",charsetASCII:"ASCII",charsetCE:"Централна европейска",charsetCR:"Cyrillic",charsetCT:"Китайски традиционен",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"Друга кодова таблица",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Изберете",design:"Дизайн",docTitle:"Заглавие на страницата", +docType:"Document Type Heading",docTypeOther:"Other Document Type Heading",label:"Настройки на документа",margin:"Page Margins",marginBottom:"Долу",marginLeft:"Ляво",marginRight:"Дясно",marginTop:"Горе",meta:"Мета етикети",metaAuthor:"Author",metaCopyright:"Copyright",metaDescription:"Document Description",metaKeywords:"Document Indexing Keywords (comma separated)",other:"Други...",previewHtml:'

        This is some sample text. You are using CKEditor.

        ', +title:"Настройки на документа",txtColor:"Цвят на шрифт",xhtmlDec:"Include XHTML Declarations"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/bn.js b/bower_components/ckeditor/plugins/docprops/lang/bn.js new file mode 100644 index 0000000..838cbc8 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/bn.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","bn",{bgColor:"ব্যাকগ্রাউন্ড রং",bgFixed:"স্ক্রলহীন ব্যাকগ্রাউন্ড",bgImage:"ব্যাকগ্রাউন্ড ছবির URL",charset:"ক্যারেক্টার সেট এনকোডিং",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"অন্য ক্যারেক্টার সেট এনকোডিং",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Choose",design:"Design",docTitle:"পেজ শীর্ষক", +docType:"ডক্যুমেন্ট টাইপ হেডিং",docTypeOther:"অন্য ডক্যুমেন্ট টাইপ হেডিং",label:"ডক্যুমেন্ট প্রোপার্টি",margin:"পেজ মার্জিন",marginBottom:"নীচে",marginLeft:"বামে",marginRight:"ডানে",marginTop:"উপর",meta:"মেটাডেটা",metaAuthor:"লেখক",metaCopyright:"কপীরাইট",metaDescription:"ডক্যূমেন্ট বর্ণনা",metaKeywords:"ডক্যুমেন্ট ইন্ডেক্স কিওয়ার্ড (কমা দ্বারা বিচ্ছিন্ন)",other:"",previewHtml:'

        This is some sample text. You are using CKEditor.

        ',title:"ডক্যুমেন্ট প্রোপার্টি", +txtColor:"টেক্স্ট রং",xhtmlDec:"XHTML ডেক্লারেশন যুক্ত কর"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/bs.js b/bower_components/ckeditor/plugins/docprops/lang/bs.js new file mode 100644 index 0000000..624acfc --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/bs.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","bs",{bgColor:"Background Color",bgFixed:"Non-scrolling (Fixed) Background",bgImage:"Background Image URL",charset:"Character Set Encoding",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"Other Character Set Encoding",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Choose",design:"Design", +docTitle:"Page Title",docType:"Document Type Heading",docTypeOther:"Other Document Type Heading",label:"Document Properties",margin:"Page Margins",marginBottom:"Dno",marginLeft:"Lijevo",marginRight:"Desno",marginTop:"Vrh",meta:"Meta Tags",metaAuthor:"Author",metaCopyright:"Copyright",metaDescription:"Document Description",metaKeywords:"Document Indexing Keywords (comma separated)",other:"Other...",previewHtml:'

        This is some sample text. You are using CKEditor.

        ', +title:"Document Properties",txtColor:"Boja teksta",xhtmlDec:"Include XHTML Declarations"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/ca.js b/bower_components/ckeditor/plugins/docprops/lang/ca.js new file mode 100644 index 0000000..6eafe7f --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/ca.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","ca",{bgColor:"Color de fons",bgFixed:"Fons sense desplaçament (Fixe)",bgImage:"URL de la imatge de fons",charset:"Codificació de conjunt de caràcters",charsetASCII:"ASCII",charsetCE:"Europeu Central",charsetCR:"Ciríl·lic",charsetCT:"Xinès tradicional (Big5)",charsetGR:"Grec",charsetJP:"Japonès",charsetKR:"Coreà",charsetOther:"Una altra codificació de caràcters",charsetTR:"Turc",charsetUN:"Unicode (UTF-8)",charsetWE:"Europeu occidental",chooseColor:"Triar",design:"Disseny", +docTitle:"Títol de la pàgina",docType:"Capçalera de tipus de document",docTypeOther:"Un altra capçalera de tipus de document",label:"Propietats del document",margin:"Marges de pàgina",marginBottom:"Peu",marginLeft:"Esquerra",marginRight:"Dreta",marginTop:"Cap",meta:"Metadades",metaAuthor:"Autor",metaCopyright:"Copyright",metaDescription:"Descripció del document",metaKeywords:"Paraules clau per a indexació (separats per coma)",other:"Altre...",previewHtml:'

        Aquest és un text d\'exemple. Estàs utilitzant CKEditor.

        ', +title:"Propietats del document",txtColor:"Color de Text",xhtmlDec:"Incloure declaracions XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/cs.js b/bower_components/ckeditor/plugins/docprops/lang/cs.js new file mode 100644 index 0000000..568bac8 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/cs.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","cs",{bgColor:"Barva pozadí",bgFixed:"Nerolovatelné (Pevné) pozadí",bgImage:"URL obrázku na pozadí",charset:"Znaková sada",charsetASCII:"ASCII",charsetCE:"Středoevropské jazyky",charsetCR:"Cyrilice",charsetCT:"Tradiční čínština (Big5)",charsetGR:"Řečtina",charsetJP:"Japonština",charsetKR:"Korejština",charsetOther:"Další znaková sada",charsetTR:"Turečtina",charsetUN:"Unicode (UTF-8)",charsetWE:"Západoevropské jazyky",chooseColor:"Výběr",design:"Vzhled",docTitle:"Titulek stránky", +docType:"Typ dokumentu",docTypeOther:"Jiný typ dokumetu",label:"Vlastnosti dokumentu",margin:"Okraje stránky",marginBottom:"Dolní",marginLeft:"Levý",marginRight:"Pravý",marginTop:"Horní",meta:"Metadata",metaAuthor:"Autor",metaCopyright:"Autorská práva",metaDescription:"Popis dokumentu",metaKeywords:"Klíčová slova (oddělená čárkou)",other:"",previewHtml:'

        Toto je ukázkový text. Používáte CKEditor.

        ',title:"Vlastnosti dokumentu",txtColor:"Barva textu", +xhtmlDec:"Zahrnout deklarace XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/cy.js b/bower_components/ckeditor/plugins/docprops/lang/cy.js new file mode 100644 index 0000000..ef7e1cc --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/cy.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","cy",{bgColor:"Lliw Cefndir",bgFixed:"Cefndir Sefydlog (Ddim yn Sgrolio)",bgImage:"URL Delwedd Cefndir",charset:"Amgodio Set Nodau",charsetASCII:"ASCII",charsetCE:"Ewropeaidd Canol",charsetCR:"Syrilig",charsetCT:"Tsieinëeg Traddodiadol (Big5)",charsetGR:"Groeg",charsetJP:"Siapanëeg",charsetKR:"Corëeg",charsetOther:"Amgodio Set Nodau Arall",charsetTR:"Tyrceg",charsetUN:"Unicode (UTF-8)",charsetWE:"Ewropeaidd Gorllewinol",chooseColor:"Dewis",design:"Cynllunio",docTitle:"Teitl y Dudalen", +docType:"Pennawd Math y Ddogfen",docTypeOther:"Pennawd Math y Ddogfen Arall",label:"Priodweddau Dogfen",margin:"Ffin y Dudalen",marginBottom:"Gwaelod",marginLeft:"Chwith",marginRight:"Dde",marginTop:"Brig",meta:"Tagiau Meta",metaAuthor:"Awdur",metaCopyright:"Hawlfraint",metaDescription:"Disgrifiad y Ddogfen",metaKeywords:"Allweddeiriau Indecsio Dogfen (gwahanu gyda choma)",other:"Arall...",previewHtml:'

        Dyma ychydig o destun sampl. Rydych chi\'n defnyddio CKEditor.

        ', +title:"Priodweddau Dogfen",txtColor:"Lliw y Testun",xhtmlDec:"Cynnwys Datganiadau XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/da.js b/bower_components/ckeditor/plugins/docprops/lang/da.js new file mode 100644 index 0000000..0a10cf0 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/da.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","da",{bgColor:"Baggrundsfarve",bgFixed:"Fastlåst baggrund",bgImage:"Baggrundsbillede URL",charset:"Tegnsætskode",charsetASCII:"ASCII",charsetCE:"Centraleuropæisk",charsetCR:"Kyrillisk",charsetCT:"Traditionel kinesisk (Big5)",charsetGR:"Græsk",charsetJP:"Japansk",charsetKR:"Koreansk",charsetOther:"Anden tegnsætskode",charsetTR:"Tyrkisk",charsetUN:"Unicode (UTF-8)",charsetWE:"Vesteuropæisk",chooseColor:"Vælg",design:"Design",docTitle:"Sidetitel",docType:"Dokumenttype kategori", +docTypeOther:"Anden dokumenttype kategori",label:"Egenskaber for dokument",margin:"Sidemargen",marginBottom:"Nederst",marginLeft:"Venstre",marginRight:"Højre",marginTop:"Øverst",meta:"Metatags",metaAuthor:"Forfatter",metaCopyright:"Copyright",metaDescription:"Dokumentbeskrivelse",metaKeywords:"Dokument index nøgleord (kommasepareret)",other:"",previewHtml:'

        Dette er et eksempel på noget tekst. Du benytter CKEditor.

        ',title:"Egenskaber for dokument", +txtColor:"Tekstfarve",xhtmlDec:"Inkludere XHTML deklartion"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/de.js b/bower_components/ckeditor/plugins/docprops/lang/de.js new file mode 100644 index 0000000..6dee2e4 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/de.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","de",{bgColor:"Hintergrundfarbe",bgFixed:"feststehender Hintergrund",bgImage:"Hintergrundbild URL",charset:"Zeichenkodierung",charsetASCII:"ASCII",charsetCE:"Zentraleuropäisch",charsetCR:"Kyrillisch",charsetCT:"traditionell Chinesisch (Big5)",charsetGR:"Griechisch",charsetJP:"Japanisch",charsetKR:"Koreanisch",charsetOther:"Andere Zeichenkodierung",charsetTR:"Türkisch",charsetUN:"Unicode (UTF-8)",charsetWE:"Westeuropäisch",chooseColor:"Wählen",design:"Design",docTitle:"Seitentitel", +docType:"Dokumententyp",docTypeOther:"Anderer Dokumententyp",label:"Dokument-Eigenschaften",margin:"Seitenränder",marginBottom:"Unten",marginLeft:"Links",marginRight:"Rechts",marginTop:"Oben",meta:"Metadaten",metaAuthor:"Autor",metaCopyright:"Copyright",metaDescription:"Dokument-Beschreibung",metaKeywords:"Schlüsselwörter (durch Komma getrennt)",other:"",previewHtml:'

        Das ist ein Beispieltext. Du schreibst in CKEditor.

        ',title:"Dokument-Eigenschaften", +txtColor:"Textfarbe",xhtmlDec:"Beziehe XHTML Deklarationen ein"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/el.js b/bower_components/ckeditor/plugins/docprops/lang/el.js new file mode 100644 index 0000000..3f0999c --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/el.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","el",{bgColor:"Χρώμα Φόντου",bgFixed:"Φόντο Χωρίς Κύλιση (Σταθερό)",bgImage:"Διεύθυνση Εικόνας Φόντου",charset:"Κωδικοποίηση Χαρακτήρων",charsetASCII:"ASCII",charsetCE:"Κεντρικής Ευρώπης",charsetCR:"Κυριλλική",charsetCT:"Παραδοσιακή Κινέζικη (Big5)",charsetGR:"Ελληνική",charsetJP:"Ιαπωνική",charsetKR:"Κορεάτικη",charsetOther:"Άλλη Κωδικοποίηση Χαρακτήρων",charsetTR:"Τουρκική",charsetUN:"Διεθνής (UTF-8)",charsetWE:"Δυτικής Ευρώπης",chooseColor:"Επιλέξτε",design:"Σχεδιασμός", +docTitle:"Τίτλος Σελίδας",docType:"Κεφαλίδα Τύπου Εγγράφου",docTypeOther:"Άλλη Κεφαλίδα Τύπου Εγγράφου",label:"Ιδιότητες Εγγράφου",margin:"Περιθώρια Σελίδας",marginBottom:"Κάτω",marginLeft:"Αριστερά",marginRight:"Δεξιά",marginTop:"Κορυφή",meta:"Μεταδεδομένα",metaAuthor:"Δημιουργός",metaCopyright:"Πνευματικά Δικαιώματα",metaDescription:"Περιγραφή Εγγράφου",metaKeywords:"Λέξεις κλειδιά δείκτες εγγράφου (διαχωρισμός με κόμμα)",other:"Άλλο...",previewHtml:'

        Αυτό είναι ένα παραδειγματικό κείμενο. Χρησιμοποιείτε το CKEditor.

        ', +title:"Ιδιότητες Εγγράφου",txtColor:"Χρώμα Κειμένου",xhtmlDec:"Να Συμπεριληφθούν οι Δηλώσεις XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/en-au.js b/bower_components/ckeditor/plugins/docprops/lang/en-au.js new file mode 100644 index 0000000..1991fce --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/en-au.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","en-au",{bgColor:"Background Color",bgFixed:"Non-scrolling (Fixed) Background",bgImage:"Background Image URL",charset:"Character Set Encoding",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"Other Character Set Encoding",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Choose",design:"Design", +docTitle:"Page Title",docType:"Document Type Heading",docTypeOther:"Other Document Type Heading",label:"Document Properties",margin:"Page Margins",marginBottom:"Bottom",marginLeft:"Left",marginRight:"Right",marginTop:"Top",meta:"Meta Tags",metaAuthor:"Author",metaCopyright:"Copyright",metaDescription:"Document Description",metaKeywords:"Document Indexing Keywords (comma separated)",other:"Other...",previewHtml:'

        This is some sample text. You are using CKEditor.

        ', +title:"Document Properties",txtColor:"Text Color",xhtmlDec:"Include XHTML Declarations"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/en-ca.js b/bower_components/ckeditor/plugins/docprops/lang/en-ca.js new file mode 100644 index 0000000..f135acf --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/en-ca.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","en-ca",{bgColor:"Background Color",bgFixed:"Non-scrolling (Fixed) Background",bgImage:"Background Image URL",charset:"Character Set Encoding",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"Other Character Set Encoding",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Choose",design:"Design", +docTitle:"Page Title",docType:"Document Type Heading",docTypeOther:"Other Document Type Heading",label:"Document Properties",margin:"Page Margins",marginBottom:"Bottom",marginLeft:"Left",marginRight:"Right",marginTop:"Top",meta:"Meta Tags",metaAuthor:"Author",metaCopyright:"Copyright",metaDescription:"Document Description",metaKeywords:"Document Indexing Keywords (comma separated)",other:"Other...",previewHtml:'

        This is some sample text. You are using CKEditor.

        ', +title:"Document Properties",txtColor:"Text Color",xhtmlDec:"Include XHTML Declarations"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/en-gb.js b/bower_components/ckeditor/plugins/docprops/lang/en-gb.js new file mode 100644 index 0000000..4ae5c6f --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/en-gb.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","en-gb",{bgColor:"Background Colour",bgFixed:"Non-scrolling (Fixed) Background",bgImage:"Background Image URL",charset:"Character Set Encoding",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"Other Character Set Encoding",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Choose",design:"Design", +docTitle:"Page Title",docType:"Document Type Heading",docTypeOther:"Other Document Type Heading",label:"Document Properties",margin:"Page Margins",marginBottom:"Bottom",marginLeft:"Left",marginRight:"Right",marginTop:"Top",meta:"Meta Tags",metaAuthor:"Author",metaCopyright:"Copyright",metaDescription:"Document Description",metaKeywords:"Document Indexing Keywords (comma-separated)",other:"Other...",previewHtml:'

        This is some sample text. You are using CKEditor.

        ', +title:"Document Properties",txtColor:"Text Colour",xhtmlDec:"Include XHTML Declarations"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/en.js b/bower_components/ckeditor/plugins/docprops/lang/en.js new file mode 100644 index 0000000..73926df --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/en.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","en",{bgColor:"Background Color",bgFixed:"Non-scrolling (Fixed) Background",bgImage:"Background Image URL",charset:"Character Set Encoding",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"Other Character Set Encoding",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Choose",design:"Design", +docTitle:"Page Title",docType:"Document Type Heading",docTypeOther:"Other Document Type Heading",label:"Document Properties",margin:"Page Margins",marginBottom:"Bottom",marginLeft:"Left",marginRight:"Right",marginTop:"Top",meta:"Meta Tags",metaAuthor:"Author",metaCopyright:"Copyright",metaDescription:"Document Description",metaKeywords:"Document Indexing Keywords (comma separated)",other:"Other...",previewHtml:'

        This is some sample text. You are using CKEditor.

        ', +title:"Document Properties",txtColor:"Text Color",xhtmlDec:"Include XHTML Declarations"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/eo.js b/bower_components/ckeditor/plugins/docprops/lang/eo.js new file mode 100644 index 0000000..182ea18 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/eo.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","eo",{bgColor:"Fona Koloro",bgFixed:"Neruluma Fono",bgImage:"URL de Fona Bildo",charset:"Signara Kodo",charsetASCII:"ASCII",charsetCE:"Centra Eŭropa",charsetCR:"Cirila",charsetCT:"Tradicia Ĉina (Big5)",charsetGR:"Greka",charsetJP:"Japana",charsetKR:"Korea",charsetOther:"Alia Signara Kodo",charsetTR:"Turka",charsetUN:"Unikodo (UTF-8)",charsetWE:"Okcidenta Eŭropa",chooseColor:"Elektu",design:"Dizajno",docTitle:"Paĝotitolo",docType:"Dokumenta Tipo",docTypeOther:"Alia Dokumenta Tipo", +label:"Dokumentaj Atributoj",margin:"Paĝaj Marĝenoj",marginBottom:"Malsupra",marginLeft:"Maldekstra",marginRight:"Dekstra",marginTop:"Supra",meta:"Metadatenoj",metaAuthor:"Verkinto",metaCopyright:"Kopirajto",metaDescription:"Dokumenta Priskribo",metaKeywords:"Ŝlosilvortoj de la Dokumento (apartigitaj de komoj)",other:"",previewHtml:'

        Tio estas sampla teksto. Vi estas uzanta CKEditor.

        ',title:"Dokumentaj Atributoj",txtColor:"Teksta Koloro", +xhtmlDec:"Inkluzivi XHTML Deklarojn"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/es.js b/bower_components/ckeditor/plugins/docprops/lang/es.js new file mode 100644 index 0000000..8170464 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/es.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","es",{bgColor:"Color de fondo",bgFixed:"Fondo fijo (no se desplaza)",bgImage:"Imagen de fondo",charset:"Codificación de caracteres",charsetASCII:"ASCII",charsetCE:"Centro Europeo",charsetCR:"Ruso",charsetCT:"Chino Tradicional (Big5)",charsetGR:"Griego",charsetJP:"Japonés",charsetKR:"Koreano",charsetOther:"Otra codificación de caracteres",charsetTR:"Turco",charsetUN:"Unicode (UTF-8)",charsetWE:"Europeo occidental",chooseColor:"Elegir",design:"Diseño",docTitle:"Título de página", +docType:"Tipo de documento",docTypeOther:"Otro tipo de documento",label:"Propiedades del documento",margin:"Márgenes",marginBottom:"Inferior",marginLeft:"Izquierdo",marginRight:"Derecho",marginTop:"Superior",meta:"Meta Tags",metaAuthor:"Autor",metaCopyright:"Copyright",metaDescription:"Descripción del documento",metaKeywords:"Palabras claves del documento separadas por coma (meta keywords)",other:"Otro...",previewHtml:'

        Este es un texto de ejemplo. Usted está usando CKEditor.

        ', +title:"Propiedades del documento",txtColor:"Color del texto",xhtmlDec:"Incluir declaración XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/et.js b/bower_components/ckeditor/plugins/docprops/lang/et.js new file mode 100644 index 0000000..43ad55d --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/et.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","et",{bgColor:"Taustavärv",bgFixed:"Mittekeritav tagataust",bgImage:"Taustapildi URL",charset:"Märgistiku kodeering",charsetASCII:"ASCII",charsetCE:"Kesk-Euroopa",charsetCR:"Kirillisa",charsetCT:"Hiina traditsiooniline (Big5)",charsetGR:"Kreeka",charsetJP:"Jaapani",charsetKR:"Korea",charsetOther:"Ülejäänud märgistike kodeeringud",charsetTR:"Türgi",charsetUN:"Unicode (UTF-8)",charsetWE:"Lääne-Euroopa",chooseColor:"Vali",design:"Disain",docTitle:"Lehekülje tiitel", +docType:"Dokumendi tüüppäis",docTypeOther:"Teised dokumendi tüüppäised",label:"Dokumendi omadused",margin:"Lehekülje äärised",marginBottom:"Alaserv",marginLeft:"Vasakserv",marginRight:"Paremserv",marginTop:"Ülaserv",meta:"Meta andmed",metaAuthor:"Autor",metaCopyright:"Autoriõigus",metaDescription:"Dokumendi kirjeldus",metaKeywords:"Dokumendi võtmesõnad (eraldatud komadega)",other:"",previewHtml:'

        See on näidistekst. Sa kasutad CKEditori.

        ', +title:"Dokumendi omadused",txtColor:"Teksti värv",xhtmlDec:"Arva kaasa XHTML deklaratsioonid"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/eu.js b/bower_components/ckeditor/plugins/docprops/lang/eu.js new file mode 100644 index 0000000..16175cc --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/eu.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","eu",{bgColor:"Atzeko Kolorea",bgFixed:"Korritze gabeko Atzealdea",bgImage:"Atzeko Irudiaren URL-a",charset:"Karaktere Multzoaren Kodeketa",charsetASCII:"ASCII",charsetCE:"Erdialdeko Europakoa",charsetCR:"Zirilikoa",charsetCT:"Txinatar Tradizionala (Big5)",charsetGR:"Grekoa",charsetJP:"Japoniarra",charsetKR:"Korearra",charsetOther:"Beste Karaktere Multzoko Kodeketa",charsetTR:"Turkiarra",charsetUN:"Unicode (UTF-8)",charsetWE:"Mendebaldeko Europakoa",chooseColor:"Choose", +design:"Diseinua",docTitle:"Orriaren Izenburua",docType:"Document Type Goiburua",docTypeOther:"Beste Document Type Goiburua",label:"Dokumentuaren Ezarpenak",margin:"Orrialdearen marjinak",marginBottom:"Behean",marginLeft:"Ezkerrean",marginRight:"Eskuman",marginTop:"Goian",meta:"Meta Informazioa",metaAuthor:"Egilea",metaCopyright:"Copyright",metaDescription:"Dokumentuaren Deskribapena",metaKeywords:"Dokumentuaren Gako-hitzak (komarekin bananduta)",other:"",previewHtml:'

        Hau adibideko testua da. CKEditor erabiltzen ari zara.

        ', +title:"Dokumentuaren Ezarpenak",txtColor:"Testu Kolorea",xhtmlDec:"XHTML Ezarpenak"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/fa.js b/bower_components/ckeditor/plugins/docprops/lang/fa.js new file mode 100644 index 0000000..078e383 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/fa.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("docprops","fa",{bgColor:"رنگ پس​زمینه",bgFixed:"پس​زمینهٴ ثابت (بدون حرکت)",bgImage:"URL تصویر پسزمینه",charset:"رمزگذاری نویسه​گان",charsetASCII:"اسکی",charsetCE:"اروپای مرکزی",charsetCR:"سیریلیک",charsetCT:"چینی رسمی (Big5)",charsetGR:"یونانی",charsetJP:"ژاپنی",charsetKR:"کره​ای",charsetOther:"رمزگذاری نویسه​گان دیگر",charsetTR:"ترکی",charsetUN:"یونیکد (UTF-8)",charsetWE:"اروپای غربی",chooseColor:"انتخاب",design:"طراحی",docTitle:"عنوان صفحه",docType:"عنوان نوع سند",docTypeOther:"عنوان نوع سند دیگر", +label:"ویژگی​های سند",margin:"حاشیه​های صفحه",marginBottom:"پایین",marginLeft:"چپ",marginRight:"راست",marginTop:"بالا",meta:"فراداده",metaAuthor:"نویسنده",metaCopyright:"حق انتشار",metaDescription:"توصیف سند",metaKeywords:"کلیدواژگان نمایه​گذاری سند (با کاما جدا شوند)",other:"<سایر>",previewHtml:'

        این یک متن نمونه است. شما در حال استفاده از CKEditor هستید.

        ',title:"ویژگی​های سند",txtColor:"رنگ متن",xhtmlDec:"شامل تعاریف XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/fi.js b/bower_components/ckeditor/plugins/docprops/lang/fi.js new file mode 100644 index 0000000..22a9740 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/fi.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","fi",{bgColor:"Taustaväri",bgFixed:"Paikallaanpysyvä tausta",bgImage:"Taustakuva",charset:"Merkistökoodaus",charsetASCII:"ASCII",charsetCE:"Keskieurooppalainen",charsetCR:"Kyrillinen",charsetCT:"Kiina, perinteinen (Big5)",charsetGR:"Kreikka",charsetJP:"Japani",charsetKR:"Korealainen",charsetOther:"Muu merkistökoodaus",charsetTR:"Turkkilainen",charsetUN:"Unicode (UTF-8)",charsetWE:"Länsieurooppalainen",chooseColor:"Valitse",design:"Sommittelu",docTitle:"Sivun nimi", +docType:"Dokumentin tyyppi",docTypeOther:"Muu dokumentin tyyppi",label:"Dokumentin ominaisuudet",margin:"Sivun marginaalit",marginBottom:"Ala",marginLeft:"Vasen",marginRight:"Oikea",marginTop:"Ylä",meta:"Metatieto",metaAuthor:"Tekijä",metaCopyright:"Tekijänoikeudet",metaDescription:"Kuvaus",metaKeywords:"Hakusanat (pilkulla erotettuna)",other:"",previewHtml:'

        Tämä on esimerkkitekstiä. Käytät juuri CKEditoria.

        ',title:"Dokumentin ominaisuudet", +txtColor:"Tekstiväri",xhtmlDec:"Lisää XHTML julistukset"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/fo.js b/bower_components/ckeditor/plugins/docprops/lang/fo.js new file mode 100644 index 0000000..ef35269 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/fo.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","fo",{bgColor:"Bakgrundslitur",bgFixed:"Læst bakgrund (rullar ikki)",bgImage:"Leið til bakgrundsmynd (URL)",charset:"Teknsett koda",charsetASCII:"ASCII",charsetCE:"Miðeuropa",charsetCR:"Cyrilliskt",charsetCT:"Kinesiskt traditionelt (Big5)",charsetGR:"Grikst",charsetJP:"Japanskt",charsetKR:"Koreanskt",charsetOther:"Onnur teknsett koda",charsetTR:"Turkiskt",charsetUN:"Unicode (UTF-8)",charsetWE:"Vestureuropa",chooseColor:"Vel",design:"Design",docTitle:"Síðuheiti", +docType:"Dokumentslag yvirskrift",docTypeOther:"Annað dokumentslag yvirskrift",label:"Eginleikar fyri dokument",margin:"Síðubreddar",marginBottom:"Niðast",marginLeft:"Vinstra",marginRight:"Høgra",marginTop:"Ovast",meta:"META-upplýsingar",metaAuthor:"Høvundur",metaCopyright:"Upphavsrættindi",metaDescription:"Dokumentlýsing",metaKeywords:"Dokument index lyklaorð (sundurbýtt við komma)",other:"",previewHtml:'

        Hetta er ein royndartekstur. Tygum brúka CKEditor.

        ', +title:"Eginleikar fyri dokument",txtColor:"Tekstlitur",xhtmlDec:"Viðfest XHTML deklaratiónir"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/fr-ca.js b/bower_components/ckeditor/plugins/docprops/lang/fr-ca.js new file mode 100644 index 0000000..31a809e --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/fr-ca.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","fr-ca",{bgColor:"Couleur de fond",bgFixed:"Image fixe sans défilement",bgImage:"Image de fond",charset:"Encodage",charsetASCII:"ACSII",charsetCE:"Europe Centrale",charsetCR:"Cyrillique",charsetCT:"Chinois Traditionnel (Big5)",charsetGR:"Grecque",charsetJP:"Japonais",charsetKR:"Coréen",charsetOther:"Autre encodage",charsetTR:"Turque",charsetUN:"Unicode (UTF-8)",charsetWE:"Occidental",chooseColor:"Sélectionner",design:"Design",docTitle:"Titre de la page",docType:"Type de document", +docTypeOther:"Autre type de document",label:"Propriétés du document",margin:"Marges",marginBottom:"Bas",marginLeft:"Gauche",marginRight:"Droite",marginTop:"Haut",meta:"Méta-données",metaAuthor:"Auteur",metaCopyright:"Copyright",metaDescription:"Description",metaKeywords:"Mots-clés (séparés par des virgules)",other:"Autre...",previewHtml:'

        Voici un example de texte. Vous utilisez CKEditor.

        ',title:"Propriétés du document",txtColor:"Couleur de caractère", +xhtmlDec:"Inclure les déclarations XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/fr.js b/bower_components/ckeditor/plugins/docprops/lang/fr.js new file mode 100644 index 0000000..f22e249 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/fr.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","fr",{bgColor:"Couleur de fond",bgFixed:"Image fixe sans défilement",bgImage:"Image de fond",charset:"Encodage de caractère",charsetASCII:"ASCII",charsetCE:"Europe Centrale",charsetCR:"Cyrillique",charsetCT:"Chinois Traditionnel (Big5)",charsetGR:"Grec",charsetJP:"Japonais",charsetKR:"Coréen",charsetOther:"Autre encodage de caractère",charsetTR:"Turc",charsetUN:"Unicode (UTF-8)",charsetWE:"Occidental",chooseColor:"Choisissez",design:"Design",docTitle:"Titre de la page", +docType:"Type de document",docTypeOther:"Autre type de document",label:"Propriétés du document",margin:"Marges",marginBottom:"Bas",marginLeft:"Gauche",marginRight:"Droite",marginTop:"Haut",meta:"Métadonnées",metaAuthor:"Auteur",metaCopyright:"Copyright",metaDescription:"Description",metaKeywords:"Mots-clés (séparés par des virgules)",other:"",previewHtml:'

        Ceci est un texte d\'exemple. Vous utilisez CKEditor.

        ',title:"Propriétés du document", +txtColor:"Couleur de texte",xhtmlDec:"Inclure les déclarations XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/gl.js b/bower_components/ckeditor/plugins/docprops/lang/gl.js new file mode 100644 index 0000000..f8b0c21 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/gl.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","gl",{bgColor:"Cor do fondo",bgFixed:"Fondo fixo (non se despraza)",bgImage:"URL da imaxe do fondo",charset:"Codificación de caracteres",charsetASCII:"ASCII",charsetCE:"Centro europeo",charsetCR:"Cirílico",charsetCT:"Chinés tradicional (Big5)",charsetGR:"Grego",charsetJP:"Xaponés",charsetKR:"Coreano",charsetOther:"Outra codificación de caracteres",charsetTR:"Turco",charsetUN:"Unicode (UTF-8)",charsetWE:"Europeo occidental",chooseColor:"Escoller",design:"Deseño", +docTitle:"Título da páxina",docType:"Cabeceira do tipo de documento",docTypeOther:"Outra cabeceira do tipo de documento",label:"Propiedades do documento",margin:"Marxes da páxina",marginBottom:"Abaixo",marginLeft:"Esquerda",marginRight:"Dereita",marginTop:"Arriba",meta:"Meta etiquetas",metaAuthor:"Autor",metaCopyright:"Dereito de autoría",metaDescription:"Descrición do documento",metaKeywords:"Palabras clave de indexación do documento (separadas por comas)",other:"Outro...",previewHtml:'

        Este é un texto de exemplo. Vostede esta a empregar o CKEditor.

        ', +title:"Propiedades do documento",txtColor:"Cor do texto",xhtmlDec:"Incluír as declaracións XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/gu.js b/bower_components/ckeditor/plugins/docprops/lang/gu.js new file mode 100644 index 0000000..7458ffe --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/gu.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","gu",{bgColor:"બૅકગ્રાઉન્ડ રંગ",bgFixed:"સ્ક્રોલ ન થાય તેવું બૅકગ્રાઉન્ડ",bgImage:"બૅકગ્રાઉન્ડ ચિત્ર URL",charset:"કેરેક્ટર સેટ એન્કોડિંગ",charsetASCII:"ASCII",charsetCE:"મધ્ય યુરોપિઅન (Central European)",charsetCR:"સિરીલિક (Cyrillic)",charsetCT:"ચાઇનીઝ (Chinese Traditional Big5)",charsetGR:"ગ્રીક (Greek)",charsetJP:"જાપાનિઝ (Japanese)",charsetKR:"કોરીયન (Korean)",charsetOther:"અન્ય કેરેક્ટર સેટ એન્કોડિંગ",charsetTR:"ટર્કિ (Turkish)",charsetUN:"યૂનિકોડ (UTF-8)", +charsetWE:"પશ્ચિમ યુરોપિઅન (Western European)",chooseColor:"વિકલ્પ",design:"ડીસા",docTitle:"પેજ મથાળું/ટાઇટલ",docType:"ડૉક્યુમન્ટ પ્રકાર શીર્ષક",docTypeOther:"અન્ય ડૉક્યુમન્ટ પ્રકાર શીર્ષક",label:"ડૉક્યુમન્ટ ગુણ/પ્રૉપર્ટિઝ",margin:"પેજ માર્જિન",marginBottom:"નીચે",marginLeft:"ડાબી",marginRight:"જમણી",marginTop:"ઉપર",meta:"મેટાડૅટા",metaAuthor:"લેખક",metaCopyright:"કૉપિરાઇટ",metaDescription:"ડૉક્યુમન્ટ વર્ણન",metaKeywords:"ડૉક્યુમન્ટ ઇન્ડેક્સ સંકેતશબ્દ (અલ્પવિરામ (,) થી અલગ કરો)",other:"",previewHtml:'

        આ એક સેમ્પલ ટેક્ષ્ત્ છે. તમે CKEditor વાપરો છો.

        ', +title:"ડૉક્યુમન્ટ ગુણ/પ્રૉપર્ટિઝ",txtColor:"શબ્દનો રંગ",xhtmlDec:"XHTML સૂચના સમાવિષ્ટ કરવી"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/he.js b/bower_components/ckeditor/plugins/docprops/lang/he.js new file mode 100644 index 0000000..d71d158 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/he.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("docprops","he",{bgColor:"צבע רקע",bgFixed:"רקע לא נגלל (צמוד)",bgImage:"כתובת של תמונת רקע",charset:"קידוד תווים",charsetASCII:"ASCII",charsetCE:"מרכז אירופאי",charsetCR:"קירילי",charsetCT:"סיני מסורתי (Big5)",charsetGR:"יווני",charsetJP:"יפני",charsetKR:"קוריאני",charsetOther:"קידוד תווים אחר",charsetTR:"טורקי",charsetUN:"יוניקוד (UTF-8)",charsetWE:"מערב אירופאי",chooseColor:"בחירה",design:"עיצוב",docTitle:"כותרת עמוד",docType:"כותר סוג מסמך",docTypeOther:"כותר סוג מסמך אחר", +label:"מאפייני מסמך",margin:"מרווחי עמוד",marginBottom:"תחתון",marginLeft:"שמאלי",marginRight:"ימני",marginTop:"עליון",meta:"תגי Meta",metaAuthor:"מחבר/ת",metaCopyright:"זכויות יוצרים",metaDescription:"תיאור המסמך",metaKeywords:"מילות מפתח של המסמך (מופרדות בפסיק)",other:"אחר...",previewHtml:'

        זהו טקסט הדגמה. את/ה משתמש/ת בCKEditor.

        ',title:"מאפייני מסמך",txtColor:"צבע טקסט",xhtmlDec:"כלול הכרזות XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/hi.js b/bower_components/ckeditor/plugins/docprops/lang/hi.js new file mode 100644 index 0000000..6826618 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/hi.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","hi",{bgColor:"बैक्ग्राउन्ड रंग",bgFixed:"स्क्रॉल न करने वाला बैक्ग्राउन्ड",bgImage:"बैक्ग्राउन्ड तस्वीर URL",charset:"करेक्टर सॅट ऍन्कोडिंग",charsetASCII:"ASCII",charsetCE:"मध्य यूरोपीय (Central European)",charsetCR:"सिरीलिक (Cyrillic)",charsetCT:"चीनी (Chinese Traditional Big5)",charsetGR:"यवन (Greek)",charsetJP:"जापानी (Japanese)",charsetKR:"कोरीयन (Korean)",charsetOther:"अन्य करेक्टर सॅट ऍन्कोडिंग",charsetTR:"तुर्की (Turkish)",charsetUN:"यूनीकोड (UTF-8)",charsetWE:"पश्चिम यूरोपीय (Western European)", +chooseColor:"Choose",design:"Design",docTitle:"पेज शीर्षक",docType:"डॉक्यूमॅन्ट प्रकार शीर्षक",docTypeOther:"अन्य डॉक्यूमॅन्ट प्रकार शीर्षक",label:"डॉक्यूमॅन्ट प्रॉपर्टीज़",margin:"पेज मार्जिन",marginBottom:"नीचे",marginLeft:"बायें",marginRight:"दायें",marginTop:"ऊपर",meta:"मॅटाडेटा",metaAuthor:"लेखक",metaCopyright:"कॉपीराइट",metaDescription:"डॉक्यूमॅन्ट करॅक्टरन",metaKeywords:"डॉक्युमॅन्ट इन्डेक्स संकेतशब्द (अल्पविराम से अलग करें)",other:"<अन्य>",previewHtml:'

        This is some sample text. You are using CKEditor.

        ', +title:"डॉक्यूमॅन्ट प्रॉपर्टीज़",txtColor:"टेक्स्ट रंग",xhtmlDec:"XHTML सूचना सम्मिलित करें"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/hr.js b/bower_components/ckeditor/plugins/docprops/lang/hr.js new file mode 100644 index 0000000..3477c6f --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/hr.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","hr",{bgColor:"Boja pozadine",bgFixed:"Pozadine se ne pomiče",bgImage:"URL slike pozadine",charset:"Enkodiranje znakova",charsetASCII:"ASCII",charsetCE:"Središnja Europa",charsetCR:"Ćirilica",charsetCT:"Tradicionalna kineska (Big5)",charsetGR:"Grčka",charsetJP:"Japanska",charsetKR:"Koreanska",charsetOther:"Ostalo enkodiranje znakova",charsetTR:"Turska",charsetUN:"Unicode (UTF-8)",charsetWE:"Zapadna Europa",chooseColor:"Odaberi",design:"Dizajn",docTitle:"Naslov stranice", +docType:"Zaglavlje vrste dokumenta",docTypeOther:"Ostalo zaglavlje vrste dokumenta",label:"Svojstva dokumenta",margin:"Margine stranice",marginBottom:"Dolje",marginLeft:"Lijevo",marginRight:"Desno",marginTop:"Vrh",meta:"Meta Data",metaAuthor:"Autor",metaCopyright:"Autorska prava",metaDescription:"Opis dokumenta",metaKeywords:"Ključne riječi dokumenta (odvojene zarezom)",other:"",previewHtml:'

        Ovo je neki primjer teksta. Vi koristite CKEditor.

        ', +title:"Svojstva dokumenta",txtColor:"Boja teksta",xhtmlDec:"Ubaci XHTML deklaracije"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/hu.js b/bower_components/ckeditor/plugins/docprops/lang/hu.js new file mode 100644 index 0000000..beeed2b --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/hu.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","hu",{bgColor:"Háttérszín",bgFixed:"Nem gördíthető háttér",bgImage:"Háttérkép cím",charset:"Karakterkódolás",charsetASCII:"ASCII",charsetCE:"Közép-Európai",charsetCR:"Cyrill",charsetCT:"Kínai Tradicionális (Big5)",charsetGR:"Görög",charsetJP:"Japán",charsetKR:"Koreai",charsetOther:"Más karakterkódolás",charsetTR:"Török",charsetUN:"Unicode (UTF-8)",charsetWE:"Nyugat-Európai",chooseColor:"Válasszon",design:"Design",docTitle:"Oldalcím",docType:"Dokumentum típus fejléc", +docTypeOther:"Más dokumentum típus fejléc",label:"Dokumentum tulajdonságai",margin:"Oldal margók",marginBottom:"Alsó",marginLeft:"Bal",marginRight:"Jobb",marginTop:"Felső",meta:"Meta adatok",metaAuthor:"Szerző",metaCopyright:"Szerzői jog",metaDescription:"Dokumentum leírás",metaKeywords:"Dokumentum keresőszavak (vesszővel elválasztva)",other:"",previewHtml:'

        Ez itt egy példa. A CKEditor-t használod.

        ',title:"Dokumentum tulajdonságai",txtColor:"Betűszín", +xhtmlDec:"XHTML deklarációk beillesztése"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/id.js b/bower_components/ckeditor/plugins/docprops/lang/id.js new file mode 100644 index 0000000..9716026 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/id.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","id",{bgColor:"Warna Latar Belakang",bgFixed:"Non-scrolling (Fixed) Background",bgImage:"Background Image URL",charset:"Character Set Encoding",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"Other Character Set Encoding",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Pilih",design:"Design", +docTitle:"Page Title",docType:"Document Type Heading",docTypeOther:"Other Document Type Heading",label:"Document Properties",margin:"Page Margins",marginBottom:"Bawah",marginLeft:"Kiri",marginRight:"Kanan",marginTop:"Atas",meta:"Meta Tags",metaAuthor:"Author",metaCopyright:"Copyright",metaDescription:"Document Description",metaKeywords:"Document Indexing Keywords (comma separated)",other:"Other...",previewHtml:'

        This is some sample text. You are using CKEditor.

        ', +title:"Document Properties",txtColor:"Text Color",xhtmlDec:"Include XHTML Declarations"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/is.js b/bower_components/ckeditor/plugins/docprops/lang/is.js new file mode 100644 index 0000000..9085a4f --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/is.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","is",{bgColor:"Bakgrunnslitur",bgFixed:"Læstur bakgrunnur",bgImage:"Slóð bakgrunnsmyndar",charset:"Letursett",charsetASCII:"ASCII",charsetCE:"Mið-evrópskt",charsetCR:"Kýrilskt",charsetCT:"Kínverskt, hefðbundið (Big5)",charsetGR:"Grískt",charsetJP:"Japanskt",charsetKR:"Kóreskt",charsetOther:"Annað letursett",charsetTR:"Tyrkneskt",charsetUN:"Unicode (UTF-8)",charsetWE:"Vestur-evrópst",chooseColor:"Choose",design:"Design",docTitle:"Titill síðu",docType:"Flokkur skjalategunda", +docTypeOther:"Annar flokkur skjalategunda",label:"Eigindi skjals",margin:"Hliðarspássía",marginBottom:"Neðst",marginLeft:"Vinstri",marginRight:"Hægri",marginTop:"Efst",meta:"Lýsigögn",metaAuthor:"Höfundur",metaCopyright:"Höfundarréttur",metaDescription:"Lýsing skjals",metaKeywords:"Lykilorð efnisorðaskrár (aðgreind með kommum)",other:"",previewHtml:'

        This is some sample text. You are using CKEditor.

        ',title:"Eigindi skjals",txtColor:"Litur texta", +xhtmlDec:"Fella inn XHTML lýsingu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/it.js b/bower_components/ckeditor/plugins/docprops/lang/it.js new file mode 100644 index 0000000..56edb3a --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/it.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","it",{bgColor:"Colore di sfondo",bgFixed:"Sfondo fissato",bgImage:"Immagine di sfondo",charset:"Set di caretteri",charsetASCII:"ASCII",charsetCE:"Europa Centrale",charsetCR:"Cirillico",charsetCT:"Cinese Tradizionale (Big5)",charsetGR:"Greco",charsetJP:"Giapponese",charsetKR:"Coreano",charsetOther:"Altro set di caretteri",charsetTR:"Turco",charsetUN:"Unicode (UTF-8)",charsetWE:"Europa Occidentale",chooseColor:"Scegli",design:"Disegna",docTitle:"Titolo pagina",docType:"Intestazione DocType", +docTypeOther:"Altra intestazione DocType",label:"Proprietà del Documento",margin:"Margini",marginBottom:"In Basso",marginLeft:"A Sinistra",marginRight:"A Destra",marginTop:"In Alto",meta:"Meta Data",metaAuthor:"Autore",metaCopyright:"Copyright",metaDescription:"Descrizione documento",metaKeywords:"Chiavi di indicizzazione documento (separate da virgola)",other:"",previewHtml:'

        Questo è un testo di esempio. State usando CKEditor.

        ',title:"Proprietà del Documento", +txtColor:"Colore testo",xhtmlDec:"Includi dichiarazione XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/ja.js b/bower_components/ckeditor/plugins/docprops/lang/ja.js new file mode 100644 index 0000000..34f5791 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/ja.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("docprops","ja",{bgColor:"背景色",bgFixed:"スクロールしない背景",bgImage:"背景画像 URL",charset:"文字コード",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"日本語",charsetKR:"Korean",charsetOther:"他の文字セット符号化",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"色の選択",design:"デザイン",docTitle:"ページタイトル",docType:"文書タイプヘッダー",docTypeOther:"その他文書タイプヘッダー",label:"文書 プロパティ",margin:"ページ・マージン", +marginBottom:"下部",marginLeft:"左",marginRight:"右",marginTop:"上部",meta:"メタデータ",metaAuthor:"文書の作者",metaCopyright:"文書の著作権",metaDescription:"文書の概要",metaKeywords:"文書のキーワード(カンマ区切り)",other:"<その他の>",previewHtml:'

        これはテキストサンプルです。 あなたは、CKEditorを使っています。

        ',title:"文書 プロパティ",txtColor:"テキスト色",xhtmlDec:"XHTML宣言をインクルード"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/ka.js b/bower_components/ckeditor/plugins/docprops/lang/ka.js new file mode 100644 index 0000000..50f71de --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/ka.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","ka",{bgColor:"ფონის ფერი",bgFixed:"უმოძრაო (ფიქსირებული) ფონი",bgImage:"ფონური სურათის URL",charset:"კოდირება",charsetASCII:"ამერიკული (ASCII)",charsetCE:"ცენტრალურ ევროპული",charsetCR:"კირილური",charsetCT:"ტრადიციული ჩინური (Big5)",charsetGR:"ბერძნული",charsetJP:"იაპონური",charsetKR:"კორეული",charsetOther:"სხვა კოდირებები",charsetTR:"თურქული",charsetUN:"უნიკოდი (UTF-8)",charsetWE:"დასავლეთ ევროპული",chooseColor:"არჩევა",design:"დიზაინი",docTitle:"გვერდის სათაური", +docType:"დოკუმენტის ტიპი",docTypeOther:"სხვა ტიპის დოკუმენტი",label:"დოკუმენტის პარამეტრები",margin:"გვერდის კიდეები",marginBottom:"ქვედა",marginLeft:"მარცხენა",marginRight:"მარჯვენა",marginTop:"ზედა",meta:"მეტაTag-ები",metaAuthor:"ავტორი",metaCopyright:"Copyright",metaDescription:"დოკუმენტის აღწერა",metaKeywords:"დოკუმენტის საკვანძო სიტყვები (მძიმით გამოყოფილი)",other:"სხვა...",previewHtml:'

        ეს არის საცდელი ტექსტი. თქვენ CKEditor-ით სარგებლობთ.

        ', +title:"დოკუმენტის პარამეტრები",txtColor:"ტექსტის ფერი",xhtmlDec:"XHTML დეკლარაციების ჩართვა"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/km.js b/bower_components/ckeditor/plugins/docprops/lang/km.js new file mode 100644 index 0000000..3427290 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/km.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","km",{bgColor:"ពណ៌​ផ្ទៃ​ក្រោយ",bgFixed:"ផ្ទៃ​ក្រោយ​គ្មាន​ការ​រំកិល (នឹង​ថ្កល់)",bgImage:"URL រូបភាព​ផ្ទៃ​ក្រោយ",charset:"ការ​អ៊ិនកូដ​តួ​អក្សរ",charsetASCII:"ASCII",charsetCE:"អឺរ៉ុប​កណ្ដាល",charsetCR:"Cyrillic",charsetCT:"ចិន​បុរាណ (Big5)",charsetGR:"ក្រិក",charsetJP:"ជប៉ុន",charsetKR:"កូរ៉េ",charsetOther:"កំណត់លេខកូតភាសាផ្សេងទៀត",charsetTR:"ទួរគី",charsetUN:"យូនីកូដ (UTF-8)",charsetWE:"អឺរ៉ុប​ខាង​លិច",chooseColor:"រើស",design:"រចនា",docTitle:"ចំណងជើងទំព័រ",docType:"ប្រភេទក្បាលទំព័រ​ឯកសារ", +docTypeOther:"ប្រភេទក្បាលទំព័រឯកសារ​ផ្សេងទៀត",label:"លក្ខណៈ​សម្បត្តិ​ឯកសារ",margin:"រឹម​ទំព័រ",marginBottom:"បាត​ក្រោម",marginLeft:"ឆ្វេង",marginRight:"ស្ដាំ",marginTop:"លើ",meta:"ស្លាក​មេតា",metaAuthor:"អ្នកនិពន្ធ",metaCopyright:"រក្សាសិទ្ធិ",metaDescription:"សេចក្តីអត្ថាធិប្បាយអំពីឯកសារ",metaKeywords:"ពាក្យនៅក្នុងឯកសារ (ផ្តាច់ពីគ្នាដោយក្បៀស)",other:"ដទៃ​ទៀត...",previewHtml:'

        នេះ​គឺ​ជាអក្សរ​គំរូ​ខ្លះៗ។ អ្នក​កំពុង​ប្រើ CKEditor។

        ',title:"ការកំណត់ ឯកសារ", +txtColor:"ពណ៌អក្សរ",xhtmlDec:"បញ្ជូល XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/ko.js b/bower_components/ckeditor/plugins/docprops/lang/ko.js new file mode 100644 index 0000000..168e9b1 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/ko.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("docprops","ko",{bgColor:"배경색상",bgFixed:"스크롤되지 않는 배경",bgImage:"배경 이미지 URL",charset:"캐릭터셋 인코딩",charsetASCII:"ASCII",charsetCE:"중앙 유럽",charsetCR:"키릴 문자",charsetCT:"중국어 (Big5)",charsetGR:"그리스어",charsetJP:"일본어",charsetKR:"한국어",charsetOther:"다른 캐릭터셋 인코딩",charsetTR:"터키어",charsetUN:"유니코드 (UTF-8)",charsetWE:"서유럽",chooseColor:"선택하기",design:"디자인",docTitle:"페이지명",docType:"문서 헤드",docTypeOther:"다른 문서헤드",label:"문서 속성",margin:"페이지 여백",marginBottom:"아래",marginLeft:"왼쪽",marginRight:"오른쪽", +marginTop:"위",meta:"메타데이터",metaAuthor:"작성자",metaCopyright:"저작권",metaDescription:"문서 설명",metaKeywords:"문서 키워드 (콤마로 구분)",other:"<기타>",previewHtml:'

        이것은 예문입니다. 여러분은 지금 CKEditor를 사용하고 있습니다.

        ',title:"문서 속성",txtColor:"글자 색상",xhtmlDec:"XHTML 문서정의 포함"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/ku.js b/bower_components/ckeditor/plugins/docprops/lang/ku.js new file mode 100644 index 0000000..f2dd284 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/ku.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","ku",{bgColor:"ڕەنگی پاشبنەما",bgFixed:"بێ هاتووچوپێکردنی (چەسپاو) پاشبنەمای وێنه",bgImage:"ناونیشانی بەستەری وێنەی پاشبنەما",charset:"دەستەی نووسەی بەکۆدکەر",charsetASCII:"ASCII",charsetCE:"ناوەڕاستی ئەوروپا",charsetCR:"سیریلیك",charsetCT:"چینی(Big5)",charsetGR:"یۆنانی",charsetJP:"ژاپۆنی",charsetKR:"کۆریا",charsetOther:"دەستەی نووسەی بەکۆدکەری تر",charsetTR:"تورکی",charsetUN:"Unicode (UTF-8)",charsetWE:"ڕۆژئاوای ئەوروپا",chooseColor:"هەڵبژێرە",design:"شێوەکار", +docTitle:"سەردێڕی پەڕه",docType:"سەرپەڕەی جۆری پەڕه",docTypeOther:"سەرپەڕەی جۆری پەڕەی تر",label:"خاسییەتی پەڕه",margin:"تەنیشت پەڕه",marginBottom:"ژێرەوه",marginLeft:"چەپ",marginRight:"ڕاست",marginTop:"سەرەوه",meta:"زانیاری مێتا",metaAuthor:"نووسەر",metaCopyright:"مافی بڵاوکردنەوەی",metaDescription:"پێناسەی لاپەڕه",metaKeywords:"بەڵگەنامەی وشەی کاریگەر(به کۆما لێکیان جیابکەوه)",other:"هیتر...",previewHtml:'

        ئەمە وەك نموونەی دەقه. تۆ بەکاردەهێنیت CKEditor.

        ', +title:"خاسییەتی پەڕه",txtColor:"ڕەنگی دەق",xhtmlDec:"بەیاننامەکانی XHTML لەگەڵدابێت"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/lt.js b/bower_components/ckeditor/plugins/docprops/lang/lt.js new file mode 100644 index 0000000..b2e1ba9 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/lt.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","lt",{bgColor:"Fono spalva",bgFixed:"Neslenkantis fonas",bgImage:"Fono paveikslėlio nuoroda (URL)",charset:"Simbolių kodavimo lentelė",charsetASCII:"ASCII",charsetCE:"Centrinės Europos",charsetCR:"Kirilica",charsetCT:"Tradicinės kinų (Big5)",charsetGR:"Graikų",charsetJP:"Japonų",charsetKR:"Korėjiečių",charsetOther:"Kita simbolių kodavimo lentelė",charsetTR:"Turkų",charsetUN:"Unikodas (UTF-8)",charsetWE:"Vakarų Europos",chooseColor:"Pasirinkite",design:"Išdėstymas", +docTitle:"Puslapio antraštė",docType:"Dokumento tipo antraštė",docTypeOther:"Kita dokumento tipo antraštė",label:"Dokumento savybės",margin:"Puslapio kraštinės",marginBottom:"Apačioje",marginLeft:"Kairėje",marginRight:"Dešinėje",marginTop:"Viršuje",meta:"Meta duomenys",metaAuthor:"Autorius",metaCopyright:"Autorinės teisės",metaDescription:"Dokumento apibūdinimas",metaKeywords:"Dokumento indeksavimo raktiniai žodžiai (atskirti kableliais)",other:"",previewHtml:'

        Tai yra pavyzdinis tekstas. Jūs naudojate CKEditor.

        ', +title:"Dokumento savybės",txtColor:"Teksto spalva",xhtmlDec:"Įtraukti XHTML deklaracijas"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/lv.js b/bower_components/ckeditor/plugins/docprops/lang/lv.js new file mode 100644 index 0000000..6101494 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/lv.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","lv",{bgColor:"Fona krāsa",bgFixed:"Fona attēls ir fiksēts",bgImage:"Fona attēla hipersaite",charset:"Simbolu kodējums",charsetASCII:"ASCII",charsetCE:"Centrāleiropas",charsetCR:"Kirilica",charsetCT:"Ķīniešu tradicionālā (Big5)",charsetGR:"Grieķu",charsetJP:"Japāņu",charsetKR:"Korejiešu",charsetOther:"Cits simbolu kodējums",charsetTR:"Turku",charsetUN:"Unikods (UTF-8)",charsetWE:"Rietumeiropas",chooseColor:"Izvēlēties",design:"Dizains",docTitle:"Dokumenta virsraksts ", +docType:"Dokumenta tips",docTypeOther:"Cits dokumenta tips",label:"Dokumenta īpašības",margin:"Lapas robežas",marginBottom:"Apakšā",marginLeft:"Pa kreisi",marginRight:"Pa labi",marginTop:"Augšā",meta:"META dati",metaAuthor:"Autors",metaCopyright:"Autortiesības",metaDescription:"Dokumenta apraksts",metaKeywords:"Dokumentu aprakstoši atslēgvārdi (atdalīti ar komatu)",other:"<cits>",previewHtml:'<p>Šis ir <strong>parauga teksts</strong>. Jūs izmantojiet <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Dokumenta īpašības",txtColor:"Teksta krāsa",xhtmlDec:"Ietvert XHTML deklarācijas"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/mk.js b/bower_components/ckeditor/plugins/docprops/lang/mk.js new file mode 100644 index 0000000..7f48e61 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/mk.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","mk",{bgColor:"Background Color",bgFixed:"Non-scrolling (Fixed) Background",bgImage:"Background Image URL",charset:"Character Set Encoding",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"Other Character Set Encoding",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Choose",design:"Design", +docTitle:"Page Title",docType:"Document Type Heading",docTypeOther:"Other Document Type Heading",label:"Document Properties",margin:"Page Margins",marginBottom:"Bottom",marginLeft:"Left",marginRight:"Right",marginTop:"Top",meta:"Meta Tags",metaAuthor:"Author",metaCopyright:"Copyright",metaDescription:"Document Description",metaKeywords:"Document Indexing Keywords (comma separated)",other:"Other...",previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Document Properties",txtColor:"Text Color",xhtmlDec:"Include XHTML Declarations"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/mn.js b/bower_components/ckeditor/plugins/docprops/lang/mn.js new file mode 100644 index 0000000..8907ba3 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/mn.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","mn",{bgColor:"Фоно өнгө",bgFixed:"Гүйдэггүй фоно",bgImage:"Фоно зурагны URL",charset:"Encoding тэмдэгт",charsetASCII:"ASCII",charsetCE:"Төв европ",charsetCR:"Крил",charsetCT:"Хятадын уламжлалт (Big5)",charsetGR:"Гред",charsetJP:"Япон",charsetKR:"Солонгос",charsetOther:"Encoding-д өөр тэмдэгт оноох",charsetTR:"Tурк",charsetUN:"Юникод (UTF-8)",charsetWE:"Баруун европ",chooseColor:"Сонгох",design:"Design",docTitle:"Хуудасны гарчиг",docType:"Баримт бичгийн төрөл Heading", +docTypeOther:"Бусад баримт бичгийн төрөл Heading",label:"Баримт бичиг шинж чанар",margin:"Хуудасны захын зай",marginBottom:"Доод тал",marginLeft:"Зүүн тал",marginRight:"Баруун тал",marginTop:"Дээд тал",meta:"Meta өгөгдөл",metaAuthor:"Зохиогч",metaCopyright:"Зохиогчийн эрх",metaDescription:"Баримт бичгийн тайлбар",metaKeywords:"Баримт бичгийн индекс түлхүүр үг (таслалаар тусгаарлагдана)",other:"<other>",previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Баримт бичиг шинж чанар",txtColor:"Фонтны өнгө",xhtmlDec:"XHTML-ийн мэдээллийг агуулах"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/ms.js b/bower_components/ckeditor/plugins/docprops/lang/ms.js new file mode 100644 index 0000000..fe51ef5 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/ms.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","ms",{bgColor:"Warna Latarbelakang",bgFixed:"Imej Latarbelakang tanpa Skrol",bgImage:"URL Gambar Latarbelakang",charset:"Enkod Set Huruf",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"Enkod Set Huruf yang Lain",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Choose",design:"Design",docTitle:"Tajuk Muka Surat", +docType:"Jenis Kepala Dokumen",docTypeOther:"Jenis Kepala Dokumen yang Lain",label:"Ciri-ciri dokumen",margin:"Margin Muka Surat",marginBottom:"Bawah",marginLeft:"Kiri",marginRight:"Kanan",marginTop:"Atas",meta:"Data Meta",metaAuthor:"Penulis",metaCopyright:"Hakcipta",metaDescription:"Keterangan Dokumen",metaKeywords:"Kata Kunci Indeks Dokumen (dipisahkan oleh koma)",other:"<lain>",previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Ciri-ciri dokumen",txtColor:"Warna Text",xhtmlDec:"Masukkan pemula kod XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/nb.js b/bower_components/ckeditor/plugins/docprops/lang/nb.js new file mode 100644 index 0000000..87926ab --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/nb.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","nb",{bgColor:"Bakgrunnsfarge",bgFixed:"Lås bakgrunnsbilde",bgImage:"URL for bakgrunnsbilde",charset:"Tegnsett",charsetASCII:"ASCII",charsetCE:"Sentraleuropeisk",charsetCR:"Kyrillisk",charsetCT:"Tradisonell kinesisk(Big5)",charsetGR:"Gresk",charsetJP:"Japansk",charsetKR:"Koreansk",charsetOther:"Annet tegnsett",charsetTR:"Tyrkisk",charsetUN:"Unicode (UTF-8)",charsetWE:"Vesteuropeisk",chooseColor:"Velg",design:"Design",docTitle:"Sidetittel",docType:"Dokumenttype header", +docTypeOther:"Annet dokumenttype header",label:"Dokumentegenskaper",margin:"Sidemargin",marginBottom:"Bunn",marginLeft:"Venstre",marginRight:"Høyre",marginTop:"Topp",meta:"Meta-data",metaAuthor:"Forfatter",metaCopyright:"Kopirett",metaDescription:"Dokumentbeskrivelse",metaKeywords:"Dokument nøkkelord (kommaseparert)",other:"<annen>",previewHtml:'<p>Dette er en <strong>eksempeltekst</strong>. Du bruker <a href="javascript:void(0)">CKEditor</a>.</p>',title:"Dokumentegenskaper",txtColor:"Tekstfarge", +xhtmlDec:"Inkluder XHTML-deklarasjon"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/nl.js b/bower_components/ckeditor/plugins/docprops/lang/nl.js new file mode 100644 index 0000000..7425a0a --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/nl.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","nl",{bgColor:"Achtergrondkleur",bgFixed:"Niet-scrollend (gefixeerde) achtergrond",bgImage:"Achtergrondafbeelding URL",charset:"Tekencodering",charsetASCII:"ASCII",charsetCE:"Centraal Europees",charsetCR:"Cyrillisch",charsetCT:"Traditioneel Chinees (Big5)",charsetGR:"Grieks",charsetJP:"Japans",charsetKR:"Koreaans",charsetOther:"Andere tekencodering",charsetTR:"Turks",charsetUN:"Unicode (UTF-8)",charsetWE:"West Europees",chooseColor:"Kies",design:"Ontwerp",docTitle:"Paginatitel", +docType:"Documenttype-definitie",docTypeOther:"Andere documenttype-definitie",label:"Documenteigenschappen",margin:"Pagina marges",marginBottom:"Onder",marginLeft:"Links",marginRight:"Rechts",marginTop:"Boven",meta:"Meta tags",metaAuthor:"Auteur",metaCopyright:"Auteursrechten",metaDescription:"Documentbeschrijving",metaKeywords:"Trefwoorden voor indexering (komma-gescheiden)",other:"Anders...",previewHtml:'<p>Dit is <strong>voorbeeld tekst</strong>. Je gebruikt <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Documenteigenschappen",txtColor:"Tekstkleur",xhtmlDec:"XHTML declaratie invoegen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/no.js b/bower_components/ckeditor/plugins/docprops/lang/no.js new file mode 100644 index 0000000..11dddcf --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/no.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","no",{bgColor:"Bakgrunnsfarge",bgFixed:"Lås bakgrunnsbilde",bgImage:"URL for bakgrunnsbilde",charset:"Tegnsett",charsetASCII:"ASCII",charsetCE:"Sentraleuropeisk",charsetCR:"Kyrillisk",charsetCT:"Tradisonell kinesisk(Big5)",charsetGR:"Gresk",charsetJP:"Japansk",charsetKR:"Koreansk",charsetOther:"Annet tegnsett",charsetTR:"Tyrkisk",charsetUN:"Unicode (UTF-8)",charsetWE:"Vesteuropeisk",chooseColor:"Velg",design:"Design",docTitle:"Sidetittel",docType:"Dokumenttype header", +docTypeOther:"Annet dokumenttype header",label:"Dokumentegenskaper",margin:"Sidemargin",marginBottom:"Bunn",marginLeft:"Venstre",marginRight:"Høyre",marginTop:"Topp",meta:"Meta-data",metaAuthor:"Forfatter",metaCopyright:"Kopirett",metaDescription:"Dokumentbeskrivelse",metaKeywords:"Dokument nøkkelord (kommaseparert)",other:"<annen>",previewHtml:'<p>Dette er en <strong>eksempeltekst</strong>. Du bruker <a href="javascript:void(0)">CKEditor</a>.</p>',title:"Dokumentegenskaper",txtColor:"Tekstfarge", +xhtmlDec:"Inkluder XHTML-deklarasjon"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/pl.js b/bower_components/ckeditor/plugins/docprops/lang/pl.js new file mode 100644 index 0000000..4fb4343 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/pl.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","pl",{bgColor:"Kolor tła",bgFixed:"Tło nieruchome (nieprzewijające się)",bgImage:"Adres URL obrazka tła",charset:"Kodowanie znaków",charsetASCII:"ASCII",charsetCE:"Środkowoeuropejskie",charsetCR:"Cyrylica",charsetCT:"Chińskie tradycyjne (Big5)",charsetGR:"Greckie",charsetJP:"Japońskie",charsetKR:"Koreańskie",charsetOther:"Inne kodowanie znaków",charsetTR:"Tureckie",charsetUN:"Unicode (UTF-8)",charsetWE:"Zachodnioeuropejskie",chooseColor:"Wybierz",design:"Projekt strony", +docTitle:"Tytuł strony",docType:"Definicja typu dokumentu",docTypeOther:"Inna definicja typu dokumentu",label:"Właściwości dokumentu",margin:"Marginesy strony",marginBottom:"Dolny",marginLeft:"Lewy",marginRight:"Prawy",marginTop:"Górny",meta:"Znaczniki meta",metaAuthor:"Autor",metaCopyright:"Prawa autorskie",metaDescription:"Opis dokumentu",metaKeywords:"Słowa kluczowe dokumentu (oddzielone przecinkami)",other:"Inne",previewHtml:'<p>To jest <strong>przykładowy tekst</strong>. Korzystasz z programu <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Właściwości dokumentu",txtColor:"Kolor tekstu",xhtmlDec:"Uwzględnij deklaracje XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/pt-br.js b/bower_components/ckeditor/plugins/docprops/lang/pt-br.js new file mode 100644 index 0000000..c671fed --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/pt-br.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","pt-br",{bgColor:"Cor do Plano de Fundo",bgFixed:"Plano de Fundo Fixo",bgImage:"URL da Imagem de Plano de Fundo",charset:"Codificação de Caracteres",charsetASCII:"ASCII",charsetCE:"Europa Central",charsetCR:"Cirílico",charsetCT:"Chinês Tradicional (Big5)",charsetGR:"Grego",charsetJP:"Japonês",charsetKR:"Coreano",charsetOther:"Outra Codificação de Caracteres",charsetTR:"Turco",charsetUN:"Unicode (UTF-8)",charsetWE:"Europa Ocidental",chooseColor:"Escolher",design:"Design", +docTitle:"Título da Página",docType:"Cabeçalho Tipo de Documento",docTypeOther:"Outro Tipo de Documento",label:"Propriedades Documento",margin:"Margens da Página",marginBottom:"Inferior",marginLeft:"Inferior",marginRight:"Direita",marginTop:"Superior",meta:"Meta Dados",metaAuthor:"Autor",metaCopyright:"Direitos Autorais",metaDescription:"Descrição do Documento",metaKeywords:"Palavras-chave de Indexação do Documento (separadas por vírgula)",other:"<outro>",previewHtml:'<p>Este é um <strong>texto de exemplo</strong>. Você está usando <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Propriedades Documento",txtColor:"Cor do Texto",xhtmlDec:"Incluir Declarações XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/pt.js b/bower_components/ckeditor/plugins/docprops/lang/pt.js new file mode 100644 index 0000000..2633940 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/pt.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","pt",{bgColor:"Cor de Fundo",bgFixed:"Fundo Fixo",bgImage:"Caminho para a imagem de fundo",charset:"Codificação de caracteres",charsetASCII:"ASCII",charsetCE:"Europa Central",charsetCR:"Cirílico",charsetCT:"Chinês Traditional (Big5)",charsetGR:"Grego",charsetJP:"Japonês",charsetKR:"Coreano",charsetOther:"Outra Codificação de Caracteres",charsetTR:"Turco",charsetUN:"Unicode (UTF-8)",charsetWE:"Europa Ocidental",chooseColor:"Choose",design:"Desenho",docTitle:"Título da Página", +docType:"Tipo de Cabeçalho do Documento",docTypeOther:"Outro Tipo de Cabeçalho do Documento",label:"Propriedades do Documento",margin:"Margem das Páginas",marginBottom:"Fundo",marginLeft:"Esquerda",marginRight:"Direita",marginTop:"Topo",meta:"Meta Data",metaAuthor:"Autor",metaCopyright:"Direitos de Autor",metaDescription:"Descrição do Documento",metaKeywords:"Palavras de Indexação do Documento (separadas por virgula)",other:"<outro>",previewHtml:'<p>Isto é algum <strong>texto amostra</strong>. Está a usar o <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Propriedades do documento",txtColor:"Cor do Texto",xhtmlDec:"Incluir Declarações XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/ro.js b/bower_components/ckeditor/plugins/docprops/lang/ro.js new file mode 100644 index 0000000..9aa0e6d --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/ro.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","ro",{bgColor:"Culoarea fundalului (Background Color)",bgFixed:"Fundal neflotant, fix (Non-scrolling Background)",bgImage:"URL-ul imaginii din fundal (Background Image URL)",charset:"Encoding setului de caractere",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Chirilic",charsetCT:"Chinezesc tradiţional (Big5)",charsetGR:"Grecesc",charsetJP:"Japonez",charsetKR:"Corean",charsetOther:"Alt encoding al setului de caractere",charsetTR:"Turcesc",charsetUN:"Unicode (UTF-8)", +charsetWE:"Vest european",chooseColor:"Alege",design:"Design",docTitle:"Titlul paginii",docType:"Document Type Heading",docTypeOther:"Alt Document Type Heading",label:"Proprietăţile documentului",margin:"Marginile paginii",marginBottom:"Jos",marginLeft:"Stânga",marginRight:"Dreapta",marginTop:"Sus",meta:"Meta Tags",metaAuthor:"Autor",metaCopyright:"Drepturi de autor",metaDescription:"Descrierea documentului",metaKeywords:"Cuvinte cheie după care se va indexa documentul (separate prin virgulă)",other:"<alt>", +previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>',title:"Proprietăţile documentului",txtColor:"Culoarea textului",xhtmlDec:"Include declaraţii XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/ru.js b/bower_components/ckeditor/plugins/docprops/lang/ru.js new file mode 100644 index 0000000..01d585f --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/ru.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","ru",{bgColor:"Цвет фона",bgFixed:"Фон прикреплён (не проматывается)",bgImage:"Ссылка на фоновое изображение",charset:"Кодировка набора символов",charsetASCII:"ASCII",charsetCE:"Центрально-европейская",charsetCR:"Кириллица",charsetCT:"Китайская традиционная (Big5)",charsetGR:"Греческая",charsetJP:"Японская",charsetKR:"Корейская",charsetOther:"Другая кодировка набора символов",charsetTR:"Турецкая",charsetUN:"Юникод (UTF-8)",charsetWE:"Западно-европейская",chooseColor:"Выберите", +design:"Дизайн",docTitle:"Заголовок страницы",docType:"Заголовок типа документа",docTypeOther:"Другой заголовок типа документа",label:"Свойства документа",margin:"Отступы страницы",marginBottom:"Нижний",marginLeft:"Левый",marginRight:"Правый",marginTop:"Верхний",meta:"Метаданные",metaAuthor:"Автор",metaCopyright:"Авторские права",metaDescription:"Описание документа",metaKeywords:"Ключевые слова документа (через запятую)",other:"Другой ...",previewHtml:'<p>Это <strong>пример</strong> текста, написанного с помощью <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Свойства документа",txtColor:"Цвет текста",xhtmlDec:"Включить объявления XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/si.js b/bower_components/ckeditor/plugins/docprops/lang/si.js new file mode 100644 index 0000000..19a7d6f --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/si.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("docprops","si",{bgColor:"පසුබිම් වර්ණය",bgFixed:"Non-scrolling (Fixed) Background",bgImage:"පසුබිම් ",charset:"Character Set Encoding",charsetASCII:"ASCII",charsetCE:"මාධ්‍ය ",charsetCR:"සිරිලික් හෝඩිය",charsetCT:"චීන සම්ප්‍රදාය",charsetGR:"ග්‍රීක",charsetJP:"ජපාන",charsetKR:"Korean",charsetOther:"අනෙකුත් අක්ෂර කොටස්",charsetTR:"තුර්කි",charsetUN:"Unicode (UTF-8)",charsetWE:"බස්නාහිර ",chooseColor:"තෝරන්න",design:"Design",docTitle:"පිටු මාතෘකාව",docType:"ලිපිගොනු වර්ගයේ මාතෘකාව", +docTypeOther:"අනෙකුත් ලිපිගොනු වර්ගයේ මාතෘකා",label:"ලිපිගොනු ",margin:"පිටු සීමාවන්",marginBottom:"පහල",marginLeft:"වම",marginRight:"දකුණ",marginTop:"ඉ",meta:"Meta Tags",metaAuthor:"Author",metaCopyright:"ප්‍රකාශන ",metaDescription:"ලිපිගොනු ",metaKeywords:"ලිපිගොනු පෙලගේසමේ විශේෂ වචන (කොමා වලින් වෙන්කරන ලද)",other:"අනෙකුත්",previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>',title:"පෝරමයේ ගුණ/",txtColor:"අක්ෂර වර්ණ",xhtmlDec:"Include XHTML Declarations"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/sk.js b/bower_components/ckeditor/plugins/docprops/lang/sk.js new file mode 100644 index 0000000..b347ab0 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/sk.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","sk",{bgColor:"Farba pozadia",bgFixed:"Fixné pozadie",bgImage:"URL obrázka na pozadí",charset:"Znaková sada",charsetASCII:"ASCII",charsetCE:"Stredoeurópska",charsetCR:"Cyrillika",charsetCT:"Čínština tradičná (Big5)",charsetGR:"Gréčtina",charsetJP:"Japončina",charsetKR:"Korejčina",charsetOther:"Iná znaková sada",charsetTR:"Turečtina",charsetUN:"Unicode (UTF-8)",charsetWE:"Západná európa",chooseColor:"Vybrať",design:"Design",docTitle:"Titulok stránky",docType:"Typ záhlavia dokumentu", +docTypeOther:"Iný typ záhlavia dokumentu",label:"Vlastnosti dokumentu",margin:"Okraje stránky (margins)",marginBottom:"Dolný",marginLeft:"Ľavý",marginRight:"Pravý",marginTop:"Horný",meta:"Meta značky",metaAuthor:"Autor",metaCopyright:"Autorské práva (copyright)",metaDescription:"Popis dokumentu",metaKeywords:"Indexované kľúčové slová dokumentu (oddelené čiarkou)",other:"Iný...",previewHtml:'<p>Toto je nejaký <strong>ukážkový text</strong>. Používate <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Vlastnosti dokumentu",txtColor:"Farba textu",xhtmlDec:"Vložiť deklarácie XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/sl.js b/bower_components/ckeditor/plugins/docprops/lang/sl.js new file mode 100644 index 0000000..7017e1b --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/sl.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","sl",{bgColor:"Barva ozadja",bgFixed:"Nepremično ozadje",bgImage:"URL slike za ozadje",charset:"Kodna tabela",charsetASCII:"ASCII",charsetCE:"Srednjeevropsko",charsetCR:"Cirilica",charsetCT:"Tradicionalno Kitajsko (Big5)",charsetGR:"Grško",charsetJP:"Japonsko",charsetKR:"Korejsko",charsetOther:"Druga kodna tabela",charsetTR:"Turško",charsetUN:"Unicode (UTF-8)",charsetWE:"Zahodnoevropsko",chooseColor:"Izberi",design:"Oblika",docTitle:"Naslov strani",docType:"Glava tipa dokumenta", +docTypeOther:"Druga glava tipa dokumenta",label:"Lastnosti dokumenta",margin:"Zamiki strani",marginBottom:"Spodaj",marginLeft:"Levo",marginRight:"Desno",marginTop:"Na vrhu",meta:"Meta podatki",metaAuthor:"Avtor",metaCopyright:"Avtorske pravice",metaDescription:"Opis strani",metaKeywords:"Ključne besede (ločene z vejicami)",other:"<drug>",previewHtml:'<p>Tole je<strong>primer besedila</strong>. Uporabljate <a href="javascript:void(0)">CKEditor</a>.</p>',title:"Lastnosti dokumenta",txtColor:"Barva besedila", +xhtmlDec:"Vstavi XHTML deklaracije"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/sq.js b/bower_components/ckeditor/plugins/docprops/lang/sq.js new file mode 100644 index 0000000..e08409b --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/sq.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","sq",{bgColor:"Ngjyra e Prapavijës",bgFixed:"Prapavijë pa zvarritje (fiks)",bgImage:"URL e Fotografisë së Prapavijës",charset:"Character Set Encoding",charsetASCII:"ASCII",charsetCE:"Evropës Qendrore",charsetCR:"Sllave",charsetCT:"Kinezisht Tradicional (Big5)",charsetGR:"Greke",charsetJP:"Japoneze",charsetKR:"Koreane",charsetOther:"Other Character Set Encoding",charsetTR:"Turke",charsetUN:"Unicode (UTF-8)",charsetWE:"Evropiano Perëndimor",chooseColor:"Përzgjidh", +design:"Dizajni",docTitle:"Titulli i Faqes",docType:"Document Type Heading",docTypeOther:"Koka e Llojit Tjetër të Dokumentit",label:"Karakteristikat e Dokumentit",margin:"Kufijtë e Faqes",marginBottom:"Poshtë",marginLeft:"Majtas",marginRight:"Djathtas",marginTop:"Lart",meta:"Meta Tags",metaAuthor:"Autori",metaCopyright:"Të drejtat e kopjimit",metaDescription:"Përshkrimi i Dokumentit",metaKeywords:"Fjalët kyçe të indeksimit të dokumentit (të ndarë me presje)",other:"Tjera...",previewHtml:'<p>Ky është nje <strong>tekst shembull</strong>. Ju jeni duke shfrytëzuar <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Karakteristikat e Dokumentit",txtColor:"Ngjyra e Tekstit",xhtmlDec:"Përfshij XHTML Deklarimet"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/sr-latn.js b/bower_components/ckeditor/plugins/docprops/lang/sr-latn.js new file mode 100644 index 0000000..77312ff --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/sr-latn.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","sr-latn",{bgColor:"Boja pozadine",bgFixed:"Fiksirana pozadina",bgImage:"URL pozadinske slike",charset:"Kodiranje skupa karaktera",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"Ostala kodiranja skupa karaktera",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Choose",design:"Design",docTitle:"Naslov stranice", +docType:"Zaglavlje tipa dokumenta",docTypeOther:"Ostala zaglavlja tipa dokumenta",label:"Osobine dokumenta",margin:"Margine stranice",marginBottom:"Donja",marginLeft:"Leva",marginRight:"Desna",marginTop:"Gornja",meta:"Metapodaci",metaAuthor:"Autor",metaCopyright:"Autorska prava",metaDescription:"Opis dokumenta",metaKeywords:"Ključne reci za indeksiranje dokumenta (razdvojene zarezima)",other:"<остало>",previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Osobine dokumenta",txtColor:"Boja teksta",xhtmlDec:"Ukljuci XHTML deklaracije"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/sr.js b/bower_components/ckeditor/plugins/docprops/lang/sr.js new file mode 100644 index 0000000..f50c3e4 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/sr.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","sr",{bgColor:"Боја позадине",bgFixed:"Фиксирана позадина",bgImage:"УРЛ позадинске слике",charset:"Кодирање скупа карактера",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"Остала кодирања скупа карактера",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Choose",design:"Design",docTitle:"Наслов странице", +docType:"Заглавље типа документа",docTypeOther:"Остала заглавља типа документа",label:"Особине документа",margin:"Маргине странице",marginBottom:"Доња",marginLeft:"Лева",marginRight:"Десна",marginTop:"Горња",meta:"Метаподаци",metaAuthor:"Аутор",metaCopyright:"Ауторска права",metaDescription:"Опис документа",metaKeywords:"Кључне речи за индексирање документа (раздвојене зарезом)",other:"<other>",previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"Особине документа",txtColor:"Боја текста",xhtmlDec:"Улључи XHTML декларације"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/sv.js b/bower_components/ckeditor/plugins/docprops/lang/sv.js new file mode 100644 index 0000000..363de9b --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/sv.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("docprops","sv",{bgColor:"Bakgrundsfärg",bgFixed:"Fast bakgrund",bgImage:"Bakgrundsbildens URL",charset:"Teckenuppsättningar",charsetASCII:"ASCII",charsetCE:"Central Europa",charsetCR:"Kyrillisk",charsetCT:"Traditionell Kinesisk (Big5)",charsetGR:"Grekiska",charsetJP:"Japanska",charsetKR:"Koreanska",charsetOther:"Övriga teckenuppsättningar",charsetTR:"Turkiska",charsetUN:"Unicode (UTF-8)",charsetWE:"Väst Europa",chooseColor:"Välj",design:"Design",docTitle:"Sidtitel",docType:"Sidhuvud", +docTypeOther:"Övriga sidhuvuden",label:"Dokumentegenskaper",margin:"Sidmarginal",marginBottom:"Botten",marginLeft:"Vänster",marginRight:"Höger",marginTop:"Topp",meta:"Metadata",metaAuthor:"Författare",metaCopyright:"Upphovsrätt",metaDescription:"Sidans beskrivning",metaKeywords:"Sidans nyckelord (kommaseparerade)",other:"Annan...",previewHtml:'<p>Detta är en <strong>exempel text</strong>. Du använder <a href="javascript:void(0)">CKEditor</a>.</p>',title:"Dokumentegenskaper",txtColor:"Textfärg",xhtmlDec:"Inkludera XHTML deklaration"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/th.js b/bower_components/ckeditor/plugins/docprops/lang/th.js new file mode 100644 index 0000000..2befc7f --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/th.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","th",{bgColor:"สีพื้นหลัง",bgFixed:"พื้นหลังแบบไม่มีแถบเลื่อน",bgImage:"ที่อยู่อ้างอิงออนไลน์ของรูปพื้นหลัง (Image URL)",charset:"ชุดตัวอักษร",charsetASCII:"ASCII",charsetCE:"Central European",charsetCR:"Cyrillic",charsetCT:"Chinese Traditional (Big5)",charsetGR:"Greek",charsetJP:"Japanese",charsetKR:"Korean",charsetOther:"ชุดตัวอักษรอื่นๆ",charsetTR:"Turkish",charsetUN:"Unicode (UTF-8)",charsetWE:"Western European",chooseColor:"Choose",design:"ออกแบบ",docTitle:"ชื่อไตเติ้ล", +docType:"ประเภทของเอกสาร",docTypeOther:"ประเภทเอกสารอื่นๆ",label:"คุณสมบัติของเอกสาร",margin:"ระยะขอบของหน้าเอกสาร",marginBottom:"ด้านล่าง",marginLeft:"ด้านซ้าย",marginRight:"ด้านขวา",marginTop:"ด้านบน",meta:"ข้อมูลสำหรับเสิร์ชเอนจิ้น",metaAuthor:"ผู้สร้างเอกสาร",metaCopyright:"สงวนลิขสิทธิ์",metaDescription:"ประโยคอธิบายเกี่ยวกับเอกสาร",metaKeywords:"คำสำคัญอธิบายเอกสาร (คั่นคำด้วย คอมม่า)",other:"<อื่น ๆ>",previewHtml:'<p>นี่เป็น <strong>ข้อความตัวอย่าง</strong>. คุณกำลังใช้งาน <a href="javascript:void(0)">CKEditor</a>.</p>', +title:"คุณสมบัติของเอกสาร",txtColor:"สีตัวอักษร",xhtmlDec:"รวมเอา XHTML Declarations ไว้ด้วย"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/tr.js b/bower_components/ckeditor/plugins/docprops/lang/tr.js new file mode 100644 index 0000000..00a35d4 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/tr.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","tr",{bgColor:"Arka Plan Rengi",bgFixed:"Sabit Arka Plan",bgImage:"Arka Plan Resim URLsi",charset:"Karakter Kümesi Kodlaması",charsetASCII:"ASCII",charsetCE:"Orta Avrupa",charsetCR:"Kiril",charsetCT:"Geleneksel Çince (Big5)",charsetGR:"Yunanca",charsetJP:"Japonca",charsetKR:"Korece",charsetOther:"Diğer Karakter Kümesi Kodlaması",charsetTR:"Türkçe",charsetUN:"Evrensel Kod (UTF-8)",charsetWE:"Batı Avrupa",chooseColor:"Seçiniz",design:"Dizayn",docTitle:"Sayfa Başlığı", +docType:"Belge Türü Başlığı",docTypeOther:"Diğer Belge Türü Başlığı",label:"Belge Özellikleri",margin:"Kenar Boşlukları",marginBottom:"Alt",marginLeft:"Sol",marginRight:"Sağ",marginTop:"Tepe",meta:"Tanım Bilgisi (Meta)",metaAuthor:"Yazar",metaCopyright:"Telif",metaDescription:"Belge Tanımı",metaKeywords:"Belge Dizinleme Anahtar Kelimeleri (virgülle ayrılmış)",other:"<diğer>",previewHtml:'<p>Bu bir <strong>örnek metindir</strong>. <a href="javascript:void(0)">CKEditor</a> kullanıyorsunuz.</p>',title:"Belge Özellikleri", +txtColor:"Yazı Rengi",xhtmlDec:"XHTML Bildirimlerini Dahil Et"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/tt.js b/bower_components/ckeditor/plugins/docprops/lang/tt.js new file mode 100644 index 0000000..a00fa3c --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/tt.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","tt",{bgColor:"Фон төсе",bgFixed:"Non-scrolling (Fixed) Background",bgImage:"Background Image URL",charset:"Character Set Encoding",charsetASCII:"ASCII",charsetCE:"Урта Ауропа",charsetCR:"Кириллик",charsetCT:"Гадәти кытай (Big5)",charsetGR:"Грек",charsetJP:"Япон",charsetKR:"Корей",charsetOther:"Other Character Set Encoding",charsetTR:"Төрек",charsetUN:"Юникод (UTF-8)",charsetWE:"Көнбатыш Ауропа",chooseColor:"Сайлау",design:"Дизайн",docTitle:"Бит исеме",docType:"Document Type Heading", +docTypeOther:"Other Document Type Heading",label:"Документ үзлекләре",margin:"Page Margins",marginBottom:"Аска",marginLeft:"Сул",marginRight:"Уң як",marginTop:"Өскә",meta:"Meta Tags",metaAuthor:"Автор",metaCopyright:"Copyright",metaDescription:"Документ тасвирламасы",metaKeywords:"Document Indexing Keywords (comma separated)",other:"Башка...",previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>',title:"Документ үзлекләре",txtColor:"Текст төсе", +xhtmlDec:"Include XHTML Declarations"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/ug.js b/bower_components/ckeditor/plugins/docprops/lang/ug.js new file mode 100644 index 0000000..424d13a --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/ug.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","ug",{bgColor:"تەگلىك رەڭگى",bgFixed:"تەگلىك سۈرەتنى دومىلاتما",bgImage:"تەگلىك سۈرەت",charset:"ھەرپ كودلىنىشى",charsetASCII:"ASCII",charsetCE:"ئوتتۇرا ياۋرۇپا",charsetCR:"سىلاۋيانچە",charsetCT:"مۇرەككەپ خەنزۇچە (Big5)",charsetGR:"گىرېكچە",charsetJP:"ياپونچە",charsetKR:"كۆرىيەچە",charsetOther:"باشقا ھەرپ كودلىنىشى",charsetTR:"تۈركچە",charsetUN:"يۇنىكود (UTF-8)",charsetWE:"غەربىي ياۋرۇپا",chooseColor:"تاللاڭ",design:"لايىھە",docTitle:"بەت ماۋزۇسى",docType:"پۈتۈك تىپى", +docTypeOther:"باشقا پۈتۈك تىپى",label:"بەت خاسلىقى",margin:"بەت گىرۋەك",marginBottom:"ئاستى",marginLeft:"سول",marginRight:"ئوڭ",marginTop:"ئۈستى",meta:"مېتا سانلىق مەلۇمات",metaAuthor:"يازغۇچى",metaCopyright:"نەشر ھوقۇقى",metaDescription:"بەت يۈزى چۈشەندۈرۈشى",metaKeywords:"بەت يۈزى ئىندېكىس ھالقىلىق سۆزى (ئىنگلىزچە پەش [,] بىلەن ئايرىلىدۇ)",other:"باشقا",previewHtml:'<p>بۇ بىر قىسىم <strong>كۆرسەتمىگە ئىشلىتىدىغان تېكىست </strong>سىز نۆۋەتتە <a href="javascript:void(0)">CKEditor</a>.نى ئىشلىتىۋاتىسىز.</p>', +title:"بەت خاسلىقى",txtColor:"تېكىست رەڭگى",xhtmlDec:"XHTML ئېنىقلىمىسىنى ئۆز ئىچىگە ئالىدۇ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/uk.js b/bower_components/ckeditor/plugins/docprops/lang/uk.js new file mode 100644 index 0000000..c102796 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/uk.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","uk",{bgColor:"Колір тла",bgFixed:"Тло без прокрутки",bgImage:"URL зображення тла",charset:"Кодування набору символів",charsetASCII:"ASCII",charsetCE:"Центрально-європейська",charsetCR:"Кирилиця",charsetCT:"Китайська традиційна (Big5)",charsetGR:"Грецька",charsetJP:"Японська",charsetKR:"Корейська",charsetOther:"Інше кодування набору символів",charsetTR:"Турецька",charsetUN:"Юнікод (UTF-8)",charsetWE:"Західно-европейская",chooseColor:"Обрати",design:"Дизайн",docTitle:"Заголовок сторінки", +docType:"Заголовок типу документу",docTypeOther:"Інший заголовок типу документу",label:"Властивості документа",margin:"Відступи сторінки",marginBottom:"Нижній",marginLeft:"Лівий",marginRight:"Правий",marginTop:"Верхній",meta:"Мета дані",metaAuthor:"Автор",metaCopyright:"Авторські права",metaDescription:"Опис документа",metaKeywords:"Ключові слова документа (розділені комами)",other:"<інший>",previewHtml:'<p>Це приклад<strong>тексту</strong>. Ви використовуєте<a href="javascript:void(0)"> CKEditor </a>.</p>', +title:"Властивості документа",txtColor:"Колір тексту",xhtmlDec:"Ввімкнути XHTML оголошення"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/vi.js b/bower_components/ckeditor/plugins/docprops/lang/vi.js new file mode 100644 index 0000000..b458376 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/vi.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("docprops","vi",{bgColor:"Màu nền",bgFixed:"Không cuộn nền",bgImage:"URL của Hình ảnh nền",charset:"Bảng mã ký tự",charsetASCII:"ASCII",charsetCE:"Trung Âu",charsetCR:"Tiếng Kirin",charsetCT:"Tiếng Trung Quốc (Big5)",charsetGR:"Tiếng Hy Lạp",charsetJP:"Tiếng Nhật",charsetKR:"Tiếng Hàn",charsetOther:"Bảng mã ký tự khác",charsetTR:"Tiếng Thổ Nhĩ Kỳ",charsetUN:"Unicode (UTF-8)",charsetWE:"Tây Âu",chooseColor:"Chọn màu",design:"Thiết kế",docTitle:"Tiêu đề Trang",docType:"Kiểu Đề mục Tài liệu", +docTypeOther:"Kiểu Đề mục Tài liệu khác",label:"Thuộc tính Tài liệu",margin:"Đường biên của Trang",marginBottom:"Dưới",marginLeft:"Trái",marginRight:"Phải",marginTop:"Trên",meta:"Siêu dữ liệu",metaAuthor:"Tác giả",metaCopyright:"Bản quyền",metaDescription:"Mô tả tài liệu",metaKeywords:"Các từ khóa chỉ mục tài liệu (phân cách bởi dấu phẩy)",other:"<khác>",previewHtml:'<p>Đây là một số <strong>văn bản mẫu</strong>. Bạn đang sử dụng <a href="javascript:void(0)">CKEditor</a>.</p>',title:"Thuộc tính Tài liệu", +txtColor:"Màu chữ",xhtmlDec:"Bao gồm cả định nghĩa XHTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/zh-cn.js b/bower_components/ckeditor/plugins/docprops/lang/zh-cn.js new file mode 100644 index 0000000..d8c87e7 --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/zh-cn.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("docprops","zh-cn",{bgColor:"背景颜色",bgFixed:"不滚动背景图像",bgImage:"背景图像",charset:"字符编码",charsetASCII:"ASCII",charsetCE:"中欧",charsetCR:"西里尔文",charsetCT:"繁体中文 (Big5)",charsetGR:"希腊文",charsetJP:"日文",charsetKR:"韩文",charsetOther:"其它字符编码",charsetTR:"土耳其文",charsetUN:"Unicode (UTF-8)",charsetWE:"西欧",chooseColor:"选择",design:"设计",docTitle:"页面标题",docType:"文档类型",docTypeOther:"其它文档类型",label:"页面属性",margin:"页面边距",marginBottom:"下",marginLeft:"左",marginRight:"右",marginTop:"上",meta:"Meta 数据",metaAuthor:"作者", +metaCopyright:"版权",metaDescription:"页面说明",metaKeywords:"页面索引关键字 (用半角逗号[,]分隔)",other:"<其他>",previewHtml:'<p>这是一些<strong>演示用文字</strong>。您当前正在使用<a href="javascript:void(0)">CKEditor</a>。</p>',title:"页面属性",txtColor:"文本颜色",xhtmlDec:"包含 XHTML 声明"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/lang/zh.js b/bower_components/ckeditor/plugins/docprops/lang/zh.js new file mode 100644 index 0000000..193a57d --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/lang/zh.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("docprops","zh",{bgColor:"背景顏色",bgFixed:"非捲動 (固定) 背景",bgImage:"背景圖像 URL",charset:"字元集編碼",charsetASCII:"ASCII",charsetCE:"中歐語系",charsetCR:"斯拉夫文",charsetCT:"正體中文 (Big5)",charsetGR:"希臘文",charsetJP:"日文",charsetKR:"韓文",charsetOther:"其他字元集編碼",charsetTR:"土耳其文",charsetUN:"Unicode (UTF-8)",charsetWE:"西歐語系",chooseColor:"選擇",design:"設計模式",docTitle:"頁面標題",docType:"文件類型標題",docTypeOther:"其他文件類型標題",label:"文件屬性",margin:"頁面邊界",marginBottom:"底端",marginLeft:"左",marginRight:"右",marginTop:"頂端", +meta:"Meta 標籤",metaAuthor:"作者",metaCopyright:"版權資訊",metaDescription:"文件描述",metaKeywords:"文件索引關鍵字 (以逗號分隔)",other:"其他…",previewHtml:'<p>此為簡短的<strong>範例文字</strong>。您正在使用 <a href="javascript:void(0)">CKEditor</a>。</p>',title:"文件屬性",txtColor:"文字顏色",xhtmlDec:"包含 XHTML 宣告"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/docprops/plugin.js b/bower_components/ckeditor/plugins/docprops/plugin.js new file mode 100644 index 0000000..2ca000c --- /dev/null +++ b/bower_components/ckeditor/plugins/docprops/plugin.js @@ -0,0 +1,6 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.add("docprops",{requires:"wysiwygarea,dialog,colordialog",lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"docprops,docprops-rtl",hidpi:!0,init:function(a){var b=new CKEDITOR.dialogCommand("docProps");b.modes={wysiwyg:a.config.fullPage};b.allowedContent={body:{styles:"*",attributes:"dir"},html:{attributes:"lang,xml:lang"}}; +b.requiredContent="body";a.addCommand("docProps",b);CKEDITOR.dialog.add("docProps",this.path+"dialogs/docprops.js");a.ui.addButton&&a.ui.addButton("DocProps",{label:a.lang.docprops.label,command:"docProps",toolbar:"document,30"})}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/dialogs/find.js b/bower_components/ckeditor/plugins/find/dialogs/find.js new file mode 100644 index 0000000..98c08e8 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/dialogs/find.js @@ -0,0 +1,24 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function y(c){return c.type==CKEDITOR.NODE_TEXT&&0<c.getLength()&&(!o||!c.isReadOnly())}function s(c){return!(c.type==CKEDITOR.NODE_ELEMENT&&c.isBlockBoundary(CKEDITOR.tools.extend({},CKEDITOR.dtd.$empty,CKEDITOR.dtd.$nonEditable)))}function n(c,g){function l(a,b){var d=this,c=new CKEDITOR.dom.walker(a);c.guard=b?s:function(a){!s(a)&&(d._.matchBoundary=!0)};c.evaluator=y;c.breakOnFalse=1;a.startContainer.type==CKEDITOR.NODE_TEXT&&(this.textNode=a.startContainer,this.offset=a.startOffset- +1);this._={matchWord:b,walker:c,matchBoundary:!1}}function n(a,b){var d=c.createRange();d.setStart(a.textNode,b?a.offset:a.offset+1);d.setEndAt(c.editable(),CKEDITOR.POSITION_BEFORE_END);return d}function p(a){var b=c.getSelection(),d=c.editable();b&&!a?(a=b.getRanges()[0].clone(),a.collapse(!0)):(a=c.createRange(),a.setStartAt(d,CKEDITOR.POSITION_AFTER_START));a.setEndAt(d,CKEDITOR.POSITION_BEFORE_END);return a}var t=new CKEDITOR.style(CKEDITOR.tools.extend({attributes:{"data-cke-highlight":1},fullMatch:1, +ignoreReadonly:1,childRule:function(){return 0}},c.config.find_highlight,!0));l.prototype={next:function(){return this.move()},back:function(){return this.move(!0)},move:function(a){var b=this.textNode;if(null===b)return u.call(this);this._.matchBoundary=!1;if(b&&a&&0<this.offset)this.offset--;else if(b&&this.offset<b.getLength()-1)this.offset++;else{for(b=null;!b&&!(b=this._.walker[a?"previous":"next"].call(this._.walker),this._.matchWord&&!b||this._.walker._.end););this.offset=(this.textNode=b)? +a?b.getLength()-1:0:0}return u.call(this)}};var q=function(a,b){this._={walker:a,cursors:[],rangeLength:b,highlightRange:null,isMatched:0}};q.prototype={toDomRange:function(){var a=c.createRange(),b=this._.cursors;if(1>b.length){var d=this._.walker.textNode;if(d)a.setStartAfter(d);else return null}else d=b[0],b=b[b.length-1],a.setStart(d.textNode,d.offset),a.setEnd(b.textNode,b.offset+1);return a},updateFromDomRange:function(a){var b=new l(a);this._.cursors=[];do a=b.next(),a.character&&this._.cursors.push(a); +while(a.character);this._.rangeLength=this._.cursors.length},setMatched:function(){this._.isMatched=!0},clearMatched:function(){this._.isMatched=!1},isMatched:function(){return this._.isMatched},highlight:function(){if(!(1>this._.cursors.length)){this._.highlightRange&&this.removeHighlight();var a=this.toDomRange(),b=a.createBookmark();t.applyToRange(a,c);a.moveToBookmark(b);this._.highlightRange=a;b=a.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent());b.scrollIntoView();this.updateFromDomRange(a)}}, +removeHighlight:function(){if(this._.highlightRange){var a=this._.highlightRange.createBookmark();t.removeFromRange(this._.highlightRange,c);this._.highlightRange.moveToBookmark(a);this.updateFromDomRange(this._.highlightRange);this._.highlightRange=null}},isReadOnly:function(){return!this._.highlightRange?0:this._.highlightRange.startContainer.isReadOnly()},moveBack:function(){var a=this._.walker.back(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.unshift(a);b.length>this._.rangeLength&& +b.pop();return a},moveNext:function(){var a=this._.walker.next(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.push(a);b.length>this._.rangeLength&&b.shift();return a},getEndCharacter:function(){var a=this._.cursors;return 1>a.length?null:a[a.length-1].character},getNextCharacterRange:function(a){var b,d;d=this._.cursors;d=(b=d[d.length-1])&&b.textNode?new l(n(b)):this._.walker;return new q(d,a)},getCursors:function(){return this._.cursors}};var v=function(a,b){var d=[-1];b&&(a=a.toLowerCase()); +for(var c=0;c<a.length;c++)for(d.push(d[c]+1);0<d[c+1]&&a.charAt(c)!=a.charAt(d[c+1]-1);)d[c+1]=d[d[c+1]-1]+1;this._={overlap:d,state:0,ignoreCase:!!b,pattern:a}};v.prototype={feedCharacter:function(a){for(this._.ignoreCase&&(a=a.toLowerCase());;){if(a==this._.pattern.charAt(this._.state))return this._.state++,this._.state==this._.pattern.length?(this._.state=0,2):1;if(this._.state)this._.state=this._.overlap[this._.state];else return 0}return null},reset:function(){this._.state=0}};var z=/[.,"'?!;: \u0085\u00a0\u1680\u280e\u2028\u2029\u202f\u205f\u3000]/, +w=function(a){if(!a)return!0;var b=a.charCodeAt(0);return 9<=b&&13>=b||8192<=b&&8202>=b||z.test(a)},e={searchRange:null,matchRange:null,find:function(a,b,d,f,e,A){this.matchRange?(this.matchRange.removeHighlight(),this.matchRange=this.matchRange.getNextCharacterRange(a.length)):this.matchRange=new q(new l(this.searchRange),a.length);for(var i=new v(a,!b),j=0,k="%";null!==k;){for(this.matchRange.moveNext();k=this.matchRange.getEndCharacter();){j=i.feedCharacter(k);if(2==j)break;this.matchRange.moveNext().hitMatchBoundary&& +i.reset()}if(2==j){if(d){var h=this.matchRange.getCursors(),m=h[h.length-1],h=h[0],g=c.createRange();g.setStartAt(c.editable(),CKEDITOR.POSITION_AFTER_START);g.setEnd(h.textNode,h.offset);h=g;m=n(m);h.trim();m.trim();h=new l(h,!0);m=new l(m,!0);if(!w(h.back().character)||!w(m.next().character))continue}this.matchRange.setMatched();!1!==e&&this.matchRange.highlight();return!0}}this.matchRange.clearMatched();this.matchRange.removeHighlight();return f&&!A?(this.searchRange=p(1),this.matchRange=null, +arguments.callee.apply(this,Array.prototype.slice.call(arguments).concat([!0]))):!1},replaceCounter:0,replace:function(a,b,d,f,e,g,i){o=1;a=0;if(this.matchRange&&this.matchRange.isMatched()&&!this.matchRange._.isReplaced&&!this.matchRange.isReadOnly()){this.matchRange.removeHighlight();b=this.matchRange.toDomRange();d=c.document.createText(d);if(!i){var j=c.getSelection();j.selectRanges([b]);c.fire("saveSnapshot")}b.deleteContents();b.insertNode(d);i||(j.selectRanges([b]),c.fire("saveSnapshot")); +this.matchRange.updateFromDomRange(b);i||this.matchRange.highlight();this.matchRange._.isReplaced=!0;this.replaceCounter++;a=1}else a=this.find(b,f,e,g,!i);o=0;return a}},f=c.lang.find;return{title:f.title,resizable:CKEDITOR.DIALOG_RESIZE_NONE,minWidth:350,minHeight:170,buttons:[CKEDITOR.dialog.cancelButton(c,{label:c.lang.common.close})],contents:[{id:"find",label:f.find,title:f.find,accessKey:"",elements:[{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtFindFind",label:f.findWhat, +isChanged:!1,labelLayout:"horizontal",accessKey:"F"},{type:"button",id:"btnFind",align:"left",style:"width:100%",label:f.find,onClick:function(){var a=this.getDialog();e.find(a.getValueOf("find","txtFindFind"),a.getValueOf("find","txtFindCaseChk"),a.getValueOf("find","txtFindWordChk"),a.getValueOf("find","txtFindCyclic"))||alert(f.notFoundMsg)}}]},{type:"fieldset",label:CKEDITOR.tools.htmlEncode(f.findOptions),style:"margin-top:29px",children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"txtFindCaseChk", +isChanged:!1,label:f.matchCase},{type:"checkbox",id:"txtFindWordChk",isChanged:!1,label:f.matchWord},{type:"checkbox",id:"txtFindCyclic",isChanged:!1,"default":!0,label:f.matchCyclic}]}]}]},{id:"replace",label:f.replace,accessKey:"M",elements:[{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtFindReplace",label:f.findWhat,isChanged:!1,labelLayout:"horizontal",accessKey:"F"},{type:"button",id:"btnFindReplace",align:"left",style:"width:100%",label:f.replace,onClick:function(){var a= +this.getDialog();e.replace(a,a.getValueOf("replace","txtFindReplace"),a.getValueOf("replace","txtReplace"),a.getValueOf("replace","txtReplaceCaseChk"),a.getValueOf("replace","txtReplaceWordChk"),a.getValueOf("replace","txtReplaceCyclic"))||alert(f.notFoundMsg)}}]},{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtReplace",label:f.replaceWith,isChanged:!1,labelLayout:"horizontal",accessKey:"R"},{type:"button",id:"btnReplaceAll",align:"left",style:"width:100%",label:f.replaceAll,isChanged:!1, +onClick:function(){var a=this.getDialog();e.replaceCounter=0;e.searchRange=p(1);e.matchRange&&(e.matchRange.removeHighlight(),e.matchRange=null);for(c.fire("saveSnapshot");e.replace(a,a.getValueOf("replace","txtFindReplace"),a.getValueOf("replace","txtReplace"),a.getValueOf("replace","txtReplaceCaseChk"),a.getValueOf("replace","txtReplaceWordChk"),!1,!0););e.replaceCounter?(alert(f.replaceSuccessMsg.replace(/%1/,e.replaceCounter)),c.fire("saveSnapshot")):alert(f.notFoundMsg)}}]},{type:"fieldset", +label:CKEDITOR.tools.htmlEncode(f.findOptions),children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"txtReplaceCaseChk",isChanged:!1,label:f.matchCase},{type:"checkbox",id:"txtReplaceWordChk",isChanged:!1,label:f.matchWord},{type:"checkbox",id:"txtReplaceCyclic",isChanged:!1,"default":!0,label:f.matchCyclic}]}]}]}],onLoad:function(){var a=this,b,c=0;this.on("hide",function(){c=0});this.on("show",function(){c=1});this.selectPage=CKEDITOR.tools.override(this.selectPage,function(f){return function(e){f.call(a, +e);var g=a._.tabs[e],i;i="find"===e?"txtFindWordChk":"txtReplaceWordChk";b=a.getContentElement(e,"find"===e?"txtFindFind":"txtFindReplace");a.getContentElement(e,i);g.initialized||(CKEDITOR.document.getById(b._.inputId),g.initialized=!0);if(c){var j,e="find"===e?1:0,g=1-e,k,h=r.length;for(k=0;k<h;k++)i=this.getContentElement(x[e],r[k][e]),j=this.getContentElement(x[g],r[k][g]),j.setValue(i.getValue())}}})},onShow:function(){e.searchRange=p();var a=this.getParentEditor().getSelection().getSelectedText(), +b=this.getContentElement(g,"find"==g?"txtFindFind":"txtFindReplace");b.setValue(a);b.select();this.selectPage(g);this[("find"==g&&this._.editor.readOnly?"hide":"show")+"Page"]("replace")},onHide:function(){var a;e.matchRange&&e.matchRange.isMatched()&&(e.matchRange.removeHighlight(),c.focus(),(a=e.matchRange.toDomRange())&&c.getSelection().selectRanges([a]));delete e.matchRange},onFocus:function(){return"replace"==g?this.getContentElement("replace","txtFindReplace"):this.getContentElement("find", +"txtFindFind")}}}var o,u=function(){return{textNode:this.textNode,offset:this.offset,character:this.textNode?this.textNode.getText().charAt(this.offset):null,hitMatchBoundary:this._.matchBoundary}},x=["find","replace"],r=[["txtFindFind","txtFindReplace"],["txtFindCaseChk","txtReplaceCaseChk"],["txtFindWordChk","txtReplaceWordChk"],["txtFindCyclic","txtReplaceCyclic"]];CKEDITOR.dialog.add("find",function(c){return n(c,"find")});CKEDITOR.dialog.add("replace",function(c){return n(c,"replace")})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/icons/find-rtl.png b/bower_components/ckeditor/plugins/find/icons/find-rtl.png new file mode 100644 index 0000000..02f40cb Binary files /dev/null and b/bower_components/ckeditor/plugins/find/icons/find-rtl.png differ diff --git a/bower_components/ckeditor/plugins/find/icons/find.png b/bower_components/ckeditor/plugins/find/icons/find.png new file mode 100644 index 0000000..02f40cb Binary files /dev/null and b/bower_components/ckeditor/plugins/find/icons/find.png differ diff --git a/bower_components/ckeditor/plugins/find/icons/hidpi/find-rtl.png b/bower_components/ckeditor/plugins/find/icons/hidpi/find-rtl.png new file mode 100644 index 0000000..cbf9ced Binary files /dev/null and b/bower_components/ckeditor/plugins/find/icons/hidpi/find-rtl.png differ diff --git a/bower_components/ckeditor/plugins/find/icons/hidpi/find.png b/bower_components/ckeditor/plugins/find/icons/hidpi/find.png new file mode 100644 index 0000000..cbf9ced Binary files /dev/null and b/bower_components/ckeditor/plugins/find/icons/hidpi/find.png differ diff --git a/bower_components/ckeditor/plugins/find/icons/hidpi/replace.png b/bower_components/ckeditor/plugins/find/icons/hidpi/replace.png new file mode 100644 index 0000000..9efd8bb Binary files /dev/null and b/bower_components/ckeditor/plugins/find/icons/hidpi/replace.png differ diff --git a/bower_components/ckeditor/plugins/find/icons/replace.png b/bower_components/ckeditor/plugins/find/icons/replace.png new file mode 100644 index 0000000..e68afcb Binary files /dev/null and b/bower_components/ckeditor/plugins/find/icons/replace.png differ diff --git a/bower_components/ckeditor/plugins/find/lang/af.js b/bower_components/ckeditor/plugins/find/lang/af.js new file mode 100644 index 0000000..79e13e8 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","af",{find:"Soek",findOptions:"Find Options",findWhat:"Soek na:",matchCase:"Hoof/kleinletter sensitief",matchCyclic:"Soek deurlopend",matchWord:"Hele woord moet voorkom",notFoundMsg:"Teks nie gevind nie.",replace:"Vervang",replaceAll:"Vervang alles",replaceSuccessMsg:"%1 voorkoms(te) vervang.",replaceWith:"Vervang met:",title:"Soek en vervang"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/ar.js b/bower_components/ckeditor/plugins/find/lang/ar.js new file mode 100644 index 0000000..e995c89 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","ar",{find:"بحث",findOptions:"Find Options",findWhat:"البحث بـ:",matchCase:"مطابقة حالة الأحرف",matchCyclic:"مطابقة دورية",matchWord:"مطابقة بالكامل",notFoundMsg:"لم يتم العثور على النص المحدد.",replace:"إستبدال",replaceAll:"إستبدال الكل",replaceSuccessMsg:"تم استبدال 1% من الحالات ",replaceWith:"إستبدال بـ:",title:"بحث واستبدال"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/bg.js b/bower_components/ckeditor/plugins/find/lang/bg.js new file mode 100644 index 0000000..844a0b2 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","bg",{find:"Търсене",findOptions:"Find Options",findWhat:"Търси за:",matchCase:"Съвпадение",matchCyclic:"Циклично съвпадение",matchWord:"Съвпадение с дума",notFoundMsg:"Указаният текст не е намерен.",replace:"Препокриване",replaceAll:"Препокрий всички",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Препокрива с:",title:"Търсене и препокриване"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/bn.js b/bower_components/ckeditor/plugins/find/lang/bn.js new file mode 100644 index 0000000..f80be45 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","bn",{find:"খোজো",findOptions:"Find Options",findWhat:"যা খুঁজতে হবে:",matchCase:"কেস মিলাও",matchCyclic:"Match cyclic",matchWord:"পুরা শব্দ মেলাও",notFoundMsg:"আপনার উল্লেখিত টেকস্ট পাওয়া যায়নি",replace:"রিপ্লেস",replaceAll:"সব বদলে দাও",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"যার সাথে বদলাতে হবে:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/bs.js b/bower_components/ckeditor/plugins/find/lang/bs.js new file mode 100644 index 0000000..4941067 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","bs",{find:"Naði",findOptions:"Find Options",findWhat:"Naði šta:",matchCase:"Uporeðuj velika/mala slova",matchCyclic:"Match cyclic",matchWord:"Uporeðuj samo cijelu rijeè",notFoundMsg:"Traženi tekst nije pronaðen.",replace:"Zamjeni",replaceAll:"Zamjeni sve",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Zamjeni sa:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/ca.js b/bower_components/ckeditor/plugins/find/lang/ca.js new file mode 100644 index 0000000..85448cf --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","ca",{find:"Cerca",findOptions:"Opcions de Cerca",findWhat:"Cerca el:",matchCase:"Distingeix majúscules/minúscules",matchCyclic:"Coincidència cíclica",matchWord:"Només paraules completes",notFoundMsg:"El text especificat no s'ha trobat.",replace:"Reemplaça",replaceAll:"Reemplaça-ho tot",replaceSuccessMsg:"%1 ocurrència/es reemplaçada/es.",replaceWith:"Reemplaça amb:",title:"Cerca i reemplaça"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/cs.js b/bower_components/ckeditor/plugins/find/lang/cs.js new file mode 100644 index 0000000..a63cd19 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","cs",{find:"Hledat",findOptions:"Možnosti hledání",findWhat:"Co hledat:",matchCase:"Rozlišovat velikost písma",matchCyclic:"Procházet opakovaně",matchWord:"Pouze celá slova",notFoundMsg:"Hledaný text nebyl nalezen.",replace:"Nahradit",replaceAll:"Nahradit vše",replaceSuccessMsg:"%1 nahrazení.",replaceWith:"Čím nahradit:",title:"Najít a nahradit"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/cy.js b/bower_components/ckeditor/plugins/find/lang/cy.js new file mode 100644 index 0000000..3e87336 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","cy",{find:"Chwilio",findOptions:"Opsiynau Chwilio",findWhat:"Chwilio'r term:",matchCase:"Cydweddu'r cas",matchCyclic:"Cydweddu'n gylchol",matchWord:"Cydweddu gair cyfan",notFoundMsg:"Nid oedd y testun wedi'i ddarganfod.",replace:"Amnewid Un",replaceAll:"Amnewid Pob",replaceSuccessMsg:"Amnewidiwyd %1 achlysur.",replaceWith:"Amnewid gyda:",title:"Chwilio ac Amnewid"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/da.js b/bower_components/ckeditor/plugins/find/lang/da.js new file mode 100644 index 0000000..35693e2 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","da",{find:"Søg",findOptions:"Find muligheder",findWhat:"Søg efter:",matchCase:"Forskel på store og små bogstaver",matchCyclic:"Match cyklisk",matchWord:"Kun hele ord",notFoundMsg:"Søgeteksten blev ikke fundet",replace:"Erstat",replaceAll:"Erstat alle",replaceSuccessMsg:"%1 forekomst(er) erstattet.",replaceWith:"Erstat med:",title:"Søg og erstat"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/de.js b/bower_components/ckeditor/plugins/find/lang/de.js new file mode 100644 index 0000000..5295d06 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","de",{find:"Suchen",findOptions:"Suchoptionen",findWhat:"Suche nach:",matchCase:"Groß-Kleinschreibung beachten",matchCyclic:"Zyklische Suche",matchWord:"Nur ganze Worte suchen",notFoundMsg:"Der gesuchte Text wurde nicht gefunden.",replace:"Ersetzen",replaceAll:"Alle ersetzen",replaceSuccessMsg:"%1 vorkommen ersetzt.",replaceWith:"Ersetze mit:",title:"Suchen und Ersetzen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/el.js b/bower_components/ckeditor/plugins/find/lang/el.js new file mode 100644 index 0000000..f559f2a --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","el",{find:"Εύρεση",findOptions:"Επιλογές Εύρεσης",findWhat:"Εύρεση για:",matchCase:"Ταίριασμα πεζών/κεφαλαίων",matchCyclic:"Αναδρομική εύρεση",matchWord:"Εύρεση μόνο πλήρων λέξεων",notFoundMsg:"Το κείμενο δεν βρέθηκε.",replace:"Αντικατάσταση",replaceAll:"Αντικατάσταση Όλων",replaceSuccessMsg:"Ο(ι) όρος(-οι) αντικαταστήθηκε(-αν) %1 φορές.",replaceWith:"Αντικατάσταση με:",title:"Εύρεση και Αντικατάσταση"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/en-au.js b/bower_components/ckeditor/plugins/find/lang/en-au.js new file mode 100644 index 0000000..ad03379 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","en-au",{find:"Find",findOptions:"Find Options",findWhat:"Find what:",matchCase:"Match case",matchCyclic:"Match cyclic",matchWord:"Match whole word",notFoundMsg:"The specified text was not found.",replace:"Replace",replaceAll:"Replace All",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Replace with:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/en-ca.js b/bower_components/ckeditor/plugins/find/lang/en-ca.js new file mode 100644 index 0000000..d217f65 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","en-ca",{find:"Find",findOptions:"Find Options",findWhat:"Find what:",matchCase:"Match case",matchCyclic:"Match cyclic",matchWord:"Match whole word",notFoundMsg:"The specified text was not found.",replace:"Replace",replaceAll:"Replace All",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Replace with:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/en-gb.js b/bower_components/ckeditor/plugins/find/lang/en-gb.js new file mode 100644 index 0000000..dfbafb7 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","en-gb",{find:"Find",findOptions:"Find Options",findWhat:"Find what:",matchCase:"Match case",matchCyclic:"Match cyclic",matchWord:"Match whole word",notFoundMsg:"The specified text was not found.",replace:"Replace",replaceAll:"Replace All",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Replace with:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/en.js b/bower_components/ckeditor/plugins/find/lang/en.js new file mode 100644 index 0000000..6865f0b --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","en",{find:"Find",findOptions:"Find Options",findWhat:"Find what:",matchCase:"Match case",matchCyclic:"Match cyclic",matchWord:"Match whole word",notFoundMsg:"The specified text was not found.",replace:"Replace",replaceAll:"Replace All",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Replace with:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/eo.js b/bower_components/ckeditor/plugins/find/lang/eo.js new file mode 100644 index 0000000..9fde69e --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","eo",{find:"Serĉi",findOptions:"Opcioj pri Serĉado",findWhat:"Serĉi:",matchCase:"Kongruigi Usklecon",matchCyclic:"Cikla Serĉado",matchWord:"Tuta Vorto",notFoundMsg:"La celteksto ne estas trovita.",replace:"Anstataŭigi",replaceAll:"Anstataŭigi Ĉion",replaceSuccessMsg:"%1 anstataŭigita(j) apero(j).",replaceWith:"Anstataŭigi per:",title:"Serĉi kaj Anstataŭigi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/es.js b/bower_components/ckeditor/plugins/find/lang/es.js new file mode 100644 index 0000000..2efd39c --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","es",{find:"Buscar",findOptions:"Opciones de búsqueda",findWhat:"Texto a buscar:",matchCase:"Coincidir may/min",matchCyclic:"Buscar en todo el contenido",matchWord:"Coincidir toda la palabra",notFoundMsg:"El texto especificado no ha sido encontrado.",replace:"Reemplazar",replaceAll:"Reemplazar Todo",replaceSuccessMsg:"La expresión buscada ha sido reemplazada %1 veces.",replaceWith:"Reemplazar con:",title:"Buscar y Reemplazar"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/et.js b/bower_components/ckeditor/plugins/find/lang/et.js new file mode 100644 index 0000000..bcc3921 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","et",{find:"Otsi",findOptions:"Otsingu valikud",findWhat:"Otsitav:",matchCase:"Suur- ja väiketähtede eristamine",matchCyclic:"Jätkatakse algusest",matchWord:"Ainult terved sõnad",notFoundMsg:"Otsitud teksti ei leitud.",replace:"Asenda",replaceAll:"Asenda kõik",replaceSuccessMsg:"%1 vastet asendati.",replaceWith:"Asendus:",title:"Otsimine ja asendamine"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/eu.js b/bower_components/ckeditor/plugins/find/lang/eu.js new file mode 100644 index 0000000..f082555 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","eu",{find:"Bilatu",findOptions:"Find Options",findWhat:"Zer bilatu:",matchCase:"Maiuskula/minuskula",matchCyclic:"Bilaketa ziklikoa",matchWord:"Esaldi osoa bilatu",notFoundMsg:"Idatzitako testua ez da topatu.",replace:"Ordezkatu",replaceAll:"Ordeztu Guztiak",replaceSuccessMsg:"Zenbat aldiz ordeztua: %1",replaceWith:"Zerekin ordeztu:",title:"Bilatu eta Ordeztu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/fa.js b/bower_components/ckeditor/plugins/find/lang/fa.js new file mode 100644 index 0000000..2339c6d --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","fa",{find:"جستجو",findOptions:"گزینه​های جستجو",findWhat:"چه چیز را مییابید:",matchCase:"همسانی در بزرگی و کوچکی نویسه​ها",matchCyclic:"همسانی با چرخه",matchWord:"همسانی با واژهٴ کامل",notFoundMsg:"متن موردنظر یافت نشد.",replace:"جایگزینی",replaceAll:"جایگزینی همهٴ یافته​ها",replaceSuccessMsg:"%1 رخداد جایگزین شد.",replaceWith:"جایگزینی با:",title:"جستجو و جایگزینی"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/fi.js b/bower_components/ckeditor/plugins/find/lang/fi.js new file mode 100644 index 0000000..79daf81 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","fi",{find:"Etsi",findOptions:"Hakuasetukset",findWhat:"Etsi mitä:",matchCase:"Sama kirjainkoko",matchCyclic:"Kierrä ympäri",matchWord:"Koko sana",notFoundMsg:"Etsittyä tekstiä ei löytynyt.",replace:"Korvaa",replaceAll:"Korvaa kaikki",replaceSuccessMsg:"%1 esiintymä(ä) korvattu.",replaceWith:"Korvaa tällä:",title:"Etsi ja korvaa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/fo.js b/bower_components/ckeditor/plugins/find/lang/fo.js new file mode 100644 index 0000000..1e3dc04 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","fo",{find:"Leita",findOptions:"Finn møguleikar",findWhat:"Finn:",matchCase:"Munur á stórum og smáum bókstavum",matchCyclic:"Match cyclic",matchWord:"Bert heil orð",notFoundMsg:"Leititeksturin varð ikki funnin",replace:"Yvirskriva",replaceAll:"Yvirskriva alt",replaceSuccessMsg:"%1 úrslit broytt.",replaceWith:"Yvirskriva við:",title:"Finn og broyt"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/fr-ca.js b/bower_components/ckeditor/plugins/find/lang/fr-ca.js new file mode 100644 index 0000000..59a8e22 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","fr-ca",{find:"Rechercher",findOptions:"Options de recherche",findWhat:"Rechercher:",matchCase:"Respecter la casse",matchCyclic:"Recherche cyclique",matchWord:"Mot entier",notFoundMsg:"Le texte indiqué est introuvable.",replace:"Remplacer",replaceAll:"Tout remplacer",replaceSuccessMsg:"%1 remplacements.",replaceWith:"Remplacer par:",title:"Rechercher et remplacer"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/fr.js b/bower_components/ckeditor/plugins/find/lang/fr.js new file mode 100644 index 0000000..a7b4218 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","fr",{find:"Trouver",findOptions:"Options de recherche",findWhat:"Expression à trouver: ",matchCase:"Respecter la casse",matchCyclic:"Boucler",matchWord:"Mot entier uniquement",notFoundMsg:"Le texte spécifié ne peut être trouvé.",replace:"Remplacer",replaceAll:"Remplacer tout",replaceSuccessMsg:"%1 occurrence(s) replacée(s).",replaceWith:"Remplacer par: ",title:"Trouver et remplacer"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/gl.js b/bower_components/ckeditor/plugins/find/lang/gl.js new file mode 100644 index 0000000..be89248 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","gl",{find:"Buscar",findOptions:"Buscar opcións",findWhat:"Texto a buscar:",matchCase:"Coincidir Mai./min.",matchCyclic:"Coincidencia cíclica",matchWord:"Coincidencia coa palabra completa",notFoundMsg:"Non se atopou o texto indicado.",replace:"Substituir",replaceAll:"Substituír todo",replaceSuccessMsg:"%1 concorrencia(s) substituída(s).",replaceWith:"Substituír con:",title:"Buscar e substituír"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/gu.js b/bower_components/ckeditor/plugins/find/lang/gu.js new file mode 100644 index 0000000..572afcf --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","gu",{find:"શોધવું",findOptions:"વીકલ્પ શોધો",findWhat:"આ શોધો",matchCase:"કેસ સરખા રાખો",matchCyclic:"સરખાવવા બધા",matchWord:"બઘા શબ્દ સરખા રાખો",notFoundMsg:"તમે શોધેલી ટેક્સ્ટ નથી મળી",replace:"રિપ્લેસ/બદલવું",replaceAll:"બઘા બદલી ",replaceSuccessMsg:"%1 ફેરફારો બાદલાયા છે.",replaceWith:"આનાથી બદલો",title:"શોધવું અને બદલવું"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/he.js b/bower_components/ckeditor/plugins/find/lang/he.js new file mode 100644 index 0000000..ea4e422 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","he",{find:"חיפוש",findOptions:"אפשרויות חיפוש",findWhat:"חיפוש מחרוזת:",matchCase:"הבחנה בין אותיות רשיות לקטנות (Case)",matchCyclic:"התאמה מחזורית",matchWord:"התאמה למילה המלאה",notFoundMsg:"הטקסט המבוקש לא נמצא.",replace:"החלפה",replaceAll:"החלפה בכל העמוד",replaceSuccessMsg:"%1 טקסטים הוחלפו.",replaceWith:"החלפה במחרוזת:",title:"חיפוש והחלפה"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/hi.js b/bower_components/ckeditor/plugins/find/lang/hi.js new file mode 100644 index 0000000..d67da0a --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","hi",{find:"खोजें",findOptions:"Find Options",findWhat:"यह खोजें:",matchCase:"केस मिलायें",matchCyclic:"Match cyclic",matchWord:"पूरा शब्द मिलायें",notFoundMsg:"आपके द्वारा दिया गया टेक्स्ट नहीं मिला",replace:"रीप्लेस",replaceAll:"सभी रिप्लेस करें",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"इससे रिप्लेस करें:",title:"खोजें और बदलें"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/hr.js b/bower_components/ckeditor/plugins/find/lang/hr.js new file mode 100644 index 0000000..bcca21e --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","hr",{find:"Pronađi",findOptions:"Opcije traženja",findWhat:"Pronađi:",matchCase:"Usporedi mala/velika slova",matchCyclic:"Usporedi kružno",matchWord:"Usporedi cijele riječi",notFoundMsg:"Traženi tekst nije pronađen.",replace:"Zamijeni",replaceAll:"Zamijeni sve",replaceSuccessMsg:"Zamijenjeno %1 pojmova.",replaceWith:"Zamijeni s:",title:"Pronađi i zamijeni"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/hu.js b/bower_components/ckeditor/plugins/find/lang/hu.js new file mode 100644 index 0000000..6ca2b80 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","hu",{find:"Keresés",findOptions:"Find Options",findWhat:"Keresett szöveg:",matchCase:"kis- és nagybetű megkülönböztetése",matchCyclic:"Ciklikus keresés",matchWord:"csak ha ez a teljes szó",notFoundMsg:"A keresett szöveg nem található.",replace:"Csere",replaceAll:"Az összes cseréje",replaceSuccessMsg:"%1 egyezőség cserélve.",replaceWith:"Csere erre:",title:"Keresés és csere"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/id.js b/bower_components/ckeditor/plugins/find/lang/id.js new file mode 100644 index 0000000..4257045 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","id",{find:"Temukan",findOptions:"Opsi menemukan",findWhat:"Temukan apa:",matchCase:"Match case",matchCyclic:"Match cyclic",matchWord:"Match whole word",notFoundMsg:"The specified text was not found.",replace:"Ganti",replaceAll:"Ganti Semua",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Ganti dengan:",title:"Temukan dan Ganti"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/is.js b/bower_components/ckeditor/plugins/find/lang/is.js new file mode 100644 index 0000000..d69cba6 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","is",{find:"Leita",findOptions:"Find Options",findWhat:"Leita að:",matchCase:"Gera greinarmun á¡ há¡- og lágstöfum",matchCyclic:"Match cyclic",matchWord:"Aðeins heil orð",notFoundMsg:"Leitartexti fannst ekki!",replace:"Skipta út",replaceAll:"Skipta út allsstaðar",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Skipta út fyrir:",title:"Finna og skipta"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/it.js b/bower_components/ckeditor/plugins/find/lang/it.js new file mode 100644 index 0000000..2aed2ad --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","it",{find:"Trova",findOptions:"Opzioni di ricerca",findWhat:"Trova:",matchCase:"Maiuscole/minuscole",matchCyclic:"Ricerca ciclica",matchWord:"Solo parole intere",notFoundMsg:"L'elemento cercato non è stato trovato.",replace:"Sostituisci",replaceAll:"Sostituisci tutto",replaceSuccessMsg:"%1 occorrenza(e) sostituite.",replaceWith:"Sostituisci con:",title:"Cerca e Sostituisci"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/ja.js b/bower_components/ckeditor/plugins/find/lang/ja.js new file mode 100644 index 0000000..f2043d1 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","ja",{find:"検索",findOptions:"検索オプション",findWhat:"検索する文字列:",matchCase:"大文字と小文字を区別する",matchCyclic:"末尾に逹したら先頭に戻る",matchWord:"単語単位で探す",notFoundMsg:"指定された文字列は見つかりませんでした。",replace:"置換",replaceAll:"すべて置換",replaceSuccessMsg:"%1 個置換しました。",replaceWith:"置換後の文字列:",title:"検索と置換"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/ka.js b/bower_components/ckeditor/plugins/find/lang/ka.js new file mode 100644 index 0000000..d5d8dda --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","ka",{find:"ძებნა",findOptions:"Find Options",findWhat:"საძიებელი ტექსტი:",matchCase:"დიდი და პატარა ასოების დამთხვევა",matchCyclic:"დოკუმენტის ბოლოში გასვლის მერე თავიდან დაწყება",matchWord:"მთელი სიტყვის დამთხვევა",notFoundMsg:"მითითებული ტექსტი არ მოიძებნა.",replace:"შეცვლა",replaceAll:"ყველას შეცვლა",replaceSuccessMsg:"%1 მოძებნილი შეიცვალა.",replaceWith:"შეცვლის ტექსტი:",title:"ძებნა და შეცვლა"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/km.js b/bower_components/ckeditor/plugins/find/lang/km.js new file mode 100644 index 0000000..3815f2c --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","km",{find:"ស្វែងរក",findOptions:"ជម្រើស​ស្វែង​រក",findWhat:"ស្វែងរកអ្វី:",matchCase:"ករណី​ដំណូច",matchCyclic:"ត្រូវ​នឹង cyclic",matchWord:"ដូច​នឹង​ពាក្យ​ទាំង​មូល",notFoundMsg:"រក​មិន​ឃើញ​ពាក្យ​ដែល​បាន​បញ្ជាក់។",replace:"ជំនួស",replaceAll:"ជំនួសទាំងអស់",replaceSuccessMsg:"ការ​ជំនួស​ចំនួន %1 បាន​កើត​ឡើង។",replaceWith:"ជំនួសជាមួយ:",title:"រក​និង​ជំនួស"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/ko.js b/bower_components/ckeditor/plugins/find/lang/ko.js new file mode 100644 index 0000000..e17dce4 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","ko",{find:"찾기",findOptions:"Find Options",findWhat:"찾을 문자열:",matchCase:"대소문자 구분",matchCyclic:"Match cyclic",matchWord:"온전한 단어",notFoundMsg:"문자열을 찾을 수 없습니다.",replace:"바꾸기",replaceAll:"모두 바꾸기",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"바꿀 문자열:",title:"찾기 & 바꾸기"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/ku.js b/bower_components/ckeditor/plugins/find/lang/ku.js new file mode 100644 index 0000000..54cc3c9 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","ku",{find:"گەڕان",findOptions:"هەڵبژاردەکانی گەڕان",findWhat:"گەڕان بەدووای:",matchCase:"جیاکردنەوه لەنێوان پیتی گەورەو بچووك",matchCyclic:"گەڕان لەهەموو پەڕەکه",matchWord:"تەنەا هەموو وشەکه",notFoundMsg:"هیچ دەقه گەڕانێك نەدۆزراوه.",replace:"لەبریدانان",replaceAll:"لەبریدانانی هەمووی",replaceSuccessMsg:" پێشهاتە(ی) لەبری دانرا. %1",replaceWith:"لەبریدانان به:",title:"گەڕان و لەبریدانان"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/lt.js b/bower_components/ckeditor/plugins/find/lang/lt.js new file mode 100644 index 0000000..2c55039 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","lt",{find:"Rasti",findOptions:"Paieškos nustatymai",findWhat:"Surasti tekstą:",matchCase:"Skirti didžiąsias ir mažąsias raides",matchCyclic:"Sutampantis cikliškumas",matchWord:"Atitikti pilną žodį",notFoundMsg:"Nurodytas tekstas nerastas.",replace:"Pakeisti",replaceAll:"Pakeisti viską",replaceSuccessMsg:"%1 sutapimas(ų) buvo pakeisti.",replaceWith:"Pakeisti tekstu:",title:"Surasti ir pakeisti"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/lv.js b/bower_components/ckeditor/plugins/find/lang/lv.js new file mode 100644 index 0000000..12a554c --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","lv",{find:"Meklēt",findOptions:"Meklēt uzstādījumi",findWhat:"Meklēt:",matchCase:"Reģistrjūtīgs",matchCyclic:"Sakrist cikliski",matchWord:"Jāsakrīt pilnībā",notFoundMsg:"Norādītā frāze netika atrasta.",replace:"Nomainīt",replaceAll:"Aizvietot visu",replaceSuccessMsg:"%1 gadījums(i) aizvietoti",replaceWith:"Nomainīt uz:",title:"Meklēt un aizvietot"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/mk.js b/bower_components/ckeditor/plugins/find/lang/mk.js new file mode 100644 index 0000000..8c41cfc --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","mk",{find:"Find",findOptions:"Find Options",findWhat:"Find what:",matchCase:"Match case",matchCyclic:"Match cyclic",matchWord:"Match whole word",notFoundMsg:"The specified text was not found.",replace:"Replace",replaceAll:"Replace All",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Replace with:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/mn.js b/bower_components/ckeditor/plugins/find/lang/mn.js new file mode 100644 index 0000000..2849816 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","mn",{find:"Хайх",findOptions:"Хайх сонголтууд",findWhat:"Хайх үг/үсэг:",matchCase:"Тэнцэх төлөв",matchCyclic:"Match cyclic",matchWord:"Тэнцэх бүтэн үг",notFoundMsg:"Хайсан бичвэрийг олсонгүй.",replace:"Орлуулах",replaceAll:"Бүгдийг нь солих",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Солих үг:",title:"Хайж орлуулах"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/ms.js b/bower_components/ckeditor/plugins/find/lang/ms.js new file mode 100644 index 0000000..75f9603 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","ms",{find:"Cari",findOptions:"Find Options",findWhat:"Perkataan yang dicari:",matchCase:"Padanan case huruf",matchCyclic:"Match cyclic",matchWord:"Padana Keseluruhan perkataan",notFoundMsg:"Text yang dicari tidak dijumpai.",replace:"Ganti",replaceAll:"Ganti semua",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Diganti dengan:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/nb.js b/bower_components/ckeditor/plugins/find/lang/nb.js new file mode 100644 index 0000000..6779f49 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","nb",{find:"Søk",findOptions:"Søkealternativer",findWhat:"Søk etter:",matchCase:"Skill mellom store og små bokstaver",matchCyclic:"Søk i hele dokumentet",matchWord:"Bare hele ord",notFoundMsg:"Fant ikke søketeksten.",replace:"Erstatt",replaceAll:"Erstatt alle",replaceSuccessMsg:"%1 tilfelle(r) erstattet.",replaceWith:"Erstatt med:",title:"Søk og erstatt"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/nl.js b/bower_components/ckeditor/plugins/find/lang/nl.js new file mode 100644 index 0000000..156a9da --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","nl",{find:"Zoeken",findOptions:"Zoekopties",findWhat:"Zoeken naar:",matchCase:"Hoofdlettergevoelig",matchCyclic:"Doorlopend zoeken",matchWord:"Hele woord moet voorkomen",notFoundMsg:"De opgegeven tekst is niet gevonden.",replace:"Vervangen",replaceAll:"Alles vervangen",replaceSuccessMsg:"%1 resultaten vervangen.",replaceWith:"Vervangen met:",title:"Zoeken en vervangen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/no.js b/bower_components/ckeditor/plugins/find/lang/no.js new file mode 100644 index 0000000..e098a7c --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","no",{find:"Søk",findOptions:"Søkealternativer",findWhat:"Søk etter:",matchCase:"Skill mellom store og små bokstaver",matchCyclic:"Søk i hele dokumentet",matchWord:"Bare hele ord",notFoundMsg:"Fant ikke søketeksten.",replace:"Erstatt",replaceAll:"Erstatt alle",replaceSuccessMsg:"%1 tilfelle(r) erstattet.",replaceWith:"Erstatt med:",title:"Søk og erstatt"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/pl.js b/bower_components/ckeditor/plugins/find/lang/pl.js new file mode 100644 index 0000000..1144fd8 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","pl",{find:"Znajdź",findOptions:"Opcje wyszukiwania",findWhat:"Znajdź:",matchCase:"Uwzględnij wielkość liter",matchCyclic:"Cykliczne dopasowanie",matchWord:"Całe słowa",notFoundMsg:"Nie znaleziono szukanego hasła.",replace:"Zamień",replaceAll:"Zamień wszystko",replaceSuccessMsg:"%1 wystąpień zastąpionych.",replaceWith:"Zastąp przez:",title:"Znajdź i zamień"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/pt-br.js b/bower_components/ckeditor/plugins/find/lang/pt-br.js new file mode 100644 index 0000000..b9e438c --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","pt-br",{find:"Localizar",findOptions:"Opções",findWhat:"Procurar por:",matchCase:"Coincidir Maiúsculas/Minúsculas",matchCyclic:"Coincidir cíclico",matchWord:"Coincidir a palavra inteira",notFoundMsg:"O texto especificado não foi encontrado.",replace:"Substituir",replaceAll:"Substituir Tudo",replaceSuccessMsg:"%1 ocorrência(s) substituída(s).",replaceWith:"Substituir por:",title:"Localizar e Substituir"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/pt.js b/bower_components/ckeditor/plugins/find/lang/pt.js new file mode 100644 index 0000000..b1f40f0 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","pt",{find:"Procurar",findOptions:"Find Options",findWhat:"Texto a procurar:",matchCase:"Maiúsculas/Minúsculas",matchCyclic:"Match cyclic",matchWord:"Coincidir com toda a palavra",notFoundMsg:"O texto especificado não foi encontrado.",replace:"Substituir",replaceAll:"Substituir Tudo",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Substituir por:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/ro.js b/bower_components/ckeditor/plugins/find/lang/ro.js new file mode 100644 index 0000000..7ec8b9d --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","ro",{find:"Găseşte",findOptions:"Find Options",findWhat:"Găseşte:",matchCase:"Deosebeşte majuscule de minuscule (Match case)",matchCyclic:"Potrivește ciclic",matchWord:"Doar cuvintele întregi",notFoundMsg:"Textul specificat nu a fost găsit.",replace:"Înlocuieşte",replaceAll:"Înlocuieşte tot",replaceSuccessMsg:"%1 căutări înlocuite.",replaceWith:"Înlocuieşte cu:",title:"Găseşte şi înlocuieşte"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/ru.js b/bower_components/ckeditor/plugins/find/lang/ru.js new file mode 100644 index 0000000..b611c27 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","ru",{find:"Найти",findOptions:"Опции поиска",findWhat:"Найти:",matchCase:"Учитывать регистр",matchCyclic:"По всему тексту",matchWord:"Только слово целиком",notFoundMsg:"Искомый текст не найден.",replace:"Заменить",replaceAll:"Заменить всё",replaceSuccessMsg:"Успешно заменено %1 раз(а).",replaceWith:"Заменить на:",title:"Поиск и замена"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/si.js b/bower_components/ckeditor/plugins/find/lang/si.js new file mode 100644 index 0000000..1e1d145 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","si",{find:"Find",findOptions:"Find Options",findWhat:"Find what:",matchCase:"Match case",matchCyclic:"Match cyclic",matchWord:"Match whole word",notFoundMsg:"The specified text was not found.",replace:"හිලව් කිරීම",replaceAll:"සියල්ලම හිලව් කරන්න",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Replace with:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/sk.js b/bower_components/ckeditor/plugins/find/lang/sk.js new file mode 100644 index 0000000..11821e7 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","sk",{find:"Hľadať",findOptions:"Nájsť možnosti",findWhat:"Čo hľadať:",matchCase:"Rozlišovať malé a veľké písmená",matchCyclic:"Cykliť zhodu",matchWord:"Len celé slová",notFoundMsg:"Hľadaný text nebol nájdený.",replace:"Nahradiť",replaceAll:"Nahradiť všetko",replaceSuccessMsg:"%1 výskyt(ov) nahradených.",replaceWith:"Čím nahradiť:",title:"Nájsť a nahradiť"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/sl.js b/bower_components/ckeditor/plugins/find/lang/sl.js new file mode 100644 index 0000000..32dea7e --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","sl",{find:"Najdi",findOptions:"Find Options",findWhat:"Najdi:",matchCase:"Razlikuj velike in male črke",matchCyclic:"Primerjaj znake v cirilici",matchWord:"Samo cele besede",notFoundMsg:"Navedeno besedilo ni bilo najdeno.",replace:"Zamenjaj",replaceAll:"Zamenjaj vse",replaceSuccessMsg:"%1 pojavitev je bilo zamenjano.",replaceWith:"Zamenjaj z:",title:"Najdi in zamenjaj"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/sq.js b/bower_components/ckeditor/plugins/find/lang/sq.js new file mode 100644 index 0000000..ae034f6 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","sq",{find:"Gjej",findOptions:"Gjejë Alternativat",findWhat:"Gjej çka:",matchCase:"Rasti i përputhjes",matchCyclic:"Përputh ciklikun",matchWord:"Përputh fjalën e tërë",notFoundMsg:"Teksti i caktuar nuk mundej të gjendet.",replace:"Zëvendëso",replaceAll:"Zëvendëso të gjitha",replaceSuccessMsg:"%1 rast(e) u zëvendësua(n).",replaceWith:"Zëvendëso me:",title:"Gjej dhe Zëvendëso"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/sr-latn.js b/bower_components/ckeditor/plugins/find/lang/sr-latn.js new file mode 100644 index 0000000..40a4006 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","sr-latn",{find:"Pretraga",findOptions:"Find Options",findWhat:"Pronadi:",matchCase:"Razlikuj mala i velika slova",matchCyclic:"Match cyclic",matchWord:"Uporedi cele reci",notFoundMsg:"Traženi tekst nije pronađen.",replace:"Zamena",replaceAll:"Zameni sve",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Zameni sa:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/sr.js b/bower_components/ckeditor/plugins/find/lang/sr.js new file mode 100644 index 0000000..57ca629 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","sr",{find:"Претрага",findOptions:"Find Options",findWhat:"Пронађи:",matchCase:"Разликуј велика и мала слова",matchCyclic:"Match cyclic",matchWord:"Упореди целе речи",notFoundMsg:"Тражени текст није пронађен.",replace:"Замена",replaceAll:"Замени све",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"Замени са:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/sv.js b/bower_components/ckeditor/plugins/find/lang/sv.js new file mode 100644 index 0000000..f86c7d2 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","sv",{find:"Sök",findOptions:"Sökalternativ",findWhat:"Sök efter:",matchCase:"Skiftläge",matchCyclic:"Matcha cykliska",matchWord:"Inkludera hela ord",notFoundMsg:"Angiven text kunde ej hittas.",replace:"Ersätt",replaceAll:"Ersätt alla",replaceSuccessMsg:"%1 förekomst(er) ersatta.",replaceWith:"Ersätt med:",title:"Sök och ersätt"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/th.js b/bower_components/ckeditor/plugins/find/lang/th.js new file mode 100644 index 0000000..877ab90 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","th",{find:"ค้นหา",findOptions:"Find Options",findWhat:"ค้นหาคำว่า:",matchCase:"ตัวโหญ่-เล็ก ต้องตรงกัน",matchCyclic:"Match cyclic",matchWord:"ต้องตรงกันทุกคำ",notFoundMsg:"ไม่พบคำที่ค้นหา.",replace:"ค้นหาและแทนที่",replaceAll:"แทนที่ทั้งหมดที่พบ",replaceSuccessMsg:"%1 occurrence(s) replaced.",replaceWith:"แทนที่ด้วย:",title:"Find and Replace"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/tr.js b/bower_components/ckeditor/plugins/find/lang/tr.js new file mode 100644 index 0000000..a0fc4f0 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","tr",{find:"Bul",findOptions:"Seçenekleri Bul",findWhat:"Aranan:",matchCase:"Büyük/küçük harf duyarlı",matchCyclic:"Eşleşen döngü",matchWord:"Kelimenin tamamı uysun",notFoundMsg:"Belirtilen yazı bulunamadı.",replace:"Değiştir",replaceAll:"Tümünü Değiştir",replaceSuccessMsg:"%1 bulunanlardan değiştirildi.",replaceWith:"Bununla değiştir:",title:"Bul ve Değiştir"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/tt.js b/bower_components/ckeditor/plugins/find/lang/tt.js new file mode 100644 index 0000000..90a6691 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","tt",{find:"Эзләү",findOptions:"Эзләү көйләүләре",findWhat:"Нәрсә эзләргә:",matchCase:"Баш һәм юл хәрефләрен исәпкә алу",matchCyclic:"Кабатлап эзләргә",matchWord:"Сүзләрне тулысынча гына эзләү",notFoundMsg:"Эзләнгән текст табылмады.",replace:"Алмаштыру",replaceAll:"Барысын да алмаштыру",replaceSuccessMsg:"%1 урында(ларда) алмаштырылган.",replaceWith:"Нәрсәгә алмаштыру:",title:"Эзләп табу һәм алмаштыру"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/ug.js b/bower_components/ckeditor/plugins/find/lang/ug.js new file mode 100644 index 0000000..9a3e754 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","ug",{find:"ئىزدە",findOptions:"ئىزدەش تاللانمىسى",findWhat:"ئىزدە:",matchCase:"چوڭ كىچىك ھەرپنى پەرقلەندۈر",matchCyclic:"ئايلانما ماسلىشىش",matchWord:"پۈتۈن سۆز ماسلىشىش",notFoundMsg:"بەلگىلەنگەن تېكىستنى تاپالمىدى",replace:"ئالماشتۇر",replaceAll:"ھەممىنى ئالماشتۇر",replaceSuccessMsg:"جەمئى %1 جايدىكى ئالماشتۇرۇش تاماملاندى",replaceWith:"ئالماشتۇر:",title:"ئىزدەپ ئالماشتۇر"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/uk.js b/bower_components/ckeditor/plugins/find/lang/uk.js new file mode 100644 index 0000000..12bf2eb --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","uk",{find:"Пошук",findOptions:"Параметри Пошуку",findWhat:"Шукати:",matchCase:"Враховувати регістр",matchCyclic:"Циклічна заміна",matchWord:"Збіг цілих слів",notFoundMsg:"Вказаний текст не знайдено.",replace:"Заміна",replaceAll:"Замінити все",replaceSuccessMsg:"%1 співпадінь(ня) замінено.",replaceWith:"Замінити на:",title:"Знайти і замінити"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/vi.js b/bower_components/ckeditor/plugins/find/lang/vi.js new file mode 100644 index 0000000..07936d9 --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","vi",{find:"Tìm kiếm",findOptions:"Tìm tùy chọn",findWhat:"Tìm chuỗi:",matchCase:"Phân biệt chữ hoa/thường",matchCyclic:"Giống một phần",matchWord:"Giống toàn bộ từ",notFoundMsg:"Không tìm thấy chuỗi cần tìm.",replace:"Thay thế",replaceAll:"Thay thế tất cả",replaceSuccessMsg:"%1 vị trí đã được thay thế.",replaceWith:"Thay bằng:",title:"Tìm kiếm và thay thế"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/zh-cn.js b/bower_components/ckeditor/plugins/find/lang/zh-cn.js new file mode 100644 index 0000000..746626a --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","zh-cn",{find:"查找",findOptions:"查找选项",findWhat:"查找:",matchCase:"区分大小写",matchCyclic:"循环匹配",matchWord:"全字匹配",notFoundMsg:"指定的文本没有找到。",replace:"替换",replaceAll:"全部替换",replaceSuccessMsg:"共完成 %1 处替换。",replaceWith:"替换:",title:"查找和替换"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/lang/zh.js b/bower_components/ckeditor/plugins/find/lang/zh.js new file mode 100644 index 0000000..4d6656a --- /dev/null +++ b/bower_components/ckeditor/plugins/find/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("find","zh",{find:"尋找",findOptions:"尋找選項",findWhat:"尋找目標:",matchCase:"大小寫須相符",matchCyclic:"循環搜尋",matchWord:"全字拼寫須相符",notFoundMsg:"找不到指定的文字。",replace:"取代",replaceAll:"全部取代",replaceSuccessMsg:"已取代 %1 個指定項目。",replaceWith:"取代成:",title:"尋找及取代"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/find/plugin.js b/bower_components/ckeditor/plugins/find/plugin.js new file mode 100644 index 0000000..0f1e4ac --- /dev/null +++ b/bower_components/ckeditor/plugins/find/plugin.js @@ -0,0 +1,6 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.add("find",{requires:"dialog",lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"find,find-rtl,replace",hidpi:!0,init:function(a){var b=a.addCommand("find",new CKEDITOR.dialogCommand("find"));b.canUndo=!1;b.readOnly=1;a.addCommand("replace",new CKEDITOR.dialogCommand("replace")).canUndo=!1;a.ui.addButton&& +(a.ui.addButton("Find",{label:a.lang.find.find,command:"find",toolbar:"find,10"}),a.ui.addButton("Replace",{label:a.lang.find.replace,command:"replace",toolbar:"find,20"}));CKEDITOR.dialog.add("find",this.path+"dialogs/find.js");CKEDITOR.dialog.add("replace",this.path+"dialogs/find.js")}});CKEDITOR.config.find_highlight={element:"span",styles:{"background-color":"#004",color:"#fff"}}; \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/dialogs/flash.js b/bower_components/ckeditor/plugins/flash/dialogs/flash.js new file mode 100644 index 0000000..7fe808c --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/dialogs/flash.js @@ -0,0 +1,24 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function b(a,b,c){var k=n[this.id];if(k)for(var f=this instanceof CKEDITOR.ui.dialog.checkbox,e=0;e<k.length;e++){var d=k[e];switch(d.type){case g:if(!a)continue;if(null!==a.getAttribute(d.name)){a=a.getAttribute(d.name);f?this.setValue("true"==a.toLowerCase()):this.setValue(a);return}f&&this.setValue(!!d["default"]);break;case o:if(!a)continue;if(d.name in c){a=c[d.name];f?this.setValue("true"==a.toLowerCase()):this.setValue(a);return}f&&this.setValue(!!d["default"]);break;case i:if(!b)continue; +if(b.getAttribute(d.name)){a=b.getAttribute(d.name);f?this.setValue("true"==a.toLowerCase()):this.setValue(a);return}f&&this.setValue(!!d["default"])}}}function c(a,b,c){var k=n[this.id];if(k)for(var f=""===this.getValue(),e=this instanceof CKEDITOR.ui.dialog.checkbox,d=0;d<k.length;d++){var h=k[d];switch(h.type){case g:if(!a||"data"==h.name&&b&&!a.hasAttribute("data"))continue;var l=this.getValue();f||e&&l===h["default"]?a.removeAttribute(h.name):a.setAttribute(h.name,l);break;case o:if(!a)continue; +l=this.getValue();if(f||e&&l===h["default"])h.name in c&&c[h.name].remove();else if(h.name in c)c[h.name].setAttribute("value",l);else{var p=CKEDITOR.dom.element.createFromHtml("<cke:param></cke:param>",a.getDocument());p.setAttributes({name:h.name,value:l});1>a.getChildCount()?p.appendTo(a):p.insertBefore(a.getFirst())}break;case i:if(!b)continue;l=this.getValue();f||e&&l===h["default"]?b.removeAttribute(h.name):b.setAttribute(h.name,l)}}}for(var g=1,o=2,i=4,n={id:[{type:g,name:"id"}],classid:[{type:g, +name:"classid"}],codebase:[{type:g,name:"codebase"}],pluginspage:[{type:i,name:"pluginspage"}],src:[{type:o,name:"movie"},{type:i,name:"src"},{type:g,name:"data"}],name:[{type:i,name:"name"}],align:[{type:g,name:"align"}],"class":[{type:g,name:"class"},{type:i,name:"class"}],width:[{type:g,name:"width"},{type:i,name:"width"}],height:[{type:g,name:"height"},{type:i,name:"height"}],hSpace:[{type:g,name:"hSpace"},{type:i,name:"hSpace"}],vSpace:[{type:g,name:"vSpace"},{type:i,name:"vSpace"}],style:[{type:g, +name:"style"},{type:i,name:"style"}],type:[{type:i,name:"type"}]},m="play loop menu quality scale salign wmode bgcolor base flashvars allowScriptAccess allowFullScreen".split(" "),j=0;j<m.length;j++)n[m[j]]=[{type:i,name:m[j]},{type:o,name:m[j]}];m=["play","loop","menu"];for(j=0;j<m.length;j++)n[m[j]][0]["default"]=n[m[j]][1]["default"]=!0;CKEDITOR.dialog.add("flash",function(a){var g=!a.config.flashEmbedTagOnly,i=a.config.flashAddEmbedTag||a.config.flashEmbedTagOnly,k,f="<div>"+CKEDITOR.tools.htmlEncode(a.lang.common.preview)+ +'<br><div id="cke_FlashPreviewLoader'+CKEDITOR.tools.getNextNumber()+'" style="display:none"><div class="loading"> </div></div><div id="cke_FlashPreviewBox'+CKEDITOR.tools.getNextNumber()+'" class="FlashPreviewBox"></div></div>';return{title:a.lang.flash.title,minWidth:420,minHeight:310,onShow:function(){this.fakeImage=this.objectNode=this.embedNode=null;k=new CKEDITOR.dom.element("embed",a.document);var e=this.getSelectedElement();if(e&&e.data("cke-real-element-type")&&"flash"==e.data("cke-real-element-type")){this.fakeImage= +e;var d=a.restoreRealElement(e),h=null,b=null,c={};if("cke:object"==d.getName()){h=d;d=h.getElementsByTag("embed","cke");0<d.count()&&(b=d.getItem(0));for(var d=h.getElementsByTag("param","cke"),g=0,i=d.count();g<i;g++){var f=d.getItem(g),j=f.getAttribute("name"),f=f.getAttribute("value");c[j]=f}}else"cke:embed"==d.getName()&&(b=d);this.objectNode=h;this.embedNode=b;this.setupContent(h,b,c,e)}},onOk:function(){var e=null,d=null,b=null;if(this.fakeImage)e=this.objectNode,d=this.embedNode;else if(g&& +(e=CKEDITOR.dom.element.createFromHtml("<cke:object></cke:object>",a.document),e.setAttributes({classid:"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000",codebase:"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"})),i)d=CKEDITOR.dom.element.createFromHtml("<cke:embed></cke:embed>",a.document),d.setAttributes({type:"application/x-shockwave-flash",pluginspage:"http://www.macromedia.com/go/getflashplayer"}),e&&d.appendTo(e);if(e)for(var b={},c=e.getElementsByTag("param", +"cke"),f=0,j=c.count();f<j;f++)b[c.getItem(f).getAttribute("name")]=c.getItem(f);c={};f={};this.commitContent(e,d,b,c,f);e=a.createFakeElement(e||d,"cke_flash","flash",!0);e.setAttributes(f);e.setStyles(c);this.fakeImage?(e.replace(this.fakeImage),a.getSelection().selectElement(e)):a.insertElement(e)},onHide:function(){this.preview&&this.preview.setHtml("")},contents:[{id:"info",label:a.lang.common.generalTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{type:"hbox",widths:["280px","110px"], +align:"right",children:[{id:"src",type:"text",label:a.lang.common.url,required:!0,validate:CKEDITOR.dialog.validate.notEmpty(a.lang.flash.validateSrc),setup:b,commit:c,onLoad:function(){var a=this.getDialog(),b=function(b){k.setAttribute("src",b);a.preview.setHtml('<embed height="100%" width="100%" src="'+CKEDITOR.tools.htmlEncode(k.getAttribute("src"))+'" type="application/x-shockwave-flash"></embed>')};a.preview=a.getContentElement("info","preview").getElement().getChild(3);this.on("change",function(a){a.data&& +a.data.value&&b(a.data.value)});this.getInputElement().on("change",function(){b(this.getValue())},this)}},{type:"button",id:"browse",filebrowser:"info:src",hidden:!0,style:"display:inline-block;margin-top:14px;",label:a.lang.common.browseServer}]}]},{type:"hbox",widths:["25%","25%","25%","25%","25%"],children:[{type:"text",id:"width",requiredContent:"embed[width]",style:"width:95px",label:a.lang.common.width,validate:CKEDITOR.dialog.validate.htmlLength(a.lang.common.invalidHtmlLength.replace("%1", +a.lang.common.width)),setup:b,commit:c},{type:"text",id:"height",requiredContent:"embed[height]",style:"width:95px",label:a.lang.common.height,validate:CKEDITOR.dialog.validate.htmlLength(a.lang.common.invalidHtmlLength.replace("%1",a.lang.common.height)),setup:b,commit:c},{type:"text",id:"hSpace",requiredContent:"embed[hspace]",style:"width:95px",label:a.lang.flash.hSpace,validate:CKEDITOR.dialog.validate.integer(a.lang.flash.validateHSpace),setup:b,commit:c},{type:"text",id:"vSpace",requiredContent:"embed[vspace]", +style:"width:95px",label:a.lang.flash.vSpace,validate:CKEDITOR.dialog.validate.integer(a.lang.flash.validateVSpace),setup:b,commit:c}]},{type:"vbox",children:[{type:"html",id:"preview",style:"width:95%;",html:f}]}]},{id:"Upload",hidden:!0,filebrowser:"uploadButton",label:a.lang.common.upload,elements:[{type:"file",id:"upload",label:a.lang.common.upload,size:38},{type:"fileButton",id:"uploadButton",label:a.lang.common.uploadSubmit,filebrowser:"info:src","for":["Upload","upload"]}]},{id:"properties", +label:a.lang.flash.propertiesTab,elements:[{type:"hbox",widths:["50%","50%"],children:[{id:"scale",type:"select",requiredContent:"embed[scale]",label:a.lang.flash.scale,"default":"",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.flash.scaleAll,"showall"],[a.lang.flash.scaleNoBorder,"noborder"],[a.lang.flash.scaleFit,"exactfit"]],setup:b,commit:c},{id:"allowScriptAccess",type:"select",requiredContent:"embed[allowscriptaccess]",label:a.lang.flash.access,"default":"",style:"width : 100%;", +items:[[a.lang.common.notSet,""],[a.lang.flash.accessAlways,"always"],[a.lang.flash.accessSameDomain,"samedomain"],[a.lang.flash.accessNever,"never"]],setup:b,commit:c}]},{type:"hbox",widths:["50%","50%"],children:[{id:"wmode",type:"select",requiredContent:"embed[wmode]",label:a.lang.flash.windowMode,"default":"",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.flash.windowModeWindow,"window"],[a.lang.flash.windowModeOpaque,"opaque"],[a.lang.flash.windowModeTransparent,"transparent"]], +setup:b,commit:c},{id:"quality",type:"select",requiredContent:"embed[quality]",label:a.lang.flash.quality,"default":"high",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.flash.qualityBest,"best"],[a.lang.flash.qualityHigh,"high"],[a.lang.flash.qualityAutoHigh,"autohigh"],[a.lang.flash.qualityMedium,"medium"],[a.lang.flash.qualityAutoLow,"autolow"],[a.lang.flash.qualityLow,"low"]],setup:b,commit:c}]},{type:"hbox",widths:["50%","50%"],children:[{id:"align",type:"select",requiredContent:"object[align]", +label:a.lang.common.align,"default":"",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.common.alignLeft,"left"],[a.lang.flash.alignAbsBottom,"absBottom"],[a.lang.flash.alignAbsMiddle,"absMiddle"],[a.lang.flash.alignBaseline,"baseline"],[a.lang.common.alignBottom,"bottom"],[a.lang.common.alignMiddle,"middle"],[a.lang.common.alignRight,"right"],[a.lang.flash.alignTextTop,"textTop"],[a.lang.common.alignTop,"top"]],setup:b,commit:function(a,b,f,g,i){var j=this.getValue();c.apply(this,arguments); +j&&(i.align=j)}},{type:"html",html:"<div></div>"}]},{type:"fieldset",label:CKEDITOR.tools.htmlEncode(a.lang.flash.flashvars),children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"menu",label:a.lang.flash.chkMenu,"default":!0,setup:b,commit:c},{type:"checkbox",id:"play",label:a.lang.flash.chkPlay,"default":!0,setup:b,commit:c},{type:"checkbox",id:"loop",label:a.lang.flash.chkLoop,"default":!0,setup:b,commit:c},{type:"checkbox",id:"allowFullScreen",label:a.lang.flash.chkFull,"default":!0, +setup:b,commit:c}]}]}]},{id:"advanced",label:a.lang.common.advancedTab,elements:[{type:"hbox",children:[{type:"text",id:"id",requiredContent:"object[id]",label:a.lang.common.id,setup:b,commit:c}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",id:"bgcolor",requiredContent:"embed[bgcolor]",label:a.lang.flash.bgcolor,setup:b,commit:c},{type:"text",id:"class",requiredContent:"embed(cke-xyz)",label:a.lang.common.cssClass,setup:b,commit:c}]},{type:"text",id:"style",requiredContent:"embed{cke-xyz}", +validate:CKEDITOR.dialog.validate.inlineStyle(a.lang.common.invalidInlineStyle),label:a.lang.common.cssStyle,setup:b,commit:c}]}]}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/icons/flash.png b/bower_components/ckeditor/plugins/flash/icons/flash.png new file mode 100644 index 0000000..df7b1c6 Binary files /dev/null and b/bower_components/ckeditor/plugins/flash/icons/flash.png differ diff --git a/bower_components/ckeditor/plugins/flash/icons/hidpi/flash.png b/bower_components/ckeditor/plugins/flash/icons/hidpi/flash.png new file mode 100644 index 0000000..7ad0e38 Binary files /dev/null and b/bower_components/ckeditor/plugins/flash/icons/hidpi/flash.png differ diff --git a/bower_components/ckeditor/plugins/flash/images/placeholder.png b/bower_components/ckeditor/plugins/flash/images/placeholder.png new file mode 100644 index 0000000..0bc6caa Binary files /dev/null and b/bower_components/ckeditor/plugins/flash/images/placeholder.png differ diff --git a/bower_components/ckeditor/plugins/flash/lang/af.js b/bower_components/ckeditor/plugins/flash/lang/af.js new file mode 100644 index 0000000..9ee64f1 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/af.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","af",{access:"Skrip toegang",accessAlways:"Altyd",accessNever:"Nooit",accessSameDomain:"Selfde domeinnaam",alignAbsBottom:"Absoluut-onder",alignAbsMiddle:"Absoluut-middel",alignBaseline:"Basislyn",alignTextTop:"Teks bo",bgcolor:"Agtergrondkleur",chkFull:"Laat volledige skerm toe",chkLoop:"Herhaal",chkMenu:"Flash spyskaart aan",chkPlay:"Speel outomaties",flashvars:"Veranderlikes vir Flash",hSpace:"HSpasie",properties:"Flash eienskappe",propertiesTab:"Eienskappe",quality:"Kwaliteit", +qualityAutoHigh:"Outomaties hoog",qualityAutoLow:"Outomaties laag",qualityBest:"Beste",qualityHigh:"Hoog",qualityLow:"Laag",qualityMedium:"Gemiddeld",scale:"Skaal",scaleAll:"Wys alles",scaleFit:"Presiese pas",scaleNoBorder:"Geen rand",title:"Flash eienskappe",vSpace:"VSpasie",validateHSpace:"HSpasie moet 'n heelgetal wees.",validateSrc:"Voeg die URL in",validateVSpace:"VSpasie moet 'n heelgetal wees.",windowMode:"Venster modus",windowModeOpaque:"Ondeursigtig",windowModeTransparent:"Deursigtig",windowModeWindow:"Venster"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/ar.js b/bower_components/ckeditor/plugins/flash/lang/ar.js new file mode 100644 index 0000000..5b89e5b --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/ar.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","ar",{access:"دخول النص البرمجي",accessAlways:"دائماً",accessNever:"مطلقاً",accessSameDomain:"نفس النطاق",alignAbsBottom:"أسفل النص",alignAbsMiddle:"وسط السطر",alignBaseline:"على السطر",alignTextTop:"أعلى النص",bgcolor:"لون الخلفية",chkFull:"ملء الشاشة",chkLoop:"تكرار",chkMenu:"تمكين قائمة فيلم الفلاش",chkPlay:"تشغيل تلقائي",flashvars:"متغيرات الفلاش",hSpace:"تباعد أفقي",properties:"خصائص الفلاش",propertiesTab:"الخصائص",quality:"جودة",qualityAutoHigh:"عالية تلقائياً", +qualityAutoLow:"منخفضة تلقائياً",qualityBest:"أفضل",qualityHigh:"عالية",qualityLow:"منخفضة",qualityMedium:"متوسطة",scale:"الحجم",scaleAll:"إظهار الكل",scaleFit:"ضبط تام",scaleNoBorder:"بلا حدود",title:"خصائص فيلم الفلاش",vSpace:"تباعد عمودي",validateHSpace:"HSpace يجب أن يكون عدداً.",validateSrc:"فضلاً أدخل عنوان الموقع الذي يشير إليه الرابط",validateVSpace:"VSpace يجب أن يكون عدداً.",windowMode:"وضع النافذة",windowModeOpaque:"غير شفاف",windowModeTransparent:"شفاف",windowModeWindow:"نافذة"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/bg.js b/bower_components/ckeditor/plugins/flash/lang/bg.js new file mode 100644 index 0000000..a60e86c --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/bg.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","bg",{access:"Достъп до скрипт",accessAlways:"Винаги",accessNever:"Никога",accessSameDomain:"Същият домейн",alignAbsBottom:"Най-долу",alignAbsMiddle:"Точно по средата",alignBaseline:"Базова линия",alignTextTop:"Върху текста",bgcolor:"Цвят на фона",chkFull:"Включи на цял екран",chkLoop:"Цикъл",chkMenu:"Разрешено Flash меню",chkPlay:"Авто. пускане",flashvars:"Променливи за Флаш",hSpace:"Хоризонтален отстъп",properties:"Настройки за флаш",propertiesTab:"Настройки",quality:"Качество", +qualityAutoHigh:"Авто. високо",qualityAutoLow:"Авто. ниско",qualityBest:"Отлично",qualityHigh:"Високо",qualityLow:"Ниско",qualityMedium:"Средно",scale:"Оразмеряване",scaleAll:"Показва всичко",scaleFit:"Според мястото",scaleNoBorder:"Без рамка",title:"Настройки за флаш",vSpace:"Вертикален отстъп",validateHSpace:"HSpace трябва да е число.",validateSrc:"Уеб адреса не трябва да е празен.",validateVSpace:"VSpace трябва да е число.",windowMode:"Режим на прозореца",windowModeOpaque:"Плътност",windowModeTransparent:"Прозрачност", +windowModeWindow:"Прозорец"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/bn.js b/bower_components/ckeditor/plugins/flash/lang/bn.js new file mode 100644 index 0000000..2eed56b --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/bn.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","bn",{access:"Script Access",accessAlways:"Always",accessNever:"Never",accessSameDomain:"Same domain",alignAbsBottom:"Abs নীচে",alignAbsMiddle:"Abs উপর",alignBaseline:"মূল রেখা",alignTextTop:"টেক্সট উপর",bgcolor:"বেকগ্রাউন্ড রং",chkFull:"Allow Fullscreen",chkLoop:"লূপ",chkMenu:"ফ্ল্যাশ মেনু এনাবল কর",chkPlay:"অটো প্লে",flashvars:"Variables for Flash",hSpace:"হরাইজন্টাল স্পেস",properties:"ফ্লাশ প্রোপার্টি",propertiesTab:"Properties",quality:"Quality",qualityAutoHigh:"Auto High", +qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"স্কেল",scaleAll:"সব দেখাও",scaleFit:"নিখুঁত ফিট",scaleNoBorder:"কোনো বর্ডার নেই",title:"ফ্ল্যাশ প্রোপার্টি",vSpace:"ভার্টিকেল স্পেস",validateHSpace:"HSpace must be a number.",validateSrc:"অনুগ্রহ করে URL লিংক টাইপ করুন",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/bs.js b/bower_components/ckeditor/plugins/flash/lang/bs.js new file mode 100644 index 0000000..4d5f4b4 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/bs.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","bs",{access:"Script Access",accessAlways:"Always",accessNever:"Never",accessSameDomain:"Same domain",alignAbsBottom:"Abs dole",alignAbsMiddle:"Abs sredina",alignBaseline:"Bazno",alignTextTop:"Vrh teksta",bgcolor:"Boja pozadine",chkFull:"Allow Fullscreen",chkLoop:"Loop",chkMenu:"Enable Flash Menu",chkPlay:"Auto Play",flashvars:"Variables for Flash",hSpace:"HSpace",properties:"Flash Properties",propertiesTab:"Properties",quality:"Quality",qualityAutoHigh:"Auto High", +qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"Scale",scaleAll:"Show all",scaleFit:"Exact Fit",scaleNoBorder:"No Border",title:"Flash Properties",vSpace:"VSpace",validateHSpace:"HSpace must be a number.",validateSrc:"Molimo ukucajte URL link",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/ca.js b/bower_components/ckeditor/plugins/flash/lang/ca.js new file mode 100644 index 0000000..c1e1602 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/ca.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","ca",{access:"Accés a scripts",accessAlways:"Sempre",accessNever:"Mai",accessSameDomain:"El mateix domini",alignAbsBottom:"Abs Bottom",alignAbsMiddle:"Abs Middle",alignBaseline:"Baseline",alignTextTop:"Text Superior",bgcolor:"Color de Fons",chkFull:"Permetre la pantalla completa",chkLoop:"Bucle",chkMenu:"Habilita menú Flash",chkPlay:"Reprodució automàtica",flashvars:"Variables de Flash",hSpace:"Espaiat horitzontal",properties:"Propietats del Flash",propertiesTab:"Propietats", +quality:"Qualitat",qualityAutoHigh:"Alta automàtica",qualityAutoLow:"Baixa automàtica",qualityBest:"La millor",qualityHigh:"Alta",qualityLow:"Baixa",qualityMedium:"Mitjana",scale:"Escala",scaleAll:"Mostra-ho tot",scaleFit:"Mida exacta",scaleNoBorder:"Sense vores",title:"Propietats del Flash",vSpace:"Espaiat vertical",validateHSpace:"L'espaiat horitzontal ha de ser un número.",validateSrc:"La URL no pot estar buida.",validateVSpace:"L'espaiat vertical ha de ser un número.",windowMode:"Mode de la finestra", +windowModeOpaque:"Opaca",windowModeTransparent:"Transparent",windowModeWindow:"Finestra"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/cs.js b/bower_components/ckeditor/plugins/flash/lang/cs.js new file mode 100644 index 0000000..51087ed --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/cs.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","cs",{access:"Přístup ke skriptu",accessAlways:"Vždy",accessNever:"Nikdy",accessSameDomain:"Ve stejné doméně",alignAbsBottom:"Zcela dolů",alignAbsMiddle:"Doprostřed",alignBaseline:"Na účaří",alignTextTop:"Na horní okraj textu",bgcolor:"Barva pozadí",chkFull:"Povolit celoobrazovkový režim",chkLoop:"Opakování",chkMenu:"Nabídka Flash",chkPlay:"Automatické spuštění",flashvars:"Proměnné pro Flash",hSpace:"Horizontální mezera",properties:"Vlastnosti Flashe",propertiesTab:"Vlastnosti", +quality:"Kvalita",qualityAutoHigh:"Vysoká - auto",qualityAutoLow:"Nízká - auto",qualityBest:"Nejlepší",qualityHigh:"Vysoká",qualityLow:"Nejnižší",qualityMedium:"Střední",scale:"Zobrazit",scaleAll:"Zobrazit vše",scaleFit:"Přizpůsobit",scaleNoBorder:"Bez okraje",title:"Vlastnosti Flashe",vSpace:"Vertikální mezera",validateHSpace:"Zadaná horizontální mezera musí být číslo.",validateSrc:"Zadejte prosím URL odkazu",validateVSpace:"Zadaná vertikální mezera musí být číslo.",windowMode:"Režim okna",windowModeOpaque:"Neprůhledné", +windowModeTransparent:"Průhledné",windowModeWindow:"Okno"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/cy.js b/bower_components/ckeditor/plugins/flash/lang/cy.js new file mode 100644 index 0000000..b6ae1ef --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/cy.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","cy",{access:"Mynediad Sgript",accessAlways:"Pob amser",accessNever:"Byth",accessSameDomain:"R'un parth",alignAbsBottom:"Gwaelod Abs",alignAbsMiddle:"Canol Abs",alignBaseline:"Baslinell",alignTextTop:"Testun Top",bgcolor:"Lliw cefndir",chkFull:"Caniatàu Sgrin Llawn",chkLoop:"Lwpio",chkMenu:"Galluogi Dewislen Flash",chkPlay:"AwtoChwarae",flashvars:"Newidynnau ar gyfer Flash",hSpace:"BwlchLl",properties:"Priodweddau Flash",propertiesTab:"Priodweddau",quality:"Ansawdd", +qualityAutoHigh:"Uchel Awto",qualityAutoLow:"Isel Awto",qualityBest:"Gorau",qualityHigh:"Uchel",qualityLow:"Isel",qualityMedium:"Canolig",scale:"Graddfa",scaleAll:"Dangos pob",scaleFit:"Ffit Union",scaleNoBorder:"Dim Ymyl",title:"Priodweddau Flash",vSpace:"BwlchF",validateHSpace:"Rhaid i'r BwlchLl fod yn rhif.",validateSrc:"Ni all yr URL fod yn wag.",validateVSpace:"Rhaid i'r BwlchF fod yn rhif.",windowMode:"Modd ffenestr",windowModeOpaque:"Afloyw",windowModeTransparent:"Tryloyw",windowModeWindow:"Ffenestr"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/da.js b/bower_components/ckeditor/plugins/flash/lang/da.js new file mode 100644 index 0000000..a55294d --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/da.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","da",{access:"Scriptadgang",accessAlways:"Altid",accessNever:"Aldrig",accessSameDomain:"Samme domæne",alignAbsBottom:"Absolut nederst",alignAbsMiddle:"Absolut centreret",alignBaseline:"Grundlinje",alignTextTop:"Toppen af teksten",bgcolor:"Baggrundsfarve",chkFull:"Tillad fuldskærm",chkLoop:"Gentagelse",chkMenu:"Vis Flash-menu",chkPlay:"Automatisk afspilning",flashvars:"Variabler for Flash",hSpace:"Vandret margen",properties:"Egenskaber for Flash",propertiesTab:"Egenskaber", +quality:"Kvalitet",qualityAutoHigh:"Auto høj",qualityAutoLow:"Auto lav",qualityBest:"Bedste",qualityHigh:"Høj",qualityLow:"Lav",qualityMedium:"Medium",scale:"Skalér",scaleAll:"Vis alt",scaleFit:"Tilpas størrelse",scaleNoBorder:"Ingen ramme",title:"Egenskaber for Flash",vSpace:"Lodret margen",validateHSpace:"Vandret margen skal være et tal.",validateSrc:"Indtast hyperlink URL!",validateVSpace:"Lodret margen skal være et tal.",windowMode:"Vinduestilstand",windowModeOpaque:"Gennemsigtig (opaque)",windowModeTransparent:"Transparent", +windowModeWindow:"Vindue"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/de.js b/bower_components/ckeditor/plugins/flash/lang/de.js new file mode 100644 index 0000000..44d7237 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/de.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","de",{access:"Skript Zugang",accessAlways:"Immer",accessNever:"Nie",accessSameDomain:"Gleiche Domain",alignAbsBottom:"Abs Unten",alignAbsMiddle:"Abs Mitte",alignBaseline:"Baseline",alignTextTop:"Text Oben",bgcolor:"Hintergrundfarbe",chkFull:"Vollbildmodus erlauben",chkLoop:"Endlosschleife",chkMenu:"Flash-Menü aktivieren",chkPlay:"Automatisch Abspielen",flashvars:"Variablen für Flash",hSpace:"Horizontal-Abstand",properties:"Flash-Eigenschaften",propertiesTab:"Eigenschaften", +quality:"Qualität",qualityAutoHigh:"Auto Hoch",qualityAutoLow:"Auto Niedrig",qualityBest:"Beste",qualityHigh:"Hoch",qualityLow:"Niedrig",qualityMedium:"Medium",scale:"Skalierung",scaleAll:"Alles anzeigen",scaleFit:"Passgenau",scaleNoBorder:"Ohne Rand",title:"Flash-Eigenschaften",vSpace:"Vertikal-Abstand",validateHSpace:"HSpace muss eine Zahl sein.",validateSrc:"Bitte geben Sie die Link-URL an",validateVSpace:"VSpace muss eine Zahl sein.",windowMode:"Fenster Modus",windowModeOpaque:"Deckend",windowModeTransparent:"Transparent", +windowModeWindow:"Fenster"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/el.js b/bower_components/ckeditor/plugins/flash/lang/el.js new file mode 100644 index 0000000..4904d1b --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/el.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","el",{access:"Πρόσβαση Script",accessAlways:"Πάντα",accessNever:"Ποτέ",accessSameDomain:"Ίδιο όνομα τομέα",alignAbsBottom:"Απόλυτα Κάτω",alignAbsMiddle:"Απόλυτα στη Μέση",alignBaseline:"Γραμμή Βάσης",alignTextTop:"Κορυφή Κειμένου",bgcolor:"Χρώμα Υποβάθρου",chkFull:"Να Επιτρέπεται η Προβολή σε Πλήρη Οθόνη",chkLoop:"Επανάληψη",chkMenu:"Ενεργοποίηση Flash Menu",chkPlay:"Αυτόματη Εκτέλεση",flashvars:"Μεταβλητές για Flash",hSpace:"Οριζόντιο Διάστημα",properties:"Ιδιότητες Flash", +propertiesTab:"Ιδιότητες",quality:"Ποιότητα",qualityAutoHigh:"Αυτόματη Υψηλή",qualityAutoLow:"Αυτόματη Χαμηλή",qualityBest:"Καλύτερη",qualityHigh:"Υψηλή",qualityLow:"Χαμηλή",qualityMedium:"Μεσαία",scale:"Μεγέθυνση",scaleAll:"Εμφάνιση όλων",scaleFit:"Ακριβές Μέγεθος",scaleNoBorder:"Χωρίς Περίγραμμα",title:"Ιδιότητες Flash",vSpace:"Κάθετο Διάστημα",validateHSpace:"Το HSpace πρέπει να είναι αριθμός.",validateSrc:"Εισάγετε την τοποθεσία (URL) του υπερσυνδέσμου (Link)",validateVSpace:"Το VSpace πρέπει να είναι αριθμός.", +windowMode:"Τρόπος λειτουργίας παραθύρου",windowModeOpaque:"Συμπαγές",windowModeTransparent:"Διάφανο",windowModeWindow:"Παράθυρο"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/en-au.js b/bower_components/ckeditor/plugins/flash/lang/en-au.js new file mode 100644 index 0000000..e066c74 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/en-au.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","en-au",{access:"Script Access",accessAlways:"Always",accessNever:"Never",accessSameDomain:"Same domain",alignAbsBottom:"Abs Bottom",alignAbsMiddle:"Abs Middle",alignBaseline:"Baseline",alignTextTop:"Text Top",bgcolor:"Background colour",chkFull:"Allow Fullscreen",chkLoop:"Loop",chkMenu:"Enable Flash Menu",chkPlay:"Auto Play",flashvars:"Variables for Flash",hSpace:"HSpace",properties:"Flash Properties",propertiesTab:"Properties",quality:"Quality",qualityAutoHigh:"Auto High", +qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"Scale",scaleAll:"Show all",scaleFit:"Exact Fit",scaleNoBorder:"No Border",title:"Flash Properties",vSpace:"VSpace",validateHSpace:"HSpace must be a number.",validateSrc:"URL must not be empty.",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/en-ca.js b/bower_components/ckeditor/plugins/flash/lang/en-ca.js new file mode 100644 index 0000000..9c6fdc4 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/en-ca.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","en-ca",{access:"Script Access",accessAlways:"Always",accessNever:"Never",accessSameDomain:"Same domain",alignAbsBottom:"Abs Bottom",alignAbsMiddle:"Abs Middle",alignBaseline:"Baseline",alignTextTop:"Text Top",bgcolor:"Background colour",chkFull:"Allow Fullscreen",chkLoop:"Loop",chkMenu:"Enable Flash Menu",chkPlay:"Auto Play",flashvars:"Variables for Flash",hSpace:"HSpace",properties:"Flash Properties",propertiesTab:"Properties",quality:"Quality",qualityAutoHigh:"Auto High", +qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"Scale",scaleAll:"Show all",scaleFit:"Exact Fit",scaleNoBorder:"No Border",title:"Flash Properties",vSpace:"VSpace",validateHSpace:"HSpace must be a number.",validateSrc:"URL must not be empty.",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/en-gb.js b/bower_components/ckeditor/plugins/flash/lang/en-gb.js new file mode 100644 index 0000000..ccbc28a --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/en-gb.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","en-gb",{access:"Script Access",accessAlways:"Always",accessNever:"Never",accessSameDomain:"Same domain",alignAbsBottom:"Abs Bottom",alignAbsMiddle:"Abs Middle",alignBaseline:"Baseline",alignTextTop:"Text Top",bgcolor:"Background colour",chkFull:"Allow Fullscreen",chkLoop:"Loop",chkMenu:"Enable Flash Menu",chkPlay:"Auto Play",flashvars:"Variables for Flash",hSpace:"HSpace",properties:"Flash Properties",propertiesTab:"Properties",quality:"Quality",qualityAutoHigh:"Auto High", +qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"Scale",scaleAll:"Show all",scaleFit:"Exact Fit",scaleNoBorder:"No Border",title:"Flash Properties",vSpace:"VSpace",validateHSpace:"HSpace must be a number.",validateSrc:"URL must not be empty.",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/en.js b/bower_components/ckeditor/plugins/flash/lang/en.js new file mode 100644 index 0000000..1338031 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/en.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","en",{access:"Script Access",accessAlways:"Always",accessNever:"Never",accessSameDomain:"Same domain",alignAbsBottom:"Abs Bottom",alignAbsMiddle:"Abs Middle",alignBaseline:"Baseline",alignTextTop:"Text Top",bgcolor:"Background color",chkFull:"Allow Fullscreen",chkLoop:"Loop",chkMenu:"Enable Flash Menu",chkPlay:"Auto Play",flashvars:"Variables for Flash",hSpace:"HSpace",properties:"Flash Properties",propertiesTab:"Properties",quality:"Quality",qualityAutoHigh:"Auto High", +qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"Scale",scaleAll:"Show all",scaleFit:"Exact Fit",scaleNoBorder:"No Border",title:"Flash Properties",vSpace:"VSpace",validateHSpace:"HSpace must be a number.",validateSrc:"URL must not be empty.",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/eo.js b/bower_components/ckeditor/plugins/flash/lang/eo.js new file mode 100644 index 0000000..30218bc --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/eo.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","eo",{access:"Atingi skriptojn",accessAlways:"Ĉiam",accessNever:"Neniam",accessSameDomain:"Sama domajno",alignAbsBottom:"Absoluta Malsupro",alignAbsMiddle:"Absoluta Centro",alignBaseline:"TekstoMalsupro",alignTextTop:"TekstoSupro",bgcolor:"Fona Koloro",chkFull:"Permesi tutekranon",chkLoop:"Iteracio",chkMenu:"Ebligi flaŝmenuon",chkPlay:"Aŭtomata legado",flashvars:"Variabloj por Flaŝo",hSpace:"Horizontala Spaco",properties:"Flaŝatributoj",propertiesTab:"Atributoj",quality:"Kvalito", +qualityAutoHigh:"Aŭtomate alta",qualityAutoLow:"Aŭtomate malalta",qualityBest:"Plej bona",qualityHigh:"Alta",qualityLow:"Malalta",qualityMedium:"Meza",scale:"Skalo",scaleAll:"Montri ĉion",scaleFit:"Origina grando",scaleNoBorder:"Neniu bordero",title:"Flaŝatributoj",vSpace:"Vertikala Spaco",validateHSpace:"Horizontala Spaco devas esti nombro.",validateSrc:"Bonvolu entajpi la retadreson (URL)",validateVSpace:"Vertikala Spaco devas esti nombro.",windowMode:"Fenestra reĝimo",windowModeOpaque:"Opaka", +windowModeTransparent:"Travidebla",windowModeWindow:"Fenestro"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/es.js b/bower_components/ckeditor/plugins/flash/lang/es.js new file mode 100644 index 0000000..296239e --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/es.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","es",{access:"Acceso de scripts",accessAlways:"Siempre",accessNever:"Nunca",accessSameDomain:"Mismo dominio",alignAbsBottom:"Abs inferior",alignAbsMiddle:"Abs centro",alignBaseline:"Línea de base",alignTextTop:"Tope del texto",bgcolor:"Color de Fondo",chkFull:"Permitir pantalla completa",chkLoop:"Repetir",chkMenu:"Activar Menú Flash",chkPlay:"Autoejecución",flashvars:"Opciones",hSpace:"Esp.Horiz",properties:"Propiedades de Flash",propertiesTab:"Propiedades",quality:"Calidad", +qualityAutoHigh:"Auto Alta",qualityAutoLow:"Auto Baja",qualityBest:"La mejor",qualityHigh:"Alta",qualityLow:"Baja",qualityMedium:"Media",scale:"Escala",scaleAll:"Mostrar todo",scaleFit:"Ajustado",scaleNoBorder:"Sin Borde",title:"Propiedades de Flash",vSpace:"Esp.Vert",validateHSpace:"Esp.Horiz debe ser un número.",validateSrc:"Por favor escriba el vínculo URL",validateVSpace:"Esp.Vert debe ser un número.",windowMode:"WindowMode",windowModeOpaque:"Opaco",windowModeTransparent:"Transparente",windowModeWindow:"Ventana"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/et.js b/bower_components/ckeditor/plugins/flash/lang/et.js new file mode 100644 index 0000000..9ac2b3c --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/et.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","et",{access:"Skriptide ligipääs",accessAlways:"Kõigile",accessNever:"Mitte ühelegi",accessSameDomain:"Samalt domeenilt",alignAbsBottom:"Abs alla",alignAbsMiddle:"Abs keskele",alignBaseline:"Baasjoonele",alignTextTop:"Tekstist üles",bgcolor:"Tausta värv",chkFull:"Täisekraan lubatud",chkLoop:"Korduv",chkMenu:"Flashi menüü lubatud",chkPlay:"Automaatne start ",flashvars:"Flashi muutujad",hSpace:"H. vaheruum",properties:"Flashi omadused",propertiesTab:"Omadused",quality:"Kvaliteet", +qualityAutoHigh:"Automaatne kõrge",qualityAutoLow:"Automaatne madal",qualityBest:"Parim",qualityHigh:"Kõrge",qualityLow:"Madal",qualityMedium:"Keskmine",scale:"Mastaap",scaleAll:"Näidatakse kõike",scaleFit:"Täpne sobivus",scaleNoBorder:"Äärist ei ole",title:"Flashi omadused",vSpace:"V. vaheruum",validateHSpace:"H. vaheruum peab olema number.",validateSrc:"Palun kirjuta lingi URL",validateVSpace:"V. vaheruum peab olema number.",windowMode:"Akna režiim",windowModeOpaque:"Läbipaistmatu",windowModeTransparent:"Läbipaistev", +windowModeWindow:"Aken"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/eu.js b/bower_components/ckeditor/plugins/flash/lang/eu.js new file mode 100644 index 0000000..5cf1202 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/eu.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","eu",{access:"Scriptak baimendu",accessAlways:"Beti",accessNever:"Inoiz ere ez",accessSameDomain:"Domeinu berdinekoak",alignAbsBottom:"Abs Behean",alignAbsMiddle:"Abs Erdian",alignBaseline:"Oinan",alignTextTop:"Testua Goian",bgcolor:"Atzeko kolorea",chkFull:"Onartu Pantaila osoa",chkLoop:"Begizta",chkMenu:"Flasharen Menua Gaitu",chkPlay:"Automatikoki Erreproduzitu",flashvars:"Flash Aldagaiak",hSpace:"HSpace",properties:"Flasharen Ezaugarriak",propertiesTab:"Ezaugarriak", +quality:"Kalitatea",qualityAutoHigh:"Auto Altua",qualityAutoLow:"Auto Baxua",qualityBest:"Hoberena",qualityHigh:"Altua",qualityLow:"Baxua",qualityMedium:"Ertaina",scale:"Eskalatu",scaleAll:"Dena erakutsi",scaleFit:"Doitu",scaleNoBorder:"Ertzik gabe",title:"Flasharen Ezaugarriak",vSpace:"VSpace",validateHSpace:"HSpace zenbaki bat izan behar da.",validateSrc:"Mesedez URL esteka idatzi",validateVSpace:"VSpace zenbaki bat izan behar da.",windowMode:"Leihoaren modua",windowModeOpaque:"Opakoa",windowModeTransparent:"Gardena", +windowModeWindow:"Leihoa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/fa.js b/bower_components/ckeditor/plugins/flash/lang/fa.js new file mode 100644 index 0000000..ac4a609 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/fa.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","fa",{access:"دسترسی به اسکریپت",accessAlways:"همیشه",accessNever:"هرگز",accessSameDomain:"همان دامنه",alignAbsBottom:"پائین مطلق",alignAbsMiddle:"وسط مطلق",alignBaseline:"خط پایه",alignTextTop:"متن بالا",bgcolor:"رنگ پس​زمینه",chkFull:"اجازه تمام صفحه",chkLoop:"اجرای پیاپی",chkMenu:"در دسترس بودن منوی فلش",chkPlay:"آغاز خودکار",flashvars:"مقادیر برای فلش",hSpace:"فاصلهٴ افقی",properties:"ویژگی​های فلش",propertiesTab:"ویژگی​ها",quality:"کیفیت",qualityAutoHigh:"بالا - خودکار", +qualityAutoLow:"پایین - خودکار",qualityBest:"بهترین",qualityHigh:"بالا",qualityLow:"پایین",qualityMedium:"متوسط",scale:"مقیاس",scaleAll:"نمایش همه",scaleFit:"جایگیری کامل",scaleNoBorder:"بدون کران",title:"ویژگی​های فلش",vSpace:"فاصلهٴ عمودی",validateHSpace:"مقدار فاصله گذاری افقی باید یک عدد باشد.",validateSrc:"لطفا URL پیوند را بنویسید",validateVSpace:"مقدار فاصله گذاری عمودی باید یک عدد باشد.",windowMode:"حالت پنجره",windowModeOpaque:"مات",windowModeTransparent:"شفاف",windowModeWindow:"پنجره"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/fi.js b/bower_components/ckeditor/plugins/flash/lang/fi.js new file mode 100644 index 0000000..c40fe43 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/fi.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","fi",{access:"Skriptien pääsy",accessAlways:"Aina",accessNever:"Ei koskaan",accessSameDomain:"Sama verkkotunnus",alignAbsBottom:"Aivan alas",alignAbsMiddle:"Aivan keskelle",alignBaseline:"Alas (teksti)",alignTextTop:"Ylös (teksti)",bgcolor:"Taustaväri",chkFull:"Salli kokoruututila",chkLoop:"Toisto",chkMenu:"Näytä Flash-valikko",chkPlay:"Automaattinen käynnistys",flashvars:"Muuttujat Flash:lle",hSpace:"Vaakatila",properties:"Flash-ominaisuudet",propertiesTab:"Ominaisuudet", +quality:"Laatu",qualityAutoHigh:"Automaattinen korkea",qualityAutoLow:"Automaattinen matala",qualityBest:"Paras",qualityHigh:"Korkea",qualityLow:"Matala",qualityMedium:"Keskitaso",scale:"Levitä",scaleAll:"Näytä kaikki",scaleFit:"Tarkka koko",scaleNoBorder:"Ei rajaa",title:"Flash ominaisuudet",vSpace:"Pystytila",validateHSpace:"Vaakatilan täytyy olla numero.",validateSrc:"Linkille on kirjoitettava URL",validateVSpace:"Pystytilan täytyy olla numero.",windowMode:"Ikkuna tila",windowModeOpaque:"Läpinäkyvyys", +windowModeTransparent:"Läpinäkyvä",windowModeWindow:"Ikkuna"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/fo.js b/bower_components/ckeditor/plugins/flash/lang/fo.js new file mode 100644 index 0000000..d02410a --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/fo.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","fo",{access:"Script atgongd",accessAlways:"Altíð",accessNever:"Ongantíð",accessSameDomain:"Sama navnaøki",alignAbsBottom:"Abs botnur",alignAbsMiddle:"Abs miðja",alignBaseline:"Basislinja",alignTextTop:"Tekst toppur",bgcolor:"Bakgrundslitur",chkFull:"Loyv fullan skerm",chkLoop:"Endurspæl",chkMenu:"Ger Flash skrá virkna",chkPlay:"Avspælingin byrjar sjálv",flashvars:"Variablar fyri Flash",hSpace:"Høgri breddi",properties:"Flash eginleikar",propertiesTab:"Eginleikar", +quality:"Góðska",qualityAutoHigh:"Auto høg",qualityAutoLow:"Auto Lág",qualityBest:"Besta",qualityHigh:"Høg",qualityLow:"Lág",qualityMedium:"Meðal",scale:"Skalering",scaleAll:"Vís alt",scaleFit:"Neyv skalering",scaleNoBorder:"Eingin bordi",title:"Flash eginleikar",vSpace:"Vinstri breddi",validateHSpace:"HSpace má vera eitt tal.",validateSrc:"Vinarliga skriva tilknýti (URL)",validateVSpace:"VSpace má vera eitt tal.",windowMode:"Slag av rúti",windowModeOpaque:"Ikki transparent",windowModeTransparent:"Transparent", +windowModeWindow:"Rútur"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/fr-ca.js b/bower_components/ckeditor/plugins/flash/lang/fr-ca.js new file mode 100644 index 0000000..8218f11 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/fr-ca.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","fr-ca",{access:"Accès au script",accessAlways:"Toujours",accessNever:"Jamais",accessSameDomain:"Même domaine",alignAbsBottom:"Bas absolu",alignAbsMiddle:"Milieu absolu",alignBaseline:"Bas du texte",alignTextTop:"Haut du texte",bgcolor:"Couleur de fond",chkFull:"Permettre le plein-écran",chkLoop:"Boucle",chkMenu:"Activer le menu Flash",chkPlay:"Lecture automatique",flashvars:"Variables pour Flash",hSpace:"Espacement horizontal",properties:"Propriétés de l'animation Flash", +propertiesTab:"Propriétés",quality:"Qualité",qualityAutoHigh:"Haute auto",qualityAutoLow:"Basse auto",qualityBest:"Meilleur",qualityHigh:"Haute",qualityLow:"Basse",qualityMedium:"Moyenne",scale:"Échelle",scaleAll:"Afficher tout",scaleFit:"Ajuster aux dimensions",scaleNoBorder:"Sans bordure",title:"Propriétés de l'animation Flash",vSpace:"Espacement vertical",validateHSpace:"L'espacement horizontal doit être un entier.",validateSrc:"Veuillez saisir l'URL",validateVSpace:"L'espacement vertical doit être un entier.", +windowMode:"Mode de fenêtre",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Fenêtre"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/fr.js b/bower_components/ckeditor/plugins/flash/lang/fr.js new file mode 100644 index 0000000..fdc543c --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/fr.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","fr",{access:"Accès aux scripts",accessAlways:"Toujours",accessNever:"Jamais",accessSameDomain:"Même domaine",alignAbsBottom:"Bas absolu",alignAbsMiddle:"Milieu absolu",alignBaseline:"Bas du texte",alignTextTop:"Haut du texte",bgcolor:"Couleur d'arrière-plan",chkFull:"Permettre le plein écran",chkLoop:"Boucle",chkMenu:"Activer le menu Flash",chkPlay:"Jouer automatiquement",flashvars:"Variables du Flash",hSpace:"Espacement horizontal",properties:"Propriétés du Flash", +propertiesTab:"Propriétés",quality:"Qualité",qualityAutoHigh:"Haute Auto",qualityAutoLow:"Basse Auto",qualityBest:"Meilleure",qualityHigh:"Haute",qualityLow:"Basse",qualityMedium:"Moyenne",scale:"Echelle",scaleAll:"Afficher tout",scaleFit:"Taille d'origine",scaleNoBorder:"Pas de bordure",title:"Propriétés du Flash",vSpace:"Espacement vertical",validateHSpace:"L'espacement horizontal doit être un nombre.",validateSrc:"L'adresse ne doit pas être vide.",validateVSpace:"L'espacement vertical doit être un nombre.", +windowMode:"Mode fenêtre",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Fenêtre"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/gl.js b/bower_components/ckeditor/plugins/flash/lang/gl.js new file mode 100644 index 0000000..38e8508 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/gl.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","gl",{access:"Acceso de scripts",accessAlways:"Sempre",accessNever:"Nunca",accessSameDomain:"Mesmo dominio",alignAbsBottom:"Abs Inferior",alignAbsMiddle:"Abs centro",alignBaseline:"Liña de base",alignTextTop:"Tope do texto",bgcolor:"Cor do fondo",chkFull:"Permitir pantalla completa",chkLoop:"Repetir",chkMenu:"Activar o menú do «Flash»",chkPlay:"Reprodución auomática",flashvars:"Opcións do «Flash»",hSpace:"Esp. Horiz.",properties:"Propiedades do «Flash»",propertiesTab:"Propiedades", +quality:"Calidade",qualityAutoHigh:"Alta, automática",qualityAutoLow:"Baixa, automática",qualityBest:"A mellor",qualityHigh:"Alta",qualityLow:"Baixa",qualityMedium:"Media",scale:"Escalar",scaleAll:"Amosar todo",scaleFit:"Encaixar axustando",scaleNoBorder:"Sen bordo",title:"Propiedades do «Flash»",vSpace:"Esp.Vert.",validateHSpace:"O espazado horizontal debe ser un número.",validateSrc:"O URL non pode estar baleiro.",validateVSpace:"O espazado vertical debe ser un número.",windowMode:"Modo da xanela", +windowModeOpaque:"Opaca",windowModeTransparent:"Transparente",windowModeWindow:"Xanela"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/gu.js b/bower_components/ckeditor/plugins/flash/lang/gu.js new file mode 100644 index 0000000..601bb61 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/gu.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","gu",{access:"સ્ક્રીપ્ટ એક્સેસ",accessAlways:"હમેશાં",accessNever:"નહી",accessSameDomain:"એજ ડોમેન",alignAbsBottom:"Abs નીચે",alignAbsMiddle:"Abs ઉપર",alignBaseline:"આધાર લીટી",alignTextTop:"ટેક્સ્ટ ઉપર",bgcolor:"બૅકગ્રાઉન્ડ રંગ,",chkFull:"ફૂલ સ્ક્રીન કરવું",chkLoop:"લૂપ",chkMenu:"ફ્લૅશ મેન્યૂ નો પ્રયોગ કરો",chkPlay:"ઑટો/સ્વયં પ્લે",flashvars:"ફલેશ ના વિકલ્પો",hSpace:"સમસ્તરીય જગ્યા",properties:"ફ્લૅશના ગુણ",propertiesTab:"ગુણ",quality:"ગુણધર્મ",qualityAutoHigh:"ઓટો ઊંચું", +qualityAutoLow:"ઓટો નીચું",qualityBest:"શ્રેષ્ઠ",qualityHigh:"ઊંચું",qualityLow:"નીચું",qualityMedium:"મધ્યમ",scale:"સ્કેલ",scaleAll:"સ્કેલ ઓલ/બધુ બતાવો",scaleFit:"સ્કેલ એકદમ ફીટ",scaleNoBorder:"સ્કેલ બોર્ડર વગર",title:"ફ્લૅશ ગુણ",vSpace:"લંબરૂપ જગ્યા",validateHSpace:"HSpace આંકડો હોવો જોઈએ.",validateSrc:"લિંક URL ટાઇપ કરો",validateVSpace:"VSpace આંકડો હોવો જોઈએ.",windowMode:"વિન્ડો મોડ",windowModeOpaque:"અપારદર્શક",windowModeTransparent:"પારદર્શક",windowModeWindow:"વિન્ડો"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/he.js b/bower_components/ckeditor/plugins/flash/lang/he.js new file mode 100644 index 0000000..6870ea2 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/he.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","he",{access:"גישת סקריפט",accessAlways:"תמיד",accessNever:"אף פעם",accessSameDomain:"דומיין זהה",alignAbsBottom:"לתחתית האבסולוטית",alignAbsMiddle:"מרכוז אבסולוטי",alignBaseline:"לקו התחתית",alignTextTop:"לראש הטקסט",bgcolor:"צבע רקע",chkFull:"אפשר חלון מלא",chkLoop:"לולאה",chkMenu:"אפשר תפריט פלאש",chkPlay:"ניגון אוטומטי",flashvars:"משתנים לפלאש",hSpace:"מרווח אופקי",properties:"מאפייני פלאש",propertiesTab:"מאפיינים",quality:"איכות",qualityAutoHigh:"גבוהה אוטומטית", +qualityAutoLow:"נמוכה אוטומטית",qualityBest:"מעולה",qualityHigh:"גבוהה",qualityLow:"נמוכה",qualityMedium:"ממוצעת",scale:"גודל",scaleAll:"הצג הכל",scaleFit:"התאמה מושלמת",scaleNoBorder:"ללא גבולות",title:"מאפיני פלאש",vSpace:"מרווח אנכי",validateHSpace:"המרווח האופקי חייב להיות מספר.",validateSrc:"יש להקליד את כתובת סרטון הפלאש (URL)",validateVSpace:"המרווח האנכי חייב להיות מספר.",windowMode:"מצב חלון",windowModeOpaque:"אטום",windowModeTransparent:"שקוף",windowModeWindow:"חלון"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/hi.js b/bower_components/ckeditor/plugins/flash/lang/hi.js new file mode 100644 index 0000000..2f3b6e9 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/hi.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","hi",{access:"Script Access",accessAlways:"Always",accessNever:"Never",accessSameDomain:"Same domain",alignAbsBottom:"Abs नीचे",alignAbsMiddle:"Abs ऊपर",alignBaseline:"मूल रेखा",alignTextTop:"टेक्स्ट ऊपर",bgcolor:"बैक्ग्राउन्ड रंग",chkFull:"Allow Fullscreen",chkLoop:"लूप",chkMenu:"फ़्लैश मॅन्यू का प्रयोग करें",chkPlay:"ऑटो प्ले",flashvars:"Variables for Flash",hSpace:"हॉरिज़ॉन्टल स्पेस",properties:"फ़्लैश प्रॉपर्टीज़",propertiesTab:"Properties",quality:"Quality",qualityAutoHigh:"Auto High", +qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"स्केल",scaleAll:"सभी दिखायें",scaleFit:"बिल्कुल फ़िट",scaleNoBorder:"कोई बॉर्डर नहीं",title:"फ़्लैश प्रॉपर्टीज़",vSpace:"वर्टिकल स्पेस",validateHSpace:"HSpace must be a number.",validateSrc:"लिंक URL टाइप करें",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/hr.js b/bower_components/ckeditor/plugins/flash/lang/hr.js new file mode 100644 index 0000000..ae7c82f --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/hr.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","hr",{access:"Script Access",accessAlways:"Uvijek",accessNever:"Nikad",accessSameDomain:"Ista domena",alignAbsBottom:"Abs dolje",alignAbsMiddle:"Abs sredina",alignBaseline:"Bazno",alignTextTop:"Vrh teksta",bgcolor:"Boja pozadine",chkFull:"Omogući Fullscreen",chkLoop:"Ponavljaj",chkMenu:"Omogući Flash izbornik",chkPlay:"Auto Play",flashvars:"Varijable za Flash",hSpace:"HSpace",properties:"Flash svojstva",propertiesTab:"Svojstva",quality:"Kvaliteta",qualityAutoHigh:"Auto High", +qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"Omjer",scaleAll:"Prikaži sve",scaleFit:"Točna veličina",scaleNoBorder:"Bez okvira",title:"Flash svojstva",vSpace:"VSpace",validateHSpace:"HSpace mora biti broj.",validateSrc:"Molimo upišite URL link",validateVSpace:"VSpace mora biti broj.",windowMode:"Vrsta prozora",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/hu.js b/bower_components/ckeditor/plugins/flash/lang/hu.js new file mode 100644 index 0000000..9262090 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/hu.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","hu",{access:"Szkript hozzáférés",accessAlways:"Mindig",accessNever:"Soha",accessSameDomain:"Azonos domainről",alignAbsBottom:"Legaljára",alignAbsMiddle:"Közepére",alignBaseline:"Alapvonalhoz",alignTextTop:"Szöveg tetejére",bgcolor:"Háttérszín",chkFull:"Teljes képernyő engedélyezése",chkLoop:"Folyamatosan",chkMenu:"Flash menü engedélyezése",chkPlay:"Automata lejátszás",flashvars:"Flash változók",hSpace:"Vízsz. táv",properties:"Flash tulajdonságai",propertiesTab:"Tulajdonságok", +quality:"Minőség",qualityAutoHigh:"Automata jó",qualityAutoLow:"Automata gyenge",qualityBest:"Legjobb",qualityHigh:"Jó",qualityLow:"Gyenge",qualityMedium:"Közepes",scale:"Méretezés",scaleAll:"Mindent mutat",scaleFit:"Teljes kitöltés",scaleNoBorder:"Keret nélkül",title:"Flash tulajdonságai",vSpace:"Függ. táv",validateHSpace:"A vízszintes távolsűág mezőbe csak számokat írhat.",validateSrc:"Adja meg a hivatkozás webcímét",validateVSpace:"A függőleges távolsűág mezőbe csak számokat írhat.",windowMode:"Ablak mód", +windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/id.js b/bower_components/ckeditor/plugins/flash/lang/id.js new file mode 100644 index 0000000..9272c08 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/id.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","id",{access:"Script Access",accessAlways:"Selalu",accessNever:"Tidak Pernah",accessSameDomain:"Domain yang sama",alignAbsBottom:"Abs Bottom",alignAbsMiddle:"Abs Middle",alignBaseline:"Dasar",alignTextTop:"Text Top",bgcolor:"Warna Latar Belakang",chkFull:"Izinkan Layar Penuh",chkLoop:"Loop",chkMenu:"Enable Flash Menu",chkPlay:"Mainkan Otomatis",flashvars:"Variables for Flash",hSpace:"HSpace",properties:"Flash Properties",propertiesTab:"Properti",quality:"Kualitas", +qualityAutoHigh:"Tinggi Otomatis",qualityAutoLow:"Rendah Otomatis",qualityBest:"Terbaik",qualityHigh:"Tinggi",qualityLow:"Rendah",qualityMedium:"Sedang",scale:"Scale",scaleAll:"Perlihatkan semua",scaleFit:"Exact Fit",scaleNoBorder:"Tanpa Batas",title:"Flash Properties",vSpace:"VSpace",validateHSpace:"HSpace harus sebuah angka",validateSrc:"URL tidak boleh kosong",validateVSpace:"VSpace harus sebuah angka",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparan",windowModeWindow:"Jendela"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/is.js b/bower_components/ckeditor/plugins/flash/lang/is.js new file mode 100644 index 0000000..0b0d71b --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/is.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","is",{access:"Script Access",accessAlways:"Always",accessNever:"Never",accessSameDomain:"Same domain",alignAbsBottom:"Abs neðst",alignAbsMiddle:"Abs miðjuð",alignBaseline:"Grunnlína",alignTextTop:"Efri brún texta",bgcolor:"Bakgrunnslitur",chkFull:"Allow Fullscreen",chkLoop:"Endurtekning",chkMenu:"Sýna Flash-valmynd",chkPlay:"Sjálfvirk spilun",flashvars:"Variables for Flash",hSpace:"Vinstri bil",properties:"Eigindi Flash",propertiesTab:"Properties",quality:"Quality", +qualityAutoHigh:"Auto High",qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"Skali",scaleAll:"Sýna allt",scaleFit:"Fella skala að stærð",scaleNoBorder:"Án ramma",title:"Eigindi Flash",vSpace:"Hægri bil",validateHSpace:"HSpace must be a number.",validateSrc:"Sláðu inn veffang stiklunnar!",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/it.js b/bower_components/ckeditor/plugins/flash/lang/it.js new file mode 100644 index 0000000..7c5e09f --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/it.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","it",{access:"Accesso Script",accessAlways:"Sempre",accessNever:"Mai",accessSameDomain:"Solo stesso dominio",alignAbsBottom:"In basso assoluto",alignAbsMiddle:"Centrato assoluto",alignBaseline:"Linea base",alignTextTop:"In alto al testo",bgcolor:"Colore sfondo",chkFull:"Permetti la modalità tutto schermo",chkLoop:"Riavvio automatico",chkMenu:"Abilita Menu di Flash",chkPlay:"Avvio Automatico",flashvars:"Variabili per Flash",hSpace:"HSpace",properties:"Proprietà Oggetto Flash", +propertiesTab:"Proprietà",quality:"Qualità",qualityAutoHigh:"Alta Automatica",qualityAutoLow:"Bassa Automatica",qualityBest:"Massima",qualityHigh:"Alta",qualityLow:"Bassa",qualityMedium:"Intermedia",scale:"Ridimensiona",scaleAll:"Mostra Tutto",scaleFit:"Dimensione Esatta",scaleNoBorder:"Senza Bordo",title:"Proprietà Oggetto Flash",vSpace:"VSpace",validateHSpace:"L'HSpace dev'essere un numero.",validateSrc:"Devi inserire l'URL del collegamento",validateVSpace:"Il VSpace dev'essere un numero.",windowMode:"Modalità finestra", +windowModeOpaque:"Opaca",windowModeTransparent:"Trasparente",windowModeWindow:"Finestra"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/ja.js b/bower_components/ckeditor/plugins/flash/lang/ja.js new file mode 100644 index 0000000..8a2238b --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/ja.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","ja",{access:"スプリクトアクセス(AllowScriptAccess)",accessAlways:"すべての場合に通信可能(Always)",accessNever:"すべての場合に通信不可能(Never)",accessSameDomain:"同一ドメインのみに通信可能(Same domain)",alignAbsBottom:"下部(絶対的)",alignAbsMiddle:"中央(絶対的)",alignBaseline:"ベースライン",alignTextTop:"テキスト上部",bgcolor:"背景色",chkFull:"フルスクリーン許可",chkLoop:"ループ再生",chkMenu:"Flashメニュー可能",chkPlay:"再生",flashvars:"フラッシュに渡す変数(FlashVars)",hSpace:"横間隔",properties:"Flash プロパティ",propertiesTab:"プロパティ",quality:"画質",qualityAutoHigh:"自動/高", +qualityAutoLow:"自動/低",qualityBest:"品質優先",qualityHigh:"高",qualityLow:"低",qualityMedium:"中",scale:"拡大縮小設定",scaleAll:"すべて表示",scaleFit:"上下左右にフィット",scaleNoBorder:"外が見えない様に拡大",title:"Flash プロパティ",vSpace:"縦間隔",validateHSpace:"横間隔は数値で入力してください。",validateSrc:"リンクURLを入力してください。",validateVSpace:"縦間隔は数値で入力してください。",windowMode:"ウィンドウモード",windowModeOpaque:"背景を不透明設定",windowModeTransparent:"背景を透過設定",windowModeWindow:"標準"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/ka.js b/bower_components/ckeditor/plugins/flash/lang/ka.js new file mode 100644 index 0000000..fb482ec --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/ka.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","ka",{access:"სკრიპტის წვდომა",accessAlways:"ყოველთვის",accessNever:"არასდროს",accessSameDomain:"იგივე დომენი",alignAbsBottom:"ჩარჩოს ქვემოთა ნაწილის სწორება ტექსტისთვის",alignAbsMiddle:"ჩარჩოს შუა ნაწილის სწორება ტექსტისთვის",alignBaseline:"საბაზისო ხაზის სწორება",alignTextTop:"ტექსტი ზემოდან",bgcolor:"ფონის ფერი",chkFull:"მთელი ეკრანის დაშვება",chkLoop:"ჩაციკლვა",chkMenu:"Flash-ის მენიუს დაშვება",chkPlay:"ავტო გაშვება",flashvars:"ცვლადები Flash-ისთვის",hSpace:"ჰორიზ. სივრცე", +properties:"Flash-ის პარამეტრები",propertiesTab:"პარამეტრები",quality:"ხარისხი",qualityAutoHigh:"მაღალი (ავტომატური)",qualityAutoLow:"ძალიან დაბალი",qualityBest:"საუკეთესო",qualityHigh:"მაღალი",qualityLow:"დაბალი",qualityMedium:"საშუალო",scale:"მასშტაბირება",scaleAll:"ყველაფრის ჩვენება",scaleFit:"ზუსტი ჩასმა",scaleNoBorder:"ჩარჩოს გარეშე",title:"Flash-ის პარამეტრები",vSpace:"ვერტ. სივრცე",validateHSpace:"ჰორიზონტალური სივრცე არ უნდა იყოს ცარიელი.",validateSrc:"URL არ უნდა იყოს ცარიელი.",validateVSpace:"ვერტიკალური სივრცე არ უნდა იყოს ცარიელი.", +windowMode:"ფანჯრის რეჟიმი",windowModeOpaque:"გაუმჭვირვალე",windowModeTransparent:"გამჭვირვალე",windowModeWindow:"ფანჯარა"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/km.js b/bower_components/ckeditor/plugins/flash/lang/km.js new file mode 100644 index 0000000..a4babe9 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/km.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","km",{access:"Script Access",accessAlways:"ជានិច្ច",accessNever:"កុំ",accessSameDomain:"Same domain",alignAbsBottom:"Abs Bottom",alignAbsMiddle:"Abs Middle",alignBaseline:"បន្ទាត់ជាមូលដ្ឋាន",alignTextTop:"លើអត្ថបទ",bgcolor:"ពណ៌ផ្ទៃខាងក្រោយ",chkFull:"អនុញ្ញាត​ឲ្យ​ពេញ​អេក្រង់",chkLoop:"ចំនួនដង",chkMenu:"បង្ហាញ មឺនុយរបស់ Flash",chkPlay:"លេងដោយស្វ័យប្រវត្ត",flashvars:"អថេរ Flash",hSpace:"គំលាតទទឹង",properties:"ការកំណត់ Flash",propertiesTab:"លក្ខណៈ​សម្បត្តិ",quality:"គុណភាព", +qualityAutoHigh:"ខ្ពស់​ស្វ័យ​ប្រវត្តិ",qualityAutoLow:"ទាប​ស្វ័យ​ប្រវត្តិ",qualityBest:"ល្អ​បំផុត",qualityHigh:"ខ្ពស់",qualityLow:"ទាប",qualityMedium:"មធ្យម",scale:"ទំហំ",scaleAll:"បង្ហាញទាំងអស់",scaleFit:"ត្រូវល្មម",scaleNoBorder:"មិនបង្ហាញស៊ុម",title:"ការកំណត់ Flash",vSpace:"គំលាតបណ្តោយ",validateHSpace:"HSpace must be a number.",validateSrc:"សូមសរសេរ អាស័យដ្ឋាន URL",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"ភាព​ថ្លា",windowModeWindow:"វីនដូ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/ko.js b/bower_components/ckeditor/plugins/flash/lang/ko.js new file mode 100644 index 0000000..514c74a --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/ko.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","ko",{access:"스크립트 허용",accessAlways:"항상 허용",accessNever:"허용 안함",accessSameDomain:"Same domain",alignAbsBottom:"줄아래(Abs Bottom)",alignAbsMiddle:"줄중간(Abs Middle)",alignBaseline:"기준선",alignTextTop:"글자상단",bgcolor:"배경 색상",chkFull:"전체화면 ",chkLoop:"반복",chkMenu:"플래쉬메뉴 가능",chkPlay:"자동재생",flashvars:"Variables for Flash",hSpace:"수평여백",properties:"플래쉬 속성",propertiesTab:"Properties",quality:"Quality",qualityAutoHigh:"Auto High",qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High", +qualityLow:"Low",qualityMedium:"Medium",scale:"영역",scaleAll:"모두보기",scaleFit:"영역자동조절",scaleNoBorder:"경계선없음",title:"플래쉬 등록정보",vSpace:"수직여백",validateHSpace:"HSpace must be a number.",validateSrc:"링크 URL을 입력하십시요.",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/ku.js b/bower_components/ckeditor/plugins/flash/lang/ku.js new file mode 100644 index 0000000..e961895 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/ku.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","ku",{access:"دەستپێگەیشتنی نووسراو",accessAlways:"هەمیشه",accessNever:"هەرگیز",accessSameDomain:"هەمان دۆمەین",alignAbsBottom:"له ژێرەوه",alignAbsMiddle:"لەناوەند",alignBaseline:"هێڵەبنەڕەت",alignTextTop:"دەق لەسەرەوه",bgcolor:"ڕەنگی پاشبنەما",chkFull:"ڕێپێدان بە پڕی شاشه",chkLoop:"گرێ",chkMenu:"چالاککردنی لیستەی فلاش",chkPlay:"پێکردنی یان لێدانی خۆکار",flashvars:"گۆڕاوەکان بۆ فلاش",hSpace:"بۆشایی ئاسۆیی",properties:"خاسیەتی فلاش",propertiesTab:"خاسیەت",quality:"جۆرایەتی", +qualityAutoHigh:"بەرزی خۆکار",qualityAutoLow:"نزمی خۆکار",qualityBest:"باشترین",qualityHigh:"بەرزی",qualityLow:"نزم",qualityMedium:"مامناوەند",scale:"پێوانه",scaleAll:"نیشاندانی هەموو",scaleFit:"بەوردی بگونجێت",scaleNoBorder:"بێ پەراوێز",title:"خاسیەتی فلاش",vSpace:"بۆشایی ئەستونی",validateHSpace:"بۆشایی ئاسۆیی دەبێت ژمارە بێت.",validateSrc:"ناونیشانی بەستەر نابێت خاڵی بێت",validateVSpace:"بۆشایی ئەستونی دەبێت ژماره بێت.",windowMode:"شێوازی پەنجەره",windowModeOpaque:"ناڕوون",windowModeTransparent:"ڕۆشن", +windowModeWindow:"پەنجەره"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/lt.js b/bower_components/ckeditor/plugins/flash/lang/lt.js new file mode 100644 index 0000000..8e013f2 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/lt.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","lt",{access:"Skripto priėjimas",accessAlways:"Visada",accessNever:"Niekada",accessSameDomain:"Tas pats domenas",alignAbsBottom:"Absoliučią apačią",alignAbsMiddle:"Absoliutų vidurį",alignBaseline:"Apatinę liniją",alignTextTop:"Teksto viršūnę",bgcolor:"Fono spalva",chkFull:"Leisti per visą ekraną",chkLoop:"Ciklas",chkMenu:"Leisti Flash meniu",chkPlay:"Automatinis paleidimas",flashvars:"Flash kintamieji",hSpace:"Hor.Erdvė",properties:"Flash savybės",propertiesTab:"Nustatymai", +quality:"Kokybė",qualityAutoHigh:"Automatiškai Gera",qualityAutoLow:"Automatiškai Žema",qualityBest:"Geriausia",qualityHigh:"Gera",qualityLow:"Žema",qualityMedium:"Vidutinė",scale:"Mastelis",scaleAll:"Rodyti visą",scaleFit:"Tikslus atitikimas",scaleNoBorder:"Be rėmelio",title:"Flash savybės",vSpace:"Vert.Erdvė",validateHSpace:"HSpace turi būti skaičius.",validateSrc:"Prašome įvesti nuorodos URL",validateVSpace:"VSpace turi būti skaičius.",windowMode:"Lango režimas",windowModeOpaque:"Nepermatomas", +windowModeTransparent:"Permatomas",windowModeWindow:"Langas"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/lv.js b/bower_components/ckeditor/plugins/flash/lang/lv.js new file mode 100644 index 0000000..30edb93 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/lv.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","lv",{access:"Skripta pieeja",accessAlways:"Vienmēr",accessNever:"Nekad",accessSameDomain:"Tas pats domēns",alignAbsBottom:"Absolūti apakšā",alignAbsMiddle:"Absolūti vertikāli centrēts",alignBaseline:"Pamatrindā",alignTextTop:"Teksta augšā",bgcolor:"Fona krāsa",chkFull:"Pilnekrāns",chkLoop:"Nepārtraukti",chkMenu:"Atļaut Flash izvēlni",chkPlay:"Automātiska atskaņošana",flashvars:"Flash mainīgie",hSpace:"Horizontālā telpa",properties:"Flash īpašības",propertiesTab:"Uzstādījumi", +quality:"Kvalitāte",qualityAutoHigh:"Automātiski Augsta",qualityAutoLow:"Automātiski Zema",qualityBest:"Labākā",qualityHigh:"Augsta",qualityLow:"Zema",qualityMedium:"Vidēja",scale:"Mainīt izmēru",scaleAll:"Rādīt visu",scaleFit:"Precīzs izmērs",scaleNoBorder:"Bez rāmja",title:"Flash īpašības",vSpace:"Vertikālā telpa",validateHSpace:"Hspace jābūt skaitlim",validateSrc:"Lūdzu norādi hipersaiti",validateVSpace:"Vspace jābūt skaitlim",windowMode:"Loga režīms",windowModeOpaque:"Necaurspīdīgs",windowModeTransparent:"Caurspīdīgs", +windowModeWindow:"Logs"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/mk.js b/bower_components/ckeditor/plugins/flash/lang/mk.js new file mode 100644 index 0000000..ae22f2a --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/mk.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","mk",{access:"Script Access",accessAlways:"Always",accessNever:"Never",accessSameDomain:"Same domain",alignAbsBottom:"Abs Bottom",alignAbsMiddle:"Abs Middle",alignBaseline:"Baseline",alignTextTop:"Text Top",bgcolor:"Background color",chkFull:"Allow Fullscreen",chkLoop:"Loop",chkMenu:"Enable Flash Menu",chkPlay:"Auto Play",flashvars:"Variables for Flash",hSpace:"HSpace",properties:"Flash Properties",propertiesTab:"Properties",quality:"Quality",qualityAutoHigh:"Auto High", +qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"Scale",scaleAll:"Show all",scaleFit:"Exact Fit",scaleNoBorder:"No Border",title:"Flash Properties",vSpace:"VSpace",validateHSpace:"HSpace must be a number.",validateSrc:"URL must not be empty.",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/mn.js b/bower_components/ckeditor/plugins/flash/lang/mn.js new file mode 100644 index 0000000..6759d77 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/mn.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","mn",{access:"Script Access",accessAlways:"Онцлогууд",accessNever:"Хэзээ ч үгүй",accessSameDomain:"Байнга",alignAbsBottom:"Abs доод талд",alignAbsMiddle:"Abs Дунд талд",alignBaseline:"Baseline",alignTextTop:"Текст дээр",bgcolor:"Дэвсгэр өнгө",chkFull:"Allow Fullscreen",chkLoop:"Давтах",chkMenu:"Флаш цэс идвэхжүүлэх",chkPlay:"Автоматаар тоглох",flashvars:"Variables for Flash",hSpace:"Хөндлөн зай",properties:"Флаш шинж чанар",propertiesTab:"Properties",quality:"Quality", +qualityAutoHigh:"Auto High",qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"Өргөгтгөх",scaleAll:"Бүгдийг харуулах",scaleFit:"Яг тааруулах",scaleNoBorder:"Хүрээгүй",title:"Флаш шинж чанар",vSpace:"Босоо зай",validateHSpace:"HSpace must be a number.",validateSrc:"Линк URL-ээ төрөлжүүлнэ үү",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/ms.js b/bower_components/ckeditor/plugins/flash/lang/ms.js new file mode 100644 index 0000000..9012a68 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/ms.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","ms",{access:"Script Access",accessAlways:"Always",accessNever:"Never",accessSameDomain:"Same domain",alignAbsBottom:"Bawah Mutlak",alignAbsMiddle:"Pertengahan Mutlak",alignBaseline:"Garis Dasar",alignTextTop:"Atas Text",bgcolor:"Warna Latarbelakang",chkFull:"Allow Fullscreen",chkLoop:"Loop",chkMenu:"Enable Flash Menu",chkPlay:"Auto Play",flashvars:"Variables for Flash",hSpace:"Ruang Melintang",properties:"Flash Properties",propertiesTab:"Properties",quality:"Quality", +qualityAutoHigh:"Auto High",qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"Scale",scaleAll:"Show all",scaleFit:"Exact Fit",scaleNoBorder:"No Border",title:"Flash Properties",vSpace:"Ruang Menegak",validateHSpace:"HSpace must be a number.",validateSrc:"Sila taip sambungan URL",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/nb.js b/bower_components/ckeditor/plugins/flash/lang/nb.js new file mode 100644 index 0000000..c03f61f --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/nb.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","nb",{access:"Scripttilgang",accessAlways:"Alltid",accessNever:"Aldri",accessSameDomain:"Samme domene",alignAbsBottom:"Abs bunn",alignAbsMiddle:"Abs midten",alignBaseline:"Bunnlinje",alignTextTop:"Tekst topp",bgcolor:"Bakgrunnsfarge",chkFull:"Tillat fullskjerm",chkLoop:"Loop",chkMenu:"Slå på Flash-meny",chkPlay:"Autospill",flashvars:"Variabler for flash",hSpace:"HMarg",properties:"Egenskaper for Flash-objekt",propertiesTab:"Egenskaper",quality:"Kvalitet",qualityAutoHigh:"Auto høy", +qualityAutoLow:"Auto lav",qualityBest:"Best",qualityHigh:"Høy",qualityLow:"Lav",qualityMedium:"Medium",scale:"Skaler",scaleAll:"Vis alt",scaleFit:"Skaler til å passe",scaleNoBorder:"Ingen ramme",title:"Flash-egenskaper",vSpace:"VMarg",validateHSpace:"HMarg må være et tall.",validateSrc:"Vennligst skriv inn lenkens url.",validateVSpace:"VMarg må være et tall.",windowMode:"Vindumodus",windowModeOpaque:"Opaque",windowModeTransparent:"Gjennomsiktig",windowModeWindow:"Vindu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/nl.js b/bower_components/ckeditor/plugins/flash/lang/nl.js new file mode 100644 index 0000000..193591b --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/nl.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","nl",{access:"Script toegang",accessAlways:"Altijd",accessNever:"Nooit",accessSameDomain:"Zelfde domeinnaam",alignAbsBottom:"Absoluut-onder",alignAbsMiddle:"Absoluut-midden",alignBaseline:"Basislijn",alignTextTop:"Boven tekst",bgcolor:"Achtergrondkleur",chkFull:"Schermvullend toestaan",chkLoop:"Herhalen",chkMenu:"Flashmenu's inschakelen",chkPlay:"Automatisch afspelen",flashvars:"Variabelen voor Flash",hSpace:"HSpace",properties:"Eigenschappen Flash",propertiesTab:"Eigenschappen", +quality:"Kwaliteit",qualityAutoHigh:"Automatisch hoog",qualityAutoLow:"Automatisch laag",qualityBest:"Beste",qualityHigh:"Hoog",qualityLow:"Laag",qualityMedium:"Gemiddeld",scale:"Schaal",scaleAll:"Alles tonen",scaleFit:"Precies passend",scaleNoBorder:"Geen rand",title:"Eigenschappen Flash",vSpace:"VSpace",validateHSpace:"De HSpace moet een getal zijn.",validateSrc:"De URL mag niet leeg zijn.",validateVSpace:"De VSpace moet een getal zijn.",windowMode:"Venster modus",windowModeOpaque:"Ondoorzichtig", +windowModeTransparent:"Doorzichtig",windowModeWindow:"Venster"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/no.js b/bower_components/ckeditor/plugins/flash/lang/no.js new file mode 100644 index 0000000..4f660ce --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/no.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","no",{access:"Scripttilgang",accessAlways:"Alltid",accessNever:"Aldri",accessSameDomain:"Samme domene",alignAbsBottom:"Abs bunn",alignAbsMiddle:"Abs midten",alignBaseline:"Bunnlinje",alignTextTop:"Tekst topp",bgcolor:"Bakgrunnsfarge",chkFull:"Tillat fullskjerm",chkLoop:"Loop",chkMenu:"Slå på Flash-meny",chkPlay:"Autospill",flashvars:"Variabler for flash",hSpace:"HMarg",properties:"Egenskaper for Flash-objekt",propertiesTab:"Egenskaper",quality:"Kvalitet",qualityAutoHigh:"Auto høy", +qualityAutoLow:"Auto lav",qualityBest:"Best",qualityHigh:"Høy",qualityLow:"Lav",qualityMedium:"Medium",scale:"Skaler",scaleAll:"Vis alt",scaleFit:"Skaler til å passe",scaleNoBorder:"Ingen ramme",title:"Flash-egenskaper",vSpace:"VMarg",validateHSpace:"HMarg må være et tall.",validateSrc:"Vennligst skriv inn lenkens url.",validateVSpace:"VMarg må være et tall.",windowMode:"Vindumodus",windowModeOpaque:"Opaque",windowModeTransparent:"Gjennomsiktig",windowModeWindow:"Vindu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/pl.js b/bower_components/ckeditor/plugins/flash/lang/pl.js new file mode 100644 index 0000000..aa3da87 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/pl.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","pl",{access:"Dostęp skryptów",accessAlways:"Zawsze",accessNever:"Nigdy",accessSameDomain:"Ta sama domena",alignAbsBottom:"Do dołu",alignAbsMiddle:"Do środka w pionie",alignBaseline:"Do linii bazowej",alignTextTop:"Do góry tekstu",bgcolor:"Kolor tła",chkFull:"Zezwól na pełny ekran",chkLoop:"Pętla",chkMenu:"Włącz menu",chkPlay:"Autoodtwarzanie",flashvars:"Zmienne obiektu Flash",hSpace:"Odstęp poziomy",properties:"Właściwości obiektu Flash",propertiesTab:"Właściwości", +quality:"Jakość",qualityAutoHigh:"Auto wysoka",qualityAutoLow:"Auto niska",qualityBest:"Najlepsza",qualityHigh:"Wysoka",qualityLow:"Niska",qualityMedium:"Średnia",scale:"Skaluj",scaleAll:"Pokaż wszystko",scaleFit:"Dokładne dopasowanie",scaleNoBorder:"Bez obramowania",title:"Właściwości obiektu Flash",vSpace:"Odstęp pionowy",validateHSpace:"Odstęp poziomy musi być liczbą.",validateSrc:"Podaj adres URL",validateVSpace:"Odstęp pionowy musi być liczbą.",windowMode:"Tryb okna",windowModeOpaque:"Nieprzezroczyste", +windowModeTransparent:"Przezroczyste",windowModeWindow:"Okno"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/pt-br.js b/bower_components/ckeditor/plugins/flash/lang/pt-br.js new file mode 100644 index 0000000..4be3e14 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/pt-br.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","pt-br",{access:"Acesso ao script",accessAlways:"Sempre",accessNever:"Nunca",accessSameDomain:"Acessar Mesmo Domínio",alignAbsBottom:"Inferior Absoluto",alignAbsMiddle:"Centralizado Absoluto",alignBaseline:"Baseline",alignTextTop:"Superior Absoluto",bgcolor:"Cor do Plano de Fundo",chkFull:"Permitir tela cheia",chkLoop:"Tocar Infinitamente",chkMenu:"Habilita Menu Flash",chkPlay:"Tocar Automaticamente",flashvars:"Variáveis do Flash",hSpace:"HSpace",properties:"Propriedades do Flash", +propertiesTab:"Propriedades",quality:"Qualidade",qualityAutoHigh:"Qualidade Alta Automática",qualityAutoLow:"Qualidade Baixa Automática",qualityBest:"Qualidade Melhor",qualityHigh:"Qualidade Alta",qualityLow:"Qualidade Baixa",qualityMedium:"Qualidade Média",scale:"Escala",scaleAll:"Mostrar tudo",scaleFit:"Escala Exata",scaleNoBorder:"Sem Borda",title:"Propriedades do Flash",vSpace:"VSpace",validateHSpace:"O HSpace tem que ser um número",validateSrc:"Por favor, digite o endereço do link",validateVSpace:"O VSpace tem que ser um número.", +windowMode:"Modo da janela",windowModeOpaque:"Opaca",windowModeTransparent:"Transparente",windowModeWindow:"Janela"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/pt.js b/bower_components/ckeditor/plugins/flash/lang/pt.js new file mode 100644 index 0000000..374ffae --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/pt.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","pt",{access:"Acesso ao Script",accessAlways:"Sempre",accessNever:"Nunca",accessSameDomain:"Mesmo dominio",alignAbsBottom:"Abs inferior",alignAbsMiddle:"Abs centro",alignBaseline:"Linha de base",alignTextTop:"Topo do texto",bgcolor:"Cor de Fundo",chkFull:"Permitir Ecrã inteiro",chkLoop:"Loop",chkMenu:"Permitir Menu do Flash",chkPlay:"Reproduzir automaticamente",flashvars:"Variaveis para o Flash",hSpace:"Esp.Horiz",properties:"Propriedades do Flash",propertiesTab:"Propriedades", +quality:"Qualidade",qualityAutoHigh:"Alta Automaticamente",qualityAutoLow:"Baixa Automaticamente",qualityBest:"Melhor",qualityHigh:"Alta",qualityLow:"Baixa",qualityMedium:"Média",scale:"Escala",scaleAll:"Mostrar tudo",scaleFit:"Tamanho Exacto",scaleNoBorder:"Sem Limites",title:"Propriedades do Flash",vSpace:"Esp.Vert",validateHSpace:"HSpace tem de ser um numero.",validateSrc:"Por favor introduza a hiperligação URL",validateVSpace:"VSpace tem de ser um numero.",windowMode:"Modo de janela",windowModeOpaque:"Opaco", +windowModeTransparent:"Transparente",windowModeWindow:"Janela"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/ro.js b/bower_components/ckeditor/plugins/flash/lang/ro.js new file mode 100644 index 0000000..8be6b18 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/ro.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","ro",{access:"Acces script",accessAlways:"Întotdeauna",accessNever:"Niciodată",accessSameDomain:"Același domeniu",alignAbsBottom:"Jos absolut (Abs Bottom)",alignAbsMiddle:"Mijloc absolut (Abs Middle)",alignBaseline:"Linia de jos (Baseline)",alignTextTop:"Text sus",bgcolor:"Coloarea fundalului",chkFull:"Permite pe tot ecranul",chkLoop:"Repetă (Loop)",chkMenu:"Activează meniul flash",chkPlay:"Rulează automat",flashvars:"Variabile pentru flash",hSpace:"HSpace",properties:"Proprietăţile flashului", +propertiesTab:"Proprietăți",quality:"Calitate",qualityAutoHigh:"Auto înaltă",qualityAutoLow:"Auto Joasă",qualityBest:"Cea mai bună",qualityHigh:"Înaltă",qualityLow:"Joasă",qualityMedium:"Medie",scale:"Scală",scaleAll:"Arată tot",scaleFit:"Potriveşte",scaleNoBorder:"Fără bordură (No border)",title:"Proprietăţile flashului",vSpace:"VSpace",validateHSpace:"Hspace trebuie să fie un număr.",validateSrc:"Vă rugăm să scrieţi URL-ul",validateVSpace:"VSpace trebuie să fie un număr",windowMode:"Mod fereastră", +windowModeOpaque:"Opacă",windowModeTransparent:"Transparentă",windowModeWindow:"Fereastră"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/ru.js b/bower_components/ckeditor/plugins/flash/lang/ru.js new file mode 100644 index 0000000..d4f39fb --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/ru.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","ru",{access:"Доступ к скриптам",accessAlways:"Всегда",accessNever:"Никогда",accessSameDomain:"В том же домене",alignAbsBottom:"По низу текста",alignAbsMiddle:"По середине текста",alignBaseline:"По базовой линии",alignTextTop:"По верху текста",bgcolor:"Цвет фона",chkFull:"Разрешить полноэкранный режим",chkLoop:"Повторять",chkMenu:"Включить меню Flash",chkPlay:"Автоматическое воспроизведение",flashvars:"Переменные для Flash",hSpace:"Гориз. отступ",properties:"Свойства Flash", +propertiesTab:"Свойства",quality:"Качество",qualityAutoHigh:"Запуск на высоком",qualityAutoLow:"Запуск на низком",qualityBest:"Лучшее",qualityHigh:"Высокое",qualityLow:"Низкое",qualityMedium:"Среднее",scale:"Масштабировать",scaleAll:"Пропорционально",scaleFit:"Заполнять",scaleNoBorder:"Заходить за границы",title:"Свойства Flash",vSpace:"Вертик. отступ",validateHSpace:"Горизонтальный отступ задается числом.",validateSrc:"Вы должны ввести ссылку",validateVSpace:"Вертикальный отступ задается числом.", +windowMode:"Взаимодействие с окном",windowModeOpaque:"Непрозрачный",windowModeTransparent:"Прозрачный",windowModeWindow:"Обычный"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/si.js b/bower_components/ckeditor/plugins/flash/lang/si.js new file mode 100644 index 0000000..6184682 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/si.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","si",{access:"පිටපත් ප්‍රවේශය",accessAlways:"හැමවිටම",accessNever:"කිසිදා නොවේ",accessSameDomain:"එකම වසමේ",alignAbsBottom:"පතුල",alignAbsMiddle:"Abs ",alignBaseline:"පාද රේඛාව",alignTextTop:"වගන්තිය ඉහල",bgcolor:"පසුබිම් වර්ණය",chkFull:"පුර්ණ තිරය සදහා අවසර",chkLoop:"පුඩුව",chkMenu:"සක්‍රිය බබලන මෙනුව",chkPlay:"ස්‌වයංක්‍රිය ක්‍රියාත්මක වීම",flashvars:"වෙනස්වන දත්ත",hSpace:"HSpace",properties:"බබලන ගුණ",propertiesTab:"ගුණ",quality:"තත්වය",qualityAutoHigh:"ස්‌වයංක්‍රිය ", +qualityAutoLow:" ස්‌වයංක්‍රිය ",qualityBest:"වඩාත් ගැලපෙන",qualityHigh:"ඉහළ",qualityLow:"පහළ",qualityMedium:"මධ්‍ය",scale:"පරිමාණ",scaleAll:"සියල්ල ",scaleFit:"හරියටම ගැලපෙන",scaleNoBorder:"මාඉම් නොමැති",title:"බබලන ",vSpace:"VSpace",validateHSpace:"HSpace සංක්‍යාවක් විය යුතුය.",validateSrc:"URL හිස් නොවිය ",validateVSpace:"VSpace සංක්‍යාවක් විය යුතුය",windowMode:"ජනෙල ක්‍රමය",windowModeOpaque:"විනිවිද පෙනෙන",windowModeTransparent:"විනිවිද පෙනෙන",windowModeWindow:"ජනෙල"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/sk.js b/bower_components/ckeditor/plugins/flash/lang/sk.js new file mode 100644 index 0000000..e959ca0 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/sk.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","sk",{access:"Prístup skriptu",accessAlways:"Vždy",accessNever:"Nikdy",accessSameDomain:"Rovnaká doména",alignAbsBottom:"Úplne dole",alignAbsMiddle:"Do stredu",alignBaseline:"Na základnú čiaru",alignTextTop:"Na horný okraj textu",bgcolor:"Farba pozadia",chkFull:"Povoliť zobrazenie na celú obrazovku (fullscreen)",chkLoop:"Opakovanie",chkMenu:"Povoliť Flash Menu",chkPlay:"Automatické prehrávanie",flashvars:"Premenné pre Flash",hSpace:"H-medzera",properties:"Vlastnosti Flashu", +propertiesTab:"Vlastnosti",quality:"Kvalita",qualityAutoHigh:"Automaticky vysoká",qualityAutoLow:"Automaticky nízka",qualityBest:"Najlepšia",qualityHigh:"Vysoká",qualityLow:"Nízka",qualityMedium:"Stredná",scale:"Mierka",scaleAll:"Zobraziť všetko",scaleFit:"Roztiahnuť, aby sedelo presne",scaleNoBorder:"Bez okrajov",title:"Vlastnosti Flashu",vSpace:"V-medzera",validateHSpace:"H-medzera musí byť číslo.",validateSrc:"URL nesmie byť prázdne.",validateVSpace:"V-medzera musí byť číslo",windowMode:"Mód okna", +windowModeOpaque:"Nepriehľadný",windowModeTransparent:"Priehľadný",windowModeWindow:"Okno"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/sl.js b/bower_components/ckeditor/plugins/flash/lang/sl.js new file mode 100644 index 0000000..3de6413 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/sl.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","sl",{access:"Dostop skript",accessAlways:"Vedno",accessNever:"Nikoli",accessSameDomain:"Samo ista domena",alignAbsBottom:"Popolnoma na dno",alignAbsMiddle:"Popolnoma v sredino",alignBaseline:"Na osnovno črto",alignTextTop:"Besedilo na vrh",bgcolor:"Barva ozadja",chkFull:"Dovoli celozaslonski način",chkLoop:"Ponavljanje",chkMenu:"Omogoči Flash Meni",chkPlay:"Samodejno predvajaj",flashvars:"Spremenljivke za Flash",hSpace:"Vodoravni razmik",properties:"Lastnosti Flash", +propertiesTab:"Lastnosti",quality:"Kakovost",qualityAutoHigh:"Samodejno visoka",qualityAutoLow:"Samodejno nizka",qualityBest:"Najvišja",qualityHigh:"Visoka",qualityLow:"Nizka",qualityMedium:"Srednja",scale:"Povečava",scaleAll:"Pokaži vse",scaleFit:"Natančno prileganje",scaleNoBorder:"Brez obrobe",title:"Lastnosti Flash",vSpace:"Navpični razmik",validateHSpace:"Vodoravni razmik mora biti število.",validateSrc:"Vnesite URL povezave",validateVSpace:"Navpični razmik mora biti število.",windowMode:"Vrsta okna", +windowModeOpaque:"Motno",windowModeTransparent:"Prosojno",windowModeWindow:"Okno"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/sq.js b/bower_components/ckeditor/plugins/flash/lang/sq.js new file mode 100644 index 0000000..bded527 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/sq.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","sq",{access:"Qasja në Skriptë",accessAlways:"Gjithnjë",accessNever:"Asnjëherë",accessSameDomain:"Fusha e Njëjtë",alignAbsBottom:"Abs në Fund",alignAbsMiddle:"Abs në Mes",alignBaseline:"Baza",alignTextTop:"Koka e Tekstit",bgcolor:"Ngjyra e Prapavijës",chkFull:"Lejo Ekran të Plotë",chkLoop:"Përsëritje",chkMenu:"Lejo Menynë për Flash",chkPlay:"Auto Play",flashvars:"Variablat për Flash",hSpace:"Hapësira Horizontale",properties:"Karakteristikat për Flash",propertiesTab:"Karakteristikat", +quality:"Kualiteti",qualityAutoHigh:"Automatikisht i Lartë",qualityAutoLow:"Automatikisht i Ulët",qualityBest:"Më i Miri",qualityHigh:"I Lartë",qualityLow:"Më i Ulti",qualityMedium:"I Mesëm",scale:"Shkalla",scaleAll:"Shfaq të Gjitha",scaleFit:"Përputhje të Plotë",scaleNoBorder:"Pa Kornizë",title:"Rekuizitat për Flash",vSpace:"Hapësira Vertikale",validateHSpace:"Hapësira Horizontale duhet të është numër.",validateSrc:"URL nuk duhet mbetur zbrazur.",validateVSpace:"Hapësira Vertikale duhet të është numër.", +windowMode:"Window mode",windowModeOpaque:"Errët",windowModeTransparent:"Tejdukshëm",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/sr-latn.js b/bower_components/ckeditor/plugins/flash/lang/sr-latn.js new file mode 100644 index 0000000..641140c --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/sr-latn.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","sr-latn",{access:"Script Access",accessAlways:"Always",accessNever:"Never",accessSameDomain:"Same domain",alignAbsBottom:"Abs dole",alignAbsMiddle:"Abs sredina",alignBaseline:"Bazno",alignTextTop:"Vrh teksta",bgcolor:"Boja pozadine",chkFull:"Allow Fullscreen",chkLoop:"Ponavljaj",chkMenu:"Uključi fleš meni",chkPlay:"Automatski start",flashvars:"Variables for Flash",hSpace:"HSpace",properties:"Osobine fleša",propertiesTab:"Properties",quality:"Quality",qualityAutoHigh:"Auto High", +qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"Skaliraj",scaleAll:"Prikaži sve",scaleFit:"Popuni površinu",scaleNoBorder:"Bez ivice",title:"Osobine fleša",vSpace:"VSpace",validateHSpace:"HSpace must be a number.",validateSrc:"Unesite URL linka",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/sr.js b/bower_components/ckeditor/plugins/flash/lang/sr.js new file mode 100644 index 0000000..c62614d --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/sr.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","sr",{access:"Script Access",accessAlways:"Always",accessNever:"Never",accessSameDomain:"Same domain",alignAbsBottom:"Abs доле",alignAbsMiddle:"Abs средина",alignBaseline:"Базно",alignTextTop:"Врх текста",bgcolor:"Боја позадине",chkFull:"Allow Fullscreen",chkLoop:"Понављај",chkMenu:"Укључи флеш мени",chkPlay:"Аутоматски старт",flashvars:"Variables for Flash",hSpace:"HSpace",properties:"Особине Флеша",propertiesTab:"Properties",quality:"Quality",qualityAutoHigh:"Auto High", +qualityAutoLow:"Auto Low",qualityBest:"Best",qualityHigh:"High",qualityLow:"Low",qualityMedium:"Medium",scale:"Скалирај",scaleAll:"Прикажи све",scaleFit:"Попуни површину",scaleNoBorder:"Без ивице",title:"Особине флеша",vSpace:"VSpace",validateHSpace:"HSpace must be a number.",validateSrc:"Унесите УРЛ линка",validateVSpace:"VSpace must be a number.",windowMode:"Window mode",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent",windowModeWindow:"Window"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/sv.js b/bower_components/ckeditor/plugins/flash/lang/sv.js new file mode 100644 index 0000000..7c6edcc --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/sv.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","sv",{access:"Script-tillgång",accessAlways:"Alltid",accessNever:"Aldrig",accessSameDomain:"Samma domän",alignAbsBottom:"Absolut nederkant",alignAbsMiddle:"Absolut centrering",alignBaseline:"Baslinje",alignTextTop:"Text överkant",bgcolor:"Bakgrundsfärg",chkFull:"Tillåt helskärm",chkLoop:"Upprepa/Loopa",chkMenu:"Aktivera Flashmeny",chkPlay:"Automatisk uppspelning",flashvars:"Variabler för Flash",hSpace:"Horis. marginal",properties:"Flashegenskaper",propertiesTab:"Egenskaper", +quality:"Kvalitet",qualityAutoHigh:"Auto Hög",qualityAutoLow:"Auto Låg",qualityBest:"Bäst",qualityHigh:"Hög",qualityLow:"Låg",qualityMedium:"Medium",scale:"Skala",scaleAll:"Visa allt",scaleFit:"Exakt passning",scaleNoBorder:"Ingen ram",title:"Flashegenskaper",vSpace:"Vert. marginal",validateHSpace:"HSpace måste vara ett nummer.",validateSrc:"Var god ange länkens URL",validateVSpace:"VSpace måste vara ett nummer.",windowMode:"Fönsterläge",windowModeOpaque:"Opaque",windowModeTransparent:"Transparent", +windowModeWindow:"Fönster"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/th.js b/bower_components/ckeditor/plugins/flash/lang/th.js new file mode 100644 index 0000000..4993234 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/th.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","th",{access:"การเข้าถึงสคริปต์",accessAlways:"ตลอดไป",accessNever:"ไม่เลย",accessSameDomain:"โดเมนเดียวกัน",alignAbsBottom:"ชิดด้านล่างสุด",alignAbsMiddle:"กึ่งกลาง",alignBaseline:"ชิดบรรทัด",alignTextTop:"ใต้ตัวอักษร",bgcolor:"สีพื้นหลัง",chkFull:"อนุญาตให้แสดงเต็มหน้าจอได้",chkLoop:"เล่นวนรอบ Loop",chkMenu:"ให้ใช้งานเมนูของ Flash",chkPlay:"เล่นอัตโนมัติ Auto Play",flashvars:"ตัวแปรสำหรับ Flas",hSpace:"ระยะแนวนอน",properties:"คุณสมบัติของไฟล์ Flash",propertiesTab:"คุณสมบัติ", +quality:"คุณภาพ",qualityAutoHigh:"ปรับคุณภาพสูงอัตโนมัติ",qualityAutoLow:"ปรับคุณภาพต่ำอัตโนมัติ",qualityBest:"ดีที่สุด",qualityHigh:"สูง",qualityLow:"ต่ำ",qualityMedium:"ปานกลาง",scale:"อัตราส่วน Scale",scaleAll:"แสดงให้เห็นทั้งหมด Show all",scaleFit:"แสดงให้พอดีกับพื้นที่ Exact Fit",scaleNoBorder:"ไม่แสดงเส้นขอบ No Border",title:"คุณสมบัติของไฟล์ Flash",vSpace:"ระยะแนวตั้ง",validateHSpace:"HSpace ต้องเป็นจำนวนตัวเลข",validateSrc:"กรุณาระบุที่อยู่อ้างอิงออนไลน์ (URL)",validateVSpace:"VSpace ต้องเป็นจำนวนตัวเลข", +windowMode:"โหมดหน้าต่าง",windowModeOpaque:"ความทึบแสง",windowModeTransparent:"ความโปรงแสง",windowModeWindow:"หน้าต่าง"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/tr.js b/bower_components/ckeditor/plugins/flash/lang/tr.js new file mode 100644 index 0000000..8d76aa2 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/tr.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","tr",{access:"Kod İzni",accessAlways:"Herzaman",accessNever:"Asla",accessSameDomain:"Aynı domain",alignAbsBottom:"Tam Altı",alignAbsMiddle:"Tam Ortası",alignBaseline:"Taban Çizgisi",alignTextTop:"Yazı Tepeye",bgcolor:"Arka Renk",chkFull:"Tam ekrana İzinver",chkLoop:"Döngü",chkMenu:"Flash Menüsünü Kullan",chkPlay:"Otomatik Oynat",flashvars:"Flash Değerleri",hSpace:"Yatay Boşluk",properties:"Flash Özellikleri",propertiesTab:"Özellikler",quality:"Kalite",qualityAutoHigh:"Otomatik Yükseklik", +qualityAutoLow:"Otomatik Düşüklük",qualityBest:"En iyi",qualityHigh:"Yüksek",qualityLow:"Düşük",qualityMedium:"Orta",scale:"Boyutlandır",scaleAll:"Hepsini Göster",scaleFit:"Tam Sığdır",scaleNoBorder:"Kenar Yok",title:"Flash Özellikleri",vSpace:"Dikey Boşluk",validateHSpace:"HSpace sayı olmalıdır.",validateSrc:"Lütfen köprü URL'sini yazın",validateVSpace:"VSpace sayı olmalıdır.",windowMode:"Pencere modu",windowModeOpaque:"Opak",windowModeTransparent:"Şeffaf",windowModeWindow:"Pencere"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/tt.js b/bower_components/ckeditor/plugins/flash/lang/tt.js new file mode 100644 index 0000000..0b0c570 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/tt.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","tt",{access:"Script Access",accessAlways:"Һəрвакыт",accessNever:"Беркайчан да",accessSameDomain:"Same domain",alignAbsBottom:"Иң аска",alignAbsMiddle:"Төгәл уртада",alignBaseline:"Таяныч сызыгы",alignTextTop:"Текст өсте",bgcolor:"Фон төсе",chkFull:"Allow Fullscreen",chkLoop:"Әйләнеш",chkMenu:"Enable Flash Menu",chkPlay:"Auto Play",flashvars:"Variables for Flash",hSpace:"HSpace",properties:"Флеш үзлекләре",propertiesTab:"Үзлекләр",quality:"Сыйфат",qualityAutoHigh:"Авто югары сыйфат", +qualityAutoLow:"Авто түбән сыйфат",qualityBest:"Иң югары сыйфат",qualityHigh:"Югары",qualityLow:"Түбəн",qualityMedium:"Уртача",scale:"Scale",scaleAll:"Барысын күрсәтү",scaleFit:"Exact Fit",scaleNoBorder:"Чиксез",title:"Флеш үзлекләре",vSpace:"VSpace",validateHSpace:"HSpace must be a number.",validateSrc:"URL must not be empty.",validateVSpace:"VSpace must be a number.",windowMode:"Тəрəзə тәртибе",windowModeOpaque:"Үтә күренмәле",windowModeTransparent:"Үтə күренмəле",windowModeWindow:"Тəрəзə"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/ug.js b/bower_components/ckeditor/plugins/flash/lang/ug.js new file mode 100644 index 0000000..36bdb42 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/ug.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","ug",{access:"قوليازما زىيارەتكە يول قوي",accessAlways:"ھەمىشە",accessNever:"ھەرگىز",accessSameDomain:"ئوخشاش دائىرىدە",alignAbsBottom:"مۇتلەق ئاستى",alignAbsMiddle:"مۇتلەق ئوتتۇرا",alignBaseline:"ئاساسىي سىزىق",alignTextTop:"تېكىست ئۈستىدە",bgcolor:"تەگلىك رەڭگى",chkFull:"پۈتۈن ئېكراننى قوزغات",chkLoop:"دەۋرىي",chkMenu:"Flash تىزىملىكنى قوزغات",chkPlay:"ئۆزلۈكىدىن چال",flashvars:"Flash ئۆزگەرگۈچى",hSpace:"توغرىسىغا ئارىلىق",properties:"Flash خاسلىق",propertiesTab:"خاسلىق", +quality:"سۈپەت",qualityAutoHigh:"يۇقىرى (ئاپتوماتىك)",qualityAutoLow:"تۆۋەن (ئاپتوماتىك)",qualityBest:"ئەڭ ياخشى",qualityHigh:"يۇقىرى",qualityLow:"تۆۋەن",qualityMedium:"ئوتتۇرا (ئاپتوماتىك)",scale:"نىسبىتى",scaleAll:"ھەممىنى كۆرسەت",scaleFit:"قەتئىي ماسلىشىش",scaleNoBorder:"گىرۋەك يوق",title:"ماۋزۇ",vSpace:"بويىغا ئارىلىق",validateHSpace:"توغرىسىغا ئارىلىق چوقۇم سان بولىدۇ",validateSrc:"ئەسلى ھۆججەت ئادرېسىنى كىرگۈزۈڭ",validateVSpace:"بويىغا ئارىلىق چوقۇم سان بولىدۇ",windowMode:"كۆزنەك ھالىتى",windowModeOpaque:"خىرە", +windowModeTransparent:"سۈزۈك",windowModeWindow:"كۆزنەك گەۋدىسى"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/uk.js b/bower_components/ckeditor/plugins/flash/lang/uk.js new file mode 100644 index 0000000..cc458da --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/uk.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","uk",{access:"Доступ до скрипта",accessAlways:"Завжди",accessNever:"Ніколи",accessSameDomain:"З того ж домена",alignAbsBottom:"По нижньому краю (abs)",alignAbsMiddle:"По середині (abs)",alignBaseline:"По базовій лінії",alignTextTop:"Текст по верхньому краю",bgcolor:"Колір фону",chkFull:"Дозволити повноекранний перегляд",chkLoop:"Циклічно",chkMenu:"Дозволити меню Flash",chkPlay:"Автопрогравання",flashvars:"Змінні Flash",hSpace:"Гориз. відступ",properties:"Властивості Flash", +propertiesTab:"Властивості",quality:"Якість",qualityAutoHigh:"Автом. відмінна",qualityAutoLow:"Автом. низька",qualityBest:"Відмінна",qualityHigh:"Висока",qualityLow:"Низька",qualityMedium:"Середня",scale:"Масштаб",scaleAll:"Показати все",scaleFit:"Поч. розмір",scaleNoBorder:"Без рамки",title:"Властивості Flash",vSpace:"Верт. відступ",validateHSpace:"Гориз. відступ повинен бути цілим числом.",validateSrc:"Будь ласка, вкажіть URL посилання",validateVSpace:"Верт. відступ повинен бути цілим числом.", +windowMode:"Віконний режим",windowModeOpaque:"Непрозорість",windowModeTransparent:"Прозорість",windowModeWindow:"Вікно"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/vi.js b/bower_components/ckeditor/plugins/flash/lang/vi.js new file mode 100644 index 0000000..17a0c1b --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/vi.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("flash","vi",{access:"Truy cập mã",accessAlways:"Luôn luôn",accessNever:"Không bao giờ",accessSameDomain:"Cùng tên miền",alignAbsBottom:"Dưới tuyệt đối",alignAbsMiddle:"Giữa tuyệt đối",alignBaseline:"Đường cơ sở",alignTextTop:"Phía trên chữ",bgcolor:"Màu nền",chkFull:"Cho phép toàn màn hình",chkLoop:"Lặp",chkMenu:"Cho phép bật menu của Flash",chkPlay:"Tự động chạy",flashvars:"Các biến số dành cho Flash",hSpace:"Khoảng đệm ngang",properties:"Thuộc tính Flash",propertiesTab:"Thuộc tính", +quality:"Chất lượng",qualityAutoHigh:"Cao tự động",qualityAutoLow:"Thấp tự động",qualityBest:"Tốt nhất",qualityHigh:"Cao",qualityLow:"Thấp",qualityMedium:"Trung bình",scale:"Tỷ lệ",scaleAll:"Hiển thị tất cả",scaleFit:"Vừa vặn",scaleNoBorder:"Không đường viền",title:"Thuộc tính Flash",vSpace:"Khoảng đệm dọc",validateHSpace:"Khoảng đệm ngang phải là số nguyên.",validateSrc:"Hãy đưa vào đường dẫn liên kết",validateVSpace:"Khoảng đệm dọc phải là số nguyên.",windowMode:"Chế độ cửa sổ",windowModeOpaque:"Mờ đục", +windowModeTransparent:"Trong suốt",windowModeWindow:"Cửa sổ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/zh-cn.js b/bower_components/ckeditor/plugins/flash/lang/zh-cn.js new file mode 100644 index 0000000..d7be33b --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/zh-cn.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","zh-cn",{access:"允许脚本访问",accessAlways:"总是",accessNever:"从不",accessSameDomain:"同域",alignAbsBottom:"绝对底部",alignAbsMiddle:"绝对居中",alignBaseline:"基线",alignTextTop:"文本上方",bgcolor:"背景颜色",chkFull:"启用全屏",chkLoop:"循环",chkMenu:"启用 Flash 菜单",chkPlay:"自动播放",flashvars:"Flash 变量",hSpace:"水平间距",properties:"Flash 属性",propertiesTab:"属性",quality:"质量",qualityAutoHigh:"高(自动)",qualityAutoLow:"低(自动)",qualityBest:"最好",qualityHigh:"高",qualityLow:"低",qualityMedium:"中(自动)",scale:"缩放",scaleAll:"全部显示", +scaleFit:"严格匹配",scaleNoBorder:"无边框",title:"标题",vSpace:"垂直间距",validateHSpace:"水平间距必须为数字格式",validateSrc:"请输入源文件地址",validateVSpace:"垂直间距必须为数字格式",windowMode:"窗体模式",windowModeOpaque:"不透明",windowModeTransparent:"透明",windowModeWindow:"窗体"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/lang/zh.js b/bower_components/ckeditor/plugins/flash/lang/zh.js new file mode 100644 index 0000000..83af682 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/lang/zh.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("flash","zh",{access:"腳本存取",accessAlways:"永遠",accessNever:"從不",accessSameDomain:"相同網域",alignAbsBottom:"絕對下方",alignAbsMiddle:"絕對置中",alignBaseline:"基準線",alignTextTop:"上層文字",bgcolor:"背景顏色",chkFull:"允許全螢幕",chkLoop:"重複播放",chkMenu:"啟用 Flash 選單",chkPlay:"自動播放",flashvars:"Flash 變數",hSpace:"HSpace",properties:"Flash 屬性​​",propertiesTab:"屬性",quality:"品質",qualityAutoHigh:"自動高",qualityAutoLow:"自動低",qualityBest:"最佳",qualityHigh:"高",qualityLow:"低",qualityMedium:"中",scale:"縮放比例",scaleAll:"全部顯示", +scaleFit:"最適化",scaleNoBorder:"無框線",title:"Flash 屬性​​",vSpace:"VSpace",validateHSpace:"HSpace 必須為數字。",validateSrc:"URL 不可為空白。",validateVSpace:"VSpace 必須為數字。",windowMode:"視窗模式",windowModeOpaque:"不透明",windowModeTransparent:"透明",windowModeWindow:"視窗"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/flash/plugin.js b/bower_components/ckeditor/plugins/flash/plugin.js new file mode 100644 index 0000000..2210185 --- /dev/null +++ b/bower_components/ckeditor/plugins/flash/plugin.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function d(a){a=a.attributes;return"application/x-shockwave-flash"==a.type||f.test(a.src||"")}function e(a,b){return a.createFakeParserElement(b,"cke_flash","flash",!0)}var f=/\.swf(?:$|\?)/i;CKEDITOR.plugins.add("flash",{requires:"dialog,fakeobjects",lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"flash", +hidpi:!0,onLoad:function(){CKEDITOR.addCss("img.cke_flash{background-image: url("+CKEDITOR.getUrl(this.path+"images/placeholder.png")+");background-position: center center;background-repeat: no-repeat;border: 1px solid #a9a9a9;width: 80px;height: 80px;}")},init:function(a){var b="object[classid,codebase,height,hspace,vspace,width];param[name,value];embed[height,hspace,pluginspage,src,type,vspace,width]";CKEDITOR.dialog.isTabEnabled(a,"flash","properties")&&(b+=";object[align]; embed[allowscriptaccess,quality,scale,wmode]"); +CKEDITOR.dialog.isTabEnabled(a,"flash","advanced")&&(b+=";object[id]{*}; embed[bgcolor]{*}(*)");a.addCommand("flash",new CKEDITOR.dialogCommand("flash",{allowedContent:b,requiredContent:"embed"}));a.ui.addButton&&a.ui.addButton("Flash",{label:a.lang.common.flash,command:"flash",toolbar:"insert,20"});CKEDITOR.dialog.add("flash",this.path+"dialogs/flash.js");a.addMenuItems&&a.addMenuItems({flash:{label:a.lang.flash.properties,command:"flash",group:"flash"}});a.on("doubleclick",function(a){var b=a.data.element; +b.is("img")&&"flash"==b.data("cke-real-element-type")&&(a.data.dialog="flash")});a.contextMenu&&a.contextMenu.addListener(function(a){if(a&&a.is("img")&&!a.isReadOnly()&&"flash"==a.data("cke-real-element-type"))return{flash:CKEDITOR.TRISTATE_OFF}})},afterInit:function(a){var b=a.dataProcessor;(b=b&&b.dataFilter)&&b.addRules({elements:{"cke:object":function(b){var c=b.attributes;if((!c.classid||!(""+c.classid).toLowerCase())&&!d(b)){for(c=0;c<b.children.length;c++)if("cke:embed"==b.children[c].name){if(!d(b.children[c]))break; +return e(a,b)}return null}return e(a,b)},"cke:embed":function(b){return!d(b)?null:e(a,b)}}},5)}})})();CKEDITOR.tools.extend(CKEDITOR.config,{flashEmbedTagOnly:!1,flashAddEmbedTag:!0,flashConvertOnEdit:!1}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/af.js b/bower_components/ckeditor/plugins/font/lang/af.js new file mode 100644 index 0000000..0473fe9 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","af",{fontSize:{label:"Grootte",voiceLabel:"Fontgrootte",panelTitle:"Fontgrootte"},label:"Font",panelTitle:"Fontnaam",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/ar.js b/bower_components/ckeditor/plugins/font/lang/ar.js new file mode 100644 index 0000000..cf81e27 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","ar",{fontSize:{label:"حجم الخط",voiceLabel:"حجم الخط",panelTitle:"حجم الخط"},label:"خط",panelTitle:"حجم الخط",voiceLabel:"حجم الخط"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/bg.js b/bower_components/ckeditor/plugins/font/lang/bg.js new file mode 100644 index 0000000..62e05fe --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","bg",{fontSize:{label:"Размер",voiceLabel:"Размер на шрифт",panelTitle:"Размер на шрифт"},label:"Шрифт",panelTitle:"Име на шрифт",voiceLabel:"Шрифт"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/bn.js b/bower_components/ckeditor/plugins/font/lang/bn.js new file mode 100644 index 0000000..98cd270 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","bn",{fontSize:{label:"সাইজ",voiceLabel:"Font Size",panelTitle:"সাইজ"},label:"ফন্ট",panelTitle:"ফন্ট",voiceLabel:"ফন্ট"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/bs.js b/bower_components/ckeditor/plugins/font/lang/bs.js new file mode 100644 index 0000000..171cdc1 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","bs",{fontSize:{label:"Velièina",voiceLabel:"Font Size",panelTitle:"Velièina"},label:"Font",panelTitle:"Font",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/ca.js b/bower_components/ckeditor/plugins/font/lang/ca.js new file mode 100644 index 0000000..b710fa7 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","ca",{fontSize:{label:"Mida",voiceLabel:"Mida de la lletra",panelTitle:"Mida de la lletra"},label:"Tipus de lletra",panelTitle:"Tipus de lletra",voiceLabel:"Tipus de lletra"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/cs.js b/bower_components/ckeditor/plugins/font/lang/cs.js new file mode 100644 index 0000000..31c3d38 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","cs",{fontSize:{label:"Velikost",voiceLabel:"Velikost písma",panelTitle:"Velikost"},label:"Písmo",panelTitle:"Písmo",voiceLabel:"Písmo"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/cy.js b/bower_components/ckeditor/plugins/font/lang/cy.js new file mode 100644 index 0000000..d85cdff --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","cy",{fontSize:{label:"Maint",voiceLabel:"Maint y Ffont",panelTitle:"Maint y Ffont"},label:"Ffont",panelTitle:"Enw'r Ffont",voiceLabel:"Ffont"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/da.js b/bower_components/ckeditor/plugins/font/lang/da.js new file mode 100644 index 0000000..24b0292 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","da",{fontSize:{label:"Skriftstørrelse",voiceLabel:"Skriftstørrelse",panelTitle:"Skriftstørrelse"},label:"Skrifttype",panelTitle:"Skrifttype",voiceLabel:"Skrifttype"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/de.js b/bower_components/ckeditor/plugins/font/lang/de.js new file mode 100644 index 0000000..71bd88d --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","de",{fontSize:{label:"Größe",voiceLabel:"Schrifgröße",panelTitle:"Größe"},label:"Schriftart",panelTitle:"Schriftart",voiceLabel:"Schriftart"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/el.js b/bower_components/ckeditor/plugins/font/lang/el.js new file mode 100644 index 0000000..ecb9a8b --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","el",{fontSize:{label:"Μέγεθος",voiceLabel:"Μέγεθος Γραμματοσειράς",panelTitle:"Μέγεθος Γραμματοσειράς"},label:"Γραμματοσειρά",panelTitle:"Όνομα Γραμματοσειράς",voiceLabel:"Γραμματοσειρά"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/en-au.js b/bower_components/ckeditor/plugins/font/lang/en-au.js new file mode 100644 index 0000000..8b19ae0 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","en-au",{fontSize:{label:"Size",voiceLabel:"Font Size",panelTitle:"Font Size"},label:"Font",panelTitle:"Font Name",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/en-ca.js b/bower_components/ckeditor/plugins/font/lang/en-ca.js new file mode 100644 index 0000000..a41715d --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","en-ca",{fontSize:{label:"Size",voiceLabel:"Font Size",panelTitle:"Font Size"},label:"Font",panelTitle:"Font Name",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/en-gb.js b/bower_components/ckeditor/plugins/font/lang/en-gb.js new file mode 100644 index 0000000..aa7fd0d --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","en-gb",{fontSize:{label:"Size",voiceLabel:"Font Size",panelTitle:"Font Size"},label:"Font",panelTitle:"Font Name",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/en.js b/bower_components/ckeditor/plugins/font/lang/en.js new file mode 100644 index 0000000..c332c07 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","en",{fontSize:{label:"Size",voiceLabel:"Font Size",panelTitle:"Font Size"},label:"Font",panelTitle:"Font Name",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/eo.js b/bower_components/ckeditor/plugins/font/lang/eo.js new file mode 100644 index 0000000..bf6f512 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","eo",{fontSize:{label:"Grado",voiceLabel:"Tipara grado",panelTitle:"Tipara grado"},label:"Tiparo",panelTitle:"Tipara nomo",voiceLabel:"Tiparo"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/es.js b/bower_components/ckeditor/plugins/font/lang/es.js new file mode 100644 index 0000000..c452c86 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","es",{fontSize:{label:"Tamaño",voiceLabel:"Tamaño de fuente",panelTitle:"Tamaño"},label:"Fuente",panelTitle:"Fuente",voiceLabel:"Fuente"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/et.js b/bower_components/ckeditor/plugins/font/lang/et.js new file mode 100644 index 0000000..76f2b07 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","et",{fontSize:{label:"Suurus",voiceLabel:"Kirja suurus",panelTitle:"Suurus"},label:"Kiri",panelTitle:"Kiri",voiceLabel:"Kiri"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/eu.js b/bower_components/ckeditor/plugins/font/lang/eu.js new file mode 100644 index 0000000..941c541 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","eu",{fontSize:{label:"Tamaina",voiceLabel:"Tamaina",panelTitle:"Tamaina"},label:"Letra-tipoa",panelTitle:"Letra-tipoa",voiceLabel:"Letra-tipoa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/fa.js b/bower_components/ckeditor/plugins/font/lang/fa.js new file mode 100644 index 0000000..b4b4cfc --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","fa",{fontSize:{label:"اندازه",voiceLabel:"اندازه قلم",panelTitle:"اندازه قلم"},label:"قلم",panelTitle:"نام قلم",voiceLabel:"قلم"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/fi.js b/bower_components/ckeditor/plugins/font/lang/fi.js new file mode 100644 index 0000000..59de601 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","fi",{fontSize:{label:"Koko",voiceLabel:"Kirjaisimen koko",panelTitle:"Koko"},label:"Kirjaisinlaji",panelTitle:"Kirjaisinlaji",voiceLabel:"Kirjaisinlaji"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/fo.js b/bower_components/ckeditor/plugins/font/lang/fo.js new file mode 100644 index 0000000..2080e02 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","fo",{fontSize:{label:"Skriftstødd",voiceLabel:"Skriftstødd",panelTitle:"Skriftstødd"},label:"Skrift",panelTitle:"Skrift",voiceLabel:"Skrift"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/fr-ca.js b/bower_components/ckeditor/plugins/font/lang/fr-ca.js new file mode 100644 index 0000000..bcf3fc1 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","fr-ca",{fontSize:{label:"Taille",voiceLabel:"Taille",panelTitle:"Taille"},label:"Police",panelTitle:"Police",voiceLabel:"Police"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/fr.js b/bower_components/ckeditor/plugins/font/lang/fr.js new file mode 100644 index 0000000..32486dc --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","fr",{fontSize:{label:"Taille",voiceLabel:"Taille de police",panelTitle:"Taille de police"},label:"Police",panelTitle:"Style de police",voiceLabel:"Police"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/gl.js b/bower_components/ckeditor/plugins/font/lang/gl.js new file mode 100644 index 0000000..74fdf0d --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","gl",{fontSize:{label:"Tamaño",voiceLabel:"Tamaño da letra",panelTitle:"Tamaño da letra"},label:"Tipo de letra",panelTitle:"Nome do tipo de letra",voiceLabel:"Tipo de letra"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/gu.js b/bower_components/ckeditor/plugins/font/lang/gu.js new file mode 100644 index 0000000..7c1a267 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","gu",{fontSize:{label:"ફૉન્ટ સાઇઝ/કદ",voiceLabel:"ફોન્ટ સાઈઝ",panelTitle:"ફૉન્ટ સાઇઝ/કદ"},label:"ફૉન્ટ",panelTitle:"ફૉન્ટ",voiceLabel:"ફોન્ટ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/he.js b/bower_components/ckeditor/plugins/font/lang/he.js new file mode 100644 index 0000000..a712a5a --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","he",{fontSize:{label:"גודל",voiceLabel:"גודל",panelTitle:"גודל"},label:"גופן",panelTitle:"גופן",voiceLabel:"גופן"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/hi.js b/bower_components/ckeditor/plugins/font/lang/hi.js new file mode 100644 index 0000000..2c66d5f --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","hi",{fontSize:{label:"साइज़",voiceLabel:"Font Size",panelTitle:"साइज़"},label:"फ़ॉन्ट",panelTitle:"फ़ॉन्ट",voiceLabel:"फ़ॉन्ट"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/hr.js b/bower_components/ckeditor/plugins/font/lang/hr.js new file mode 100644 index 0000000..4cb480d --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","hr",{fontSize:{label:"Veličina",voiceLabel:"Veličina slova",panelTitle:"Veličina"},label:"Font",panelTitle:"Font",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/hu.js b/bower_components/ckeditor/plugins/font/lang/hu.js new file mode 100644 index 0000000..e9edbdb --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","hu",{fontSize:{label:"Méret",voiceLabel:"Betűméret",panelTitle:"Méret"},label:"Betűtípus",panelTitle:"Betűtípus",voiceLabel:"Betűtípus"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/id.js b/bower_components/ckeditor/plugins/font/lang/id.js new file mode 100644 index 0000000..22b0307 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","id",{fontSize:{label:"Ukuran",voiceLabel:"Font Size",panelTitle:"Font Size"},label:"Font",panelTitle:"Font Name",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/is.js b/bower_components/ckeditor/plugins/font/lang/is.js new file mode 100644 index 0000000..9fbd17d --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","is",{fontSize:{label:"Leturstærð ",voiceLabel:"Font Size",panelTitle:"Leturstærð "},label:"Leturgerð ",panelTitle:"Leturgerð ",voiceLabel:"Leturgerð "}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/it.js b/bower_components/ckeditor/plugins/font/lang/it.js new file mode 100644 index 0000000..146a8fb --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","it",{fontSize:{label:"Dimensione",voiceLabel:"Dimensione Carattere",panelTitle:"Dimensione"},label:"Carattere",panelTitle:"Carattere",voiceLabel:"Carattere"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/ja.js b/bower_components/ckeditor/plugins/font/lang/ja.js new file mode 100644 index 0000000..c7e579e --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","ja",{fontSize:{label:"サイズ",voiceLabel:"フォントサイズ",panelTitle:"フォントサイズ"},label:"フォント",panelTitle:"フォント",voiceLabel:"フォント"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/ka.js b/bower_components/ckeditor/plugins/font/lang/ka.js new file mode 100644 index 0000000..a45a4b5 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","ka",{fontSize:{label:"ზომა",voiceLabel:"ტექსტის ზომა",panelTitle:"ტექსტის ზომა"},label:"ფონტი",panelTitle:"ფონტის სახელი",voiceLabel:"ფონტი"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/km.js b/bower_components/ckeditor/plugins/font/lang/km.js new file mode 100644 index 0000000..b817819 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","km",{fontSize:{label:"ទំហំ",voiceLabel:"ទំហំ​អក្សរ",panelTitle:"ទំហំ​អក្សរ"},label:"ពុម្ព​អក្សរ",panelTitle:"ឈ្មោះ​ពុម្ព​អក្សរ",voiceLabel:"ពុម្ព​អក្សរ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/ko.js b/bower_components/ckeditor/plugins/font/lang/ko.js new file mode 100644 index 0000000..b6b6621 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","ko",{fontSize:{label:"글자 크기",voiceLabel:"Font Size",panelTitle:"글자 크기"},label:"폰트",panelTitle:"폰트",voiceLabel:"폰트"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/ku.js b/bower_components/ckeditor/plugins/font/lang/ku.js new file mode 100644 index 0000000..9e2d558 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","ku",{fontSize:{label:"گەورەیی",voiceLabel:"گەورەیی فۆنت",panelTitle:"گەورەیی فۆنت"},label:"فۆنت",panelTitle:"ناوی فۆنت",voiceLabel:"فۆنت"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/lt.js b/bower_components/ckeditor/plugins/font/lang/lt.js new file mode 100644 index 0000000..c613a9d --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","lt",{fontSize:{label:"Šrifto dydis",voiceLabel:"Šrifto dydis",panelTitle:"Šrifto dydis"},label:"Šriftas",panelTitle:"Šriftas",voiceLabel:"Šriftas"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/lv.js b/bower_components/ckeditor/plugins/font/lang/lv.js new file mode 100644 index 0000000..023b054 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","lv",{fontSize:{label:"Izmērs",voiceLabel:"Fonta izmeŗs",panelTitle:"Izmērs"},label:"Šrifts",panelTitle:"Šrifts",voiceLabel:"Fonts"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/mk.js b/bower_components/ckeditor/plugins/font/lang/mk.js new file mode 100644 index 0000000..c47889e --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","mk",{fontSize:{label:"Size",voiceLabel:"Font Size",panelTitle:"Font Size"},label:"Font",panelTitle:"Font Name",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/mn.js b/bower_components/ckeditor/plugins/font/lang/mn.js new file mode 100644 index 0000000..855b36e --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","mn",{fontSize:{label:"Хэмжээ",voiceLabel:"Үсгийн хэмжээ",panelTitle:"Үсгийн хэмжээ"},label:"Үсгийн хэлбэр",panelTitle:"Үгсийн хэлбэрийн нэр",voiceLabel:"Үгсийн хэлбэр"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/ms.js b/bower_components/ckeditor/plugins/font/lang/ms.js new file mode 100644 index 0000000..bf2cac9 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","ms",{fontSize:{label:"Saiz",voiceLabel:"Font Size",panelTitle:"Saiz"},label:"Font",panelTitle:"Font",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/nb.js b/bower_components/ckeditor/plugins/font/lang/nb.js new file mode 100644 index 0000000..3e85a26 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","nb",{fontSize:{label:"Størrelse",voiceLabel:"Skriftstørrelse",panelTitle:"Skriftstørrelse"},label:"Skrift",panelTitle:"Skrift",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/nl.js b/bower_components/ckeditor/plugins/font/lang/nl.js new file mode 100644 index 0000000..301a942 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","nl",{fontSize:{label:"Lettergrootte",voiceLabel:"Lettergrootte",panelTitle:"Lettergrootte"},label:"Lettertype",panelTitle:"Lettertype",voiceLabel:"Lettertype"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/no.js b/bower_components/ckeditor/plugins/font/lang/no.js new file mode 100644 index 0000000..2e45e27 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","no",{fontSize:{label:"Størrelse",voiceLabel:"Font Størrelse",panelTitle:"Størrelse"},label:"Skrift",panelTitle:"Skrift",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/pl.js b/bower_components/ckeditor/plugins/font/lang/pl.js new file mode 100644 index 0000000..f15dd76 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","pl",{fontSize:{label:"Rozmiar",voiceLabel:"Rozmiar czcionki",panelTitle:"Rozmiar"},label:"Czcionka",panelTitle:"Czcionka",voiceLabel:"Czcionka"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/pt-br.js b/bower_components/ckeditor/plugins/font/lang/pt-br.js new file mode 100644 index 0000000..bfe0147 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","pt-br",{fontSize:{label:"Tamanho",voiceLabel:"Tamanho da fonte",panelTitle:"Tamanho"},label:"Fonte",panelTitle:"Fonte",voiceLabel:"Fonte"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/pt.js b/bower_components/ckeditor/plugins/font/lang/pt.js new file mode 100644 index 0000000..0bf67ff --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","pt",{fontSize:{label:"Tamanho",voiceLabel:"Tamanho da letra",panelTitle:"Tamanho da letra"},label:"Fonte",panelTitle:"Nome do Tipo de Letra",voiceLabel:"Tipo de Letra"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/ro.js b/bower_components/ckeditor/plugins/font/lang/ro.js new file mode 100644 index 0000000..2b10181 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","ro",{fontSize:{label:"Mărime",voiceLabel:"Font Size",panelTitle:"Mărime"},label:"Font",panelTitle:"Font",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/ru.js b/bower_components/ckeditor/plugins/font/lang/ru.js new file mode 100644 index 0000000..c540721 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","ru",{fontSize:{label:"Размер",voiceLabel:"Размер шрифта",panelTitle:"Размер шрифта"},label:"Шрифт",panelTitle:"Шрифт",voiceLabel:"Шрифт"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/si.js b/bower_components/ckeditor/plugins/font/lang/si.js new file mode 100644 index 0000000..c6246da --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","si",{fontSize:{label:"විශාලත්වය",voiceLabel:"අක්ෂර විශාලත්වය",panelTitle:"අක්ෂර විශාලත්වය"},label:"අක්ෂරය",panelTitle:"අක්ෂර නාමය",voiceLabel:"අක්ෂර"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/sk.js b/bower_components/ckeditor/plugins/font/lang/sk.js new file mode 100644 index 0000000..e09e8d4 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","sk",{fontSize:{label:"Veľkosť",voiceLabel:"Veľkosť písma",panelTitle:"Veľkosť písma"},label:"Font",panelTitle:"Názov fontu",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/sl.js b/bower_components/ckeditor/plugins/font/lang/sl.js new file mode 100644 index 0000000..061fea4 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","sl",{fontSize:{label:"Velikost",voiceLabel:"Velikost",panelTitle:"Velikost"},label:"Pisava",panelTitle:"Pisava",voiceLabel:"Pisava"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/sq.js b/bower_components/ckeditor/plugins/font/lang/sq.js new file mode 100644 index 0000000..c7c9593 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","sq",{fontSize:{label:"Madhësia",voiceLabel:"Madhësia e Shkronjës",panelTitle:"Madhësia e Shkronjës"},label:"Shkronja",panelTitle:"Emri i Shkronjës",voiceLabel:"Shkronja"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/sr-latn.js b/bower_components/ckeditor/plugins/font/lang/sr-latn.js new file mode 100644 index 0000000..87604c2 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","sr-latn",{fontSize:{label:"Veličina fonta",voiceLabel:"Font Size",panelTitle:"Veličina fonta"},label:"Font",panelTitle:"Font",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/sr.js b/bower_components/ckeditor/plugins/font/lang/sr.js new file mode 100644 index 0000000..5e2276d --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","sr",{fontSize:{label:"Величина фонта",voiceLabel:"Font Size",panelTitle:"Величина фонта"},label:"Фонт",panelTitle:"Фонт",voiceLabel:"Фонт"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/sv.js b/bower_components/ckeditor/plugins/font/lang/sv.js new file mode 100644 index 0000000..6eb9e8e --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","sv",{fontSize:{label:"Storlek",voiceLabel:"Teckenstorlek",panelTitle:"Teckenstorlek"},label:"Typsnitt",panelTitle:"Typsnitt",voiceLabel:"Typsnitt"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/th.js b/bower_components/ckeditor/plugins/font/lang/th.js new file mode 100644 index 0000000..464cab1 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","th",{fontSize:{label:"ขนาด",voiceLabel:"Font Size",panelTitle:"ขนาด"},label:"แบบอักษร",panelTitle:"แบบอักษร",voiceLabel:"แบบอักษร"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/tr.js b/bower_components/ckeditor/plugins/font/lang/tr.js new file mode 100644 index 0000000..424f665 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","tr",{fontSize:{label:"Boyut",voiceLabel:"Font Size",panelTitle:"Boyut"},label:"Yazı Türü",panelTitle:"Yazı Türü",voiceLabel:"Font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/tt.js b/bower_components/ckeditor/plugins/font/lang/tt.js new file mode 100644 index 0000000..623cbcb --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","tt",{fontSize:{label:"Зурлык",voiceLabel:"Шрифт зурлыклары",panelTitle:"Шрифт зурлыклары"},label:"Шрифт",panelTitle:"Шрифт исеме",voiceLabel:"Шрифт"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/ug.js b/bower_components/ckeditor/plugins/font/lang/ug.js new file mode 100644 index 0000000..235c677 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","ug",{fontSize:{label:"چوڭلۇقى",voiceLabel:"خەت چوڭلۇقى",panelTitle:"چوڭلۇقى"},label:"خەت نۇسخا",panelTitle:"خەت نۇسخا",voiceLabel:"خەت نۇسخا"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/uk.js b/bower_components/ckeditor/plugins/font/lang/uk.js new file mode 100644 index 0000000..8a2387f --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","uk",{fontSize:{label:"Розмір",voiceLabel:"Розмір шрифту",panelTitle:"Розмір"},label:"Шрифт",panelTitle:"Шрифт",voiceLabel:"Шрифт"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/vi.js b/bower_components/ckeditor/plugins/font/lang/vi.js new file mode 100644 index 0000000..e082b7b --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","vi",{fontSize:{label:"Cỡ chữ",voiceLabel:"Kích cỡ phông",panelTitle:"Cỡ chữ"},label:"Phông",panelTitle:"Phông",voiceLabel:"Phông"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/zh-cn.js b/bower_components/ckeditor/plugins/font/lang/zh-cn.js new file mode 100644 index 0000000..370710a --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","zh-cn",{fontSize:{label:"大小",voiceLabel:"文字大小",panelTitle:"大小"},label:"字体",panelTitle:"字体",voiceLabel:"字体"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/lang/zh.js b/bower_components/ckeditor/plugins/font/lang/zh.js new file mode 100644 index 0000000..a271681 --- /dev/null +++ b/bower_components/ckeditor/plugins/font/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("font","zh",{fontSize:{label:"大小",voiceLabel:"字型大小",panelTitle:"字型大小"},label:"字型",panelTitle:"字型名稱",voiceLabel:"字型"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/font/plugin.js b/bower_components/ckeditor/plugins/font/plugin.js new file mode 100644 index 0000000..ba9e70b --- /dev/null +++ b/bower_components/ckeditor/plugins/font/plugin.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function j(a,b,c,f,m,j,p,r){for(var s=a.config,n=new CKEDITOR.style(p),i=m.split(";"),m=[],k={},d=0;d<i.length;d++){var h=i[d];if(h){var h=h.split("/"),q={},l=i[d]=h[0];q[c]=m[d]=h[1]||l;k[l]=new CKEDITOR.style(p,q);k[l]._.definition.name=l}else i.splice(d--,1)}a.ui.addRichCombo(b,{label:f.label,title:f.panelTitle,toolbar:"styles,"+r,allowedContent:n,requiredContent:n,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(s.contentsCss),multiSelect:!1,attributes:{"aria-label":f.panelTitle}}, +init:function(){this.startGroup(f.panelTitle);for(var a=0;a<i.length;a++){var b=i[a];this.add(b,k[b].buildPreview(),b)}},onClick:function(b){a.focus();a.fire("saveSnapshot");var c=this.getValue(),f=k[b];if(c&&b!=c){var i=k[c],e=a.getSelection().getRanges()[0];if(e.collapsed){var d=a.elementPath(),g=d.contains(function(a){return i.checkElementRemovable(a)});if(g){var h=e.checkBoundaryOfElement(g,CKEDITOR.START),j=e.checkBoundaryOfElement(g,CKEDITOR.END);if(h&&j){for(h=e.createBookmark();d=g.getFirst();)d.insertBefore(g); +g.remove();e.moveToBookmark(h)}else h?e.moveToPosition(g,CKEDITOR.POSITION_BEFORE_START):j?e.moveToPosition(g,CKEDITOR.POSITION_AFTER_END):(e.splitElement(g),e.moveToPosition(g,CKEDITOR.POSITION_AFTER_END),o(e,d.elements.slice(),g));a.getSelection().selectRanges([e])}}else a.removeStyle(i)}a[c==b?"removeStyle":"applyStyle"](f);a.fire("saveSnapshot")},onRender:function(){a.on("selectionChange",function(b){for(var c=this.getValue(),b=b.data.path.elements,d=0,f;d<b.length;d++){f=b[d];for(var e in k)if(k[e].checkElementMatch(f, +!0,a)){e!=c&&this.setValue(e);return}}this.setValue("",j)},this)},refresh:function(){a.activeFilter.check(n)||this.setState(CKEDITOR.TRISTATE_DISABLED)}})}function o(a,b,c){var f=b.pop();if(f){if(c)return o(a,b,f.equals(c)?null:c);c=f.clone();a.insertNode(c);a.moveToPosition(c,CKEDITOR.POSITION_AFTER_START);o(a,b)}}CKEDITOR.plugins.add("font",{requires:"richcombo",lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn", +init:function(a){var b=a.config;j(a,"Font","family",a.lang.font,b.font_names,b.font_defaultLabel,b.font_style,30);j(a,"FontSize","size",a.lang.font.fontSize,b.fontSize_sizes,b.fontSize_defaultLabel,b.fontSize_style,40)}})})();CKEDITOR.config.font_names="Arial/Arial, Helvetica, sans-serif;Comic Sans MS/Comic Sans MS, cursive;Courier New/Courier New, Courier, monospace;Georgia/Georgia, serif;Lucida Sans Unicode/Lucida Sans Unicode, Lucida Grande, sans-serif;Tahoma/Tahoma, Geneva, sans-serif;Times New Roman/Times New Roman, Times, serif;Trebuchet MS/Trebuchet MS, Helvetica, sans-serif;Verdana/Verdana, Geneva, sans-serif"; +CKEDITOR.config.font_defaultLabel="";CKEDITOR.config.font_style={element:"span",styles:{"font-family":"#(family)"},overrides:[{element:"font",attributes:{face:null}}]};CKEDITOR.config.fontSize_sizes="8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px";CKEDITOR.config.fontSize_defaultLabel="";CKEDITOR.config.fontSize_style={element:"span",styles:{"font-size":"#(size)"},overrides:[{element:"font",attributes:{size:null}}]}; \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/dialogs/button.js b/bower_components/ckeditor/plugins/forms/dialogs/button.js new file mode 100644 index 0000000..e7153d8 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/dialogs/button.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("button",function(b){function d(a){var b=this.getValue();b?(a.attributes[this.id]=b,"name"==this.id&&(a.attributes["data-cke-saved-name"]=b)):(delete a.attributes[this.id],"name"==this.id&&delete a.attributes["data-cke-saved-name"])}return{title:b.lang.forms.button.title,minWidth:350,minHeight:150,onShow:function(){delete this.button;var a=this.getParentEditor().getSelection().getSelectedElement();a&&a.is("input")&&a.getAttribute("type")in{button:1,reset:1,submit:1}&&(this.button= +a,this.setupContent(a))},onOk:function(){var a=this.getParentEditor(),b=this.button,d=!b,c=b?CKEDITOR.htmlParser.fragment.fromHtml(b.getOuterHtml()).children[0]:new CKEDITOR.htmlParser.element("input");this.commitContent(c);var e=new CKEDITOR.htmlParser.basicWriter;c.writeHtml(e);c=CKEDITOR.dom.element.createFromHtml(e.getHtml(),a.document);d?a.insertElement(c):(c.replace(b),a.getSelection().selectElement(c))},contents:[{id:"info",label:b.lang.forms.button.title,title:b.lang.forms.button.title,elements:[{id:"name", +type:"text",label:b.lang.common.name,"default":"",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:d},{id:"value",type:"text",label:b.lang.forms.button.text,accessKey:"V","default":"",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:d},{id:"type",type:"select",label:b.lang.forms.button.type,"default":"button",accessKey:"T",items:[[b.lang.forms.button.typeBtn,"button"],[b.lang.forms.button.typeSbm,"submit"],[b.lang.forms.button.typeRst, +"reset"]],setup:function(a){this.setValue(a.getAttribute("type")||"")},commit:d}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/dialogs/checkbox.js b/bower_components/ckeditor/plugins/forms/dialogs/checkbox.js new file mode 100644 index 0000000..ffd64fe --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/dialogs/checkbox.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("checkbox",function(d){return{title:d.lang.forms.checkboxAndRadio.checkboxTitle,minWidth:350,minHeight:140,onShow:function(){delete this.checkbox;var a=this.getParentEditor().getSelection().getSelectedElement();a&&"checkbox"==a.getAttribute("type")&&(this.checkbox=a,this.setupContent(a))},onOk:function(){var a,b=this.checkbox;b||(a=this.getParentEditor(),b=a.document.createElement("input"),b.setAttribute("type","checkbox"),a.insertElement(b));this.commitContent({element:b})},contents:[{id:"info", +label:d.lang.forms.checkboxAndRadio.checkboxTitle,title:d.lang.forms.checkboxAndRadio.checkboxTitle,startupFocus:"txtName",elements:[{id:"txtName",type:"text",label:d.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){a=a.element;this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"txtValue",type:"text",label:d.lang.forms.checkboxAndRadio.value, +"default":"",accessKey:"V",setup:function(a){a=a.getAttribute("value");this.setValue(CKEDITOR.env.ie&&"on"==a?"":a)},commit:function(a){var b=a.element,c=this.getValue();c&&!(CKEDITOR.env.ie&&"on"==c)?b.setAttribute("value",c):CKEDITOR.env.ie?(c=new CKEDITOR.dom.element("input",b.getDocument()),b.copyAttributes(c,{value:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c):b.removeAttribute("value")}},{id:"cmbSelected",type:"checkbox",label:d.lang.forms.checkboxAndRadio.selected,"default":"", +accessKey:"S",value:"checked",setup:function(a){this.setValue(a.getAttribute("checked"))},commit:function(a){var b=a.element;if(CKEDITOR.env.ie){var c=!!b.getAttribute("checked"),e=!!this.getValue();c!=e&&(c=CKEDITOR.dom.element.createFromHtml('<input type="checkbox"'+(e?' checked="checked"':"")+"/>",d.document),b.copyAttributes(c,{type:1,checked:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c)}else this.getValue()?b.setAttribute("checked","checked"):b.removeAttribute("checked")}}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/dialogs/form.js b/bower_components/ckeditor/plugins/forms/dialogs/form.js new file mode 100644 index 0000000..396baf5 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/dialogs/form.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("form",function(a){var d={action:1,id:1,method:1,enctype:1,target:1};return{title:a.lang.forms.form.title,minWidth:350,minHeight:200,onShow:function(){delete this.form;var b=this.getParentEditor().elementPath().contains("form",1);b&&(this.form=b,this.setupContent(b))},onOk:function(){var b,a=this.form,c=!a;c&&(b=this.getParentEditor(),a=b.document.createElement("form"),a.appendBogus());c&&b.insertElement(a);this.commitContent(a)},onLoad:function(){function a(b){this.setValue(b.getAttribute(this.id)|| +"")}function e(a){this.getValue()?a.setAttribute(this.id,this.getValue()):a.removeAttribute(this.id)}this.foreach(function(c){d[c.id]&&(c.setup=a,c.commit=e)})},contents:[{id:"info",label:a.lang.forms.form.title,title:a.lang.forms.form.title,elements:[{id:"txtName",type:"text",label:a.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name", +!1),a.removeAttribute("name"))}},{id:"action",type:"text",label:a.lang.forms.form.action,"default":"",accessKey:"T"},{type:"hbox",widths:["45%","55%"],children:[{id:"id",type:"text",label:a.lang.common.id,"default":"",accessKey:"I"},{id:"enctype",type:"select",label:a.lang.forms.form.encoding,style:"width:100%",accessKey:"E","default":"",items:[[""],["text/plain"],["multipart/form-data"],["application/x-www-form-urlencoded"]]}]},{type:"hbox",widths:["45%","55%"],children:[{id:"target",type:"select", +label:a.lang.common.target,style:"width:100%",accessKey:"M","default":"",items:[[a.lang.common.notSet,""],[a.lang.common.targetNew,"_blank"],[a.lang.common.targetTop,"_top"],[a.lang.common.targetSelf,"_self"],[a.lang.common.targetParent,"_parent"]]},{id:"method",type:"select",label:a.lang.forms.form.method,accessKey:"M","default":"GET",items:[["GET","get"],["POST","post"]]}]}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/dialogs/hiddenfield.js b/bower_components/ckeditor/plugins/forms/dialogs/hiddenfield.js new file mode 100644 index 0000000..5d84a10 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/dialogs/hiddenfield.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("hiddenfield",function(d){return{title:d.lang.forms.hidden.title,hiddenField:null,minWidth:350,minHeight:110,onShow:function(){delete this.hiddenField;var a=this.getParentEditor(),b=a.getSelection(),c=b.getSelectedElement();c&&(c.data("cke-real-element-type")&&"hiddenfield"==c.data("cke-real-element-type"))&&(this.hiddenField=c,c=a.restoreRealElement(this.hiddenField),this.setupContent(c),b.selectElement(this.hiddenField))},onOk:function(){var a=this.getValueOf("info","_cke_saved_name"), +b=this.getParentEditor(),a=8>CKEDITOR.document.$.documentMode?'<input name="'+CKEDITOR.tools.htmlEncode(a)+'">':"input",a=CKEDITOR.env.ie&&b.document.createElement(a);a.setAttribute("type","hidden");this.commitContent(a);a=b.createFakeElement(a,"cke_hidden","hiddenfield");this.hiddenField?(a.replace(this.hiddenField),b.getSelection().selectElement(a)):b.insertElement(a);return!0},contents:[{id:"info",label:d.lang.forms.hidden.title,title:d.lang.forms.hidden.title,elements:[{id:"_cke_saved_name",type:"text", +label:d.lang.forms.hidden.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.setAttribute("name",this.getValue()):a.removeAttribute("name")}},{id:"value",type:"text",label:d.lang.forms.hidden.value,"default":"",accessKey:"V",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:function(a){this.getValue()?a.setAttribute("value",this.getValue()):a.removeAttribute("value")}}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/dialogs/radio.js b/bower_components/ckeditor/plugins/forms/dialogs/radio.js new file mode 100644 index 0000000..fd718f2 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/dialogs/radio.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("radio",function(d){return{title:d.lang.forms.checkboxAndRadio.radioTitle,minWidth:350,minHeight:140,onShow:function(){delete this.radioButton;var a=this.getParentEditor().getSelection().getSelectedElement();a&&("input"==a.getName()&&"radio"==a.getAttribute("type"))&&(this.radioButton=a,this.setupContent(a))},onOk:function(){var a,b=this.radioButton,c=!b;c&&(a=this.getParentEditor(),b=a.document.createElement("input"),b.setAttribute("type","radio"));c&&a.insertElement(b);this.commitContent({element:b})}, +contents:[{id:"info",label:d.lang.forms.checkboxAndRadio.radioTitle,title:d.lang.forms.checkboxAndRadio.radioTitle,elements:[{id:"name",type:"text",label:d.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){a=a.element;this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"value",type:"text",label:d.lang.forms.checkboxAndRadio.value,"default":"", +accessKey:"V",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:function(a){a=a.element;this.getValue()?a.setAttribute("value",this.getValue()):a.removeAttribute("value")}},{id:"checked",type:"checkbox",label:d.lang.forms.checkboxAndRadio.selected,"default":"",accessKey:"S",value:"checked",setup:function(a){this.setValue(a.getAttribute("checked"))},commit:function(a){var b=a.element;if(CKEDITOR.env.ie){var c=b.getAttribute("checked"),e=!!this.getValue();c!=e&&(c=CKEDITOR.dom.element.createFromHtml('<input type="radio"'+ +(e?' checked="checked"':"")+"></input>",d.document),b.copyAttributes(c,{type:1,checked:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c)}else this.getValue()?b.setAttribute("checked","checked"):b.removeAttribute("checked")}}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/dialogs/select.js b/bower_components/ckeditor/plugins/forms/dialogs/select.js new file mode 100644 index 0000000..b78f847 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/dialogs/select.js @@ -0,0 +1,20 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("select",function(c){function h(a,b,e,d,c){a=f(a);d=d?d.createElement("OPTION"):document.createElement("OPTION");if(a&&d&&"option"==d.getName())CKEDITOR.env.ie?(isNaN(parseInt(c,10))?a.$.options.add(d.$):a.$.options.add(d.$,c),d.$.innerHTML=0<b.length?b:"",d.$.value=e):(null!==c&&c<a.getChildCount()?a.getChild(0>c?0:c).insertBeforeMe(d):a.append(d),d.setText(0<b.length?b:""),d.setValue(e));else return!1;return d}function m(a){for(var a=f(a),b=g(a),e=a.getChildren().count()-1;0<= +e;e--)a.getChild(e).$.selected&&a.getChild(e).remove();i(a,b)}function n(a,b,e,d){a=f(a);if(0>b)return!1;a=a.getChild(b);a.setText(e);a.setValue(d);return a}function k(a){for(a=f(a);a.getChild(0)&&a.getChild(0).remove(););}function j(a,b,e){var a=f(a),d=g(a);if(0>d)return!1;b=d+b;b=0>b?0:b;b=b>=a.getChildCount()?a.getChildCount()-1:b;if(d==b)return!1;var d=a.getChild(d),c=d.getText(),o=d.getValue();d.remove();d=h(a,c,o,!e?null:e,b);i(a,b);return d}function g(a){return(a=f(a))?a.$.selectedIndex:-1} +function i(a,b){a=f(a);if(0>b)return null;var e=a.getChildren().count();a.$.selectedIndex=b>=e?e-1:b;return a}function l(a){return(a=f(a))?a.getChildren():!1}function f(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}return{title:c.lang.forms.select.title,minWidth:CKEDITOR.env.ie?460:395,minHeight:CKEDITOR.env.ie?320:300,onShow:function(){delete this.selectBox;this.setupContent("clear");var a=this.getParentEditor().getSelection().getSelectedElement();if(a&&"select"==a.getName()){this.selectBox= +a;this.setupContent(a.getName(),a);for(var a=l(a),b=0;b<a.count();b++)this.setupContent("option",a.getItem(b))}},onOk:function(){var a=this.getParentEditor(),b=this.selectBox,e=!b;e&&(b=a.document.createElement("select"));this.commitContent(b);if(e&&(a.insertElement(b),CKEDITOR.env.ie)){var d=a.getSelection(),c=d.createBookmarks();setTimeout(function(){d.selectBookmarks(c)},0)}},contents:[{id:"info",label:c.lang.forms.select.selectInfo,title:c.lang.forms.select.selectInfo,accessKey:"",elements:[{id:"txtName", +type:"text",widths:["25%","75%"],labelLayout:"horizontal",label:c.lang.common.name,"default":"",accessKey:"N",style:"width:350px",setup:function(a,b){"clear"==a?this.setValue(this["default"]||""):"select"==a&&this.setValue(b.data("cke-saved-name")||b.getAttribute("name")||"")},commit:function(a){this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"txtValue",type:"text",widths:["25%","75%"],labelLayout:"horizontal",label:c.lang.forms.select.value, +style:"width:350px","default":"",className:"cke_disabled",onLoad:function(){this.getInputElement().setAttribute("readOnly",!0)},setup:function(a,b){"clear"==a?this.setValue(""):"option"==a&&b.getAttribute("selected")&&this.setValue(b.$.value)}},{type:"hbox",widths:["175px","170px"],children:[{id:"txtSize",type:"text",labelLayout:"horizontal",label:c.lang.forms.select.size,"default":"",accessKey:"S",style:"width:175px",validate:function(){var a=CKEDITOR.dialog.validate.integer(c.lang.common.validateNumberFailed); +return""===this.getValue()||a.apply(this)},setup:function(a,b){"select"==a&&this.setValue(b.getAttribute("size")||"");CKEDITOR.env.webkit&&this.getInputElement().setStyle("width","86px")},commit:function(a){this.getValue()?a.setAttribute("size",this.getValue()):a.removeAttribute("size")}},{type:"html",html:"<span>"+CKEDITOR.tools.htmlEncode(c.lang.forms.select.lines)+"</span>"}]},{type:"html",html:"<span>"+CKEDITOR.tools.htmlEncode(c.lang.forms.select.opAvail)+"</span>"},{type:"hbox",widths:["115px", +"115px","100px"],children:[{type:"vbox",children:[{id:"txtOptName",type:"text",label:c.lang.forms.select.opText,style:"width:115px",setup:function(a){"clear"==a&&this.setValue("")}},{type:"select",id:"cmbName",label:"",title:"",size:5,style:"width:115px;height:75px",items:[],onChange:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbValue"),e=a.getContentElement("info","txtOptName"),a=a.getContentElement("info","txtOptValue"),d=g(this);i(b,d);e.setValue(this.getValue());a.setValue(b.getValue())}, +setup:function(a,b){"clear"==a?k(this):"option"==a&&h(this,b.getText(),b.getText(),this.getDialog().getParentEditor().document)},commit:function(a){var b=this.getDialog(),e=l(this),d=l(b.getContentElement("info","cmbValue")),c=b.getContentElement("info","txtValue").getValue();k(a);for(var f=0;f<e.count();f++){var g=h(a,e.getItem(f).getValue(),d.getItem(f).getValue(),b.getParentEditor().document);d.getItem(f).getValue()==c&&(g.setAttribute("selected","selected"),g.selected=!0)}}}]},{type:"vbox",children:[{id:"txtOptValue", +type:"text",label:c.lang.forms.select.opValue,style:"width:115px",setup:function(a){"clear"==a&&this.setValue("")}},{type:"select",id:"cmbValue",label:"",size:5,style:"width:115px;height:75px",items:[],onChange:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbName"),e=a.getContentElement("info","txtOptName"),a=a.getContentElement("info","txtOptValue"),d=g(this);i(b,d);e.setValue(b.getValue());a.setValue(this.getValue())},setup:function(a,b){if("clear"==a)k(this);else if("option"== +a){var e=b.getValue();h(this,e,e,this.getDialog().getParentEditor().document);"selected"==b.getAttribute("selected")&&this.getDialog().getContentElement("info","txtValue").setValue(e)}}}]},{type:"vbox",padding:5,children:[{type:"button",id:"btnAdd",label:c.lang.forms.select.btnAdd,title:c.lang.forms.select.btnAdd,style:"width:100%;",onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","txtOptName"),e=a.getContentElement("info","txtOptValue"),d=a.getContentElement("info","cmbName"), +c=a.getContentElement("info","cmbValue");h(d,b.getValue(),b.getValue(),a.getParentEditor().document);h(c,e.getValue(),e.getValue(),a.getParentEditor().document);b.setValue("");e.setValue("")}},{type:"button",id:"btnModify",label:c.lang.forms.select.btnModify,title:c.lang.forms.select.btnModify,style:"width:100%;",onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","txtOptName"),e=a.getContentElement("info","txtOptValue"),d=a.getContentElement("info","cmbName"),a=a.getContentElement("info", +"cmbValue"),c=g(d);0<=c&&(n(d,c,b.getValue(),b.getValue()),n(a,c,e.getValue(),e.getValue()))}},{type:"button",id:"btnUp",style:"width:100%;",label:c.lang.forms.select.btnUp,title:c.lang.forms.select.btnUp,onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbName"),c=a.getContentElement("info","cmbValue");j(b,-1,a.getParentEditor().document);j(c,-1,a.getParentEditor().document)}},{type:"button",id:"btnDown",style:"width:100%;",label:c.lang.forms.select.btnDown,title:c.lang.forms.select.btnDown, +onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbName"),c=a.getContentElement("info","cmbValue");j(b,1,a.getParentEditor().document);j(c,1,a.getParentEditor().document)}}]}]},{type:"hbox",widths:["40%","20%","40%"],children:[{type:"button",id:"btnSetValue",label:c.lang.forms.select.btnSetValue,title:c.lang.forms.select.btnSetValue,onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbValue");a.getContentElement("info","txtValue").setValue(b.getValue())}}, +{type:"button",id:"btnDelete",label:c.lang.forms.select.btnDelete,title:c.lang.forms.select.btnDelete,onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbName"),c=a.getContentElement("info","cmbValue"),d=a.getContentElement("info","txtOptName"),a=a.getContentElement("info","txtOptValue");m(b);m(c);d.setValue("");a.setValue("")}},{id:"chkMulti",type:"checkbox",label:c.lang.forms.select.chkMulti,"default":"",accessKey:"M",value:"checked",setup:function(a,b){"select"==a&&this.setValue(b.getAttribute("multiple")); +CKEDITOR.env.webkit&&this.getElement().getParent().setStyle("vertical-align","middle")},commit:function(a){this.getValue()?a.setAttribute("multiple",this.getValue()):a.removeAttribute("multiple")}}]}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/dialogs/textarea.js b/bower_components/ckeditor/plugins/forms/dialogs/textarea.js new file mode 100644 index 0000000..04a4ae2 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/dialogs/textarea.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("textarea",function(b){return{title:b.lang.forms.textarea.title,minWidth:350,minHeight:220,onShow:function(){delete this.textarea;var a=this.getParentEditor().getSelection().getSelectedElement();a&&"textarea"==a.getName()&&(this.textarea=a,this.setupContent(a))},onOk:function(){var a,b=this.textarea,c=!b;c&&(a=this.getParentEditor(),b=a.document.createElement("textarea"));this.commitContent(b);c&&a.insertElement(b)},contents:[{id:"info",label:b.lang.forms.textarea.title,title:b.lang.forms.textarea.title, +elements:[{id:"_cke_saved_name",type:"text",label:b.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{type:"hbox",widths:["50%","50%"],children:[{id:"cols",type:"text",label:b.lang.forms.textarea.cols,"default":"",accessKey:"C",style:"width:50px",validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed), +setup:function(a){this.setValue(a.hasAttribute("cols")&&a.getAttribute("cols")||"")},commit:function(a){this.getValue()?a.setAttribute("cols",this.getValue()):a.removeAttribute("cols")}},{id:"rows",type:"text",label:b.lang.forms.textarea.rows,"default":"",accessKey:"R",style:"width:50px",validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed),setup:function(a){this.setValue(a.hasAttribute("rows")&&a.getAttribute("rows")||"")},commit:function(a){this.getValue()?a.setAttribute("rows", +this.getValue()):a.removeAttribute("rows")}}]},{id:"value",type:"textarea",label:b.lang.forms.textfield.value,"default":"",setup:function(a){this.setValue(a.$.defaultValue)},commit:function(a){a.$.value=a.$.defaultValue=this.getValue()}}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/dialogs/textfield.js b/bower_components/ckeditor/plugins/forms/dialogs/textfield.js new file mode 100644 index 0000000..fdedd50 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/dialogs/textfield.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("textfield",function(b){function e(a){var a=a.element,c=this.getValue();c?a.setAttribute(this.id,c):a.removeAttribute(this.id)}function f(a){this.setValue(a.hasAttribute(this.id)&&a.getAttribute(this.id)||"")}var g={email:1,password:1,search:1,tel:1,text:1,url:1};return{title:b.lang.forms.textfield.title,minWidth:350,minHeight:150,onShow:function(){delete this.textField;var a=this.getParentEditor().getSelection().getSelectedElement();if(a&&"input"==a.getName()&&(g[a.getAttribute("type")]|| +!a.getAttribute("type")))this.textField=a,this.setupContent(a)},onOk:function(){var a=this.getParentEditor(),c=this.textField,b=!c;b&&(c=a.document.createElement("input"),c.setAttribute("type","text"));c={element:c};b&&a.insertElement(c.element);this.commitContent(c);b||a.getSelection().selectElement(c.element)},onLoad:function(){this.foreach(function(a){if(a.getValue&&(a.setup||(a.setup=f),!a.commit))a.commit=e})},contents:[{id:"info",label:b.lang.forms.textfield.title,title:b.lang.forms.textfield.title, +elements:[{type:"hbox",widths:["50%","50%"],children:[{id:"_cke_saved_name",type:"text",label:b.lang.forms.textfield.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){a=a.element;this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"value",type:"text",label:b.lang.forms.textfield.value,"default":"",accessKey:"V",commit:function(a){if(CKEDITOR.env.ie&& +!this.getValue()){var c=a.element,d=new CKEDITOR.dom.element("input",b.document);c.copyAttributes(d,{value:1});d.replace(c);a.element=d}else e.call(this,a)}}]},{type:"hbox",widths:["50%","50%"],children:[{id:"size",type:"text",label:b.lang.forms.textfield.charWidth,"default":"",accessKey:"C",style:"width:50px",validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed)},{id:"maxLength",type:"text",label:b.lang.forms.textfield.maxChars,"default":"",accessKey:"M",style:"width:50px", +validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed)}],onLoad:function(){CKEDITOR.env.ie7Compat&&this.getElement().setStyle("zoom","100%")}},{id:"type",type:"select",label:b.lang.forms.textfield.type,"default":"text",accessKey:"M",items:[[b.lang.forms.textfield.typeEmail,"email"],[b.lang.forms.textfield.typePass,"password"],[b.lang.forms.textfield.typeSearch,"search"],[b.lang.forms.textfield.typeTel,"tel"],[b.lang.forms.textfield.typeText,"text"],[b.lang.forms.textfield.typeUrl, +"url"]],setup:function(a){this.setValue(a.getAttribute("type"))},commit:function(a){var c=a.element;if(CKEDITOR.env.ie){var d=c.getAttribute("type"),e=this.getValue();d!=e&&(d=CKEDITOR.dom.element.createFromHtml('<input type="'+e+'"></input>',b.document),c.copyAttributes(d,{type:1}),d.replace(c),a.element=d)}else c.setAttribute("type",this.getValue())}}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/icons/button.png b/bower_components/ckeditor/plugins/forms/icons/button.png new file mode 100644 index 0000000..0bf68ca Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/button.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/checkbox.png b/bower_components/ckeditor/plugins/forms/icons/checkbox.png new file mode 100644 index 0000000..2f4eb2f Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/checkbox.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/form.png b/bower_components/ckeditor/plugins/forms/icons/form.png new file mode 100644 index 0000000..0841667 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/form.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hiddenfield.png b/bower_components/ckeditor/plugins/forms/icons/hiddenfield.png new file mode 100644 index 0000000..fce4fcc Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hiddenfield.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hidpi/button.png b/bower_components/ckeditor/plugins/forms/icons/hidpi/button.png new file mode 100644 index 0000000..bd92b16 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hidpi/button.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hidpi/checkbox.png b/bower_components/ckeditor/plugins/forms/icons/hidpi/checkbox.png new file mode 100644 index 0000000..36be4aa Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hidpi/checkbox.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hidpi/form.png b/bower_components/ckeditor/plugins/forms/icons/hidpi/form.png new file mode 100644 index 0000000..4a02649 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hidpi/form.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hidpi/hiddenfield.png b/bower_components/ckeditor/plugins/forms/icons/hidpi/hiddenfield.png new file mode 100644 index 0000000..cd5f318 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hidpi/hiddenfield.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hidpi/imagebutton.png b/bower_components/ckeditor/plugins/forms/icons/hidpi/imagebutton.png new file mode 100644 index 0000000..d273796 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hidpi/imagebutton.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hidpi/radio.png b/bower_components/ckeditor/plugins/forms/icons/hidpi/radio.png new file mode 100644 index 0000000..2f0c72d Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hidpi/radio.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hidpi/select-rtl.png b/bower_components/ckeditor/plugins/forms/icons/hidpi/select-rtl.png new file mode 100644 index 0000000..42452e1 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hidpi/select-rtl.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hidpi/select.png b/bower_components/ckeditor/plugins/forms/icons/hidpi/select.png new file mode 100644 index 0000000..da2b066 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hidpi/select.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hidpi/textarea-rtl.png b/bower_components/ckeditor/plugins/forms/icons/hidpi/textarea-rtl.png new file mode 100644 index 0000000..60618a5 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hidpi/textarea-rtl.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hidpi/textarea.png b/bower_components/ckeditor/plugins/forms/icons/hidpi/textarea.png new file mode 100644 index 0000000..87073d2 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hidpi/textarea.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hidpi/textfield-rtl.png b/bower_components/ckeditor/plugins/forms/icons/hidpi/textfield-rtl.png new file mode 100644 index 0000000..d3c1358 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hidpi/textfield-rtl.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/hidpi/textfield.png b/bower_components/ckeditor/plugins/forms/icons/hidpi/textfield.png new file mode 100644 index 0000000..d3c1358 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/hidpi/textfield.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/imagebutton.png b/bower_components/ckeditor/plugins/forms/icons/imagebutton.png new file mode 100644 index 0000000..162df9a Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/imagebutton.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/radio.png b/bower_components/ckeditor/plugins/forms/icons/radio.png new file mode 100644 index 0000000..aaad523 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/radio.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/select-rtl.png b/bower_components/ckeditor/plugins/forms/icons/select-rtl.png new file mode 100644 index 0000000..029a0d2 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/select-rtl.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/select.png b/bower_components/ckeditor/plugins/forms/icons/select.png new file mode 100644 index 0000000..44b02b9 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/select.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/textarea-rtl.png b/bower_components/ckeditor/plugins/forms/icons/textarea-rtl.png new file mode 100644 index 0000000..8a15d68 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/textarea-rtl.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/textarea.png b/bower_components/ckeditor/plugins/forms/icons/textarea.png new file mode 100644 index 0000000..58e0fa0 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/textarea.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/textfield-rtl.png b/bower_components/ckeditor/plugins/forms/icons/textfield-rtl.png new file mode 100644 index 0000000..054aab5 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/textfield-rtl.png differ diff --git a/bower_components/ckeditor/plugins/forms/icons/textfield.png b/bower_components/ckeditor/plugins/forms/icons/textfield.png new file mode 100644 index 0000000..054aab5 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/icons/textfield.png differ diff --git a/bower_components/ckeditor/plugins/forms/images/hiddenfield.gif b/bower_components/ckeditor/plugins/forms/images/hiddenfield.gif new file mode 100644 index 0000000..953f643 Binary files /dev/null and b/bower_components/ckeditor/plugins/forms/images/hiddenfield.gif differ diff --git a/bower_components/ckeditor/plugins/forms/lang/af.js b/bower_components/ckeditor/plugins/forms/lang/af.js new file mode 100644 index 0000000..27ed76d --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/af.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","af",{button:{title:"Knop eienskappe",text:"Teks (Waarde)",type:"Soort",typeBtn:"Knop",typeSbm:"Stuur",typeRst:"Maak leeg"},checkboxAndRadio:{checkboxTitle:"Merkhokkie eienskappe",radioTitle:"Radioknoppie eienskappe",value:"Waarde",selected:"Geselekteer"},form:{title:"Vorm eienskappe",menu:"Vorm eienskappe",action:"Aksie",method:"Metode",encoding:"Kodering"},hidden:{title:"Verborge veld eienskappe",name:"Naam",value:"Waarde"},select:{title:"Keuseveld eienskappe",selectInfo:"Info", +opAvail:"Beskikbare opsies",value:"Waarde",size:"Grootte",lines:"Lyne",chkMulti:"Laat meer as een keuse toe",opText:"Teks",opValue:"Waarde",btnAdd:"Byvoeg",btnModify:"Wysig",btnUp:"Op",btnDown:"Af",btnSetValue:"Stel as geselekteerde waarde",btnDelete:"Verwyder"},textarea:{title:"Teks-area eienskappe",cols:"Kolomme",rows:"Rye"},textfield:{title:"Teksveld eienskappe",name:"Naam",value:"Waarde",charWidth:"Breedte (karakters)",maxChars:"Maksimum karakters",type:"Soort",typeText:"Teks",typePass:"Wagwoord", +typeEmail:"Email",typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/ar.js b/bower_components/ckeditor/plugins/forms/lang/ar.js new file mode 100644 index 0000000..537ca01 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/ar.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","ar",{button:{title:"خصائص زر الضغط",text:"القيمة/التسمية",type:"نوع الزر",typeBtn:"زر",typeSbm:"إرسال",typeRst:"إعادة تعيين"},checkboxAndRadio:{checkboxTitle:"خصائص خانة الإختيار",radioTitle:"خصائص زر الخيار",value:"القيمة",selected:"محدد"},form:{title:"خصائص النموذج",menu:"خصائص النموذج",action:"اسم الملف",method:"الأسلوب",encoding:"تشفير"},hidden:{title:"خصائص الحقل المخفي",name:"الاسم",value:"القيمة"},select:{title:"خصائص اختيار الحقل",selectInfo:"اختار معلومات", +opAvail:"الخيارات المتاحة",value:"القيمة",size:"الحجم",lines:"الأسطر",chkMulti:"السماح بتحديدات متعددة",opText:"النص",opValue:"القيمة",btnAdd:"إضافة",btnModify:"تعديل",btnUp:"أعلى",btnDown:"أسفل",btnSetValue:"إجعلها محددة",btnDelete:"إزالة"},textarea:{title:"خصائص مساحة النص",cols:"الأعمدة",rows:"الصفوف"},textfield:{title:"خصائص مربع النص",name:"الاسم",value:"القيمة",charWidth:"عرض السمات",maxChars:"اقصى عدد للسمات",type:"نوع المحتوى",typeText:"نص",typePass:"كلمة مرور",typeEmail:"بريد إلكتروني",typeSearch:"بحث", +typeTel:"رقم الهاتف",typeUrl:"الرابط"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/bg.js b/bower_components/ckeditor/plugins/forms/lang/bg.js new file mode 100644 index 0000000..6761fac --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/bg.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","bg",{button:{title:"Настройки на бутона",text:"Текст (стойност)",type:"Тип",typeBtn:"Бутон",typeSbm:"Добави",typeRst:"Нулиране"},checkboxAndRadio:{checkboxTitle:"Checkbox Properties",radioTitle:"Настройки на радиобутон",value:"Стойност",selected:"Избрано"},form:{title:"Настройки на формата",menu:"Настройки на формата",action:"Действие",method:"Метод",encoding:"Кодиране"},hidden:{title:"Настройки за скрито поле",name:"Име",value:"Стойност"},select:{title:"Selection Field Properties", +selectInfo:"Select Info",opAvail:"Налични опции",value:"Стойност",size:"Размер",lines:"линии",chkMulti:"Allow multiple selections",opText:"Текст",opValue:"Стойност",btnAdd:"Добави",btnModify:"Промени",btnUp:"На горе",btnDown:"На долу",btnSetValue:"Set as selected value",btnDelete:"Изтриване"},textarea:{title:"Опции за текстовата зона",cols:"Колони",rows:"Редове"},textfield:{title:"Настройки за текстово поле",name:"Име",value:"Стойност",charWidth:"Ширина на знаците",maxChars:"Макс. знаци",type:"Тип", +typeText:"Текст",typePass:"Парола",typeEmail:"Email",typeSearch:"Търсене",typeTel:"Телефонен номер",typeUrl:"Уеб адрес"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/bn.js b/bower_components/ckeditor/plugins/forms/lang/bn.js new file mode 100644 index 0000000..6377328 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/bn.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","bn",{button:{title:"বাটন প্রোপার্টি",text:"টেক্সট (ভ্যালু)",type:"প্রকার",typeBtn:"Button",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"চেক বক্স প্রোপার্টি",radioTitle:"রেডিও বাটন প্রোপার্টি",value:"ভ্যালু",selected:"সিলেক্টেড"},form:{title:"ফর্ম প্রোপার্টি",menu:"ফর্ম প্রোপার্টি",action:"একশ্যন",method:"পদ্ধতি",encoding:"Encoding"},hidden:{title:"গুপ্ত ফীল্ড প্রোপার্টি",name:"নাম",value:"ভ্যালু"},select:{title:"বাছাই ফীল্ড প্রোপার্টি",selectInfo:"তথ্য", +opAvail:"অন্যান্য বিকল্প",value:"ভ্যালু",size:"সাইজ",lines:"লাইন সমূহ",chkMulti:"একাধিক সিলেকশন এলাউ কর",opText:"টেক্সট",opValue:"ভ্যালু",btnAdd:"যুক্ত",btnModify:"বদলে দাও",btnUp:"উপর",btnDown:"নীচে",btnSetValue:"বাছাই করা ভ্যালু হিসেবে সেট কর",btnDelete:"ডিলীট"},textarea:{title:"টেক্সট এরিয়া প্রোপার্টি",cols:"কলাম",rows:"রো"},textfield:{title:"টেক্সট ফীল্ড প্রোপার্টি",name:"নাম",value:"ভ্যালু",charWidth:"ক্যারেক্টার প্রশস্ততা",maxChars:"সর্বাধিক ক্যারেক্টার",type:"টাইপ",typeText:"টেক্সট",typePass:"পাসওয়ার্ড", +typeEmail:"Email",typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/bs.js b/bower_components/ckeditor/plugins/forms/lang/bs.js new file mode 100644 index 0000000..cac69a3 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/bs.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","bs",{button:{title:"Button Properties",text:"Text (Value)",type:"Type",typeBtn:"Button",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"Checkbox Properties",radioTitle:"Radio Button Properties",value:"Value",selected:"Selected"},form:{title:"Form Properties",menu:"Form Properties",action:"Action",method:"Method",encoding:"Encoding"},hidden:{title:"Hidden Field Properties",name:"Name",value:"Value"},select:{title:"Selection Field Properties",selectInfo:"Select Info", +opAvail:"Available Options",value:"Value",size:"Size",lines:"lines",chkMulti:"Allow multiple selections",opText:"Text",opValue:"Value",btnAdd:"Add",btnModify:"Modify",btnUp:"Up",btnDown:"Down",btnSetValue:"Set as selected value",btnDelete:"Delete"},textarea:{title:"Textarea Properties",cols:"Columns",rows:"Rows"},textfield:{title:"Text Field Properties",name:"Name",value:"Value",charWidth:"Character Width",maxChars:"Maximum Characters",type:"Type",typeText:"Text",typePass:"Password",typeEmail:"Email", +typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/ca.js b/bower_components/ckeditor/plugins/forms/lang/ca.js new file mode 100644 index 0000000..55da8f9 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/ca.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","ca",{button:{title:"Propietats del botó",text:"Text (Valor)",type:"Tipus",typeBtn:"Botó",typeSbm:"Transmet formulari",typeRst:"Reinicia formulari"},checkboxAndRadio:{checkboxTitle:"Propietats de la casella de verificació",radioTitle:"Propietats del botó d'opció",value:"Valor",selected:"Seleccionat"},form:{title:"Propietats del formulari",menu:"Propietats del formulari",action:"Acció",method:"Mètode",encoding:"Codificació"},hidden:{title:"Propietats del camp ocult", +name:"Nom",value:"Valor"},select:{title:"Propietats del camp de selecció",selectInfo:"Info",opAvail:"Opcions disponibles",value:"Valor",size:"Mida",lines:"Línies",chkMulti:"Permet múltiples seleccions",opText:"Text",opValue:"Valor",btnAdd:"Afegeix",btnModify:"Modifica",btnUp:"Amunt",btnDown:"Avall",btnSetValue:"Selecciona per defecte",btnDelete:"Elimina"},textarea:{title:"Propietats de l'àrea de text",cols:"Columnes",rows:"Files"},textfield:{title:"Propietats del camp de text",name:"Nom",value:"Valor", +charWidth:"Amplada",maxChars:"Nombre màxim de caràcters",type:"Tipus",typeText:"Text",typePass:"Contrasenya",typeEmail:"Correu electrònic",typeSearch:"Cercar",typeTel:"Número de telèfon",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/cs.js b/bower_components/ckeditor/plugins/forms/lang/cs.js new file mode 100644 index 0000000..5691de9 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/cs.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","cs",{button:{title:"Vlastnosti tlačítka",text:"Popisek",type:"Typ",typeBtn:"Tlačítko",typeSbm:"Odeslat",typeRst:"Obnovit"},checkboxAndRadio:{checkboxTitle:"Vlastnosti zaškrtávacího políčka",radioTitle:"Vlastnosti přepínače",value:"Hodnota",selected:"Zaškrtnuto"},form:{title:"Vlastnosti formuláře",menu:"Vlastnosti formuláře",action:"Akce",method:"Metoda",encoding:"Kódování"},hidden:{title:"Vlastnosti skrytého pole",name:"Název",value:"Hodnota"},select:{title:"Vlastnosti seznamu", +selectInfo:"Info",opAvail:"Dostupná nastavení",value:"Hodnota",size:"Velikost",lines:"Řádků",chkMulti:"Povolit mnohonásobné výběry",opText:"Text",opValue:"Hodnota",btnAdd:"Přidat",btnModify:"Změnit",btnUp:"Nahoru",btnDown:"Dolů",btnSetValue:"Nastavit jako vybranou hodnotu",btnDelete:"Smazat"},textarea:{title:"Vlastnosti textové oblasti",cols:"Sloupců",rows:"Řádků"},textfield:{title:"Vlastnosti textového pole",name:"Název",value:"Hodnota",charWidth:"Šířka ve znacích",maxChars:"Maximální počet znaků", +type:"Typ",typeText:"Text",typePass:"Heslo",typeEmail:"Email",typeSearch:"Hledat",typeTel:"Telefonní číslo",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/cy.js b/bower_components/ckeditor/plugins/forms/lang/cy.js new file mode 100644 index 0000000..332c861 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/cy.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","cy",{button:{title:"Priodweddau Botymau",text:"Testun (Gwerth)",type:"Math",typeBtn:"Botwm",typeSbm:"Anfon",typeRst:"Ailosod"},checkboxAndRadio:{checkboxTitle:"Priodweddau Blwch Ticio",radioTitle:"Priodweddau Botwm Radio",value:"Gwerth",selected:"Dewiswyd"},form:{title:"Priodweddau Ffurflen",menu:"Priodweddau Ffurflen",action:"Gweithred",method:"Dull",encoding:"Amgodio"},hidden:{title:"Priodweddau Maes Cudd",name:"Enw",value:"Gwerth"},select:{title:"Priodweddau Maes Dewis", +selectInfo:"Gwyb Dewis",opAvail:"Opsiynau ar Gael",value:"Gwerth",size:"Maint",lines:"llinellau",chkMulti:"Caniatàu aml-ddewisiadau",opText:"Testun",opValue:"Gwerth",btnAdd:"Ychwanegu",btnModify:"Newid",btnUp:"Lan",btnDown:"Lawr",btnSetValue:"Gosod fel gwerth a ddewiswyd",btnDelete:"Dileu"},textarea:{title:"Priodweddau Ardal Testun",cols:"Colofnau",rows:"Rhesi"},textfield:{title:"Priodweddau Maes Testun",name:"Enw",value:"Gwerth",charWidth:"Lled Nod",maxChars:"Uchafswm y Nodau",type:"Math",typeText:"Testun", +typePass:"Cyfrinair",typeEmail:"Ebost",typeSearch:"Chwilio",typeTel:"Rhif Ffôn",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/da.js b/bower_components/ckeditor/plugins/forms/lang/da.js new file mode 100644 index 0000000..0d459ae --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/da.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","da",{button:{title:"Egenskaber for knap",text:"Tekst",type:"Type",typeBtn:"Knap",typeSbm:"Send",typeRst:"Nulstil"},checkboxAndRadio:{checkboxTitle:"Egenskaber for afkrydsningsfelt",radioTitle:"Egenskaber for alternativknap",value:"Værdi",selected:"Valgt"},form:{title:"Egenskaber for formular",menu:"Egenskaber for formular",action:"Handling",method:"Metode",encoding:"Kodning (encoding)"},hidden:{title:"Egenskaber for skjult felt",name:"Navn",value:"Værdi"},select:{title:"Egenskaber for liste", +selectInfo:"Generelt",opAvail:"Valgmuligheder",value:"Værdi",size:"Størrelse",lines:"Linjer",chkMulti:"Tillad flere valg",opText:"Tekst",opValue:"Værdi",btnAdd:"Tilføj",btnModify:"Redigér",btnUp:"Op",btnDown:"Ned",btnSetValue:"Sæt som valgt",btnDelete:"Slet"},textarea:{title:"Egenskaber for tekstboks",cols:"Kolonner",rows:"Rækker"},textfield:{title:"Egenskaber for tekstfelt",name:"Navn",value:"Værdi",charWidth:"Bredde (tegn)",maxChars:"Max. antal tegn",type:"Type",typeText:"Tekst",typePass:"Adgangskode", +typeEmail:"E-mail",typeSearch:"Søg",typeTel:"Telefon nummer",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/de.js b/bower_components/ckeditor/plugins/forms/lang/de.js new file mode 100644 index 0000000..483c7f9 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/de.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","de",{button:{title:"Button-Eigenschaften",text:"Text (Wert)",type:"Typ",typeBtn:"Button",typeSbm:"Absenden",typeRst:"Zurücksetzen"},checkboxAndRadio:{checkboxTitle:"Checkbox-Eigenschaften",radioTitle:"Optionsfeld-Eigenschaften",value:"Wert",selected:"ausgewählt"},form:{title:"Formular-Eigenschaften",menu:"Formular-Eigenschaften",action:"Action",method:"Method",encoding:"Zeichenkodierung"},hidden:{title:"Verstecktes Feld-Eigenschaften",name:"Name",value:"Wert"},select:{title:"Auswahlfeld-Eigenschaften", +selectInfo:"Info",opAvail:"Mögliche Optionen",value:"Wert",size:"Größe",lines:"Linien",chkMulti:"Erlaube Mehrfachauswahl",opText:"Text",opValue:"Wert",btnAdd:"Hinzufügen",btnModify:"Ändern",btnUp:"Hoch",btnDown:"Runter",btnSetValue:"Setze als Standardwert",btnDelete:"Entfernen"},textarea:{title:"Textfeld (mehrzeilig) Eigenschaften",cols:"Spalten",rows:"Reihen"},textfield:{title:"Textfeld (einzeilig) Eigenschaften",name:"Name",value:"Wert",charWidth:"Zeichenbreite",maxChars:"Max. Zeichen",type:"Typ", +typeText:"Text",typePass:"Passwort",typeEmail:"E-mail",typeSearch:"Suche",typeTel:"Telefonnummer",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/el.js b/bower_components/ckeditor/plugins/forms/lang/el.js new file mode 100644 index 0000000..2f42eff --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/el.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","el",{button:{title:"Ιδιότητες Κουμπιού",text:"Κείμενο (Τιμή)",type:"Τύπος",typeBtn:"Κουμπί",typeSbm:"Υποβολή",typeRst:"Επαναφορά"},checkboxAndRadio:{checkboxTitle:"Ιδιότητες Κουτιού Επιλογής",radioTitle:"Ιδιότητες Κουμπιού Επιλογής",value:"Τιμή",selected:"Επιλεγμένο"},form:{title:"Ιδιότητες Φόρμας",menu:"Ιδιότητες Φόρμας",action:"Ενέργεια",method:"Μέθοδος",encoding:"Κωδικοποίηση"},hidden:{title:"Ιδιότητες Κρυφού Πεδίου",name:"Όνομα",value:"Τιμή"},select:{title:"Ιδιότητες Πεδίου Επιλογής", +selectInfo:"Πληροφορίες Πεδίου Επιλογής",opAvail:"Διαθέσιμες Επιλογές",value:"Τιμή",size:"Μέγεθος",lines:"γραμμές",chkMulti:"Να επιτρέπονται οι πολλαπλές επιλογές",opText:"Κείμενο",opValue:"Τιμή",btnAdd:"Προσθήκη",btnModify:"Τροποποίηση",btnUp:"Πάνω",btnDown:"Κάτω",btnSetValue:"Θέση ως προεπιλογή",btnDelete:"Διαγραφή"},textarea:{title:"Ιδιότητες Περιοχής Κειμένου",cols:"Στήλες",rows:"Σειρές"},textfield:{title:"Ιδιότητες Πεδίου Κειμένου",name:"Όνομα",value:"Τιμή",charWidth:"Πλάτος Χαρακτήρων",maxChars:"Μέγιστοι χαρακτήρες", +type:"Τύπος",typeText:"Κείμενο",typePass:"Κωδικός",typeEmail:"Email",typeSearch:"Αναζήτηση",typeTel:"Αριθμός Τηλεφώνου",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/en-au.js b/bower_components/ckeditor/plugins/forms/lang/en-au.js new file mode 100644 index 0000000..e144ec7 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/en-au.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","en-au",{button:{title:"Button Properties",text:"Text (Value)",type:"Type",typeBtn:"Button",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"Checkbox Properties",radioTitle:"Radio Button Properties",value:"Value",selected:"Selected"},form:{title:"Form Properties",menu:"Form Properties",action:"Action",method:"Method",encoding:"Encoding"},hidden:{title:"Hidden Field Properties",name:"Name",value:"Value"},select:{title:"Selection Field Properties", +selectInfo:"Select Info",opAvail:"Available Options",value:"Value",size:"Size",lines:"lines",chkMulti:"Allow multiple selections",opText:"Text",opValue:"Value",btnAdd:"Add",btnModify:"Modify",btnUp:"Up",btnDown:"Down",btnSetValue:"Set as selected value",btnDelete:"Delete"},textarea:{title:"Textarea Properties",cols:"Columns",rows:"Rows"},textfield:{title:"Text Field Properties",name:"Name",value:"Value",charWidth:"Character Width",maxChars:"Maximum Characters",type:"Type",typeText:"Text",typePass:"Password", +typeEmail:"Email",typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/en-ca.js b/bower_components/ckeditor/plugins/forms/lang/en-ca.js new file mode 100644 index 0000000..8adf26e --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/en-ca.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","en-ca",{button:{title:"Button Properties",text:"Text (Value)",type:"Type",typeBtn:"Button",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"Checkbox Properties",radioTitle:"Radio Button Properties",value:"Value",selected:"Selected"},form:{title:"Form Properties",menu:"Form Properties",action:"Action",method:"Method",encoding:"Encoding"},hidden:{title:"Hidden Field Properties",name:"Name",value:"Value"},select:{title:"Selection Field Properties", +selectInfo:"Select Info",opAvail:"Available Options",value:"Value",size:"Size",lines:"lines",chkMulti:"Allow multiple selections",opText:"Text",opValue:"Value",btnAdd:"Add",btnModify:"Modify",btnUp:"Up",btnDown:"Down",btnSetValue:"Set as selected value",btnDelete:"Delete"},textarea:{title:"Textarea Properties",cols:"Columns",rows:"Rows"},textfield:{title:"Text Field Properties",name:"Name",value:"Value",charWidth:"Character Width",maxChars:"Maximum Characters",type:"Type",typeText:"Text",typePass:"Password", +typeEmail:"Email",typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/en-gb.js b/bower_components/ckeditor/plugins/forms/lang/en-gb.js new file mode 100644 index 0000000..d72b16c --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/en-gb.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","en-gb",{button:{title:"Button Properties",text:"Text (Value)",type:"Type",typeBtn:"Button",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"Checkbox Properties",radioTitle:"Radio Button Properties",value:"Value",selected:"Selected"},form:{title:"Form Properties",menu:"Form Properties",action:"Action",method:"Method",encoding:"Encoding"},hidden:{title:"Hidden Field Properties",name:"Name",value:"Value"},select:{title:"Selection Field Properties", +selectInfo:"Select Info",opAvail:"Available Options",value:"Value",size:"Size",lines:"lines",chkMulti:"Allow multiple selections",opText:"Text",opValue:"Value",btnAdd:"Add",btnModify:"Modify",btnUp:"Up",btnDown:"Down",btnSetValue:"Set as selected value",btnDelete:"Delete"},textarea:{title:"Textarea Properties",cols:"Columns",rows:"Rows"},textfield:{title:"Text Field Properties",name:"Name",value:"Value",charWidth:"Character Width",maxChars:"Maximum Characters",type:"Type",typeText:"Text",typePass:"Password", +typeEmail:"E-mail",typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/en.js b/bower_components/ckeditor/plugins/forms/lang/en.js new file mode 100644 index 0000000..95cf775 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/en.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","en",{button:{title:"Button Properties",text:"Text (Value)",type:"Type",typeBtn:"Button",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"Checkbox Properties",radioTitle:"Radio Button Properties",value:"Value",selected:"Selected"},form:{title:"Form Properties",menu:"Form Properties",action:"Action",method:"Method",encoding:"Encoding"},hidden:{title:"Hidden Field Properties",name:"Name",value:"Value"},select:{title:"Selection Field Properties",selectInfo:"Select Info", +opAvail:"Available Options",value:"Value",size:"Size",lines:"lines",chkMulti:"Allow multiple selections",opText:"Text",opValue:"Value",btnAdd:"Add",btnModify:"Modify",btnUp:"Up",btnDown:"Down",btnSetValue:"Set as selected value",btnDelete:"Delete"},textarea:{title:"Textarea Properties",cols:"Columns",rows:"Rows"},textfield:{title:"Text Field Properties",name:"Name",value:"Value",charWidth:"Character Width",maxChars:"Maximum Characters",type:"Type",typeText:"Text",typePass:"Password",typeEmail:"Email", +typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/eo.js b/bower_components/ckeditor/plugins/forms/lang/eo.js new file mode 100644 index 0000000..26744b6 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/eo.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","eo",{button:{title:"Butonaj atributoj",text:"Teksto (Valoro)",type:"Tipo",typeBtn:"Butono",typeSbm:"Validigi (submit)",typeRst:"Remeti en la originstaton (Reset)"},checkboxAndRadio:{checkboxTitle:"Markobutonaj Atributoj",radioTitle:"Radiobutonaj Atributoj",value:"Valoro",selected:"Selektita"},form:{title:"Formularaj Atributoj",menu:"Formularaj Atributoj",action:"Ago",method:"Metodo",encoding:"Kodoprezento"},hidden:{title:"Atributoj de Kaŝita Kampo",name:"Nomo",value:"Valoro"}, +select:{title:"Atributoj de Elekta Kampo",selectInfo:"Informoj pri la rulummenuo",opAvail:"Elektoj Disponeblaj",value:"Valoro",size:"Grando",lines:"Linioj",chkMulti:"Permesi Plurajn Elektojn",opText:"Teksto",opValue:"Valoro",btnAdd:"Aldoni",btnModify:"Modifi",btnUp:"Supren",btnDown:"Malsupren",btnSetValue:"Agordi kiel Elektitan Valoron",btnDelete:"Forigi"},textarea:{title:"Atributoj de Teksta Areo",cols:"Kolumnoj",rows:"Linioj"},textfield:{title:"Atributoj de Teksta Kampo",name:"Nomo",value:"Valoro", +charWidth:"Signolarĝo",maxChars:"Maksimuma Nombro da Signoj",type:"Tipo",typeText:"Teksto",typePass:"Pasvorto",typeEmail:"retpoŝtadreso",typeSearch:"Serĉi",typeTel:"Telefonnumero",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/es.js b/bower_components/ckeditor/plugins/forms/lang/es.js new file mode 100644 index 0000000..e275cf8 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/es.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","es",{button:{title:"Propiedades de Botón",text:"Texto (Valor)",type:"Tipo",typeBtn:"Boton",typeSbm:"Enviar",typeRst:"Reestablecer"},checkboxAndRadio:{checkboxTitle:"Propiedades de Casilla",radioTitle:"Propiedades de Botón de Radio",value:"Valor",selected:"Seleccionado"},form:{title:"Propiedades de Formulario",menu:"Propiedades de Formulario",action:"Acción",method:"Método",encoding:"Codificación"},hidden:{title:"Propiedades de Campo Oculto",name:"Nombre",value:"Valor"}, +select:{title:"Propiedades de Campo de Selección",selectInfo:"Información",opAvail:"Opciones disponibles",value:"Valor",size:"Tamaño",lines:"Lineas",chkMulti:"Permitir múltiple selección",opText:"Texto",opValue:"Valor",btnAdd:"Agregar",btnModify:"Modificar",btnUp:"Subir",btnDown:"Bajar",btnSetValue:"Establecer como predeterminado",btnDelete:"Eliminar"},textarea:{title:"Propiedades de Area de Texto",cols:"Columnas",rows:"Filas"},textfield:{title:"Propiedades de Campo de Texto",name:"Nombre",value:"Valor", +charWidth:"Caracteres de ancho",maxChars:"Máximo caracteres",type:"Tipo",typeText:"Texto",typePass:"Contraseña",typeEmail:"Correo electrónico",typeSearch:"Buscar",typeTel:"Número de teléfono",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/et.js b/bower_components/ckeditor/plugins/forms/lang/et.js new file mode 100644 index 0000000..0e1d62e --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/et.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","et",{button:{title:"Nupu omadused",text:"Tekst (väärtus)",type:"Liik",typeBtn:"Nupp",typeSbm:"Saada",typeRst:"Lähtesta"},checkboxAndRadio:{checkboxTitle:"Märkeruudu omadused",radioTitle:"Raadionupu omadused",value:"Väärtus",selected:"Märgitud"},form:{title:"Vormi omadused",menu:"Vormi omadused",action:"Toiming",method:"Meetod",encoding:"Kodeering"},hidden:{title:"Varjatud lahtri omadused",name:"Nimi",value:"Väärtus"},select:{title:"Valiklahtri omadused",selectInfo:"Info", +opAvail:"Võimalikud valikud:",value:"Väärtus",size:"Suurus",lines:"ridu",chkMulti:"Võimalik mitu valikut",opText:"Tekst",opValue:"Väärtus",btnAdd:"Lisa",btnModify:"Muuda",btnUp:"Üles",btnDown:"Alla",btnSetValue:"Määra vaikimisi",btnDelete:"Kustuta"},textarea:{title:"Tekstiala omadused",cols:"Veerge",rows:"Ridu"},textfield:{title:"Tekstilahtri omadused",name:"Nimi",value:"Väärtus",charWidth:"Laius (tähemärkides)",maxChars:"Maksimaalselt tähemärke",type:"Liik",typeText:"Tekst",typePass:"Parool",typeEmail:"E-mail", +typeSearch:"Otsi",typeTel:"Telefon",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/eu.js b/bower_components/ckeditor/plugins/forms/lang/eu.js new file mode 100644 index 0000000..cfb5e9a --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/eu.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","eu",{button:{title:"Botoiaren Ezaugarriak",text:"Testua (Balorea)",type:"Mota",typeBtn:"Botoia",typeSbm:"Bidali",typeRst:"Garbitu"},checkboxAndRadio:{checkboxTitle:"Kontrol-laukiko Ezaugarriak",radioTitle:"Aukera-botoiaren Ezaugarriak",value:"Balorea",selected:"Hautatuta"},form:{title:"Formularioaren Ezaugarriak",menu:"Formularioaren Ezaugarriak",action:"Ekintza",method:"Metodoa",encoding:"Kodeketa"},hidden:{title:"Ezkutuko Eremuaren Ezaugarriak",name:"Izena",value:"Balorea"}, +select:{title:"Hautespen Eremuaren Ezaugarriak",selectInfo:"Informazioa",opAvail:"Aukera Eskuragarriak",value:"Balorea",size:"Tamaina",lines:"lerro kopurura",chkMulti:"Hautaketa anitzak baimendu",opText:"Testua",opValue:"Balorea",btnAdd:"Gehitu",btnModify:"Aldatu",btnUp:"Gora",btnDown:"Behera",btnSetValue:"Aukeratutako balorea ezarri",btnDelete:"Ezabatu"},textarea:{title:"Testu-arearen Ezaugarriak",cols:"Zutabeak",rows:"Lerroak"},textfield:{title:"Testu Eremuaren Ezaugarriak",name:"Izena",value:"Balorea", +charWidth:"Zabalera",maxChars:"Zenbat karaktere gehienez",type:"Mota",typeText:"Testua",typePass:"Pasahitza",typeEmail:"E-posta",typeSearch:"Bilatu",typeTel:"Telefono Zenbakia",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/fa.js b/bower_components/ckeditor/plugins/forms/lang/fa.js new file mode 100644 index 0000000..326ada0 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/fa.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","fa",{button:{title:"ویژگی​های دکمه",text:"متن (مقدار)",type:"نوع",typeBtn:"دکمه",typeSbm:"ثبت",typeRst:"بازنشانی (Reset)"},checkboxAndRadio:{checkboxTitle:"ویژگی​های خانهٴ گزینه​ای",radioTitle:"ویژگی​های دکمهٴ رادیویی",value:"مقدار",selected:"برگزیده"},form:{title:"ویژگی​های فرم",menu:"ویژگی​های فرم",action:"رویداد",method:"متد",encoding:"رمزنگاری"},hidden:{title:"ویژگی​های فیلد پنهان",name:"نام",value:"مقدار"},select:{title:"ویژگی​های فیلد چندگزینه​ای",selectInfo:"اطلاعات", +opAvail:"گزینه​های دردسترس",value:"مقدار",size:"اندازه",lines:"خطوط",chkMulti:"گزینش چندگانه فراهم باشد",opText:"متن",opValue:"مقدار",btnAdd:"افزودن",btnModify:"ویرایش",btnUp:"بالا",btnDown:"پائین",btnSetValue:"تنظیم به عنوان مقدار برگزیده",btnDelete:"پاککردن"},textarea:{title:"ویژگی​های ناحیهٴ متنی",cols:"ستون​ها",rows:"سطرها"},textfield:{title:"ویژگی​های فیلد متنی",name:"نام",value:"مقدار",charWidth:"پهنای نویسه",maxChars:"بیشینهٴ نویسه​ها",type:"نوع",typeText:"متن",typePass:"گذرواژه",typeEmail:"ایمیل", +typeSearch:"جستجو",typeTel:"شماره تلفن",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/fi.js b/bower_components/ckeditor/plugins/forms/lang/fi.js new file mode 100644 index 0000000..31cf6d0 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/fi.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","fi",{button:{title:"Painikkeen ominaisuudet",text:"Teksti (arvo)",type:"Tyyppi",typeBtn:"Painike",typeSbm:"Lähetä",typeRst:"Tyhjennä"},checkboxAndRadio:{checkboxTitle:"Valintaruudun ominaisuudet",radioTitle:"Radiopainikkeen ominaisuudet",value:"Arvo",selected:"Valittu"},form:{title:"Lomakkeen ominaisuudet",menu:"Lomakkeen ominaisuudet",action:"Toiminto",method:"Tapa",encoding:"Enkoodaus"},hidden:{title:"Piilokentän ominaisuudet",name:"Nimi",value:"Arvo"},select:{title:"Valintakentän ominaisuudet", +selectInfo:"Info",opAvail:"Ominaisuudet",value:"Arvo",size:"Koko",lines:"Rivit",chkMulti:"Salli usea valinta",opText:"Teksti",opValue:"Arvo",btnAdd:"Lisää",btnModify:"Muuta",btnUp:"Ylös",btnDown:"Alas",btnSetValue:"Aseta valituksi",btnDelete:"Poista"},textarea:{title:"Tekstilaatikon ominaisuudet",cols:"Sarakkeita",rows:"Rivejä"},textfield:{title:"Tekstikentän ominaisuudet",name:"Nimi",value:"Arvo",charWidth:"Leveys",maxChars:"Maksimi merkkimäärä",type:"Tyyppi",typeText:"Teksti",typePass:"Salasana", +typeEmail:"Sähköposti",typeSearch:"Haku",typeTel:"Puhelinnumero",typeUrl:"Osoite"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/fo.js b/bower_components/ckeditor/plugins/forms/lang/fo.js new file mode 100644 index 0000000..3ff4950 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/fo.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","fo",{button:{title:"Eginleikar fyri knøtt",text:"Tekstur",type:"Slag",typeBtn:"Knøttur",typeSbm:"Send",typeRst:"Nullstilla"},checkboxAndRadio:{checkboxTitle:"Eginleikar fyri flugubein",radioTitle:"Eginleikar fyri radioknøtt",value:"Virði",selected:"Valt"},form:{title:"Eginleikar fyri Form",menu:"Eginleikar fyri Form",action:"Hending",method:"Háttur",encoding:"Encoding"},hidden:{title:"Eginleikar fyri fjaldan teig",name:"Navn",value:"Virði"},select:{title:"Eginleikar fyri valskrá", +selectInfo:"Upplýsingar",opAvail:"Tøkir møguleikar",value:"Virði",size:"Stødd",lines:"Linjur",chkMulti:"Loyv fleiri valmøguleikum samstundis",opText:"Tekstur",opValue:"Virði",btnAdd:"Legg afturat",btnModify:"Broyt",btnUp:"Upp",btnDown:"Niður",btnSetValue:"Set sum valt virði",btnDelete:"Strika"},textarea:{title:"Eginleikar fyri tekstumráði",cols:"kolonnur",rows:"røðir"},textfield:{title:"Eginleikar fyri tekstteig",name:"Navn",value:"Virði",charWidth:"Breidd (sjónlig tekn)",maxChars:"Mest loyvdu tekn", +type:"Slag",typeText:"Tekstur",typePass:"Loyniorð",typeEmail:"Email",typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/fr-ca.js b/bower_components/ckeditor/plugins/forms/lang/fr-ca.js new file mode 100644 index 0000000..f44c8d6 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/fr-ca.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","fr-ca",{button:{title:"Propriétés du bouton",text:"Texte (Valeur)",type:"Type",typeBtn:"Bouton",typeSbm:"Soumettre",typeRst:"Réinitialiser"},checkboxAndRadio:{checkboxTitle:"Propriétés de la case à cocher",radioTitle:"Propriétés du bouton radio",value:"Valeur",selected:"Sélectionné"},form:{title:"Propriétés du formulaire",menu:"Propriétés du formulaire",action:"Action",method:"Méthode",encoding:"Encodage"},hidden:{title:"Propriétés du champ caché",name:"Nom",value:"Valeur"}, +select:{title:"Propriétés du champ de sélection",selectInfo:"Info",opAvail:"Options disponibles",value:"Valeur",size:"Taille",lines:"lignes",chkMulti:"Permettre les sélections multiples",opText:"Texte",opValue:"Valeur",btnAdd:"Ajouter",btnModify:"Modifier",btnUp:"Monter",btnDown:"Descendre",btnSetValue:"Valeur sélectionnée",btnDelete:"Supprimer"},textarea:{title:"Propriétés de la zone de texte",cols:"Colonnes",rows:"Lignes"},textfield:{title:"Propriétés du champ texte",name:"Nom",value:"Valeur",charWidth:"Largeur de caractères", +maxChars:"Nombre maximum de caractères",type:"Type",typeText:"Texte",typePass:"Mot de passe",typeEmail:"Courriel",typeSearch:"Recherche",typeTel:"Numéro de téléphone",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/fr.js b/bower_components/ckeditor/plugins/forms/lang/fr.js new file mode 100644 index 0000000..eff0fd0 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/fr.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","fr",{button:{title:"Propriétés du bouton",text:"Texte (Value)",type:"Type",typeBtn:"Bouton",typeSbm:"Validation (submit)",typeRst:"Remise à zéro"},checkboxAndRadio:{checkboxTitle:"Propriétés de la case à cocher",radioTitle:"Propriétés du bouton Radio",value:"Valeur",selected:"Sélectionné"},form:{title:"Propriétés du formulaire",menu:"Propriétés du formulaire",action:"Action",method:"Méthode",encoding:"Encodage"},hidden:{title:"Propriétés du champ caché",name:"Nom", +value:"Valeur"},select:{title:"Propriétés du menu déroulant",selectInfo:"Informations sur le menu déroulant",opAvail:"Options disponibles",value:"Valeur",size:"Taille",lines:"Lignes",chkMulti:"Permettre les sélections multiples",opText:"Texte",opValue:"Valeur",btnAdd:"Ajouter",btnModify:"Modifier",btnUp:"Haut",btnDown:"Bas",btnSetValue:"Définir comme valeur sélectionnée",btnDelete:"Supprimer"},textarea:{title:"Propriétés de la zone de texte",cols:"Colonnes",rows:"Lignes"},textfield:{title:"Propriétés du champ texte", +name:"Nom",value:"Valeur",charWidth:"Taille des caractères",maxChars:"Nombre maximum de caractères",type:"Type",typeText:"Texte",typePass:"Mot de passe",typeEmail:"E-mail",typeSearch:"Rechercher",typeTel:"Numéro de téléphone",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/gl.js b/bower_components/ckeditor/plugins/forms/lang/gl.js new file mode 100644 index 0000000..792ee3f --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/gl.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","gl",{button:{title:"Propiedades do botón",text:"Texto (Valor)",type:"Tipo",typeBtn:"Botón",typeSbm:"Enviar",typeRst:"Restabelever"},checkboxAndRadio:{checkboxTitle:"Propiedades da caixa de selección",radioTitle:"Propiedades do botón de opción",value:"Valor",selected:"Seleccionado"},form:{title:"Propiedades do formulario",menu:"Propiedades do formulario",action:"Acción",method:"Método",encoding:"Codificación"},hidden:{title:"Propiedades do campo agochado",name:"Nome", +value:"Valor"},select:{title:"Propiedades do campo de selección",selectInfo:"Información",opAvail:"Opcións dispoñíbeis",value:"Valor",size:"Tamaño",lines:"liñas",chkMulti:"Permitir múltiplas seleccións",opText:"Texto",opValue:"Valor",btnAdd:"Engadir",btnModify:"Modificar",btnUp:"Subir",btnDown:"Baixar",btnSetValue:"Estabelecer como valor seleccionado",btnDelete:"Eliminar"},textarea:{title:"Propiedades da área de texto",cols:"Columnas",rows:"Filas"},textfield:{title:"Propiedades do campo de texto", +name:"Nome",value:"Valor",charWidth:"Largo do carácter",maxChars:"Núm. máximo de caracteres",type:"Tipo",typeText:"Texto",typePass:"Contrasinal",typeEmail:"Correo",typeSearch:"Buscar",typeTel:"Número de teléfono",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/gu.js b/bower_components/ckeditor/plugins/forms/lang/gu.js new file mode 100644 index 0000000..976d136 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/gu.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","gu",{button:{title:"બટનના ગુણ",text:"ટેક્સ્ટ (વૅલ્યૂ)",type:"પ્રકાર",typeBtn:"બટન",typeSbm:"સબ્મિટ",typeRst:"રિસેટ"},checkboxAndRadio:{checkboxTitle:"ચેક બોક્સ ગુણ",radioTitle:"રેડિઓ બટનના ગુણ",value:"વૅલ્યૂ",selected:"સિલેક્ટેડ"},form:{title:"ફૉર્મ/પત્રકના ગુણ",menu:"ફૉર્મ/પત્રકના ગુણ",action:"ક્રિયા",method:"પદ્ધતિ",encoding:"અન્કોડીન્ગ"},hidden:{title:"ગુપ્ત ક્ષેત્રના ગુણ",name:"નામ",value:"વૅલ્યૂ"},select:{title:"પસંદગી ક્ષેત્રના ગુણ",selectInfo:"સૂચના",opAvail:"ઉપલબ્ધ વિકલ્પ", +value:"વૅલ્યૂ",size:"સાઇઝ",lines:"લીટીઓ",chkMulti:"એકથી વધારે પસંદ કરી શકો",opText:"ટેક્સ્ટ",opValue:"વૅલ્યૂ",btnAdd:"ઉમેરવું",btnModify:"બદલવું",btnUp:"ઉપર",btnDown:"નીચે",btnSetValue:"પસંદ કરલી વૅલ્યૂ સેટ કરો",btnDelete:"રદ કરવું"},textarea:{title:"ટેક્સ્ટ એઅરિઆ, શબ્દ વિસ્તારના ગુણ",cols:"કૉલમ/ઊભી કટાર",rows:"પંક્તિઓ"},textfield:{title:"ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્રના ગુણ",name:"નામ",value:"વૅલ્યૂ",charWidth:"કેરેક્ટરની પહોળાઈ",maxChars:"અધિકતમ કેરેક્ટર",type:"ટાઇપ",typeText:"ટેક્સ્ટ",typePass:"પાસવર્ડ", +typeEmail:"Email",typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/he.js b/bower_components/ckeditor/plugins/forms/lang/he.js new file mode 100644 index 0000000..102ba4c --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/he.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("forms","he",{button:{title:"מאפייני כפתור",text:"טקסט (ערך)",type:"סוג",typeBtn:"כפתור",typeSbm:"שליחה",typeRst:"איפוס"},checkboxAndRadio:{checkboxTitle:"מאפייני תיבת סימון",radioTitle:"מאפייני לחצן אפשרויות",value:"ערך",selected:"מסומן"},form:{title:"מאפיני טופס",menu:"מאפיני טופס",action:"שלח אל",method:"סוג שליחה",encoding:"קידוד"},hidden:{title:"מאפיני שדה חבוי",name:"שם",value:"ערך"},select:{title:"מאפייני שדה בחירה",selectInfo:"מידע",opAvail:"אפשרויות זמינות",value:"ערך", +size:"גודל",lines:"שורות",chkMulti:"איפשור בחירות מרובות",opText:"טקסט",opValue:"ערך",btnAdd:"הוספה",btnModify:"שינוי",btnUp:"למעלה",btnDown:"למטה",btnSetValue:"קביעה כברירת מחדל",btnDelete:"מחיקה"},textarea:{title:"מאפייני איזור טקסט",cols:"עמודות",rows:"שורות"},textfield:{title:"מאפייני שדה טקסט",name:"שם",value:"ערך",charWidth:"רוחב לפי תווים",maxChars:"מקסימום תווים",type:"סוג",typeText:"טקסט",typePass:"סיסמה",typeEmail:'דוא"ל',typeSearch:"חיפוש",typeTel:"מספר טלפון",typeUrl:"כתובת (URL)"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/hi.js b/bower_components/ckeditor/plugins/forms/lang/hi.js new file mode 100644 index 0000000..28f074e --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/hi.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","hi",{button:{title:"बटन प्रॉपर्टीज़",text:"टेक्स्ट (वैल्यू)",type:"प्रकार",typeBtn:"बटन",typeSbm:"सब्मिट",typeRst:"रिसेट"},checkboxAndRadio:{checkboxTitle:"चॅक बॉक्स प्रॉपर्टीज़",radioTitle:"रेडिओ बटन प्रॉपर्टीज़",value:"वैल्यू",selected:"सॅलॅक्टॅड"},form:{title:"फ़ॉर्म प्रॉपर्टीज़",menu:"फ़ॉर्म प्रॉपर्टीज़",action:"क्रिया",method:"तरीका",encoding:"Encoding"},hidden:{title:"गुप्त फ़ील्ड प्रॉपर्टीज़",name:"नाम",value:"वैल्यू"},select:{title:"चुनाव फ़ील्ड प्रॉपर्टीज़",selectInfo:"सूचना", +opAvail:"उपलब्ध विकल्प",value:"वैल्यू",size:"साइज़",lines:"पंक्तियाँ",chkMulti:"एक से ज्यादा विकल्प चुनने दें",opText:"टेक्स्ट",opValue:"वैल्यू",btnAdd:"जोड़ें",btnModify:"बदलें",btnUp:"ऊपर",btnDown:"नीचे",btnSetValue:"चुनी गई वैल्यू सॅट करें",btnDelete:"डिलीट"},textarea:{title:"टेक्स्त एरिया प्रॉपर्टीज़",cols:"कालम",rows:"पंक्तियां"},textfield:{title:"टेक्स्ट फ़ील्ड प्रॉपर्टीज़",name:"नाम",value:"वैल्यू",charWidth:"करॅक्टर की चौढ़ाई",maxChars:"अधिकतम करॅक्टर",type:"टाइप",typeText:"टेक्स्ट",typePass:"पास्वर्ड", +typeEmail:"Email",typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/hr.js b/bower_components/ckeditor/plugins/forms/lang/hr.js new file mode 100644 index 0000000..9965827 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/hr.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","hr",{button:{title:"Button svojstva",text:"Tekst (vrijednost)",type:"Vrsta",typeBtn:"Gumb",typeSbm:"Pošalji",typeRst:"Poništi"},checkboxAndRadio:{checkboxTitle:"Checkbox svojstva",radioTitle:"Radio Button svojstva",value:"Vrijednost",selected:"Odabrano"},form:{title:"Form svojstva",menu:"Form svojstva",action:"Akcija",method:"Metoda",encoding:"Encoding"},hidden:{title:"Hidden Field svojstva",name:"Ime",value:"Vrijednost"},select:{title:"Selection svojstva",selectInfo:"Info", +opAvail:"Dostupne opcije",value:"Vrijednost",size:"Veličina",lines:"linija",chkMulti:"Dozvoli višestruki odabir",opText:"Tekst",opValue:"Vrijednost",btnAdd:"Dodaj",btnModify:"Promijeni",btnUp:"Gore",btnDown:"Dolje",btnSetValue:"Postavi kao odabranu vrijednost",btnDelete:"Obriši"},textarea:{title:"Textarea svojstva",cols:"Kolona",rows:"Redova"},textfield:{title:"Text Field svojstva",name:"Ime",value:"Vrijednost",charWidth:"Širina",maxChars:"Najviše karaktera",type:"Vrsta",typeText:"Tekst",typePass:"Šifra", +typeEmail:"Email",typeSearch:"Traži",typeTel:"Broj telefona",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/hu.js b/bower_components/ckeditor/plugins/forms/lang/hu.js new file mode 100644 index 0000000..962606d --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/hu.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","hu",{button:{title:"Gomb tulajdonságai",text:"Szöveg (Érték)",type:"Típus",typeBtn:"Gomb",typeSbm:"Küldés",typeRst:"Alaphelyzet"},checkboxAndRadio:{checkboxTitle:"Jelölőnégyzet tulajdonságai",radioTitle:"Választógomb tulajdonságai",value:"Érték",selected:"Kiválasztott"},form:{title:"Űrlap tulajdonságai",menu:"Űrlap tulajdonságai",action:"Adatfeldolgozást végző hivatkozás",method:"Adatküldés módja",encoding:"Kódolás"},hidden:{title:"Rejtett mező tulajdonságai",name:"Név", +value:"Érték"},select:{title:"Legördülő lista tulajdonságai",selectInfo:"Alaptulajdonságok",opAvail:"Elérhető opciók",value:"Érték",size:"Méret",lines:"sor",chkMulti:"több sor is kiválasztható",opText:"Szöveg",opValue:"Érték",btnAdd:"Hozzáad",btnModify:"Módosít",btnUp:"Fel",btnDown:"Le",btnSetValue:"Legyen az alapértelmezett érték",btnDelete:"Töröl"},textarea:{title:"Szövegterület tulajdonságai",cols:"Karakterek száma egy sorban",rows:"Sorok száma"},textfield:{title:"Szövegmező tulajdonságai",name:"Név", +value:"Érték",charWidth:"Megjelenített karakterek száma",maxChars:"Maximális karakterszám",type:"Típus",typeText:"Szöveg",typePass:"Jelszó",typeEmail:"Ímél",typeSearch:"Keresés",typeTel:"Telefonszám",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/id.js b/bower_components/ckeditor/plugins/forms/lang/id.js new file mode 100644 index 0000000..7fdc87f --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/id.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","id",{button:{title:"Button Properties",text:"Teks (Nilai)",type:"Tipe",typeBtn:"Tombol",typeSbm:"Menyerahkan",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"Checkbox Properties",radioTitle:"Radio Button Properties",value:"Nilai",selected:"Terpilih"},form:{title:"Form Properties",menu:"Form Properties",action:"Aksi",method:"Metode",encoding:"Encoding"},hidden:{title:"Hidden Field Properties",name:"Nama",value:"Nilai"},select:{title:"Selection Field Properties", +selectInfo:"Select Info",opAvail:"Available Options",value:"Nilai",size:"Ukuran",lines:"garis",chkMulti:"Izinkan pemilihan ganda",opText:"Teks",opValue:"Nilai",btnAdd:"Tambah",btnModify:"Modifikasi",btnUp:"Atas",btnDown:"Bawah",btnSetValue:"Set as selected value",btnDelete:"Hapus"},textarea:{title:"Textarea Properties",cols:"Kolom",rows:"Baris"},textfield:{title:"Text Field Properties",name:"Name",value:"Nilai",charWidth:"Character Width",maxChars:"Maximum Characters",type:"Tipe",typeText:"Teks", +typePass:"Kata kunci",typeEmail:"Surel",typeSearch:"Cari",typeTel:"Nomor Telepon",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/is.js b/bower_components/ckeditor/plugins/forms/lang/is.js new file mode 100644 index 0000000..7ca735e --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/is.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","is",{button:{title:"Eigindi hnapps",text:"Texti",type:"Gerð",typeBtn:"Hnappur",typeSbm:"Staðfesta",typeRst:"Hreinsa"},checkboxAndRadio:{checkboxTitle:"Eigindi markreits",radioTitle:"Eigindi valhnapps",value:"Gildi",selected:"Valið"},form:{title:"Eigindi innsláttarforms",menu:"Eigindi innsláttarforms",action:"Aðgerð",method:"Aðferð",encoding:"Encoding"},hidden:{title:"Eigindi falins svæðis",name:"Nafn",value:"Gildi"},select:{title:"Eigindi lista",selectInfo:"Upplýsingar", +opAvail:"Kostir",value:"Gildi",size:"Stærð",lines:"línur",chkMulti:"Leyfa fleiri kosti",opText:"Texti",opValue:"Gildi",btnAdd:"Bæta við",btnModify:"Breyta",btnUp:"Upp",btnDown:"Niður",btnSetValue:"Merkja sem valið",btnDelete:"Eyða"},textarea:{title:"Eigindi textasvæðis",cols:"Dálkar",rows:"Línur"},textfield:{title:"Eigindi textareits",name:"Nafn",value:"Gildi",charWidth:"Breidd (leturtákn)",maxChars:"Hámarksfjöldi leturtákna",type:"Gerð",typeText:"Texti",typePass:"Lykilorð",typeEmail:"Email",typeSearch:"Search", +typeTel:"Telephone Number",typeUrl:"Vefslóð"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/it.js b/bower_components/ckeditor/plugins/forms/lang/it.js new file mode 100644 index 0000000..90f4f58 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/it.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","it",{button:{title:"Proprietà bottone",text:"Testo (Valore)",type:"Tipo",typeBtn:"Bottone",typeSbm:"Invio",typeRst:"Annulla"},checkboxAndRadio:{checkboxTitle:"Proprietà checkbox",radioTitle:"Proprietà radio button",value:"Valore",selected:"Selezionato"},form:{title:"Proprietà modulo",menu:"Proprietà modulo",action:"Azione",method:"Metodo",encoding:"Codifica"},hidden:{title:"Proprietà campo nascosto",name:"Nome",value:"Valore"},select:{title:"Proprietà menu di selezione", +selectInfo:"Info",opAvail:"Opzioni disponibili",value:"Valore",size:"Dimensione",lines:"righe",chkMulti:"Permetti selezione multipla",opText:"Testo",opValue:"Valore",btnAdd:"Aggiungi",btnModify:"Modifica",btnUp:"Su",btnDown:"Gi",btnSetValue:"Imposta come predefinito",btnDelete:"Rimuovi"},textarea:{title:"Proprietà area di testo",cols:"Colonne",rows:"Righe"},textfield:{title:"Proprietà campo di testo",name:"Nome",value:"Valore",charWidth:"Larghezza",maxChars:"Numero massimo di caratteri",type:"Tipo", +typeText:"Testo",typePass:"Password",typeEmail:"Email",typeSearch:"Cerca",typeTel:"Numero di telefono",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/ja.js b/bower_components/ckeditor/plugins/forms/lang/ja.js new file mode 100644 index 0000000..8e615cf --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/ja.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("forms","ja",{button:{title:"ボタン プロパティ",text:"テキスト (値)",type:"タイプ",typeBtn:"ボタン",typeSbm:"送信",typeRst:"リセット"},checkboxAndRadio:{checkboxTitle:"チェックボックスのプロパティ",radioTitle:"ラジオボタンのプロパティ",value:"値",selected:"選択済み"},form:{title:"フォームのプロパティ",menu:"フォームのプロパティ",action:"アクション (action)",method:"メソッド (method)",encoding:"エンコード方式 (encoding)"},hidden:{title:"不可視フィールド プロパティ",name:"名前 (name)",value:"値 (value)"},select:{title:"選択フィールドのプロパティ",selectInfo:"情報",opAvail:"利用可能なオプション",value:"選択項目値", +size:"サイズ",lines:"行",chkMulti:"複数選択を許可",opText:"選択項目名",opValue:"値",btnAdd:"追加",btnModify:"編集",btnUp:"上へ",btnDown:"下へ",btnSetValue:"選択した値を設定",btnDelete:"削除"},textarea:{title:"テキストエリア プロパティ",cols:"列",rows:"行"},textfield:{title:"1行テキスト プロパティ",name:"名前",value:"値",charWidth:"サイズ",maxChars:"最大長",type:"タイプ",typeText:"テキスト",typePass:"パスワード入力",typeEmail:"メール",typeSearch:"検索",typeTel:"電話番号",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/ka.js b/bower_components/ckeditor/plugins/forms/lang/ka.js new file mode 100644 index 0000000..06b8131 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/ka.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","ka",{button:{title:"ღილაკის პარამეტრები",text:"ტექსტი",type:"ტიპი",typeBtn:"ღილაკი",typeSbm:"გაგზავნა",typeRst:"გასუფთავება"},checkboxAndRadio:{checkboxTitle:"მონიშვნის ღილაკის (Checkbox) პარამეტრები",radioTitle:"ასარჩევი ღილაკის (Radio) პარამეტრები",value:"ტექსტი",selected:"არჩეული"},form:{title:"ფორმის პარამეტრები",menu:"ფორმის პარამეტრები",action:"ქმედება",method:"მეთოდი",encoding:"კოდირება"},hidden:{title:"მალული ველის პარამეტრები",name:"სახელი",value:"მნიშვნელობა"}, +select:{title:"არჩევის ველის პარამეტრები",selectInfo:"ინფორმაცია",opAvail:"შესაძლებელი ვარიანტები",value:"მნიშვნელობა",size:"ზომა",lines:"ხაზები",chkMulti:"მრავლობითი არჩევანის საშუალება",opText:"ტექსტი",opValue:"მნიშვნელობა",btnAdd:"დამატება",btnModify:"შეცვლა",btnUp:"ზემოთ",btnDown:"ქვემოთ",btnSetValue:"ამორჩეულ მნიშვნელოვნად დაყენება",btnDelete:"წაშლა"},textarea:{title:"ტექსტური არის პარამეტრები",cols:"სვეტები",rows:"სტრიქონები"},textfield:{title:"ტექსტური ველის პარამეტრები",name:"სახელი",value:"მნიშვნელობა", +charWidth:"სიმბოლოს ზომა",maxChars:"ასოების მაქსიმალური ოდენობა",type:"ტიპი",typeText:"ტექსტი",typePass:"პაროლი",typeEmail:"Email",typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/km.js b/bower_components/ckeditor/plugins/forms/lang/km.js new file mode 100644 index 0000000..e9c1269 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/km.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","km",{button:{title:"លក្ខណៈ​ប៊ូតុង",text:"អត្ថបទ (តម្លៃ)",type:"ប្រភេទ",typeBtn:"ប៊ូតុង",typeSbm:"ដាក់ស្នើ",typeRst:"កំណត់​ឡើង​វិញ"},checkboxAndRadio:{checkboxTitle:"លក្ខណៈ​ប្រអប់​ធីក",radioTitle:"លក្ខនៈ​ប៊ូតុង​មូល",value:"តម្លៃ",selected:"បាន​ជ្រើស"},form:{title:"លក្ខណៈ​បែបបទ",menu:"លក្ខណៈ​បែបបទ",action:"សកម្មភាព",method:"វិធីសាស្ត្រ",encoding:"ការ​អ៊ិនកូដ"},hidden:{title:"លក្ខណៈ​វាល​កំបាំង",name:"ឈ្មោះ",value:"តម្លៃ"},select:{title:"លក្ខណៈ​វាល​ជម្រើស",selectInfo:"ព័ត៌មាន​ជម្រើស", +opAvail:"ជម្រើស​ដែល​មាន",value:"តម្លៃ",size:"ទំហំ",lines:"បន្ទាត់",chkMulti:"អនុញ្ញាត​ពហុ​ជម្រើស",opText:"អត្ថបទ",opValue:"តម្លៃ",btnAdd:"បន្ថែម",btnModify:"ផ្លាស់ប្តូរ",btnUp:"លើ",btnDown:"ក្រោម",btnSetValue:"កំណត់​ជា​តម្លៃ​ដែល​បាន​ជ្រើស",btnDelete:"លុប"},textarea:{title:"លក្ខណៈ​ប្រអប់​អត្ថបទ",cols:"ជួរឈរ",rows:"ជួរដេក"},textfield:{title:"លក្ខណៈ​វាល​អត្ថបទ",name:"ឈ្មោះ",value:"តម្លៃ",charWidth:"ទទឹង​តួ​អក្សរ",maxChars:"អក្សរអតិបរិមា",type:"ប្រភេទ",typeText:"អត្ថបទ",typePass:"ពាក្យសម្ងាត់",typeEmail:"អ៊ីមែល", +typeSearch:"ស្វែង​រក",typeTel:"លេខ​ទូរសព្ទ",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/ko.js b/bower_components/ckeditor/plugins/forms/lang/ko.js new file mode 100644 index 0000000..7e7ea05 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/ko.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("forms","ko",{button:{title:"버튼 속성",text:"버튼글자(값)",type:"버튼종류",typeBtn:"Button",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"체크박스 속성",radioTitle:"라디오버튼 속성",value:"값",selected:"선택됨"},form:{title:"폼 속성",menu:"폼 속성",action:"실행경로(Action)",method:"방법(Method)",encoding:"Encoding"},hidden:{title:"숨김필드 속성",name:"이름",value:"값"},select:{title:"펼침목록 속성",selectInfo:"정보",opAvail:"선택옵션",value:"값",size:"세로크기",lines:"줄",chkMulti:"여러항목 선택 허용",opText:"이름",opValue:"값", +btnAdd:"추가",btnModify:"변경",btnUp:"위로",btnDown:"아래로",btnSetValue:"선택된것으로 설정",btnDelete:"삭제"},textarea:{title:"입력영역 속성",cols:"칸수",rows:"줄수"},textfield:{title:"입력필드 속성",name:"이름",value:"값",charWidth:"글자 너비",maxChars:"최대 글자수",type:"종류",typeText:"문자열",typePass:"비밀번호",typeEmail:"이메일",typeSearch:"검색",typeTel:"전화번호",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/ku.js b/bower_components/ckeditor/plugins/forms/lang/ku.js new file mode 100644 index 0000000..7559989 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/ku.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","ku",{button:{title:"خاسیەتی دوگمە",text:"(نرخی) دەق",type:"جۆر",typeBtn:"دوگمە",typeSbm:"بنێرە",typeRst:"ڕێکخستنەوە"},checkboxAndRadio:{checkboxTitle:"خاسیەتی چووارگۆشی پشکنین",radioTitle:"خاسیەتی جێگرەوەی دوگمە",value:"نرخ",selected:"هەڵبژاردرا"},form:{title:"خاسیەتی داڕشتە",menu:"خاسیەتی داڕشتە",action:"کردار",method:"ڕێگە",encoding:"بەکۆدکەر"},hidden:{title:"خاسیەتی خانەی شاردراوە",name:"ناو",value:"نرخ"},select:{title:"هەڵبژاردەی خاسیەتی خانە",selectInfo:"زانیاری", +opAvail:"هەڵبژاردەی لەبەردەستدابوون",value:"نرخ",size:"گەورەیی",lines:"هێڵەکان",chkMulti:"ڕێدان بەفره هەڵبژارده",opText:"دەق",opValue:"نرخ",btnAdd:"زیادکردن",btnModify:"گۆڕانکاری",btnUp:"سەرەوه",btnDown:"خوارەوە",btnSetValue:"دابنێ وەك نرخێکی هەڵبژێردراو",btnDelete:"سڕینەوه"},textarea:{title:"خاسیەتی ڕووبەری دەق",cols:"ستوونەکان",rows:"ڕیزەکان"},textfield:{title:"خاسیەتی خانەی دەق",name:"ناو",value:"نرخ",charWidth:"پانی نووسە",maxChars:"ئەوپەڕی نووسە",type:"جۆر",typeText:"دەق",typePass:"پێپەڕەوشە", +typeEmail:"ئیمەیل",typeSearch:"گەڕان",typeTel:"ژمارەی تەلەفۆن",typeUrl:"ناونیشانی بەستەر"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/lt.js b/bower_components/ckeditor/plugins/forms/lang/lt.js new file mode 100644 index 0000000..743b830 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/lt.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","lt",{button:{title:"Mygtuko savybės",text:"Tekstas (Reikšmė)",type:"Tipas",typeBtn:"Mygtukas",typeSbm:"Siųsti",typeRst:"Išvalyti"},checkboxAndRadio:{checkboxTitle:"Žymimojo langelio savybės",radioTitle:"Žymimosios akutės savybės",value:"Reikšmė",selected:"Pažymėtas"},form:{title:"Formos savybės",menu:"Formos savybės",action:"Veiksmas",method:"Metodas",encoding:"Kodavimas"},hidden:{title:"Nerodomo lauko savybės",name:"Vardas",value:"Reikšmė"},select:{title:"Atrankos lauko savybės", +selectInfo:"Informacija",opAvail:"Galimos parinktys",value:"Reikšmė",size:"Dydis",lines:"eilučių",chkMulti:"Leisti daugeriopą atranką",opText:"Tekstas",opValue:"Reikšmė",btnAdd:"Įtraukti",btnModify:"Modifikuoti",btnUp:"Aukštyn",btnDown:"Žemyn",btnSetValue:"Laikyti pažymėta reikšme",btnDelete:"Trinti"},textarea:{title:"Teksto srities savybės",cols:"Ilgis",rows:"Plotis"},textfield:{title:"Teksto lauko savybės",name:"Vardas",value:"Reikšmė",charWidth:"Ilgis simboliais",maxChars:"Maksimalus simbolių skaičius", +type:"Tipas",typeText:"Tekstas",typePass:"Slaptažodis",typeEmail:"El. paštas",typeSearch:"Paieška",typeTel:"Telefono numeris",typeUrl:"Nuoroda"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/lv.js b/bower_components/ckeditor/plugins/forms/lang/lv.js new file mode 100644 index 0000000..289cd6a --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/lv.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","lv",{button:{title:"Pogas īpašības",text:"Teksts (vērtība)",type:"Tips",typeBtn:"Poga",typeSbm:"Nosūtīt",typeRst:"Atcelt"},checkboxAndRadio:{checkboxTitle:"Atzīmēšanas kastītes īpašības",radioTitle:"Izvēles poga īpašības",value:"Vērtība",selected:"Iezīmēts"},form:{title:"Formas īpašības",menu:"Formas īpašības",action:"Darbība",method:"Metode",encoding:"Kodējums"},hidden:{title:"Paslēptās teksta rindas īpašības",name:"Nosaukums",value:"Vērtība"},select:{title:"Iezīmēšanas lauka īpašības", +selectInfo:"Informācija",opAvail:"Pieejamās iespējas",value:"Vērtība",size:"Izmērs",lines:"rindas",chkMulti:"Atļaut vairākus iezīmējumus",opText:"Teksts",opValue:"Vērtība",btnAdd:"Pievienot",btnModify:"Veikt izmaiņas",btnUp:"Augšup",btnDown:"Lejup",btnSetValue:"Noteikt kā iezīmēto vērtību",btnDelete:"Dzēst"},textarea:{title:"Teksta laukuma īpašības",cols:"Kolonnas",rows:"Rindas"},textfield:{title:"Teksta rindas īpašības",name:"Nosaukums",value:"Vērtība",charWidth:"Simbolu platums",maxChars:"Simbolu maksimālais daudzums", +type:"Tips",typeText:"Teksts",typePass:"Parole",typeEmail:"Epasts",typeSearch:"Meklēt",typeTel:"Tālruņa numurs",typeUrl:"Adrese"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/mk.js b/bower_components/ckeditor/plugins/forms/lang/mk.js new file mode 100644 index 0000000..84837f5 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/mk.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","mk",{button:{title:"Button Properties",text:"Text (Value)",type:"Type",typeBtn:"Button",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"Checkbox Properties",radioTitle:"Radio Button Properties",value:"Value",selected:"Selected"},form:{title:"Form Properties",menu:"Form Properties",action:"Action",method:"Method",encoding:"Encoding"},hidden:{title:"Hidden Field Properties",name:"Name",value:"Value"},select:{title:"Selection Field Properties",selectInfo:"Select Info", +opAvail:"Available Options",value:"Value",size:"Size",lines:"lines",chkMulti:"Allow multiple selections",opText:"Text",opValue:"Value",btnAdd:"Add",btnModify:"Modify",btnUp:"Up",btnDown:"Down",btnSetValue:"Set as selected value",btnDelete:"Delete"},textarea:{title:"Textarea Properties",cols:"Columns",rows:"Rows"},textfield:{title:"Text Field Properties",name:"Name",value:"Value",charWidth:"Character Width",maxChars:"Maximum Characters",type:"Type",typeText:"Text",typePass:"Password",typeEmail:"Email", +typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/mn.js b/bower_components/ckeditor/plugins/forms/lang/mn.js new file mode 100644 index 0000000..747b5eb --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/mn.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","mn",{button:{title:"Товчны шинж чанар",text:"Тэкст (Утга)",type:"Төрөл",typeBtn:"Товч",typeSbm:"Submit",typeRst:"Болих"},checkboxAndRadio:{checkboxTitle:"Чекбоксны шинж чанар",radioTitle:"Радио товчны шинж чанар",value:"Утга",selected:"Сонгогдсон"},form:{title:"Форм шинж чанар",menu:"Форм шинж чанар",action:"Үйлдэл",method:"Арга",encoding:"Encoding"},hidden:{title:"Нууц талбарын шинж чанар",name:"Нэр",value:"Утга"},select:{title:"Согогч талбарын шинж чанар",selectInfo:"Мэдээлэл", +opAvail:"Идвэхтэй сонголт",value:"Утга",size:"Хэмжээ",lines:"Мөр",chkMulti:"Олон зүйл зэрэг сонгохыг зөвшөөрөх",opText:"Тэкст",opValue:"Утга",btnAdd:"Нэмэх",btnModify:"Өөрчлөх",btnUp:"Дээш",btnDown:"Доош",btnSetValue:"Сонгогдсан утга оноох",btnDelete:"Устгах"},textarea:{title:"Текст орчны шинж чанар",cols:"Багана",rows:"Мөр"},textfield:{title:"Текст талбарын шинж чанар",name:"Нэр",value:"Утга",charWidth:"Тэмдэгтын өргөн",maxChars:"Хамгийн их тэмдэгт",type:"Төрөл",typeText:"Текст",typePass:"Нууц үг", +typeEmail:"Email",typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"цахим хуудасны хаяг (URL)"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/ms.js b/bower_components/ckeditor/plugins/forms/lang/ms.js new file mode 100644 index 0000000..fbf6b9f --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/ms.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","ms",{button:{title:"Ciri-ciri Butang",text:"Teks (Nilai)",type:"Jenis",typeBtn:"Button",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"Ciri-ciri Checkbox",radioTitle:"Ciri-ciri Butang Radio",value:"Nilai",selected:"Dipilih"},form:{title:"Ciri-ciri Borang",menu:"Ciri-ciri Borang",action:"Tindakan borang",method:"Cara borang dihantar",encoding:"Encoding"},hidden:{title:"Ciri-ciri Field Tersembunyi",name:"Nama",value:"Nilai"},select:{title:"Ciri-ciri Selection Field", +selectInfo:"Select Info",opAvail:"Pilihan sediada",value:"Nilai",size:"Saiz",lines:"garisan",chkMulti:"Benarkan pilihan pelbagai",opText:"Teks",opValue:"Nilai",btnAdd:"Tambah Pilihan",btnModify:"Ubah Pilihan",btnUp:"Naik ke atas",btnDown:"Turun ke bawah",btnSetValue:"Set sebagai nilai terpilih",btnDelete:"Padam"},textarea:{title:"Ciri-ciri Textarea",cols:"Lajur",rows:"Baris"},textfield:{title:"Ciri-ciri Text Field",name:"Nama",value:"Nilai",charWidth:"Lebar isian",maxChars:"Isian Maksimum",type:"Jenis", +typeText:"Teks",typePass:"Kata Laluan",typeEmail:"Email",typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/nb.js b/bower_components/ckeditor/plugins/forms/lang/nb.js new file mode 100644 index 0000000..5874510 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/nb.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","nb",{button:{title:"Egenskaper for knapp",text:"Tekst (verdi)",type:"Type",typeBtn:"Knapp",typeSbm:"Send",typeRst:"Nullstill"},checkboxAndRadio:{checkboxTitle:"Egenskaper for avmerkingsboks",radioTitle:"Egenskaper for alternativknapp",value:"Verdi",selected:"Valgt"},form:{title:"Egenskaper for skjema",menu:"Egenskaper for skjema",action:"Handling",method:"Metode",encoding:"Encoding"},hidden:{title:"Egenskaper for skjult felt",name:"Navn",value:"Verdi"},select:{title:"Egenskaper for rullegardinliste", +selectInfo:"Info",opAvail:"Tilgjenglige alternativer",value:"Verdi",size:"Størrelse",lines:"Linjer",chkMulti:"Tillat flervalg",opText:"Tekst",opValue:"Verdi",btnAdd:"Legg til",btnModify:"Endre",btnUp:"Opp",btnDown:"Ned",btnSetValue:"Sett som valgt",btnDelete:"Slett"},textarea:{title:"Egenskaper for tekstområde",cols:"Kolonner",rows:"Rader"},textfield:{title:"Egenskaper for tekstfelt",name:"Navn",value:"Verdi",charWidth:"Tegnbredde",maxChars:"Maks antall tegn",type:"Type",typeText:"Tekst",typePass:"Passord", +typeEmail:"Epost",typeSearch:"Søk",typeTel:"Telefonnummer",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/nl.js b/bower_components/ckeditor/plugins/forms/lang/nl.js new file mode 100644 index 0000000..5bff828 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/nl.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","nl",{button:{title:"Eigenschappen knop",text:"Tekst (waarde)",type:"Soort",typeBtn:"Knop",typeSbm:"Versturen",typeRst:"Leegmaken"},checkboxAndRadio:{checkboxTitle:"Eigenschappen aanvinkvakje",radioTitle:"Eigenschappen selectievakje",value:"Waarde",selected:"Geselecteerd"},form:{title:"Eigenschappen formulier",menu:"Eigenschappen formulier",action:"Actie",method:"Methode",encoding:"Codering"},hidden:{title:"Eigenschappen verborgen veld",name:"Naam",value:"Waarde"}, +select:{title:"Eigenschappen selectieveld",selectInfo:"Informatie",opAvail:"Beschikbare opties",value:"Waarde",size:"Grootte",lines:"Regels",chkMulti:"Gecombineerde selecties toestaan",opText:"Tekst",opValue:"Waarde",btnAdd:"Toevoegen",btnModify:"Wijzigen",btnUp:"Omhoog",btnDown:"Omlaag",btnSetValue:"Als geselecteerde waarde instellen",btnDelete:"Verwijderen"},textarea:{title:"Eigenschappen tekstvak",cols:"Kolommen",rows:"Rijen"},textfield:{title:"Eigenschappen tekstveld",name:"Naam",value:"Waarde", +charWidth:"Breedte (tekens)",maxChars:"Maximum aantal tekens",type:"Soort",typeText:"Tekst",typePass:"Wachtwoord",typeEmail:"E-mail",typeSearch:"Zoeken",typeTel:"Telefoonnummer",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/no.js b/bower_components/ckeditor/plugins/forms/lang/no.js new file mode 100644 index 0000000..07e20c4 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/no.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","no",{button:{title:"Egenskaper for knapp",text:"Tekst (verdi)",type:"Type",typeBtn:"Knapp",typeSbm:"Send",typeRst:"Nullstill"},checkboxAndRadio:{checkboxTitle:"Egenskaper for avmerkingsboks",radioTitle:"Egenskaper for alternativknapp",value:"Verdi",selected:"Valgt"},form:{title:"Egenskaper for skjema",menu:"Egenskaper for skjema",action:"Handling",method:"Metode",encoding:"Encoding"},hidden:{title:"Egenskaper for skjult felt",name:"Navn",value:"Verdi"},select:{title:"Egenskaper for rullegardinliste", +selectInfo:"Info",opAvail:"Tilgjenglige alternativer",value:"Verdi",size:"Størrelse",lines:"Linjer",chkMulti:"Tillat flervalg",opText:"Tekst",opValue:"Verdi",btnAdd:"Legg til",btnModify:"Endre",btnUp:"Opp",btnDown:"Ned",btnSetValue:"Sett som valgt",btnDelete:"Slett"},textarea:{title:"Egenskaper for tekstområde",cols:"Kolonner",rows:"Rader"},textfield:{title:"Egenskaper for tekstfelt",name:"Navn",value:"Verdi",charWidth:"Tegnbredde",maxChars:"Maks antall tegn",type:"Type",typeText:"Tekst",typePass:"Passord", +typeEmail:"Epost",typeSearch:"Søk",typeTel:"Telefonnummer",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/pl.js b/bower_components/ckeditor/plugins/forms/lang/pl.js new file mode 100644 index 0000000..8577d62 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/pl.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","pl",{button:{title:"Właściwości przycisku",text:"Tekst (Wartość)",type:"Typ",typeBtn:"Przycisk",typeSbm:"Wyślij",typeRst:"Wyczyść"},checkboxAndRadio:{checkboxTitle:"Właściwości pola wyboru (checkbox)",radioTitle:"Właściwości przycisku opcji (radio)",value:"Wartość",selected:"Zaznaczone"},form:{title:"Właściwości formularza",menu:"Właściwości formularza",action:"Akcja",method:"Metoda",encoding:"Kodowanie"},hidden:{title:"Właściwości pola ukrytego",name:"Nazwa",value:"Wartość"}, +select:{title:"Właściwości listy wyboru",selectInfo:"Informacje",opAvail:"Dostępne opcje",value:"Wartość",size:"Rozmiar",lines:"wierszy",chkMulti:"Wielokrotny wybór",opText:"Tekst",opValue:"Wartość",btnAdd:"Dodaj",btnModify:"Zmień",btnUp:"Do góry",btnDown:"Do dołu",btnSetValue:"Ustaw jako zaznaczoną",btnDelete:"Usuń"},textarea:{title:"Właściwości obszaru tekstowego",cols:"Liczba kolumn",rows:"Liczba wierszy"},textfield:{title:"Właściwości pola tekstowego",name:"Nazwa",value:"Wartość",charWidth:"Szerokość w znakach", +maxChars:"Szerokość maksymalna",type:"Typ",typeText:"Tekst",typePass:"Hasło",typeEmail:"Email",typeSearch:"Szukaj",typeTel:"Numer telefonu",typeUrl:"Adres URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/pt-br.js b/bower_components/ckeditor/plugins/forms/lang/pt-br.js new file mode 100644 index 0000000..1fe748a --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/pt-br.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","pt-br",{button:{title:"Formatar Botão",text:"Texto (Valor)",type:"Tipo",typeBtn:"Botão",typeSbm:"Enviar",typeRst:"Limpar"},checkboxAndRadio:{checkboxTitle:"Formatar Caixa de Seleção",radioTitle:"Formatar Botão de Opção",value:"Valor",selected:"Selecionado"},form:{title:"Formatar Formulário",menu:"Formatar Formulário",action:"Ação",method:"Método",encoding:"Codificação"},hidden:{title:"Formatar Campo Oculto",name:"Nome",value:"Valor"},select:{title:"Formatar Caixa de Listagem", +selectInfo:"Informações",opAvail:"Opções disponíveis",value:"Valor",size:"Tamanho",lines:"linhas",chkMulti:"Permitir múltiplas seleções",opText:"Texto",opValue:"Valor",btnAdd:"Adicionar",btnModify:"Modificar",btnUp:"Para cima",btnDown:"Para baixo",btnSetValue:"Definir como selecionado",btnDelete:"Remover"},textarea:{title:"Formatar Área de Texto",cols:"Colunas",rows:"Linhas"},textfield:{title:"Formatar Caixa de Texto",name:"Nome",value:"Valor",charWidth:"Comprimento (em caracteres)",maxChars:"Número Máximo de Caracteres", +type:"Tipo",typeText:"Texto",typePass:"Senha",typeEmail:"Email",typeSearch:"Busca",typeTel:"Número de Telefone",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/pt.js b/bower_components/ckeditor/plugins/forms/lang/pt.js new file mode 100644 index 0000000..fbc4e39 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/pt.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","pt",{button:{title:"Propriedades do Botão",text:"Texto (Valor)",type:"Tipo",typeBtn:"Botão",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"Propriedades da Caixa de Verificação",radioTitle:"Propriedades do Botão de Opção",value:"Valor",selected:"Seleccionado"},form:{title:"Propriedades do Formulário",menu:"Propriedades do Formulário",action:"Acção",method:"Método",encoding:"Encoding"},hidden:{title:"Propriedades do Campo Escondido",name:"Nome", +value:"Valor"},select:{title:"Propriedades da Caixa de Combinação",selectInfo:"Informação",opAvail:"Opções Possíveis",value:"Valor",size:"Tamanho",lines:"linhas",chkMulti:"Permitir selecções múltiplas",opText:"Texto",opValue:"Valor",btnAdd:"Adicionar",btnModify:"Modificar",btnUp:"Para cima",btnDown:"Para baixo",btnSetValue:"Definir um valor por defeito",btnDelete:"Apagar"},textarea:{title:"Propriedades da Área de Texto",cols:"Colunas",rows:"Linhas"},textfield:{title:"Propriedades do Campo de Texto", +name:"Nome",value:"Valor",charWidth:"Tamanho do caracter",maxChars:"Nr. Máximo de Caracteres",type:"Tipo",typeText:"Texto",typePass:"Senha",typeEmail:"Email",typeSearch:"Pesquisar",typeTel:"Telefone",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/ro.js b/bower_components/ckeditor/plugins/forms/lang/ro.js new file mode 100644 index 0000000..0db618b --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/ro.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","ro",{button:{title:"Proprietăţi buton",text:"Text (Valoare)",type:"Tip",typeBtn:"Buton",typeSbm:"Trimite",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"Proprietăţi bifă (Checkbox)",radioTitle:"Proprietăţi buton radio (Radio Button)",value:"Valoare",selected:"Selectat"},form:{title:"Proprietăţi formular (Form)",menu:"Proprietăţi formular (Form)",action:"Acţiune",method:"Metodă",encoding:"Encodare"},hidden:{title:"Proprietăţi câmp ascuns (Hidden Field)",name:"Nume", +value:"Valoare"},select:{title:"Proprietăţi câmp selecţie (Selection Field)",selectInfo:"Informaţii",opAvail:"Opţiuni disponibile",value:"Valoare",size:"Mărime",lines:"linii",chkMulti:"Permite selecţii multiple",opText:"Text",opValue:"Valoare",btnAdd:"Adaugă",btnModify:"Modifică",btnUp:"Sus",btnDown:"Jos",btnSetValue:"Setează ca valoare selectată",btnDelete:"Şterge"},textarea:{title:"Proprietăţi suprafaţă text (Textarea)",cols:"Coloane",rows:"Linii"},textfield:{title:"Proprietăţi câmp text (Text Field)", +name:"Nume",value:"Valoare",charWidth:"Lărgimea caracterului",maxChars:"Caractere maxime",type:"Tip",typeText:"Text",typePass:"Parolă",typeEmail:"Email",typeSearch:"Cauta",typeTel:"Numar de telefon",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/ru.js b/bower_components/ckeditor/plugins/forms/lang/ru.js new file mode 100644 index 0000000..534eb49 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/ru.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","ru",{button:{title:"Свойства кнопки",text:"Текст (Значение)",type:"Тип",typeBtn:"Кнопка",typeSbm:"Отправка",typeRst:"Сброс"},checkboxAndRadio:{checkboxTitle:"Свойства флаговой кнопки",radioTitle:"Свойства кнопки выбора",value:"Значение",selected:"Выбрано"},form:{title:"Свойства формы",menu:"Свойства формы",action:"Действие",method:"Метод",encoding:"Кодировка"},hidden:{title:"Свойства скрытого поля",name:"Имя",value:"Значение"},select:{title:"Свойства списка выбора", +selectInfo:"Информация о списке выбора",opAvail:"Доступные варианты",value:"Значение",size:"Размер",lines:"строк(и)",chkMulti:"Разрешить выбор нескольких вариантов",opText:"Текст",opValue:"Значение",btnAdd:"Добавить",btnModify:"Изменить",btnUp:"Поднять",btnDown:"Опустить",btnSetValue:"Пометить как выбранное",btnDelete:"Удалить"},textarea:{title:"Свойства многострочного текстового поля",cols:"Колонок",rows:"Строк"},textfield:{title:"Свойства текстового поля",name:"Имя",value:"Значение",charWidth:"Ширина поля (в символах)", +maxChars:"Макс. количество символов",type:"Тип содержимого",typeText:"Текст",typePass:"Пароль",typeEmail:"Email",typeSearch:"Поиск",typeTel:"Номер телефона",typeUrl:"Ссылка"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/si.js b/bower_components/ckeditor/plugins/forms/lang/si.js new file mode 100644 index 0000000..ab61582 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/si.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","si",{button:{title:"බොත්තම් ගුණ",text:"වගන්තිය(වටිනාකම)",type:"වර්ගය",typeBtn:"බොත්තම",typeSbm:"යොමුකරනවා",typeRst:"නැවත ආරම්භකතත්වයට පත් කරනවා"},checkboxAndRadio:{checkboxTitle:"ලකුණු කිරීමේ කොටුවේ ලක්ෂණ",radioTitle:"Radio Button Properties",value:"Value",selected:"Selected"},form:{title:"පෝරමයේ ",menu:"පෝරමයේ ගුණ/",action:"ගන්නා පියවර",method:"ක්‍රමය",encoding:"කේතීකරණය"},hidden:{title:"සැඟවුණු ප්‍රදේශයේ ",name:"නම",value:"Value"},select:{title:"තේරීම් ප්‍රදේශයේ ", +selectInfo:"විස්තර තෝරන්න",opAvail:"ඉතුරුවී ඇති වීකල්ප",value:"Value",size:"විශාලත්වය",lines:"lines",chkMulti:"Allow multiple selections",opText:"Text",opValue:"Value",btnAdd:"Add",btnModify:"Modify",btnUp:"Up",btnDown:"Down",btnSetValue:"Set as selected value",btnDelete:"මකා දැම්ම"},textarea:{title:"Textarea Properties",cols:"සිරස් ",rows:"Rows"},textfield:{title:"Text Field Properties",name:"නම",value:"Value",charWidth:"Character Width",maxChars:"Maximum Characters",type:"වර්ගය",typeText:"Text", +typePass:"Password",typeEmail:"Email",typeSearch:"Search",typeTel:"Telephone Number",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/sk.js b/bower_components/ckeditor/plugins/forms/lang/sk.js new file mode 100644 index 0000000..218b627 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/sk.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","sk",{button:{title:"Vlastnosti tlačidla",text:"Text (Hodnota)",type:"Typ",typeBtn:"Tlačidlo",typeSbm:"Odoslať",typeRst:"Resetovať"},checkboxAndRadio:{checkboxTitle:"Vlastnosti zaškrtávacieho políčka",radioTitle:"Vlastnosti prepínača (radio button)",value:"Hodnota",selected:"Vybrané (selected)"},form:{title:"Vlastnosti formulára",menu:"Vlastnosti formulára",action:"Akcia (action)",method:"Metóda (method)",encoding:"Kódovanie (encoding)"},hidden:{title:"Vlastnosti skrytého poľa", +name:"Názov (name)",value:"Hodnota"},select:{title:"Vlastnosti rozbaľovacieho zoznamu",selectInfo:"Informácie o výbere",opAvail:"Dostupné možnosti",value:"Hodnota",size:"Veľkosť",lines:"riadkov",chkMulti:"Povoliť viacnásobný výber",opText:"Text",opValue:"Hodnota",btnAdd:"Pridať",btnModify:"Upraviť",btnUp:"Hore",btnDown:"Dole",btnSetValue:"Nastaviť ako vybranú hodnotu",btnDelete:"Vymazať"},textarea:{title:"Vlastnosti textovej oblasti (textarea)",cols:"Stĺpcov",rows:"Riadkov"},textfield:{title:"Vlastnosti textového poľa", +name:"Názov (name)",value:"Hodnota",charWidth:"Šírka poľa (podľa znakov)",maxChars:"Maximálny počet znakov",type:"Typ",typeText:"Text",typePass:"Heslo",typeEmail:"Email",typeSearch:"Hľadať",typeTel:"Telefónne číslo",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/sl.js b/bower_components/ckeditor/plugins/forms/lang/sl.js new file mode 100644 index 0000000..ad3bc43 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/sl.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","sl",{button:{title:"Lastnosti gumba",text:"Besedilo (Vrednost)",type:"Tip",typeBtn:"Gumb",typeSbm:"Potrdi",typeRst:"Ponastavi"},checkboxAndRadio:{checkboxTitle:"Lastnosti potrditvenega polja",radioTitle:"Lastnosti izbirnega polja",value:"Vrednost",selected:"Izbrano"},form:{title:"Lastnosti obrazca",menu:"Lastnosti obrazca",action:"Akcija",method:"Metoda",encoding:"Kodiranje znakov"},hidden:{title:"Lastnosti skritega polja",name:"Ime",value:"Vrednost"},select:{title:"Lastnosti spustnega seznama", +selectInfo:"Podatki",opAvail:"Razpoložljive izbire",value:"Vrednost",size:"Velikost",lines:"vrstic",chkMulti:"Dovoli izbor večih vrstic",opText:"Besedilo",opValue:"Vrednost",btnAdd:"Dodaj",btnModify:"Spremeni",btnUp:"Gor",btnDown:"Dol",btnSetValue:"Postavi kot privzeto izbiro",btnDelete:"Izbriši"},textarea:{title:"Lastnosti vnosnega območja",cols:"Stolpcev",rows:"Vrstic"},textfield:{title:"Lastnosti vnosnega polja",name:"Ime",value:"Vrednost",charWidth:"Dolžina",maxChars:"Največje število znakov", +type:"Tip",typeText:"Besedilo",typePass:"Geslo",typeEmail:"E-pošta",typeSearch:"Iskanje",typeTel:"Telefonska Številka",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/sq.js b/bower_components/ckeditor/plugins/forms/lang/sq.js new file mode 100644 index 0000000..a8c45b4 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/sq.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","sq",{button:{title:"Rekuizitat e Pullës",text:"Teskti (Vlera)",type:"LLoji",typeBtn:"Buton",typeSbm:"Dërgo",typeRst:"Rikthe"},checkboxAndRadio:{checkboxTitle:"Rekuizitat e Kutizë Përzgjedhëse",radioTitle:"Rekuizitat e Pullës",value:"Vlera",selected:"Përzgjedhur"},form:{title:"Rekuizitat e Formës",menu:"Rekuizitat e Formës",action:"Veprim",method:"Metoda",encoding:"Kodimi"},hidden:{title:"Rekuizitat e Fushës së Fshehur",name:"Emër",value:"Vlera"},select:{title:"Rekuizitat e Fushës së Përzgjedhur", +selectInfo:"Përzgjidh Informacionin",opAvail:"Opsionet e Mundshme",value:"Vlera",size:"Madhësia",lines:"rreshtat",chkMulti:"Lejo përzgjidhje të shumëfishta",opText:"Teksti",opValue:"Vlera",btnAdd:"Vendos",btnModify:"Ndrysho",btnUp:"Sipër",btnDown:"Poshtë",btnSetValue:"Bëje si vlerë të përzgjedhur",btnDelete:"Grise"},textarea:{title:"Rekuzitat e Fushës së Tekstit",cols:"Kolonat",rows:"Rreshtat"},textfield:{title:"Rekuizitat e Fushës së Tekstit",name:"Emër",value:"Vlera",charWidth:"Gjerësia e Karakterit", +maxChars:"Numri maksimal i karaktereve",type:"LLoji",typeText:"Teksti",typePass:"Fjalëkalimi",typeEmail:"Posta Elektronike",typeSearch:"Kërko",typeTel:"Numri i Telefonit",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/sr-latn.js b/bower_components/ckeditor/plugins/forms/lang/sr-latn.js new file mode 100644 index 0000000..af31d08 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/sr-latn.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","sr-latn",{button:{title:"Osobine dugmeta",text:"Tekst (vrednost)",type:"Tip",typeBtn:"Button",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"Osobine polja za potvrdu",radioTitle:"Osobine radio-dugmeta",value:"Vrednost",selected:"Označeno"},form:{title:"Osobine forme",menu:"Osobine forme",action:"Akcija",method:"Metoda",encoding:"Encoding"},hidden:{title:"Osobine skrivenog polja",name:"Naziv",value:"Vrednost"},select:{title:"Osobine izbornog polja", +selectInfo:"Info",opAvail:"Dostupne opcije",value:"Vrednost",size:"Veličina",lines:"linija",chkMulti:"Dozvoli višestruku selekciju",opText:"Tekst",opValue:"Vrednost",btnAdd:"Dodaj",btnModify:"Izmeni",btnUp:"Gore",btnDown:"Dole",btnSetValue:"Podesi kao označenu vrednost",btnDelete:"Obriši"},textarea:{title:"Osobine zone teksta",cols:"Broj kolona",rows:"Broj redova"},textfield:{title:"Osobine tekstualnog polja",name:"Naziv",value:"Vrednost",charWidth:"Širina (karaktera)",maxChars:"Maksimalno karaktera", +type:"Tip",typeText:"Tekst",typePass:"Lozinka",typeEmail:"Email",typeSearch:"Pretraži",typeTel:"Broj telefona",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/sr.js b/bower_components/ckeditor/plugins/forms/lang/sr.js new file mode 100644 index 0000000..74d46b2 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/sr.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","sr",{button:{title:"Особине дугмета",text:"Текст (вредност)",type:"Tип",typeBtn:"Button",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"Особине поља за потврду",radioTitle:"Особине радио-дугмета",value:"Вредност",selected:"Означено"},form:{title:"Особине форме",menu:"Особине форме",action:"Aкција",method:"Mетода",encoding:"Encoding"},hidden:{title:"Особине скривеног поља",name:"Назив",value:"Вредност"},select:{title:"Особине изборног поља",selectInfo:"Инфо", +opAvail:"Доступне опције",value:"Вредност",size:"Величина",lines:"линија",chkMulti:"Дозволи вишеструку селекцију",opText:"Текст",opValue:"Вредност",btnAdd:"Додај",btnModify:"Измени",btnUp:"Горе",btnDown:"Доле",btnSetValue:"Подеси као означену вредност",btnDelete:"Обриши"},textarea:{title:"Особине зоне текста",cols:"Број колона",rows:"Број редова"},textfield:{title:"Особине текстуалног поља",name:"Назив",value:"Вредност",charWidth:"Ширина (карактера)",maxChars:"Максимално карактера",type:"Тип",typeText:"Текст", +typePass:"Лозинка",typeEmail:"Е-пошта",typeSearch:"Претрага",typeTel:"Број телефона",typeUrl:"УРЛ"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/sv.js b/bower_components/ckeditor/plugins/forms/lang/sv.js new file mode 100644 index 0000000..b03b381 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/sv.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","sv",{button:{title:"Egenskaper för knapp",text:"Text (värde)",type:"Typ",typeBtn:"Knapp",typeSbm:"Skicka",typeRst:"Återställ"},checkboxAndRadio:{checkboxTitle:"Egenskaper för kryssruta",radioTitle:"Egenskaper för alternativknapp",value:"Värde",selected:"Vald"},form:{title:"Egenskaper för formulär",menu:"Egenskaper för formulär",action:"Funktion",method:"Metod",encoding:"Kodning"},hidden:{title:"Egenskaper för dolt fält",name:"Namn",value:"Värde"},select:{title:"Egenskaper för flervalslista", +selectInfo:"Information",opAvail:"Befintliga val",value:"Värde",size:"Storlek",lines:"Linjer",chkMulti:"Tillåt flerval",opText:"Text",opValue:"Värde",btnAdd:"Lägg till",btnModify:"Redigera",btnUp:"Upp",btnDown:"Ner",btnSetValue:"Markera som valt värde",btnDelete:"Radera"},textarea:{title:"Egenskaper för textruta",cols:"Kolumner",rows:"Rader"},textfield:{title:"Egenskaper för textfält",name:"Namn",value:"Värde",charWidth:"Teckenbredd",maxChars:"Max antal tecken",type:"Typ",typeText:"Text",typePass:"Lösenord", +typeEmail:"E-post",typeSearch:"Sök",typeTel:"Telefonnummer",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/th.js b/bower_components/ckeditor/plugins/forms/lang/th.js new file mode 100644 index 0000000..e933749 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/th.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","th",{button:{title:"รายละเอียดของ ปุ่ม",text:"ข้อความ (ค่าตัวแปร)",type:"ข้อความ",typeBtn:"Button",typeSbm:"Submit",typeRst:"Reset"},checkboxAndRadio:{checkboxTitle:"คุณสมบัติของ เช็คบ๊อก",radioTitle:"คุณสมบัติของ เรดิโอบัตตอน",value:"ค่าตัวแปร",selected:"เลือกเป็นค่าเริ่มต้น"},form:{title:"คุณสมบัติของ แบบฟอร์ม",menu:"คุณสมบัติของ แบบฟอร์ม",action:"แอคชั่น",method:"เมธอด",encoding:"Encoding"},hidden:{title:"คุณสมบัติของ ฮิดเดนฟิลด์",name:"ชื่อ",value:"ค่าตัวแปร"}, +select:{title:"คุณสมบัติของ แถบตัวเลือก",selectInfo:"อินโฟ",opAvail:"รายการตัวเลือก",value:"ค่าตัวแปร",size:"ขนาด",lines:"บรรทัด",chkMulti:"เลือกหลายค่าได้",opText:"ข้อความ",opValue:"ค่าตัวแปร",btnAdd:"เพิ่ม",btnModify:"แก้ไข",btnUp:"บน",btnDown:"ล่าง",btnSetValue:"เลือกเป็นค่าเริ่มต้น",btnDelete:"ลบ"},textarea:{title:"คุณสมบัติของ เท็กแอเรีย",cols:"สดมภ์",rows:"แถว"},textfield:{title:"คุณสมบัติของ เท็กซ์ฟิลด์",name:"ชื่อ",value:"ค่าตัวแปร",charWidth:"ความกว้าง",maxChars:"จำนวนตัวอักษรสูงสุด",type:"ชนิด", +typeText:"ข้อความ",typePass:"รหัสผ่าน",typeEmail:"อีเมล",typeSearch:"ค้นหาก",typeTel:"หมายเลขโทรศัพท์",typeUrl:"ที่อยู่อ้างอิง URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/tr.js b/bower_components/ckeditor/plugins/forms/lang/tr.js new file mode 100644 index 0000000..3710d31 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/tr.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","tr",{button:{title:"Düğme Özellikleri",text:"Metin (Değer)",type:"Tip",typeBtn:"Düğme",typeSbm:"Gönder",typeRst:"Sıfırla"},checkboxAndRadio:{checkboxTitle:"Onay Kutusu Özellikleri",radioTitle:"Seçenek Düğmesi Özellikleri",value:"Değer",selected:"Seçili"},form:{title:"Form Özellikleri",menu:"Form Özellikleri",action:"İşlem",method:"Yöntem",encoding:"Kodlama"},hidden:{title:"Gizli Veri Özellikleri",name:"Ad",value:"Değer"},select:{title:"Seçim Menüsü Özellikleri",selectInfo:"Bilgi", +opAvail:"Mevcut Seçenekler",value:"Değer",size:"Boyut",lines:"satır",chkMulti:"Çoklu seçime izin ver",opText:"Metin",opValue:"Değer",btnAdd:"Ekle",btnModify:"Düzenle",btnUp:"Yukarı",btnDown:"Aşağı",btnSetValue:"Seçili değer olarak ata",btnDelete:"Sil"},textarea:{title:"Çok Satırlı Metin Özellikleri",cols:"Sütunlar",rows:"Satırlar"},textfield:{title:"Metin Girişi Özellikleri",name:"Ad",value:"Değer",charWidth:"Karakter Genişliği",maxChars:"En Fazla Karakter",type:"Tür",typeText:"Metin",typePass:"Şifre", +typeEmail:"E-posta",typeSearch:"Ara",typeTel:"Telefon Numarası",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/tt.js b/bower_components/ckeditor/plugins/forms/lang/tt.js new file mode 100644 index 0000000..933c05c --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/tt.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","tt",{button:{title:"Төймә үзлекләре",text:"Текст (күләм)",type:"Төр",typeBtn:"Төймә",typeSbm:"Submit",typeRst:"Кире кайтару"},checkboxAndRadio:{checkboxTitle:"Checkbox Properties",radioTitle:"Radio Button Properties",value:"Күләм",selected:"Сайланган"},form:{title:"Форма үзлекләре",menu:"Форма үзлекләре",action:"Гамәл",method:"Ысул",encoding:"Кодировка"},hidden:{title:"Яшерен кыр үзлекләре",name:"Исем",value:"Күләм"},select:{title:"Selection Field Properties",selectInfo:"Select Info", +opAvail:"Мөмкин булган көйләүләр",value:"Күләм",size:"Зурлык",lines:"юллар",chkMulti:"Allow multiple selections",opText:"Текст",opValue:"Күләм",btnAdd:"Кушу",btnModify:"Үзгәртү",btnUp:"Өскә",btnDown:"Аска",btnSetValue:"Сайланган күләм булып билгеләргә",btnDelete:"Бетерү"},textarea:{title:"Текст мәйданы үзлекләре",cols:"Баганалар",rows:"Юллар"},textfield:{title:"Текст кыры үзлекләре",name:"Исем",value:"Күләм",charWidth:"Символлар киңлеге",maxChars:"Maximum Characters",type:"Төр",typeText:"Текст",typePass:"Сер сүз", +typeEmail:"Эл. почта",typeSearch:"Эзләү",typeTel:"Телефон номеры",typeUrl:"Сылталама"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/ug.js b/bower_components/ckeditor/plugins/forms/lang/ug.js new file mode 100644 index 0000000..9ff3eee --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/ug.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","ug",{button:{title:"توپچا خاسلىقى",text:"بەلگە (قىممەت)",type:"تىپى",typeBtn:"توپچا",typeSbm:"تاپشۇر",typeRst:"ئەسلىگە قايتۇر"},checkboxAndRadio:{checkboxTitle:"كۆپ تاللاش خاسلىقى",radioTitle:"تاق تاللاش توپچا خاسلىقى",value:"تاللىغان قىممەت",selected:"تاللانغان"},form:{title:"جەدۋەل خاسلىقى",menu:"جەدۋەل خاسلىقى",action:"مەشغۇلات",method:"ئۇسۇل",encoding:"جەدۋەل كودلىنىشى"},hidden:{title:"يوشۇرۇن دائىرە خاسلىقى",name:"ئات",value:"دەسلەپكى قىممىتى"},select:{title:"جەدۋەل/تىزىم خاسلىقى", +selectInfo:"ئۇچۇر تاللاڭ",opAvail:"تاللاش تۈرلىرى",value:"قىممەت",size:"ئېگىزلىكى",lines:"قۇر",chkMulti:"كۆپ تاللاشچان",opText:"تاللانما تېكىستى",opValue:"تاللانما قىممىتى",btnAdd:"قوش",btnModify:"ئۆزگەرت",btnUp:"ئۈستىگە",btnDown:"ئاستىغا",btnSetValue:"دەسلەپكى تاللانما قىممىتىگە تەڭشە",btnDelete:"ئۆچۈر"},textarea:{title:" كۆپ قۇرلۇق تېكىست خاسلىقى",cols:"ھەرپ كەڭلىكى",rows:"قۇر سانى"},textfield:{title:"تاق قۇرلۇق تېكىست خاسلىقى",name:"ئات",value:"دەسلەپكى قىممىتى",charWidth:"ھەرپ كەڭلىكى",maxChars:"ئەڭ كۆپ ھەرپ سانى", +type:"تىپى",typeText:"تېكىست",typePass:"ئىم",typeEmail:"تورخەت",typeSearch:"ئىزدە",typeTel:"تېلېفون نومۇر",typeUrl:"ئادرېس"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/uk.js b/bower_components/ckeditor/plugins/forms/lang/uk.js new file mode 100644 index 0000000..317d57f --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/uk.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","uk",{button:{title:"Властивості кнопки",text:"Значення",type:"Тип",typeBtn:"Кнопка (button)",typeSbm:"Надіслати (submit)",typeRst:"Очистити (reset)"},checkboxAndRadio:{checkboxTitle:"Властивості галочки",radioTitle:"Властивості кнопки вибору",value:"Значення",selected:"Обрана"},form:{title:"Властивості форми",menu:"Властивості форми",action:"Дія",method:"Метод",encoding:"Кодування"},hidden:{title:"Властивості прихованого поля",name:"Ім'я",value:"Значення"},select:{title:"Властивості списку", +selectInfo:"Інфо",opAvail:"Доступні варіанти",value:"Значення",size:"Кількість",lines:"видимих позицій у списку",chkMulti:"Список з мультивибором",opText:"Текст",opValue:"Значення",btnAdd:"Добавити",btnModify:"Змінити",btnUp:"Вгору",btnDown:"Вниз",btnSetValue:"Встановити як обране значення",btnDelete:"Видалити"},textarea:{title:"Властивості текстової області",cols:"Стовбці",rows:"Рядки"},textfield:{title:"Властивості текстового поля",name:"Ім'я",value:"Значення",charWidth:"Ширина",maxChars:"Макс. к-ть символів", +type:"Тип",typeText:"Текст",typePass:"Пароль",typeEmail:"Пошта",typeSearch:"Пошук",typeTel:"Мобільний",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/vi.js b/bower_components/ckeditor/plugins/forms/lang/vi.js new file mode 100644 index 0000000..a02d09c --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/vi.js @@ -0,0 +1,3 @@ +CKEDITOR.plugins.setLang("forms","vi",{button:{title:"Thuộc tính của nút",text:"Chuỗi hiển thị (giá trị)",type:"Kiểu",typeBtn:"Nút bấm",typeSbm:"Nút gửi",typeRst:"Nút nhập lại"},checkboxAndRadio:{checkboxTitle:"Thuộc tính nút kiểm",radioTitle:"Thuộc tính nút chọn",value:"Giá trị",selected:"Được chọn"},form:{title:"Thuộc tính biểu mẫu",menu:"Thuộc tính biểu mẫu",action:"Hành động",method:"Phương thức",encoding:"Bảng mã"},hidden:{title:"Thuộc tính trường ẩn",name:"Tên",value:"Giá trị"},select:{title:"Thuộc tính ô chọn", +selectInfo:"Thông tin",opAvail:"Các tùy chọn có thể sử dụng",value:"Giá trị",size:"Kích cỡ",lines:"dòng",chkMulti:"Cho phép chọn nhiều",opText:"Văn bản",opValue:"Giá trị",btnAdd:"Thêm",btnModify:"Thay đổi",btnUp:"Lên",btnDown:"Xuống",btnSetValue:"Giá trị được chọn",btnDelete:"Nút xoá"},textarea:{title:"Thuộc tính vùng văn bản",cols:"Số cột",rows:"Số hàng"},textfield:{title:"Thuộc tính trường văn bản",name:"Tên",value:"Giá trị",charWidth:"Độ rộng của ký tự",maxChars:"Số ký tự tối đa",type:"Kiểu",typeText:"Ký tự", +typePass:"Mật khẩu",typeEmail:"Email",typeSearch:"Tìm kiếm",typeTel:"Số điện thoại",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/zh-cn.js b/bower_components/ckeditor/plugins/forms/lang/zh-cn.js new file mode 100644 index 0000000..3c7ea10 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/zh-cn.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("forms","zh-cn",{button:{title:"按钮属性",text:"标签(值)",type:"类型",typeBtn:"按钮",typeSbm:"提交",typeRst:"重设"},checkboxAndRadio:{checkboxTitle:"复选框属性",radioTitle:"单选按钮属性",value:"选定值",selected:"已勾选"},form:{title:"表单属性",menu:"表单属性",action:"动作",method:"方法",encoding:"表单编码"},hidden:{title:"隐藏域属性",name:"名称",value:"初始值"},select:{title:"菜单/列表属性",selectInfo:"选择信息",opAvail:"可选项",value:"值",size:"高度",lines:"行",chkMulti:"允许多选",opText:"选项文本",opValue:"选项值",btnAdd:"添加",btnModify:"修改",btnUp:"上移",btnDown:"下移", +btnSetValue:"设为初始选定",btnDelete:"删除"},textarea:{title:"多行文本属性",cols:"字符宽度",rows:"行数"},textfield:{title:"单行文本属性",name:"名称",value:"初始值",charWidth:"字符宽度",maxChars:"最多字符数",type:"类型",typeText:"文本",typePass:"密码",typeEmail:"Email",typeSearch:"搜索",typeTel:"电话号码",typeUrl:"地址"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/lang/zh.js b/bower_components/ckeditor/plugins/forms/lang/zh.js new file mode 100644 index 0000000..4eec674 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/lang/zh.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("forms","zh",{button:{title:"按鈕內容",text:"顯示文字 (值)",type:"類型",typeBtn:"按鈕",typeSbm:"送出",typeRst:"重設"},checkboxAndRadio:{checkboxTitle:"核取方塊內容",radioTitle:"選項按鈕內容",value:"數值",selected:"已選"},form:{title:"表單內容",menu:"表單內容",action:"動作",method:"方式",encoding:"編碼"},hidden:{title:"隱藏欄位內容",name:"名稱",value:"數值"},select:{title:"選取欄位內容",selectInfo:"選擇資訊",opAvail:"可用選項",value:"數值",size:"大小",lines:"行數",chkMulti:"允許多選",opText:"文字",opValue:"數值",btnAdd:"新增",btnModify:"修改",btnUp:"向上",btnDown:"向下", +btnSetValue:"設為已選",btnDelete:"刪除"},textarea:{title:"文字區域內容",cols:"列",rows:"行"},textfield:{title:"文字欄位內容",name:"名字",value:"數值",charWidth:"字元寬度",maxChars:"最大字元數",type:"類型",typeText:"文字",typePass:"密碼",typeEmail:"電子郵件",typeSearch:"搜尋",typeTel:"電話號碼",typeUrl:"URL"}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/forms/plugin.js b/bower_components/ckeditor/plugins/forms/plugin.js new file mode 100644 index 0000000..cdf7aa9 --- /dev/null +++ b/bower_components/ckeditor/plugins/forms/plugin.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.add("forms",{requires:"dialog,fakeobjects",lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"button,checkbox,form,hiddenfield,imagebutton,radio,select,select-rtl,textarea,textarea-rtl,textfield",hidpi:!0,onLoad:function(){CKEDITOR.addCss(".cke_editable form{border: 1px dotted #FF0000;padding: 2px;}\n"); +CKEDITOR.addCss("img.cke_hidden{background-image: url("+CKEDITOR.getUrl(this.path+"images/hiddenfield.gif")+");background-position: center center;background-repeat: no-repeat;border: 1px solid #a9a9a9;width: 16px !important;height: 16px !important;}")},init:function(a){var b=a.lang,g=0,h={email:1,password:1,search:1,tel:1,text:1,url:1},j={checkbox:"input[type,name,checked]",radio:"input[type,name,checked]",textfield:"input[type,name,value,size,maxlength]",textarea:"textarea[cols,rows,name]",select:"select[name,size,multiple]; option[value,selected]", +button:"input[type,name,value]",form:"form[action,name,id,enctype,target,method]",hiddenfield:"input[type,name,value]",imagebutton:"input[type,alt,src]{width,height,border,border-width,border-style,margin,float}"},k={checkbox:"input",radio:"input",textfield:"input",textarea:"textarea",select:"select",button:"input",form:"form",hiddenfield:"input",imagebutton:"input"},e=function(d,c,e){var h={allowedContent:j[c],requiredContent:k[c]};"form"==c&&(h.context="form");a.addCommand(c,new CKEDITOR.dialogCommand(c, +h));a.ui.addButton&&a.ui.addButton(d,{label:b.common[d.charAt(0).toLowerCase()+d.slice(1)],command:c,toolbar:"forms,"+(g+=10)});CKEDITOR.dialog.add(c,e)},f=this.path+"dialogs/";!a.blockless&&e("Form","form",f+"form.js");e("Checkbox","checkbox",f+"checkbox.js");e("Radio","radio",f+"radio.js");e("TextField","textfield",f+"textfield.js");e("Textarea","textarea",f+"textarea.js");e("Select","select",f+"select.js");e("Button","button",f+"button.js");var i=a.plugins.image;i&&!a.plugins.image2&&e("ImageButton", +"imagebutton",CKEDITOR.plugins.getPath("image")+"dialogs/image.js");e("HiddenField","hiddenfield",f+"hiddenfield.js");a.addMenuItems&&(e={checkbox:{label:b.forms.checkboxAndRadio.checkboxTitle,command:"checkbox",group:"checkbox"},radio:{label:b.forms.checkboxAndRadio.radioTitle,command:"radio",group:"radio"},textfield:{label:b.forms.textfield.title,command:"textfield",group:"textfield"},hiddenfield:{label:b.forms.hidden.title,command:"hiddenfield",group:"hiddenfield"},button:{label:b.forms.button.title, +command:"button",group:"button"},select:{label:b.forms.select.title,command:"select",group:"select"},textarea:{label:b.forms.textarea.title,command:"textarea",group:"textarea"}},i&&(e.imagebutton={label:b.image.titleButton,command:"imagebutton",group:"imagebutton"}),!a.blockless&&(e.form={label:b.forms.form.menu,command:"form",group:"form"}),a.addMenuItems(e));a.contextMenu&&(!a.blockless&&a.contextMenu.addListener(function(d,c,a){if((d=a.contains("form",1))&&!d.isReadOnly())return{form:CKEDITOR.TRISTATE_OFF}}), +a.contextMenu.addListener(function(d){if(d&&!d.isReadOnly()){var c=d.getName();if(c=="select")return{select:CKEDITOR.TRISTATE_OFF};if(c=="textarea")return{textarea:CKEDITOR.TRISTATE_OFF};if(c=="input"){var a=d.getAttribute("type")||"text";switch(a){case "button":case "submit":case "reset":return{button:CKEDITOR.TRISTATE_OFF};case "checkbox":return{checkbox:CKEDITOR.TRISTATE_OFF};case "radio":return{radio:CKEDITOR.TRISTATE_OFF};case "image":return i?{imagebutton:CKEDITOR.TRISTATE_OFF}:null}if(h[a])return{textfield:CKEDITOR.TRISTATE_OFF}}if(c== +"img"&&d.data("cke-real-element-type")=="hiddenfield")return{hiddenfield:CKEDITOR.TRISTATE_OFF}}}));a.on("doubleclick",function(d){var c=d.data.element;if(!a.blockless&&c.is("form"))d.data.dialog="form";else if(c.is("select"))d.data.dialog="select";else if(c.is("textarea"))d.data.dialog="textarea";else if(c.is("img")&&c.data("cke-real-element-type")=="hiddenfield")d.data.dialog="hiddenfield";else if(c.is("input")){c=c.getAttribute("type")||"text";switch(c){case "button":case "submit":case "reset":d.data.dialog= +"button";break;case "checkbox":d.data.dialog="checkbox";break;case "radio":d.data.dialog="radio";break;case "image":d.data.dialog="imagebutton"}if(h[c])d.data.dialog="textfield"}})},afterInit:function(a){var b=a.dataProcessor,g=b&&b.htmlFilter,b=b&&b.dataFilter;CKEDITOR.env.ie&&g&&g.addRules({elements:{input:function(a){var a=a.attributes,b=a.type;b||(a.type="text");("checkbox"==b||"radio"==b)&&"on"==a.value&&delete a.value}}},{applyToAll:!0});b&&b.addRules({elements:{input:function(b){if("hidden"== +b.attributes.type)return a.createFakeParserElement(b,"cke_hidden","hiddenfield")}}},{applyToAll:!0})}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/icons.png b/bower_components/ckeditor/plugins/icons.png new file mode 100644 index 0000000..163fd0d Binary files /dev/null and b/bower_components/ckeditor/plugins/icons.png differ diff --git a/bower_components/ckeditor/plugins/icons_hidpi.png b/bower_components/ckeditor/plugins/icons_hidpi.png new file mode 100644 index 0000000..c181faa Binary files /dev/null and b/bower_components/ckeditor/plugins/icons_hidpi.png differ diff --git a/bower_components/ckeditor/plugins/iframe/dialogs/iframe.js b/bower_components/ckeditor/plugins/iframe/dialogs/iframe.js new file mode 100644 index 0000000..db7ecbb --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/dialogs/iframe.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function c(b){var c=this instanceof CKEDITOR.ui.dialog.checkbox;b.hasAttribute(this.id)&&(b=b.getAttribute(this.id),c?this.setValue(e[this.id]["true"]==b.toLowerCase()):this.setValue(b))}function d(b){var c=""===this.getValue(),a=this instanceof CKEDITOR.ui.dialog.checkbox,d=this.getValue();c?b.removeAttribute(this.att||this.id):a?b.setAttribute(this.id,e[this.id][d]):b.setAttribute(this.att||this.id,d)}var e={scrolling:{"true":"yes","false":"no"},frameborder:{"true":"1","false":"0"}}; +CKEDITOR.dialog.add("iframe",function(b){var f=b.lang.iframe,a=b.lang.common,e=b.plugins.dialogadvtab;return{title:f.title,minWidth:350,minHeight:260,onShow:function(){this.fakeImage=this.iframeNode=null;var a=this.getSelectedElement();a&&(a.data("cke-real-element-type")&&"iframe"==a.data("cke-real-element-type"))&&(this.fakeImage=a,this.iframeNode=a=b.restoreRealElement(a),this.setupContent(a))},onOk:function(){var a;a=this.fakeImage?this.iframeNode:new CKEDITOR.dom.element("iframe");var c={},d= +{};this.commitContent(a,c,d);a=b.createFakeElement(a,"cke_iframe","iframe",!0);a.setAttributes(d);a.setStyles(c);this.fakeImage?(a.replace(this.fakeImage),b.getSelection().selectElement(a)):b.insertElement(a)},contents:[{id:"info",label:a.generalTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{id:"src",type:"text",label:a.url,required:!0,validate:CKEDITOR.dialog.validate.notEmpty(f.noUrl),setup:c,commit:d}]},{type:"hbox",children:[{id:"width",type:"text",requiredContent:"iframe[width]", +style:"width:100%",labelLayout:"vertical",label:a.width,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1",a.width)),setup:c,commit:d},{id:"height",type:"text",requiredContent:"iframe[height]",style:"width:100%",labelLayout:"vertical",label:a.height,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1",a.height)),setup:c,commit:d},{id:"align",type:"select",requiredContent:"iframe[align]","default":"",items:[[a.notSet,""],[a.alignLeft,"left"],[a.alignRight, +"right"],[a.alignTop,"top"],[a.alignMiddle,"middle"],[a.alignBottom,"bottom"]],style:"width:100%",labelLayout:"vertical",label:a.align,setup:function(a,b){c.apply(this,arguments);if(b){var d=b.getAttribute("align");this.setValue(d&&d.toLowerCase()||"")}},commit:function(a,b,c){d.apply(this,arguments);this.getValue()&&(c.align=this.getValue())}}]},{type:"hbox",widths:["50%","50%"],children:[{id:"scrolling",type:"checkbox",requiredContent:"iframe[scrolling]",label:f.scrolling,setup:c,commit:d},{id:"frameborder", +type:"checkbox",requiredContent:"iframe[frameborder]",label:f.border,setup:c,commit:d}]},{type:"hbox",widths:["50%","50%"],children:[{id:"name",type:"text",requiredContent:"iframe[name]",label:a.name,setup:c,commit:d},{id:"title",type:"text",requiredContent:"iframe[title]",label:a.advisoryTitle,setup:c,commit:d}]},{id:"longdesc",type:"text",requiredContent:"iframe[longdesc]",label:a.longDescr,setup:c,commit:d}]},e&&e.createAdvancedTab(b,{id:1,classes:1,styles:1},"iframe")]}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/icons/hidpi/iframe.png b/bower_components/ckeditor/plugins/iframe/icons/hidpi/iframe.png new file mode 100644 index 0000000..ff17604 Binary files /dev/null and b/bower_components/ckeditor/plugins/iframe/icons/hidpi/iframe.png differ diff --git a/bower_components/ckeditor/plugins/iframe/icons/iframe.png b/bower_components/ckeditor/plugins/iframe/icons/iframe.png new file mode 100644 index 0000000..f72d191 Binary files /dev/null and b/bower_components/ckeditor/plugins/iframe/icons/iframe.png differ diff --git a/bower_components/ckeditor/plugins/iframe/images/placeholder.png b/bower_components/ckeditor/plugins/iframe/images/placeholder.png new file mode 100644 index 0000000..4af0956 Binary files /dev/null and b/bower_components/ckeditor/plugins/iframe/images/placeholder.png differ diff --git a/bower_components/ckeditor/plugins/iframe/lang/af.js b/bower_components/ckeditor/plugins/iframe/lang/af.js new file mode 100644 index 0000000..71eb910 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","af",{border:"Wys rand van raam",noUrl:"Gee die iframe URL",scrolling:"Skuifbalke aan",title:"IFrame Eienskappe",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/ar.js b/bower_components/ckeditor/plugins/iframe/lang/ar.js new file mode 100644 index 0000000..8b90f6c --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","ar",{border:"إظهار حدود الإطار",noUrl:"فضلا أكتب رابط الـ iframe",scrolling:"تفعيل أشرطة الإنتقال",title:"خصائص iframe",toolbar:"iframe"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/bg.js b/bower_components/ckeditor/plugins/iframe/lang/bg.js new file mode 100644 index 0000000..23b9a7b --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","bg",{border:"Показва рамка на карето",noUrl:"Моля въведете URL за iFrame",scrolling:"Вкл. скролбаровете",title:"IFrame настройки",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/bn.js b/bower_components/ckeditor/plugins/iframe/lang/bn.js new file mode 100644 index 0000000..a7a9ee0 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","bn",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/bs.js b/bower_components/ckeditor/plugins/iframe/lang/bs.js new file mode 100644 index 0000000..f37043c --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","bs",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/ca.js b/bower_components/ckeditor/plugins/iframe/lang/ca.js new file mode 100644 index 0000000..18bddf5 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","ca",{border:"Mostra la vora del marc",noUrl:"Si us plau, introdueixi la URL de l'iframe",scrolling:"Activa les barres de desplaçament",title:"Propietats de l'IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/cs.js b/bower_components/ckeditor/plugins/iframe/lang/cs.js new file mode 100644 index 0000000..37b25fb --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","cs",{border:"Zobrazit okraj",noUrl:"Zadejte prosím URL obsahu pro IFrame",scrolling:"Zapnout posuvníky",title:"Vlastnosti IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/cy.js b/bower_components/ckeditor/plugins/iframe/lang/cy.js new file mode 100644 index 0000000..f8db604 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","cy",{border:"Dangos ymyl y ffrâm",noUrl:"Rhowch URL yr iframe",scrolling:"Galluogi bariau sgrolio",title:"Priodweddau IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/da.js b/bower_components/ckeditor/plugins/iframe/lang/da.js new file mode 100644 index 0000000..5411533 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","da",{border:"Vis kant på rammen",noUrl:"Venligst indsæt URL på iframen",scrolling:"Aktiver scrollbars",title:"Iframe egenskaber",toolbar:"Iframe"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/de.js b/bower_components/ckeditor/plugins/iframe/lang/de.js new file mode 100644 index 0000000..2556d57 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","de",{border:"Rahmen anzeigen",noUrl:"Bitte geben Sie die IFrame-URL an",scrolling:"Rollbalken anzeigen",title:"IFrame-Eigenschaften",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/el.js b/bower_components/ckeditor/plugins/iframe/lang/el.js new file mode 100644 index 0000000..cecba9b --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","el",{border:"Προβολή περιγράμματος πλαισίου",noUrl:"Παρακαλούμε εισάγεται το URL του iframe",scrolling:"Ενεργοποίηση μπαρών κύλισης",title:"Ιδιότητες IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/en-au.js b/bower_components/ckeditor/plugins/iframe/lang/en-au.js new file mode 100644 index 0000000..8e2821f --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","en-au",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/en-ca.js b/bower_components/ckeditor/plugins/iframe/lang/en-ca.js new file mode 100644 index 0000000..c25669e --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","en-ca",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/en-gb.js b/bower_components/ckeditor/plugins/iframe/lang/en-gb.js new file mode 100644 index 0000000..214388d --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","en-gb",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/en.js b/bower_components/ckeditor/plugins/iframe/lang/en.js new file mode 100644 index 0000000..8d1407e --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","en",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/eo.js b/bower_components/ckeditor/plugins/iframe/lang/eo.js new file mode 100644 index 0000000..a185507 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","eo",{border:"Montri borderon de kadro (frame)",noUrl:"Bonvolu entajpi la retadreson de la ligilo al la enlinia kadro (IFrame)",scrolling:"Ebligi rulumskalon",title:"Atributoj de la enlinia kadro (IFrame)",toolbar:"Enlinia kadro (IFrame)"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/es.js b/bower_components/ckeditor/plugins/iframe/lang/es.js new file mode 100644 index 0000000..89e3851 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","es",{border:"Mostrar borde del marco",noUrl:"Por favor, escriba la dirección del iframe",scrolling:"Activar barras de desplazamiento",title:"Propiedades de iframe",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/et.js b/bower_components/ckeditor/plugins/iframe/lang/et.js new file mode 100644 index 0000000..7cd5ec0 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","et",{border:"Raami äärise näitamine",noUrl:"Vali iframe URLi liik",scrolling:"Kerimisribade lubamine",title:"IFrame omadused",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/eu.js b/bower_components/ckeditor/plugins/iframe/lang/eu.js new file mode 100644 index 0000000..f8b1cff --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","eu",{border:"Markoaren ertza ikusi",noUrl:"iframe-aren URLa idatzi, mesedez.",scrolling:"Korritze barrak gaitu",title:"IFrame-aren Propietateak",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/fa.js b/bower_components/ckeditor/plugins/iframe/lang/fa.js new file mode 100644 index 0000000..a6bd7ee --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","fa",{border:"نمایش خطوط frame",noUrl:"لطفا مسیر URL iframe را درج کنید",scrolling:"نمایش خطکشها",title:"ویژگیهای IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/fi.js b/bower_components/ckeditor/plugins/iframe/lang/fi.js new file mode 100644 index 0000000..2813efb --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","fi",{border:"Näytä kehyksen reunat",noUrl:"Anna IFrame-kehykselle lähdeosoite (src)",scrolling:"Näytä vierityspalkit",title:"IFrame-kehyksen ominaisuudet",toolbar:"IFrame-kehys"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/fo.js b/bower_components/ckeditor/plugins/iframe/lang/fo.js new file mode 100644 index 0000000..3ec97a0 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","fo",{border:"Vís frame kant",noUrl:"Vinarliga skriva URL til iframe",scrolling:"Loyv scrollbars",title:"Møguleikar fyri IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/fr-ca.js b/bower_components/ckeditor/plugins/iframe/lang/fr-ca.js new file mode 100644 index 0000000..1a43ea6 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","fr-ca",{border:"Afficher la bordure du cadre",noUrl:"Veuillez entre l'URL du IFrame",scrolling:"Activer les barres de défilement",title:"Propriétés du IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/fr.js b/bower_components/ckeditor/plugins/iframe/lang/fr.js new file mode 100644 index 0000000..c5bc58c --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","fr",{border:"Afficher une bordure de la IFrame",noUrl:"Veuillez entrer l'adresse du lien de la IFrame",scrolling:"Permettre à la barre de défilement",title:"Propriétés de la IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/gl.js b/bower_components/ckeditor/plugins/iframe/lang/gl.js new file mode 100644 index 0000000..5326e33 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","gl",{border:"Amosar o bordo do marco",noUrl:"Escriba o enderezo do iframe",scrolling:"Activar as barras de desprazamento",title:"Propiedades do iFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/gu.js b/bower_components/ckeditor/plugins/iframe/lang/gu.js new file mode 100644 index 0000000..0c6aed9 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","gu",{border:"ફ્રેમ બોર્ડેર બતાવવી",noUrl:"iframe URL ટાઈપ્ કરો",scrolling:"સ્ક્રોલબાર ચાલુ કરવા",title:"IFrame વિકલ્પો",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/he.js b/bower_components/ckeditor/plugins/iframe/lang/he.js new file mode 100644 index 0000000..4c22777 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","he",{border:"הראה מסגרת לחלון",noUrl:"יש להכניס כתובת לחלון.",scrolling:"אפשר פסי גלילה",title:"מאפייני חלון פנימי (iframe)",toolbar:"חלון פנימי (iframe)"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/hi.js b/bower_components/ckeditor/plugins/iframe/lang/hi.js new file mode 100644 index 0000000..8699b82 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","hi",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/hr.js b/bower_components/ckeditor/plugins/iframe/lang/hr.js new file mode 100644 index 0000000..6cf8b83 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","hr",{border:"Prikaži okvir IFrame-a",noUrl:"Unesite URL iframe-a",scrolling:"Omogući trake za skrolanje",title:"IFrame svojstva",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/hu.js b/bower_components/ckeditor/plugins/iframe/lang/hu.js new file mode 100644 index 0000000..94bdf85 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","hu",{border:"Legyen keret",noUrl:"Kérem írja be a iframe URL-t",scrolling:"Gördítősáv bekapcsolása",title:"IFrame Tulajdonságok",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/id.js b/bower_components/ckeditor/plugins/iframe/lang/id.js new file mode 100644 index 0000000..0db9a8e --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","id",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/is.js b/bower_components/ckeditor/plugins/iframe/lang/is.js new file mode 100644 index 0000000..bb669e8 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","is",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/it.js b/bower_components/ckeditor/plugins/iframe/lang/it.js new file mode 100644 index 0000000..54f33be --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","it",{border:"Mostra il bordo",noUrl:"Inserire l'URL del campo IFrame",scrolling:"Abilita scrollbar",title:"Proprietà IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/ja.js b/bower_components/ckeditor/plugins/iframe/lang/ja.js new file mode 100644 index 0000000..039c578 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","ja",{border:"フレームの枠を表示",noUrl:"iframeのURLを入力してください。",scrolling:"スクロールバーの表示を許可",title:"iFrameのプロパティ",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/ka.js b/bower_components/ckeditor/plugins/iframe/lang/ka.js new file mode 100644 index 0000000..e838899 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","ka",{border:"ჩარჩოს გამოჩენა",noUrl:"აკრიფეთ iframe-ის URL",scrolling:"გადახვევის ზოლების დაშვება",title:"IFrame-ის პარამეტრები",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/km.js b/bower_components/ckeditor/plugins/iframe/lang/km.js new file mode 100644 index 0000000..629c783 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","km",{border:"បង្ហាញ​បន្ទាត់​ស៊ុម",noUrl:"សូម​បញ្ចូល URL របស់ iframe",scrolling:"ប្រើ​របារ​រំកិល",title:"លក្ខណៈ​សម្បត្តិ IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/ko.js b/bower_components/ckeditor/plugins/iframe/lang/ko.js new file mode 100644 index 0000000..fa6bc74 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","ko",{border:"프레임 테두리 표시",noUrl:"iframe 대응 URL을 입력해주세요.",scrolling:"스크롤바 사용",title:"IFrame 속성",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/ku.js b/bower_components/ckeditor/plugins/iframe/lang/ku.js new file mode 100644 index 0000000..bc1ae36 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","ku",{border:"نیشاندانی لاکێشه بە چوواردەوری چووارچێوە",noUrl:"تکایه ناونیشانی بەستەر بنووسه بۆ چووارچێوه",scrolling:"چالاککردنی هاتووچۆپێکردن",title:"دیالۆگی چووارچێوه",toolbar:"چووارچێوه"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/lt.js b/bower_components/ckeditor/plugins/iframe/lang/lt.js new file mode 100644 index 0000000..20dee01 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","lt",{border:"Rodyti rėmelį",noUrl:"Nurodykite iframe nuorodą",scrolling:"Įjungti slankiklius",title:"IFrame nustatymai",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/lv.js b/bower_components/ckeditor/plugins/iframe/lang/lv.js new file mode 100644 index 0000000..b9db943 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","lv",{border:"Rādīt rāmi",noUrl:"Norādiet iframe adresi",scrolling:"Atļaut ritjoslas",title:"IFrame uzstādījumi",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/mk.js b/bower_components/ckeditor/plugins/iframe/lang/mk.js new file mode 100644 index 0000000..a4dbb23 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","mk",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/mn.js b/bower_components/ckeditor/plugins/iframe/lang/mn.js new file mode 100644 index 0000000..f45cf05 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","mn",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/ms.js b/bower_components/ckeditor/plugins/iframe/lang/ms.js new file mode 100644 index 0000000..8ff5bc1 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","ms",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/nb.js b/bower_components/ckeditor/plugins/iframe/lang/nb.js new file mode 100644 index 0000000..ec65e33 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","nb",{border:"Viss ramme rundt iframe",noUrl:"Vennligst skriv inn URL for iframe",scrolling:"Aktiver scrollefelt",title:"Egenskaper for IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/nl.js b/bower_components/ckeditor/plugins/iframe/lang/nl.js new file mode 100644 index 0000000..348ee0e --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","nl",{border:"Framerand tonen",noUrl:"Vul de IFrame URL in",scrolling:"Scrollbalken inschakelen",title:"IFrame-eigenschappen",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/no.js b/bower_components/ckeditor/plugins/iframe/lang/no.js new file mode 100644 index 0000000..04a9241 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","no",{border:"Viss ramme rundt iframe",noUrl:"Vennligst skriv inn URL for iframe",scrolling:"Aktiver scrollefelt",title:"Egenskaper for IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/pl.js b/bower_components/ckeditor/plugins/iframe/lang/pl.js new file mode 100644 index 0000000..d085999 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","pl",{border:"Pokaż obramowanie obiektu IFrame",noUrl:"Podaj adres URL elementu IFrame",scrolling:"Włącz paski przewijania",title:"Właściwości elementu IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/pt-br.js b/bower_components/ckeditor/plugins/iframe/lang/pt-br.js new file mode 100644 index 0000000..6710026 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","pt-br",{border:"Mostra borda do iframe",noUrl:"Insira a URL do iframe",scrolling:"Abilita scrollbars",title:"Propriedade do IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/pt.js b/bower_components/ckeditor/plugins/iframe/lang/pt.js new file mode 100644 index 0000000..b8c8a01 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","pt",{border:"Mostrar a borda da Frame",noUrl:"Por favor, digite o URL da iframe",scrolling:"Ativar barras de rolamento",title:"Propriedades da IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/ro.js b/bower_components/ckeditor/plugins/iframe/lang/ro.js new file mode 100644 index 0000000..d2ca21f --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","ro",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/ru.js b/bower_components/ckeditor/plugins/iframe/lang/ru.js new file mode 100644 index 0000000..8691613 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","ru",{border:"Показать границы фрейма",noUrl:"Пожалуйста, введите ссылку фрейма",scrolling:"Отображать полосы прокрутки",title:"Свойства iFrame",toolbar:"iFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/si.js b/bower_components/ckeditor/plugins/iframe/lang/si.js new file mode 100644 index 0000000..a0b2c1e --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","si",{border:"සැකිල්ලේ කඩයිම් ",noUrl:"කරුණාකර රුපයේ URL ලියන්න",scrolling:"සක්ක්‍රිය කරන්න",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/sk.js b/bower_components/ckeditor/plugins/iframe/lang/sk.js new file mode 100644 index 0000000..7685e8b --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","sk",{border:"Zobraziť rám frame-u",noUrl:"Prosím, vložte URL iframe",scrolling:"Povoliť skrolovanie",title:"Vlastnosti IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/sl.js b/bower_components/ckeditor/plugins/iframe/lang/sl.js new file mode 100644 index 0000000..7b79a79 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","sl",{border:"Pokaži mejo okvira",noUrl:"Prosimo, vnesite iframe URL",scrolling:"Omogoči scrollbars",title:"IFrame Lastnosti",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/sq.js b/bower_components/ckeditor/plugins/iframe/lang/sq.js new file mode 100644 index 0000000..4c66e35 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","sq",{border:"Shfaq kufirin e kornizës",noUrl:"Ju lutemi shkruani URL-në e iframe-it",scrolling:"Lejo shiritët zvarritës",title:"Karakteristikat e IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/sr-latn.js b/bower_components/ckeditor/plugins/iframe/lang/sr-latn.js new file mode 100644 index 0000000..3d27945 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","sr-latn",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/sr.js b/bower_components/ckeditor/plugins/iframe/lang/sr.js new file mode 100644 index 0000000..e7d1c53 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","sr",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/sv.js b/bower_components/ckeditor/plugins/iframe/lang/sv.js new file mode 100644 index 0000000..c8adee2 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","sv",{border:"Visa ramkant",noUrl:"Skriv in URL för iFrame",scrolling:"Aktivera rullningslister",title:"iFrame Egenskaper",toolbar:"iFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/th.js b/bower_components/ckeditor/plugins/iframe/lang/th.js new file mode 100644 index 0000000..6d876ed --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","th",{border:"Show frame border",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame Properties",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/tr.js b/bower_components/ckeditor/plugins/iframe/lang/tr.js new file mode 100644 index 0000000..9096f66 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","tr",{border:"Çerceve sınırlarını göster",noUrl:"Lütfen IFrame köprü (URL) bağlantısını yazın",scrolling:"Kaydırma çubuklarını aktif et",title:"IFrame Özellikleri",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/tt.js b/bower_components/ckeditor/plugins/iframe/lang/tt.js new file mode 100644 index 0000000..586d3ae --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","tt",{border:"Frame чикләрен күрсәтү",noUrl:"Please type the iframe URL",scrolling:"Enable scrollbars",title:"IFrame үзлекләре",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/ug.js b/bower_components/ckeditor/plugins/iframe/lang/ug.js new file mode 100644 index 0000000..156b972 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","ug",{border:"كاندۇك گىرۋەكلىرىنى كۆرسەت",noUrl:"كاندۇكنىڭ ئادرېسى(Url)نى كىرگۈزۈڭ",scrolling:"دومىلىما سۈرگۈچكە يول قوي",title:"IFrame خاسلىق",toolbar:"IFrame "}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/uk.js b/bower_components/ckeditor/plugins/iframe/lang/uk.js new file mode 100644 index 0000000..fe6660c --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","uk",{border:"Показати рамки фрейму",noUrl:"Будь ласка введіть посилання для IFrame",scrolling:"Увімкнути прокрутку",title:"Налаштування для IFrame",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/vi.js b/bower_components/ckeditor/plugins/iframe/lang/vi.js new file mode 100644 index 0000000..7034022 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","vi",{border:"Hiển thị viền khung",noUrl:"Vui lòng nhập địa chỉ iframe",scrolling:"Kích hoạt thanh cuộn",title:"Thuộc tính iframe",toolbar:"Iframe"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/zh-cn.js b/bower_components/ckeditor/plugins/iframe/lang/zh-cn.js new file mode 100644 index 0000000..876c196 --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","zh-cn",{border:"显示框架边框",noUrl:"请输入框架的 URL",scrolling:"允许滚动条",title:"IFrame 属性",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/lang/zh.js b/bower_components/ckeditor/plugins/iframe/lang/zh.js new file mode 100644 index 0000000..5fdd10f --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("iframe","zh",{border:"顯示框架框線",noUrl:"請輸入 iframe URL",scrolling:"啟用捲軸列",title:"IFrame 屬性",toolbar:"IFrame"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframe/plugin.js b/bower_components/ckeditor/plugins/iframe/plugin.js new file mode 100644 index 0000000..4b4a01f --- /dev/null +++ b/bower_components/ckeditor/plugins/iframe/plugin.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){CKEDITOR.plugins.add("iframe",{requires:"dialog,fakeobjects",lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"iframe",hidpi:!0,onLoad:function(){CKEDITOR.addCss("img.cke_iframe{background-image: url("+CKEDITOR.getUrl(this.path+"images/placeholder.png")+");background-position: center center;background-repeat: no-repeat;border: 1px solid #a9a9a9;width: 80px;height: 80px;}")}, +init:function(a){var b=a.lang.iframe,c="iframe[align,longdesc,frameborder,height,name,scrolling,src,title,width]";a.plugins.dialogadvtab&&(c+=";iframe"+a.plugins.dialogadvtab.allowedContent({id:1,classes:1,styles:1}));CKEDITOR.dialog.add("iframe",this.path+"dialogs/iframe.js");a.addCommand("iframe",new CKEDITOR.dialogCommand("iframe",{allowedContent:c,requiredContent:"iframe"}));a.ui.addButton&&a.ui.addButton("Iframe",{label:b.toolbar,command:"iframe",toolbar:"insert,80"});a.on("doubleclick",function(a){var b= +a.data.element;b.is("img")&&"iframe"==b.data("cke-real-element-type")&&(a.data.dialog="iframe")});a.addMenuItems&&a.addMenuItems({iframe:{label:b.title,command:"iframe",group:"image"}});a.contextMenu&&a.contextMenu.addListener(function(a){if(a&&a.is("img")&&"iframe"==a.data("cke-real-element-type"))return{iframe:CKEDITOR.TRISTATE_OFF}})},afterInit:function(a){var b=a.dataProcessor;(b=b&&b.dataFilter)&&b.addRules({elements:{iframe:function(b){return a.createFakeParserElement(b,"cke_iframe","iframe", +!0)}}})}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/iframedialog/plugin.js b/bower_components/ckeditor/plugins/iframedialog/plugin.js new file mode 100644 index 0000000..f7a0afc --- /dev/null +++ b/bower_components/ckeditor/plugins/iframedialog/plugin.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.add("iframedialog",{requires:"dialog",onLoad:function(){CKEDITOR.dialog.addIframe=function(e,d,a,j,f,l,g){a={type:"iframe",src:a,width:"100%",height:"100%"};a.onContentLoad="function"==typeof l?l:function(){var a=this.getElement().$.contentWindow;if(a.onDialogEvent){var b=this.getDialog(),c=function(b){return a.onDialogEvent(b)};b.on("ok",c);b.on("cancel",c);b.on("resize",c);b.on("hide",function(a){b.removeListener("ok",c);b.removeListener("cancel",c);b.removeListener("resize",c); +a.removeListener()});a.onDialogEvent({name:"load",sender:this,editor:b._.editor})}};var h={title:d,minWidth:j,minHeight:f,contents:[{id:"iframe",label:d,expand:!0,elements:[a],style:"width:"+a.width+";height:"+a.height}]},i;for(i in g)h[i]=g[i];this.add(e,function(){return h})};(function(){var e=function(d,a,j){if(!(3>arguments.length)){var f=this._||(this._={}),e=a.onContentLoad&&CKEDITOR.tools.bind(a.onContentLoad,this),g=CKEDITOR.tools.cssLength(a.width),h=CKEDITOR.tools.cssLength(a.height);f.frameId= +CKEDITOR.tools.getNextId()+"_iframe";d.on("load",function(){CKEDITOR.document.getById(f.frameId).getParent().setStyles({width:g,height:h})});var i={src:"%2",id:f.frameId,frameborder:0,allowtransparency:!0},k=[];"function"==typeof a.onContentLoad&&(i.onload="CKEDITOR.tools.callFunction(%1);");CKEDITOR.ui.dialog.uiElement.call(this,d,a,k,"iframe",{width:g,height:h},i,"");j.push('<div style="width:'+g+";height:"+h+';" id="'+this.domId+'"></div>');k=k.join("");d.on("show",function(){var b=CKEDITOR.document.getById(f.frameId).getParent(), +c=CKEDITOR.tools.addFunction(e),c=k.replace("%1",c).replace("%2",CKEDITOR.tools.htmlEncode(a.src));b.setHtml(c)})}};e.prototype=new CKEDITOR.ui.dialog.uiElement;CKEDITOR.dialog.addUIElement("iframe",{build:function(d,a,j){return new e(d,a,j)}})})()}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image/dialogs/image.js b/bower_components/ckeditor/plugins/image/dialogs/image.js new file mode 100644 index 0000000..e9d85eb --- /dev/null +++ b/bower_components/ckeditor/plugins/image/dialogs/image.js @@ -0,0 +1,43 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){var r=function(c,j){function r(){var a=arguments,b=this.getContentElement("advanced","txtdlgGenStyle");b&&b.commit.apply(b,a);this.foreach(function(b){b.commit&&"txtdlgGenStyle"!=b.id&&b.commit.apply(b,a)})}function i(a){if(!s){s=1;var b=this.getDialog(),d=b.imageElement;if(d){this.commit(f,d);for(var a=[].concat(a),e=a.length,c,g=0;g<e;g++)(c=b.getContentElement.apply(b,a[g].split(":")))&&c.setup(f,d)}s=0}}var f=1,k=/^\s*(\d+)((px)|\%)?\s*$/i,v=/(^\s*(\d+)((px)|\%)?\s*$)|^$/i,o=/^\d+px$/, +w=function(){var a=this.getValue(),b=this.getDialog(),d=a.match(k);d&&("%"==d[2]&&l(b,!1),a=d[1]);b.lockRatio&&(d=b.originalElement,"true"==d.getCustomData("isReady")&&("txtHeight"==this.id?(a&&"0"!=a&&(a=Math.round(d.$.width*(a/d.$.height))),isNaN(a)||b.setValueOf("info","txtWidth",a)):(a&&"0"!=a&&(a=Math.round(d.$.height*(a/d.$.width))),isNaN(a)||b.setValueOf("info","txtHeight",a))));g(b)},g=function(a){if(!a.originalElement||!a.preview)return 1;a.commitContent(4,a.preview);return 0},s,l=function(a, +b){if(!a.getContentElement("info","ratioLock"))return null;var d=a.originalElement;if(!d)return null;if("check"==b){if(!a.userlockRatio&&"true"==d.getCustomData("isReady")){var e=a.getValueOf("info","txtWidth"),c=a.getValueOf("info","txtHeight"),d=1E3*d.$.width/d.$.height,f=1E3*e/c;a.lockRatio=!1;!e&&!c?a.lockRatio=!0:!isNaN(d)&&!isNaN(f)&&Math.round(d)==Math.round(f)&&(a.lockRatio=!0)}}else void 0!==b?a.lockRatio=b:(a.userlockRatio=1,a.lockRatio=!a.lockRatio);e=CKEDITOR.document.getById(p);a.lockRatio? +e.removeClass("cke_btn_unlocked"):e.addClass("cke_btn_unlocked");e.setAttribute("aria-checked",a.lockRatio);CKEDITOR.env.hc&&e.getChild(0).setHtml(a.lockRatio?CKEDITOR.env.ie?"■":"▣":CKEDITOR.env.ie?"□":"▢");return a.lockRatio},x=function(a){var b=a.originalElement;if("true"==b.getCustomData("isReady")){var d=a.getContentElement("info","txtWidth"),e=a.getContentElement("info","txtHeight");d&&d.setValue(b.$.width);e&&e.setValue(b.$.height)}g(a)},y=function(a,b){function d(a,b){var d=a.match(k);return d? +("%"==d[2]&&(d[1]+="%",l(e,!1)),d[1]):b}if(a==f){var e=this.getDialog(),c="",g="txtWidth"==this.id?"width":"height",h=b.getAttribute(g);h&&(c=d(h,c));c=d(b.getStyle(g),c);this.setValue(c)}},t,q=function(){var a=this.originalElement,b=CKEDITOR.document.getById(m);a.setCustomData("isReady","true");a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);b&&b.setStyle("display","none");this.dontResetSize||x(this);this.firstLoad&&CKEDITOR.tools.setTimeout(function(){l(this,"check")}, +0,this);this.dontResetSize=this.firstLoad=!1;g(this)},h=function(){var a=this.originalElement,b=CKEDITOR.document.getById(m);a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);a=CKEDITOR.getUrl(CKEDITOR.plugins.get("image").path+"images/noimage.png");this.preview&&this.preview.setAttribute("src",a);b&&b.setStyle("display","none");l(this,!1)},n=function(a){return CKEDITOR.tools.getNextId()+"_"+a},p=n("btnLockSizes"),u=n("btnResetSize"),m=n("ImagePreviewLoader"),A=n("previewLink"), +z=n("previewImage");return{title:c.lang.image["image"==j?"title":"titleButton"],minWidth:420,minHeight:360,onShow:function(){this.linkEditMode=this.imageEditMode=this.linkElement=this.imageElement=!1;this.lockRatio=!0;this.userlockRatio=0;this.dontResetSize=!1;this.firstLoad=!0;this.addLink=!1;var a=this.getParentEditor(),b=a.getSelection(),d=(b=b&&b.getSelectedElement())&&a.elementPath(b).contains("a",1),c=CKEDITOR.document.getById(m);c&&c.setStyle("display","none");t=new CKEDITOR.dom.element("img", +a.document);this.preview=CKEDITOR.document.getById(z);this.originalElement=a.document.createElement("img");this.originalElement.setAttribute("alt","");this.originalElement.setCustomData("isReady","false");if(d){this.linkElement=d;this.linkEditMode=!0;c=d.getChildren();if(1==c.count()){var g=c.getItem(0).getName();if("img"==g||"input"==g)this.imageElement=c.getItem(0),"img"==this.imageElement.getName()?this.imageEditMode="img":"input"==this.imageElement.getName()&&(this.imageEditMode="input")}"image"== +j&&this.setupContent(2,d)}if(this.customImageElement)this.imageEditMode="img",this.imageElement=this.customImageElement,delete this.customImageElement;else if(b&&"img"==b.getName()&&!b.data("cke-realelement")||b&&"input"==b.getName()&&"image"==b.getAttribute("type"))this.imageEditMode=b.getName(),this.imageElement=b;this.imageEditMode?(this.cleanImageElement=this.imageElement,this.imageElement=this.cleanImageElement.clone(!0,!0),this.setupContent(f,this.imageElement)):this.imageElement=a.document.createElement("img"); +l(this,!0);CKEDITOR.tools.trim(this.getValueOf("info","txtUrl"))||(this.preview.removeAttribute("src"),this.preview.setStyle("display","none"))},onOk:function(){if(this.imageEditMode){var a=this.imageEditMode;"image"==j&&"input"==a&&confirm(c.lang.image.button2Img)?(this.imageElement=c.document.createElement("img"),this.imageElement.setAttribute("alt",""),c.insertElement(this.imageElement)):"image"!=j&&"img"==a&&confirm(c.lang.image.img2Button)?(this.imageElement=c.document.createElement("input"), +this.imageElement.setAttributes({type:"image",alt:""}),c.insertElement(this.imageElement)):(this.imageElement=this.cleanImageElement,delete this.cleanImageElement)}else"image"==j?this.imageElement=c.document.createElement("img"):(this.imageElement=c.document.createElement("input"),this.imageElement.setAttribute("type","image")),this.imageElement.setAttribute("alt","");this.linkEditMode||(this.linkElement=c.document.createElement("a"));this.commitContent(f,this.imageElement);this.commitContent(2,this.linkElement); +this.imageElement.getAttribute("style")||this.imageElement.removeAttribute("style");this.imageEditMode?!this.linkEditMode&&this.addLink?(c.insertElement(this.linkElement),this.imageElement.appendTo(this.linkElement)):this.linkEditMode&&!this.addLink&&(c.getSelection().selectElement(this.linkElement),c.insertElement(this.imageElement)):this.addLink?this.linkEditMode?c.insertElement(this.imageElement):(c.insertElement(this.linkElement),this.linkElement.append(this.imageElement,!1)):c.insertElement(this.imageElement)}, +onLoad:function(){"image"!=j&&this.hidePage("Link");var a=this._.element.getDocument();this.getContentElement("info","ratioLock")&&(this.addFocusable(a.getById(u),5),this.addFocusable(a.getById(p),5));this.commitContent=r},onHide:function(){this.preview&&this.commitContent(8,this.preview);this.originalElement&&(this.originalElement.removeListener("load",q),this.originalElement.removeListener("error",h),this.originalElement.removeListener("abort",h),this.originalElement.remove(),this.originalElement= +!1);delete this.imageElement},contents:[{id:"info",label:c.lang.image.infoTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{type:"hbox",widths:["280px","110px"],align:"right",children:[{id:"txtUrl",type:"text",label:c.lang.common.url,required:!0,onChange:function(){var a=this.getDialog(),b=this.getValue();if(0<b.length){var a=this.getDialog(),d=a.originalElement;a.preview&&a.preview.removeStyle("display");d.setCustomData("isReady","false");var c=CKEDITOR.document.getById(m);c&&c.setStyle("display", +"");d.on("load",q,a);d.on("error",h,a);d.on("abort",h,a);d.setAttribute("src",b);a.preview&&(t.setAttribute("src",b),a.preview.setAttribute("src",t.$.src),g(a))}else a.preview&&(a.preview.removeAttribute("src"),a.preview.setStyle("display","none"))},setup:function(a,b){if(a==f){var d=b.data("cke-saved-src")||b.getAttribute("src");this.getDialog().dontResetSize=!0;this.setValue(d);this.setInitValue()}},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())?(b.data("cke-saved-src",this.getValue()), +b.setAttribute("src",this.getValue())):8==a&&(b.setAttribute("src",""),b.removeAttribute("src"))},validate:CKEDITOR.dialog.validate.notEmpty(c.lang.image.urlMissing)},{type:"button",id:"browse",style:"display:inline-block;margin-top:14px;",align:"center",label:c.lang.common.browseServer,hidden:!0,filebrowser:"info:txtUrl"}]}]},{id:"txtAlt",type:"text",label:c.lang.image.alt,accessKey:"T","default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("alt"))}, +commit:function(a,b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("alt",this.getValue()):4==a?b.setAttribute("alt",this.getValue()):8==a&&b.removeAttribute("alt")}},{type:"hbox",children:[{id:"basic",type:"vbox",children:[{type:"hbox",requiredContent:"img{width,height}",widths:["50%","50%"],children:[{type:"vbox",padding:1,children:[{type:"text",width:"45px",id:"txtWidth",label:c.lang.common.width,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a= +this.getValue().match(v);(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidWidth);return a},setup:y,commit:function(a,b,d){var e=this.getValue();a==f?(e&&c.activeFilter.check("img{width,height}")?b.setStyle("width",CKEDITOR.tools.cssLength(e)):b.removeStyle("width"),!d&&b.removeAttribute("width")):4==a?e.match(k)?b.setStyle("width",CKEDITOR.tools.cssLength(e)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("width",a.$.width+"px")):8==a&&(b.removeAttribute("width"), +b.removeStyle("width"))}},{type:"text",id:"txtHeight",width:"45px",label:c.lang.common.height,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=this.getValue().match(v);(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidHeight);return a},setup:y,commit:function(a,b,d){var e=this.getValue();a==f?(e&&c.activeFilter.check("img{width,height}")?b.setStyle("height",CKEDITOR.tools.cssLength(e)):b.removeStyle("height"),!d&&b.removeAttribute("height")): +4==a?e.match(k)?b.setStyle("height",CKEDITOR.tools.cssLength(e)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("height",a.$.height+"px")):8==a&&(b.removeAttribute("height"),b.removeStyle("height"))}}]},{id:"ratioLock",type:"html",style:"margin-top:30px;width:40px;height:40px;",onLoad:function(){var a=CKEDITOR.document.getById(u),b=CKEDITOR.document.getById(p);a&&(a.on("click",function(a){x(this);a.data&&a.data.preventDefault()},this.getDialog()),a.on("mouseover", +function(){this.addClass("cke_btn_over")},a),a.on("mouseout",function(){this.removeClass("cke_btn_over")},a));b&&(b.on("click",function(a){l(this);var b=this.originalElement,c=this.getValueOf("info","txtWidth");if(b.getCustomData("isReady")=="true"&&c){b=b.$.height/b.$.width*c;if(!isNaN(b)){this.setValueOf("info","txtHeight",Math.round(b));g(this)}}a.data&&a.data.preventDefault()},this.getDialog()),b.on("mouseover",function(){this.addClass("cke_btn_over")},b),b.on("mouseout",function(){this.removeClass("cke_btn_over")}, +b))},html:'<div><a href="javascript:void(0)" tabindex="-1" title="'+c.lang.image.lockRatio+'" class="cke_btn_locked" id="'+p+'" role="checkbox"><span class="cke_icon"></span><span class="cke_label">'+c.lang.image.lockRatio+'</span></a><a href="javascript:void(0)" tabindex="-1" title="'+c.lang.image.resetSize+'" class="cke_btn_reset" id="'+u+'" role="button"><span class="cke_label">'+c.lang.image.resetSize+"</span></a></div>"}]},{type:"vbox",padding:1,children:[{type:"text",id:"txtBorder",requiredContent:"img{border-width}", +width:"60px",label:c.lang.image.border,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateBorder),setup:function(a,b){if(a==f){var d;d=(d=(d=b.getStyle("border-width"))&&d.match(/^(\d+px)(?: \1 \1 \1)?$/))&&parseInt(d[1],10);isNaN(parseInt(d,10))&&(d=b.getAttribute("border"));this.setValue(d)}},commit:function(a,b,d){var c=parseInt(this.getValue(),10);a==f||4==a?(isNaN(c)?!c&& +this.isChanged()&&b.removeStyle("border"):(b.setStyle("border-width",CKEDITOR.tools.cssLength(c)),b.setStyle("border-style","solid")),!d&&a==f&&b.removeAttribute("border")):8==a&&(b.removeAttribute("border"),b.removeStyle("border-width"),b.removeStyle("border-style"),b.removeStyle("border-color"))}},{type:"text",id:"txtHSpace",requiredContent:"img{margin-left,margin-right}",width:"60px",label:c.lang.image.hSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this, +"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateHSpace),setup:function(a,b){if(a==f){var d,c;d=b.getStyle("margin-left");c=b.getStyle("margin-right");d=d&&d.match(o);c=c&&c.match(o);d=parseInt(d,10);c=parseInt(c,10);d=d==c&&d;isNaN(parseInt(d,10))&&(d=b.getAttribute("hspace"));this.setValue(d)}},commit:function(a,b,d){var c=parseInt(this.getValue(),10);a==f||4==a?(isNaN(c)?!c&&this.isChanged()&&(b.removeStyle("margin-left"),b.removeStyle("margin-right")): +(b.setStyle("margin-left",CKEDITOR.tools.cssLength(c)),b.setStyle("margin-right",CKEDITOR.tools.cssLength(c))),!d&&a==f&&b.removeAttribute("hspace")):8==a&&(b.removeAttribute("hspace"),b.removeStyle("margin-left"),b.removeStyle("margin-right"))}},{type:"text",id:"txtVSpace",requiredContent:"img{margin-top,margin-bottom}",width:"60px",label:c.lang.image.vSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateVSpace), +setup:function(a,b){if(a==f){var c,e;c=b.getStyle("margin-top");e=b.getStyle("margin-bottom");c=c&&c.match(o);e=e&&e.match(o);c=parseInt(c,10);e=parseInt(e,10);c=c==e&&c;isNaN(parseInt(c,10))&&(c=b.getAttribute("vspace"));this.setValue(c)}},commit:function(a,b,c){var e=parseInt(this.getValue(),10);a==f||4==a?(isNaN(e)?!e&&this.isChanged()&&(b.removeStyle("margin-top"),b.removeStyle("margin-bottom")):(b.setStyle("margin-top",CKEDITOR.tools.cssLength(e)),b.setStyle("margin-bottom",CKEDITOR.tools.cssLength(e))), +!c&&a==f&&b.removeAttribute("vspace")):8==a&&(b.removeAttribute("vspace"),b.removeStyle("margin-top"),b.removeStyle("margin-bottom"))}},{id:"cmbAlign",requiredContent:"img{float}",type:"select",widths:["35%","65%"],style:"width:90px",label:c.lang.common.align,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.alignLeft,"left"],[c.lang.common.alignRight,"right"]],onChange:function(){g(this.getDialog());i.call(this,"advanced:txtdlgGenStyle")},setup:function(a,b){if(a==f){var c=b.getStyle("float"); +switch(c){case "inherit":case "none":c=""}!c&&(c=(b.getAttribute("align")||"").toLowerCase());this.setValue(c)}},commit:function(a,b,c){var e=this.getValue();if(a==f||4==a){if(e?b.setStyle("float",e):b.removeStyle("float"),!c&&a==f)switch(e=(b.getAttribute("align")||"").toLowerCase(),e){case "left":case "right":b.removeAttribute("align")}}else 8==a&&b.removeStyle("float")}}]}]},{type:"vbox",height:"250px",children:[{type:"html",id:"htmlPreview",style:"width:95%;",html:"<div>"+CKEDITOR.tools.htmlEncode(c.lang.common.preview)+ +'<br><div id="'+m+'" class="ImagePreviewLoader" style="display:none"><div class="loading"> </div></div><div class="ImagePreviewBox"><table><tr><td><a href="javascript:void(0)" target="_blank" onclick="return false;" id="'+A+'"><img id="'+z+'" alt="" /></a>'+(c.config.image_previewText||"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.")+ +"</td></tr></table></div></div>"}]}]}]},{id:"Link",requiredContent:"a[href]",label:c.lang.image.linkTab,padding:0,elements:[{id:"txtUrl",type:"text",label:c.lang.common.url,style:"width: 100%","default":"",setup:function(a,b){if(2==a){var c=b.data("cke-saved-href");c||(c=b.getAttribute("href"));this.setValue(c)}},commit:function(a,b){if(2==a&&(this.getValue()||this.isChanged())){var d=this.getValue();b.data("cke-saved-href",d);b.setAttribute("href",d);if(this.getValue()||!c.config.image_removeLinkByEmptyURL)this.getDialog().addLink= +!0}}},{type:"button",id:"browse",filebrowser:{action:"Browse",target:"Link:txtUrl",url:c.config.filebrowserImageBrowseLinkUrl},style:"float:right",hidden:!0,label:c.lang.common.browseServer},{id:"cmbTarget",type:"select",requiredContent:"a[target]",label:c.lang.common.target,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.targetNew,"_blank"],[c.lang.common.targetTop,"_top"],[c.lang.common.targetSelf,"_self"],[c.lang.common.targetParent,"_parent"]],setup:function(a,b){2==a&&this.setValue(b.getAttribute("target")|| +"")},commit:function(a,b){2==a&&(this.getValue()||this.isChanged())&&b.setAttribute("target",this.getValue())}}]},{id:"Upload",hidden:!0,filebrowser:"uploadButton",label:c.lang.image.upload,elements:[{type:"file",id:"upload",label:c.lang.image.btnUpload,style:"height:40px",size:38},{type:"fileButton",id:"uploadButton",filebrowser:"info:txtUrl",label:c.lang.image.btnUpload,"for":["Upload","upload"]}]},{id:"advanced",label:c.lang.common.advancedTab,elements:[{type:"hbox",widths:["50%","25%","25%"], +children:[{type:"text",id:"linkId",requiredContent:"img[id]",label:c.lang.common.id,setup:function(a,b){a==f&&this.setValue(b.getAttribute("id"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("id",this.getValue())}},{id:"cmbLangDir",type:"select",requiredContent:"img[dir]",style:"width : 100px;",label:c.lang.common.langDir,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.langDirLtr,"ltr"],[c.lang.common.langDirRtl,"rtl"]],setup:function(a,b){a==f&&this.setValue(b.getAttribute("dir"))}, +commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("dir",this.getValue())}},{type:"text",id:"txtLangCode",requiredContent:"img[lang]",label:c.lang.common.langCode,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("lang"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("lang",this.getValue())}}]},{type:"text",id:"txtGenLongDescr",requiredContent:"img[longdesc]",label:c.lang.common.longDescr,setup:function(a,b){a==f&&this.setValue(b.getAttribute("longDesc"))}, +commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("longDesc",this.getValue())}},{type:"hbox",widths:["50%","50%"],children:[{type:"text",id:"txtGenClass",requiredContent:"img(cke-xyz)",label:c.lang.common.cssClass,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("class"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("class",this.getValue())}},{type:"text",id:"txtGenTitle",requiredContent:"img[title]",label:c.lang.common.advisoryTitle, +"default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("title"))},commit:function(a,b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("title",this.getValue()):4==a?b.setAttribute("title",this.getValue()):8==a&&b.removeAttribute("title")}}]},{type:"text",id:"txtdlgGenStyle",requiredContent:"img{cke-xyz}",label:c.lang.common.cssStyle,validate:CKEDITOR.dialog.validate.inlineStyle(c.lang.common.invalidInlineStyle),"default":"",setup:function(a, +b){if(a==f){var c=b.getAttribute("style");!c&&b.$.style.cssText&&(c=b.$.style.cssText);this.setValue(c);var e=b.$.style.height,c=b.$.style.width,e=(e?e:"").match(k),c=(c?c:"").match(k);this.attributesInStyle={height:!!e,width:!!c}}},onChange:function(){i.call(this,"info:cmbFloat info:cmbAlign info:txtVSpace info:txtHSpace info:txtBorder info:txtWidth info:txtHeight".split(" "));g(this)},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("style",this.getValue())}}]}]}}; +CKEDITOR.dialog.add("image",function(c){return r(c,"image")});CKEDITOR.dialog.add("imagebutton",function(c){return r(c,"imagebutton")})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image/images/noimage.png b/bower_components/ckeditor/plugins/image/images/noimage.png new file mode 100644 index 0000000..1598113 Binary files /dev/null and b/bower_components/ckeditor/plugins/image/images/noimage.png differ diff --git a/bower_components/ckeditor/plugins/image2/dialogs/image2.js b/bower_components/ckeditor/plugins/image2/dialogs/image2.js new file mode 100644 index 0000000..6b60199 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/dialogs/image2.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("image2",function(j){function z(){var a=this.getValue().match(A);(a=!!(a&&0!==parseInt(a[1],10)))||alert(c["invalid"+CKEDITOR.tools.capitalize(this.id)]);return a}function K(){function a(a,b){d.push(i.once(a,function(a){for(var i;i=d.pop();)i.removeListener();b(a)}))}var i=p.createElement("img"),d=[];return function(d,b,c){a("load",function(){var a=B(i);b.call(c,i,a.width,a.height)});a("error",function(){b(null)});a("abort",function(){b(null)});i.setAttribute("src",(t.baseHref|| +"")+d+"?"+Math.random().toString(16).substring(2))}}function C(){var a=this.getValue();q(!1);a!==u.data.src?(D(a,function(a,d,b){q(!0);if(!a)return k(!1);g.setValue(d);h.setValue(b);r=d;s=b;k(E.checkHasNaturalRatio(a))}),l=!0):l?(q(!0),g.setValue(m),h.setValue(n),l=!1):q(!0)}function F(){if(e){var a=this.getValue();if(a&&(a.match(A)||k(!1),"0"!==a)){var b="width"==this.id,d=m||r,c=n||s,a=b?Math.round(c*(a/d)):Math.round(d*(a/c));isNaN(a)||(b?h:g).setValue(a)}}}function k(a){if(f){if("boolean"==typeof a){if(v)return; +e=a}else if(a=g.getValue(),v=!0,(e=!e)&&a)a*=n/m,isNaN(a)||h.setValue(Math.round(a));f[e?"removeClass":"addClass"]("cke_btn_unlocked");f.setAttribute("aria-checked",e);CKEDITOR.env.hc&&f.getChild(0).setHtml(e?CKEDITOR.env.ie?"■":"▣":CKEDITOR.env.ie?"□":"▢")}}function q(a){a=a?"enable":"disable";g[a]();h[a]()}var A=/(^\s*(\d+)(px)?\s*$)|^$/i,G=CKEDITOR.tools.getNextId(),H=CKEDITOR.tools.getNextId(),b=j.lang.image2,c=j.lang.common,L=(new CKEDITOR.template('<div><a href="javascript:void(0)" tabindex="-1" title="'+ +b.lockRatio+'" class="cke_btn_locked" id="{lockButtonId}" role="checkbox"><span class="cke_icon"></span><span class="cke_label">'+b.lockRatio+'</span></a><a href="javascript:void(0)" tabindex="-1" title="'+b.resetSize+'" class="cke_btn_reset" id="{resetButtonId}" role="button"><span class="cke_label">'+b.resetSize+"</span></a></div>")).output({lockButtonId:G,resetButtonId:H}),E=CKEDITOR.plugins.image2,t=j.config,w=j.widgets.registered.image.features,B=E.getNatural,p,u,I,D,m,n,r,s,l,e,v,f,o,g,h,x, +y=!(!t.filebrowserImageBrowseUrl&&!t.filebrowserBrowseUrl),J=[{id:"src",type:"text",label:c.url,onKeyup:C,onChange:C,setup:function(a){this.setValue(a.data.src)},commit:function(a){a.setData("src",this.getValue())},validate:CKEDITOR.dialog.validate.notEmpty(b.urlMissing)}];y&&J.push({type:"button",id:"browse",style:"display:inline-block;margin-top:14px;",align:"center",label:j.lang.common.browseServer,hidden:!0,filebrowser:"info:src"});return{title:b.title,minWidth:250,minHeight:100,onLoad:function(){p= +this._.element.getDocument();D=K()},onShow:function(){u=this.widget;I=u.parts.image;l=v=e=!1;x=B(I);r=m=x.width;s=n=x.height},contents:[{id:"info",label:b.infoTab,elements:[{type:"vbox",padding:0,children:[{type:"hbox",widths:["100%"],children:J}]},{id:"alt",type:"text",label:b.alt,setup:function(a){this.setValue(a.data.alt)},commit:function(a){a.setData("alt",this.getValue())}},{type:"hbox",widths:["25%","25%","50%"],requiredContent:w.dimension.requiredContent,children:[{type:"text",width:"45px", +id:"width",label:c.width,validate:z,onKeyUp:F,onLoad:function(){g=this},setup:function(a){this.setValue(a.data.width)},commit:function(a){a.setData("width",this.getValue())}},{type:"text",id:"height",width:"45px",label:c.height,validate:z,onKeyUp:F,onLoad:function(){h=this},setup:function(a){this.setValue(a.data.height)},commit:function(a){a.setData("height",this.getValue())}},{id:"lock",type:"html",style:"margin-top:18px;width:40px;height:20px;",onLoad:function(){function a(a){a.on("mouseover",function(){this.addClass("cke_btn_over")}, +a);a.on("mouseout",function(){this.removeClass("cke_btn_over")},a)}var b=this.getDialog();f=p.getById(G);o=p.getById(H);f&&(b.addFocusable(f,4+y),f.on("click",function(a){k();a.data&&a.data.preventDefault()},this.getDialog()),a(f));o&&(b.addFocusable(o,5+y),o.on("click",function(a){if(l){g.setValue(r);h.setValue(s)}else{g.setValue(m);h.setValue(n)}a.data&&a.data.preventDefault()},this),a(o))},setup:function(a){k(a.data.lock)},commit:function(a){a.setData("lock",e)},html:L}]},{type:"hbox",id:"alignment", +requiredContent:w.align.requiredContent,children:[{id:"align",type:"radio",items:[[c.alignNone,"none"],[c.alignLeft,"left"],[c.alignCenter,"center"],[c.alignRight,"right"]],label:c.align,setup:function(a){this.setValue(a.data.align)},commit:function(a){a.setData("align",this.getValue())}}]},{id:"hasCaption",type:"checkbox",label:b.captioned,requiredContent:w.caption.requiredContent,setup:function(a){this.setValue(a.data.hasCaption)},commit:function(a){a.setData("hasCaption",this.getValue())}}]},{id:"Upload", +hidden:!0,filebrowser:"uploadButton",label:b.uploadTab,elements:[{type:"file",id:"upload",label:b.btnUpload,style:"height:40px"},{type:"fileButton",id:"uploadButton",filebrowser:"info:src",label:b.btnUpload,"for":["Upload","upload"]}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/icons/hidpi/image.png b/bower_components/ckeditor/plugins/image2/icons/hidpi/image.png new file mode 100644 index 0000000..b3c7ade Binary files /dev/null and b/bower_components/ckeditor/plugins/image2/icons/hidpi/image.png differ diff --git a/bower_components/ckeditor/plugins/image2/icons/image.png b/bower_components/ckeditor/plugins/image2/icons/image.png new file mode 100644 index 0000000..fcf61b5 Binary files /dev/null and b/bower_components/ckeditor/plugins/image2/icons/image.png differ diff --git a/bower_components/ckeditor/plugins/image2/lang/af.js b/bower_components/ckeditor/plugins/image2/lang/af.js new file mode 100644 index 0000000..d5ef461 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","af",{alt:"Alternatiewe teks",btnUpload:"Stuur na bediener",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Afbeelding informasie",lockRatio:"Vaste proporsie",menu:"Afbeelding eienskappe",pathName:"image",pathNameCaption:"caption",resetSize:"Herstel grootte",resizer:"Click and drag to resize",title:"Afbeelding eienskappe",uploadTab:"Oplaai",urlMissing:"Die URL na die afbeelding ontbreek."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/ar.js b/bower_components/ckeditor/plugins/image2/lang/ar.js new file mode 100644 index 0000000..435544b --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","ar",{alt:"عنوان الصورة",btnUpload:"أرسلها للخادم",captioned:"صورة ذات اسم",captionPlaceholder:"تسمية",infoTab:"معلومات الصورة",lockRatio:"تناسق الحجم",menu:"خصائص الصورة",pathName:"صورة",pathNameCaption:"تسمية",resetSize:"إستعادة الحجم الأصلي",resizer:"انقر ثم اسحب للتحجيم",title:"خصائص الصورة",uploadTab:"رفع",urlMissing:"عنوان مصدر الصورة مفقود"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/bg.js b/bower_components/ckeditor/plugins/image2/lang/bg.js new file mode 100644 index 0000000..a97a26e --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","bg",{alt:"Алтернативен текст",btnUpload:"Изпрати я на сървъра",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Инфо за снимка",lockRatio:"Заключване на съотношението",menu:"Настройки за снимка",pathName:"image",pathNameCaption:"caption",resetSize:"Нулиране на размер",resizer:"Click and drag to resize",title:"Настройки за снимка",uploadTab:"Качване",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/bn.js b/bower_components/ckeditor/plugins/image2/lang/bn.js new file mode 100644 index 0000000..93618a0 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","bn",{alt:"বিকল্প টেক্সট",btnUpload:"ইহাকে সার্ভারে প্রেরন কর",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"ছবির তথ্য",lockRatio:"অনুপাত লক কর",menu:"ছবির প্রোপার্টি",pathName:"image",pathNameCaption:"caption",resetSize:"সাইজ পূর্বাবস্থায় ফিরিয়ে দাও",resizer:"Click and drag to resize",title:"ছবির প্রোপার্টি",uploadTab:"আপলোড",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/bs.js b/bower_components/ckeditor/plugins/image2/lang/bs.js new file mode 100644 index 0000000..ff4ae29 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","bs",{alt:"Tekst na slici",btnUpload:"Šalji na server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Info slike",lockRatio:"Zakljuèaj odnos",menu:"Svojstva slike",pathName:"image",pathNameCaption:"caption",resetSize:"Resetuj dimenzije",resizer:"Click and drag to resize",title:"Svojstva slike",uploadTab:"Šalji",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/ca.js b/bower_components/ckeditor/plugins/image2/lang/ca.js new file mode 100644 index 0000000..6e73ef3 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","ca",{alt:"Text alternatiu",btnUpload:"Envia-la al servidor",captioned:"Imatge amb subtítol",captionPlaceholder:"Títol",infoTab:"Informació de la imatge",lockRatio:"Bloqueja les proporcions",menu:"Propietats de la imatge",pathName:"imatge",pathNameCaption:"subtítol",resetSize:"Restaura la mida",resizer:"Clicar i arrossegar per redimensionar",title:"Propietats de la imatge",uploadTab:"Puja",urlMissing:"Falta la URL de la imatge."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/cs.js b/bower_components/ckeditor/plugins/image2/lang/cs.js new file mode 100644 index 0000000..d148641 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","cs",{alt:"Alternativní text",btnUpload:"Odeslat na server",captioned:"Obrázek s popisem",captionPlaceholder:"Popis",infoTab:"Informace o obrázku",lockRatio:"Zámek",menu:"Vlastnosti obrázku",pathName:"Obrázek",pathNameCaption:"Popis",resetSize:"Původní velikost",resizer:"Klepněte a táhněte pro změnu velikosti",title:"Vlastnosti obrázku",uploadTab:"Odeslat",urlMissing:"Zadané URL zdroje obrázku nebylo nalezeno."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/cy.js b/bower_components/ckeditor/plugins/image2/lang/cy.js new file mode 100644 index 0000000..031ba7e --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","cy",{alt:"Testun Amgen",btnUpload:"Anfon i'r Gweinydd",captioned:"Delwedd â phennawd",captionPlaceholder:"Caption",infoTab:"Gwyb Delwedd",lockRatio:"Cloi Cymhareb",menu:"Priodweddau Delwedd",pathName:"delwedd",pathNameCaption:"pennawd",resetSize:"Ailosod Maint",resizer:"Clicio a llusgo i ail-meintio",title:"Priodweddau Delwedd",uploadTab:"Lanlwytho",urlMissing:"URL gwreiddiol y ddelwedd ar goll."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/da.js b/bower_components/ckeditor/plugins/image2/lang/da.js new file mode 100644 index 0000000..655adb5 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","da",{alt:"Alternativ tekst",btnUpload:"Upload fil til serveren",captioned:"Tekstet billede",captionPlaceholder:"Tekst",infoTab:"Generelt",lockRatio:"Lås størrelsesforhold",menu:"Egenskaber for billede",pathName:"billede",pathNameCaption:"tekst",resetSize:"Nulstil størrelse",resizer:"Klik og træk for at ændre størrelsen",title:"Egenskaber for billede",uploadTab:"Upload",urlMissing:"Kilde på billed-URL mangler"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/de.js b/bower_components/ckeditor/plugins/image2/lang/de.js new file mode 100644 index 0000000..de90c18 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","de",{alt:"Alternativer Text",btnUpload:"Zum Server senden",captioned:"Bild mit Überschrift",captionPlaceholder:"Überschrift",infoTab:"Bild-Info",lockRatio:"Größenverhältnis beibehalten",menu:"Bild-Eigenschaften",pathName:"Bild",pathNameCaption:"Überschrift",resetSize:"Größe zurücksetzen",resizer:"Zum vergrößern anwählen und ziehen",title:"Bild-Eigenschaften",uploadTab:"Hochladen",urlMissing:"Imagequelle URL fehlt."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/el.js b/bower_components/ckeditor/plugins/image2/lang/el.js new file mode 100644 index 0000000..65307e3 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","el",{alt:"Εναλλακτικό Κείμενο",btnUpload:"Αποστολή στον Διακομιστή",captioned:"Εικόνα με λεζάντα",captionPlaceholder:"Λεζάντα",infoTab:"Πληροφορίες Εικόνας",lockRatio:"Κλείδωμα Αναλογίας",menu:"Ιδιότητες Εικόνας",pathName:"εικόνα",pathNameCaption:"λεζάντα",resetSize:"Επαναφορά Αρχικού Μεγέθους",resizer:"Κάνετε κλικ και σύρετε το ποντίκι για να αλλάξετε το μέγεθος",title:"Ιδιότητες Εικόνας",uploadTab:"Αποστολή",urlMissing:"Λείπει το πηγαίο URL της εικόνας."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/en-au.js b/bower_components/ckeditor/plugins/image2/lang/en-au.js new file mode 100644 index 0000000..caab219 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","en-au",{alt:"Alternative Text",btnUpload:"Send it to the Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Image Info",lockRatio:"Lock Ratio",menu:"Image Properties",pathName:"image",pathNameCaption:"caption",resetSize:"Reset Size",resizer:"Click and drag to resize",title:"Image Properties",uploadTab:"Upload",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/en-ca.js b/bower_components/ckeditor/plugins/image2/lang/en-ca.js new file mode 100644 index 0000000..ec19b8f --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","en-ca",{alt:"Alternative Text",btnUpload:"Send it to the Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Image Info",lockRatio:"Lock Ratio",menu:"Image Properties",pathName:"image",pathNameCaption:"caption",resetSize:"Reset Size",resizer:"Click and drag to resize",title:"Image Properties",uploadTab:"Upload",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/en-gb.js b/bower_components/ckeditor/plugins/image2/lang/en-gb.js new file mode 100644 index 0000000..d5a9406 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","en-gb",{alt:"Alternative Text",btnUpload:"Send it to the Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Image Info",lockRatio:"Lock Ratio",menu:"Image Properties",pathName:"image",pathNameCaption:"caption",resetSize:"Reset Size",resizer:"Click and drag to resize",title:"Image Properties",uploadTab:"Upload",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/en.js b/bower_components/ckeditor/plugins/image2/lang/en.js new file mode 100644 index 0000000..524e0a2 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","en",{alt:"Alternative Text",btnUpload:"Send it to the Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Image Info",lockRatio:"Lock Ratio",menu:"Image Properties",pathName:"image",pathNameCaption:"caption",resetSize:"Reset Size",resizer:"Click and drag to resize",title:"Image Properties",uploadTab:"Upload",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/eo.js b/bower_components/ckeditor/plugins/image2/lang/eo.js new file mode 100644 index 0000000..26587e0 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","eo",{alt:"Anstataŭiga Teksto",btnUpload:"Sendu al Servilo",captioned:"Bildo kun apudskribo",captionPlaceholder:"Apudskribo",infoTab:"Informoj pri Bildo",lockRatio:"Konservi Proporcion",menu:"Atributoj de Bildo",pathName:"bildo",pathNameCaption:"apudskribo",resetSize:"Origina Grando",resizer:"Kliki kaj treni por ŝanĝi la grandon",title:"Atributoj de Bildo",uploadTab:"Alŝuti",urlMissing:"La fontretadreso de la bildo mankas."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/es.js b/bower_components/ckeditor/plugins/image2/lang/es.js new file mode 100644 index 0000000..c68c916 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","es",{alt:"Texto Alternativo",btnUpload:"Enviar al Servidor",captioned:"Imagen subtitulada",captionPlaceholder:"Caption",infoTab:"Información de Imagen",lockRatio:"Proporcional",menu:"Propiedades de Imagen",pathName:"image",pathNameCaption:"subtítulo",resetSize:"Tamaño Original",resizer:"Dar clic y arrastrar para cambiar tamaño",title:"Propiedades de Imagen",uploadTab:"Cargar",urlMissing:"Debe indicar la URL de la imagen."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/et.js b/bower_components/ckeditor/plugins/image2/lang/et.js new file mode 100644 index 0000000..b8571db --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","et",{alt:"Alternatiivne tekst",btnUpload:"Saada serverisse",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Pildi info",lockRatio:"Lukusta kuvasuhe",menu:"Pildi omadused",pathName:"image",pathNameCaption:"caption",resetSize:"Lähtesta suurus",resizer:"Click and drag to resize",title:"Pildi omadused",uploadTab:"Lae üles",urlMissing:"Pildi lähte-URL on puudu."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/eu.js b/bower_components/ckeditor/plugins/image2/lang/eu.js new file mode 100644 index 0000000..dadf5a3 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","eu",{alt:"Ordezko Testua",btnUpload:"Zerbitzarira bidalia",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Irudi informazioa",lockRatio:"Erlazioa Blokeatu",menu:"Irudi Ezaugarriak",pathName:"image",pathNameCaption:"caption",resetSize:"Tamaina Berrezarri",resizer:"Click and drag to resize",title:"Irudi Ezaugarriak",uploadTab:"Gora kargatu",urlMissing:"Irudiaren iturburu URL-a falta da."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/fa.js b/bower_components/ckeditor/plugins/image2/lang/fa.js new file mode 100644 index 0000000..6600e16 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","fa",{alt:"متن جایگزین",btnUpload:"به سرور بفرست",captioned:"تصویر زیرنویس شده",captionPlaceholder:"عنوان",infoTab:"اطلاعات تصویر",lockRatio:"قفل کردن نسبت",menu:"ویژگی​های تصویر",pathName:"تصویر",pathNameCaption:"عنوان",resetSize:"بازنشانی اندازه",resizer:"کلیک و کشیدن برای تغییر اندازه",title:"ویژگی​های تصویر",uploadTab:"بالاگذاری",urlMissing:"آدرس URL اصلی تصویر یافت نشد."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/fi.js b/bower_components/ckeditor/plugins/image2/lang/fi.js new file mode 100644 index 0000000..e4a104e --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","fi",{alt:"Vaihtoehtoinen teksti",btnUpload:"Lähetä palvelimelle",captioned:"Kuva kuvatekstillä",captionPlaceholder:"Kuvateksti",infoTab:"Kuvan tiedot",lockRatio:"Lukitse suhteet",menu:"Kuvan ominaisuudet",pathName:"kuva",pathNameCaption:"kuvateksti",resetSize:"Alkuperäinen koko",resizer:"Klikkaa ja raahaa muuttaaksesi kokoa",title:"Kuvan ominaisuudet",uploadTab:"Lisää tiedosto",urlMissing:"Kuvan lähdeosoite puuttuu."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/fo.js b/bower_components/ckeditor/plugins/image2/lang/fo.js new file mode 100644 index 0000000..a2bbfae --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","fo",{alt:"Alternativur tekstur",btnUpload:"Send til ambætaran",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Myndaupplýsingar",lockRatio:"Læs lutfallið",menu:"Myndaeginleikar",pathName:"image",pathNameCaption:"caption",resetSize:"Upprunastødd",resizer:"Click and drag to resize",title:"Myndaeginleikar",uploadTab:"Send til ambætaran",urlMissing:"URL til mynd manglar."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/fr-ca.js b/bower_components/ckeditor/plugins/image2/lang/fr-ca.js new file mode 100644 index 0000000..30cd9e9 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","fr-ca",{alt:"Texte alternatif",btnUpload:"Envoyer sur le serveur",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Informations sur l'image2",lockRatio:"Verrouiller les proportions",menu:"Propriétés de l'image2",pathName:"image",pathNameCaption:"caption",resetSize:"Taille originale",resizer:"Click and drag to resize",title:"Propriétés de l'image2",uploadTab:"Téléverser",urlMissing:"L'URL de la source de l'image est manquant."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/fr.js b/bower_components/ckeditor/plugins/image2/lang/fr.js new file mode 100644 index 0000000..2c7ed97 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","fr",{alt:"Texte de remplacement",btnUpload:"Envoyer sur le serveur",captioned:"Image légendée",captionPlaceholder:"Légende",infoTab:"Informations sur l'image2",lockRatio:"Conserver les proportions",menu:"Propriétés de l'image2",pathName:"image",pathNameCaption:"légende",resetSize:"Taille d'origine",resizer:"Cliquer et glisser pour redimensionner",title:"Propriétés de l'image2",uploadTab:"Envoyer",urlMissing:"L'adresse source de l'image est manquante."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/gl.js b/bower_components/ckeditor/plugins/image2/lang/gl.js new file mode 100644 index 0000000..f030c9e --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","gl",{alt:"Texto alternativo",btnUpload:"Enviar ao servidor",captioned:"Imaxe subtitulada ",captionPlaceholder:"Caption",infoTab:"Información da imaxe",lockRatio:"Proporcional",menu:"Propiedades da imaxe",pathName:"Imaxe",pathNameCaption:"subtítulo",resetSize:"Tamaño orixinal",resizer:"Prema e arrastre para axustar o tamaño",title:"Propiedades da imaxe",uploadTab:"Cargar",urlMissing:"Non se atopa o URL da imaxe."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/gu.js b/bower_components/ckeditor/plugins/image2/lang/gu.js new file mode 100644 index 0000000..4e83249 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","gu",{alt:"ઑલ્ટર્નટ ટેક્સ્ટ",btnUpload:"આ સર્વરને મોકલવું",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"ચિત્ર ની જાણકારી",lockRatio:"લૉક ગુણોત્તર",menu:"ચિત્રના ગુણ",pathName:"image",pathNameCaption:"caption",resetSize:"રીસેટ સાઇઝ",resizer:"Click and drag to resize",title:"ચિત્રના ગુણ",uploadTab:"અપલોડ",urlMissing:"ઈમેજની મૂળ URL છે નહી."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/he.js b/bower_components/ckeditor/plugins/image2/lang/he.js new file mode 100644 index 0000000..4787142 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","he",{alt:"טקסט חלופי",btnUpload:"שליחה לשרת",captioned:"כותרת תמונה",captionPlaceholder:"Caption",infoTab:"מידע על התמונה",lockRatio:"נעילת היחס",menu:"תכונות התמונה",pathName:"תמונה",pathNameCaption:"כותרת",resetSize:"איפוס הגודל",resizer:"לחץ וגרור לשינוי הגודל",title:"מאפייני התמונה",uploadTab:"העלאה",urlMissing:"כתובת התמונה חסרה."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/hi.js b/bower_components/ckeditor/plugins/image2/lang/hi.js new file mode 100644 index 0000000..ec9225d --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","hi",{alt:"वैकल्पिक टेक्स्ट",btnUpload:"इसे सर्वर को भेजें",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"तस्वीर की जानकारी",lockRatio:"लॉक अनुपात",menu:"तस्वीर प्रॉपर्टीज़",pathName:"image",pathNameCaption:"caption",resetSize:"रीसॅट साइज़",resizer:"Click and drag to resize",title:"तस्वीर प्रॉपर्टीज़",uploadTab:"अपलोड",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/hr.js b/bower_components/ckeditor/plugins/image2/lang/hr.js new file mode 100644 index 0000000..812813c --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","hr",{alt:"Alternativni tekst",btnUpload:"Pošalji na server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Info slike",lockRatio:"Zaključaj odnos",menu:"Svojstva slika",pathName:"image",pathNameCaption:"caption",resetSize:"Obriši veličinu",resizer:"Click and drag to resize",title:"Svojstva slika",uploadTab:"Pošalji",urlMissing:"Nedostaje URL slike."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/hu.js b/bower_components/ckeditor/plugins/image2/lang/hu.js new file mode 100644 index 0000000..bffa8b8 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","hu",{alt:"Buborék szöveg",btnUpload:"Küldés a szerverre",captioned:"Feliratozott kép",captionPlaceholder:"Képfelirat",infoTab:"Alaptulajdonságok",lockRatio:"Arány megtartása",menu:"Kép tulajdonságai",pathName:"kép",pathNameCaption:"felirat",resetSize:"Eredeti méret",resizer:"Kattints és húzz az átméretezéshez",title:"Kép tulajdonságai",uploadTab:"Feltöltés",urlMissing:"Hiányzik a kép URL-je"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/id.js b/bower_components/ckeditor/plugins/image2/lang/id.js new file mode 100644 index 0000000..a238cab --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","id",{alt:"Teks alternatif",btnUpload:"Kirim ke Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Info Gambar",lockRatio:"Lock Ratio",menu:"Image Properties",pathName:"image",pathNameCaption:"caption",resetSize:"Reset Size",resizer:"Click and drag to resize",title:"Image Properties",uploadTab:"Unggah",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/is.js b/bower_components/ckeditor/plugins/image2/lang/is.js new file mode 100644 index 0000000..196c68d --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","is",{alt:"Baklægur texti",btnUpload:"Hlaða upp",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Almennt",lockRatio:"Festa stærðarhlutfall",menu:"Eigindi myndar",pathName:"image",pathNameCaption:"caption",resetSize:"Reikna stærð",resizer:"Click and drag to resize",title:"Eigindi myndar",uploadTab:"Senda upp",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/it.js b/bower_components/ckeditor/plugins/image2/lang/it.js new file mode 100644 index 0000000..d65b454 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","it",{alt:"Testo alternativo",btnUpload:"Invia al server",captioned:"Immagine con didascalia",captionPlaceholder:"Didascalia",infoTab:"Informazioni immagine",lockRatio:"Blocca rapporto",menu:"Proprietà immagine",pathName:"immagine",pathNameCaption:"didascalia",resetSize:"Reimposta dimensione",resizer:"Fare clic e trascinare per ridimensionare",title:"Proprietà immagine",uploadTab:"Carica",urlMissing:"Manca l'URL dell'immagine."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/ja.js b/bower_components/ckeditor/plugins/image2/lang/ja.js new file mode 100644 index 0000000..b4457fd --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","ja",{alt:"代替テキスト",btnUpload:"サーバーに送信",captioned:"キャプションを付ける",captionPlaceholder:"キャプション",infoTab:"画像情報",lockRatio:"比率を固定",menu:"画像のプロパティ",pathName:"image",pathNameCaption:"caption",resetSize:"サイズをリセット",resizer:"ドラッグしてリサイズ",title:"画像のプロパティ",uploadTab:"アップロード",urlMissing:"画像のURLを入力してください。"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/ka.js b/bower_components/ckeditor/plugins/image2/lang/ka.js new file mode 100644 index 0000000..8840728 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","ka",{alt:"სანაცვლო ტექსტი",btnUpload:"სერვერისთვის გაგზავნა",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"სურათის ინფორმცია",lockRatio:"პროპორციის შენარჩუნება",menu:"სურათის პარამეტრები",pathName:"image",pathNameCaption:"caption",resetSize:"ზომის დაბრუნება",resizer:"Click and drag to resize",title:"სურათის პარამეტრები",uploadTab:"აქაჩვა",urlMissing:"სურათის URL არაა შევსებული."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/km.js b/bower_components/ckeditor/plugins/image2/lang/km.js new file mode 100644 index 0000000..993429c --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","km",{alt:"អត្ថបទជំនួស",btnUpload:"បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្តល់សេវា",captioned:"រូប​ដែល​មាន​ចំណង​ជើង",captionPlaceholder:"Caption",infoTab:"ពត៌មានអំពីរូបភាព",lockRatio:"ចាក់​សោ​ផល​ធៀប",menu:"លក្ខណៈ​សម្បត្តិ​រូប​ភាព",pathName:"រូបភាព",pathNameCaption:"ចំណងជើង",resetSize:"កំណត់ទំហំឡើងវិញ",resizer:"ចុច​ហើយ​ទាញ​ដើម្បី​ប្ដូរ​ទំហំ",title:"លក្ខណៈ​សម្បត្តិ​រូប​ភាប",uploadTab:"ផ្ទុក​ឡើង",urlMissing:"ខ្វះ URL ប្រភព​រូប​ភាព។"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/ko.js b/bower_components/ckeditor/plugins/image2/lang/ko.js new file mode 100644 index 0000000..90726a2 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","ko",{alt:"이미지 설명",btnUpload:"서버로 전송",captioned:"이미지 설명 넣기",captionPlaceholder:"Caption",infoTab:"이미지 정보",lockRatio:"비율 유지",menu:"이미지 설정",pathName:"이미지",pathNameCaption:"이미지 설명",resetSize:"원래 크기로",resizer:"크기를 조절하려면 클릭 후 드래그 하세요",title:"이미지 설정",uploadTab:"업로드",urlMissing:"이미지 소스 URL이 없습니다."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/ku.js b/bower_components/ckeditor/plugins/image2/lang/ku.js new file mode 100644 index 0000000..fed115e --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","ku",{alt:"جێگرەوەی دەق",btnUpload:"ناردنی بۆ ڕاژه",captioned:"وێنەی بەسەردێر",captionPlaceholder:"سەردێر",infoTab:"زانیاری وێنه",lockRatio:"داخستنی ڕێژه",menu:"خاسیەتی وێنه",pathName:"وێنە",pathNameCaption:"سەردێر",resetSize:"ڕێکخستنەوەی قەباره",resizer:"کرتەبکە و ڕایبکێشە بۆ قەبارە گۆڕین",title:"خاسیەتی وێنه",uploadTab:"بارکردن",urlMissing:"سەرچاوەی بەستەری وێنه بزره"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/lt.js b/bower_components/ckeditor/plugins/image2/lang/lt.js new file mode 100644 index 0000000..47b883d --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","lt",{alt:"Alternatyvus Tekstas",btnUpload:"Siųsti į serverį",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Vaizdo informacija",lockRatio:"Išlaikyti proporciją",menu:"Vaizdo savybės",pathName:"image",pathNameCaption:"caption",resetSize:"Atstatyti dydį",resizer:"Click and drag to resize",title:"Vaizdo savybės",uploadTab:"Siųsti",urlMissing:"Paveiksliuko nuorodos nėra."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/lv.js b/bower_components/ckeditor/plugins/image2/lang/lv.js new file mode 100644 index 0000000..069595d --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","lv",{alt:"Alternatīvais teksts",btnUpload:"Nosūtīt serverim",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Informācija par attēlu",lockRatio:"Nemainīga Augstuma/Platuma attiecība",menu:"Attēla īpašības",pathName:"image",pathNameCaption:"caption",resetSize:"Atjaunot sākotnējo izmēru",resizer:"Click and drag to resize",title:"Attēla īpašības",uploadTab:"Augšupielādēt",urlMissing:"Trūkst attēla atrašanās adrese."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/mk.js b/bower_components/ckeditor/plugins/image2/lang/mk.js new file mode 100644 index 0000000..0d5b35e --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","mk",{alt:"Alternative Text",btnUpload:"Send it to the Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Image Info",lockRatio:"Lock Ratio",menu:"Image Properties",pathName:"image",pathNameCaption:"caption",resetSize:"Reset Size",resizer:"Click and drag to resize",title:"Image Properties",uploadTab:"Upload",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/mn.js b/bower_components/ckeditor/plugins/image2/lang/mn.js new file mode 100644 index 0000000..f2d437f --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","mn",{alt:"Зургийг орлох бичвэр",btnUpload:"Үүнийг сервэррүү илгээ",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Зурагны мэдээлэл",lockRatio:"Радио түгжих",menu:"Зураг",pathName:"image",pathNameCaption:"caption",resetSize:"хэмжээ дахин оноох",resizer:"Click and drag to resize",title:"Зураг",uploadTab:"Илгээж ачаалах",urlMissing:"Зургийн эх сурвалжийн хаяг (URL) байхгүй байна."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/ms.js b/bower_components/ckeditor/plugins/image2/lang/ms.js new file mode 100644 index 0000000..8d1d665 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","ms",{alt:"Text Alternatif",btnUpload:"Hantar ke Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Info Imej",lockRatio:"Tetapkan Nisbah",menu:"Ciri-ciri Imej",pathName:"image",pathNameCaption:"caption",resetSize:"Saiz Set Semula",resizer:"Click and drag to resize",title:"Ciri-ciri Imej",uploadTab:"Muat Naik",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/nb.js b/bower_components/ckeditor/plugins/image2/lang/nb.js new file mode 100644 index 0000000..2f237a6 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","nb",{alt:"Alternativ tekst",btnUpload:"Send det til serveren",captioned:"Bilde med bildetekst",captionPlaceholder:"Bildetekst",infoTab:"Bildeinformasjon",lockRatio:"Lås forhold",menu:"Bildeegenskaper",pathName:"bilde",pathNameCaption:"bildetekst",resetSize:"Tilbakestill størrelse",resizer:"Klikk og dra for å endre størrelse",title:"Bildeegenskaper",uploadTab:"Last opp",urlMissing:"Bildets adresse mangler."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/nl.js b/bower_components/ckeditor/plugins/image2/lang/nl.js new file mode 100644 index 0000000..f032d84 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","nl",{alt:"Alternatieve tekst",btnUpload:"Naar server verzenden",captioned:"Afbeelding met onderschrift",captionPlaceholder:"Onderschrift",infoTab:"Afbeeldingsinformatie",lockRatio:"Verhouding vergrendelen",menu:"Eigenschappen afbeelding",pathName:"afbeelding",pathNameCaption:"onderschrift",resetSize:"Afmetingen herstellen",resizer:"Klik en sleep om te herschalen",title:"Afbeeldingseigenschappen",uploadTab:"Uploaden",urlMissing:"De URL naar de afbeelding ontbreekt."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/no.js b/bower_components/ckeditor/plugins/image2/lang/no.js new file mode 100644 index 0000000..11bffbb --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","no",{alt:"Alternativ tekst",btnUpload:"Send det til serveren",captioned:"Bilde med bildetekst",captionPlaceholder:"Caption",infoTab:"Bildeinformasjon",lockRatio:"Lås forhold",menu:"Bildeegenskaper",pathName:"bilde",pathNameCaption:"bildetekst",resetSize:"Tilbakestill størrelse",resizer:"Klikk og dra for å endre størrelse",title:"Bildeegenskaper",uploadTab:"Last opp",urlMissing:"Bildets adresse mangler."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/pl.js b/bower_components/ckeditor/plugins/image2/lang/pl.js new file mode 100644 index 0000000..09e19e3 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","pl",{alt:"Tekst zastępczy",btnUpload:"Wyślij",captioned:"Obrazek z podpisem",captionPlaceholder:"Podpis",infoTab:"Informacje o obrazku",lockRatio:"Zablokuj proporcje",menu:"Właściwości obrazka",pathName:"obrazek",pathNameCaption:"podpis",resetSize:"Przywróć rozmiar",resizer:"Kliknij i przeciągnij, by zmienić rozmiar.",title:"Właściwości obrazka",uploadTab:"Wyślij",urlMissing:"Podaj adres URL obrazka."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/pt-br.js b/bower_components/ckeditor/plugins/image2/lang/pt-br.js new file mode 100644 index 0000000..82c42e8 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","pt-br",{alt:"Texto Alternativo",btnUpload:"Enviar para o Servidor",captioned:"Legenda da Imagem",captionPlaceholder:"Legenda",infoTab:"Informações da Imagem",lockRatio:"Travar Proporções",menu:"Formatar Imagem",pathName:"Imagem",pathNameCaption:"Legenda",resetSize:"Redefinir para o Tamanho Original",resizer:"Click e arraste para redimensionar",title:"Formatar Imagem",uploadTab:"Enviar ao Servidor",urlMissing:"URL da imagem está faltando."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/pt.js b/bower_components/ckeditor/plugins/image2/lang/pt.js new file mode 100644 index 0000000..99b56c7 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","pt",{alt:"Texto Alternativo",btnUpload:"Enviar para o Servidor",captioned:"Imagem legendada",captionPlaceholder:"Legenda",infoTab:"Informação da Imagem",lockRatio:"Proporcional",menu:"Propriedades da Imagem",pathName:"imagem",pathNameCaption:"legenda",resetSize:"Tamanho Original",resizer:"Clique e arraste para redimensionar",title:"Propriedades da Imagem",uploadTab:"Enviar",urlMissing:"O URL da fonte da imagem está em falta."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/ro.js b/bower_components/ckeditor/plugins/image2/lang/ro.js new file mode 100644 index 0000000..8f86089 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","ro",{alt:"Text alternativ",btnUpload:"Trimite la server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Informaţii despre imagine",lockRatio:"Păstrează proporţiile",menu:"Proprietăţile imaginii",pathName:"image",pathNameCaption:"caption",resetSize:"Resetează mărimea",resizer:"Click and drag to resize",title:"Proprietăţile imaginii",uploadTab:"Încarcă",urlMissing:"Sursa URL a imaginii lipsește."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/ru.js b/bower_components/ckeditor/plugins/image2/lang/ru.js new file mode 100644 index 0000000..52de968 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","ru",{alt:"Альтернативный текст",btnUpload:"Загрузить на сервер",captioned:"Отображать название",captionPlaceholder:"Название",infoTab:"Данные об изображении",lockRatio:"Сохранять пропорции",menu:"Свойства изображения",pathName:"изображение",pathNameCaption:"название",resetSize:"Вернуть обычные размеры",resizer:"Нажмите и растяните",title:"Свойства изображения",uploadTab:"Загрузка файла",urlMissing:"Не указана ссылка на изображение."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/si.js b/bower_components/ckeditor/plugins/image2/lang/si.js new file mode 100644 index 0000000..5ab518c --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","si",{alt:"විකල්ප ",btnUpload:"සේවාදායකය වෙත යොමුකිරිම",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"රුපයේ තොරතුරු",lockRatio:"නවතන අනුපාතය ",menu:"රුපයේ ගුණ",pathName:"image",pathNameCaption:"caption",resetSize:"නැවතත් විශාලත්වය වෙනස් කිරීම",resizer:"Click and drag to resize",title:"රුපයේ ",uploadTab:"උඩුගතකිරීම",urlMissing:"රුප මුලාශ්‍ර URL නැත."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/sk.js b/bower_components/ckeditor/plugins/image2/lang/sk.js new file mode 100644 index 0000000..1877884 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","sk",{alt:"Alternatívny text",btnUpload:"Odoslať to na server",captioned:"Opísaný obrázok",captionPlaceholder:"Popis",infoTab:"Informácie o obrázku",lockRatio:"Pomer zámky",menu:"Vlastnosti obrázka",pathName:"obrázok",pathNameCaption:"popis",resetSize:"Pôvodná veľkosť",resizer:"Kliknite a potiahnite pre zmenu veľkosti",title:"Vlastnosti obrázka",uploadTab:"Nahrať",urlMissing:"Chýba URL zdroja obrázka."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/sl.js b/bower_components/ckeditor/plugins/image2/lang/sl.js new file mode 100644 index 0000000..aced917 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","sl",{alt:"Nadomestno besedilo",btnUpload:"Pošlji na strežnik",captioned:"Podnaslovljena slika",captionPlaceholder:"Napis",infoTab:"Podatki o sliki",lockRatio:"Zakleni razmerje",menu:"Lastnosti slike",pathName:"slika",pathNameCaption:"napis",resetSize:"Ponastavi velikost",resizer:"Kliknite in povlecite, da spremeniti velikost",title:"Lastnosti slike",uploadTab:"Naloži",urlMissing:"Manjka vir (URL) slike."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/sq.js b/bower_components/ckeditor/plugins/image2/lang/sq.js new file mode 100644 index 0000000..fc15d86 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","sq",{alt:"Tekst Alternativ",btnUpload:"Dërgo në server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Informacione mbi Fotografinë",lockRatio:"Mbyll Racionin",menu:"Karakteristikat e Fotografisë",pathName:"foto",pathNameCaption:"caption",resetSize:"Rikthe Madhësinë",resizer:"Click and drag to resize",title:"Karakteristikat e Fotografisë",uploadTab:"Ngarko",urlMissing:"Mungon URL e burimit të fotografisë."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/sr-latn.js b/bower_components/ckeditor/plugins/image2/lang/sr-latn.js new file mode 100644 index 0000000..287f026 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","sr-latn",{alt:"Alternativni tekst",btnUpload:"Pošalji na server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Info slike",lockRatio:"Zaključaj odnos",menu:"Osobine slika",pathName:"image",pathNameCaption:"caption",resetSize:"Resetuj veličinu",resizer:"Click and drag to resize",title:"Osobine slika",uploadTab:"Pošalji",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/sr.js b/bower_components/ckeditor/plugins/image2/lang/sr.js new file mode 100644 index 0000000..18857fb --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","sr",{alt:"Алтернативни текст",btnUpload:"Пошаљи на сервер",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Инфо слике",lockRatio:"Закључај однос",menu:"Особине слика",pathName:"image",pathNameCaption:"caption",resetSize:"Ресетуј величину",resizer:"Click and drag to resize",title:"Особине слика",uploadTab:"Пошаљи",urlMissing:"Недостаје УРЛ слике."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/sv.js b/bower_components/ckeditor/plugins/image2/lang/sv.js new file mode 100644 index 0000000..2c5ed3f --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","sv",{alt:"Alternativ text",btnUpload:"Skicka till server",captioned:"Rubricerad bild",captionPlaceholder:"Bildtext",infoTab:"Bildinformation",lockRatio:"Lås höjd/bredd förhållanden",menu:"Bildegenskaper",pathName:"bild",pathNameCaption:"rubrik",resetSize:"Återställ storlek",resizer:"Klicka och drag för att ändra storlek",title:"Bildegenskaper",uploadTab:"Ladda upp",urlMissing:"Bildkällans URL saknas."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/th.js b/bower_components/ckeditor/plugins/image2/lang/th.js new file mode 100644 index 0000000..636814d --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","th",{alt:"คำประกอบรูปภาพ",btnUpload:"อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"ข้อมูลของรูปภาพ",lockRatio:"กำหนดอัตราส่วน กว้าง-สูง แบบคงที่",menu:"คุณสมบัติของ รูปภาพ",pathName:"image",pathNameCaption:"caption",resetSize:"กำหนดรูปเท่าขนาดจริง",resizer:"Click and drag to resize",title:"คุณสมบัติของ รูปภาพ",uploadTab:"อัพโหลดไฟล์",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/tr.js b/bower_components/ckeditor/plugins/image2/lang/tr.js new file mode 100644 index 0000000..305d1b3 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","tr",{alt:"Alternatif Yazı",btnUpload:"Sunucuya Yolla",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Resim Bilgisi",lockRatio:"Oranı Kilitle",menu:"Resim Özellikleri",pathName:"Resim",pathNameCaption:"caption",resetSize:"Boyutu Başa Döndür",resizer:"Boyutlandırmak için, tıklayın ve sürükleyin",title:"Resim Özellikleri",uploadTab:"Karşıya Yükle",urlMissing:"Resmin URL kaynağı bulunamadı."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/tt.js b/bower_components/ckeditor/plugins/image2/lang/tt.js new file mode 100644 index 0000000..2133d73 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","tt",{alt:"Альтернатив текст",btnUpload:"Серверга җибәрү",captioned:"Исеме куелган рәсем",captionPlaceholder:"Исем",infoTab:"Рәсем тасвирламасы",lockRatio:"Lock Ratio",menu:"Рәсем үзлекләре",pathName:"рәсем",pathNameCaption:"исем",resetSize:"Баштагы зурлык",resizer:"Күчереп куер өчен басып шудырыгыз",title:"Рәсем үзлекләре",uploadTab:"Йөкләү",urlMissing:"Image source URL is missing."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/ug.js b/bower_components/ckeditor/plugins/image2/lang/ug.js new file mode 100644 index 0000000..7913ee9 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","ug",{alt:"تېكىست ئالماشتۇر",btnUpload:"مۇلازىمېتىرغا يۈكلە",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"سۈرەت",lockRatio:"نىسبەتنى قۇلۇپلا",menu:"سۈرەت خاسلىقى",pathName:"image",pathNameCaption:"caption",resetSize:"ئەسلى چوڭلۇق",resizer:"Click and drag to resize",title:"سۈرەت خاسلىقى",uploadTab:"يۈكلە",urlMissing:"سۈرەتنىڭ ئەسلى ھۆججەت ئادرېسى كەم"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/uk.js b/bower_components/ckeditor/plugins/image2/lang/uk.js new file mode 100644 index 0000000..989eb55 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","uk",{alt:"Альтернативний текст",btnUpload:"Надіслати на сервер",captioned:"Підписане зображення",captionPlaceholder:"Caption",infoTab:"Інформація про зображення",lockRatio:"Зберегти пропорції",menu:"Властивості зображення",pathName:"Зображення",pathNameCaption:"заголовок",resetSize:"Очистити поля розмірів",resizer:"Клікніть та потягніть для зміни розмірів",title:"Властивості зображення",uploadTab:"Надіслати",urlMissing:"Вкажіть URL зображення."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/vi.js b/bower_components/ckeditor/plugins/image2/lang/vi.js new file mode 100644 index 0000000..863c40d --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","vi",{alt:"Chú thích ảnh",btnUpload:"Tải lên máy chủ",captioned:"Ảnh có chú thích",captionPlaceholder:"Nhãn",infoTab:"Thông tin của ảnh",lockRatio:"Giữ nguyên tỷ lệ",menu:"Thuộc tính của ảnh",pathName:"ảnh",pathNameCaption:"chú thích",resetSize:"Kích thước gốc",resizer:"Kéo rê để thay đổi kích cỡ",title:"Thuộc tính của ảnh",uploadTab:"Tải lên",urlMissing:"Thiếu đường dẫn hình ảnh"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/zh-cn.js b/bower_components/ckeditor/plugins/image2/lang/zh-cn.js new file mode 100644 index 0000000..3209b92 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","zh-cn",{alt:"替换文本",btnUpload:"上传到服务器",captioned:"带标题图像",captionPlaceholder:"标题",infoTab:"图像信息",lockRatio:"锁定比例",menu:"图像属性",pathName:"图像",pathNameCaption:"标题",resetSize:"原始尺寸",resizer:"点击并拖拽以改变尺寸",title:"图像属性",uploadTab:"上传",urlMissing:"缺少图像源文件地址"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/lang/zh.js b/bower_components/ckeditor/plugins/image2/lang/zh.js new file mode 100644 index 0000000..f9489af --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("image2","zh",{alt:"替代文字",btnUpload:"傳送至伺服器",captioned:"已加標題之圖片",captionPlaceholder:"Caption",infoTab:"影像資訊",lockRatio:"固定比例",menu:"影像屬性",pathName:"圖片",pathNameCaption:"標題",resetSize:"重設大小",resizer:"拖曳以改變大小",title:"影像屬性",uploadTab:"上傳",urlMissing:"遺失圖片來源之 URL "}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/image2/plugin.js b/bower_components/ckeditor/plugins/image2/plugin.js new file mode 100644 index 0000000..ff7e383 --- /dev/null +++ b/bower_components/ckeditor/plugins/image2/plugin.js @@ -0,0 +1,30 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function A(a){function b(){this.deflated||(a.widgets.focused==this.widget&&(this.focused=!0),a.widgets.destroy(this.widget),this.deflated=!0)}function e(){var d=a.editable(),c=a.document;if(this.deflated)this.widget=a.widgets.initOn(this.element,"image",this.widget.data),this.widget.inline&&!(new CKEDITOR.dom.elementPath(this.widget.wrapper,d)).block&&(d=c.createElement(a.activeEnterMode==CKEDITOR.ENTER_P?"p":"div"),d.replace(this.widget.wrapper),this.widget.wrapper.move(d)),this.focused&& +(this.widget.focus(),delete this.focused),delete this.deflated;else{var b=this.widget,d=f,c=b.wrapper,e=b.data.align,b=b.data.hasCaption;if(d){for(var j=3;j--;)c.removeClass(d[j]);"center"==e?b&&c.addClass(d[1]):"none"!=e&&c.addClass(d[n[e]])}else"center"==e?(b?c.setStyle("text-align","center"):c.removeStyle("text-align"),c.removeStyle("float")):("none"==e?c.removeStyle("float"):c.setStyle("float",e),c.removeStyle("text-align"))}}var f=a.config.image2_alignClasses,g=a.config.image2_captionedClass; +return{allowedContent:B(a),requiredContent:"img[src,alt]",features:C(a),styleableElements:"img figure",contentTransformations:[["img[width]: sizeToAttribute"]],editables:{caption:{selector:"figcaption",allowedContent:"br em strong sub sup u s; a[!href]"}},parts:{image:"img",caption:"figcaption"},dialog:"image2",template:z,data:function(){var d=this.features;this.data.hasCaption&&!a.filter.checkFeature(d.caption)&&(this.data.hasCaption=!1);"none"!=this.data.align&&!a.filter.checkFeature(d.align)&& +(this.data.align="none");this.shiftState({widget:this,element:this.element,oldData:this.oldData,newData:this.data,deflate:b,inflate:e});this.data.link?this.parts.link||(this.parts.link=this.parts.image.getParent()):this.parts.link&&delete this.parts.link;this.parts.image.setAttributes({src:this.data.src,"data-cke-saved-src":this.data.src,alt:this.data.alt});if(this.oldData&&!this.oldData.hasCaption&&this.data.hasCaption)for(var c in this.data.classes)this.parts.image.removeClass(c);if(a.filter.checkFeature(d.dimension)){d= +this.data;d={width:d.width,height:d.height};c=this.parts.image;for(var f in d)d[f]?c.setAttribute(f,d[f]):c.removeAttribute(f)}this.oldData=CKEDITOR.tools.extend({},this.data)},init:function(){var b=CKEDITOR.plugins.image2,c=this.parts.image,e={hasCaption:!!this.parts.caption,src:c.getAttribute("src"),alt:c.getAttribute("alt")||"",width:c.getAttribute("width")||"",height:c.getAttribute("height")||"",lock:this.ready?b.checkHasNaturalRatio(c):!0},g=c.getAscendant("a");g&&this.wrapper.contains(g)&&(this.parts.link= +g);e.align||(f?(this.element.hasClass(f[0])?e.align="left":this.element.hasClass(f[2])&&(e.align="right"),e.align?this.element.removeClass(f[n[e.align]]):e.align="none"):(e.align=this.element.getStyle("float")||c.getStyle("float")||"none",this.element.removeStyle("float"),c.removeStyle("float")));if(a.plugins.link&&this.parts.link&&(e.link=CKEDITOR.plugins.link.parseLinkAttributes(a,this.parts.link),(c=e.link.advanced)&&c.advCSSClasses))c.advCSSClasses=CKEDITOR.tools.trim(c.advCSSClasses.replace(/cke_\S+/, +""));this.wrapper[(e.hasCaption?"remove":"add")+"Class"]("cke_image_nocaption");this.setData(e);a.filter.checkFeature(this.features.dimension)&&D(this);this.shiftState=b.stateShifter(this.editor);this.on("contextMenu",function(a){a.data.image=CKEDITOR.TRISTATE_OFF;if(this.parts.link||this.wrapper.getAscendant("a"))a.data.link=a.data.unlink=CKEDITOR.TRISTATE_OFF});this.on("dialog",function(a){a.data.widget=this},this)},addClass:function(a){k(this).addClass(a)},hasClass:function(a){return k(this).hasClass(a)}, +removeClass:function(a){k(this).removeClass(a)},getClasses:function(){var a=RegExp("^("+[].concat(g,f).join("|")+")$");return function(){var b=this.repository.parseElementClasses(k(this).getAttribute("class")),e;for(e in b)a.test(e)&&delete b[e];return b}}(),upcast:E(a),downcast:F(a)}}function E(a){var b=l(a),e=a.config.image2_captionedClass;return function(a,g){var d={width:1,height:1},c=a.name,h;if(!a.attributes["data-cke-realelement"]){if(b(a)){if("div"==c&&(h=a.getFirst("figure")))a.replaceWith(h), +a=h;g.align="center";h=a.getFirst("img")||a.getFirst("a").getFirst("img")}else"figure"==c&&a.hasClass(e)?h=a.getFirst("img")||a.getFirst("a").getFirst("img"):o(a)&&(h="a"==a.name?a.children[0]:a);if(h){for(var y in d)(c=h.attributes[y])&&c.match(G)&&delete h.attributes[y];return a}}}}function F(a){var b=a.config.image2_alignClasses;return function(a){var f="a"==a.name?a.getFirst():a,g=f.attributes,d=this.data.align;if(!this.inline){var c=a.getFirst("span");c&&c.replaceWith(c.getFirst({img:1,a:1}))}d&& +"none"!=d&&(c=CKEDITOR.tools.parseCssText(g.style||""),"center"==d&&"figure"==a.name?a=a.wrapWith(new CKEDITOR.htmlParser.element("div",b?{"class":b[1]}:{style:"text-align:center"})):d in{left:1,right:1}&&(b?f.addClass(b[n[d]]):c["float"]=d),!b&&!CKEDITOR.tools.isEmpty(c)&&(g.style=CKEDITOR.tools.writeCssText(c)));return a}}function l(a){var b=a.config.image2_captionedClass,e=a.config.image2_alignClasses,f={figure:1,a:1,img:1};return function(g){if(!(g.name in{div:1,p:1}))return!1;var d=g.children; +if(1!==d.length)return!1;d=d[0];if(!(d.name in f))return!1;if("p"==g.name){if(!o(d))return!1}else if("figure"==d.name){if(!d.hasClass(b))return!1}else if(a.enterMode==CKEDITOR.ENTER_P||!o(d))return!1;return(e?g.hasClass(e[1]):"center"==CKEDITOR.tools.parseCssText(g.attributes.style||"",!0)["text-align"])?!0:!1}}function o(a){return"img"==a.name?!0:"a"==a.name?1==a.children.length&&a.getFirst("img"):!1}function D(a){var b=a.editor,e=b.editable(),f=b.document,g=a.resizer=f.createElement("span");g.addClass("cke_image_resizer"); +g.setAttribute("title",b.lang.image2.resizer);g.append(new CKEDITOR.dom.text("​",f));if(a.inline)a.wrapper.append(g);else{var d=a.parts.link||a.parts.image,c=d.getParent(),h=f.createElement("span");h.addClass("cke_image_resizer_wrapper");h.append(d);h.append(g);a.element.append(h,!0);c.is("span")&&c.remove()}g.on("mousedown",function(c){function j(a,b,c){var d=CKEDITOR.document,j=[];f.equals(d)||j.push(d.on(a,b));j.push(f.on(a,b));if(c)for(a=j.length;a--;)c.push(j.pop())}function d(){p=k+w*t;q=Math.round(p/ +r)}function s(){q=n-m;p=Math.round(q*r)}var h=a.parts.image,w="right"==a.data.align?-1:1,i=c.data.$.screenX,H=c.data.$.screenY,k=h.$.clientWidth,n=h.$.clientHeight,r=k/n,l=[],o="cke_image_s"+(!~w?"w":"e"),x,p,q,v,t,m,u;b.fire("saveSnapshot");j("mousemove",function(a){x=a.data.$;t=x.screenX-i;m=H-x.screenY;u=Math.abs(t/m);1==w?0>=t?0>=m?d():u>=r?d():s():0>=m?u>=r?s():d():s():0>=t?0>=m?u>=r?s():d():s():0>=m?d():u>=r?d():s();15<=p&&15<=q?(h.setAttributes({width:p,height:q}),v=!0):v=!1},l);j("mouseup", +function(){for(var c;c=l.pop();)c.removeListener();e.removeClass(o);g.removeClass("cke_image_resizing");v&&(a.setData({width:p,height:q}),b.fire("saveSnapshot"));v=!1},l);e.addClass(o);g.addClass("cke_image_resizing")});a.on("data",function(){g["right"==a.data.align?"addClass":"removeClass"]("cke_image_resizer_left")})}function I(a){var b=[],e;return function(f){var g=a.getCommand("justify"+f);if(g){b.push(function(){g.refresh(a,a.elementPath())});if(f in{right:1,left:1,center:1})g.on("exec",function(d){var c= +i(a);if(c){c.setData("align",f);for(c=b.length;c--;)b[c]();d.cancel()}});g.on("refresh",function(b){var c=i(a),g={right:1,left:1,center:1};c&&(void 0===e&&(e=a.filter.checkFeature(a.widgets.registered.image.features.align)),e?this.setState(c.data.align==f?CKEDITOR.TRISTATE_ON:f in g?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED):this.setState(CKEDITOR.TRISTATE_DISABLED),b.cancel())})}}}function J(a){a.plugins.link&&(CKEDITOR.on("dialogDefinition",function(b){b=b.data;if("link"==b.name){var b=b.definition, +e=b.onShow,f=b.onOk;b.onShow=function(){var b=i(a);b&&(b.inline?!b.wrapper.getAscendant("a"):1)?this.setupContent(b.data.link||{}):e.apply(this,arguments)};b.onOk=function(){var b=i(a);if(b&&(b.inline?!b.wrapper.getAscendant("a"):1)){var d={};this.commitContent(d);b.setData("link",d)}else f.apply(this,arguments)}}}),a.getCommand("unlink").on("exec",function(b){var e=i(a);e&&e.parts.link&&(e.setData("link",null),this.refresh(a,a.elementPath()),b.cancel())}),a.getCommand("unlink").on("refresh",function(b){var e= +i(a);e&&(this.setState(e.data.link||e.wrapper.getAscendant("a")?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED),b.cancel())}))}function i(a){return(a=a.widgets.focused)&&"image"==a.name?a:null}function B(a){var b=a.config.image2_alignClasses,a={div:{match:l(a)},p:{match:l(a)},img:{attributes:"!src,alt,width,height"},figure:{classes:"!"+a.config.image2_captionedClass},figcaption:!0};b?(a.div.classes=b[1],a.p.classes=a.div.classes,a.img.classes=b[0]+","+b[2],a.figure.classes+=","+a.img.classes):(a.div.styles= +"text-align",a.p.styles="text-align",a.img.styles="float",a.figure.styles="float,display");return a}function C(a){a=a.config.image2_alignClasses;return{dimension:{requiredContent:"img[width,height]"},align:{requiredContent:"img"+(a?"("+a[0]+")":"{float}")},caption:{requiredContent:"figcaption"}}}function k(a){return a.data.hasCaption?a.element:a.parts.image}var z='<img alt="" src="" />',K=new CKEDITOR.template('<figure class="{captionedClass}">'+z+"<figcaption>{captionPlaceholder}</figcaption></figure>"), +n={left:0,center:1,right:2},G=/^\s*(\d+\%)\s*$/i;CKEDITOR.plugins.add("image2",{lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",requires:"widget,dialog",icons:"image",hidpi:!0,onLoad:function(){CKEDITOR.addCss(".cke_image_nocaption{line-height:0}.cke_editable.cke_image_sw, .cke_editable.cke_image_sw *{cursor:sw-resize !important}.cke_editable.cke_image_se, .cke_editable.cke_image_se *{cursor:se-resize !important}.cke_image_resizer{display:none;position:absolute;width:10px;height:10px;bottom:-5px;right:-5px;background:#000;outline:1px solid #fff;line-height:0;cursor:se-resize;}.cke_image_resizer_wrapper{position:relative;display:inline-block;line-height:0;}.cke_image_resizer.cke_image_resizer_left{right:auto;left:-5px;cursor:sw-resize;}.cke_widget_wrapper:hover .cke_image_resizer,.cke_image_resizer.cke_image_resizing{display:block}.cke_widget_wrapper>a{display:inline-block}")}, +init:function(a){var b=a.config,e=a.lang.image2,f=A(a);b.filebrowserImage2BrowseUrl=b.filebrowserImageBrowseUrl;b.filebrowserImage2UploadUrl=b.filebrowserImageUploadUrl;f.pathName=e.pathName;f.editables.caption.pathName=e.pathNameCaption;a.widgets.add("image",f);a.ui.addButton&&a.ui.addButton("Image",{label:a.lang.common.image,command:"image",toolbar:"insert,10"});a.contextMenu&&(a.addMenuGroup("image",10),a.addMenuItem("image",{label:e.menu,command:"image",group:"image"}));CKEDITOR.dialog.add("image2", +this.path+"dialogs/image2.js")},afterInit:function(a){var b={left:1,right:1,center:1,block:1},e=I(a),f;for(f in b)e(f);J(a)}});CKEDITOR.plugins.image2={stateShifter:function(a){function b(a,b){var c={};g?c.attributes={"class":g[1]}:c.styles={"text-align":"center"};c=f.createElement(a.activeEnterMode==CKEDITOR.ENTER_P?"p":"div",c);e(c,b);b.move(c);return c}function e(b,d){if(d.getParent()){var e=a.createRange();e.moveToPosition(d,CKEDITOR.POSITION_BEFORE_START);d.remove();c.insertElementIntoRange(b, +e)}else b.replace(d)}var f=a.document,g=a.config.image2_alignClasses,d=a.config.image2_captionedClass,c=a.editable(),h=["hasCaption","align","link"],i={align:function(c,d,e){var f=c.element;if(c.changed.align){if(!c.newData.hasCaption&&("center"==e&&(c.deflate(),c.element=b(a,f)),!c.changed.hasCaption&&"center"==d&&"center"!=e))c.deflate(),d=f.findOne("a,img"),d.replace(f),c.element=d}else"center"==e&&(c.changed.hasCaption&&!c.newData.hasCaption)&&(c.deflate(),c.element=b(a,f));!g&&f.is("figure")&& +("center"==e?f.setStyle("display","inline-block"):f.removeStyle("display"))},hasCaption:function(b,c,g){b.changed.hasCaption&&(c=b.element.is({img:1,a:1})?b.element:b.element.findOne("a,img"),b.deflate(),g?(g=CKEDITOR.dom.element.createFromHtml(K.output({captionedClass:d,captionPlaceholder:a.lang.image2.captionPlaceholder}),f),e(g,b.element),c.replace(g.findOne("img")),b.element=g):(c.replace(b.element),b.element=c))},link:function(b,c,d){if(b.changed.link){var e=b.element.is("img")?b.element:b.element.findOne("img"), +g=b.element.is("a")?b.element:b.element.findOne("a"),h=b.element.is("a")&&!d||b.element.is("img")&&d,i;h&&b.deflate();d?(c||(i=f.createElement("a",{attributes:{href:b.newData.link.url}}),i.replace(e),e.move(i)),d=CKEDITOR.plugins.link.getLinkAttributes(a,d),CKEDITOR.tools.isEmpty(d.set)||(i||g).setAttributes(d.set),d.removed.length&&(i||g).removeAttributes(d.removed)):(d=g.findOne("img"),d.replace(g),i=d);h&&(b.element=i)}}};return function(a){var b,c;a.changed={};for(c=0;c<h.length;c++)b=h[c],a.changed[b]= +a.oldData?a.oldData[b]!==a.newData[b]:!1;for(c=0;c<h.length;c++)b=h[c],i[b](a,a.oldData?a.oldData[b]:null,a.newData[b]);a.inflate()}},checkHasNaturalRatio:function(a){var b=a.$,a=this.getNatural(a);return Math.round(b.clientWidth/a.width*a.height)==b.clientHeight||Math.round(b.clientHeight/a.height*a.width)==b.clientWidth},getNatural:function(a){if(a.$.naturalWidth)a={width:a.$.naturalWidth,height:a.$.naturalHeight};else{var b=new Image;b.src=a.getAttribute("src");a={width:b.width,height:b.height}}return a}}})(); +CKEDITOR.config.image2_captionedClass="image"; \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/indentblock/plugin.js b/bower_components/ckeditor/plugins/indentblock/plugin.js new file mode 100644 index 0000000..9976e04 --- /dev/null +++ b/bower_components/ckeditor/plugins/indentblock/plugin.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function f(b,d,a){if(!b.getCustomData("indent_processed")){var e=this.editor,j=this.isIndent;if(d){e=b.$.className.match(this.classNameRegex);a=0;e&&(e=e[1],a=CKEDITOR.tools.indexOf(d,e)+1);if(0>(a+=j?1:-1))return;a=Math.min(a,d.length);a=Math.max(a,0);b.$.className=CKEDITOR.tools.ltrim(b.$.className.replace(this.classNameRegex,""));0<a&&b.addClass(d[a-1])}else{var d=k(b,a),a=parseInt(b.getStyle(d),10),g=e.config.indentOffset||40;isNaN(a)&&(a=0);a+=(j?1:-1)*g;if(0>a)return;a=Math.max(a, +0);a=Math.ceil(a/g)*g;b.setStyle(d,a?a+(e.config.indentUnit||"px"):"");""===b.getAttribute("style")&&b.removeAttribute("style")}CKEDITOR.dom.element.setMarker(this.database,b,"indent_processed",1)}}function k(b,d){return"ltr"==(d||b.getComputedStyle("direction"))?"margin-left":"margin-right"}var h=CKEDITOR.dtd.$listItem,m=CKEDITOR.dtd.$list,i=CKEDITOR.TRISTATE_DISABLED,l=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add("indentblock",{requires:"indent",init:function(b){function d(){a.specificDefinition.apply(this, +arguments);this.allowedContent={"div h1 h2 h3 h4 h5 h6 ol p pre ul":{propertiesOnly:!0,styles:!e?"margin-left,margin-right":null,classes:e||null}};this.enterBr&&(this.allowedContent.div=!0);this.requiredContent=(this.enterBr?"div":"p")+(e?"("+e.join(",")+")":"{margin-left}");this.jobs={20:{refresh:function(a,b){var c=b.block||b.blockLimit;c.is(h)||(c=c.getAscendant(h)||c);c.is(h)&&(c=c.getParent());if(!this.enterBr&&!this.getContext(b))return i;if(e){var d;d=e;var c=c.$.className.match(this.classNameRegex), +f=this.isIndent;d=c?f?c[1]!=d.slice(-1):true:f;return d?l:i}return this.isIndent?l:c?CKEDITOR[(parseInt(c.getStyle(k(c)),10)||0)<=0?"TRISTATE_DISABLED":"TRISTATE_OFF"]:i},exec:function(a){var b=a.getSelection(),b=b&&b.getRanges()[0],c;if(c=a.elementPath().contains(m))f.call(this,c,e);else{b=b.createIterator();a=a.config.enterMode;b.enforceRealBlocks=true;for(b.enlargeBr=a!=CKEDITOR.ENTER_BR;c=b.getNextParagraph(a==CKEDITOR.ENTER_P?"p":"div");)c.isReadOnly()||f.call(this,c,e)}return true}}}}var a= +CKEDITOR.plugins.indent,e=b.config.indentClasses;a.registerCommands(b,{indentblock:new d(b,"indentblock",!0),outdentblock:new d(b,"outdentblock")});CKEDITOR.tools.extend(d.prototype,a.specificDefinition.prototype,{context:{div:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ul:1,ol:1,p:1,pre:1,table:1},classNameRegex:e?RegExp("(?:^|\\s+)("+e.join("|")+")(?=$|\\s)"):null})}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/icons/hidpi/justifyblock.png b/bower_components/ckeditor/plugins/justify/icons/hidpi/justifyblock.png new file mode 100644 index 0000000..7209fd4 Binary files /dev/null and b/bower_components/ckeditor/plugins/justify/icons/hidpi/justifyblock.png differ diff --git a/bower_components/ckeditor/plugins/justify/icons/hidpi/justifycenter.png b/bower_components/ckeditor/plugins/justify/icons/hidpi/justifycenter.png new file mode 100644 index 0000000..365e320 Binary files /dev/null and b/bower_components/ckeditor/plugins/justify/icons/hidpi/justifycenter.png differ diff --git a/bower_components/ckeditor/plugins/justify/icons/hidpi/justifyleft.png b/bower_components/ckeditor/plugins/justify/icons/hidpi/justifyleft.png new file mode 100644 index 0000000..75308c1 Binary files /dev/null and b/bower_components/ckeditor/plugins/justify/icons/hidpi/justifyleft.png differ diff --git a/bower_components/ckeditor/plugins/justify/icons/hidpi/justifyright.png b/bower_components/ckeditor/plugins/justify/icons/hidpi/justifyright.png new file mode 100644 index 0000000..de7c3d4 Binary files /dev/null and b/bower_components/ckeditor/plugins/justify/icons/hidpi/justifyright.png differ diff --git a/bower_components/ckeditor/plugins/justify/icons/justifyblock.png b/bower_components/ckeditor/plugins/justify/icons/justifyblock.png new file mode 100644 index 0000000..a507be1 Binary files /dev/null and b/bower_components/ckeditor/plugins/justify/icons/justifyblock.png differ diff --git a/bower_components/ckeditor/plugins/justify/icons/justifycenter.png b/bower_components/ckeditor/plugins/justify/icons/justifycenter.png new file mode 100644 index 0000000..f758bc4 Binary files /dev/null and b/bower_components/ckeditor/plugins/justify/icons/justifycenter.png differ diff --git a/bower_components/ckeditor/plugins/justify/icons/justifyleft.png b/bower_components/ckeditor/plugins/justify/icons/justifyleft.png new file mode 100644 index 0000000..542ddee Binary files /dev/null and b/bower_components/ckeditor/plugins/justify/icons/justifyleft.png differ diff --git a/bower_components/ckeditor/plugins/justify/icons/justifyright.png b/bower_components/ckeditor/plugins/justify/icons/justifyright.png new file mode 100644 index 0000000..71a983c Binary files /dev/null and b/bower_components/ckeditor/plugins/justify/icons/justifyright.png differ diff --git a/bower_components/ckeditor/plugins/justify/lang/af.js b/bower_components/ckeditor/plugins/justify/lang/af.js new file mode 100644 index 0000000..b3bd6ae --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","af",{block:"Uitvul",center:"Sentreer",left:"Links oplyn",right:"Regs oplyn"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/ar.js b/bower_components/ckeditor/plugins/justify/lang/ar.js new file mode 100644 index 0000000..39f7a34 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","ar",{block:"ضبط",center:"توسيط",left:"محاذاة إلى اليسار",right:"محاذاة إلى اليمين"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/bg.js b/bower_components/ckeditor/plugins/justify/lang/bg.js new file mode 100644 index 0000000..d4a30cb --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","bg",{block:"Двустранно подравняване",center:"Център",left:"Подравни в ляво",right:"Подравни в дясно"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/bn.js b/bower_components/ckeditor/plugins/justify/lang/bn.js new file mode 100644 index 0000000..c58ead9 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","bn",{block:"ব্লক জাস্টিফাই",center:"মাঝ বরাবর ঘেষা",left:"বা দিকে ঘেঁষা",right:"ডান দিকে ঘেঁষা"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/bs.js b/bower_components/ckeditor/plugins/justify/lang/bs.js new file mode 100644 index 0000000..9b8553c --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","bs",{block:"Puno poravnanje",center:"Centralno poravnanje",left:"Lijevo poravnanje",right:"Desno poravnanje"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/ca.js b/bower_components/ckeditor/plugins/justify/lang/ca.js new file mode 100644 index 0000000..b97f2a6 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","ca",{block:"Justificat",center:"Centrat",left:"Alinea a l'esquerra",right:"Alinea a la dreta"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/cs.js b/bower_components/ckeditor/plugins/justify/lang/cs.js new file mode 100644 index 0000000..4c9bbb0 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","cs",{block:"Zarovnat do bloku",center:"Zarovnat na střed",left:"Zarovnat vlevo",right:"Zarovnat vpravo"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/cy.js b/bower_components/ckeditor/plugins/justify/lang/cy.js new file mode 100644 index 0000000..0a6b4ff --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","cy",{block:"Unioni",center:"Alinio i'r Canol",left:"Alinio i'r Chwith",right:"Alinio i'r Dde"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/da.js b/bower_components/ckeditor/plugins/justify/lang/da.js new file mode 100644 index 0000000..0da8f69 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","da",{block:"Lige margener",center:"Centreret",left:"Venstrestillet",right:"Højrestillet"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/de.js b/bower_components/ckeditor/plugins/justify/lang/de.js new file mode 100644 index 0000000..97fe58c --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","de",{block:"Blocksatz",center:"Zentriert",left:"Linksbündig",right:"Rechtsbündig"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/el.js b/bower_components/ckeditor/plugins/justify/lang/el.js new file mode 100644 index 0000000..9941eb6 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","el",{block:"Πλήρης Στοίχιση",center:"Στο Κέντρο",left:"Στοίχιση Αριστερά",right:"Στοίχιση Δεξιά"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/en-au.js b/bower_components/ckeditor/plugins/justify/lang/en-au.js new file mode 100644 index 0000000..bb4e7c5 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","en-au",{block:"Justify",center:"Centre",left:"Align Left",right:"Align Right"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/en-ca.js b/bower_components/ckeditor/plugins/justify/lang/en-ca.js new file mode 100644 index 0000000..46a2d72 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","en-ca",{block:"Justify",center:"Centre",left:"Align Left",right:"Align Right"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/en-gb.js b/bower_components/ckeditor/plugins/justify/lang/en-gb.js new file mode 100644 index 0000000..9ebe888 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","en-gb",{block:"Justify",center:"Centre",left:"Align Left",right:"Align Right"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/en.js b/bower_components/ckeditor/plugins/justify/lang/en.js new file mode 100644 index 0000000..20b7ff5 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","en",{block:"Justify",center:"Center",left:"Align Left",right:"Align Right"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/eo.js b/bower_components/ckeditor/plugins/justify/lang/eo.js new file mode 100644 index 0000000..17c15c0 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","eo",{block:"Ĝisrandigi Ambaŭflanke",center:"Centrigi",left:"Ĝisrandigi maldekstren",right:"Ĝisrandigi dekstren"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/es.js b/bower_components/ckeditor/plugins/justify/lang/es.js new file mode 100644 index 0000000..287fa69 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","es",{block:"Justificado",center:"Centrar",left:"Alinear a Izquierda",right:"Alinear a Derecha"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/et.js b/bower_components/ckeditor/plugins/justify/lang/et.js new file mode 100644 index 0000000..5e2eeec --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","et",{block:"Rööpjoondus",center:"Keskjoondus",left:"Vasakjoondus",right:"Paremjoondus"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/eu.js b/bower_components/ckeditor/plugins/justify/lang/eu.js new file mode 100644 index 0000000..3f4f349 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","eu",{block:"Justifikatu",center:"Lerrokatu Erdian",left:"Lerrokatu Ezkerrean",right:"Lerrokatu Eskuman"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/fa.js b/bower_components/ckeditor/plugins/justify/lang/fa.js new file mode 100644 index 0000000..6a027ab --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","fa",{block:"بلوک چین",center:"میان چین",left:"چپ چین",right:"راست چین"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/fi.js b/bower_components/ckeditor/plugins/justify/lang/fi.js new file mode 100644 index 0000000..c309b71 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","fi",{block:"Tasaa molemmat reunat",center:"Keskitä",left:"Tasaa vasemmat reunat",right:"Tasaa oikeat reunat"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/fo.js b/bower_components/ckeditor/plugins/justify/lang/fo.js new file mode 100644 index 0000000..cd960d1 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","fo",{block:"Javnir tekstkantar",center:"Miðsett",left:"Vinstrasett",right:"Høgrasett"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/fr-ca.js b/bower_components/ckeditor/plugins/justify/lang/fr-ca.js new file mode 100644 index 0000000..6abd477 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","fr-ca",{block:"Justifié",center:"Centré",left:"Aligner à gauche",right:"Aligner à Droite"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/fr.js b/bower_components/ckeditor/plugins/justify/lang/fr.js new file mode 100644 index 0000000..41d84c0 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","fr",{block:"Justifier",center:"Centrer",left:"Aligner à gauche",right:"Aligner à droite"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/gl.js b/bower_components/ckeditor/plugins/justify/lang/gl.js new file mode 100644 index 0000000..1d06021 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","gl",{block:"Xustificado",center:"Centrado",left:"Aliñar á esquerda",right:"Aliñar á dereita"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/gu.js b/bower_components/ckeditor/plugins/justify/lang/gu.js new file mode 100644 index 0000000..10ec304 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","gu",{block:"બ્લૉક, અંતરાય જસ્ટિફાઇ",center:"સંકેંદ્રણ/સેંટરિંગ",left:"ડાબી બાજુએ/બાજુ તરફ",right:"જમણી બાજુએ/બાજુ તરફ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/he.js b/bower_components/ckeditor/plugins/justify/lang/he.js new file mode 100644 index 0000000..93e075d --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","he",{block:"יישור לשוליים",center:"מרכוז",left:"יישור לשמאל",right:"יישור לימין"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/hi.js b/bower_components/ckeditor/plugins/justify/lang/hi.js new file mode 100644 index 0000000..5e7f955 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","hi",{block:"ब्लॉक जस्टीफ़ाई",center:"बीच में",left:"बायीं तरफ",right:"दायीं तरफ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/hr.js b/bower_components/ckeditor/plugins/justify/lang/hr.js new file mode 100644 index 0000000..a910097 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","hr",{block:"Blok poravnanje",center:"Središnje poravnanje",left:"Lijevo poravnanje",right:"Desno poravnanje"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/hu.js b/bower_components/ckeditor/plugins/justify/lang/hu.js new file mode 100644 index 0000000..00069c6 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","hu",{block:"Sorkizárt",center:"Középre",left:"Balra",right:"Jobbra"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/id.js b/bower_components/ckeditor/plugins/justify/lang/id.js new file mode 100644 index 0000000..f1aa2e8 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","id",{block:"Rata kiri-kanan",center:"Pusat",left:"Align Left",right:"Align Right"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/is.js b/bower_components/ckeditor/plugins/justify/lang/is.js new file mode 100644 index 0000000..f5f891e --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","is",{block:"Jafna báðum megin",center:"Miðja texta",left:"Vinstrijöfnun",right:"Hægrijöfnun"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/it.js b/bower_components/ckeditor/plugins/justify/lang/it.js new file mode 100644 index 0000000..188a0f8 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","it",{block:"Giustifica",center:"Centra",left:"Allinea a sinistra",right:"Allinea a destra"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/ja.js b/bower_components/ckeditor/plugins/justify/lang/ja.js new file mode 100644 index 0000000..24552e0 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","ja",{block:"両端揃え",center:"中央揃え",left:"左揃え",right:"右揃え"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/ka.js b/bower_components/ckeditor/plugins/justify/lang/ka.js new file mode 100644 index 0000000..8ddd27e --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","ka",{block:"გადასწორება",center:"შუაში სწორება",left:"მარცხნივ სწორება",right:"მარჯვნივ სწორება"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/km.js b/bower_components/ckeditor/plugins/justify/lang/km.js new file mode 100644 index 0000000..62a049b --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","km",{block:"តម្រឹម​ពេញ",center:"កណ្ដាល",left:"តម្រឹម​ឆ្វេង",right:"តម្រឹម​ស្ដាំ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/ko.js b/bower_components/ckeditor/plugins/justify/lang/ko.js new file mode 100644 index 0000000..bfcbaf0 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","ko",{block:"양쪽 맞춤",center:"가운데 정렬",left:"왼쪽 정렬",right:"오른쪽 정렬"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/ku.js b/bower_components/ckeditor/plugins/justify/lang/ku.js new file mode 100644 index 0000000..a27e9e1 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","ku",{block:"هاوستوونی",center:"ناوەڕاست",left:"بەهێڵ کردنی چەپ",right:"بەهێڵ کردنی ڕاست"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/lt.js b/bower_components/ckeditor/plugins/justify/lang/lt.js new file mode 100644 index 0000000..d9731e4 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","lt",{block:"Lygiuoti abi puses",center:"Centruoti",left:"Lygiuoti kairę",right:"Lygiuoti dešinę"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/lv.js b/bower_components/ckeditor/plugins/justify/lang/lv.js new file mode 100644 index 0000000..7a49b35 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","lv",{block:"Izlīdzināt malas",center:"Izlīdzināt pret centru",left:"Izlīdzināt pa kreisi",right:"Izlīdzināt pa labi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/mk.js b/bower_components/ckeditor/plugins/justify/lang/mk.js new file mode 100644 index 0000000..aabf8ca --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","mk",{block:"Justify",center:"Center",left:"Align Left",right:"Align Right"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/mn.js b/bower_components/ckeditor/plugins/justify/lang/mn.js new file mode 100644 index 0000000..2eb717c --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","mn",{block:"Тэгшлэх",center:"Голлуулах",left:"Зүүн талд тулгах",right:"Баруун талд тулгах"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/ms.js b/bower_components/ckeditor/plugins/justify/lang/ms.js new file mode 100644 index 0000000..fb6d5ea --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","ms",{block:"Jajaran Blok",center:"Jajaran Tengah",left:"Jajaran Kiri",right:"Jajaran Kanan"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/nb.js b/bower_components/ckeditor/plugins/justify/lang/nb.js new file mode 100644 index 0000000..9b8ed08 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","nb",{block:"Blokkjuster",center:"Midtstill",left:"Venstrejuster",right:"Høyrejuster"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/nl.js b/bower_components/ckeditor/plugins/justify/lang/nl.js new file mode 100644 index 0000000..1b0f8ae --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","nl",{block:"Uitvullen",center:"Centreren",left:"Links uitlijnen",right:"Rechts uitlijnen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/no.js b/bower_components/ckeditor/plugins/justify/lang/no.js new file mode 100644 index 0000000..49f6c80 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","no",{block:"Blokkjuster",center:"Midtstill",left:"Venstrejuster",right:"Høyrejuster"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/pl.js b/bower_components/ckeditor/plugins/justify/lang/pl.js new file mode 100644 index 0000000..104c04f --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","pl",{block:"Wyjustuj",center:"Wyśrodkuj",left:"Wyrównaj do lewej",right:"Wyrównaj do prawej"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/pt-br.js b/bower_components/ckeditor/plugins/justify/lang/pt-br.js new file mode 100644 index 0000000..05e293e --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","pt-br",{block:"Justificado",center:"Centralizar",left:"Alinhar Esquerda",right:"Alinhar Direita"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/pt.js b/bower_components/ckeditor/plugins/justify/lang/pt.js new file mode 100644 index 0000000..9569adf --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","pt",{block:"Justificado",center:"Alinhar ao Centro",left:"Alinhar à esquerda",right:"Alinhar à direita"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/ro.js b/bower_components/ckeditor/plugins/justify/lang/ro.js new file mode 100644 index 0000000..d1da4cc --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","ro",{block:"Aliniere în bloc (Block Justify)",center:"Aliniere centrală",left:"Aliniere la stânga",right:"Aliniere la dreapta"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/ru.js b/bower_components/ckeditor/plugins/justify/lang/ru.js new file mode 100644 index 0000000..4dfc2e4 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","ru",{block:"По ширине",center:"По центру",left:"По левому краю",right:"По правому краю"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/si.js b/bower_components/ckeditor/plugins/justify/lang/si.js new file mode 100644 index 0000000..8d85db5 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","si",{block:"Justify",center:"මධ්‍ය",left:"Align Left",right:"Align Right"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/sk.js b/bower_components/ckeditor/plugins/justify/lang/sk.js new file mode 100644 index 0000000..6d4de70 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","sk",{block:"Zarovnať do bloku",center:"Zarovnať na stred",left:"Zarovnať vľavo",right:"Zarovnať vpravo"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/sl.js b/bower_components/ckeditor/plugins/justify/lang/sl.js new file mode 100644 index 0000000..cda22d1 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","sl",{block:"Obojestranska poravnava",center:"Sredinska poravnava",left:"Leva poravnava",right:"Desna poravnava"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/sq.js b/bower_components/ckeditor/plugins/justify/lang/sq.js new file mode 100644 index 0000000..5ec58c6 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","sq",{block:"Zgjero",center:"Qendër",left:"Rreshto majtas",right:"Rreshto Djathtas"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/sr-latn.js b/bower_components/ckeditor/plugins/justify/lang/sr-latn.js new file mode 100644 index 0000000..320d697 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","sr-latn",{block:"Obostrano ravnanje",center:"Centriran tekst",left:"Levo ravnanje",right:"Desno ravnanje"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/sr.js b/bower_components/ckeditor/plugins/justify/lang/sr.js new file mode 100644 index 0000000..f665496 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","sr",{block:"Обострано равнање",center:"Центриран текст",left:"Лево равнање",right:"Десно равнање"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/sv.js b/bower_components/ckeditor/plugins/justify/lang/sv.js new file mode 100644 index 0000000..9054d4f --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","sv",{block:"Justera till marginaler",center:"Centrera",left:"Vänsterjustera",right:"Högerjustera"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/th.js b/bower_components/ckeditor/plugins/justify/lang/th.js new file mode 100644 index 0000000..fb1d15f --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","th",{block:"จัดพอดีหน้ากระดาษ",center:"จัดกึ่งกลาง",left:"จัดชิดซ้าย",right:"จัดชิดขวา"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/tr.js b/bower_components/ckeditor/plugins/justify/lang/tr.js new file mode 100644 index 0000000..177d9ad --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","tr",{block:"İki Kenara Yaslanmış",center:"Ortalanmış",left:"Sola Dayalı",right:"Sağa Dayalı"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/tt.js b/bower_components/ckeditor/plugins/justify/lang/tt.js new file mode 100644 index 0000000..b0999da --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","tt",{block:"Киңлеккә карап тигезләү",center:"Үзәккә тигезләү",left:"Сул як кырыйдан тигезләү",right:"Уң як кырыйдан тигезләү"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/ug.js b/bower_components/ckeditor/plugins/justify/lang/ug.js new file mode 100644 index 0000000..a111252 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","ug",{block:"ئىككى تەرەپتىن توغرىلا",center:"ئوتتۇرىغا توغرىلا",left:"سولغا توغرىلا",right:"ئوڭغا توغرىلا"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/uk.js b/bower_components/ckeditor/plugins/justify/lang/uk.js new file mode 100644 index 0000000..ba2baba --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","uk",{block:"По ширині",center:"По центру",left:"По лівому краю",right:"По правому краю"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/vi.js b/bower_components/ckeditor/plugins/justify/lang/vi.js new file mode 100644 index 0000000..30395d2 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","vi",{block:"Canh đều",center:"Canh giữa",left:"Canh trái",right:"Canh phải"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/zh-cn.js b/bower_components/ckeditor/plugins/justify/lang/zh-cn.js new file mode 100644 index 0000000..9132cf5 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","zh-cn",{block:"两端对齐",center:"居中",left:"左对齐",right:"右对齐"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/lang/zh.js b/bower_components/ckeditor/plugins/justify/lang/zh.js new file mode 100644 index 0000000..405907b --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("justify","zh",{block:"左右對齊",center:"置中",left:"靠左對齊",right:"靠右對齊"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/justify/plugin.js b/bower_components/ckeditor/plugins/justify/plugin.js new file mode 100644 index 0000000..2db6321 --- /dev/null +++ b/bower_components/ckeditor/plugins/justify/plugin.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function l(a,c){var c=void 0===c||c,b;if(c)b=a.getComputedStyle("text-align");else{for(;!a.hasAttribute||!a.hasAttribute("align")&&!a.getStyle("text-align");){b=a.getParent();if(!b)break;a=b}b=a.getStyle("text-align")||a.getAttribute("align")||""}b&&(b=b.replace(/(?:-(?:moz|webkit)-)?(?:start|auto)/i,""));!b&&c&&(b="rtl"==a.getComputedStyle("direction")?"right":"left");return b}function g(a,c,b){this.editor=a;this.name=c;this.value=b;this.context="p";var c=a.config.justifyClasses,h=a.config.enterMode== +CKEDITOR.ENTER_P?"p":"div";if(c){switch(b){case "left":this.cssClassName=c[0];break;case "center":this.cssClassName=c[1];break;case "right":this.cssClassName=c[2];break;case "justify":this.cssClassName=c[3]}this.cssClassRegex=RegExp("(?:^|\\s+)(?:"+c.join("|")+")(?=$|\\s)");this.requiredContent=h+"("+this.cssClassName+")"}else this.requiredContent=h+"{text-align}";this.allowedContent={"caption div h1 h2 h3 h4 h5 h6 p pre td th li":{propertiesOnly:!0,styles:this.cssClassName?null:"text-align",classes:this.cssClassName|| +null}};a.config.enterMode==CKEDITOR.ENTER_BR&&(this.allowedContent.div=!0)}function j(a){var c=a.editor,b=c.createRange();b.setStartBefore(a.data.node);b.setEndAfter(a.data.node);for(var h=new CKEDITOR.dom.walker(b),d;d=h.next();)if(d.type==CKEDITOR.NODE_ELEMENT)if(!d.equals(a.data.node)&&d.getDirection())b.setStartAfter(d),h=new CKEDITOR.dom.walker(b);else{var e=c.config.justifyClasses;e&&(d.hasClass(e[0])?(d.removeClass(e[0]),d.addClass(e[2])):d.hasClass(e[2])&&(d.removeClass(e[2]),d.addClass(e[0]))); +e=d.getStyle("text-align");"left"==e?d.setStyle("text-align","right"):"right"==e&&d.setStyle("text-align","left")}}g.prototype={exec:function(a){var c=a.getSelection(),b=a.config.enterMode;if(c){for(var h=c.createBookmarks(),d=c.getRanges(),e=this.cssClassName,g,f,i=a.config.useComputedState,i=void 0===i||i,k=d.length-1;0<=k;k--){g=d[k].createIterator();for(g.enlargeBr=b!=CKEDITOR.ENTER_BR;f=g.getNextParagraph(b==CKEDITOR.ENTER_P?"p":"div");)if(!f.isReadOnly()){f.removeAttribute("align");f.removeStyle("text-align"); +var j=e&&(f.$.className=CKEDITOR.tools.ltrim(f.$.className.replace(this.cssClassRegex,""))),m=this.state==CKEDITOR.TRISTATE_OFF&&(!i||l(f,!0)!=this.value);e?m?f.addClass(e):j||f.removeAttribute("class"):m&&f.setStyle("text-align",this.value)}}a.focus();a.forceNextSelectionCheck();c.selectBookmarks(h)}},refresh:function(a,c){var b=c.block||c.blockLimit;this.setState("body"!=b.getName()&&l(b,this.editor.config.useComputedState)==this.value?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)}};CKEDITOR.plugins.add("justify", +{lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"justifyblock,justifycenter,justifyleft,justifyright",hidpi:!0,init:function(a){if(!a.blockless){var c=new g(a,"justifyleft","left"),b=new g(a,"justifycenter","center"),h=new g(a,"justifyright","right"),d=new g(a,"justifyblock","justify");a.addCommand("justifyleft", +c);a.addCommand("justifycenter",b);a.addCommand("justifyright",h);a.addCommand("justifyblock",d);a.ui.addButton&&(a.ui.addButton("JustifyLeft",{label:a.lang.justify.left,command:"justifyleft",toolbar:"align,10"}),a.ui.addButton("JustifyCenter",{label:a.lang.justify.center,command:"justifycenter",toolbar:"align,20"}),a.ui.addButton("JustifyRight",{label:a.lang.justify.right,command:"justifyright",toolbar:"align,30"}),a.ui.addButton("JustifyBlock",{label:a.lang.justify.block,command:"justifyblock", +toolbar:"align,40"}));a.on("dirChanged",j)}}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/icons/hidpi/language.png b/bower_components/ckeditor/plugins/language/icons/hidpi/language.png new file mode 100644 index 0000000..3908a6a Binary files /dev/null and b/bower_components/ckeditor/plugins/language/icons/hidpi/language.png differ diff --git a/bower_components/ckeditor/plugins/language/icons/language.png b/bower_components/ckeditor/plugins/language/icons/language.png new file mode 100644 index 0000000..eb680d4 Binary files /dev/null and b/bower_components/ckeditor/plugins/language/icons/language.png differ diff --git a/bower_components/ckeditor/plugins/language/lang/ar.js b/bower_components/ckeditor/plugins/language/lang/ar.js new file mode 100644 index 0000000..61f693a --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/ar.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","ar",{button:"Set language",remove:"Remove language"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/ca.js b/bower_components/ckeditor/plugins/language/lang/ca.js new file mode 100644 index 0000000..0786ff4 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/ca.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","ca",{button:"Definir l'idioma",remove:"Eliminar idioma"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/cs.js b/bower_components/ckeditor/plugins/language/lang/cs.js new file mode 100644 index 0000000..f70b05d --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/cs.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","cs",{button:"Nastavit jazyk",remove:"Odstranit jazyk"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/cy.js b/bower_components/ckeditor/plugins/language/lang/cy.js new file mode 100644 index 0000000..7cb4494 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/cy.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","cy",{button:"Gosod iaith",remove:"Tynnu iaith"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/da.js b/bower_components/ckeditor/plugins/language/lang/da.js new file mode 100644 index 0000000..d2c9032 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/da.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","da",{button:"Vælg sprog",remove:"Fjern sprog"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/de.js b/bower_components/ckeditor/plugins/language/lang/de.js new file mode 100644 index 0000000..aa5c7de --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/de.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","de",{button:"Sprache stellen",remove:"Sprache entfernen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/el.js b/bower_components/ckeditor/plugins/language/lang/el.js new file mode 100644 index 0000000..b0cf73d --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/el.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","el",{button:"Θέση γλώσσας",remove:"Αφαίρεση γλώσσας"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/en-gb.js b/bower_components/ckeditor/plugins/language/lang/en-gb.js new file mode 100644 index 0000000..1c86f5d --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/en-gb.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","en-gb",{button:"Set language",remove:"Remove language"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/en.js b/bower_components/ckeditor/plugins/language/lang/en.js new file mode 100644 index 0000000..2278e8b --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/en.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","en",{button:"Set language",remove:"Remove language"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/eo.js b/bower_components/ckeditor/plugins/language/lang/eo.js new file mode 100644 index 0000000..f79af48 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/eo.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","eo",{button:"Instali lingvon",remove:"Forigi lingvon"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/es.js b/bower_components/ckeditor/plugins/language/lang/es.js new file mode 100644 index 0000000..af1dc12 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/es.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","es",{button:"Fijar lenguaje",remove:"Quitar lenguaje"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/fa.js b/bower_components/ckeditor/plugins/language/lang/fa.js new file mode 100644 index 0000000..0b89722 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/fa.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","fa",{button:"تعیین زبان",remove:"حذف زبان"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/fi.js b/bower_components/ckeditor/plugins/language/lang/fi.js new file mode 100644 index 0000000..e8f96b6 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/fi.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","fi",{button:"Aseta kieli",remove:"Poista kieli"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/fr.js b/bower_components/ckeditor/plugins/language/lang/fr.js new file mode 100644 index 0000000..4fcb7c6 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/fr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","fr",{button:"Définir la langue",remove:"Supprimer la langue"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/gl.js b/bower_components/ckeditor/plugins/language/lang/gl.js new file mode 100644 index 0000000..1f255e9 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/gl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","gl",{button:"Estabelezer o idioma",remove:"Retirar o idioma"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/he.js b/bower_components/ckeditor/plugins/language/lang/he.js new file mode 100644 index 0000000..ecfcf77 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/he.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","he",{button:"צור שפה",remove:"הסר שפה"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/hr.js b/bower_components/ckeditor/plugins/language/lang/hr.js new file mode 100644 index 0000000..1bc0437 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/hr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","hr",{button:"Namjesti jezik",remove:"Makni jezik"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/hu.js b/bower_components/ckeditor/plugins/language/lang/hu.js new file mode 100644 index 0000000..041ed21 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/hu.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","hu",{button:"Nyelv beállítása",remove:"Nyelv eltávolítása"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/it.js b/bower_components/ckeditor/plugins/language/lang/it.js new file mode 100644 index 0000000..aa3c611 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/it.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","it",{button:"Imposta lingua",remove:"Rimuovi lingua"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/ja.js b/bower_components/ckeditor/plugins/language/lang/ja.js new file mode 100644 index 0000000..2435880 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/ja.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","ja",{button:"言語を設定",remove:"言語を削除"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/km.js b/bower_components/ckeditor/plugins/language/lang/km.js new file mode 100644 index 0000000..03b4ed3 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/km.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","km",{button:"កំណត់​ភាសា",remove:"លុប​ភាសា"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/ku.js b/bower_components/ckeditor/plugins/language/lang/ku.js new file mode 100644 index 0000000..4dfbb8b --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/ku.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","ku",{button:"جێگیرکردنی زمان",remove:"لابردنی زمان"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/nb.js b/bower_components/ckeditor/plugins/language/lang/nb.js new file mode 100644 index 0000000..9cf312c --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/nb.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","nb",{button:"Sett språk",remove:"Fjern språk"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/nl.js b/bower_components/ckeditor/plugins/language/lang/nl.js new file mode 100644 index 0000000..6699da3 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/nl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","nl",{button:"Taal instellen",remove:"Taal verwijderen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/no.js b/bower_components/ckeditor/plugins/language/lang/no.js new file mode 100644 index 0000000..a48beb0 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/no.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","no",{button:"Sett språk",remove:"Fjern språk"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/pl.js b/bower_components/ckeditor/plugins/language/lang/pl.js new file mode 100644 index 0000000..6887d23 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/pl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","pl",{button:"Ustaw język",remove:"Usuń język"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/pt-br.js b/bower_components/ckeditor/plugins/language/lang/pt-br.js new file mode 100644 index 0000000..ecb27b0 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/pt-br.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","pt-br",{button:"Configure o Idioma",remove:"Remover Idioma"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/pt.js b/bower_components/ckeditor/plugins/language/lang/pt.js new file mode 100644 index 0000000..e2dda5e --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/pt.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","pt",{button:"Definir Idioma",remove:"Remover idioma"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/ru.js b/bower_components/ckeditor/plugins/language/lang/ru.js new file mode 100644 index 0000000..99b81af --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/ru.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","ru",{button:"Установка языка",remove:"Удалить язык"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/sk.js b/bower_components/ckeditor/plugins/language/lang/sk.js new file mode 100644 index 0000000..3fa9766 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/sk.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","sk",{button:"Nastaviť jazyk",remove:"Odstrániť jazyk"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/sl.js b/bower_components/ckeditor/plugins/language/lang/sl.js new file mode 100644 index 0000000..382dea1 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/sl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","sl",{button:"Nastavi jezik",remove:"Odstrani jezik"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/sq.js b/bower_components/ckeditor/plugins/language/lang/sq.js new file mode 100644 index 0000000..7d12ed2 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/sq.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","sq",{button:"Përzgjidhni gjuhën",remove:"Largoni gjuhën"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/sv.js b/bower_components/ckeditor/plugins/language/lang/sv.js new file mode 100644 index 0000000..f9f7455 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/sv.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","sv",{button:"Sätt språk",remove:"Ta bort språk"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/tr.js b/bower_components/ckeditor/plugins/language/lang/tr.js new file mode 100644 index 0000000..c1ba86b --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/tr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","tr",{button:"Dili seç",remove:"Dili kaldır"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/tt.js b/bower_components/ckeditor/plugins/language/lang/tt.js new file mode 100644 index 0000000..8a742e6 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/tt.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","tt",{button:"Тел сайлау",remove:"Телне бетерү"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/uk.js b/bower_components/ckeditor/plugins/language/lang/uk.js new file mode 100644 index 0000000..6fc4153 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/uk.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","uk",{button:"Установити мову",remove:"Вилучити мову"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/vi.js b/bower_components/ckeditor/plugins/language/lang/vi.js new file mode 100644 index 0000000..1d2d576 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/vi.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","vi",{button:"Thiết lập ngôn ngữ",remove:"Loại bỏ ngôn ngữ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/zh-cn.js b/bower_components/ckeditor/plugins/language/lang/zh-cn.js new file mode 100644 index 0000000..1acfd0a --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/zh-cn.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","zh-cn",{button:"设置语言",remove:"移除语言"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/lang/zh.js b/bower_components/ckeditor/plugins/language/lang/zh.js new file mode 100644 index 0000000..49e6192 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/lang/zh.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("language","zh",{button:"設定語言",remove:"移除語言"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/language/plugin.js b/bower_components/ckeditor/plugins/language/plugin.js new file mode 100644 index 0000000..77d2b40 --- /dev/null +++ b/bower_components/ckeditor/plugins/language/plugin.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){CKEDITOR.plugins.add("language",{requires:"menubutton",lang:"ar,ca,cs,cy,da,de,el,en,en-gb,eo,es,fa,fi,fr,gl,he,hr,hu,it,ja,km,ku,nb,nl,no,pl,pt,pt-br,ru,sk,sl,sq,sv,tr,tt,uk,vi,zh,zh-cn",icons:"language",hidpi:!0,init:function(a){var b=a.config.language_list||["ar:Arabic:rtl","fr:French","es:Spanish"],c=this,d=a.lang.language,e={},g,h,i,f;a.addCommand("language",{allowedContent:"span[!lang,!dir]",requiredContent:"span[lang,dir]",contextSensitive:!0,exec:function(a,b){var c=e["language_"+ +b];if(c)a[c.style.checkActive(a.elementPath(),a)?"removeStyle":"applyStyle"](c.style)},refresh:function(a){this.setState(c.getCurrentLangElement(a)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)}});for(f=0;f<b.length;f++)g=b[f].split(":"),h=g[0],i="language_"+h,e[i]={label:g[1],langId:h,group:"language",order:f,ltr:"rtl"!=(""+g[2]).toLowerCase(),onClick:function(){a.execCommand("language",this.langId)},role:"menuitemcheckbox"},e[i].style=new CKEDITOR.style({element:"span",attributes:{lang:h,dir:e[i].ltr? +"ltr":"rtl"}});e.language_remove={label:d.remove,group:"language_remove",state:CKEDITOR.TRISTATE_DISABLED,order:e.length,onClick:function(){var b=c.getCurrentLangElement(a);b&&a.execCommand("language",b.getAttribute("lang"))}};a.addMenuGroup("language",1);a.addMenuGroup("language_remove");a.addMenuItems(e);a.ui.add("Language",CKEDITOR.UI_MENUBUTTON,{label:d.button,allowedContent:"span[!lang,!dir]",requiredContent:"span[lang,dir]",toolbar:"bidi,30",command:"language",onMenu:function(){var b={},d=c.getCurrentLangElement(a), +f;for(f in e)b[f]=CKEDITOR.TRISTATE_OFF;b.language_remove=d?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED;d&&(b["language_"+d.getAttribute("lang")]=CKEDITOR.TRISTATE_ON);return b}})},getCurrentLangElement:function(a){var b=a.elementPath(),a=b&&b.elements,c;if(b)for(var d=0;d<a.length;d++)b=a[d],!c&&("span"==b.getName()&&b.hasAttribute("dir")&&b.hasAttribute("lang"))&&(c=b);return c}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/lineutils/plugin.js b/bower_components/ckeditor/plugins/lineutils/plugin.js new file mode 100644 index 0000000..3fc318b --- /dev/null +++ b/bower_components/ckeditor/plugins/lineutils/plugin.js @@ -0,0 +1,21 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function k(a,d){CKEDITOR.tools.extend(this,{editor:a,editable:a.editable(),doc:a.document,win:a.window},d,!0);this.inline=this.editable.isInline();this.inline||(this.frame=this.win.getFrame());this.target=this[this.inline?"editable":"doc"]}function l(a,d){CKEDITOR.tools.extend(this,d,{editor:a},!0)}function m(a,d){var b=a.editable();CKEDITOR.tools.extend(this,{editor:a,editable:b,doc:a.document,win:a.window,container:CKEDITOR.document.getBody(),winTop:CKEDITOR.document.getWindow()},d, +!0);this.hidden={};this.visible={};this.inline=b.isInline();this.inline||(this.frame=this.win.getFrame());this.queryViewport();var c=CKEDITOR.tools.bind(this.queryViewport,this),e=CKEDITOR.tools.bind(this.hideVisible,this),g=CKEDITOR.tools.bind(this.removeAll,this);b.attachListener(this.winTop,"resize",c);b.attachListener(this.winTop,"scroll",c);b.attachListener(this.winTop,"resize",e);b.attachListener(this.win,"scroll",e);b.attachListener(this.inline?b:this.frame,"mouseout",function(a){var b=a.data.$.clientX, +a=a.data.$.clientY;this.queryViewport();(b<=this.rect.left||b>=this.rect.right||a<=this.rect.top||a>=this.rect.bottom)&&this.hideVisible();(b<=0||b>=this.winTopPane.width||a<=0||a>=this.winTopPane.height)&&this.hideVisible()},this);b.attachListener(a,"resize",c);b.attachListener(a,"mode",g);a.on("destroy",g);this.lineTpl=(new CKEDITOR.template(p)).output({lineStyle:CKEDITOR.tools.writeCssText(CKEDITOR.tools.extend({},q,this.lineStyle,!0)),tipLeftStyle:CKEDITOR.tools.writeCssText(CKEDITOR.tools.extend({}, +n,{left:"0px","border-left-color":"red","border-width":"6px 0 6px 6px"},this.tipCss,this.tipLeftStyle,!0)),tipRightStyle:CKEDITOR.tools.writeCssText(CKEDITOR.tools.extend({},n,{right:"0px","border-right-color":"red","border-width":"6px 6px 6px 0"},this.tipCss,this.tipRightStyle,!0))})}function i(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&!(o[a.getComputedStyle("float")]||o[a.getAttribute("align")])&&!r[a.getComputedStyle("position")]}CKEDITOR.plugins.add("lineutils");CKEDITOR.LINEUTILS_BEFORE=1; +CKEDITOR.LINEUTILS_AFTER=2;CKEDITOR.LINEUTILS_INSIDE=4;k.prototype={start:function(a){var d=this,b=this.editor,c=this.doc,e,g,f,h=CKEDITOR.tools.eventsBuffer(50,function(){b.readOnly||"wysiwyg"!=b.mode||(d.relations={},e=new CKEDITOR.dom.element(c.$.elementFromPoint(g,f)),d.traverseSearch(e),isNaN(g+f)||d.pixelSearch(e,g,f),a&&a(d.relations,g,f))});this.listener=this.editable.attachListener(this.target,"mousemove",function(a){g=a.data.$.clientX;f=a.data.$.clientY;h.input()});this.editable.attachListener(this.inline? +this.editable:this.frame,"mouseout",function(){h.reset()})},stop:function(){this.listener&&this.listener.removeListener()},getRange:function(){var a={};a[CKEDITOR.LINEUTILS_BEFORE]=CKEDITOR.POSITION_BEFORE_START;a[CKEDITOR.LINEUTILS_AFTER]=CKEDITOR.POSITION_AFTER_END;a[CKEDITOR.LINEUTILS_INSIDE]=CKEDITOR.POSITION_AFTER_START;return function(d){var b=this.editor.createRange();b.moveToPosition(this.relations[d.uid].element,a[d.type]);return b}}(),store:function(){function a(a,b,c){var e=a.getUniqueId(); +e in c?c[e].type|=b:c[e]={element:a,type:b}}return function(d,b){var c;if(b&CKEDITOR.LINEUTILS_AFTER&&i(c=d.getNext())&&c.isVisible())a(c,CKEDITOR.LINEUTILS_BEFORE,this.relations),b^=CKEDITOR.LINEUTILS_AFTER;if(b&CKEDITOR.LINEUTILS_INSIDE&&i(c=d.getFirst())&&c.isVisible())a(c,CKEDITOR.LINEUTILS_BEFORE,this.relations),b^=CKEDITOR.LINEUTILS_INSIDE;a(d,b,this.relations)}}(),traverseSearch:function(a){var d,b,c;do if(c=a.$["data-cke-expando"],!(c&&c in this.relations)){if(a.equals(this.editable))break; +if(i(a))for(d in this.lookups)(b=this.lookups[d](a))&&this.store(a,b)}while(!(a&&a.type==CKEDITOR.NODE_ELEMENT&&"true"==a.getAttribute("contenteditable"))&&(a=a.getParent()))},pixelSearch:function(){function a(a,c,e,g,f){for(var h=0,j;f(e);){e+=g;if(25==++h)break;if(j=this.doc.$.elementFromPoint(c,e))if(j==a)h=0;else if(d(a,j)&&(h=0,i(j=new CKEDITOR.dom.element(j))))return j}}var d=CKEDITOR.env.ie||CKEDITOR.env.webkit?function(a,c){return a.contains(c)}:function(a,c){return!!(a.compareDocumentPosition(c)& +16)};return function(b,c,d){var g=this.win.getViewPaneSize().height,f=a.call(this,b.$,c,d,-1,function(a){return 0<a}),c=a.call(this,b.$,c,d,1,function(a){return a<g});if(f)for(this.traverseSearch(f);!f.getParent().equals(b);)f=f.getParent();if(c)for(this.traverseSearch(c);!c.getParent().equals(b);)c=c.getParent();for(;f||c;){f&&(f=f.getNext(i));if(!f||f.equals(c))break;this.traverseSearch(f);c&&(c=c.getPrevious(i));if(!c||c.equals(f))break;this.traverseSearch(c)}}}(),greedySearch:function(){this.relations= +{};for(var a=this.editable.getElementsByTag("*"),d=0,b,c,e;b=a.getItem(d++);)if(!b.equals(this.editable)&&(b.hasAttribute("contenteditable")||!b.isReadOnly())&&i(b)&&b.isVisible())for(e in this.lookups)(c=this.lookups[e](b))&&this.store(b,c);return this.relations}};l.prototype={locate:function(){function a(a,b){var c=a.element[b===CKEDITOR.LINEUTILS_BEFORE?"getPrevious":"getNext"]();return c&&i(c)?(a.siblingRect=c.getClientRect(),b==CKEDITOR.LINEUTILS_BEFORE?(a.siblingRect.bottom+a.elementRect.top)/ +2:(a.elementRect.bottom+a.siblingRect.top)/2):b==CKEDITOR.LINEUTILS_BEFORE?a.elementRect.top:a.elementRect.bottom}return function(d){var b;this.locations={};for(var c in d)b=d[c],b.elementRect=b.element.getClientRect(),b.type&CKEDITOR.LINEUTILS_BEFORE&&this.store(c,CKEDITOR.LINEUTILS_BEFORE,a(b,CKEDITOR.LINEUTILS_BEFORE)),b.type&CKEDITOR.LINEUTILS_AFTER&&this.store(c,CKEDITOR.LINEUTILS_AFTER,a(b,CKEDITOR.LINEUTILS_AFTER)),b.type&CKEDITOR.LINEUTILS_INSIDE&&this.store(c,CKEDITOR.LINEUTILS_INSIDE,(b.elementRect.top+ +b.elementRect.bottom)/2);return this.locations}}(),sort:function(){var a,d,b,c;return function(e,g){a=this.locations;d=[];for(var f in a)for(var h in a[f])if(b=Math.abs(e-a[f][h]),d.length){for(c=0;c<d.length;c++)if(b<d[c].dist){d.splice(c,0,{uid:+f,type:h,dist:b});break}c==d.length&&d.push({uid:+f,type:h,dist:b})}else d.push({uid:+f,type:h,dist:b});return"undefined"!=typeof g?d.slice(0,g):d}}(),store:function(a,d,b){this.locations[a]||(this.locations[a]={});this.locations[a][d]=b}};var n={display:"block", +width:"0px",height:"0px","border-color":"transparent","border-style":"solid",position:"absolute",top:"-6px"},q={height:"0px","border-top":"1px dashed red",position:"absolute","z-index":9999},p='<div data-cke-lineutils-line="1" class="cke_reset_all" style="{lineStyle}"><span style="{tipLeftStyle}"> </span><span style="{tipRightStyle}"> </span></div>';m.prototype={removeAll:function(){for(var a in this.hidden)this.hidden[a].remove(),delete this.hidden[a];for(a in this.visible)this.visible[a].remove(), +delete this.visible[a]},hideLine:function(a){var d=a.getUniqueId();a.hide();this.hidden[d]=a;delete this.visible[d]},showLine:function(a){var d=a.getUniqueId();a.show();this.visible[d]=a;delete this.hidden[d]},hideVisible:function(){for(var a in this.visible)this.hideLine(this.visible[a])},placeLine:function(a,d){var b,c,e;if(b=this.getStyle(a.uid,a.type)){for(e in this.visible)if(this.visible[e].getCustomData("hash")!==this.hash){c=this.visible[e];break}if(!c)for(e in this.hidden)if(this.hidden[e].getCustomData("hash")!== +this.hash){this.showLine(c=this.hidden[e]);break}c||this.showLine(c=this.addLine());c.setCustomData("hash",this.hash);this.visible[c.getUniqueId()]=c;c.setStyles(b);d&&d(c)}},getStyle:function(a,d){var b=this.relations[a],c=this.locations[a][d],e={};e.width=b.siblingRect?Math.max(b.siblingRect.width,b.elementRect.width):b.elementRect.width;e.top=this.inline?c+this.winTopScroll.y:this.rect.top+this.winTopScroll.y+c;if(e.top-this.winTopScroll.y<this.rect.top||e.top-this.winTopScroll.y>this.rect.bottom)return!1; +if(this.inline)e.left=b.elementRect.left;else if(0<b.elementRect.left?e.left=this.rect.left+b.elementRect.left:(e.width+=b.elementRect.left,e.left=this.rect.left),0<(b=e.left+e.width-(this.rect.left+this.winPane.width)))e.width-=b;e.left+=this.winTopScroll.x;for(var g in e)e[g]=CKEDITOR.tools.cssLength(e[g]);return e},addLine:function(){var a=CKEDITOR.dom.element.createFromHtml(this.lineTpl);a.appendTo(this.container);return a},prepare:function(a,d){this.relations=a;this.locations=d;this.hash=Math.random()}, +cleanup:function(){var a,d;for(d in this.visible)a=this.visible[d],a.getCustomData("hash")!==this.hash&&this.hideLine(a)},queryViewport:function(){this.winPane=this.win.getViewPaneSize();this.winTopScroll=this.winTop.getScrollPosition();this.winTopPane=this.winTop.getViewPaneSize();this.rect=this.inline?this.editable.getClientRect():this.frame.getClientRect()}};var o={left:1,right:1,center:1},r={absolute:1,fixed:1};CKEDITOR.plugins.lineutils={finder:k,locator:l,liner:m}})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/link/dialogs/anchor.js b/bower_components/ckeditor/plugins/link/dialogs/anchor.js new file mode 100644 index 0000000..f5fe2ea --- /dev/null +++ b/bower_components/ckeditor/plugins/link/dialogs/anchor.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("anchor",function(c){function d(a,b){return a.createFakeElement(a.document.createElement("a",{attributes:b}),"cke_anchor","anchor")}return{title:c.lang.link.anchor.title,minWidth:300,minHeight:60,onOk:function(){var a=CKEDITOR.tools.trim(this.getValueOf("info","txtName")),a={id:a,name:a,"data-cke-saved-name":a};if(this._.selectedElement)this._.selectedElement.data("cke-realelement")?(a=d(c,a),a.replace(this._.selectedElement),CKEDITOR.env.ie&&c.getSelection().selectElement(a)): +this._.selectedElement.setAttributes(a);else{var b=c.getSelection(),b=b&&b.getRanges()[0];b.collapsed?(a=d(c,a),b.insertNode(a)):(CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(a["class"]="cke_anchor"),a=new CKEDITOR.style({element:"a",attributes:a}),a.type=CKEDITOR.STYLE_INLINE,c.applyStyle(a))}},onHide:function(){delete this._.selectedElement},onShow:function(){var a=c.getSelection(),b=a.getSelectedElement(),d=b&&b.data("cke-realelement"),e=d?CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b):CKEDITOR.plugins.link.getSelectedLink(c); +e&&(this._.selectedElement=e,this.setValueOf("info","txtName",e.data("cke-saved-name")||""),!d&&a.selectElement(e),b&&(this._.selectedElement=b));this.getContentElement("info","txtName").focus()},contents:[{id:"info",label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){return!this.getValue()?(alert(c.lang.link.anchor.errorName),!1):!0}}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/link/dialogs/link.js b/bower_components/ckeditor/plugins/link/dialogs/link.js new file mode 100644 index 0000000..3ee3209 --- /dev/null +++ b/bower_components/ckeditor/plugins/link/dialogs/link.js @@ -0,0 +1,26 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){CKEDITOR.dialog.add("link",function(g){var l=CKEDITOR.plugins.link,m=function(){var a=this.getDialog(),b=a.getContentElement("target","popupFeatures"),a=a.getContentElement("target","linkTargetName"),k=this.getValue();if(b&&a)switch(b=b.getElement(),b.hide(),a.setValue(""),k){case "frame":a.setLabel(g.lang.link.targetFrameName);a.getElement().show();break;case "popup":b.show();a.setLabel(g.lang.link.targetPopupName);a.getElement().show();break;default:a.setValue(k),a.getElement().hide()}}, +f=function(a){a.target&&this.setValue(a.target[this.id]||"")},h=function(a){a.advanced&&this.setValue(a.advanced[this.id]||"")},i=function(a){a.target||(a.target={});a.target[this.id]=this.getValue()||""},j=function(a){a.advanced||(a.advanced={});a.advanced[this.id]=this.getValue()||""},c=g.lang.common,b=g.lang.link,d;return{title:b.title,minWidth:350,minHeight:230,contents:[{id:"info",label:b.info,title:b.info,elements:[{id:"linkType",type:"select",label:b.type,"default":"url",items:[[b.toUrl,"url"], +[b.toAnchor,"anchor"],[b.toEmail,"email"]],onChange:function(){var a=this.getDialog(),b=["urlOptions","anchorOptions","emailOptions"],k=this.getValue(),e=a.definition.getContents("upload"),e=e&&e.hidden;"url"==k?(g.config.linkShowTargetTab&&a.showPage("target"),e||a.showPage("upload")):(a.hidePage("target"),e||a.hidePage("upload"));for(e=0;e<b.length;e++){var c=a.getContentElement("info",b[e]);c&&(c=c.getElement().getParent().getParent(),b[e]==k+"Options"?c.show():c.hide())}a.layout()},setup:function(a){this.setValue(a.type|| +"url")},commit:function(a){a.type=this.getValue()}},{type:"vbox",id:"urlOptions",children:[{type:"hbox",widths:["25%","75%"],children:[{id:"protocol",type:"select",label:c.protocol,"default":"http://",items:[["http://‎","http://"],["https://‎","https://"],["ftp://‎","ftp://"],["news://‎","news://"],[b.other,""]],setup:function(a){a.url&&this.setValue(a.url.protocol||"")},commit:function(a){a.url||(a.url={});a.url.protocol=this.getValue()}},{type:"text",id:"url",label:c.url,required:!0,onLoad:function(){this.allowOnChange= +!0},onKeyUp:function(){this.allowOnChange=!1;var a=this.getDialog().getContentElement("info","protocol"),b=this.getValue(),k=/^((javascript:)|[#\/\.\?])/i,c=/^(http|https|ftp|news):\/\/(?=.)/i.exec(b);c?(this.setValue(b.substr(c[0].length)),a.setValue(c[0].toLowerCase())):k.test(b)&&a.setValue("");this.allowOnChange=!0},onChange:function(){if(this.allowOnChange)this.onKeyUp()},validate:function(){var a=this.getDialog();return a.getContentElement("info","linkType")&&"url"!=a.getValueOf("info","linkType")? +!0:!g.config.linkJavaScriptLinksAllowed&&/javascript\:/.test(this.getValue())?(alert(c.invalidValue),!1):this.getDialog().fakeObj?!0:CKEDITOR.dialog.validate.notEmpty(b.noUrl).apply(this)},setup:function(a){this.allowOnChange=!1;a.url&&this.setValue(a.url.url);this.allowOnChange=!0},commit:function(a){this.onChange();a.url||(a.url={});a.url.url=this.getValue();this.allowOnChange=!1}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().show()}},{type:"button", +id:"browse",hidden:"true",filebrowser:"info:url",label:c.browseServer}]},{type:"vbox",id:"anchorOptions",width:260,align:"center",padding:0,children:[{type:"fieldset",id:"selectAnchorText",label:b.selectAnchor,setup:function(){d=l.getEditorAnchors(g);this.getElement()[d&&d.length?"show":"hide"]()},children:[{type:"hbox",id:"selectAnchor",children:[{type:"select",id:"anchorName","default":"",label:b.anchorName,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");if(d)for(var b= +0;b<d.length;b++)d[b].name&&this.add(d[b].name);a.anchor&&this.setValue(a.anchor.name);(a=this.getDialog().getContentElement("info","linkType"))&&"email"==a.getValue()&&this.focus()},commit:function(a){a.anchor||(a.anchor={});a.anchor.name=this.getValue()}},{type:"select",id:"anchorId","default":"",label:b.anchorId,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");if(d)for(var b=0;b<d.length;b++)d[b].id&&this.add(d[b].id);a.anchor&&this.setValue(a.anchor.id)},commit:function(a){a.anchor|| +(a.anchor={});a.anchor.id=this.getValue()}}],setup:function(){this.getElement()[d&&d.length?"show":"hide"]()}}]},{type:"html",id:"noAnchors",style:"text-align: center;",html:'<div role="note" tabIndex="-1">'+CKEDITOR.tools.htmlEncode(b.noAnchors)+"</div>",focus:!0,setup:function(){this.getElement()[d&&d.length?"hide":"show"]()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}},{type:"vbox",id:"emailOptions",padding:1,children:[{type:"text",id:"emailAddress", +label:b.emailAddress,required:!0,validate:function(){var a=this.getDialog();return!a.getContentElement("info","linkType")||"email"!=a.getValueOf("info","linkType")?!0:CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this)},setup:function(a){a.email&&this.setValue(a.email.address);(a=this.getDialog().getContentElement("info","linkType"))&&"email"==a.getValue()&&this.select()},commit:function(a){a.email||(a.email={});a.email.address=this.getValue()}},{type:"text",id:"emailSubject",label:b.emailSubject, +setup:function(a){a.email&&this.setValue(a.email.subject)},commit:function(a){a.email||(a.email={});a.email.subject=this.getValue()}},{type:"textarea",id:"emailBody",label:b.emailBody,rows:3,"default":"",setup:function(a){a.email&&this.setValue(a.email.body)},commit:function(a){a.email||(a.email={});a.email.body=this.getValue()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}}]},{id:"target",requiredContent:"a[target]",label:b.target,title:b.target, +elements:[{type:"hbox",widths:["50%","50%"],children:[{type:"select",id:"linkTargetType",label:c.target,"default":"notSet",style:"width : 100%;",items:[[c.notSet,"notSet"],[b.targetFrame,"frame"],[b.targetPopup,"popup"],[c.targetNew,"_blank"],[c.targetTop,"_top"],[c.targetSelf,"_self"],[c.targetParent,"_parent"]],onChange:m,setup:function(a){a.target&&this.setValue(a.target.type||"notSet");m.call(this)},commit:function(a){a.target||(a.target={});a.target.type=this.getValue()}},{type:"text",id:"linkTargetName", +label:b.targetFrameName,"default":"",setup:function(a){a.target&&this.setValue(a.target.name)},commit:function(a){a.target||(a.target={});a.target.name=this.getValue().replace(/\W/gi,"")}}]},{type:"vbox",width:"100%",align:"center",padding:2,id:"popupFeatures",children:[{type:"fieldset",label:b.popupFeatures,children:[{type:"hbox",children:[{type:"checkbox",id:"resizable",label:b.popupResizable,setup:f,commit:i},{type:"checkbox",id:"status",label:b.popupStatusBar,setup:f,commit:i}]},{type:"hbox", +children:[{type:"checkbox",id:"location",label:b.popupLocationBar,setup:f,commit:i},{type:"checkbox",id:"toolbar",label:b.popupToolbar,setup:f,commit:i}]},{type:"hbox",children:[{type:"checkbox",id:"menubar",label:b.popupMenuBar,setup:f,commit:i},{type:"checkbox",id:"fullscreen",label:b.popupFullScreen,setup:f,commit:i}]},{type:"hbox",children:[{type:"checkbox",id:"scrollbars",label:b.popupScrollBars,setup:f,commit:i},{type:"checkbox",id:"dependent",label:b.popupDependent,setup:f,commit:i}]},{type:"hbox", +children:[{type:"text",widths:["50%","50%"],labelLayout:"horizontal",label:c.width,id:"width",setup:f,commit:i},{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:b.popupLeft,id:"left",setup:f,commit:i}]},{type:"hbox",children:[{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:c.height,id:"height",setup:f,commit:i},{type:"text",labelLayout:"horizontal",label:b.popupTop,widths:["50%","50%"],id:"top",setup:f,commit:i}]}]}]}]},{id:"upload",label:b.upload,title:b.upload,hidden:!0, +filebrowser:"uploadButton",elements:[{type:"file",id:"upload",label:c.upload,style:"height:40px",size:29},{type:"fileButton",id:"uploadButton",label:c.uploadSubmit,filebrowser:"info:url","for":["upload","upload"]}]},{id:"advanced",label:b.advanced,title:b.advanced,elements:[{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",id:"advId",requiredContent:"a[id]",label:b.id,setup:h,commit:j},{type:"select",id:"advLangDir",requiredContent:"a[dir]",label:b.langDir, +"default":"",style:"width:110px",items:[[c.notSet,""],[b.langDirLTR,"ltr"],[b.langDirRTL,"rtl"]],setup:h,commit:j},{type:"text",id:"advAccessKey",requiredContent:"a[accesskey]",width:"80px",label:b.acccessKey,maxLength:1,setup:h,commit:j}]},{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",label:b.name,id:"advName",requiredContent:"a[name]",setup:h,commit:j},{type:"text",label:b.langCode,id:"advLangCode",requiredContent:"a[lang]",width:"110px","default":"",setup:h,commit:j},{type:"text", +label:b.tabIndex,id:"advTabIndex",requiredContent:"a[tabindex]",width:"80px",maxLength:5,setup:h,commit:j}]}]},{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.advisoryTitle,requiredContent:"a[title]","default":"",id:"advTitle",setup:h,commit:j},{type:"text",label:b.advisoryContentType,requiredContent:"a[type]","default":"",id:"advContentType",setup:h,commit:j}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.cssClasses,requiredContent:"a(cke-xyz)", +"default":"",id:"advCSSClasses",setup:h,commit:j},{type:"text",label:b.charset,requiredContent:"a[charset]","default":"",id:"advCharset",setup:h,commit:j}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.rel,requiredContent:"a[rel]","default":"",id:"advRel",setup:h,commit:j},{type:"text",label:b.styles,requiredContent:"a{cke-xyz}","default":"",id:"advStyles",validate:CKEDITOR.dialog.validate.inlineStyle(g.lang.common.invalidInlineStyle),setup:h,commit:j}]}]}]}],onShow:function(){var a= +this.getParentEditor(),b=a.getSelection(),c=null;(c=l.getSelectedLink(a))&&c.hasAttribute("href")?b.getSelectedElement()||b.selectElement(c):c=null;a=l.parseLinkAttributes(a,c);this._.selectedElement=c;this.setupContent(a)},onOk:function(){var a={};this.commitContent(a);var b=g.getSelection(),c=l.getLinkAttributes(g,a);if(this._.selectedElement){var e=this._.selectedElement,d=e.data("cke-saved-href"),f=e.getHtml();e.setAttributes(c.set);e.removeAttributes(c.removed);if(d==f||"email"==a.type&&-1!= +f.indexOf("@"))e.setHtml("email"==a.type?a.email.address:c.set["data-cke-saved-href"]),b.selectElement(e);delete this._.selectedElement}else b=b.getRanges()[0],b.collapsed&&(a=new CKEDITOR.dom.text("email"==a.type?a.email.address:c.set["data-cke-saved-href"],g.document),b.insertNode(a),b.selectNodeContents(a)),c=new CKEDITOR.style({element:"a",attributes:c.set}),c.type=CKEDITOR.STYLE_INLINE,c.applyToRange(b,g),b.select()},onLoad:function(){g.config.linkShowAdvancedTab||this.hidePage("advanced");g.config.linkShowTargetTab|| +this.hidePage("target")},onFocus:function(){var a=this.getContentElement("info","linkType");a&&"url"==a.getValue()&&(a=this.getContentElement("info","url"),a.select())}}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/link/images/anchor.png b/bower_components/ckeditor/plugins/link/images/anchor.png new file mode 100644 index 0000000..6d861a0 Binary files /dev/null and b/bower_components/ckeditor/plugins/link/images/anchor.png differ diff --git a/bower_components/ckeditor/plugins/link/images/hidpi/anchor.png b/bower_components/ckeditor/plugins/link/images/hidpi/anchor.png new file mode 100644 index 0000000..f504843 Binary files /dev/null and b/bower_components/ckeditor/plugins/link/images/hidpi/anchor.png differ diff --git a/bower_components/ckeditor/plugins/liststyle/dialogs/liststyle.js b/bower_components/ckeditor/plugins/liststyle/dialogs/liststyle.js new file mode 100644 index 0000000..eec0e97 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/dialogs/liststyle.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function d(c,d){var b;try{b=c.getSelection().getRanges()[0]}catch(f){return null}b.shrink(CKEDITOR.SHRINK_TEXT);return c.elementPath(b.getCommonAncestor()).contains(d,1)}function e(c,e){var b=c.lang.liststyle;if("bulletedListStyle"==e)return{title:b.bulletedTitle,minWidth:300,minHeight:50,contents:[{id:"info",accessKey:"I",elements:[{type:"select",label:b.type,id:"type",align:"center",style:"width:150px",items:[[b.notset,""],[b.circle,"circle"],[b.disc,"disc"],[b.square,"square"]],setup:function(a){this.setValue(a.getStyle("list-style-type")|| +h[a.getAttribute("type")]||a.getAttribute("type")||"")},commit:function(a){var b=this.getValue();b?a.setStyle("list-style-type",b):a.removeStyle("list-style-type")}}]}],onShow:function(){var a=this.getParentEditor();(a=d(a,"ul"))&&this.setupContent(a)},onOk:function(){var a=this.getParentEditor();(a=d(a,"ul"))&&this.commitContent(a)}};if("numberedListStyle"==e){var g=[[b.notset,""],[b.lowerRoman,"lower-roman"],[b.upperRoman,"upper-roman"],[b.lowerAlpha,"lower-alpha"],[b.upperAlpha,"upper-alpha"], +[b.decimal,"decimal"]];(!CKEDITOR.env.ie||7<CKEDITOR.env.version)&&g.concat([[b.armenian,"armenian"],[b.decimalLeadingZero,"decimal-leading-zero"],[b.georgian,"georgian"],[b.lowerGreek,"lower-greek"]]);return{title:b.numberedTitle,minWidth:300,minHeight:50,contents:[{id:"info",accessKey:"I",elements:[{type:"hbox",widths:["25%","75%"],children:[{label:b.start,type:"text",id:"start",validate:CKEDITOR.dialog.validate.integer(b.validateStartNumber),setup:function(a){this.setValue(a.getFirst(f).getAttribute("value")|| +a.getAttribute("start")||1)},commit:function(a){var b=a.getFirst(f),c=b.getAttribute("value")||a.getAttribute("start")||1;a.getFirst(f).removeAttribute("value");var d=parseInt(this.getValue(),10);isNaN(d)?a.removeAttribute("start"):a.setAttribute("start",d);a=b;b=c;for(d=isNaN(d)?1:d;(a=a.getNext(f))&&b++;)a.getAttribute("value")==b&&a.setAttribute("value",d+b-c)}},{type:"select",label:b.type,id:"type",style:"width: 100%;",items:g,setup:function(a){this.setValue(a.getStyle("list-style-type")||h[a.getAttribute("type")]|| +a.getAttribute("type")||"")},commit:function(a){var b=this.getValue();b?a.setStyle("list-style-type",b):a.removeStyle("list-style-type")}}]}]}],onShow:function(){var a=this.getParentEditor();(a=d(a,"ol"))&&this.setupContent(a)},onOk:function(){var a=this.getParentEditor();(a=d(a,"ol"))&&this.commitContent(a)}}}}var f=function(c){return c.type==CKEDITOR.NODE_ELEMENT&&c.is("li")},h={a:"lower-alpha",A:"upper-alpha",i:"lower-roman",I:"upper-roman",1:"decimal",disc:"disc",circle:"circle",square:"square"}; +CKEDITOR.dialog.add("numberedListStyle",function(c){return e(c,"numberedListStyle")});CKEDITOR.dialog.add("bulletedListStyle",function(c){return e(c,"bulletedListStyle")})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/af.js b/bower_components/ckeditor/plugins/liststyle/lang/af.js new file mode 100644 index 0000000..972e936 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/af.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","af",{armenian:"Armeense nommering",bulletedTitle:"Eienskappe van ongenommerde lys",circle:"Sirkel",decimal:"Desimale syfers (1, 2, 3, ens.)",decimalLeadingZero:"Desimale syfers met voorloopnul (01, 02, 03, ens.)",disc:"Skyf",georgian:"Georgiese nommering (an, ban, gan, ens.)",lowerAlpha:"Kleinletters (a, b, c, d, e, ens.)",lowerGreek:"Griekse kleinletters (alpha, beta, gamma, ens.)",lowerRoman:"Romeinse kleinletters (i, ii, iii, iv, v, ens.)",none:"Geen",notset:"<nie ingestel nie>", +numberedTitle:"Eienskappe van genommerde lys",square:"Vierkant",start:"Begin",type:"Tipe",upperAlpha:"Hoofletters (A, B, C, D, E, ens.)",upperRoman:"Romeinse hoofletters (I, II, III, IV, V, ens.)",validateStartNumber:"Beginnommer van lys moet 'n heelgetal wees."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/ar.js b/bower_components/ckeditor/plugins/liststyle/lang/ar.js new file mode 100644 index 0000000..72b9f52 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/ar.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","ar",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/bg.js b/bower_components/ckeditor/plugins/liststyle/lang/bg.js new file mode 100644 index 0000000..5cc312a --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/bg.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","bg",{armenian:"Арменско номериране",bulletedTitle:"Bulleted List Properties",circle:"Кръг",decimal:"Числа (1, 2, 3 и др.)",decimalLeadingZero:"Числа с водеща нула (01, 02, 03 и т.н.)",disc:"Диск",georgian:"Грузинско номериране (an, ban, gan, и т.н.)",lowerAlpha:"Малки букви (а, б, в, г, д и т.н.)",lowerGreek:"Малки гръцки букви (алфа, бета, гама и т.н.)",lowerRoman:"Малки римски числа (i, ii, iii, iv, v и т.н.)",none:"Няма",notset:"<не е указано>",numberedTitle:"Numbered List Properties", +square:"Квадрат",start:"Старт",type:"Тип",upperAlpha:"Големи букви (А, Б, В, Г, Д и т.н.)",upperRoman:"Големи римски числа (I, II, III, IV, V и т.н.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/bn.js b/bower_components/ckeditor/plugins/liststyle/lang/bn.js new file mode 100644 index 0000000..d002baf --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/bn.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","bn",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/bs.js b/bower_components/ckeditor/plugins/liststyle/lang/bs.js new file mode 100644 index 0000000..af72e35 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/bs.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","bs",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/ca.js b/bower_components/ckeditor/plugins/liststyle/lang/ca.js new file mode 100644 index 0000000..42455a3 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/ca.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","ca",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/cs.js b/bower_components/ckeditor/plugins/liststyle/lang/cs.js new file mode 100644 index 0000000..d3abb5c --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/cs.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","cs",{armenian:"Arménské",bulletedTitle:"Vlastnosti odrážek",circle:"Kroužky",decimal:"Arabská čísla (1, 2, 3, atd.)",decimalLeadingZero:"Arabská čísla uvozená nulou (01, 02, 03, atd.)",disc:"Kolečka",georgian:"Gruzínské (an, ban, gan, atd.)",lowerAlpha:"Malá latinka (a, b, c, d, e, atd.)",lowerGreek:"Malé řecké (alpha, beta, gamma, atd.)",lowerRoman:"Malé římské (i, ii, iii, iv, v, atd.)",none:"Nic",notset:"<nenastaveno>",numberedTitle:"Vlastnosti číslování", +square:"Čtverce",start:"Počátek",type:"Typ",upperAlpha:"Velká latinka (A, B, C, D, E, atd.)",upperRoman:"Velké římské (I, II, III, IV, V, atd.)",validateStartNumber:"Číslování musí začínat celým číslem."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/cy.js b/bower_components/ckeditor/plugins/liststyle/lang/cy.js new file mode 100644 index 0000000..a5d6cc5 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/cy.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","cy",{armenian:"Rhifo Armeneg",bulletedTitle:"Priodweddau Rhestr Fwled",circle:"Cylch",decimal:"Degol (1, 2, 3, ayyb.)",decimalLeadingZero:"Degol â sero arweiniol (01, 02, 03, ayyb.)",disc:"Disg",georgian:"Rhifau Sioraidd (an, ban, gan, ayyb.)",lowerAlpha:"Alffa Is (a, b, c, d, e, ayyb.)",lowerGreek:"Groeg Is (alpha, beta, gamma, ayyb.)",lowerRoman:"Rhufeinig Is (i, ii, iii, iv, v, ayyb.)",none:"Dim",notset:"<heb osod>",numberedTitle:"Priodweddau Rhestr Rifol", +square:"Sgwâr",start:"Dechrau",type:"Math",upperAlpha:"Alffa Uwch (A, B, C, D, E, ayyb.)",upperRoman:"Rhufeinig Uwch (I, II, III, IV, V, ayyb.)",validateStartNumber:"Rhaid bod y rhif cychwynnol yn gyfanrif."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/da.js b/bower_components/ckeditor/plugins/liststyle/lang/da.js new file mode 100644 index 0000000..d09c455 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/da.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","da",{armenian:"Armensk nummering",bulletedTitle:"Værdier for cirkelpunktopstilling",circle:"Cirkel",decimal:"Decimal (1, 2, 3, osv.)",decimalLeadingZero:"Decimaler med 0 først (01, 02, 03, etc.)",disc:"Værdier for diskpunktopstilling",georgian:"Georgiansk nummering (an, ban, gan, etc.)",lowerAlpha:"Små alfabet (a, b, c, d, e, etc.)",lowerGreek:"Små græsk (alpha, beta, gamma, etc.)",lowerRoman:"Små romerske (i, ii, iii, iv, v, etc.)",none:"Ingen",notset:"<ikke defineret>", +numberedTitle:"Egenskaber for nummereret liste",square:"Firkant",start:"Start",type:"Type",upperAlpha:"Store alfabet (A, B, C, D, E, etc.)",upperRoman:"Store romerske (I, II, III, IV, V, etc.)",validateStartNumber:"Den nummererede liste skal starte med et rundt nummer"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/de.js b/bower_components/ckeditor/plugins/liststyle/lang/de.js new file mode 100644 index 0000000..30038e8 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/de.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","de",{armenian:"Armenisch Nummerierung",bulletedTitle:"Listen-Eigenschaften",circle:"Ring",decimal:"Dezimal (1, 2, 3, etc.)",decimalLeadingZero:"Dezimal mit führende Null (01, 02, 03, etc.)",disc:"Kreis",georgian:"Georgisch Nummerierung (an, ban, gan, etc.)",lowerAlpha:"Klein alpha (a, b, c, d, e, etc.)",lowerGreek:"Klein griechisch (alpha, beta, gamma, etc.)",lowerRoman:"Klein römisch (i, ii, iii, iv, v, etc.)",none:"Keine",notset:"<nicht gesetzt>",numberedTitle:"Nummerierte Listen-Eigenschaften", +square:"Quadrat",start:"Start",type:"Typ",upperAlpha:"Groß alpha (A, B, C, D, E, etc.)",upperRoman:"Groß römisch (I, II, III, IV, V, etc.)",validateStartNumber:"List Startnummer muss eine ganze Zahl sein."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/el.js b/bower_components/ckeditor/plugins/liststyle/lang/el.js new file mode 100644 index 0000000..d077c8e --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/el.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","el",{armenian:"Αρμενική αρίθμηση",bulletedTitle:"Ιδιότητες Λίστας Σημείων",circle:"Κύκλος",decimal:"Δεκαδική (1, 2, 3, κτλ)",decimalLeadingZero:"Δεκαδική με αρχικό μηδεν (01, 02, 03, κτλ)",disc:"Δίσκος",georgian:"Γεωργιανή αρίθμηση (ა, ბ, გ, κτλ)",lowerAlpha:"Μικρά Λατινικά (a, b, c, d, e, κτλ.)",lowerGreek:"Μικρά Ελληνικά (α, β, γ, κτλ)",lowerRoman:"Μικρά Ρωμαϊκά (i, ii, iii, iv, v, κτλ)",none:"Καμία",notset:"<δεν έχει οριστεί>",numberedTitle:"Ιδιότητες Αριθμημένης Λίστας ", +square:"Τετράγωνο",start:"Εκκίνηση",type:"Τύπος",upperAlpha:"Κεφαλαία Λατινικά (A, B, C, D, E, κτλ)",upperRoman:"Κεφαλαία Ρωμαϊκά (I, II, III, IV, V, κτλ)",validateStartNumber:"Ο αριθμός εκκίνησης της αρίθμησης πρέπει να είναι ακέραιος αριθμός."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/en-au.js b/bower_components/ckeditor/plugins/liststyle/lang/en-au.js new file mode 100644 index 0000000..41e685f --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/en-au.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","en-au",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/en-ca.js b/bower_components/ckeditor/plugins/liststyle/lang/en-ca.js new file mode 100644 index 0000000..633ecd9 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/en-ca.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","en-ca",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/en-gb.js b/bower_components/ckeditor/plugins/liststyle/lang/en-gb.js new file mode 100644 index 0000000..6f1ca2a --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/en-gb.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","en-gb",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/en.js b/bower_components/ckeditor/plugins/liststyle/lang/en.js new file mode 100644 index 0000000..6bba5a2 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/en.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","en",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/eo.js b/bower_components/ckeditor/plugins/liststyle/lang/eo.js new file mode 100644 index 0000000..6ef97ac --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/eo.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","eo",{armenian:"Armena nombrado",bulletedTitle:"Atributoj de Bula Listo",circle:"Cirklo",decimal:"Dekumaj Nombroj (1, 2, 3, ktp.)",decimalLeadingZero:"Dekumaj Nombroj malantaŭ nulo (01, 02, 03, ktp.)",disc:"Disko",georgian:"Gruza nombrado (an, ban, gan, ktp.)",lowerAlpha:"Minusklaj Literoj (a, b, c, d, e, ktp.)",lowerGreek:"Grekaj Minusklaj Literoj (alpha, beta, gamma, ktp.)",lowerRoman:"Minusklaj Romanaj Nombroj (i, ii, iii, iv, v, ktp.)",none:"Neniu",notset:"<Defaŭlta>", +numberedTitle:"Atributoj de Numera Listo",square:"kvadrato",start:"Komenco",type:"Tipo",upperAlpha:"Majusklaj Literoj (A, B, C, D, E, ktp.)",upperRoman:"Majusklaj Romanaj Nombroj (I, II, III, IV, V, ktp.)",validateStartNumber:"La unua listero devas esti entjera nombro."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/es.js b/bower_components/ckeditor/plugins/liststyle/lang/es.js new file mode 100644 index 0000000..06ed01a --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/es.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","es",{armenian:"Numeración armenia",bulletedTitle:"Propiedades de viñetas",circle:"Círculo",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal con cero inicial (01, 02, 03, etc.)",disc:"Disco",georgian:"Numeración georgiana (an, ban, gan, etc.)",lowerAlpha:"Alfabeto en minúsculas (a, b, c, d, e, etc.)",lowerGreek:"Letras griegas (alpha, beta, gamma, etc.)",lowerRoman:"Números romanos en minúsculas (i, ii, iii, iv, v, etc.)",none:"Ninguno",notset:"<sin establecer>", +numberedTitle:"Propiedades de lista numerada",square:"Cuadrado",start:"Inicio",type:"Tipo",upperAlpha:"Alfabeto en mayúsculas (A, B, C, D, E, etc.)",upperRoman:"Números romanos en mayúsculas (I, II, III, IV, V, etc.)",validateStartNumber:"El Inicio debe ser un número entero."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/et.js b/bower_components/ckeditor/plugins/liststyle/lang/et.js new file mode 100644 index 0000000..9212207 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/et.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","et",{armenian:"Armeenia numbrid",bulletedTitle:"Punktloendi omadused",circle:"Ring",decimal:"Numbrid (1, 2, 3, jne)",decimalLeadingZero:"Numbrid algusnulliga (01, 02, 03, jne)",disc:"Täpp",georgian:"Gruusia numbrid (an, ban, gan, jne)",lowerAlpha:"Väiketähed (a, b, c, d, e, jne)",lowerGreek:"Kreeka väiketähed (alpha, beta, gamma, jne)",lowerRoman:"Väiksed rooma numbrid (i, ii, iii, iv, v, jne)",none:"Puudub",notset:"<pole määratud>",numberedTitle:"Numberloendi omadused", +square:"Ruut",start:"Algus",type:"Liik",upperAlpha:"Suurtähed (A, B, C, D, E, jne)",upperRoman:"Suured rooma numbrid (I, II, III, IV, V, jne)",validateStartNumber:"Loendi algusnumber peab olema täisarv."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/eu.js b/bower_components/ckeditor/plugins/liststyle/lang/eu.js new file mode 100644 index 0000000..dc0d63a --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/eu.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","eu",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/fa.js b/bower_components/ckeditor/plugins/liststyle/lang/fa.js new file mode 100644 index 0000000..5a588c0 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/fa.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","fa",{armenian:"شماره‌گذاری ارمنی",bulletedTitle:"خصوصیات فهرست نقطه‌ای",circle:"دایره",decimal:"ده‌دهی (۱، ۲، ۳، ...)",decimalLeadingZero:"دهدهی همراه با صفر (۰۱، ۰۲، ۰۳، ...)",disc:"صفحه گرد",georgian:"شمارهگذاری گریگورین (an, ban, gan, etc.)",lowerAlpha:"پانویس الفبایی (a, b, c, d, e, etc.)",lowerGreek:"پانویس یونانی (alpha, beta, gamma, etc.)",lowerRoman:"پانویس رومی (i, ii, iii, iv, v, etc.)",none:"هیچ",notset:"<تنظیم نشده>",numberedTitle:"ویژگیهای فهرست شمارهدار", +square:"چهارگوش",start:"شروع",type:"نوع",upperAlpha:"بالانویس الفبایی (A, B, C, D, E, etc.)",upperRoman:"بالانویس رومی (I, II, III, IV, V, etc.)",validateStartNumber:"فهرست شماره شروع باید یک عدد صحیح باشد."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/fi.js b/bower_components/ckeditor/plugins/liststyle/lang/fi.js new file mode 100644 index 0000000..2e55ab9 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/fi.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","fi",{armenian:"Armeenialainen numerointi",bulletedTitle:"Numeroimattoman listan ominaisuudet",circle:"Ympyrä",decimal:"Desimaalit (1, 2, 3, jne.)",decimalLeadingZero:"Desimaalit, alussa nolla (01, 02, 03, jne.)",disc:"Levy",georgian:"Georgialainen numerointi (an, ban, gan, etc.)",lowerAlpha:"Pienet aakkoset (a, b, c, d, e, jne.)",lowerGreek:"Pienet kreikkalaiset (alpha, beta, gamma, jne.)",lowerRoman:"Pienet roomalaiset (i, ii, iii, iv, v, jne.)",none:"Ei mikään", +notset:"<ei asetettu>",numberedTitle:"Numeroidun listan ominaisuudet",square:"Neliö",start:"Alku",type:"Tyyppi",upperAlpha:"Isot aakkoset (A, B, C, D, E, jne.)",upperRoman:"Isot roomalaiset (I, II, III, IV, V, jne.)",validateStartNumber:"Listan ensimmäisen numeron tulee olla kokonaisluku."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/fo.js b/bower_components/ckeditor/plugins/liststyle/lang/fo.js new file mode 100644 index 0000000..c7861be --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/fo.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","fo",{armenian:"Armensk talskipan",bulletedTitle:"Eginleikar fyri lista við prikkum",circle:"Sirkul",decimal:"Vanlig tøl (1, 2, 3, etc.)",decimalLeadingZero:"Tøl við null frammanfyri (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgisk talskipan (an, ban, gan, osv.)",lowerAlpha:"Lítlir bókstavir (a, b, c, d, e, etc.)",lowerGreek:"Grikskt við lítlum (alpha, beta, gamma, etc.)",lowerRoman:"Lítil rómaratøl (i, ii, iii, iv, v, etc.)",none:"Einki",notset:"<ikki sett>", +numberedTitle:"Eginleikar fyri lista við tølum",square:"Fýrkantur",start:"Byrjan",type:"Slag",upperAlpha:"Stórir bókstavir (A, B, C, D, E, etc.)",upperRoman:"Stór rómaratøl (I, II, III, IV, V, etc.)",validateStartNumber:"Byrjunartalið fyri lista má vera eitt heiltal."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/fr-ca.js b/bower_components/ckeditor/plugins/liststyle/lang/fr-ca.js new file mode 100644 index 0000000..1c2925a --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/fr-ca.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","fr-ca",{armenian:"Numération arménienne",bulletedTitle:"Propriété de liste à puce",circle:"Cercle",decimal:"Décimal (1, 2, 3, etc.)",decimalLeadingZero:"Décimal avec zéro (01, 02, 03, etc.)",disc:"Disque",georgian:"Numération géorgienne (an, ban, gan, etc.)",lowerAlpha:"Alphabétique minuscule (a, b, c, d, e, etc.)",lowerGreek:"Grecque minuscule (alpha, beta, gamma, etc.)",lowerRoman:"Romain minuscule (i, ii, iii, iv, v, etc.)",none:"Aucun",notset:"<non défini>", +numberedTitle:"Propriété de la liste numérotée",square:"Carré",start:"Début",type:"Type",upperAlpha:"Alphabétique majuscule (A, B, C, D, E, etc.)",upperRoman:"Romain Majuscule (I, II, III, IV, V, etc.)",validateStartNumber:"Le numéro de début de liste doit être un entier."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/fr.js b/bower_components/ckeditor/plugins/liststyle/lang/fr.js new file mode 100644 index 0000000..a787f63 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/fr.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","fr",{armenian:"Numération arménienne",bulletedTitle:"Propriétés de la liste à puces",circle:"Cercle",decimal:"Décimal (1, 2, 3, etc.)",decimalLeadingZero:"Décimal précédé par un 0 (01, 02, 03, etc.)",disc:"Disque",georgian:"Numération géorgienne (an, ban, gan, etc.)",lowerAlpha:"Alphabétique minuscules (a, b, c, d, e, etc.)",lowerGreek:"Grec minuscule (alpha, beta, gamma, etc.)",lowerRoman:"Nombres romains minuscules (i, ii, iii, iv, v, etc.)",none:"Aucun",notset:"<Non défini>", +numberedTitle:"Propriétés de la liste numérotée",square:"Carré",start:"Début",type:"Type",upperAlpha:"Alphabétique majuscules (A, B, C, D, E, etc.)",upperRoman:"Nombres romains majuscules (I, II, III, IV, V, etc.)",validateStartNumber:"Le premier élément de la liste doit être un nombre entier."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/gl.js b/bower_components/ckeditor/plugins/liststyle/lang/gl.js new file mode 100644 index 0000000..f4e986f --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/gl.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","gl",{armenian:"Numeración armenia",bulletedTitle:"Propiedades da lista viñeteada",circle:"Circulo",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal con cero á esquerda (01, 02, 03, etc.)",disc:"Disc",georgian:"Numeración xeorxiana (an, ban, gan, etc.)",lowerAlpha:"Alfabeto en minúsculas (a, b, c, d, e, etc.)",lowerGreek:"Grego en minúsculas (alpha, beta, gamma, etc.)",lowerRoman:"Números romanos en minúsculas (i, ii, iii, iv, v, etc.)",none:"Ningún", +notset:"<sen estabelecer>",numberedTitle:"Propiedades da lista numerada",square:"Cadrado",start:"Inicio",type:"Tipo",upperAlpha:"Alfabeto en maiúsculas (A, B, C, D, E, etc.)",upperRoman:"Números romanos en maiúsculas (I, II, III, IV, V, etc.)",validateStartNumber:"O número de inicio da lista debe ser un número enteiro."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/gu.js b/bower_components/ckeditor/plugins/liststyle/lang/gu.js new file mode 100644 index 0000000..48995fb --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/gu.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","gu",{armenian:"અરમેનિયન આંકડા પદ્ધતિ",bulletedTitle:"બુલેટેડ લીસ્ટના ગુણ",circle:"વર્તુળ",decimal:"આંકડા (1, 2, 3, etc.)",decimalLeadingZero:"સુન્ય આગળ આંકડા (01, 02, 03, etc.)",disc:"ડિસ્ક",georgian:"ગેઓર્ગિયન આંકડા પદ્ધતિ (an, ban, gan, etc.)",lowerAlpha:"આલ્ફા નાના (a, b, c, d, e, etc.)",lowerGreek:"ગ્રીક નાના (alpha, beta, gamma, etc.)",lowerRoman:"રોમન નાના (i, ii, iii, iv, v, etc.)",none:"કસુ ",notset:"<સેટ નથી>",numberedTitle:"આંકડાના લીસ્ટના ગુણ",square:"ચોરસ", +start:"શરુ કરવું",type:"પ્રકાર",upperAlpha:"આલ્ફા મોટા (A, B, C, D, E, etc.)",upperRoman:"રોમન મોટા (I, II, III, IV, V, etc.)",validateStartNumber:"લીસ્ટના સરુઆતનો આંકડો પુરો હોવો જોઈએ."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/he.js b/bower_components/ckeditor/plugins/liststyle/lang/he.js new file mode 100644 index 0000000..ba74651 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/he.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","he",{armenian:"ספרות ארמניות",bulletedTitle:"תכונות רשימת תבליטים",circle:"עיגול ריק",decimal:"ספרות (1, 2, 3 וכו')",decimalLeadingZero:"ספרות עם 0 בהתחלה (01, 02, 03 וכו')",disc:"עיגול מלא",georgian:"ספרות גיאורגיות (an, ban, gan וכו')",lowerAlpha:"אותיות אנגליות קטנות (a, b, c, d, e וכו')",lowerGreek:"אותיות יווניות קטנות (alpha, beta, gamma וכו')",lowerRoman:"ספירה רומית באותיות קטנות (i, ii, iii, iv, v וכו')",none:"ללא",notset:"<לא נקבע>",numberedTitle:"תכונות רשימה ממוספרת", +square:"ריבוע",start:"תחילת מספור",type:"סוג",upperAlpha:"אותיות אנגליות גדולות (A, B, C, D, E וכו')",upperRoman:"ספירה רומיות באותיות גדולות (I, II, III, IV, V וכו')",validateStartNumber:"שדה תחילת המספור חייב להכיל מספר שלם."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/hi.js b/bower_components/ckeditor/plugins/liststyle/lang/hi.js new file mode 100644 index 0000000..23e5aff --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/hi.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","hi",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/hr.js b/bower_components/ckeditor/plugins/liststyle/lang/hr.js new file mode 100644 index 0000000..66a4796 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/hr.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","hr",{armenian:"Armenijska numeracija",bulletedTitle:"Svojstva liste",circle:"Krug",decimal:"Decimalna numeracija (1, 2, 3, itd.)",decimalLeadingZero:"Decimalna s vodećom nulom (01, 02, 03, itd)",disc:"Disk",georgian:"Gruzijska numeracija(an, ban, gan, etc.)",lowerAlpha:"Znakovi mala slova (a, b, c, d, e, itd.)",lowerGreek:"Grčka numeracija mala slova (alfa, beta, gama, itd).",lowerRoman:"Romanska numeracija mala slova (i, ii, iii, iv, v, itd.)",none:"Bez",notset:"<nije određen>", +numberedTitle:"Svojstva brojčane liste",square:"Kvadrat",start:"Početak",type:"Vrsta",upperAlpha:"Znakovi velika slova (A, B, C, D, E, itd.)",upperRoman:"Romanska numeracija velika slova (I, II, III, IV, V, itd.)",validateStartNumber:"Početak brojčane liste mora biti cijeli broj."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/hu.js b/bower_components/ckeditor/plugins/liststyle/lang/hu.js new file mode 100644 index 0000000..d37d441 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/hu.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","hu",{armenian:"Örmény számozás",bulletedTitle:"Pontozott lista tulajdonságai",circle:"Kör",decimal:"Arab számozás (1, 2, 3, stb.)",decimalLeadingZero:"Számozás bevezető nullákkal (01, 02, 03, stb.)",disc:"Korong",georgian:"Grúz számozás (an, ban, gan, stb.)",lowerAlpha:"Kisbetűs (a, b, c, d, e, stb.)",lowerGreek:"Görög (alpha, beta, gamma, stb.)",lowerRoman:"Római kisbetűs (i, ii, iii, iv, v, stb.)",none:"Nincs",notset:"<Nincs beállítva>",numberedTitle:"Sorszámozott lista tulajdonságai", +square:"Négyzet",start:"Kezdőszám",type:"Típus",upperAlpha:"Nagybetűs (A, B, C, D, E, stb.)",upperRoman:"Római nagybetűs (I, II, III, IV, V, stb.)",validateStartNumber:"A kezdőszám nem lehet tört érték."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/id.js b/bower_components/ckeditor/plugins/liststyle/lang/id.js new file mode 100644 index 0000000..65d4851 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/id.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","id",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Lingkaran",decimal:"Desimal (1, 2, 3, dst.)",decimalLeadingZero:"Desimal diawali angka nol (01, 02, 03, dst.)",disc:"Cakram",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Huruf Kecil (a, b, c, d, e, dst.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Angka Romawi (i, ii, iii, iv, v, dst.)",none:"Tidak ada",notset:"<tidak diatur>",numberedTitle:"Numbered List Properties", +square:"Persegi",start:"Mulai",type:"Tipe",upperAlpha:"Huruf Besar (A, B, C, D, E, dst.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/is.js b/bower_components/ckeditor/plugins/liststyle/lang/is.js new file mode 100644 index 0000000..3f8cd1a --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/is.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","is",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/it.js b/bower_components/ckeditor/plugins/liststyle/lang/it.js new file mode 100644 index 0000000..674c5e1 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/it.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","it",{armenian:"Numerazione Armena",bulletedTitle:"Proprietà liste puntate",circle:"Cerchio",decimal:"Decimale (1, 2, 3, ecc.)",decimalLeadingZero:"Decimale preceduto da 0 (01, 02, 03, ecc.)",disc:"Disco",georgian:"Numerazione Georgiana (an, ban, gan, ecc.)",lowerAlpha:"Alfabetico minuscolo (a, b, c, d, e, ecc.)",lowerGreek:"Greco minuscolo (alpha, beta, gamma, ecc.)",lowerRoman:"Numerazione Romana minuscola (i, ii, iii, iv, v, ecc.)",none:"Nessuno",notset:"<non impostato>", +numberedTitle:"Proprietà liste numerate",square:"Quadrato",start:"Inizio",type:"Tipo",upperAlpha:"Alfabetico maiuscolo (A, B, C, D, E, ecc.)",upperRoman:"Numerazione Romana maiuscola (I, II, III, IV, V, ecc.)",validateStartNumber:"Il numero di inizio di una lista numerata deve essere un numero intero."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/ja.js b/bower_components/ckeditor/plugins/liststyle/lang/ja.js new file mode 100644 index 0000000..934cc98 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/ja.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","ja",{armenian:"アルメニア数字",bulletedTitle:"箇条書きのプロパティ",circle:"白丸",decimal:"数字 (1, 2, 3, etc.)",decimalLeadingZero:"0付きの数字 (01, 02, 03, etc.)",disc:"黒丸",georgian:"グルジア数字 (an, ban, gan, etc.)",lowerAlpha:"小文字アルファベット (a, b, c, d, e, etc.)",lowerGreek:"小文字ギリシャ文字 (alpha, beta, gamma, etc.)",lowerRoman:"小文字ローマ数字 (i, ii, iii, iv, v, etc.)",none:"なし",notset:"<なし>",numberedTitle:"番号付きリストのプロパティ",square:"四角",start:"開始",type:"種類",upperAlpha:"大文字アルファベット (A, B, C, D, E, etc.)", +upperRoman:"大文字ローマ数字 (I, II, III, IV, V, etc.)",validateStartNumber:"リストの開始番号は数値で入力してください。"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/ka.js b/bower_components/ckeditor/plugins/liststyle/lang/ka.js new file mode 100644 index 0000000..f820e66 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/ka.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","ka",{armenian:"სომხური გადანომრვა",bulletedTitle:"ღილებიანი სიის პარამეტრები",circle:"წრეწირი",decimal:"რიცხვებით (1, 2, 3, ..)",decimalLeadingZero:"ნულით დაწყებული რიცხვებით (01, 02, 03, ..)",disc:"წრე",georgian:"ქართული გადანომრვა (ან, ბან, გან, ..)",lowerAlpha:"პატარა ლათინური ასოებით (a, b, c, d, e, ..)",lowerGreek:"პატარა ბერძნული ასოებით (ალფა, ბეტა, გამა, ..)",lowerRoman:"რომაული გადანომრვცა პატარა ციფრებით (i, ii, iii, iv, v, ..)",none:"არაფერი",notset:"<არაფერი>", +numberedTitle:"გადანომრილი სიის პარამეტრები",square:"კვადრატი",start:"საწყისი",type:"ტიპი",upperAlpha:"დიდი ლათინური ასოებით (A, B, C, D, E, ..)",upperRoman:"რომაული გადანომრვა დიდი ციფრებით (I, II, III, IV, V, etc.)",validateStartNumber:"სიის საწყისი მთელი რიცხვი უნდა იყოს."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/km.js b/bower_components/ckeditor/plugins/liststyle/lang/km.js new file mode 100644 index 0000000..181efe3 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/km.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","km",{armenian:"លេខ​អារមេនី",bulletedTitle:"លក្ខណៈ​សម្បត្តិ​បញ្ជី​ជា​ចំណុច",circle:"រង្វង់​មូល",decimal:"លេខ​ទសភាគ (1, 2, 3, ...)",decimalLeadingZero:"ទសភាគ​ចាប់​ផ្ដើម​ពី​សូន្យ (01, 02, 03, ...)",disc:"ថាស",georgian:"លេខ​ចចជា (an, ban, gan, ...)",lowerAlpha:"ព្យញ្ជនៈ​តូច (a, b, c, d, e, ...)",lowerGreek:"លេខ​ក្រិក​តូច (alpha, beta, gamma, ...)",lowerRoman:"លេខ​រ៉ូម៉ាំង​តូច (i, ii, iii, iv, v, ...)",none:"គ្មាន",notset:"<not set>",numberedTitle:"លក្ខណៈ​សម្បត្តិ​បញ្ជី​ជា​លេខ", +square:"ការេ",start:"ចាប់​ផ្ដើម",type:"ប្រភេទ",upperAlpha:"អក្សរ​ធំ (A, B, C, D, E, ...)",upperRoman:"លេខ​រ៉ូម៉ាំង​ធំ (I, II, III, IV, V, ...)",validateStartNumber:"លេខ​ចាប់​ផ្ដើម​បញ្ជី ត្រូវ​តែ​ជា​តួ​លេខ​ពិត​ប្រាកដ។"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/ko.js b/bower_components/ckeditor/plugins/liststyle/lang/ko.js new file mode 100644 index 0000000..1be0697 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/ko.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","ko",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/ku.js b/bower_components/ckeditor/plugins/liststyle/lang/ku.js new file mode 100644 index 0000000..ccb7e19 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/ku.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","ku",{armenian:"ئاراستەی ژمارەی ئەرمەنی",bulletedTitle:"خاسیەتی لیستی خاڵی",circle:"بازنه",decimal:"ژمارە (1, 2, 3, وە هیتر.)",decimalLeadingZero:"ژمارە سفڕی لەپێشەوه (01, 02, 03, وە هیتر.)",disc:"پەپکە",georgian:"ئاراستەی ژمارەی جۆڕجی (an, ban, gan, وە هیتر.)",lowerAlpha:"ئەلفابێی بچووك (a, b, c, d, e, وە هیتر.)",lowerGreek:"یۆنانی بچووك (alpha, beta, gamma, وە هیتر.)",lowerRoman:"ژمارەی ڕۆمی بچووك (i, ii, iii, iv, v, وە هیتر.)",none:"هیچ",notset:"<دانەندراوه>", +numberedTitle:"خاسیەتی لیستی ژمارەیی",square:"چووراگۆشە",start:"دەستپێکردن",type:"جۆر",upperAlpha:"ئەلفابێی گەوره (A, B, C, D, E, وە هیتر.)",upperRoman:"ژمارەی ڕۆمی گەوره (I, II, III, IV, V, وە هیتر.)",validateStartNumber:"دەستپێکەری لیستی ژمارەیی دەبێت تەنها ژمارە بێت."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/lt.js b/bower_components/ckeditor/plugins/liststyle/lang/lt.js new file mode 100644 index 0000000..c563c96 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/lt.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","lt",{armenian:"Armėniški skaitmenys",bulletedTitle:"Ženklelinio sąrašo nustatymai",circle:"Apskritimas",decimal:"Dešimtainis (1, 2, 3, t.t)",decimalLeadingZero:"Dešimtainis su nuliu priekyje (01, 02, 03, t.t)",disc:"Diskas",georgian:"Gruziniški skaitmenys (an, ban, gan, t.t)",lowerAlpha:"Mažosios Alpha (a, b, c, d, e, t.t)",lowerGreek:"Mažosios Graikų (alpha, beta, gamma, t.t)",lowerRoman:"Mažosios Romėnų (i, ii, iii, iv, v, t.t)",none:"Niekas",notset:"<nenurodytas>", +numberedTitle:"Skaitmeninio sąrašo nustatymai",square:"Kvadratas",start:"Pradžia",type:"Rūšis",upperAlpha:"Didžiosios Alpha (A, B, C, D, E, t.t)",upperRoman:"Didžiosios Romėnų (I, II, III, IV, V, t.t)",validateStartNumber:"Sąrašo pradžios skaitmuo turi būti sveikas skaičius."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/lv.js b/bower_components/ckeditor/plugins/liststyle/lang/lv.js new file mode 100644 index 0000000..94c4188 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/lv.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","lv",{armenian:"Armēņu skaitļi",bulletedTitle:"Vienkārša saraksta uzstādījumi",circle:"Aplis",decimal:"Decimālie (1, 2, 3, utt)",decimalLeadingZero:"Decimālie ar nulli (01, 02, 03, utt)",disc:"Disks",georgian:"Gruzīņu skaitļi (an, ban, gan, utt)",lowerAlpha:"Mazie alfabēta (a, b, c, d, e, utt)",lowerGreek:"Mazie grieķu (alfa, beta, gamma, utt)",lowerRoman:"Mazie romāņu (i, ii, iii, iv, v, utt)",none:"Nekas",notset:"<nav norādīts>",numberedTitle:"Numurēta saraksta uzstādījumi", +square:"Kvadrāts",start:"Sākt",type:"Tips",upperAlpha:"Lielie alfabēta (A, B, C, D, E, utt)",upperRoman:"Lielie romāņu (I, II, III, IV, V, utt)",validateStartNumber:"Saraksta sākuma numuram jābūt veselam skaitlim"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/mk.js b/bower_components/ckeditor/plugins/liststyle/lang/mk.js new file mode 100644 index 0000000..3696621 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/mk.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","mk",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/mn.js b/bower_components/ckeditor/plugins/liststyle/lang/mn.js new file mode 100644 index 0000000..895d754 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/mn.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","mn",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Төрөл",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/ms.js b/bower_components/ckeditor/plugins/liststyle/lang/ms.js new file mode 100644 index 0000000..ffe91b8 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/ms.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","ms",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/nb.js b/bower_components/ckeditor/plugins/liststyle/lang/nb.js new file mode 100644 index 0000000..cd9b38d --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/nb.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","nb",{armenian:"Armensk nummerering",bulletedTitle:"Egenskaper for punktmerket liste",circle:"Sirkel",decimal:"Tall (1, 2, 3, osv.)",decimalLeadingZero:"Tall, med førstesiffer null (01, 02, 03, osv.)",disc:"Disk",georgian:"Georgisk nummerering (an, ban, gan, osv.)",lowerAlpha:"Alfabetisk, små (a, b, c, d, e, osv.)",lowerGreek:"Gresk, små (alpha, beta, gamma, osv.)",lowerRoman:"Romertall, små (i, ii, iii, iv, v, osv.)",none:"Ingen",notset:"<ikke satt>",numberedTitle:"Egenskaper for nummerert liste", +square:"Firkant",start:"Start",type:"Type",upperAlpha:"Alfabetisk, store (A, B, C, D, E, osv.)",upperRoman:"Romertall, store (I, II, III, IV, V, osv.)",validateStartNumber:"Starten på listen må være et heltall."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/nl.js b/bower_components/ckeditor/plugins/liststyle/lang/nl.js new file mode 100644 index 0000000..4fc950a --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/nl.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","nl",{armenian:"Armeense nummering",bulletedTitle:"Eigenschappen lijst met opsommingstekens",circle:"Cirkel",decimal:"Cijfers (1, 2, 3, etc.)",decimalLeadingZero:"Cijfers beginnen met nul (01, 02, 03, etc.)",disc:"Schijf",georgian:"Georgische nummering (an, ban, gan, etc.)",lowerAlpha:"Kleine letters (a, b, c, d, e, etc.)",lowerGreek:"Grieks kleine letters (alpha, beta, gamma, etc.)",lowerRoman:"Romeins kleine letters (i, ii, iii, iv, v, etc.)",none:"Geen",notset:"<niet gezet>", +numberedTitle:"Eigenschappen genummerde lijst",square:"Vierkant",start:"Start",type:"Type",upperAlpha:"Hoofdletters (A, B, C, D, E, etc.)",upperRoman:"Romeinse hoofdletters (I, II, III, IV, V, etc.)",validateStartNumber:"Startnummer van de lijst moet een heel nummer zijn."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/no.js b/bower_components/ckeditor/plugins/liststyle/lang/no.js new file mode 100644 index 0000000..f753bd6 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/no.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","no",{armenian:"Armensk nummerering",bulletedTitle:"Egenskaper for punktmerket liste",circle:"Sirkel",decimal:"Tall (1, 2, 3, osv.)",decimalLeadingZero:"Tall, med førstesiffer null (01, 02, 03, osv.)",disc:"Disk",georgian:"Georgisk nummerering (an, ban, gan, osv.)",lowerAlpha:"Alfabetisk, små (a, b, c, d, e, osv.)",lowerGreek:"Gresk, små (alpha, beta, gamma, osv.)",lowerRoman:"Romertall, små (i, ii, iii, iv, v, osv.)",none:"Ingen",notset:"<ikke satt>",numberedTitle:"Egenskaper for nummerert liste", +square:"Firkant",start:"Start",type:"Type",upperAlpha:"Alfabetisk, store (A, B, C, D, E, osv.)",upperRoman:"Romertall, store (I, II, III, IV, V, osv.)",validateStartNumber:"Starten på listen må være et heltall."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/pl.js b/bower_components/ckeditor/plugins/liststyle/lang/pl.js new file mode 100644 index 0000000..85da585 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/pl.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","pl",{armenian:"Numerowanie armeńskie",bulletedTitle:"Właściwości list wypunktowanych",circle:"Koło",decimal:"Liczby (1, 2, 3 itd.)",decimalLeadingZero:"Liczby z początkowym zerem (01, 02, 03 itd.)",disc:"Okrąg",georgian:"Numerowanie gruzińskie (an, ban, gan itd.)",lowerAlpha:"Małe litery (a, b, c, d, e itd.)",lowerGreek:"Małe litery greckie (alpha, beta, gamma itd.)",lowerRoman:"Małe cyfry rzymskie (i, ii, iii, iv, v itd.)",none:"Brak",notset:"<nie ustawiono>", +numberedTitle:"Właściwości list numerowanych",square:"Kwadrat",start:"Początek",type:"Typ punktora",upperAlpha:"Duże litery (A, B, C, D, E itd.)",upperRoman:"Duże cyfry rzymskie (I, II, III, IV, V itd.)",validateStartNumber:"Listę musi rozpoczynać liczba całkowita."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/pt-br.js b/bower_components/ckeditor/plugins/liststyle/lang/pt-br.js new file mode 100644 index 0000000..190c893 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/pt-br.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","pt-br",{armenian:"Numeração Armêna",bulletedTitle:"Propriedades da Lista sem Numeros",circle:"Círculo",decimal:"Numeração Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Numeração Decimal com zeros (01, 02, 03, etc.)",disc:"Disco",georgian:"Numeração da Geórgia (an, ban, gan, etc.)",lowerAlpha:"Numeração Alfabética minúscula (a, b, c, d, e, etc.)",lowerGreek:"Numeração Grega minúscula (alpha, beta, gamma, etc.)",lowerRoman:"Numeração Romana minúscula (i, ii, iii, iv, v, etc.)", +none:"Nenhum",notset:"<não definido>",numberedTitle:"Propriedades da Lista Numerada",square:"Quadrado",start:"Início",type:"Tipo",upperAlpha:"Numeração Alfabética Maiúscula (A, B, C, D, E, etc.)",upperRoman:"Numeração Romana maiúscula (I, II, III, IV, V, etc.)",validateStartNumber:"O número inicial da lista deve ser um número inteiro."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/pt.js b/bower_components/ckeditor/plugins/liststyle/lang/pt.js new file mode 100644 index 0000000..2b0f85a --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/pt.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","pt",{armenian:"Numeração armênia",bulletedTitle:"Bulleted List Properties",circle:"Círculo",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disco",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"Nenhum",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Quadrado",start:"Iniciar",type:"Tipo",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/ro.js b/bower_components/ckeditor/plugins/liststyle/lang/ro.js new file mode 100644 index 0000000..d76923b --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/ro.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","ro",{armenian:"Numerotare armeniană",bulletedTitle:"Proprietățile listei cu simboluri",circle:"Cerc",decimal:"Decimale (1, 2, 3, etc.)",decimalLeadingZero:"Decimale cu zero în față (01, 02, 03, etc.)",disc:"Disc",georgian:"Numerotare georgiană (an, ban, gan, etc.)",lowerAlpha:"Litere mici (a, b, c, d, e, etc.)",lowerGreek:"Litere grecești mici (alpha, beta, gamma, etc.)",lowerRoman:"Cifre romane mici (i, ii, iii, iv, v, etc.)",none:"Nimic",notset:"<nesetat>", +numberedTitle:"Proprietățile listei numerotate",square:"Pătrat",start:"Start",type:"Tip",upperAlpha:"Litere mari (A, B, C, D, E, etc.)",upperRoman:"Cifre romane mari (I, II, III, IV, V, etc.)",validateStartNumber:"Începutul listei trebuie să fie un număr întreg."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/ru.js b/bower_components/ckeditor/plugins/liststyle/lang/ru.js new file mode 100644 index 0000000..421fd60 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/ru.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","ru",{armenian:"Армянская нумерация",bulletedTitle:"Свойства маркированного списка",circle:"Круг",decimal:"Десятичные (1, 2, 3, и т.д.)",decimalLeadingZero:"Десятичные с ведущим нулём (01, 02, 03, и т.д.)",disc:"Окружность",georgian:"Грузинская нумерация (ани, бани, гани, и т.д.)",lowerAlpha:"Строчные латинские (a, b, c, d, e, и т.д.)",lowerGreek:"Строчные греческие (альфа, бета, гамма, и т.д.)",lowerRoman:"Строчные римские (i, ii, iii, iv, v, и т.д.)",none:"Нет", +notset:"<не указано>",numberedTitle:"Свойства нумерованного списка",square:"Квадрат",start:"Начиная с",type:"Тип",upperAlpha:"Заглавные латинские (A, B, C, D, E, и т.д.)",upperRoman:"Заглавные римские (I, II, III, IV, V, и т.д.)",validateStartNumber:"Первый номер списка должен быть задан обычным целым числом."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/si.js b/bower_components/ckeditor/plugins/liststyle/lang/si.js new file mode 100644 index 0000000..c2253a5 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/si.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","si",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"කිසිවක්ම නොවේ",notset:"<යොදා >",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"වර්ගය",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/sk.js b/bower_components/ckeditor/plugins/liststyle/lang/sk.js new file mode 100644 index 0000000..817dab0 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/sk.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","sk",{armenian:"Arménske číslovanie",bulletedTitle:"Vlastnosti odrážkového zoznamu",circle:"Kruh",decimal:"Číselné (1, 2, 3, atď.)",decimalLeadingZero:"Číselné s nulou (01, 02, 03, atď.)",disc:"Disk",georgian:"Gregoriánske číslovanie (an, ban, gan, atď.)",lowerAlpha:"Malé latinské (a, b, c, d, e, atď.)",lowerGreek:"Malé grécke (alfa, beta, gama, atď.)",lowerRoman:"Malé rímske (i, ii, iii, iv, v, atď.)",none:"Nič",notset:"<nenastavené>",numberedTitle:"Vlastnosti číselného zoznamu", +square:"Štvorec",start:"Začiatok",type:"Typ",upperAlpha:"Veľké latinské (A, B, C, D, E, atď.)",upperRoman:"Veľké rímske (I, II, III, IV, V, atď.)",validateStartNumber:"Začiatočné číslo číselného zoznamu musí byť celé číslo."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/sl.js b/bower_components/ckeditor/plugins/liststyle/lang/sl.js new file mode 100644 index 0000000..f147fe2 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/sl.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","sl",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/sq.js b/bower_components/ckeditor/plugins/liststyle/lang/sq.js new file mode 100644 index 0000000..586b7d4 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/sq.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","sq",{armenian:"Numërim armenian",bulletedTitle:"Karakteristikat e Listës me Pulla",circle:"Rreth",decimal:"Decimal (1, 2, 3, etj.)",decimalLeadingZero:"Decimal me zerro udhëheqëse (01, 02, 03, etj.)",disc:"Disk",georgian:"Numërim gjeorgjian (an, ban, gan, etj.)",lowerAlpha:"Të vogla alfa (a, b, c, d, e, etj.)",lowerGreek:"Të vogla greke (alpha, beta, gamma, etj.)",lowerRoman:"Të vogla romake (i, ii, iii, iv, v, etj.)",none:"Asnjë",notset:"<e pazgjedhur>",numberedTitle:"Karakteristikat e Listës me Numra", +square:"Katror",start:"Fillimi",type:"LLoji",upperAlpha:"Të mëdha alfa (A, B, C, D, E, etj.)",upperRoman:"Të mëdha romake (I, II, III, IV, V, etj.)",validateStartNumber:"Numri i fillimit të listës duhet të është numër i plotë."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/sr-latn.js b/bower_components/ckeditor/plugins/liststyle/lang/sr-latn.js new file mode 100644 index 0000000..df10d83 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/sr-latn.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","sr-latn",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/sr.js b/bower_components/ckeditor/plugins/liststyle/lang/sr.js new file mode 100644 index 0000000..1864935 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/sr.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","sr",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/sv.js b/bower_components/ckeditor/plugins/liststyle/lang/sv.js new file mode 100644 index 0000000..8a5f939 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/sv.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","sv",{armenian:"Armenisk numrering",bulletedTitle:"Egenskaper för punktlista",circle:"Cirkel",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal nolla (01, 02, 03, etc.)",disc:"Disk",georgian:"Georgisk numrering (an, ban, gan, etc.)",lowerAlpha:"Alpha gemener (a, b, c, d, e, etc.)",lowerGreek:"Grekiska gemener (alpha, beta, gamma, etc.)",lowerRoman:"Romerska gemener (i, ii, iii, iv, v, etc.)",none:"Ingen",notset:"<ej angiven>",numberedTitle:"Egenskaper för punktlista", +square:"Fyrkant",start:"Start",type:"Typ",upperAlpha:"Alpha versaler (A, B, C, D, E, etc.)",upperRoman:"Romerska versaler (I, II, III, IV, V, etc.)",validateStartNumber:"Listans startnummer måste vara ett heltal."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/th.js b/bower_components/ckeditor/plugins/liststyle/lang/th.js new file mode 100644 index 0000000..7ffb3eb --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/th.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","th",{armenian:"Armenian numbering",bulletedTitle:"Bulleted List Properties",circle:"Circle",decimal:"Decimal (1, 2, 3, etc.)",decimalLeadingZero:"Decimal leading zero (01, 02, 03, etc.)",disc:"Disc",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"None",notset:"<not set>",numberedTitle:"Numbered List Properties", +square:"Square",start:"Start",type:"Type",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/tr.js b/bower_components/ckeditor/plugins/liststyle/lang/tr.js new file mode 100644 index 0000000..a19f7c7 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/tr.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","tr",{armenian:"Ermenice sayılandırma",bulletedTitle:"Simgeli Liste Özellikleri",circle:"Daire",decimal:"Ondalık (1, 2, 3, vs.)",decimalLeadingZero:"Başı sıfırlı ondalık (01, 02, 03, vs.)",disc:"Disk",georgian:"Gürcüce numaralandırma (an, ban, gan, vs.)",lowerAlpha:"Küçük Alpha (a, b, c, d, e, vs.)",lowerGreek:"Küçük Greek (alpha, beta, gamma, vs.)",lowerRoman:"Küçük Roman (i, ii, iii, iv, v, vs.)",none:"Yok",notset:"<ayarlanmamış>",numberedTitle:"Sayılandırılmış Liste Özellikleri", +square:"Kare",start:"Başla",type:"Tipi",upperAlpha:"Büyük Alpha (A, B, C, D, E, vs.)",upperRoman:"Büyük Roman (I, II, III, IV, V, vs.)",validateStartNumber:"Liste başlangıcı tam sayı olmalıdır."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/tt.js b/bower_components/ckeditor/plugins/liststyle/lang/tt.js new file mode 100644 index 0000000..c3bb3cd --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/tt.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","tt",{armenian:"Әрмән номерлавы",bulletedTitle:"Маркерлы тезмә үзлекләре",circle:"Түгәрәк",decimal:"Унарлы (1, 2, 3, ...)",decimalLeadingZero:"Ноль белән башланган унарлы (01, 02, 03, ...)",disc:"Диск",georgian:"Georgian numbering (an, ban, gan, etc.)",lowerAlpha:"Lower Alpha (a, b, c, d, e, etc.)",lowerGreek:"Lower Greek (alpha, beta, gamma, etc.)",lowerRoman:"Lower Roman (i, ii, iii, iv, v, etc.)",none:"Һичбер",notset:"<билгеләнмәгән>",numberedTitle:"Номерлы тезмә үзлекләре", +square:"Шакмак",start:"Башлау",type:"Төр",upperAlpha:"Upper Alpha (A, B, C, D, E, etc.)",upperRoman:"Upper Roman (I, II, III, IV, V, etc.)",validateStartNumber:"List start number must be a whole number."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/ug.js b/bower_components/ckeditor/plugins/liststyle/lang/ug.js new file mode 100644 index 0000000..d278f60 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/ug.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","ug",{armenian:"قەدىمكى ئەرمىنىيە تەرتىپ نومۇرى شەكلى",bulletedTitle:"تۈر بەلگە تىزىم خاسلىقى",circle:"بوش چەمبەر",decimal:"سان (1, 2, 3 قاتارلىق)",decimalLeadingZero:"نۆلدىن باشلانغان سان بەلگە (01, 02, 03 قاتارلىق)",disc:"تولدۇرۇلغان چەمبەر",georgian:"قەدىمكى جورجىيە تەرتىپ نومۇرى شەكلى (an, ban, gan قاتارلىق)",lowerAlpha:"ئىنگلىزچە كىچىك ھەرپ (a, b, c, d, e قاتارلىق)",lowerGreek:"گرېكچە كىچىك ھەرپ (alpha, beta, gamma قاتارلىق)",lowerRoman:"كىچىك ھەرپلىك رىم رەقىمى (i, ii, iii, iv, v قاتارلىق)", +none:"بەلگە يوق",notset:"‹تەڭشەلمىگەن›",numberedTitle:"تەرتىپ نومۇر تىزىم خاسلىقى",square:"تولدۇرۇلغان تۆت چاسا",start:"باشلىنىش نومۇرى",type:"بەلگە تىپى",upperAlpha:"ئىنگلىزچە چوڭ ھەرپ (A, B, C, D, E قاتارلىق)",upperRoman:"چوڭ ھەرپلىك رىم رەقىمى (I, II, III, IV, V قاتارلىق)",validateStartNumber:"تىزىم باشلىنىش تەرتىپ نومۇرى چوقۇم پۈتۈن سان پىچىمىدا بولۇشى لازىم"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/uk.js b/bower_components/ckeditor/plugins/liststyle/lang/uk.js new file mode 100644 index 0000000..de57711 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/uk.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","uk",{armenian:"Вірменська нумерація",bulletedTitle:"Опції маркованого списку",circle:"Кільце",decimal:"Десяткові (1, 2, 3 і т.д.)",decimalLeadingZero:"Десяткові з нулем (01, 02, 03 і т.д.)",disc:"Кружечок",georgian:"Грузинська нумерація (an, ban, gan і т.д.)",lowerAlpha:"Малі лат. букви (a, b, c, d, e і т.д.)",lowerGreek:"Малі гр. букви (альфа, бета, гамма і т.д.)",lowerRoman:"Малі римські (i, ii, iii, iv, v і т.д.)",none:"Нема",notset:"<не вказано>",numberedTitle:"Опції нумерованого списку", +square:"Квадратик",start:"Почати з...",type:"Тип",upperAlpha:"Великі лат. букви (A, B, C, D, E і т.д.)",upperRoman:"Великі римські (I, II, III, IV, V і т.д.)",validateStartNumber:"Початковий номер списку повинен бути цілим числом."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/vi.js b/bower_components/ckeditor/plugins/liststyle/lang/vi.js new file mode 100644 index 0000000..bd56db2 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/vi.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","vi",{armenian:"Số theo kiểu Armenian",bulletedTitle:"Thuộc tính danh sách không thứ tự",circle:"Khuyên tròn",decimal:"Kiểu số (1, 2, 3 ...)",decimalLeadingZero:"Kiểu số (01, 02, 03...)",disc:"Hình đĩa",georgian:"Số theo kiểu Georgian (an, ban, gan...)",lowerAlpha:"Kiểu abc thường (a, b, c, d, e...)",lowerGreek:"Kiểu Hy Lạp (alpha, beta, gamma...)",lowerRoman:"Số La Mã kiểu thường (i, ii, iii, iv, v...)",none:"Không gì cả",notset:"<không thiết lập>",numberedTitle:"Thuộc tính danh sách có thứ tự", +square:"Hình vuông",start:"Bắt đầu",type:"Kiểu loại",upperAlpha:"Kiểu ABC HOA (A, B, C, D, E...)",upperRoman:"Số La Mã kiểu HOA (I, II, III, IV, V...)",validateStartNumber:"Số bắt đầu danh sách phải là một số nguyên."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/zh-cn.js b/bower_components/ckeditor/plugins/liststyle/lang/zh-cn.js new file mode 100644 index 0000000..a27132c --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/zh-cn.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","zh-cn",{armenian:"传统的亚美尼亚编号方式",bulletedTitle:"项目列表属性",circle:"空心圆",decimal:"数字 (1, 2, 3, 等)",decimalLeadingZero:"0开头的数字标记(01, 02, 03, 等)",disc:"实心圆",georgian:"传统的乔治亚编号方式(an, ban, gan, 等)",lowerAlpha:"小写英文字母(a, b, c, d, e, 等)",lowerGreek:"小写希腊字母(alpha, beta, gamma, 等)",lowerRoman:"小写罗马数字(i, ii, iii, iv, v, 等)",none:"无标记",notset:"<没有设置>",numberedTitle:"编号列表属性",square:"实心方块",start:"开始序号",type:"标记类型",upperAlpha:"大写英文字母(A, B, C, D, E, 等)",upperRoman:"大写罗马数字(I, II, III, IV, V, 等)", +validateStartNumber:"列表开始序号必须为整数格式"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/lang/zh.js b/bower_components/ckeditor/plugins/liststyle/lang/zh.js new file mode 100644 index 0000000..566f075 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/lang/zh.js @@ -0,0 +1,2 @@ +CKEDITOR.plugins.setLang("liststyle","zh",{armenian:"亞美尼亞數字",bulletedTitle:"項目符號清單屬性",circle:"圓圈",decimal:"小數點 (1, 2, 3, etc.)",decimalLeadingZero:"前綴 0 十位數字 (01, 02, 03, 等)",disc:"圓點",georgian:"喬治王時代數字 (an, ban, gan, 等)",lowerAlpha:"小寫字母 (a, b, c, d, e 等)",lowerGreek:"小寫希臘字母 (alpha, beta, gamma, 等)",lowerRoman:"小寫羅馬數字 (i, ii, iii, iv, v 等)",none:"無",notset:"<未設定>",numberedTitle:"編號清單屬性",square:"方塊",start:"開始",type:"類型",upperAlpha:"大寫字母 (A, B, C, D, E 等)",upperRoman:"大寫羅馬數字 (I, II, III, IV, V 等)", +validateStartNumber:"清單起始號碼須為一完整數字。"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/liststyle/plugin.js b/bower_components/ckeditor/plugins/liststyle/plugin.js new file mode 100644 index 0000000..a280ff2 --- /dev/null +++ b/bower_components/ckeditor/plugins/liststyle/plugin.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){CKEDITOR.plugins.liststyle={requires:"dialog,contextmenu",lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",init:function(a){if(!a.blockless){var b;b=new CKEDITOR.dialogCommand("numberedListStyle",{requiredContent:"ol",allowedContent:"ol{list-style-type}[start]"});b=a.addCommand("numberedListStyle",b);a.addFeature(b); +CKEDITOR.dialog.add("numberedListStyle",this.path+"dialogs/liststyle.js");b=new CKEDITOR.dialogCommand("bulletedListStyle",{requiredContent:"ul",allowedContent:"ul{list-style-type}"});b=a.addCommand("bulletedListStyle",b);a.addFeature(b);CKEDITOR.dialog.add("bulletedListStyle",this.path+"dialogs/liststyle.js");a.addMenuGroup("list",108);a.addMenuItems({numberedlist:{label:a.lang.liststyle.numberedTitle,group:"list",command:"numberedListStyle"},bulletedlist:{label:a.lang.liststyle.bulletedTitle,group:"list", +command:"bulletedListStyle"}});a.contextMenu.addListener(function(a){if(!a||a.isReadOnly())return null;for(;a;){var b=a.getName();if("ol"==b)return{numberedlist:CKEDITOR.TRISTATE_OFF};if("ul"==b)return{bulletedlist:CKEDITOR.TRISTATE_OFF};a=a.getParent()}return null})}}};CKEDITOR.plugins.add("liststyle",CKEDITOR.plugins.liststyle)})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png b/bower_components/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png new file mode 100644 index 0000000..4a8d2bf Binary files /dev/null and b/bower_components/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png differ diff --git a/bower_components/ckeditor/plugins/magicline/images/hidpi/icon.png b/bower_components/ckeditor/plugins/magicline/images/hidpi/icon.png new file mode 100644 index 0000000..b981bb5 Binary files /dev/null and b/bower_components/ckeditor/plugins/magicline/images/hidpi/icon.png differ diff --git a/bower_components/ckeditor/plugins/magicline/images/icon-rtl.png b/bower_components/ckeditor/plugins/magicline/images/icon-rtl.png new file mode 100644 index 0000000..55b5b5f Binary files /dev/null and b/bower_components/ckeditor/plugins/magicline/images/icon-rtl.png differ diff --git a/bower_components/ckeditor/plugins/magicline/images/icon.png b/bower_components/ckeditor/plugins/magicline/images/icon.png new file mode 100644 index 0000000..e063433 Binary files /dev/null and b/bower_components/ckeditor/plugins/magicline/images/icon.png differ diff --git a/bower_components/ckeditor/plugins/mathjax/dialogs/mathjax.js b/bower_components/ckeditor/plugins/mathjax/dialogs/mathjax.js new file mode 100644 index 0000000..18b2c05 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/dialogs/mathjax.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("mathjax",function(d){var c,b=d.lang.mathjax;return{title:b.title,minWidth:350,minHeight:100,contents:[{id:"info",elements:[{id:"equation",type:"textarea",label:b.dialogInput,onLoad:function(){var a=this;if(!(CKEDITOR.env.ie&&8==CKEDITOR.env.version))this.getInputElement().on("keyup",function(){c.setValue("\\("+a.getInputElement().getValue()+"\\)")})},setup:function(a){this.setValue(CKEDITOR.plugins.mathjax.trim(a.data.math))},commit:function(a){a.setData("math","\\("+this.getValue()+ +"\\)")}},{id:"documentation",type:"html",html:'<div style="width:100%;text-align:right;margin:-8px 0 10px"><a class="cke_mathjax_doc" href="'+b.docUrl+'" target="_black" style="cursor:pointer;color:#00B2CE;text-decoration:underline">'+b.docLabel+"</a></div>"},!(CKEDITOR.env.ie&&8==CKEDITOR.env.version)&&{id:"preview",type:"html",html:'<div style="width:100%;text-align:center;"><iframe style="border:0;width:0;height:0;font-size:20px" scrolling="no" frameborder="0" allowTransparency="true" src="'+CKEDITOR.plugins.mathjax.fixSrc+ +'"></iframe></div>',onLoad:function(){var a=CKEDITOR.document.getById(this.domId).getChild(0);c=new CKEDITOR.plugins.mathjax.frameWrapper(a,d)},setup:function(a){c.setValue(a.data.math)}}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/icons/hidpi/mathjax.png b/bower_components/ckeditor/plugins/mathjax/icons/hidpi/mathjax.png new file mode 100644 index 0000000..85b8e11 Binary files /dev/null and b/bower_components/ckeditor/plugins/mathjax/icons/hidpi/mathjax.png differ diff --git a/bower_components/ckeditor/plugins/mathjax/icons/mathjax.png b/bower_components/ckeditor/plugins/mathjax/icons/mathjax.png new file mode 100644 index 0000000..d25081b Binary files /dev/null and b/bower_components/ckeditor/plugins/mathjax/icons/mathjax.png differ diff --git a/bower_components/ckeditor/plugins/mathjax/images/loader.gif b/bower_components/ckeditor/plugins/mathjax/images/loader.gif new file mode 100644 index 0000000..3ffb181 Binary files /dev/null and b/bower_components/ckeditor/plugins/mathjax/images/loader.gif differ diff --git a/bower_components/ckeditor/plugins/mathjax/lang/af.js b/bower_components/ckeditor/plugins/mathjax/lang/af.js new file mode 100644 index 0000000..ee70c66 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","af",{title:"Wiskunde in TeX",button:"Wiskunde",dialogInput:"Skryf you Tex hier",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX dokument",loading:"laai...",pathName:"wiskunde"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/ar.js b/bower_components/ckeditor/plugins/mathjax/lang/ar.js new file mode 100644 index 0000000..64212f6 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","ar",{title:"Mathematics in TeX",button:"Math",dialogInput:"Write your TeX here",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX documentation",loading:"تحميل",pathName:"math"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/ca.js b/bower_components/ckeditor/plugins/mathjax/lang/ca.js new file mode 100644 index 0000000..33a353d --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","ca",{title:"Matemàtiques a TeX",button:"Matemàtiques",dialogInput:"Escriu el TeX aquí",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Documentació TeX",loading:"carregant...",pathName:"matemàtiques"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/cs.js b/bower_components/ckeditor/plugins/mathjax/lang/cs.js new file mode 100644 index 0000000..e2e0b51 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","cs",{title:"Matematika v TeXu",button:"Matematika",dialogInput:"Zde napište TeXový kód",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Dokumentace k TeXu",loading:"Nahrává se...",pathName:"Matematika"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/cy.js b/bower_components/ckeditor/plugins/mathjax/lang/cy.js new file mode 100644 index 0000000..bd919ba --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","cy",{title:"Mathemateg mewn TeX",button:"Math",dialogInput:"Ysgrifennwch eich TeX yma",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Dogfennaeth TeX",loading:"llwytho...",pathName:"math"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/da.js b/bower_components/ckeditor/plugins/mathjax/lang/da.js new file mode 100644 index 0000000..2c1ce30 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","da",{title:"Matematik i TeX",button:"Matematik",dialogInput:"Write your TeX here",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX dokumentation",loading:"loading...",pathName:"matematik"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/de.js b/bower_components/ckeditor/plugins/mathjax/lang/de.js new file mode 100644 index 0000000..5cf7168 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","de",{title:"Mathematik in Tex",button:"Rechnung",dialogInput:"Schreiben Sie hier in Tex",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Tex Dokumentation",loading:"lädt...",pathName:"rechnen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/el.js b/bower_components/ckeditor/plugins/mathjax/lang/el.js new file mode 100644 index 0000000..affcd0e --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","el",{title:"Μαθηματικά με τη γλώσσα TeX",button:"Μαθηματικά",dialogInput:"Γράψτε κώδικα TeX εδώ",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Τεκμηρίωση TeX",loading:"γίνεται φόρτωση...",pathName:"μαθηματικά"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/en-gb.js b/bower_components/ckeditor/plugins/mathjax/lang/en-gb.js new file mode 100644 index 0000000..d9f0cbd --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","en-gb",{title:"Mathematics in TeX",button:"Math",dialogInput:"Write you TeX here",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX documentation",loading:"loading...",pathName:"math"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/en.js b/bower_components/ckeditor/plugins/mathjax/lang/en.js new file mode 100644 index 0000000..9e66c84 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","en",{title:"Mathematics in TeX",button:"Math",dialogInput:"Write your TeX here",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX documentation",loading:"loading...",pathName:"math"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/eo.js b/bower_components/ckeditor/plugins/mathjax/lang/eo.js new file mode 100644 index 0000000..4aa7cb4 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","eo",{title:"Matematiko en TeX",button:"Matematiko",dialogInput:"Skribu vian TeX tien",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX dokumentado",loading:"estas ŝarganta",pathName:"matematiko"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/es.js b/bower_components/ckeditor/plugins/mathjax/lang/es.js new file mode 100644 index 0000000..6ec9e4d --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","es",{title:"Matemáticas en TeX",button:"Matemáticas",dialogInput:"Escribe tu TeX aquí",docUrl:"http://es.wikipedia.org/wiki/TeX",docLabel:"Documentación de TeX",loading:"cargando...",pathName:"matemáticas"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/fa.js b/bower_components/ckeditor/plugins/mathjax/lang/fa.js new file mode 100644 index 0000000..d638a84 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","fa",{title:"ریاضیات در تک",button:"ریاضی",dialogInput:"فرمول خود را اینجا بنویسید",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"مستندسازی فرمول نویسی",loading:"بارگیری",pathName:"ریاضی"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/fi.js b/bower_components/ckeditor/plugins/mathjax/lang/fi.js new file mode 100644 index 0000000..bd5140c --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","fi",{title:"Matematiikkaa TeX:llä",button:"Matematiikka",dialogInput:"Kirjoita TeX:iä tähän",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX dokumentaatio",loading:"lataa...",pathName:"matematiikka"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/fr.js b/bower_components/ckeditor/plugins/mathjax/lang/fr.js new file mode 100644 index 0000000..bf1cb47 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","fr",{title:"Mathématiques au format TeX",button:"Math",dialogInput:"Saisir la formule TeX ici",docUrl:"http://fr.wikibooks.org/wiki/LaTeX/Math%C3%A9matiques",docLabel:"Documentation du format TeX",loading:"chargement...",pathName:"math"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/gl.js b/bower_components/ckeditor/plugins/mathjax/lang/gl.js new file mode 100644 index 0000000..0657f1f --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","gl",{title:"Matemáticas en TeX",button:"Matemáticas",dialogInput:"Escriba o seu TeX aquí",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Documentación de TeX",loading:"cargando...",pathName:"matemáticas"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/he.js b/bower_components/ckeditor/plugins/mathjax/lang/he.js new file mode 100644 index 0000000..9e5c21d --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","he",{title:"מתמטיקה בTeX",button:"מתמטיקה",dialogInput:"כתוב את הTeX שלך כאן",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"תיעוד TeX",loading:"טוען...",pathName:"מתמטיקה"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/hr.js b/bower_components/ckeditor/plugins/mathjax/lang/hr.js new file mode 100644 index 0000000..6e90bd5 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","hr",{title:"Matematika u TeXu",button:"Matematika",dialogInput:"Napiši svoj TeX ovdje",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX dokumentacija",loading:"učitavanje...",pathName:"matematika"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/hu.js b/bower_components/ckeditor/plugins/mathjax/lang/hu.js new file mode 100644 index 0000000..3ab4b74 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","hu",{title:"Matematika a TeX-ben",button:"Matek",dialogInput:"Írd a TeX-ed ide",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX dokumentáció",loading:"töltés...",pathName:"matek"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/it.js b/bower_components/ckeditor/plugins/mathjax/lang/it.js new file mode 100644 index 0000000..a91094a --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","it",{title:"Formule in TeX",button:"Formule",dialogInput:"Scrivere qui il proprio TeX",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Documentazione TeX",loading:"caricamento…",pathName:"formula"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/ja.js b/bower_components/ckeditor/plugins/mathjax/lang/ja.js new file mode 100644 index 0000000..0141ecd --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","ja",{title:"TeX形式の数式",button:"数式",dialogInput:"TeX形式の数式を入力してください",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeXの解説",loading:"読み込み中…",pathName:"math"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/km.js b/bower_components/ckeditor/plugins/mathjax/lang/km.js new file mode 100644 index 0000000..d68d998 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","km",{title:"គណិត​វិទ្យា​ក្នុង TeX",button:"គណិត",dialogInput:"សរសេរ TeX របស់​អ្នក​នៅ​ទីនេះ",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"ឯកសារ​អត្ថបទ​ពី ​TeX",loading:"កំពុង​ផ្ទុក..",pathName:"គណិត"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/ku.js b/bower_components/ckeditor/plugins/mathjax/lang/ku.js new file mode 100644 index 0000000..84f225a --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","ku",{title:"بیرکاری لە TeX",button:"بیرکاری",dialogInput:"TeXەکەت لێرە بنووسە",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"بەڵگەنامەکردنی TeX",loading:"بارکردن...",pathName:"بیرکاری"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/lt.js b/bower_components/ckeditor/plugins/mathjax/lang/lt.js new file mode 100644 index 0000000..7b2c3e8 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","lt",{title:"Matematika per TeX",button:"Matematika",dialogInput:"Parašyk savo TeX čia",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX žinynas",loading:"kraunasi...",pathName:"matematika"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/nb.js b/bower_components/ckeditor/plugins/mathjax/lang/nb.js new file mode 100644 index 0000000..7b3588e --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","nb",{title:"Matematikk i TeX",button:"Matte",dialogInput:"Skriv TeX-koden her",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX-dokumentasjon",loading:"laster...",pathName:"matte"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/nl.js b/bower_components/ckeditor/plugins/mathjax/lang/nl.js new file mode 100644 index 0000000..fe9cf31 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","nl",{title:"Wiskunde in TeX",button:"Wiskunde",dialogInput:"Typ hier uw TeX",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX documentatie",loading:"laden...",pathName:"wiskunde"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/no.js b/bower_components/ckeditor/plugins/mathjax/lang/no.js new file mode 100644 index 0000000..33e87ab --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","no",{title:"Matematikk i TeX",button:"Matte",dialogInput:"Skriv TeX-koden her",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX-dokumentasjon",loading:"laster...",pathName:"matte"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/pl.js b/bower_components/ckeditor/plugins/mathjax/lang/pl.js new file mode 100644 index 0000000..70f2be5 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","pl",{title:"Wzory matematyczne w TeX",button:"Wzory matematyczne",dialogInput:"Wpisz wyrażenie w TeX",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Dokumentacja TeX",loading:"ładowanie...",pathName:"matematyka"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/pt-br.js b/bower_components/ckeditor/plugins/mathjax/lang/pt-br.js new file mode 100644 index 0000000..6b9620d --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","pt-br",{title:"Matemática em TeX",button:"Matemática",dialogInput:"Escreva seu TeX aqui",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Documentação TeX",loading:"carregando...",pathName:"Matemática"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/pt.js b/bower_components/ckeditor/plugins/mathjax/lang/pt.js new file mode 100644 index 0000000..09a39d3 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","pt",{title:"Matemática em TeX",button:"Matemática",dialogInput:"Escreva aqui o seu Tex",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Documentação TeX",loading:"a carregar ...",pathName:"matemática"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/ro.js b/bower_components/ckeditor/plugins/mathjax/lang/ro.js new file mode 100644 index 0000000..72c606c --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","ro",{title:"Matematici in TeX",button:"Matematici",dialogInput:"Scrie TeX-ul aici",docUrl:"http://ro.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Documentatie TeX",loading:"încarcă...",pathName:"matematici"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/ru.js b/bower_components/ckeditor/plugins/mathjax/lang/ru.js new file mode 100644 index 0000000..a48da75 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","ru",{title:"Математика в TeX-системе",button:"Математика",dialogInput:"Введите здесь TeX",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX документация",loading:"загрузка...",pathName:"мат."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/sk.js b/bower_components/ckeditor/plugins/mathjax/lang/sk.js new file mode 100644 index 0000000..1a54159 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","sk",{title:"Matematika v TeX",button:"Matika",dialogInput:"Napíšte svoj TeX sem",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Dokumentácia TeX",loading:"načítavanie...",pathName:"matika"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/sl.js b/bower_components/ckeditor/plugins/mathjax/lang/sl.js new file mode 100644 index 0000000..c8df95b --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","sl",{title:"Matematika v TeX",button:"Matematika",dialogInput:"Napišite svoj TeX tukaj",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX dokumentacija",loading:"nalaganje...",pathName:"matematika"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/sq.js b/bower_components/ckeditor/plugins/mathjax/lang/sq.js new file mode 100644 index 0000000..7416e77 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","sq",{title:"Matematikë në TeX",button:"Matematikë",dialogInput:"Shkruani TeX-in tuaj këtu",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Tex dokumentimi",loading:"duke u hapur...",pathName:"matematikë"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/sv.js b/bower_components/ckeditor/plugins/mathjax/lang/sv.js new file mode 100644 index 0000000..7508fef --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","sv",{title:"Mattematik i TeX",button:"Matte",dialogInput:"Skriv din TeX här",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX dokumentation",loading:"laddar",pathName:"matte"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/tr.js b/bower_components/ckeditor/plugins/mathjax/lang/tr.js new file mode 100644 index 0000000..a2925f1 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","tr",{title:"TeX ile Matematik",button:"Matematik",dialogInput:"TeX kodunuzu buraya yazın",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX yardım dökümanı",loading:"yükleniyor...",pathName:"matematik"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/tt.js b/bower_components/ckeditor/plugins/mathjax/lang/tt.js new file mode 100644 index 0000000..44003bd --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","tt",{title:"TeX'та математика",button:"Математика",dialogInput:"Биредә TeX форматында аңлатмагызны языгыз",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX турыдна документлар",loading:"йөкләнә...",pathName:"математика"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/uk.js b/bower_components/ckeditor/plugins/mathjax/lang/uk.js new file mode 100644 index 0000000..77875f4 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","uk",{title:"Математика у TeX",button:"Математика",dialogInput:"Наберіть тут на TeX'у",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Документація про TeX",loading:"завантажується…",pathName:"математика"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/vi.js b/bower_components/ckeditor/plugins/mathjax/lang/vi.js new file mode 100644 index 0000000..6696103 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","vi",{title:"Toán học bằng TeX",button:"Toán",dialogInput:"Nhập mã TeX ở đây",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"Tài liệu TeX",loading:"đang nạp...",pathName:"toán"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/zh-cn.js b/bower_components/ckeditor/plugins/mathjax/lang/zh-cn.js new file mode 100644 index 0000000..ea9ad35 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","zh-cn",{title:"TeX 语法的数学公式编辑器",button:"数学公式",dialogInput:"在此编写您的 TeX 指令",docUrl:"http://zh.wikipedia.org/wiki/TeX",docLabel:"TeX 语法(可以参考维基百科自身关于数学公式显示方式的帮助)",loading:"正在加载...",pathName:"数字公式"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/lang/zh.js b/bower_components/ckeditor/plugins/mathjax/lang/zh.js new file mode 100644 index 0000000..84cdab1 --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("mathjax","zh",{title:"以 TeX 表示數學",button:"數學",dialogInput:"請輸入 TeX",docUrl:"http://en.wikibooks.org/wiki/LaTeX/Mathematics",docLabel:"TeX 說明文件",loading:"載入中…",pathName:"數學"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/mathjax/plugin.js b/bower_components/ckeditor/plugins/mathjax/plugin.js new file mode 100644 index 0000000..822de4c --- /dev/null +++ b/bower_components/ckeditor/plugins/mathjax/plugin.js @@ -0,0 +1,15 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){var h="http://cdn.mathjax.org/mathjax/2.2-latest/MathJax.js?config=TeX-AMS_HTML";CKEDITOR.plugins.add("mathjax",{lang:"af,ar,ca,cs,cy,da,de,el,en,en-gb,eo,es,fa,fi,fr,gl,he,hr,hu,it,ja,km,ku,lt,nb,nl,no,pl,pt,pt-br,ro,ru,sk,sl,sq,sv,tr,tt,uk,vi,zh,zh-cn",requires:"widget,dialog",icons:"mathjax",hidpi:!0,init:function(b){var c=b.config.mathJaxClass||"math-tex";b.widgets.add("mathjax",{inline:!0,dialog:"mathjax",button:b.lang.mathjax.button,mask:!0,allowedContent:"span(!"+c+")",styleToAllowedContentRules:function(a){a= +a.getClassesArray();if(!a)return null;a.push("!"+c);return"span("+a.join(",")+")"},pathName:b.lang.mathjax.pathName,template:'<span class="'+c+'" style="display:inline-block" data-cke-survive=1></span>',parts:{span:"span"},defaults:{math:"\\(x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}\\)"},init:function(){var a=this.parts.span.getChild(0);if(!a||a.type!=CKEDITOR.NODE_ELEMENT||!a.is("iframe"))a=new CKEDITOR.dom.element("iframe"),a.setAttributes({style:"border:0;width:0;height:0",scrolling:"no",frameborder:0, +allowTransparency:!0,src:CKEDITOR.plugins.mathjax.fixSrc}),this.parts.span.append(a);this.once("ready",function(){CKEDITOR.env.ie&&a.setAttribute("src",CKEDITOR.plugins.mathjax.fixSrc);this.frameWrapper=new CKEDITOR.plugins.mathjax.frameWrapper(a,b);this.frameWrapper.setValue(this.data.math)})},data:function(){this.frameWrapper&&this.frameWrapper.setValue(this.data.math)},upcast:function(a,b){if("span"==a.name&&a.hasClass(c)&&!(1<a.children.length||a.children[0].type!=CKEDITOR.NODE_TEXT)){b.math= +CKEDITOR.tools.htmlDecode(a.children[0].value);var d=a.attributes;d.style=d.style?d.style+";display:inline-block":"display:inline-block";d["data-cke-survive"]=1;a.children[0].remove();return a}},downcast:function(a){a.children[0].replaceWith(new CKEDITOR.htmlParser.text(CKEDITOR.tools.htmlEncode(this.data.math)));var b=a.attributes;b.style=b.style.replace(/display:\s?inline-block;?\s?/,"");""===b.style&&delete b.style;return a}});CKEDITOR.dialog.add("mathjax",this.path+"dialogs/mathjax.js");b.on("contentPreview", +function(a){a.data.dataValue=a.data.dataValue.replace(/<\/head>/,'<script src="'+(b.config.mathJaxLib?CKEDITOR.getUrl(b.config.mathJaxLib):h)+'"><\/script></head>')});b.on("paste",function(a){a.data.dataValue=a.data.dataValue.replace(RegExp("<span[^>]*?"+c+".*?</span>","ig"),function(a){return a.replace(/(<iframe.*?\/iframe>)/i,"")})})}});CKEDITOR.plugins.mathjax={};CKEDITOR.plugins.mathjax.fixSrc=CKEDITOR.env.gecko?"javascript:true":CKEDITOR.env.ie?"javascript:void((function(){"+encodeURIComponent("document.open();("+ +CKEDITOR.tools.fixDomain+")();document.close();")+"})())":"javascript:void(0)";CKEDITOR.plugins.mathjax.loadingIcon=CKEDITOR.plugins.get("mathjax").path+"images/loader.gif";CKEDITOR.plugins.mathjax.copyStyles=function(b,c){for(var a="color font-family font-style font-weight font-variant font-size".split(" "),e=0;e<a.length;e++){var d=a[e],g=b.getComputedStyle(d);g&&c.setStyle(d,g)}};CKEDITOR.plugins.mathjax.trim=function(b){var c=b.indexOf("\\(")+2,a=b.lastIndexOf("\\)");return b.substring(c,a)}; +CKEDITOR.plugins.mathjax.frameWrapper=CKEDITOR.env.ie&&8==CKEDITOR.env.version?function(b,c){b.getFrameDocument().write('<!DOCTYPE html><html><head><meta charset="utf-8"></head><body style="padding:0;margin:0;background:transparent;overflow:hidden"><span style="white-space:nowrap;" id="tex"></span></body></html>');return{setValue:function(a){var e=b.getFrameDocument(),d=e.getById("tex");d.setHtml(CKEDITOR.plugins.mathjax.trim(CKEDITOR.tools.htmlEncode(a)));CKEDITOR.plugins.mathjax.copyStyles(b,d); +c.fire("lockSnapshot");b.setStyles({width:Math.min(250,d.$.offsetWidth)+"px",height:e.$.body.offsetHeight+"px",display:"inline","vertical-align":"middle"});c.fire("unlockSnapshot")}}}:function(b,c){function a(){f=b.getFrameDocument();f.getById("preview")||(CKEDITOR.env.ie&&b.removeAttribute("src"),f.write('<!DOCTYPE html><html><head><meta charset="utf-8"><script type="text/x-mathjax-config">MathJax.Hub.Config( {showMathMenu: false,messageStyle: "none"} );function getCKE() {if ( typeof window.parent.CKEDITOR == \'object\' ) {return window.parent.CKEDITOR;} else {return window.parent.parent.CKEDITOR;}}function update() {MathJax.Hub.Queue([ \'Typeset\', MathJax.Hub, this.buffer ],function() {getCKE().tools.callFunction( '+ +m+" );});}MathJax.Hub.Queue( function() {getCKE().tools.callFunction("+n+');} );<\/script><script src="'+(c.config.mathJaxLib||h)+'"><\/script></head><body style="padding:0;margin:0;background:transparent;overflow:hidden"><span id="preview"></span><span id="buffer" style="display:none"></span></body></html>'))}function e(){k=!0;i=j;c.fire("lockSnapshot");d.setHtml(i);g.setHtml("<img src="+CKEDITOR.plugins.mathjax.loadingIcon+" alt="+c.lang.mathjax.loading+">");b.setStyles({height:"16px",width:"16px", +display:"inline","vertical-align":"middle"});c.fire("unlockSnapshot");f.getWindow().$.update(i)}var d,g,i,j,f=b.getFrameDocument(),l=!1,k=!1,n=CKEDITOR.tools.addFunction(function(){g=f.getById("preview");d=f.getById("buffer");l=!0;j&&e();CKEDITOR.fire("mathJaxLoaded",b)}),m=CKEDITOR.tools.addFunction(function(){CKEDITOR.plugins.mathjax.copyStyles(b,g);g.setHtml(d.getHtml());c.fire("lockSnapshot");b.setStyles({height:0,width:0});var a=Math.max(f.$.body.offsetHeight,f.$.documentElement.offsetHeight), +h=Math.max(g.$.offsetWidth,f.$.body.scrollWidth);b.setStyles({height:a+"px",width:h+"px"});c.fire("unlockSnapshot");CKEDITOR.fire("mathJaxUpdateDone",b);i!=j?e():k=!1});b.on("load",a);a();return{setValue:function(a){j=CKEDITOR.tools.htmlEncode(a);l&&!k&&e()}}}})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/icons/hidpi/newpage-rtl.png b/bower_components/ckeditor/plugins/newpage/icons/hidpi/newpage-rtl.png new file mode 100644 index 0000000..1a7551c Binary files /dev/null and b/bower_components/ckeditor/plugins/newpage/icons/hidpi/newpage-rtl.png differ diff --git a/bower_components/ckeditor/plugins/newpage/icons/hidpi/newpage.png b/bower_components/ckeditor/plugins/newpage/icons/hidpi/newpage.png new file mode 100644 index 0000000..8cbe223 Binary files /dev/null and b/bower_components/ckeditor/plugins/newpage/icons/hidpi/newpage.png differ diff --git a/bower_components/ckeditor/plugins/newpage/icons/newpage-rtl.png b/bower_components/ckeditor/plugins/newpage/icons/newpage-rtl.png new file mode 100644 index 0000000..2c8ef7f Binary files /dev/null and b/bower_components/ckeditor/plugins/newpage/icons/newpage-rtl.png differ diff --git a/bower_components/ckeditor/plugins/newpage/icons/newpage.png b/bower_components/ckeditor/plugins/newpage/icons/newpage.png new file mode 100644 index 0000000..8e18c8a Binary files /dev/null and b/bower_components/ckeditor/plugins/newpage/icons/newpage.png differ diff --git a/bower_components/ckeditor/plugins/newpage/lang/af.js b/bower_components/ckeditor/plugins/newpage/lang/af.js new file mode 100644 index 0000000..2fd4a60 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","af",{toolbar:"Nuwe bladsy"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/ar.js b/bower_components/ckeditor/plugins/newpage/lang/ar.js new file mode 100644 index 0000000..04f45c5 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","ar",{toolbar:"صفحة جديدة"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/bg.js b/bower_components/ckeditor/plugins/newpage/lang/bg.js new file mode 100644 index 0000000..b40fbf5 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","bg",{toolbar:"Нова страница"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/bn.js b/bower_components/ckeditor/plugins/newpage/lang/bn.js new file mode 100644 index 0000000..aaedacb --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","bn",{toolbar:"নতুন পেজ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/bs.js b/bower_components/ckeditor/plugins/newpage/lang/bs.js new file mode 100644 index 0000000..f8a0c44 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","bs",{toolbar:"Novi dokument"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/ca.js b/bower_components/ckeditor/plugins/newpage/lang/ca.js new file mode 100644 index 0000000..4efb607 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","ca",{toolbar:"Nova pàgina"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/cs.js b/bower_components/ckeditor/plugins/newpage/lang/cs.js new file mode 100644 index 0000000..0296068 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","cs",{toolbar:"Nová stránka"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/cy.js b/bower_components/ckeditor/plugins/newpage/lang/cy.js new file mode 100644 index 0000000..09e8b6f --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","cy",{toolbar:"Tudalen Newydd"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/da.js b/bower_components/ckeditor/plugins/newpage/lang/da.js new file mode 100644 index 0000000..22d0d6b --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","da",{toolbar:"Ny side"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/de.js b/bower_components/ckeditor/plugins/newpage/lang/de.js new file mode 100644 index 0000000..8d323f8 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","de",{toolbar:"Neue Seite"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/el.js b/bower_components/ckeditor/plugins/newpage/lang/el.js new file mode 100644 index 0000000..7f989b1 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","el",{toolbar:"Νέα Σελίδα"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/en-au.js b/bower_components/ckeditor/plugins/newpage/lang/en-au.js new file mode 100644 index 0000000..6e38a28 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","en-au",{toolbar:"New Page"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/en-ca.js b/bower_components/ckeditor/plugins/newpage/lang/en-ca.js new file mode 100644 index 0000000..327aa5d --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","en-ca",{toolbar:"New Page"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/en-gb.js b/bower_components/ckeditor/plugins/newpage/lang/en-gb.js new file mode 100644 index 0000000..3f7ab3e --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","en-gb",{toolbar:"New Page"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/en.js b/bower_components/ckeditor/plugins/newpage/lang/en.js new file mode 100644 index 0000000..4402b73 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","en",{toolbar:"New Page"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/eo.js b/bower_components/ckeditor/plugins/newpage/lang/eo.js new file mode 100644 index 0000000..671a107 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","eo",{toolbar:"Nova Paĝo"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/es.js b/bower_components/ckeditor/plugins/newpage/lang/es.js new file mode 100644 index 0000000..ca54ae0 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","es",{toolbar:"Nueva Página"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/et.js b/bower_components/ckeditor/plugins/newpage/lang/et.js new file mode 100644 index 0000000..59a5806 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","et",{toolbar:"Uus leht"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/eu.js b/bower_components/ckeditor/plugins/newpage/lang/eu.js new file mode 100644 index 0000000..82808ef --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","eu",{toolbar:"Orrialde Berria"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/fa.js b/bower_components/ckeditor/plugins/newpage/lang/fa.js new file mode 100644 index 0000000..6986ba6 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","fa",{toolbar:"برگهٴ تازه"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/fi.js b/bower_components/ckeditor/plugins/newpage/lang/fi.js new file mode 100644 index 0000000..cc1e63d --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","fi",{toolbar:"Tyhjennä"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/fo.js b/bower_components/ckeditor/plugins/newpage/lang/fo.js new file mode 100644 index 0000000..778091e --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","fo",{toolbar:"Nýggj síða"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/fr-ca.js b/bower_components/ckeditor/plugins/newpage/lang/fr-ca.js new file mode 100644 index 0000000..de7bb95 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","fr-ca",{toolbar:"Nouvelle page"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/fr.js b/bower_components/ckeditor/plugins/newpage/lang/fr.js new file mode 100644 index 0000000..2de5170 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","fr",{toolbar:"Nouvelle page"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/gl.js b/bower_components/ckeditor/plugins/newpage/lang/gl.js new file mode 100644 index 0000000..96b7ea7 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","gl",{toolbar:"Páxina nova"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/gu.js b/bower_components/ckeditor/plugins/newpage/lang/gu.js new file mode 100644 index 0000000..f4c3306 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","gu",{toolbar:"નવુ પાનું"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/he.js b/bower_components/ckeditor/plugins/newpage/lang/he.js new file mode 100644 index 0000000..460262b --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","he",{toolbar:"דף חדש"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/hi.js b/bower_components/ckeditor/plugins/newpage/lang/hi.js new file mode 100644 index 0000000..afed2e2 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","hi",{toolbar:"नया पेज"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/hr.js b/bower_components/ckeditor/plugins/newpage/lang/hr.js new file mode 100644 index 0000000..fc09d5a --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","hr",{toolbar:"Nova stranica"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/hu.js b/bower_components/ckeditor/plugins/newpage/lang/hu.js new file mode 100644 index 0000000..6053528 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","hu",{toolbar:"Új oldal"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/id.js b/bower_components/ckeditor/plugins/newpage/lang/id.js new file mode 100644 index 0000000..391bdad --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","id",{toolbar:"Halaman Baru"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/is.js b/bower_components/ckeditor/plugins/newpage/lang/is.js new file mode 100644 index 0000000..cee7f35 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","is",{toolbar:"Ný síða"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/it.js b/bower_components/ckeditor/plugins/newpage/lang/it.js new file mode 100644 index 0000000..d484977 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","it",{toolbar:"Nuova pagina"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/ja.js b/bower_components/ckeditor/plugins/newpage/lang/ja.js new file mode 100644 index 0000000..3954e55 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","ja",{toolbar:"新しいページ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/ka.js b/bower_components/ckeditor/plugins/newpage/lang/ka.js new file mode 100644 index 0000000..ee1bd79 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","ka",{toolbar:"ახალი გვერდი"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/km.js b/bower_components/ckeditor/plugins/newpage/lang/km.js new file mode 100644 index 0000000..0dcae48 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","km",{toolbar:"ទំព័រ​ថ្មី"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/ko.js b/bower_components/ckeditor/plugins/newpage/lang/ko.js new file mode 100644 index 0000000..3ac6b6b --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","ko",{toolbar:"새 문서"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/ku.js b/bower_components/ckeditor/plugins/newpage/lang/ku.js new file mode 100644 index 0000000..b5d9959 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","ku",{toolbar:"پەڕەیەکی نوێ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/lt.js b/bower_components/ckeditor/plugins/newpage/lang/lt.js new file mode 100644 index 0000000..a9572d6 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","lt",{toolbar:"Naujas puslapis"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/lv.js b/bower_components/ckeditor/plugins/newpage/lang/lv.js new file mode 100644 index 0000000..d05d390 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","lv",{toolbar:"Jauna lapa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/mk.js b/bower_components/ckeditor/plugins/newpage/lang/mk.js new file mode 100644 index 0000000..0b4261c --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","mk",{toolbar:"New Page"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/mn.js b/bower_components/ckeditor/plugins/newpage/lang/mn.js new file mode 100644 index 0000000..7ea8f84 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","mn",{toolbar:"Шинэ хуудас"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/ms.js b/bower_components/ckeditor/plugins/newpage/lang/ms.js new file mode 100644 index 0000000..a654494 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","ms",{toolbar:"Helaian Baru"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/nb.js b/bower_components/ckeditor/plugins/newpage/lang/nb.js new file mode 100644 index 0000000..7d8addd --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","nb",{toolbar:"Ny side"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/nl.js b/bower_components/ckeditor/plugins/newpage/lang/nl.js new file mode 100644 index 0000000..20ab505 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","nl",{toolbar:"Nieuwe pagina"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/no.js b/bower_components/ckeditor/plugins/newpage/lang/no.js new file mode 100644 index 0000000..551cb36 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","no",{toolbar:"Ny side"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/pl.js b/bower_components/ckeditor/plugins/newpage/lang/pl.js new file mode 100644 index 0000000..c2dd768 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","pl",{toolbar:"Nowa strona"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/pt-br.js b/bower_components/ckeditor/plugins/newpage/lang/pt-br.js new file mode 100644 index 0000000..31120f0 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","pt-br",{toolbar:"Novo"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/pt.js b/bower_components/ckeditor/plugins/newpage/lang/pt.js new file mode 100644 index 0000000..556a89b --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","pt",{toolbar:"Nova Página"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/ro.js b/bower_components/ckeditor/plugins/newpage/lang/ro.js new file mode 100644 index 0000000..8733645 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","ro",{toolbar:"Pagină nouă"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/ru.js b/bower_components/ckeditor/plugins/newpage/lang/ru.js new file mode 100644 index 0000000..bdac86e --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","ru",{toolbar:"Новая страница"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/si.js b/bower_components/ckeditor/plugins/newpage/lang/si.js new file mode 100644 index 0000000..166e550 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","si",{toolbar:"නව පිටුවක්"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/sk.js b/bower_components/ckeditor/plugins/newpage/lang/sk.js new file mode 100644 index 0000000..2ff850f --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","sk",{toolbar:"Nová stránka"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/sl.js b/bower_components/ckeditor/plugins/newpage/lang/sl.js new file mode 100644 index 0000000..b8bdbdb --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","sl",{toolbar:"Nova stran"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/sq.js b/bower_components/ckeditor/plugins/newpage/lang/sq.js new file mode 100644 index 0000000..eb50802 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","sq",{toolbar:"Faqe e Re"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/sr-latn.js b/bower_components/ckeditor/plugins/newpage/lang/sr-latn.js new file mode 100644 index 0000000..1758d5c --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","sr-latn",{toolbar:"Nova stranica"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/sr.js b/bower_components/ckeditor/plugins/newpage/lang/sr.js new file mode 100644 index 0000000..9289d01 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","sr",{toolbar:"Нова страница"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/sv.js b/bower_components/ckeditor/plugins/newpage/lang/sv.js new file mode 100644 index 0000000..ce4099d --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","sv",{toolbar:"Ny sida"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/th.js b/bower_components/ckeditor/plugins/newpage/lang/th.js new file mode 100644 index 0000000..f1647f2 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","th",{toolbar:"สร้างหน้าเอกสารใหม่"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/tr.js b/bower_components/ckeditor/plugins/newpage/lang/tr.js new file mode 100644 index 0000000..afba1bd --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","tr",{toolbar:"Yeni Sayfa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/tt.js b/bower_components/ckeditor/plugins/newpage/lang/tt.js new file mode 100644 index 0000000..2c9e06a --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","tt",{toolbar:"Яңа бит"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/ug.js b/bower_components/ckeditor/plugins/newpage/lang/ug.js new file mode 100644 index 0000000..739429a --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","ug",{toolbar:"يېڭى بەت"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/uk.js b/bower_components/ckeditor/plugins/newpage/lang/uk.js new file mode 100644 index 0000000..518a63a --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","uk",{toolbar:"Нова сторінка"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/vi.js b/bower_components/ckeditor/plugins/newpage/lang/vi.js new file mode 100644 index 0000000..16dffe6 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","vi",{toolbar:"Trang mới"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/zh-cn.js b/bower_components/ckeditor/plugins/newpage/lang/zh-cn.js new file mode 100644 index 0000000..9868d6b --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","zh-cn",{toolbar:"新建"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/lang/zh.js b/bower_components/ckeditor/plugins/newpage/lang/zh.js new file mode 100644 index 0000000..cd365f4 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("newpage","zh",{toolbar:"新增網頁"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/newpage/plugin.js b/bower_components/ckeditor/plugins/newpage/plugin.js new file mode 100644 index 0000000..acfd620 --- /dev/null +++ b/bower_components/ckeditor/plugins/newpage/plugin.js @@ -0,0 +1,6 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.add("newpage",{lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"newpage,newpage-rtl",hidpi:!0,init:function(a){a.addCommand("newpage",{modes:{wysiwyg:1,source:1},exec:function(b){var a=this;b.setData(b.config.newpage_html||"",function(){b.focus();setTimeout(function(){b.fire("afterCommandExec",{name:"newpage", +command:a});b.selectionChange()},200)})},async:!0});a.ui.addButton&&a.ui.addButton("NewPage",{label:a.lang.newpage.toolbar,command:"newpage",toolbar:"document,20"})}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/icons/hidpi/pagebreak-rtl.png b/bower_components/ckeditor/plugins/pagebreak/icons/hidpi/pagebreak-rtl.png new file mode 100644 index 0000000..4a5418c Binary files /dev/null and b/bower_components/ckeditor/plugins/pagebreak/icons/hidpi/pagebreak-rtl.png differ diff --git a/bower_components/ckeditor/plugins/pagebreak/icons/hidpi/pagebreak.png b/bower_components/ckeditor/plugins/pagebreak/icons/hidpi/pagebreak.png new file mode 100644 index 0000000..8d3930b Binary files /dev/null and b/bower_components/ckeditor/plugins/pagebreak/icons/hidpi/pagebreak.png differ diff --git a/bower_components/ckeditor/plugins/pagebreak/icons/pagebreak-rtl.png b/bower_components/ckeditor/plugins/pagebreak/icons/pagebreak-rtl.png new file mode 100644 index 0000000..b5b342b Binary files /dev/null and b/bower_components/ckeditor/plugins/pagebreak/icons/pagebreak-rtl.png differ diff --git a/bower_components/ckeditor/plugins/pagebreak/icons/pagebreak.png b/bower_components/ckeditor/plugins/pagebreak/icons/pagebreak.png new file mode 100644 index 0000000..5280a6e Binary files /dev/null and b/bower_components/ckeditor/plugins/pagebreak/icons/pagebreak.png differ diff --git a/bower_components/ckeditor/plugins/pagebreak/images/pagebreak.gif b/bower_components/ckeditor/plugins/pagebreak/images/pagebreak.gif new file mode 100644 index 0000000..8d1cffd Binary files /dev/null and b/bower_components/ckeditor/plugins/pagebreak/images/pagebreak.gif differ diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/af.js b/bower_components/ckeditor/plugins/pagebreak/lang/af.js new file mode 100644 index 0000000..3db5e2e --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","af",{alt:"Bladsy-einde",toolbar:"Bladsy-einde invoeg"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/ar.js b/bower_components/ckeditor/plugins/pagebreak/lang/ar.js new file mode 100644 index 0000000..6c79581 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","ar",{alt:"فاصل الصفحة",toolbar:"إدخال صفحة جديدة"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/bg.js b/bower_components/ckeditor/plugins/pagebreak/lang/bg.js new file mode 100644 index 0000000..32ea86b --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","bg",{alt:"Разделяне на страници",toolbar:"Вмъкване на нова страница при печат"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/bn.js b/bower_components/ckeditor/plugins/pagebreak/lang/bn.js new file mode 100644 index 0000000..69bcc5d --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","bn",{alt:"Page Break",toolbar:"পেজ ব্রেক"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/bs.js b/bower_components/ckeditor/plugins/pagebreak/lang/bs.js new file mode 100644 index 0000000..e33eb61 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","bs",{alt:"Page Break",toolbar:"Insert Page Break for Printing"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/ca.js b/bower_components/ckeditor/plugins/pagebreak/lang/ca.js new file mode 100644 index 0000000..8d1732c --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","ca",{alt:"Salt de pàgina",toolbar:"Insereix salt de pàgina"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/cs.js b/bower_components/ckeditor/plugins/pagebreak/lang/cs.js new file mode 100644 index 0000000..c275310 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","cs",{alt:"Konec stránky",toolbar:"Vložit konec stránky"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/cy.js b/bower_components/ckeditor/plugins/pagebreak/lang/cy.js new file mode 100644 index 0000000..b3f86a4 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","cy",{alt:"Toriad Tudalen",toolbar:"Mewnosod Toriad Tudalen i Argraffu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/da.js b/bower_components/ckeditor/plugins/pagebreak/lang/da.js new file mode 100644 index 0000000..206f3a6 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","da",{alt:"Sideskift",toolbar:"Indsæt sideskift"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/de.js b/bower_components/ckeditor/plugins/pagebreak/lang/de.js new file mode 100644 index 0000000..0644942 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","de",{alt:"Seitenumbruch einfügen",toolbar:"Seitenumbruch einfügen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/el.js b/bower_components/ckeditor/plugins/pagebreak/lang/el.js new file mode 100644 index 0000000..1b9c872 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","el",{alt:"Αλλαγή Σελίδας",toolbar:"Εισαγωγή Τέλους Σελίδας για Εκτύπωση"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/en-au.js b/bower_components/ckeditor/plugins/pagebreak/lang/en-au.js new file mode 100644 index 0000000..ca24e8e --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","en-au",{alt:"Page Break",toolbar:"Insert Page Break for Printing"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/en-ca.js b/bower_components/ckeditor/plugins/pagebreak/lang/en-ca.js new file mode 100644 index 0000000..d473156 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","en-ca",{alt:"Page Break",toolbar:"Insert Page Break for Printing"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/en-gb.js b/bower_components/ckeditor/plugins/pagebreak/lang/en-gb.js new file mode 100644 index 0000000..d17f8b0 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","en-gb",{alt:"Page Break",toolbar:"Insert Page Break for Printing"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/en.js b/bower_components/ckeditor/plugins/pagebreak/lang/en.js new file mode 100644 index 0000000..4b680ef --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","en",{alt:"Page Break",toolbar:"Insert Page Break for Printing"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/eo.js b/bower_components/ckeditor/plugins/pagebreak/lang/eo.js new file mode 100644 index 0000000..cb66474 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","eo",{alt:"Paĝavanco",toolbar:"Enmeti Paĝavancon por Presado"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/es.js b/bower_components/ckeditor/plugins/pagebreak/lang/es.js new file mode 100644 index 0000000..1737955 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","es",{alt:"Salto de página",toolbar:"Insertar Salto de Página"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/et.js b/bower_components/ckeditor/plugins/pagebreak/lang/et.js new file mode 100644 index 0000000..463b200 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","et",{alt:"Lehevahetuskoht",toolbar:"Lehevahetuskoha sisestamine"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/eu.js b/bower_components/ckeditor/plugins/pagebreak/lang/eu.js new file mode 100644 index 0000000..42c2411 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","eu",{alt:"Orrialde-jauzia",toolbar:"Txertatu Orrialde-jauzia Inprimatzean"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/fa.js b/bower_components/ckeditor/plugins/pagebreak/lang/fa.js new file mode 100644 index 0000000..c8b8e18 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","fa",{alt:"شکستن صفحه",toolbar:"گنجاندن شکستگی پایان برگه"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/fi.js b/bower_components/ckeditor/plugins/pagebreak/lang/fi.js new file mode 100644 index 0000000..5dc52bd --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","fi",{alt:"Sivunvaihto",toolbar:"Lisää sivunvaihto"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/fo.js b/bower_components/ckeditor/plugins/pagebreak/lang/fo.js new file mode 100644 index 0000000..ba9b9dc --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","fo",{alt:"Síðuskift",toolbar:"Ger síðuskift"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/fr-ca.js b/bower_components/ckeditor/plugins/pagebreak/lang/fr-ca.js new file mode 100644 index 0000000..e5ec232 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","fr-ca",{alt:"Saut de page",toolbar:"Insérer un saut de page à l'impression"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/fr.js b/bower_components/ckeditor/plugins/pagebreak/lang/fr.js new file mode 100644 index 0000000..941c0b1 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","fr",{alt:"Saut de page",toolbar:"Saut de page"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/gl.js b/bower_components/ckeditor/plugins/pagebreak/lang/gl.js new file mode 100644 index 0000000..fd239f3 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","gl",{alt:"Quebra de páxina",toolbar:"Inserir quebra de páxina"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/gu.js b/bower_components/ckeditor/plugins/pagebreak/lang/gu.js new file mode 100644 index 0000000..cd6a24e --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","gu",{alt:"નવું પાનું",toolbar:"ઇન્સર્ટ પેજબ્રેક/પાનાને અલગ કરવું/દાખલ કરવું"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/he.js b/bower_components/ckeditor/plugins/pagebreak/lang/he.js new file mode 100644 index 0000000..e5b8124 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","he",{alt:"שבירת דף",toolbar:"הוספת שבירת דף"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/hi.js b/bower_components/ckeditor/plugins/pagebreak/lang/hi.js new file mode 100644 index 0000000..940a28f --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","hi",{alt:"पेज ब्रेक",toolbar:"पेज ब्रेक इन्सर्ट् करें"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/hr.js b/bower_components/ckeditor/plugins/pagebreak/lang/hr.js new file mode 100644 index 0000000..6f86601 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","hr",{alt:"Prijelom stranice",toolbar:"Ubaci prijelom stranice"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/hu.js b/bower_components/ckeditor/plugins/pagebreak/lang/hu.js new file mode 100644 index 0000000..6b9fd0e --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","hu",{alt:"Oldaltörés",toolbar:"Oldaltörés beillesztése"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/id.js b/bower_components/ckeditor/plugins/pagebreak/lang/id.js new file mode 100644 index 0000000..71865ad --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","id",{alt:"Halaman Istirahat",toolbar:"Sisip Halaman Istirahat untuk Pencetakan "}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/is.js b/bower_components/ckeditor/plugins/pagebreak/lang/is.js new file mode 100644 index 0000000..27f2087 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","is",{alt:"Page Break",toolbar:"Setja inn síðuskil"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/it.js b/bower_components/ckeditor/plugins/pagebreak/lang/it.js new file mode 100644 index 0000000..1308ec6 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","it",{alt:"Interruzione di pagina",toolbar:"Inserisci interruzione di pagina per la stampa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/ja.js b/bower_components/ckeditor/plugins/pagebreak/lang/ja.js new file mode 100644 index 0000000..cc1574f --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","ja",{alt:"改ページ",toolbar:"印刷の為に改ページ挿入"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/ka.js b/bower_components/ckeditor/plugins/pagebreak/lang/ka.js new file mode 100644 index 0000000..6c999ff --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","ka",{alt:"გვერდის წყვეტა",toolbar:"გვერდის წყვეტა ბეჭდვისთვის"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/km.js b/bower_components/ckeditor/plugins/pagebreak/lang/km.js new file mode 100644 index 0000000..ab157e3 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","km",{alt:"បំបែក​ទំព័រ",toolbar:"បន្ថែម​ការ​បំបែក​ទំព័រ​មុន​បោះពុម្ព"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/ko.js b/bower_components/ckeditor/plugins/pagebreak/lang/ko.js new file mode 100644 index 0000000..c83c5e6 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","ko",{alt:"패이지 나누기",toolbar:"인쇄시 페이지 나누기 삽입"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/ku.js b/bower_components/ckeditor/plugins/pagebreak/lang/ku.js new file mode 100644 index 0000000..d989784 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","ku",{alt:"پشووی پەڕە",toolbar:"دانانی پشووی پەڕە بۆ چاپکردن"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/lt.js b/bower_components/ckeditor/plugins/pagebreak/lang/lt.js new file mode 100644 index 0000000..5879e3c --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","lt",{alt:"Puslapio skirtukas",toolbar:"Įterpti puslapių skirtuką"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/lv.js b/bower_components/ckeditor/plugins/pagebreak/lang/lv.js new file mode 100644 index 0000000..d594489 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","lv",{alt:"Lapas pārnesums",toolbar:"Ievietot lapas pārtraukumu drukai"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/mk.js b/bower_components/ckeditor/plugins/pagebreak/lang/mk.js new file mode 100644 index 0000000..5fdce2f --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","mk",{alt:"Page Break",toolbar:"Insert Page Break for Printing"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/mn.js b/bower_components/ckeditor/plugins/pagebreak/lang/mn.js new file mode 100644 index 0000000..272ffaf --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","mn",{alt:"Page Break",toolbar:"Хуудас тусгаарлагч оруулах"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/ms.js b/bower_components/ckeditor/plugins/pagebreak/lang/ms.js new file mode 100644 index 0000000..e0988ee --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","ms",{alt:"Page Break",toolbar:"Insert Page Break for Printing"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/nb.js b/bower_components/ckeditor/plugins/pagebreak/lang/nb.js new file mode 100644 index 0000000..15f45ee --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","nb",{alt:"Sideskift",toolbar:"Sett inn sideskift for utskrift"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/nl.js b/bower_components/ckeditor/plugins/pagebreak/lang/nl.js new file mode 100644 index 0000000..5c05b16 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","nl",{alt:"Pagina-einde",toolbar:"Pagina-einde invoegen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/no.js b/bower_components/ckeditor/plugins/pagebreak/lang/no.js new file mode 100644 index 0000000..ec64c6b --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","no",{alt:"Sideskift",toolbar:"Sett inn sideskift for utskrift"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/pl.js b/bower_components/ckeditor/plugins/pagebreak/lang/pl.js new file mode 100644 index 0000000..79861f9 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","pl",{alt:"Wstaw podział strony",toolbar:"Wstaw podział strony"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/pt-br.js b/bower_components/ckeditor/plugins/pagebreak/lang/pt-br.js new file mode 100644 index 0000000..31d256d --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","pt-br",{alt:"Quebra de Página",toolbar:"Inserir Quebra de Página"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/pt.js b/bower_components/ckeditor/plugins/pagebreak/lang/pt.js new file mode 100644 index 0000000..17ed211 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","pt",{alt:"Quebra de página",toolbar:"Inserir Quebra de Página"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/ro.js b/bower_components/ckeditor/plugins/pagebreak/lang/ro.js new file mode 100644 index 0000000..91833ba --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","ro",{alt:"Page Break",toolbar:"Inserează separator de pagină (Page Break)"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/ru.js b/bower_components/ckeditor/plugins/pagebreak/lang/ru.js new file mode 100644 index 0000000..621682c --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","ru",{alt:"Разрыв страницы",toolbar:"Вставить разрыв страницы для печати"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/si.js b/bower_components/ckeditor/plugins/pagebreak/lang/si.js new file mode 100644 index 0000000..a232df6 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","si",{alt:"පිටු බිදුම",toolbar:"මුද්‍රණය සඳහා පිටු බිදුමක් ඇතුලත් කරන්න"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/sk.js b/bower_components/ckeditor/plugins/pagebreak/lang/sk.js new file mode 100644 index 0000000..b465e98 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","sk",{alt:"Zalomenie strany",toolbar:"Vložiť oddeľovač stránky pre tlač"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/sl.js b/bower_components/ckeditor/plugins/pagebreak/lang/sl.js new file mode 100644 index 0000000..d07e904 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","sl",{alt:"Prelom Strani",toolbar:"Vstavi prelom strani"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/sq.js b/bower_components/ckeditor/plugins/pagebreak/lang/sq.js new file mode 100644 index 0000000..3b570e0 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","sq",{alt:"Thyerja e Faqes",toolbar:"Vendos Thyerje Faqeje për Shtyp"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/sr-latn.js b/bower_components/ckeditor/plugins/pagebreak/lang/sr-latn.js new file mode 100644 index 0000000..55877ba --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","sr-latn",{alt:"Page Break",toolbar:"Insert Page Break for Printing"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/sr.js b/bower_components/ckeditor/plugins/pagebreak/lang/sr.js new file mode 100644 index 0000000..9c6d9af --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","sr",{alt:"Page Break",toolbar:"Insert Page Break for Printing"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/sv.js b/bower_components/ckeditor/plugins/pagebreak/lang/sv.js new file mode 100644 index 0000000..a2210ce --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","sv",{alt:"Sidbrytning",toolbar:"Infoga sidbrytning för utskrift"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/th.js b/bower_components/ckeditor/plugins/pagebreak/lang/th.js new file mode 100644 index 0000000..55a2531 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","th",{alt:"ตัวแบ่งหน้า",toolbar:"แทรกตัวแบ่งหน้า Page Break"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/tr.js b/bower_components/ckeditor/plugins/pagebreak/lang/tr.js new file mode 100644 index 0000000..d5e64a5 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","tr",{alt:"Sayfa Sonu",toolbar:"Sayfa Sonu Ekle"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/tt.js b/bower_components/ckeditor/plugins/pagebreak/lang/tt.js new file mode 100644 index 0000000..df0ae8f --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","tt",{alt:"Бит бүлгече",toolbar:"Бастыру өчен бит бүлгечен өстәү"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/ug.js b/bower_components/ckeditor/plugins/pagebreak/lang/ug.js new file mode 100644 index 0000000..1040434 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","ug",{alt:"بەت ئايرىغۇچ",toolbar:"بەت ئايرىغۇچ قىستۇر"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/uk.js b/bower_components/ckeditor/plugins/pagebreak/lang/uk.js new file mode 100644 index 0000000..0abba67 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","uk",{alt:"Розрив Сторінки",toolbar:"Вставити розрив сторінки"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/vi.js b/bower_components/ckeditor/plugins/pagebreak/lang/vi.js new file mode 100644 index 0000000..5787cb6 --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","vi",{alt:"Ngắt trang",toolbar:"Chèn ngắt trang"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/zh-cn.js b/bower_components/ckeditor/plugins/pagebreak/lang/zh-cn.js new file mode 100644 index 0000000..39ec7ad --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","zh-cn",{alt:"分页符",toolbar:"插入打印分页符"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/lang/zh.js b/bower_components/ckeditor/plugins/pagebreak/lang/zh.js new file mode 100644 index 0000000..9b5a14c --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("pagebreak","zh",{alt:"換頁",toolbar:"插入換頁符號以便列印"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pagebreak/plugin.js b/bower_components/ckeditor/plugins/pagebreak/plugin.js new file mode 100644 index 0000000..6a88fbc --- /dev/null +++ b/bower_components/ckeditor/plugins/pagebreak/plugin.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function e(a){return{"aria-label":a,"class":"cke_pagebreak",contenteditable:"false","data-cke-display-name":"pagebreak","data-cke-pagebreak":1,style:"page-break-after: always",title:a}}CKEDITOR.plugins.add("pagebreak",{requires:"fakeobjects",lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"pagebreak,pagebreak-rtl", +hidpi:!0,onLoad:function(){var a=("background:url("+CKEDITOR.getUrl(this.path+"images/pagebreak.gif")+") no-repeat center center;clear:both;width:100%;border-top:#999 1px dotted;border-bottom:#999 1px dotted;padding:0;height:5px;cursor:default;").replace(/;/g," !important;");CKEDITOR.addCss("div.cke_pagebreak{"+a+"}")},init:function(a){a.blockless||(a.addCommand("pagebreak",CKEDITOR.plugins.pagebreakCmd),a.ui.addButton&&a.ui.addButton("PageBreak",{label:a.lang.pagebreak.toolbar,command:"pagebreak", +toolbar:"insert,70"}),CKEDITOR.env.webkit&&a.on("contentDom",function(){a.document.on("click",function(b){b=b.data.getTarget();b.is("div")&&b.hasClass("cke_pagebreak")&&a.getSelection().selectElement(b)})}))},afterInit:function(a){function b(f){CKEDITOR.tools.extend(f.attributes,e(a.lang.pagebreak.alt),!0);f.children.length=0}var c=a.dataProcessor,g=c&&c.dataFilter,c=c&&c.htmlFilter,h=/page-break-after\s*:\s*always/i,i=/display\s*:\s*none/i;c&&c.addRules({attributes:{"class":function(a,b){var c=a.replace("cke_pagebreak", +"");if(c!=a){var d=CKEDITOR.htmlParser.fragment.fromHtml('<span style="display: none;"> </span>').children[0];b.children.length=0;b.add(d);d=b.attributes;delete d["aria-label"];delete d.contenteditable;delete d.title}return c}}},{applyToAll:!0,priority:5});g&&g.addRules({elements:{div:function(a){if(a.attributes["data-cke-pagebreak"])b(a);else if(h.test(a.attributes.style)){var c=a.children[0];c&&("span"==c.name&&i.test(c.attributes.style))&&b(a)}}}})}});CKEDITOR.plugins.pagebreakCmd={exec:function(a){var b= +a.document.createElement("div",{attributes:e(a.lang.pagebreak.alt)});a.insertElement(b)},context:"div",allowedContent:{div:{styles:"!page-break-after"},span:{match:function(a){return(a=a.parent)&&"div"==a.name&&a.styles&&a.styles["page-break-after"]},styles:"display"}},requiredContent:"div{page-break-after}"}})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/panelbutton/plugin.js b/bower_components/ckeditor/plugins/panelbutton/plugin.js new file mode 100644 index 0000000..674e1c3 --- /dev/null +++ b/bower_components/ckeditor/plugins/panelbutton/plugin.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.add("panelbutton",{requires:"button",onLoad:function(){function e(c){var a=this._;a.state!=CKEDITOR.TRISTATE_DISABLED&&(this.createPanel(c),a.on?a.panel.hide():a.panel.showBlock(this._.id,this.document.getById(this._.id),4))}CKEDITOR.ui.panelButton=CKEDITOR.tools.createClass({base:CKEDITOR.ui.button,$:function(c){var a=c.panel||{};delete c.panel;this.base(c);this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.block={attributes:a.attributes};this.hasArrow=a.toolbarRelated= +!0;this.click=e;this._={panelDefinition:a}},statics:{handler:{create:function(c){return new CKEDITOR.ui.panelButton(c)}}},proto:{createPanel:function(c){var a=this._;if(!a.panel){var f=this._.panelDefinition,e=this._.panelDefinition.block,g=f.parent||CKEDITOR.document.getBody(),d=this._.panel=new CKEDITOR.ui.floatPanel(c,g,f),f=d.addBlock(a.id,e),b=this;d.onShow=function(){b.className&&this.element.addClass(b.className+"_panel");b.setState(CKEDITOR.TRISTATE_ON);a.on=1;b.editorFocus&&c.focus();if(b.onOpen)b.onOpen()}; +d.onHide=function(d){b.className&&this.element.getFirst().removeClass(b.className+"_panel");b.setState(b.modes&&b.modes[c.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);a.on=0;if(!d&&b.onClose)b.onClose()};d.onEscape=function(){d.hide(1);b.document.getById(a.id).focus()};if(this.onBlock)this.onBlock(d,f);f.onHide=function(){a.on=0;b.setState(CKEDITOR.TRISTATE_OFF)}}}}})},beforeInit:function(e){e.ui.addHandler(CKEDITOR.UI_PANELBUTTON,CKEDITOR.ui.panelButton.handler)}}); +CKEDITOR.UI_PANELBUTTON="panelbutton"; \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/pastefromword/filter/default.js b/bower_components/ckeditor/plugins/pastefromword/filter/default.js new file mode 100644 index 0000000..9c58a16 --- /dev/null +++ b/bower_components/ckeditor/plugins/pastefromword/filter/default.js @@ -0,0 +1,31 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function y(a){for(var a=a.toUpperCase(),c=z.length,b=0,f=0;f<c;++f)for(var d=z[f],e=d[1].length;a.substr(0,e)==d[1];a=a.substr(e))b+=d[0];return b}function A(a){for(var a=a.toUpperCase(),c=B.length,b=1,f=1;0<a.length;f*=c)b+=B.indexOf(a.charAt(a.length-1))*f,a=a.substr(0,a.length-1);return b}var C=CKEDITOR.htmlParser.fragment.prototype,o=CKEDITOR.htmlParser.element.prototype;C.onlyChild=o.onlyChild=function(){var a=this.children;return 1==a.length&&a[0]||null};o.removeAnyChildWithName= +function(a){for(var c=this.children,b=[],f,d=0;d<c.length;d++)f=c[d],f.name&&(f.name==a&&(b.push(f),c.splice(d--,1)),b=b.concat(f.removeAnyChildWithName(a)));return b};o.getAncestor=function(a){for(var c=this.parent;c&&(!c.name||!c.name.match(a));)c=c.parent;return c};C.firstChild=o.firstChild=function(a){for(var c,b=0;b<this.children.length;b++)if(c=this.children[b],a(c)||c.name&&(c=c.firstChild(a)))return c;return null};o.addStyle=function(a,c,b){var f="";if("string"==typeof c)f+=a+":"+c+";";else{if("object"== +typeof a)for(var d in a)a.hasOwnProperty(d)&&(f+=d+":"+a[d]+";");else f+=a;b=c}this.attributes||(this.attributes={});a=this.attributes.style||"";a=(b?[f,a]:[a,f]).join(";");this.attributes.style=a.replace(/^;+|;(?=;)/g,"")};o.getStyle=function(a){var c=this.attributes.style;if(c)return c=CKEDITOR.tools.parseCssText(c,1),c[a]};CKEDITOR.dtd.parentOf=function(a){var c={},b;for(b in this)-1==b.indexOf("$")&&this[b][a]&&(c[b]=1);return c};var H=/^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i, +D=/^(?:\b0[^\s]*\s*){1,4}$/,x={ol:{decimal:/\d+/,"lower-roman":/^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/,"upper-roman":/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/,"lower-alpha":/^[a-z]+$/,"upper-alpha":/^[A-Z]+$/},ul:{disc:/[l\u00B7\u2002]/,circle:/[\u006F\u00D8]/,square:/[\u006E\u25C6]/}},z=[[1E3,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]],B="ABCDEFGHIJKLMNOPQRSTUVWXYZ",s=0,t=null,w,E=CKEDITOR.plugins.pastefromword= +{utils:{createListBulletMarker:function(a,c){var b=new CKEDITOR.htmlParser.element("cke:listbullet");b.attributes={"cke:listsymbol":a[0]};b.add(new CKEDITOR.htmlParser.text(c));return b},isListBulletIndicator:function(a){if(/mso-list\s*:\s*Ignore/i.test(a.attributes&&a.attributes.style))return!0},isContainingOnlySpaces:function(a){var c;return(c=a.onlyChild())&&/^(:?\s| )+$/.test(c.value)},resolveList:function(a){var c=a.attributes,b;if((b=a.removeAnyChildWithName("cke:listbullet"))&&b.length&& +(b=b[0]))return a.name="cke:li",c.style&&(c.style=E.filters.stylesFilter([["text-indent"],["line-height"],[/^margin(:?-left)?$/,null,function(a){a=a.split(" ");a=CKEDITOR.tools.convertToPx(a[3]||a[1]||a[0]);!s&&(null!==t&&a>t)&&(s=a-t);t=a;c["cke:indent"]=s&&Math.ceil(a/s)+1||1}],[/^mso-list$/,null,function(a){var a=a.split(" "),b=Number(a[0].match(/\d+/)),a=Number(a[1].match(/\d+/));1==a&&(b!==w&&(c["cke:reset"]=1),w=b);c["cke:indent"]=a}]])(c.style,a)||""),c["cke:indent"]||(t=0,c["cke:indent"]= +1),CKEDITOR.tools.extend(c,b.attributes),!0;w=t=s=null;return!1},getStyleComponents:function(){var a=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;"></div>',CKEDITOR.document);CKEDITOR.document.getBody().append(a);return function(c,b,f){a.setStyle(c,b);for(var c={},b=f.length,d=0;d<b;d++)c[f[d]]=a.getStyle(f[d]);return c}}(),listDtdParents:CKEDITOR.dtd.parentOf("ol")},filters:{flattenList:function(a,c){var c="number"==typeof c?c:1,b=a.attributes,f;switch(b.type){case "a":f= +"lower-alpha";break;case "1":f="decimal"}for(var d=a.children,e,h=0;h<d.length;h++)if(e=d[h],e.name in CKEDITOR.dtd.$listItem){var j=e.attributes,g=e.children,m=g[g.length-1];m.name in CKEDITOR.dtd.$list&&(a.add(m,h+1),--g.length||d.splice(h--,1));e.name="cke:li";b.start&&!h&&(j.value=b.start);E.filters.stylesFilter([["tab-stops",null,function(a){(a=a.split(" ")[1].match(H))&&(t=CKEDITOR.tools.convertToPx(a[0]))}],1==c?["mso-list",null,function(a){a=a.split(" ");a=Number(a[0].match(/\d+/));a!==w&& +(j["cke:reset"]=1);w=a}]:null])(j.style);j["cke:indent"]=c;j["cke:listtype"]=a.name;j["cke:list-style-type"]=f}else if(e.name in CKEDITOR.dtd.$list){arguments.callee.apply(this,[e,c+1]);d=d.slice(0,h).concat(e.children).concat(d.slice(h+1));a.children=[];e=0;for(g=d.length;e<g;e++)a.add(d[e]);d=a.children}delete a.name;b["cke:list"]=1},assembleList:function(a){for(var c=a.children,b,f,d,e,h,j,a=[],g,m,i,l,k,p,n=0;n<c.length;n++)if(b=c[n],"cke:li"==b.name)if(b.name="li",f=b.attributes,i=(i=f["cke:listsymbol"])&& +i.match(/^(?:[(]?)([^\s]+?)([.)]?)$/),l=k=p=null,f["cke:ignored"])c.splice(n--,1);else{f["cke:reset"]&&(j=e=h=null);d=Number(f["cke:indent"]);d!=e&&(m=g=null);if(i){if(m&&x[m][g].test(i[1]))l=m,k=g;else for(var q in x)for(var u in x[q])if(x[q][u].test(i[1]))if("ol"==q&&/alpha|roman/.test(u)){if(g=/roman/.test(u)?y(i[1]):A(i[1]),!p||g<p)p=g,l=q,k=u}else{l=q;k=u;break}!l&&(l=i[2]?"ol":"ul")}else l=f["cke:listtype"]||"ol",k=f["cke:list-style-type"];m=l;g=k||("ol"==l?"decimal":"disc");k&&k!=("ol"==l? +"decimal":"disc")&&b.addStyle("list-style-type",k);if("ol"==l&&i){switch(k){case "decimal":p=Number(i[1]);break;case "lower-roman":case "upper-roman":p=y(i[1]);break;case "lower-alpha":case "upper-alpha":p=A(i[1])}b.attributes.value=p}if(j){if(d>e)a.push(j=new CKEDITOR.htmlParser.element(l)),j.add(b),h.add(j);else{if(d<e){e-=d;for(var r;e--&&(r=j.parent);)j=r.parent}j.add(b)}c.splice(n--,1)}else a.push(j=new CKEDITOR.htmlParser.element(l)),j.add(b),c[n]=j;h=b;e=d}else j&&(j=e=h=null);for(n=0;n<a.length;n++)if(j= +a[n],q=j.children,g=g=void 0,u=j.children.length,r=g=void 0,c=/list-style-type:(.*?)(?:;|$)/,e=CKEDITOR.plugins.pastefromword.filters.stylesFilter,g=j.attributes,!c.exec(g.style)){for(h=0;h<u;h++)if(g=q[h],g.attributes.value&&Number(g.attributes.value)==h+1&&delete g.attributes.value,g=c.exec(g.attributes.style))if(g[1]==r||!r)r=g[1];else{r=null;break}if(r){for(h=0;h<u;h++)g=q[h].attributes,g.style&&(g.style=e([["list-style-type"]])(g.style)||"");j.addStyle("list-style-type",r)}}w=t=s=null},falsyFilter:function(){return!1}, +stylesFilter:function(a,c){return function(b,f){var d=[];(b||"").replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(b,e,g){e=e.toLowerCase();"font-family"==e&&(g=g.replace(/["']/g,""));for(var m,i,l,k=0;k<a.length;k++)if(a[k]&&(b=a[k][0],m=a[k][1],i=a[k][2],l=a[k][3],e.match(b)&&(!m||g.match(m)))){e=l||e;c&&(i=i||g);"function"==typeof i&&(i=i(g,f,e));i&&i.push&&(e=i[0],i=i[1]);"string"==typeof i&&d.push([e,i]);return}!c&&d.push([e,g])});for(var e=0;e<d.length;e++)d[e]= +d[e].join(":");return d.length?d.join(";")+";":!1}},elementMigrateFilter:function(a,c){return a?function(b){var f=c?(new CKEDITOR.style(a,c))._.definition:a;b.name=f.element;CKEDITOR.tools.extend(b.attributes,CKEDITOR.tools.clone(f.attributes));b.addStyle(CKEDITOR.style.getStyleText(f))}:function(){}},styleMigrateFilter:function(a,c){var b=this.elementMigrateFilter;return a?function(f,d){var e=new CKEDITOR.htmlParser.element(null),h={};h[c]=f;b(a,h)(e);e.children=d.children;d.children=[e];e.filter= +function(){};e.parent=d}:function(){}},bogusAttrFilter:function(a,c){if(-1==c.name.indexOf("cke:"))return!1},applyStyleFilter:null},getRules:function(a,c){var b=CKEDITOR.dtd,f=CKEDITOR.tools.extend({},b.$block,b.$listItem,b.$tableContent),d=a.config,e=this.filters,h=e.falsyFilter,j=e.stylesFilter,g=e.elementMigrateFilter,m=CKEDITOR.tools.bind(this.filters.styleMigrateFilter,this.filters),i=this.utils.createListBulletMarker,l=e.flattenList,k=e.assembleList,p=this.utils.isListBulletIndicator,n=this.utils.isContainingOnlySpaces, +q=this.utils.resolveList,u=function(a){a=CKEDITOR.tools.convertToPx(a);return isNaN(a)?a:a+"px"},r=this.utils.getStyleComponents,t=this.utils.listDtdParents,o=!1!==d.pasteFromWordRemoveFontStyles,s=!1!==d.pasteFromWordRemoveStyles;return{elementNames:[[/meta|link|script/,""]],root:function(a){a.filterChildren(c);k(a)},elements:{"^":function(a){var c;CKEDITOR.env.gecko&&(c=e.applyStyleFilter)&&c(a)},$:function(a){var v=a.name||"",e=a.attributes;v in f&&e.style&&(e.style=j([[/^(:?width|height)$/,null, +u]])(e.style)||"");if(v.match(/h\d/)){a.filterChildren(c);if(q(a))return;g(d["format_"+v])(a)}else if(v in b.$inline)a.filterChildren(c),n(a)&&delete a.name;else if(-1!=v.indexOf(":")&&-1==v.indexOf("cke")){a.filterChildren(c);if("v:imagedata"==v){if(v=a.attributes["o:href"])a.attributes.src=v;a.name="img";return}delete a.name}v in t&&(a.filterChildren(c),k(a))},style:function(a){if(CKEDITOR.env.gecko){var a=(a=a.onlyChild().value.match(/\/\* Style Definitions \*\/([\s\S]*?)\/\*/))&&a[1],c={};a&& +(a.replace(/[\n\r]/g,"").replace(/(.+?)\{(.+?)\}/g,function(a,b,F){for(var b=b.split(","),a=b.length,d=0;d<a;d++)CKEDITOR.tools.trim(b[d]).replace(/^(\w+)(\.[\w-]+)?$/g,function(a,b,d){b=b||"*";d=d.substring(1,d.length);d.match(/MsoNormal/)||(c[b]||(c[b]={}),d?c[b][d]=F:c[b]=F)})}),e.applyStyleFilter=function(a){var b=c["*"]?"*":a.name,d=a.attributes&&a.attributes["class"];b in c&&(b=c[b],"object"==typeof b&&(b=b[d]),b&&a.addStyle(b,!0))})}return!1},p:function(a){if(/MsoListParagraph/i.exec(a.attributes["class"])|| +a.getStyle("mso-list")){var b=a.firstChild(function(a){return a.type==CKEDITOR.NODE_TEXT&&!n(a.parent)});(b=b&&b.parent)&&b.addStyle("mso-list","Ignore")}a.filterChildren(c);q(a)||(d.enterMode==CKEDITOR.ENTER_BR?(delete a.name,a.add(new CKEDITOR.htmlParser.element("br"))):g(d["format_"+(d.enterMode==CKEDITOR.ENTER_P?"p":"div")])(a))},div:function(a){var c=a.onlyChild();if(c&&"table"==c.name){var b=a.attributes;c.attributes=CKEDITOR.tools.extend(c.attributes,b);b.style&&c.addStyle(b.style);c=new CKEDITOR.htmlParser.element("div"); +c.addStyle("clear","both");a.add(c);delete a.name}},td:function(a){a.getAncestor("thead")&&(a.name="th")},ol:l,ul:l,dl:l,font:function(a){if(p(a.parent))delete a.name;else{a.filterChildren(c);var b=a.attributes,d=b.style,e=a.parent;"font"==e.name?(CKEDITOR.tools.extend(e.attributes,a.attributes),d&&e.addStyle(d),delete a.name):(d=(d||"").split(";"),b.color&&("#000000"!=b.color&&d.push("color:"+b.color),delete b.color),b.face&&(d.push("font-family:"+b.face),delete b.face),b.size&&(d.push("font-size:"+ +(3<b.size?"large":3>b.size?"small":"medium")),delete b.size),a.name="span",a.addStyle(d.join(";")))}},span:function(a){if(p(a.parent))return!1;a.filterChildren(c);if(n(a))return delete a.name,null;if(p(a)){var b=a.firstChild(function(a){return a.value||"img"==a.name}),e=(b=b&&(b.value||"l."))&&b.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);if(e)return b=i(e,b),(a=a.getAncestor("span"))&&/ mso-hide:\s*all|display:\s*none /.test(a.attributes.style)&&(b.attributes["cke:ignored"]=1),b}if(e=(b=a.attributes)&&b.style)b.style= +j([["line-height"],[/^font-family$/,null,!o?m(d.font_style,"family"):null],[/^font-size$/,null,!o?m(d.fontSize_style,"size"):null],[/^color$/,null,!o?m(d.colorButton_foreStyle,"color"):null],[/^background-color$/,null,!o?m(d.colorButton_backStyle,"color"):null]])(e,a)||"";b.style||delete b.style;CKEDITOR.tools.isEmpty(b)&&delete a.name;return null},b:g(d.coreStyles_bold),i:g(d.coreStyles_italic),u:g(d.coreStyles_underline),s:g(d.coreStyles_strike),sup:g(d.coreStyles_superscript),sub:g(d.coreStyles_subscript), +a:function(a){a=a.attributes;a.href&&a.href.match(/^file:\/\/\/[\S]+#/i)&&(a.href=a.href.replace(/^file:\/\/\/[^#]+/i,""))},"cke:listbullet":function(a){a.getAncestor(/h\d/)&&!d.pasteFromWordNumberedHeadingToList&&delete a.name}},attributeNames:[[/^onmouse(:?out|over)/,""],[/^onload$/,""],[/(?:v|o):\w+/,""],[/^lang/,""]],attributes:{style:j(s?[[/^list-style-type$/,null],[/^margin$|^margin-(?!bottom|top)/,null,function(a,b,c){if(b.name in{p:1,div:1}){b="ltr"==d.contentsLangDirection?"margin-left": +"margin-right";if("margin"==c)a=r(c,a,[b])[b];else if(c!=b)return null;if(a&&!D.test(a))return[b,a]}return null}],[/^clear$/],[/^border.*|margin.*|vertical-align|float$/,null,function(a,b){if("img"==b.name)return a}],[/^width|height$/,null,function(a,b){if(b.name in{table:1,td:1,th:1,img:1})return a}]]:[[/^mso-/],[/-color$/,null,function(a){if("transparent"==a)return!1;if(CKEDITOR.env.gecko)return a.replace(/-moz-use-text-color/g,"transparent")}],[/^margin$/,D],["text-indent","0cm"],["page-break-before"], +["tab-stops"],["display","none"],o?[/font-?/]:null],s),width:function(a,c){if(c.name in b.$tableContent)return!1},border:function(a,c){if(c.name in b.$tableContent)return!1},"class":h,bgcolor:h,valign:s?h:function(a,b){b.addStyle("vertical-align",a);return!1}},comment:!CKEDITOR.env.ie?function(a,b){var c=a.match(/<img.*?>/),d=a.match(/^\[if !supportLists\]([\s\S]*?)\[endif\]$/);return d?(d=(c=d[1]||c&&"l.")&&c.match(/>(?:[(]?)([^\s]+?)([.)]?)</),i(d,c)):CKEDITOR.env.gecko&&c?(c=CKEDITOR.htmlParser.fragment.fromHtml(c[0]).children[0], +(d=(d=(d=b.previous)&&d.value.match(/<v:imagedata[^>]*o:href=['"](.*?)['"]/))&&d[1])&&(c.attributes.src=d),c):!1}:h}}},G=function(){this.dataFilter=new CKEDITOR.htmlParser.filter};G.prototype={toHtml:function(a){var a=CKEDITOR.htmlParser.fragment.fromHtml(a),c=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(c,this.dataFilter);return c.getHtml(!0)}};CKEDITOR.cleanWord=function(a,c){CKEDITOR.env.gecko&&(a=a.replace(/(<\!--\[if[^<]*?\])--\>([\S\s]*?)<\!--(\[endif\]--\>)/gi,"$1$2$3"));CKEDITOR.env.webkit&& +(a=a.replace(/(class="MsoListParagraph[^>]+><\!--\[if !supportLists\]--\>)([^<]+<span[^<]+<\/span>)(<\!--\[endif\]--\>)/gi,"$1<span>$2</span>$3"));var b=new G,f=b.dataFilter;f.addRules(CKEDITOR.plugins.pastefromword.getRules(c,f));c.fire("beforeCleanWord",{filter:f});try{a=b.toHtml(a)}catch(d){alert(c.lang.pastefromword.error)}a=a.replace(/cke:.*?".*?"/g,"");a=a.replace(/style=""/g,"");return a=a.replace(/<span>/g,"")}})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/dialogs/placeholder.js b/bower_components/ckeditor/plugins/placeholder/dialogs/placeholder.js new file mode 100644 index 0000000..8412e17 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/dialogs/placeholder.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("placeholder",function(a){var b=a.lang.placeholder,a=a.lang.common.generalTab;return{title:b.title,minWidth:300,minHeight:80,contents:[{id:"info",label:a,title:a,elements:[{id:"name",type:"text",style:"width: 100%;",label:b.name,"default":"",required:!0,validate:CKEDITOR.dialog.validate.regex(/^[^\[\]<>]+$/,b.invalidName),setup:function(a){this.setValue(a.data.name)},commit:function(a){a.setData("name",this.getValue())}}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/icons/hidpi/placeholder.png b/bower_components/ckeditor/plugins/placeholder/icons/hidpi/placeholder.png new file mode 100644 index 0000000..0b7abce Binary files /dev/null and b/bower_components/ckeditor/plugins/placeholder/icons/hidpi/placeholder.png differ diff --git a/bower_components/ckeditor/plugins/placeholder/icons/placeholder.png b/bower_components/ckeditor/plugins/placeholder/icons/placeholder.png new file mode 100644 index 0000000..cb12b48 Binary files /dev/null and b/bower_components/ckeditor/plugins/placeholder/icons/placeholder.png differ diff --git a/bower_components/ckeditor/plugins/placeholder/lang/af.js b/bower_components/ckeditor/plugins/placeholder/lang/af.js new file mode 100644 index 0000000..20b1be7 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/af.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","af",{title:"Plekhouer eienskappe",toolbar:"Plekhouer",name:"Plekhouer naam",invalidName:"Die plekhouer mag nie leeg wees nie, en kan geen van die volgende karakters bevat nie. [, ], <, >",pathName:"plekhouer"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/ar.js b/bower_components/ckeditor/plugins/placeholder/lang/ar.js new file mode 100644 index 0000000..745d4c5 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/ar.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","ar",{title:"خصائص الربط الموضعي",toolbar:"الربط الموضعي",name:"اسم الربط الموضعي",invalidName:"لا يمكن ترك الربط الموضعي فارغا و لا أن يحتوي على الرموز التالية [, ], <, >",pathName:"الربط الموضعي"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/bg.js b/bower_components/ckeditor/plugins/placeholder/lang/bg.js new file mode 100644 index 0000000..540805b --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/bg.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","bg",{title:"Настройки на контейнера",toolbar:"Нов контейнер",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/ca.js b/bower_components/ckeditor/plugins/placeholder/lang/ca.js new file mode 100644 index 0000000..6b407fd --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/ca.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","ca",{title:"Propietats del marcador de posició",toolbar:"Marcador de posició",name:"Nom del marcador de posició",invalidName:"El marcador de posició no pot estar en blanc ni pot contenir cap dels caràcters següents: [,],<,>",pathName:"marcador de posició"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/cs.js b/bower_components/ckeditor/plugins/placeholder/lang/cs.js new file mode 100644 index 0000000..4a1f753 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/cs.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","cs",{title:"Vlastnosti vyhrazeného prostoru",toolbar:"Vytvořit vyhrazený prostor",name:"Název vyhrazeného prostoru",invalidName:"Vyhrazený prostor nesmí být prázdný či obsahovat následující znaky: [, ], <, >",pathName:"Vyhrazený prostor"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/cy.js b/bower_components/ckeditor/plugins/placeholder/lang/cy.js new file mode 100644 index 0000000..143c9bd --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/cy.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","cy",{title:"Priodweddau'r Daliwr Geiriau",toolbar:"Daliwr Geiriau",name:"Enw'r Daliwr Geiriau",invalidName:"Dyw'r daliwr geiriau methu â bod yn wag ac na all gynnyws y nodau [, ], <, > ",pathName:"daliwr geiriau"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/da.js b/bower_components/ckeditor/plugins/placeholder/lang/da.js new file mode 100644 index 0000000..f3a1783 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/da.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","da",{title:"Egenskaber for pladsholder",toolbar:"Opret pladsholder",name:"Navn på pladsholder",invalidName:"Pladsholderen kan ikke være tom og må ikke indeholde nogen af følgende tegn: [, ], <, >",pathName:"pladsholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/de.js b/bower_components/ckeditor/plugins/placeholder/lang/de.js new file mode 100644 index 0000000..62f2b2e --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/de.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","de",{title:"Platzhalter Einstellungen",toolbar:"Platzhalter erstellen",name:"Platzhalter Name",invalidName:"Der Platzhalter darf nicht leer sein und folgende Zeichen nicht enthalten: [, ], <, >",pathName:"Platzhalter"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/el.js b/bower_components/ckeditor/plugins/placeholder/lang/el.js new file mode 100644 index 0000000..07ebe95 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/el.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","el",{title:"Ιδιότητες Υποκαθιστόμενου Κειμένου",toolbar:"Δημιουργία Υποκαθιστόμενου Κειμένου",name:"Όνομα Υποκαθιστόμενου Κειμένου",invalidName:"Το υποκαθιστόμενου κειμένο πρέπει να μην είναι κενό και να μην έχει κανέναν από τους ακόλουθους χαρακτήρες: [, ], <, >",pathName:"υποκαθιστόμενο κείμενο"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/en-gb.js b/bower_components/ckeditor/plugins/placeholder/lang/en-gb.js new file mode 100644 index 0000000..319bc08 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/en-gb.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","en-gb",{title:"Placeholder Properties",toolbar:"Placeholder",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of the following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/en.js b/bower_components/ckeditor/plugins/placeholder/lang/en.js new file mode 100644 index 0000000..7f7b148 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/en.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","en",{title:"Placeholder Properties",toolbar:"Placeholder",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/eo.js b/bower_components/ckeditor/plugins/placeholder/lang/eo.js new file mode 100644 index 0000000..d5f98a7 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/eo.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","eo",{title:"Atributoj de la rezervita spaco",toolbar:"Rezervita Spaco",name:"Nomo de la rezervita spaco",invalidName:"La rezervita spaco ne povas esti malplena kaj ne povas enteni la sekvajn signojn : [, ], <, >",pathName:"rezervita spaco"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/es.js b/bower_components/ckeditor/plugins/placeholder/lang/es.js new file mode 100644 index 0000000..1ef6ad9 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/es.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","es",{title:"Propiedades del Marcador de Posición",toolbar:"Crear Marcador de Posición",name:"Nombre del Marcador de Posición",invalidName:"El marcador de posición no puede estar vacío y no puede contener ninguno de los siguientes caracteres: [, ], <, >",pathName:"marcador de posición"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/et.js b/bower_components/ckeditor/plugins/placeholder/lang/et.js new file mode 100644 index 0000000..aa4a8a5 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/et.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","et",{title:"Kohahoidja omadused",toolbar:"Kohahoidja loomine",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/eu.js b/bower_components/ckeditor/plugins/placeholder/lang/eu.js new file mode 100644 index 0000000..758bce8 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/eu.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","eu",{title:"Leku-marka Aukerak",toolbar:"Leku-marka sortu",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/fa.js b/bower_components/ckeditor/plugins/placeholder/lang/fa.js new file mode 100644 index 0000000..4df4731 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/fa.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","fa",{title:"ویژگی‌های محل نگهداری",toolbar:"ایجاد یک محل نگهداری",name:"نام مکان نگهداری",invalidName:"مکان نگهداری نمی‌تواند خالی باشد و همچنین نمی‌تواند محتوی نویسه‌های مقابل باشد: [, ], <, >",pathName:"مکان نگهداری"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/fi.js b/bower_components/ckeditor/plugins/placeholder/lang/fi.js new file mode 100644 index 0000000..44c7ceb --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/fi.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","fi",{title:"Paikkamerkin ominaisuudet",toolbar:"Luo paikkamerkki",name:"Paikkamerkin nimi",invalidName:"Paikkamerkki ei voi olla tyhjä eikä sisältää seuraavia merkkejä: [, ], <, >",pathName:"paikkamerkki"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/fr-ca.js b/bower_components/ckeditor/plugins/placeholder/lang/fr-ca.js new file mode 100644 index 0000000..f07de74 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/fr-ca.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","fr-ca",{title:"Propriétés de l'espace réservé",toolbar:"Créer un espace réservé",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/fr.js b/bower_components/ckeditor/plugins/placeholder/lang/fr.js new file mode 100644 index 0000000..1940028 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/fr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","fr",{title:"Propriétés de l'Espace réservé",toolbar:"Créer l'Espace réservé",name:"Nom de l'espace réservé",invalidName:"L'espace réservé ne peut pas être vide ni contenir l'un de ses caractères : [, ], <, >",pathName:"espace réservé"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/gl.js b/bower_components/ckeditor/plugins/placeholder/lang/gl.js new file mode 100644 index 0000000..d7f6049 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/gl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","gl",{title:"Propiedades do marcador de posición",toolbar:"Crear un marcador de posición",name:"Nome do marcador de posición",invalidName:"O marcador de posición non pode estar baleiro e non pode conter ningún dos caracteres seguintes: [, ], <, >",pathName:"marcador de posición"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/he.js b/bower_components/ckeditor/plugins/placeholder/lang/he.js new file mode 100644 index 0000000..ca00145 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/he.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","he",{title:"מאפייני שומר מקום",toolbar:"צור שומר מקום",name:"שם שומר מקום",invalidName:"שומר מקום לא יכול להיות ריק ולא יכול להכיל את הסימנים: [, ], <, >",pathName:"שומר מקום"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/hr.js b/bower_components/ckeditor/plugins/placeholder/lang/hr.js new file mode 100644 index 0000000..e53c847 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/hr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","hr",{title:"Svojstva rezerviranog mjesta",toolbar:"Napravi rezervirano mjesto",name:"Ime rezerviranog mjesta",invalidName:"Rezervirano mjesto ne može biti prazno niti može sadržavati ijedan od sljedećih znakova: [, ], <, >",pathName:"rezervirano mjesto"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/hu.js b/bower_components/ckeditor/plugins/placeholder/lang/hu.js new file mode 100644 index 0000000..038ca05 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/hu.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","hu",{title:"Helytartó beállítások",toolbar:"Helytartó készítése",name:"Helytartó neve",invalidName:"A helytartó nem lehet üres, és nem tartalmazhatja a következő karaktereket:[, ], <, > ",pathName:"helytartó"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/id.js b/bower_components/ckeditor/plugins/placeholder/lang/id.js new file mode 100644 index 0000000..896ade1 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/id.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","id",{title:"Properti isian sementara",toolbar:"Buat isian sementara",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/it.js b/bower_components/ckeditor/plugins/placeholder/lang/it.js new file mode 100644 index 0000000..2066596 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/it.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","it",{title:"Proprietà segnaposto",toolbar:"Crea segnaposto",name:"Nome segnaposto",invalidName:"Il segnaposto non può essere vuoto e non può contenere nessuno dei seguenti caratteri: [, ], <, >",pathName:"segnaposto"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/ja.js b/bower_components/ckeditor/plugins/placeholder/lang/ja.js new file mode 100644 index 0000000..af7ec9f --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/ja.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","ja",{title:"プレースホルダのプロパティ",toolbar:"プレースホルダを作成",name:"プレースホルダ名",invalidName:"プレースホルダは空欄にできません。また、[, ], <, > の文字は使用できません。",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/km.js b/bower_components/ckeditor/plugins/placeholder/lang/km.js new file mode 100644 index 0000000..6ee9c46 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/km.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","km",{title:"លក្ខណៈ Placeholder",toolbar:"បង្កើត Placeholder",name:"ឈ្មោះ Placeholder",invalidName:"Placeholder មិន​អាច​ទទេរ ហើយក៏​មិន​អាច​មាន​តួ​អក្សរ​ទាំង​នេះ​ទេ៖ [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/ko.js b/bower_components/ckeditor/plugins/placeholder/lang/ko.js new file mode 100644 index 0000000..9d872ff --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/ko.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","ko",{title:"플레이스홀도 속성",toolbar:"플레이스홀더 생성",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/ku.js b/bower_components/ckeditor/plugins/placeholder/lang/ku.js new file mode 100644 index 0000000..d09d4a8 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/ku.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","ku",{title:"خاسیەتی شوێن هەڵگر",toolbar:"درووستکردنی شوێن هەڵگر",name:"ناوی شوێنگر",invalidName:"شوێنگر نابێت بەتاڵ بێت یان هەریەکێک لەم نووسانەی خوارەوەی تێدابێت: [, ], <, >",pathName:"شوێنگر"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/lv.js b/bower_components/ckeditor/plugins/placeholder/lang/lv.js new file mode 100644 index 0000000..9853eb3 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/lv.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","lv",{title:"Viettura uzstādījumi",toolbar:"Izveidot vietturi",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/nb.js b/bower_components/ckeditor/plugins/placeholder/lang/nb.js new file mode 100644 index 0000000..871fb5e --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/nb.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","nb",{title:"Egenskaper for plassholder",toolbar:"Opprett plassholder",name:"Navn på plassholder",invalidName:"Plassholderen kan ikke være tom, og kan ikke inneholde følgende tegn: [, ], <, >",pathName:"plassholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/nl.js b/bower_components/ckeditor/plugins/placeholder/lang/nl.js new file mode 100644 index 0000000..fdfeea7 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/nl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","nl",{title:"Eigenschappen placeholder",toolbar:"Placeholder aanmaken",name:"Naam placeholder",invalidName:"De placeholder mag niet leeg zijn, en mag niet een van de volgende tekens bevatten: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/no.js b/bower_components/ckeditor/plugins/placeholder/lang/no.js new file mode 100644 index 0000000..b706284 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/no.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","no",{title:"Egenskaper for plassholder",toolbar:"Opprett plassholder",name:"Navn på plassholder",invalidName:"Plassholderen kan ikke være tom, og kan ikke inneholde følgende tegn: [, ], <, >",pathName:"plassholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/pl.js b/bower_components/ckeditor/plugins/placeholder/lang/pl.js new file mode 100644 index 0000000..1a5b10a --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/pl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","pl",{title:"Właściwości wypełniacza",toolbar:"Utwórz wypełniacz",name:"Nazwa wypełniacza",invalidName:"Wypełniacz nie może być pusty ani nie może zawierać żadnego z następujących znaków: [, ], < oraz >",pathName:"wypełniacz"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/pt-br.js b/bower_components/ckeditor/plugins/placeholder/lang/pt-br.js new file mode 100644 index 0000000..ad7e74c --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/pt-br.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","pt-br",{title:"Propriedades do Espaço Reservado",toolbar:"Criar Espaço Reservado",name:"Nome do Espaço Reservado",invalidName:"O espaço reservado não pode estar vazio e não pode conter nenhum dos seguintes caracteres: [, ], <, >",pathName:"Espaço Reservado"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/pt.js b/bower_components/ckeditor/plugins/placeholder/lang/pt.js new file mode 100644 index 0000000..f2b5d8e --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/pt.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","pt",{title:"Propriedades dos marcadores",toolbar:"Símbolo",name:"Nome do marcador",invalidName:"O marcador não pode estar em branco e não pode conter qualquer dos seguintes carateres: [, ], <, >",pathName:"símbolo"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/ru.js b/bower_components/ckeditor/plugins/placeholder/lang/ru.js new file mode 100644 index 0000000..c55f095 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/ru.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","ru",{title:"Свойства плейсхолдера",toolbar:"Создать плейсхолдер",name:"Имя плейсхолдера",invalidName:'Плейсхолдер не может быть пустым и содержать один из следующих символов: "[, ], <, >"',pathName:"плейсхолдер"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/si.js b/bower_components/ckeditor/plugins/placeholder/lang/si.js new file mode 100644 index 0000000..d290aa8 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/si.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","si",{title:"ස්ථාන හීම්කරුගේ ",toolbar:"ස්ථාන හීම්කරු නිර්මාණය කිරීම",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/sk.js b/bower_components/ckeditor/plugins/placeholder/lang/sk.js new file mode 100644 index 0000000..9c7d48f --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/sk.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","sk",{title:"Vlastnosti placeholdera",toolbar:"Vytvoriť placeholder",name:"Názov placeholdera",invalidName:"Placeholder nemôže byť prázdny a nemôže obsahovať žiadny z nasledujúcich znakov: [,],<,>",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/sl.js b/bower_components/ckeditor/plugins/placeholder/lang/sl.js new file mode 100644 index 0000000..0faff6f --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/sl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","sl",{title:"Lastnosti Ograde",toolbar:"Ustvari Ogrado",name:"Placeholder Ime",invalidName:"Placeholder ne more biti prazen in ne sme vsebovati katerega od naslednjih znakov: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/sq.js b/bower_components/ckeditor/plugins/placeholder/lang/sq.js new file mode 100644 index 0000000..6462928 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/sq.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","sq",{title:"Karakteristikat e Mbajtësit të Vendit",toolbar:"Krijo Mabjtës Vendi",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/sv.js b/bower_components/ckeditor/plugins/placeholder/lang/sv.js new file mode 100644 index 0000000..83b9991 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/sv.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","sv",{title:"Innehållsrutans egenskaper",toolbar:"Skapa innehållsruta",name:"Innehållsrutans namn",invalidName:"Innehållsrutan får inte vara tom och får inte innehålla någon av följande tecken: [,],<,>",pathName:"innehållsruta"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/th.js b/bower_components/ckeditor/plugins/placeholder/lang/th.js new file mode 100644 index 0000000..c552b0d --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/th.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","th",{title:"คุณสมบัติเกี่ยวกับตัวยึด",toolbar:"สร้างตัวยึด",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/tr.js b/bower_components/ckeditor/plugins/placeholder/lang/tr.js new file mode 100644 index 0000000..ea653fa --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/tr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","tr",{title:"Yer tutucu özellikleri",toolbar:"Yer tutucu oluşturun",name:"Yer Tutucu Adı",invalidName:"Yer tutucu adı boş bırakılamaz ve şu karakterleri içeremez: [, ], <, >",pathName:"yertutucu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/tt.js b/bower_components/ckeditor/plugins/placeholder/lang/tt.js new file mode 100644 index 0000000..ef5e162 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/tt.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","tt",{title:"Тутырма үзлекләре",toolbar:"Тутырма",name:"Тутырма исеме",invalidName:"Тутырма буш булмаска тиеш һәм эчендә алдагы символлар булмаска тиеш: [, ], <, >",pathName:"тутырма"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/ug.js b/bower_components/ckeditor/plugins/placeholder/lang/ug.js new file mode 100644 index 0000000..cae2f94 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/ug.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","ug",{title:"ئورۇن بەلگە خاسلىقى",toolbar:"ئورۇن بەلگە قۇر",name:"Placeholder Name",invalidName:"The placeholder can not be empty and can not contain any of following characters: [, ], <, >",pathName:"placeholder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/uk.js b/bower_components/ckeditor/plugins/placeholder/lang/uk.js new file mode 100644 index 0000000..7c90450 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/uk.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","uk",{title:"Налаштування Заповнювача",toolbar:"Створити Заповнювач",name:"Назва заповнювача",invalidName:"Заповнювач не може бути порожнім і не може містити наступні символи: [, ], <, >",pathName:"заповнювач"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/vi.js b/bower_components/ckeditor/plugins/placeholder/lang/vi.js new file mode 100644 index 0000000..79b38d6 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/vi.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","vi",{title:"Thuộc tính đặt chỗ",toolbar:"Tạo đặt chỗ",name:"Tên giữ chỗ",invalidName:"Giữ chỗ không thể để trống và không thể chứa bất kỳ ký tự sau: [,], <, >",pathName:"giữ chỗ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/zh-cn.js b/bower_components/ckeditor/plugins/placeholder/lang/zh-cn.js new file mode 100644 index 0000000..0e126f1 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/zh-cn.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","zh-cn",{title:"占位符属性",toolbar:"占位符",name:"占位符名称",invalidName:"占位符名称不能为空,并且不能包含以下字符:[、]、<、>",pathName:"占位符"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/lang/zh.js b/bower_components/ckeditor/plugins/placeholder/lang/zh.js new file mode 100644 index 0000000..0a19d69 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/lang/zh.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("placeholder","zh",{title:"預留位置屬性",toolbar:"建立預留位置",name:"Placeholder 名稱",invalidName:"「預留位置」不可為空白且不可包含以下字元:[, ], <, >",pathName:"預留位置"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/placeholder/plugin.js b/bower_components/ckeditor/plugins/placeholder/plugin.js new file mode 100644 index 0000000..02e8979 --- /dev/null +++ b/bower_components/ckeditor/plugins/placeholder/plugin.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){CKEDITOR.plugins.add("placeholder",{requires:"widget,dialog",lang:"af,ar,bg,ca,cs,cy,da,de,el,en,en-gb,eo,es,et,eu,fa,fi,fr,fr-ca,gl,he,hr,hu,id,it,ja,km,ko,ku,lv,nb,nl,no,pl,pt,pt-br,ru,si,sk,sl,sq,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"placeholder",hidpi:!0,onLoad:function(){CKEDITOR.addCss(".cke_placeholder{background-color:#ff0}")},init:function(a){var b=a.lang.placeholder;CKEDITOR.dialog.add("placeholder",this.path+"dialogs/placeholder.js");a.widgets.add("placeholder",{dialog:"placeholder", +pathName:b.pathName,template:'<span class="cke_placeholder">[[]]</span>',downcast:function(){return new CKEDITOR.htmlParser.text("[["+this.data.name+"]]")},init:function(){this.setData("name",this.element.getText().slice(2,-2))},data:function(){this.element.setText("[["+this.data.name+"]]")}});a.ui.addButton&&a.ui.addButton("CreatePlaceholder",{label:b.toolbar,command:"placeholder",toolbar:"insert,5",icon:"placeholder"})},afterInit:function(a){var b=/\[\[([^\[\]])+\]\]/g;a.dataProcessor.dataFilter.addRules({text:function(f, +d){var e=d.parent&&CKEDITOR.dtd[d.parent.name];if(!e||e.span)return f.replace(b,function(b){var c=null,c=new CKEDITOR.htmlParser.element("span",{"class":"cke_placeholder"});c.add(new CKEDITOR.htmlParser.text(b));c=a.widgets.wrapElement(c,"placeholder");return c.getOuterHtml()})}})}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/icons/hidpi/preview-rtl.png b/bower_components/ckeditor/plugins/preview/icons/hidpi/preview-rtl.png new file mode 100644 index 0000000..cd64e19 Binary files /dev/null and b/bower_components/ckeditor/plugins/preview/icons/hidpi/preview-rtl.png differ diff --git a/bower_components/ckeditor/plugins/preview/icons/hidpi/preview.png b/bower_components/ckeditor/plugins/preview/icons/hidpi/preview.png new file mode 100644 index 0000000..402db20 Binary files /dev/null and b/bower_components/ckeditor/plugins/preview/icons/hidpi/preview.png differ diff --git a/bower_components/ckeditor/plugins/preview/icons/preview-rtl.png b/bower_components/ckeditor/plugins/preview/icons/preview-rtl.png new file mode 100644 index 0000000..1c9d978 Binary files /dev/null and b/bower_components/ckeditor/plugins/preview/icons/preview-rtl.png differ diff --git a/bower_components/ckeditor/plugins/preview/icons/preview.png b/bower_components/ckeditor/plugins/preview/icons/preview.png new file mode 100644 index 0000000..162b44b Binary files /dev/null and b/bower_components/ckeditor/plugins/preview/icons/preview.png differ diff --git a/bower_components/ckeditor/plugins/preview/lang/af.js b/bower_components/ckeditor/plugins/preview/lang/af.js new file mode 100644 index 0000000..97a1694 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","af",{preview:"Voorbeeld"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/ar.js b/bower_components/ckeditor/plugins/preview/lang/ar.js new file mode 100644 index 0000000..a128ad1 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","ar",{preview:"معاينة الصفحة"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/bg.js b/bower_components/ckeditor/plugins/preview/lang/bg.js new file mode 100644 index 0000000..5b88c36 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","bg",{preview:"Преглед"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/bn.js b/bower_components/ckeditor/plugins/preview/lang/bn.js new file mode 100644 index 0000000..b95a1b5 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","bn",{preview:"প্রিভিউ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/bs.js b/bower_components/ckeditor/plugins/preview/lang/bs.js new file mode 100644 index 0000000..1418f76 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","bs",{preview:"Prikaži"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/ca.js b/bower_components/ckeditor/plugins/preview/lang/ca.js new file mode 100644 index 0000000..73458dd --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","ca",{preview:"Visualització prèvia"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/cs.js b/bower_components/ckeditor/plugins/preview/lang/cs.js new file mode 100644 index 0000000..f00d6ee --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","cs",{preview:"Náhled"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/cy.js b/bower_components/ckeditor/plugins/preview/lang/cy.js new file mode 100644 index 0000000..071c8d8 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","cy",{preview:"Rhagolwg"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/da.js b/bower_components/ckeditor/plugins/preview/lang/da.js new file mode 100644 index 0000000..01f18bc --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","da",{preview:"Vis eksempel"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/de.js b/bower_components/ckeditor/plugins/preview/lang/de.js new file mode 100644 index 0000000..7c57cba --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","de",{preview:"Vorschau"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/el.js b/bower_components/ckeditor/plugins/preview/lang/el.js new file mode 100644 index 0000000..4aaeeb4 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","el",{preview:"Προεπισκόπιση"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/en-au.js b/bower_components/ckeditor/plugins/preview/lang/en-au.js new file mode 100644 index 0000000..f10aa05 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","en-au",{preview:"Preview"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/en-ca.js b/bower_components/ckeditor/plugins/preview/lang/en-ca.js new file mode 100644 index 0000000..3a7244b --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","en-ca",{preview:"Preview"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/en-gb.js b/bower_components/ckeditor/plugins/preview/lang/en-gb.js new file mode 100644 index 0000000..78d19ab --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","en-gb",{preview:"Preview"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/en.js b/bower_components/ckeditor/plugins/preview/lang/en.js new file mode 100644 index 0000000..c1901ef --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","en",{preview:"Preview"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/eo.js b/bower_components/ckeditor/plugins/preview/lang/eo.js new file mode 100644 index 0000000..5fa3dd6 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","eo",{preview:"Vidigi Aspekton"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/es.js b/bower_components/ckeditor/plugins/preview/lang/es.js new file mode 100644 index 0000000..d507847 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","es",{preview:"Vista Previa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/et.js b/bower_components/ckeditor/plugins/preview/lang/et.js new file mode 100644 index 0000000..a47ea46 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","et",{preview:"Eelvaade"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/eu.js b/bower_components/ckeditor/plugins/preview/lang/eu.js new file mode 100644 index 0000000..ac83687 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","eu",{preview:"Aurrebista"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/fa.js b/bower_components/ckeditor/plugins/preview/lang/fa.js new file mode 100644 index 0000000..ad85c38 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","fa",{preview:"پیشنمایش"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/fi.js b/bower_components/ckeditor/plugins/preview/lang/fi.js new file mode 100644 index 0000000..6785c5b --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","fi",{preview:"Esikatsele"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/fo.js b/bower_components/ckeditor/plugins/preview/lang/fo.js new file mode 100644 index 0000000..779ef87 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","fo",{preview:"Frumsýning"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/fr-ca.js b/bower_components/ckeditor/plugins/preview/lang/fr-ca.js new file mode 100644 index 0000000..3731a10 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","fr-ca",{preview:"Prévisualiser"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/fr.js b/bower_components/ckeditor/plugins/preview/lang/fr.js new file mode 100644 index 0000000..ca8852b --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","fr",{preview:"Aperçu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/gl.js b/bower_components/ckeditor/plugins/preview/lang/gl.js new file mode 100644 index 0000000..ab8a82a --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","gl",{preview:"Vista previa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/gu.js b/bower_components/ckeditor/plugins/preview/lang/gu.js new file mode 100644 index 0000000..e7b298b --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","gu",{preview:"પૂર્વદર્શન"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/he.js b/bower_components/ckeditor/plugins/preview/lang/he.js new file mode 100644 index 0000000..420a934 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","he",{preview:"תצוגה מקדימה"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/hi.js b/bower_components/ckeditor/plugins/preview/lang/hi.js new file mode 100644 index 0000000..397d278 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","hi",{preview:"प्रीव्यू"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/hr.js b/bower_components/ckeditor/plugins/preview/lang/hr.js new file mode 100644 index 0000000..5a85fc9 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","hr",{preview:"Pregledaj"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/hu.js b/bower_components/ckeditor/plugins/preview/lang/hu.js new file mode 100644 index 0000000..b96a436 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","hu",{preview:"Előnézet"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/id.js b/bower_components/ckeditor/plugins/preview/lang/id.js new file mode 100644 index 0000000..8c7819d --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","id",{preview:"Pratinjau"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/is.js b/bower_components/ckeditor/plugins/preview/lang/is.js new file mode 100644 index 0000000..5fac3cd --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","is",{preview:"Forskoða"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/it.js b/bower_components/ckeditor/plugins/preview/lang/it.js new file mode 100644 index 0000000..a9453f9 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","it",{preview:"Anteprima"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/ja.js b/bower_components/ckeditor/plugins/preview/lang/ja.js new file mode 100644 index 0000000..6b7cd82 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","ja",{preview:"プレビュー"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/ka.js b/bower_components/ckeditor/plugins/preview/lang/ka.js new file mode 100644 index 0000000..bc1590d --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","ka",{preview:"გადახედვა"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/km.js b/bower_components/ckeditor/plugins/preview/lang/km.js new file mode 100644 index 0000000..68ab55f --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","km",{preview:"មើល​ជា​មុន"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/ko.js b/bower_components/ckeditor/plugins/preview/lang/ko.js new file mode 100644 index 0000000..ac824da --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","ko",{preview:"미리보기"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/ku.js b/bower_components/ckeditor/plugins/preview/lang/ku.js new file mode 100644 index 0000000..19594b6 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","ku",{preview:"پێشبینین"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/lt.js b/bower_components/ckeditor/plugins/preview/lang/lt.js new file mode 100644 index 0000000..814a921 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","lt",{preview:"Peržiūra"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/lv.js b/bower_components/ckeditor/plugins/preview/lang/lv.js new file mode 100644 index 0000000..7a27eb2 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","lv",{preview:"Priekšskatīt"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/mk.js b/bower_components/ckeditor/plugins/preview/lang/mk.js new file mode 100644 index 0000000..b0beed9 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","mk",{preview:"Preview"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/mn.js b/bower_components/ckeditor/plugins/preview/lang/mn.js new file mode 100644 index 0000000..6f2448c --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","mn",{preview:"Уридчлан харах"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/ms.js b/bower_components/ckeditor/plugins/preview/lang/ms.js new file mode 100644 index 0000000..f3c596e --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","ms",{preview:"Prebiu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/nb.js b/bower_components/ckeditor/plugins/preview/lang/nb.js new file mode 100644 index 0000000..ea20b38 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","nb",{preview:"Forhåndsvis"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/nl.js b/bower_components/ckeditor/plugins/preview/lang/nl.js new file mode 100644 index 0000000..ed67f97 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","nl",{preview:"Voorbeeld"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/no.js b/bower_components/ckeditor/plugins/preview/lang/no.js new file mode 100644 index 0000000..0c13be8 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","no",{preview:"Forhåndsvis"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/pl.js b/bower_components/ckeditor/plugins/preview/lang/pl.js new file mode 100644 index 0000000..11f306e --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","pl",{preview:"Podgląd"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/pt-br.js b/bower_components/ckeditor/plugins/preview/lang/pt-br.js new file mode 100644 index 0000000..e7f5826 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","pt-br",{preview:"Visualizar"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/pt.js b/bower_components/ckeditor/plugins/preview/lang/pt.js new file mode 100644 index 0000000..92e354d --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","pt",{preview:"Pré-visualizar"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/ro.js b/bower_components/ckeditor/plugins/preview/lang/ro.js new file mode 100644 index 0000000..646e231 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","ro",{preview:"Previzualizare"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/ru.js b/bower_components/ckeditor/plugins/preview/lang/ru.js new file mode 100644 index 0000000..11c59a4 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","ru",{preview:"Предварительный просмотр"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/si.js b/bower_components/ckeditor/plugins/preview/lang/si.js new file mode 100644 index 0000000..a205a15 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","si",{preview:"නැවත "}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/sk.js b/bower_components/ckeditor/plugins/preview/lang/sk.js new file mode 100644 index 0000000..abee94b --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","sk",{preview:"Náhľad"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/sl.js b/bower_components/ckeditor/plugins/preview/lang/sl.js new file mode 100644 index 0000000..a5ba8ba --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","sl",{preview:"Predogled"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/sq.js b/bower_components/ckeditor/plugins/preview/lang/sq.js new file mode 100644 index 0000000..ef5e65b --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","sq",{preview:"Parashiko"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/sr-latn.js b/bower_components/ckeditor/plugins/preview/lang/sr-latn.js new file mode 100644 index 0000000..8c50b69 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","sr-latn",{preview:"Izgled stranice"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/sr.js b/bower_components/ckeditor/plugins/preview/lang/sr.js new file mode 100644 index 0000000..c01f936 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","sr",{preview:"Изглед странице"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/sv.js b/bower_components/ckeditor/plugins/preview/lang/sv.js new file mode 100644 index 0000000..f5a3f5a --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","sv",{preview:"Förhandsgranska"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/th.js b/bower_components/ckeditor/plugins/preview/lang/th.js new file mode 100644 index 0000000..047e25f --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","th",{preview:"ดูหน้าเอกสารตัวอย่าง"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/tr.js b/bower_components/ckeditor/plugins/preview/lang/tr.js new file mode 100644 index 0000000..dd331bd --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","tr",{preview:"Ön İzleme"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/tt.js b/bower_components/ckeditor/plugins/preview/lang/tt.js new file mode 100644 index 0000000..9b5e62c --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","tt",{preview:"Карап алу"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/ug.js b/bower_components/ckeditor/plugins/preview/lang/ug.js new file mode 100644 index 0000000..06549fd --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","ug",{preview:"ئالدىن كۆزەت"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/uk.js b/bower_components/ckeditor/plugins/preview/lang/uk.js new file mode 100644 index 0000000..8d45b87 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","uk",{preview:"Попередній перегляд"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/vi.js b/bower_components/ckeditor/plugins/preview/lang/vi.js new file mode 100644 index 0000000..ba28bcc --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","vi",{preview:"Xem trước"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/zh-cn.js b/bower_components/ckeditor/plugins/preview/lang/zh-cn.js new file mode 100644 index 0000000..69445d0 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","zh-cn",{preview:"预览"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/lang/zh.js b/bower_components/ckeditor/plugins/preview/lang/zh.js new file mode 100644 index 0000000..2ebf415 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("preview","zh",{preview:"預覽"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/plugin.js b/bower_components/ckeditor/plugins/preview/plugin.js new file mode 100644 index 0000000..8d974df --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/plugin.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){var h,i={modes:{wysiwyg:1,source:1},canUndo:!1,readOnly:1,exec:function(a){var g,b=a.config,f=b.baseHref?'<base href="'+b.baseHref+'"/>':"";if(b.fullPage)g=a.getData().replace(/<head>/,"$&"+f).replace(/[^>]*(?=<\/title>)/,"$& — "+a.lang.preview.preview);else{var b="<body ",d=a.document&&a.document.getBody();d&&(d.getAttribute("id")&&(b+='id="'+d.getAttribute("id")+'" '),d.getAttribute("class")&&(b+='class="'+d.getAttribute("class")+'" '));g=a.config.docType+'<html dir="'+a.config.contentsLangDirection+ +'"><head>'+f+"<title>"+a.lang.preview.preview+""+CKEDITOR.tools.buildStyleHtml(a.config.contentsCss)+""+(b+">")+a.getData()+""}f=640;b=420;d=80;try{var c=window.screen,f=Math.round(0.8*c.width),b=Math.round(0.7*c.height),d=Math.round(0.1*c.width)}catch(i){}if(!1===a.fire("contentPreview",a={dataValue:g}))return!1;var c="",e;CKEDITOR.env.ie&&(window._cke_htmlToLoad=a.dataValue,e="javascript:void( (function(){document.open();"+("("+CKEDITOR.tools.fixDomain+")();").replace(/\/\/.*?\n/g, +"").replace(/parent\./g,"window.opener.")+"document.write( window.opener._cke_htmlToLoad );document.close();window.opener._cke_htmlToLoad = null;})() )",c="");CKEDITOR.env.gecko&&(window._cke_htmlToLoad=a.dataValue,c=CKEDITOR.getUrl(h+"preview.html"));c=window.open(c,null,"toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width="+f+",height="+b+",left="+d);CKEDITOR.env.ie&&c&&(c.location=e);!CKEDITOR.env.ie&&!CKEDITOR.env.gecko&&(e=c.document,e.open(),e.write(a.dataValue), +e.close());return!0}};CKEDITOR.plugins.add("preview",{lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"preview,preview-rtl",hidpi:!0,init:function(a){a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&(h=this.path,a.addCommand("preview",i),a.ui.addButton&&a.ui.addButton("Preview",{label:a.lang.preview.preview,command:"preview", +toolbar:"document,40"}))}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/preview/preview.html b/bower_components/ckeditor/plugins/preview/preview.html new file mode 100644 index 0000000..7eb8082 --- /dev/null +++ b/bower_components/ckeditor/plugins/preview/preview.html @@ -0,0 +1,13 @@ + diff --git a/bower_components/ckeditor/plugins/print/icons/hidpi/print.png b/bower_components/ckeditor/plugins/print/icons/hidpi/print.png new file mode 100644 index 0000000..4b72460 Binary files /dev/null and b/bower_components/ckeditor/plugins/print/icons/hidpi/print.png differ diff --git a/bower_components/ckeditor/plugins/print/icons/print.png b/bower_components/ckeditor/plugins/print/icons/print.png new file mode 100644 index 0000000..06f797d Binary files /dev/null and b/bower_components/ckeditor/plugins/print/icons/print.png differ diff --git a/bower_components/ckeditor/plugins/print/lang/af.js b/bower_components/ckeditor/plugins/print/lang/af.js new file mode 100644 index 0000000..61185ef --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","af",{toolbar:"Druk"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/ar.js b/bower_components/ckeditor/plugins/print/lang/ar.js new file mode 100644 index 0000000..b61c094 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","ar",{toolbar:"طباعة"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/bg.js b/bower_components/ckeditor/plugins/print/lang/bg.js new file mode 100644 index 0000000..6d929a8 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","bg",{toolbar:"Печат"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/bn.js b/bower_components/ckeditor/plugins/print/lang/bn.js new file mode 100644 index 0000000..005dfd2 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","bn",{toolbar:"প্রিন্ট"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/bs.js b/bower_components/ckeditor/plugins/print/lang/bs.js new file mode 100644 index 0000000..a639918 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","bs",{toolbar:"Štampaj"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/ca.js b/bower_components/ckeditor/plugins/print/lang/ca.js new file mode 100644 index 0000000..76f7145 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","ca",{toolbar:"Imprimeix"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/cs.js b/bower_components/ckeditor/plugins/print/lang/cs.js new file mode 100644 index 0000000..8927afb --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","cs",{toolbar:"Tisk"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/cy.js b/bower_components/ckeditor/plugins/print/lang/cy.js new file mode 100644 index 0000000..173df74 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","cy",{toolbar:"Argraffu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/da.js b/bower_components/ckeditor/plugins/print/lang/da.js new file mode 100644 index 0000000..d816585 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","da",{toolbar:"Udskriv"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/de.js b/bower_components/ckeditor/plugins/print/lang/de.js new file mode 100644 index 0000000..a429f6c --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","de",{toolbar:"Drucken"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/el.js b/bower_components/ckeditor/plugins/print/lang/el.js new file mode 100644 index 0000000..d5623eb --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","el",{toolbar:"Εκτύπωση"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/en-au.js b/bower_components/ckeditor/plugins/print/lang/en-au.js new file mode 100644 index 0000000..191384e --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","en-au",{toolbar:"Print"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/en-ca.js b/bower_components/ckeditor/plugins/print/lang/en-ca.js new file mode 100644 index 0000000..aff5850 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","en-ca",{toolbar:"Print"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/en-gb.js b/bower_components/ckeditor/plugins/print/lang/en-gb.js new file mode 100644 index 0000000..84a26bd --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","en-gb",{toolbar:"Print"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/en.js b/bower_components/ckeditor/plugins/print/lang/en.js new file mode 100644 index 0000000..17461f2 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","en",{toolbar:"Print"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/eo.js b/bower_components/ckeditor/plugins/print/lang/eo.js new file mode 100644 index 0000000..b0580c1 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","eo",{toolbar:"Presi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/es.js b/bower_components/ckeditor/plugins/print/lang/es.js new file mode 100644 index 0000000..5549ced --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","es",{toolbar:"Imprimir"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/et.js b/bower_components/ckeditor/plugins/print/lang/et.js new file mode 100644 index 0000000..cd192d6 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","et",{toolbar:"Printimine"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/eu.js b/bower_components/ckeditor/plugins/print/lang/eu.js new file mode 100644 index 0000000..6690c53 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","eu",{toolbar:"Inprimatu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/fa.js b/bower_components/ckeditor/plugins/print/lang/fa.js new file mode 100644 index 0000000..2445e39 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","fa",{toolbar:"چاپ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/fi.js b/bower_components/ckeditor/plugins/print/lang/fi.js new file mode 100644 index 0000000..2547e34 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","fi",{toolbar:"Tulosta"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/fo.js b/bower_components/ckeditor/plugins/print/lang/fo.js new file mode 100644 index 0000000..1c93841 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","fo",{toolbar:"Prenta"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/fr-ca.js b/bower_components/ckeditor/plugins/print/lang/fr-ca.js new file mode 100644 index 0000000..ecedc16 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","fr-ca",{toolbar:"Imprimer"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/fr.js b/bower_components/ckeditor/plugins/print/lang/fr.js new file mode 100644 index 0000000..1ae9a1d --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","fr",{toolbar:"Imprimer"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/gl.js b/bower_components/ckeditor/plugins/print/lang/gl.js new file mode 100644 index 0000000..47ef182 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","gl",{toolbar:"Imprimir"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/gu.js b/bower_components/ckeditor/plugins/print/lang/gu.js new file mode 100644 index 0000000..a6c1366 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","gu",{toolbar:"પ્રિન્ટ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/he.js b/bower_components/ckeditor/plugins/print/lang/he.js new file mode 100644 index 0000000..a9e047a --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","he",{toolbar:"הדפסה"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/hi.js b/bower_components/ckeditor/plugins/print/lang/hi.js new file mode 100644 index 0000000..06ae598 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","hi",{toolbar:"प्रिन्ट"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/hr.js b/bower_components/ckeditor/plugins/print/lang/hr.js new file mode 100644 index 0000000..ffbd7f7 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","hr",{toolbar:"Ispiši"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/hu.js b/bower_components/ckeditor/plugins/print/lang/hu.js new file mode 100644 index 0000000..1b1fb4e --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","hu",{toolbar:"Nyomtatás"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/id.js b/bower_components/ckeditor/plugins/print/lang/id.js new file mode 100644 index 0000000..4df05eb --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","id",{toolbar:"Cetak"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/is.js b/bower_components/ckeditor/plugins/print/lang/is.js new file mode 100644 index 0000000..0fb6168 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","is",{toolbar:"Prenta"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/it.js b/bower_components/ckeditor/plugins/print/lang/it.js new file mode 100644 index 0000000..f8a7966 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","it",{toolbar:"Stampa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/ja.js b/bower_components/ckeditor/plugins/print/lang/ja.js new file mode 100644 index 0000000..dbfd00b --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","ja",{toolbar:"印刷"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/ka.js b/bower_components/ckeditor/plugins/print/lang/ka.js new file mode 100644 index 0000000..86dc40f --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","ka",{toolbar:"ბეჭდვა"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/km.js b/bower_components/ckeditor/plugins/print/lang/km.js new file mode 100644 index 0000000..35450b4 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","km",{toolbar:"បោះពុម្ព"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/ko.js b/bower_components/ckeditor/plugins/print/lang/ko.js new file mode 100644 index 0000000..9657b43 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","ko",{toolbar:"인쇄하기"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/ku.js b/bower_components/ckeditor/plugins/print/lang/ku.js new file mode 100644 index 0000000..fce60ec --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","ku",{toolbar:"چاپکردن"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/lt.js b/bower_components/ckeditor/plugins/print/lang/lt.js new file mode 100644 index 0000000..1829455 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","lt",{toolbar:"Spausdinti"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/lv.js b/bower_components/ckeditor/plugins/print/lang/lv.js new file mode 100644 index 0000000..e03d0b5 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","lv",{toolbar:"Drukāt"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/mk.js b/bower_components/ckeditor/plugins/print/lang/mk.js new file mode 100644 index 0000000..63fd4d0 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","mk",{toolbar:"Print"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/mn.js b/bower_components/ckeditor/plugins/print/lang/mn.js new file mode 100644 index 0000000..8df85cf --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","mn",{toolbar:"Хэвлэх"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/ms.js b/bower_components/ckeditor/plugins/print/lang/ms.js new file mode 100644 index 0000000..ca8734b --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","ms",{toolbar:"Cetak"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/nb.js b/bower_components/ckeditor/plugins/print/lang/nb.js new file mode 100644 index 0000000..e65fcfd --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","nb",{toolbar:"Skriv ut"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/nl.js b/bower_components/ckeditor/plugins/print/lang/nl.js new file mode 100644 index 0000000..41ecffd --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","nl",{toolbar:"Afdrukken"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/no.js b/bower_components/ckeditor/plugins/print/lang/no.js new file mode 100644 index 0000000..afb031f --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","no",{toolbar:"Skriv ut"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/pl.js b/bower_components/ckeditor/plugins/print/lang/pl.js new file mode 100644 index 0000000..1bdbdeb --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","pl",{toolbar:"Drukuj"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/pt-br.js b/bower_components/ckeditor/plugins/print/lang/pt-br.js new file mode 100644 index 0000000..9246c27 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","pt-br",{toolbar:"Imprimir"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/pt.js b/bower_components/ckeditor/plugins/print/lang/pt.js new file mode 100644 index 0000000..a72195b --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","pt",{toolbar:"Imprimir"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/ro.js b/bower_components/ckeditor/plugins/print/lang/ro.js new file mode 100644 index 0000000..2f331d2 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","ro",{toolbar:"Printează"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/ru.js b/bower_components/ckeditor/plugins/print/lang/ru.js new file mode 100644 index 0000000..458a9c1 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","ru",{toolbar:"Печать"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/si.js b/bower_components/ckeditor/plugins/print/lang/si.js new file mode 100644 index 0000000..68d3f56 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","si",{toolbar:"මුද්‍රණය කරන්න"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/sk.js b/bower_components/ckeditor/plugins/print/lang/sk.js new file mode 100644 index 0000000..7762bb2 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","sk",{toolbar:"Tlač"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/sl.js b/bower_components/ckeditor/plugins/print/lang/sl.js new file mode 100644 index 0000000..9f401dd --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","sl",{toolbar:"Natisni"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/sq.js b/bower_components/ckeditor/plugins/print/lang/sq.js new file mode 100644 index 0000000..bfb05a4 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","sq",{toolbar:"Shtype"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/sr-latn.js b/bower_components/ckeditor/plugins/print/lang/sr-latn.js new file mode 100644 index 0000000..62cdc71 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","sr-latn",{toolbar:"Štampa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/sr.js b/bower_components/ckeditor/plugins/print/lang/sr.js new file mode 100644 index 0000000..74f6430 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","sr",{toolbar:"Штампа"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/sv.js b/bower_components/ckeditor/plugins/print/lang/sv.js new file mode 100644 index 0000000..14181ba --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","sv",{toolbar:"Skriv ut"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/th.js b/bower_components/ckeditor/plugins/print/lang/th.js new file mode 100644 index 0000000..e87d3ac --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","th",{toolbar:"สั่งพิมพ์"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/tr.js b/bower_components/ckeditor/plugins/print/lang/tr.js new file mode 100644 index 0000000..82f81f0 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","tr",{toolbar:"Yazdır"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/tt.js b/bower_components/ckeditor/plugins/print/lang/tt.js new file mode 100644 index 0000000..db8ff02 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","tt",{toolbar:"Бастыру"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/ug.js b/bower_components/ckeditor/plugins/print/lang/ug.js new file mode 100644 index 0000000..6c27031 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","ug",{toolbar:"باس "}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/uk.js b/bower_components/ckeditor/plugins/print/lang/uk.js new file mode 100644 index 0000000..dfde34d --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","uk",{toolbar:"Друк"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/vi.js b/bower_components/ckeditor/plugins/print/lang/vi.js new file mode 100644 index 0000000..5657394 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","vi",{toolbar:"In"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/zh-cn.js b/bower_components/ckeditor/plugins/print/lang/zh-cn.js new file mode 100644 index 0000000..d7c2643 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","zh-cn",{toolbar:"打印"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/lang/zh.js b/bower_components/ckeditor/plugins/print/lang/zh.js new file mode 100644 index 0000000..65b8840 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("print","zh",{toolbar:"列印"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/print/plugin.js b/bower_components/ckeditor/plugins/print/plugin.js new file mode 100644 index 0000000..e7d3ab1 --- /dev/null +++ b/bower_components/ckeditor/plugins/print/plugin.js @@ -0,0 +1,6 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.add("print",{lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"print,",hidpi:!0,init:function(a){a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&(a.addCommand("print",CKEDITOR.plugins.print),a.ui.addButton&&a.ui.addButton("Print",{label:a.lang.print.toolbar,command:"print",toolbar:"document,50"}))}}); +CKEDITOR.plugins.print={exec:function(a){CKEDITOR.env.gecko?a.window.$.print():a.document.$.execCommand("Print")},canUndo:!1,readOnly:1,modes:{wysiwyg:1}}; \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/icons/hidpi/save.png b/bower_components/ckeditor/plugins/save/icons/hidpi/save.png new file mode 100644 index 0000000..fc59f67 Binary files /dev/null and b/bower_components/ckeditor/plugins/save/icons/hidpi/save.png differ diff --git a/bower_components/ckeditor/plugins/save/icons/save.png b/bower_components/ckeditor/plugins/save/icons/save.png new file mode 100644 index 0000000..51b8f6e Binary files /dev/null and b/bower_components/ckeditor/plugins/save/icons/save.png differ diff --git a/bower_components/ckeditor/plugins/save/lang/af.js b/bower_components/ckeditor/plugins/save/lang/af.js new file mode 100644 index 0000000..aa5b37e --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","af",{toolbar:"Bewaar"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/ar.js b/bower_components/ckeditor/plugins/save/lang/ar.js new file mode 100644 index 0000000..eb09ee5 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","ar",{toolbar:"حفظ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/bg.js b/bower_components/ckeditor/plugins/save/lang/bg.js new file mode 100644 index 0000000..ecdf23c --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","bg",{toolbar:"Запис"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/bn.js b/bower_components/ckeditor/plugins/save/lang/bn.js new file mode 100644 index 0000000..b4e2d6c --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","bn",{toolbar:"সংরক্ষন কর"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/bs.js b/bower_components/ckeditor/plugins/save/lang/bs.js new file mode 100644 index 0000000..d94efe8 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","bs",{toolbar:"Snimi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/ca.js b/bower_components/ckeditor/plugins/save/lang/ca.js new file mode 100644 index 0000000..8704f58 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","ca",{toolbar:"Desa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/cs.js b/bower_components/ckeditor/plugins/save/lang/cs.js new file mode 100644 index 0000000..e337b9e --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","cs",{toolbar:"Uložit"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/cy.js b/bower_components/ckeditor/plugins/save/lang/cy.js new file mode 100644 index 0000000..1f8eb81 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","cy",{toolbar:"Cadw"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/da.js b/bower_components/ckeditor/plugins/save/lang/da.js new file mode 100644 index 0000000..1ff06c6 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","da",{toolbar:"Gem"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/de.js b/bower_components/ckeditor/plugins/save/lang/de.js new file mode 100644 index 0000000..603359b --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","de",{toolbar:"Speichern"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/el.js b/bower_components/ckeditor/plugins/save/lang/el.js new file mode 100644 index 0000000..1aaf9ef --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","el",{toolbar:"Αποθήκευση"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/en-au.js b/bower_components/ckeditor/plugins/save/lang/en-au.js new file mode 100644 index 0000000..0ace64e --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","en-au",{toolbar:"Save"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/en-ca.js b/bower_components/ckeditor/plugins/save/lang/en-ca.js new file mode 100644 index 0000000..993a86e --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","en-ca",{toolbar:"Save"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/en-gb.js b/bower_components/ckeditor/plugins/save/lang/en-gb.js new file mode 100644 index 0000000..19c382d --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","en-gb",{toolbar:"Save"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/en.js b/bower_components/ckeditor/plugins/save/lang/en.js new file mode 100644 index 0000000..1ee6769 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","en",{toolbar:"Save"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/eo.js b/bower_components/ckeditor/plugins/save/lang/eo.js new file mode 100644 index 0000000..dd7a194 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","eo",{toolbar:"Konservi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/es.js b/bower_components/ckeditor/plugins/save/lang/es.js new file mode 100644 index 0000000..b07eea6 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","es",{toolbar:"Guardar"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/et.js b/bower_components/ckeditor/plugins/save/lang/et.js new file mode 100644 index 0000000..5bfb76c --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","et",{toolbar:"Salvestamine"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/eu.js b/bower_components/ckeditor/plugins/save/lang/eu.js new file mode 100644 index 0000000..fec1f85 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","eu",{toolbar:"Gorde"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/fa.js b/bower_components/ckeditor/plugins/save/lang/fa.js new file mode 100644 index 0000000..fb3f2a3 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","fa",{toolbar:"ذخیره"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/fi.js b/bower_components/ckeditor/plugins/save/lang/fi.js new file mode 100644 index 0000000..93d4db5 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","fi",{toolbar:"Tallenna"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/fo.js b/bower_components/ckeditor/plugins/save/lang/fo.js new file mode 100644 index 0000000..4b45268 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","fo",{toolbar:"Goym"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/fr-ca.js b/bower_components/ckeditor/plugins/save/lang/fr-ca.js new file mode 100644 index 0000000..eacb6ea --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","fr-ca",{toolbar:"Sauvegarder"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/fr.js b/bower_components/ckeditor/plugins/save/lang/fr.js new file mode 100644 index 0000000..8df018d --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","fr",{toolbar:"Enregistrer"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/gl.js b/bower_components/ckeditor/plugins/save/lang/gl.js new file mode 100644 index 0000000..1bd4332 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","gl",{toolbar:"Gardar"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/gu.js b/bower_components/ckeditor/plugins/save/lang/gu.js new file mode 100644 index 0000000..683842a --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","gu",{toolbar:"સેવ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/he.js b/bower_components/ckeditor/plugins/save/lang/he.js new file mode 100644 index 0000000..de52496 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","he",{toolbar:"שמירה"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/hi.js b/bower_components/ckeditor/plugins/save/lang/hi.js new file mode 100644 index 0000000..36e3a75 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","hi",{toolbar:"सेव"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/hr.js b/bower_components/ckeditor/plugins/save/lang/hr.js new file mode 100644 index 0000000..cd0d6f4 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","hr",{toolbar:"Snimi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/hu.js b/bower_components/ckeditor/plugins/save/lang/hu.js new file mode 100644 index 0000000..e2de200 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","hu",{toolbar:"Mentés"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/id.js b/bower_components/ckeditor/plugins/save/lang/id.js new file mode 100644 index 0000000..7f1760b --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","id",{toolbar:"Simpan"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/is.js b/bower_components/ckeditor/plugins/save/lang/is.js new file mode 100644 index 0000000..5f98589 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","is",{toolbar:"Vista"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/it.js b/bower_components/ckeditor/plugins/save/lang/it.js new file mode 100644 index 0000000..fdfe51a --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","it",{toolbar:"Salva"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/ja.js b/bower_components/ckeditor/plugins/save/lang/ja.js new file mode 100644 index 0000000..41801c4 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","ja",{toolbar:"保存"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/ka.js b/bower_components/ckeditor/plugins/save/lang/ka.js new file mode 100644 index 0000000..d3d0456 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","ka",{toolbar:"ჩაწერა"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/km.js b/bower_components/ckeditor/plugins/save/lang/km.js new file mode 100644 index 0000000..82f4495 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","km",{toolbar:"រក្សាទុក"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/ko.js b/bower_components/ckeditor/plugins/save/lang/ko.js new file mode 100644 index 0000000..f1a4191 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","ko",{toolbar:"저장하기"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/ku.js b/bower_components/ckeditor/plugins/save/lang/ku.js new file mode 100644 index 0000000..649a8cc --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","ku",{toolbar:"پاشکەوتکردن"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/lt.js b/bower_components/ckeditor/plugins/save/lang/lt.js new file mode 100644 index 0000000..ea89cee --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","lt",{toolbar:"Išsaugoti"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/lv.js b/bower_components/ckeditor/plugins/save/lang/lv.js new file mode 100644 index 0000000..6d8c0c8 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","lv",{toolbar:"Saglabāt"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/mk.js b/bower_components/ckeditor/plugins/save/lang/mk.js new file mode 100644 index 0000000..0405ba8 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","mk",{toolbar:"Save"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/mn.js b/bower_components/ckeditor/plugins/save/lang/mn.js new file mode 100644 index 0000000..ed1d40a --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","mn",{toolbar:"Хадгалах"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/ms.js b/bower_components/ckeditor/plugins/save/lang/ms.js new file mode 100644 index 0000000..8b557e7 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","ms",{toolbar:"Simpan"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/nb.js b/bower_components/ckeditor/plugins/save/lang/nb.js new file mode 100644 index 0000000..0bce93d --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","nb",{toolbar:"Lagre"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/nl.js b/bower_components/ckeditor/plugins/save/lang/nl.js new file mode 100644 index 0000000..4611053 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","nl",{toolbar:"Opslaan"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/no.js b/bower_components/ckeditor/plugins/save/lang/no.js new file mode 100644 index 0000000..d58f02e --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","no",{toolbar:"Lagre"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/pl.js b/bower_components/ckeditor/plugins/save/lang/pl.js new file mode 100644 index 0000000..8214669 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","pl",{toolbar:"Zapisz"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/pt-br.js b/bower_components/ckeditor/plugins/save/lang/pt-br.js new file mode 100644 index 0000000..64c537a --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","pt-br",{toolbar:"Salvar"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/pt.js b/bower_components/ckeditor/plugins/save/lang/pt.js new file mode 100644 index 0000000..a30393b --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","pt",{toolbar:"Guardar"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/ro.js b/bower_components/ckeditor/plugins/save/lang/ro.js new file mode 100644 index 0000000..05329bc --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","ro",{toolbar:"Salvează"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/ru.js b/bower_components/ckeditor/plugins/save/lang/ru.js new file mode 100644 index 0000000..9c75541 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","ru",{toolbar:"Сохранить"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/si.js b/bower_components/ckeditor/plugins/save/lang/si.js new file mode 100644 index 0000000..6305fe6 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","si",{toolbar:"ආරක්ෂා කරන්න"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/sk.js b/bower_components/ckeditor/plugins/save/lang/sk.js new file mode 100644 index 0000000..f3ea59b --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","sk",{toolbar:"Uložiť"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/sl.js b/bower_components/ckeditor/plugins/save/lang/sl.js new file mode 100644 index 0000000..e8ff175 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","sl",{toolbar:"Shrani"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/sq.js b/bower_components/ckeditor/plugins/save/lang/sq.js new file mode 100644 index 0000000..493dca3 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","sq",{toolbar:"Ruaje"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/sr-latn.js b/bower_components/ckeditor/plugins/save/lang/sr-latn.js new file mode 100644 index 0000000..fe27f2b --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","sr-latn",{toolbar:"Sačuvaj"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/sr.js b/bower_components/ckeditor/plugins/save/lang/sr.js new file mode 100644 index 0000000..3fa9e1c --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","sr",{toolbar:"Сачувај"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/sv.js b/bower_components/ckeditor/plugins/save/lang/sv.js new file mode 100644 index 0000000..a2e40dd --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","sv",{toolbar:"Spara"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/th.js b/bower_components/ckeditor/plugins/save/lang/th.js new file mode 100644 index 0000000..8e1c28d --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","th",{toolbar:"บันทึก"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/tr.js b/bower_components/ckeditor/plugins/save/lang/tr.js new file mode 100644 index 0000000..bb638ac --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","tr",{toolbar:"Kaydet"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/tt.js b/bower_components/ckeditor/plugins/save/lang/tt.js new file mode 100644 index 0000000..757f3f7 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","tt",{toolbar:"Саклау"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/ug.js b/bower_components/ckeditor/plugins/save/lang/ug.js new file mode 100644 index 0000000..27dbe12 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","ug",{toolbar:"ساقلا"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/uk.js b/bower_components/ckeditor/plugins/save/lang/uk.js new file mode 100644 index 0000000..c1abf92 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","uk",{toolbar:"Зберегти"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/vi.js b/bower_components/ckeditor/plugins/save/lang/vi.js new file mode 100644 index 0000000..986883b --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","vi",{toolbar:"Lưu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/zh-cn.js b/bower_components/ckeditor/plugins/save/lang/zh-cn.js new file mode 100644 index 0000000..a2de754 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","zh-cn",{toolbar:"保存"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/lang/zh.js b/bower_components/ckeditor/plugins/save/lang/zh.js new file mode 100644 index 0000000..6e81061 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("save","zh",{toolbar:"儲存"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/save/plugin.js b/bower_components/ckeditor/plugins/save/plugin.js new file mode 100644 index 0000000..02c3e31 --- /dev/null +++ b/bower_components/ckeditor/plugins/save/plugin.js @@ -0,0 +1,6 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){var b={readOnly:1,exec:function(a){if(a.fire("save")&&(a=a.element.$.form))try{a.submit()}catch(b){a.submit.click&&a.submit.click()}}};CKEDITOR.plugins.add("save",{lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"save",hidpi:!0,init:function(a){a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&(a.addCommand("save", +b).modes={wysiwyg:!!a.element.$.form},a.ui.addButton&&a.ui.addButton("Save",{label:a.lang.save.toolbar,command:"save",toolbar:"document,10"}))}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/scayt/LICENSE.md b/bower_components/ckeditor/plugins/scayt/LICENSE.md new file mode 100644 index 0000000..610c807 --- /dev/null +++ b/bower_components/ckeditor/plugins/scayt/LICENSE.md @@ -0,0 +1,28 @@ +Software License Agreement +========================== + +**CKEditor SCAYT Plugin** +Copyright © 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: + +* GNU General Public License Version 2 or later (the "GPL"): + http://www.gnu.org/licenses/gpl.html + +* GNU Lesser General Public License Version 2.1 or later (the "LGPL"): + http://www.gnu.org/licenses/lgpl.html + +* Mozilla Public License Version 1.1 or later (the "MPL"): + http://www.mozilla.org/MPL/MPL-1.1.html + +You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice. + +Sources of Intellectual Property Included in this plugin +-------------------------------------------------------- + +Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/bower_components/ckeditor/plugins/scayt/dialogs/options.js b/bower_components/ckeditor/plugins/scayt/dialogs/options.js new file mode 100644 index 0000000..8178e1a --- /dev/null +++ b/bower_components/ckeditor/plugins/scayt/dialogs/options.js @@ -0,0 +1,17 @@ +CKEDITOR.dialog.add("scaytDialog",function(f){var g=f.scayt,k='

        '+g.getLocal("version")+g.getVersion()+"

        "+g.getLocal("text_copyrights")+"

        ",l=CKEDITOR.document,i={isChanged:function(){return null===this.newLang||this.currentLang===this.newLang?!1:!0},currentLang:g.getLang(),newLang:null,reset:function(){this.currentLang=g.getLang();this.newLang=null},id:"lang"},k=[{id:"options",label:g.getLocal("tab_options"),onShow:function(){},elements:[{type:"vbox", +id:"scaytOptions",children:function(){var a=g.getApplicationConfig(),e=[],c={"ignore-all-caps-words":"label_allCaps","ignore-domain-names":"label_ignoreDomainNames","ignore-words-with-mixed-cases":"label_mixedCase","ignore-words-with-numbers":"label_mixedWithDigits"},d;for(d in a){var b={type:"checkbox"};b.id=d;b.label=g.getLocal(c[d]);e.push(b)}return e}(),onShow:function(){this.getChild();for(var a=f.scayt,e=0;e
        ',onShow:function(){var a=f.scayt.getLang();l.getById("scaytLang_"+a).$.checked=!0}}]}]},{id:"dictionaries",label:g.getLocal("tab_dictionaries"), +elements:[{type:"vbox",id:"rightCol_col__left",children:[{type:"html",id:"dictionaryNote",html:""},{type:"text",id:"dictionaryName",label:g.getLocal("label_fieldNameDic")||"Dictionary name",onShow:function(a){var e=a.sender,c=f.scayt;setTimeout(function(){e.getContentElement("dictionaries","dictionaryNote").getElement().setText("");null!=c.getUserDictionaryName()&&""!=c.getUserDictionaryName()&&e.getContentElement("dictionaries","dictionaryName").setValue(c.getUserDictionaryName())},0)}},{type:"hbox", +id:"notExistDic",align:"left",style:"width:auto;",widths:["50%","50%"],children:[{type:"button",id:"createDic",label:g.getLocal("btn_createDic"),title:g.getLocal("btn_createDic"),onClick:function(){var a=this.getDialog(),e=j,c=f.scayt,d=a.getContentElement("dictionaries","dictionaryName").getValue();c.createUserDictionary(d,function(b){b.error||e.toggleDictionaryButtons.call(a,!0);b.dialog=a;b.command="create";b.name=d;f.fire("scaytUserDictionaryAction",b)},function(b){b.dialog=a;b.command="create"; +b.name=d;f.fire("scaytUserDictionaryActionError",b)})}},{type:"button",id:"restoreDic",label:g.getLocal("btn_restoreDic"),title:g.getLocal("btn_restoreDic"),onClick:function(){var a=this.getDialog(),e=f.scayt,c=j,d=a.getContentElement("dictionaries","dictionaryName").getValue();e.restoreUserDictionary(d,function(b){b.dialog=a;b.error||c.toggleDictionaryButtons.call(a,!0);b.command="restore";b.name=d;f.fire("scaytUserDictionaryAction",b)},function(b){b.dialog=a;b.command="restore";b.name=d;f.fire("scaytUserDictionaryActionError", +b)})}}]},{type:"hbox",id:"existDic",align:"left",style:"width:auto;",widths:["50%","50%"],children:[{type:"button",id:"removeDic",label:g.getLocal("btn_deleteDic"),title:g.getLocal("btn_deleteDic"),onClick:function(){var a=this.getDialog(),e=f.scayt,c=j,d=a.getContentElement("dictionaries","dictionaryName"),b=d.getValue();e.removeUserDictionary(b,function(e){d.setValue("");e.error||c.toggleDictionaryButtons.call(a,!1);e.dialog=a;e.command="remove";e.name=b;f.fire("scaytUserDictionaryAction",e)},function(c){c.dialog= +a;c.command="remove";c.name=b;f.fire("scaytUserDictionaryActionError",c)})}},{type:"button",id:"renameDic",label:g.getLocal("btn_renameDic"),title:g.getLocal("btn_renameDic"),onClick:function(){var a=this.getDialog(),e=f.scayt,c=a.getContentElement("dictionaries","dictionaryName").getValue();e.renameUserDictionary(c,function(d){d.dialog=a;d.command="rename";d.name=c;f.fire("scaytUserDictionaryAction",d)},function(d){d.dialog=a;d.command="rename";d.name=c;f.fire("scaytUserDictionaryActionError",d)})}}]}, +{type:"html",id:"dicInfo",html:'
        '+g.getLocal("text_descriptionDic")+"
        "}]}]},{id:"about",label:g.getLocal("tab_about"),elements:[{type:"html",id:"about",style:"margin: 5px 5px;",html:'
        '+k+"
        "}]}];f.on("scaytUserDictionaryAction",function(a){var e=SCAYT.prototype.UILib,c=a.data.dialog,d=c.getContentElement("dictionaries","dictionaryNote").getElement(),b=a.editor.scayt,f;void 0=== +a.data.error?(f=b.getLocal("message_success_"+a.data.command+"Dic"),f=f.replace("%s",a.data.name),d.setText(f),e.css(d.$,{color:"blue"})):(""===a.data.name?d.setText(b.getLocal("message_info_emptyDic")):(f=b.getLocal("message_error_"+a.data.command+"Dic"),f=f.replace("%s",a.data.name),d.setText(f)),e.css(d.$,{color:"red"}),null!=b.getUserDictionaryName()&&""!=b.getUserDictionaryName()?c.getContentElement("dictionaries","dictionaryName").setValue(b.getUserDictionaryName()):c.getContentElement("dictionaries", +"dictionaryName").setValue(""))});f.on("scaytUserDictionaryActionError",function(a){var e=SCAYT.prototype.UILib,c=a.data.dialog,d=c.getContentElement("dictionaries","dictionaryNote").getElement(),b=a.editor.scayt,f;""===a.data.name?d.setText(b.getLocal("message_info_emptyDic")):(f=b.getLocal("message_error_"+a.data.command+"Dic"),f=f.replace("%s",a.data.name),d.setText(f));e.css(d.$,{color:"red"});null!=b.getUserDictionaryName()&&""!=b.getUserDictionaryName()?c.getContentElement("dictionaries","dictionaryName").setValue(b.getUserDictionaryName()): +c.getContentElement("dictionaries","dictionaryName").setValue("")});var j={title:g.getLocal("text_title"),resizable:CKEDITOR.DIALOG_RESIZE_BOTH,minWidth:340,minHeight:260,onLoad:function(){if(0!=f.config.scayt_uiTabs[1]){var a=j,e=a.getLangBoxes.call(this);e.getParent().setStyle("white-space","normal");a.renderLangList(e);this.definition.minWidth=this.getSize().width;this.resize(this.definition.minWidth,this.definition.minHeight)}},onCancel:function(){i.reset()},onHide:function(){f.unlockSelection()}, +onShow:function(){f.fire("scaytDialogShown",this);if(0!=f.config.scayt_uiTabs[2]){var a=f.scayt,e=this.getContentElement("dictionaries","dictionaryName"),c=this.getContentElement("dictionaries","existDic").getElement().getParent(),d=this.getContentElement("dictionaries","notExistDic").getElement().getParent();c.hide();d.hide();null!=a.getUserDictionaryName()&&""!=a.getUserDictionaryName()?(this.getContentElement("dictionaries","dictionaryName").setValue(a.getUserDictionaryName()),c.show()):(e.setValue(""), +d.show())}},onOk:function(){var a=j,e=f.scayt;this.getContentElement("options","scaytOptions");a=a.getChangedOption.call(this);e.commitOption({changedOptions:a})},toggleDictionaryButtons:function(a){var e=this.getContentElement("dictionaries","existDic").getElement().getParent(),c=this.getContentElement("dictionaries","notExistDic").getElement().getParent();a?(e.show(),c.hide()):(e.hide(),c.show())},getChangedOption:function(){var a={};if(1==f.config.scayt_uiTabs[0])for(var e=this.getContentElement("options", +"scaytOptions").getChild(),c=0;c'),g=new CKEDITOR.dom.element("label"),h=f.scayt;c.setStyles({"white-space":"normal",position:"relative", +"padding-bottom":"2px"});b.on("click",function(a){i.newLang=a.sender.getValue()});g.appendText(a);g.setAttribute("for",d);c.append(b);c.append(g);e===h.getLang()&&(b.setAttribute("checked",!0),b.setAttribute("defaultChecked","defaultChecked"));return c},renderLangList:function(a){var e=a.find("#left-col-"+f.name).getItem(0),a=a.find("#right-col-"+f.name).getItem(0),c=g.getLangList(),d={},b=[],i=0,h;for(h in c.ltr)d[h]=c.ltr[h];for(h in c.rtl)d[h]=c.rtl[h];for(h in d)b.push([h,d[h]]);b.sort(function(a, +c){var b=0;a[1]>c[1]?b=1:a[1]
        {content}
        '); +CKEDITOR.plugins.add("sharedspace",{init:function(a){a.on("loaded",function(){var b=a.config.sharedSpaces;if(b)for(var c in b)f(a,c,b[c])},null,null,9)}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/icons/hidpi/showblocks-rtl.png b/bower_components/ckeditor/plugins/showblocks/icons/hidpi/showblocks-rtl.png new file mode 100644 index 0000000..c88abcb Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/icons/hidpi/showblocks-rtl.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/icons/hidpi/showblocks.png b/bower_components/ckeditor/plugins/showblocks/icons/hidpi/showblocks.png new file mode 100644 index 0000000..a776fcc Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/icons/hidpi/showblocks.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/icons/showblocks-rtl.png b/bower_components/ckeditor/plugins/showblocks/icons/showblocks-rtl.png new file mode 100644 index 0000000..cd87d3e Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/icons/showblocks-rtl.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/icons/showblocks.png b/bower_components/ckeditor/plugins/showblocks/icons/showblocks.png new file mode 100644 index 0000000..41b5f34 Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/icons/showblocks.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/images/block_address.png b/bower_components/ckeditor/plugins/showblocks/images/block_address.png new file mode 100644 index 0000000..5abdae1 Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/images/block_address.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/images/block_blockquote.png b/bower_components/ckeditor/plugins/showblocks/images/block_blockquote.png new file mode 100644 index 0000000..a8f4973 Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/images/block_blockquote.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/images/block_div.png b/bower_components/ckeditor/plugins/showblocks/images/block_div.png new file mode 100644 index 0000000..87b3c17 Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/images/block_div.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/images/block_h1.png b/bower_components/ckeditor/plugins/showblocks/images/block_h1.png new file mode 100644 index 0000000..3933325 Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/images/block_h1.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/images/block_h2.png b/bower_components/ckeditor/plugins/showblocks/images/block_h2.png new file mode 100644 index 0000000..c99894c Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/images/block_h2.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/images/block_h3.png b/bower_components/ckeditor/plugins/showblocks/images/block_h3.png new file mode 100644 index 0000000..cb73d67 Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/images/block_h3.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/images/block_h4.png b/bower_components/ckeditor/plugins/showblocks/images/block_h4.png new file mode 100644 index 0000000..7af6bb4 Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/images/block_h4.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/images/block_h5.png b/bower_components/ckeditor/plugins/showblocks/images/block_h5.png new file mode 100644 index 0000000..ce5bec1 Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/images/block_h5.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/images/block_h6.png b/bower_components/ckeditor/plugins/showblocks/images/block_h6.png new file mode 100644 index 0000000..e67b982 Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/images/block_h6.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/images/block_p.png b/bower_components/ckeditor/plugins/showblocks/images/block_p.png new file mode 100644 index 0000000..63a5820 Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/images/block_p.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/images/block_pre.png b/bower_components/ckeditor/plugins/showblocks/images/block_pre.png new file mode 100644 index 0000000..955a868 Binary files /dev/null and b/bower_components/ckeditor/plugins/showblocks/images/block_pre.png differ diff --git a/bower_components/ckeditor/plugins/showblocks/lang/af.js b/bower_components/ckeditor/plugins/showblocks/lang/af.js new file mode 100644 index 0000000..f54ef17 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","af",{toolbar:"Toon blokke"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/ar.js b/bower_components/ckeditor/plugins/showblocks/lang/ar.js new file mode 100644 index 0000000..a3b135a --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","ar",{toolbar:"مخطط تفصيلي"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/bg.js b/bower_components/ckeditor/plugins/showblocks/lang/bg.js new file mode 100644 index 0000000..ec8b4f9 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","bg",{toolbar:"Показва блокове"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/bn.js b/bower_components/ckeditor/plugins/showblocks/lang/bn.js new file mode 100644 index 0000000..8f38cf2 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","bn",{toolbar:"Show Blocks"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/bs.js b/bower_components/ckeditor/plugins/showblocks/lang/bs.js new file mode 100644 index 0000000..91d8620 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","bs",{toolbar:"Show Blocks"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/ca.js b/bower_components/ckeditor/plugins/showblocks/lang/ca.js new file mode 100644 index 0000000..4a23bd6 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","ca",{toolbar:"Mostra els blocs"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/cs.js b/bower_components/ckeditor/plugins/showblocks/lang/cs.js new file mode 100644 index 0000000..e935394 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","cs",{toolbar:"Ukázat bloky"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/cy.js b/bower_components/ckeditor/plugins/showblocks/lang/cy.js new file mode 100644 index 0000000..4fea60e --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","cy",{toolbar:"Dangos Blociau"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/da.js b/bower_components/ckeditor/plugins/showblocks/lang/da.js new file mode 100644 index 0000000..1c077f1 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","da",{toolbar:"Vis afsnitsmærker"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/de.js b/bower_components/ckeditor/plugins/showblocks/lang/de.js new file mode 100644 index 0000000..730add9 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","de",{toolbar:"Blöcke anzeigen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/el.js b/bower_components/ckeditor/plugins/showblocks/lang/el.js new file mode 100644 index 0000000..67fc843 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","el",{toolbar:"Προβολή Τμημάτων"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/en-au.js b/bower_components/ckeditor/plugins/showblocks/lang/en-au.js new file mode 100644 index 0000000..02fd8d3 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","en-au",{toolbar:"Show Blocks"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/en-ca.js b/bower_components/ckeditor/plugins/showblocks/lang/en-ca.js new file mode 100644 index 0000000..2ddff41 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","en-ca",{toolbar:"Show Blocks"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/en-gb.js b/bower_components/ckeditor/plugins/showblocks/lang/en-gb.js new file mode 100644 index 0000000..6398fea --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","en-gb",{toolbar:"Show Blocks"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/en.js b/bower_components/ckeditor/plugins/showblocks/lang/en.js new file mode 100644 index 0000000..2457fa4 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","en",{toolbar:"Show Blocks"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/eo.js b/bower_components/ckeditor/plugins/showblocks/lang/eo.js new file mode 100644 index 0000000..42775ae --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","eo",{toolbar:"Montri la blokojn"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/es.js b/bower_components/ckeditor/plugins/showblocks/lang/es.js new file mode 100644 index 0000000..eae4148 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","es",{toolbar:"Mostrar bloques"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/et.js b/bower_components/ckeditor/plugins/showblocks/lang/et.js new file mode 100644 index 0000000..18f1c0d --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","et",{toolbar:"Blokkide näitamine"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/eu.js b/bower_components/ckeditor/plugins/showblocks/lang/eu.js new file mode 100644 index 0000000..0efa1be --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","eu",{toolbar:"Blokeak erakutsi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/fa.js b/bower_components/ckeditor/plugins/showblocks/lang/fa.js new file mode 100644 index 0000000..e290b63 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","fa",{toolbar:"نمایش بلوک‌ها"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/fi.js b/bower_components/ckeditor/plugins/showblocks/lang/fi.js new file mode 100644 index 0000000..a2e20e2 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","fi",{toolbar:"Näytä elementit"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/fo.js b/bower_components/ckeditor/plugins/showblocks/lang/fo.js new file mode 100644 index 0000000..cea7058 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","fo",{toolbar:"Vís blokkar"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/fr-ca.js b/bower_components/ckeditor/plugins/showblocks/lang/fr-ca.js new file mode 100644 index 0000000..be37ca3 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","fr-ca",{toolbar:"Afficher les blocs"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/fr.js b/bower_components/ckeditor/plugins/showblocks/lang/fr.js new file mode 100644 index 0000000..49bf939 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","fr",{toolbar:"Afficher les blocs"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/gl.js b/bower_components/ckeditor/plugins/showblocks/lang/gl.js new file mode 100644 index 0000000..b9f240c --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","gl",{toolbar:"Amosar os bloques"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/gu.js b/bower_components/ckeditor/plugins/showblocks/lang/gu.js new file mode 100644 index 0000000..a8e7fd6 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","gu",{toolbar:"બ્લૉક બતાવવું"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/he.js b/bower_components/ckeditor/plugins/showblocks/lang/he.js new file mode 100644 index 0000000..7d12846 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","he",{toolbar:"הצגת בלוקים"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/hi.js b/bower_components/ckeditor/plugins/showblocks/lang/hi.js new file mode 100644 index 0000000..68904f2 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","hi",{toolbar:"ब्लॉक दिखायें"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/hr.js b/bower_components/ckeditor/plugins/showblocks/lang/hr.js new file mode 100644 index 0000000..d6af592 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","hr",{toolbar:"Prikaži blokove"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/hu.js b/bower_components/ckeditor/plugins/showblocks/lang/hu.js new file mode 100644 index 0000000..cda541b --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","hu",{toolbar:"Blokkok megjelenítése"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/id.js b/bower_components/ckeditor/plugins/showblocks/lang/id.js new file mode 100644 index 0000000..96c293c --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","id",{toolbar:"Perlihatkan Blok"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/is.js b/bower_components/ckeditor/plugins/showblocks/lang/is.js new file mode 100644 index 0000000..88a3ff5 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","is",{toolbar:"Sýna blokkir"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/it.js b/bower_components/ckeditor/plugins/showblocks/lang/it.js new file mode 100644 index 0000000..38e578f --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","it",{toolbar:"Visualizza Blocchi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/ja.js b/bower_components/ckeditor/plugins/showblocks/lang/ja.js new file mode 100644 index 0000000..a9c9736 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","ja",{toolbar:"ブロック表示"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/ka.js b/bower_components/ckeditor/plugins/showblocks/lang/ka.js new file mode 100644 index 0000000..908e800 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","ka",{toolbar:"არეების ჩვენება"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/km.js b/bower_components/ckeditor/plugins/showblocks/lang/km.js new file mode 100644 index 0000000..d6ca829 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","km",{toolbar:"បង្ហាញ​ប្លក់"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/ko.js b/bower_components/ckeditor/plugins/showblocks/lang/ko.js new file mode 100644 index 0000000..6718734 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","ko",{toolbar:"블록 보기"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/ku.js b/bower_components/ckeditor/plugins/showblocks/lang/ku.js new file mode 100644 index 0000000..2a3a128 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","ku",{toolbar:"نیشاندانی بەربەستەکان"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/lt.js b/bower_components/ckeditor/plugins/showblocks/lang/lt.js new file mode 100644 index 0000000..66368a4 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","lt",{toolbar:"Rodyti blokus"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/lv.js b/bower_components/ckeditor/plugins/showblocks/lang/lv.js new file mode 100644 index 0000000..12c328c --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","lv",{toolbar:"Parādīt blokus"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/mk.js b/bower_components/ckeditor/plugins/showblocks/lang/mk.js new file mode 100644 index 0000000..a34e8a2 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","mk",{toolbar:"Show Blocks"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/mn.js b/bower_components/ckeditor/plugins/showblocks/lang/mn.js new file mode 100644 index 0000000..778ad5d --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","mn",{toolbar:"Хавтангуудыг харуулах"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/ms.js b/bower_components/ckeditor/plugins/showblocks/lang/ms.js new file mode 100644 index 0000000..c6ab5f2 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","ms",{toolbar:"Show Blocks"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/nb.js b/bower_components/ckeditor/plugins/showblocks/lang/nb.js new file mode 100644 index 0000000..8bfdf0e --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","nb",{toolbar:"Vis blokker"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/nl.js b/bower_components/ckeditor/plugins/showblocks/lang/nl.js new file mode 100644 index 0000000..22190db --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","nl",{toolbar:"Toon blokken"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/no.js b/bower_components/ckeditor/plugins/showblocks/lang/no.js new file mode 100644 index 0000000..7570278 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","no",{toolbar:"Vis blokker"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/pl.js b/bower_components/ckeditor/plugins/showblocks/lang/pl.js new file mode 100644 index 0000000..3168b3c --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","pl",{toolbar:"Pokaż bloki"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/pt-br.js b/bower_components/ckeditor/plugins/showblocks/lang/pt-br.js new file mode 100644 index 0000000..3ac0ef7 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","pt-br",{toolbar:"Mostrar blocos de código"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/pt.js b/bower_components/ckeditor/plugins/showblocks/lang/pt.js new file mode 100644 index 0000000..5afaf8e --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","pt",{toolbar:"Exibir blocos"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/ro.js b/bower_components/ckeditor/plugins/showblocks/lang/ro.js new file mode 100644 index 0000000..e4dadf0 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","ro",{toolbar:"Arată blocurile"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/ru.js b/bower_components/ckeditor/plugins/showblocks/lang/ru.js new file mode 100644 index 0000000..9620b9d --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","ru",{toolbar:"Отображать блоки"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/si.js b/bower_components/ckeditor/plugins/showblocks/lang/si.js new file mode 100644 index 0000000..f67dff3 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","si",{toolbar:"කොටස පෙන්නන්න"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/sk.js b/bower_components/ckeditor/plugins/showblocks/lang/sk.js new file mode 100644 index 0000000..dee77c9 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","sk",{toolbar:"Ukázať bloky"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/sl.js b/bower_components/ckeditor/plugins/showblocks/lang/sl.js new file mode 100644 index 0000000..52fca0b --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","sl",{toolbar:"Prikaži ograde"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/sq.js b/bower_components/ckeditor/plugins/showblocks/lang/sq.js new file mode 100644 index 0000000..88405f2 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","sq",{toolbar:"Shfaq Blloqet"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/sr-latn.js b/bower_components/ckeditor/plugins/showblocks/lang/sr-latn.js new file mode 100644 index 0000000..3c1551b --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","sr-latn",{toolbar:"Show Blocks"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/sr.js b/bower_components/ckeditor/plugins/showblocks/lang/sr.js new file mode 100644 index 0000000..127878d --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","sr",{toolbar:"Show Blocks"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/sv.js b/bower_components/ckeditor/plugins/showblocks/lang/sv.js new file mode 100644 index 0000000..a05b6cc --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","sv",{toolbar:"Visa block"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/th.js b/bower_components/ckeditor/plugins/showblocks/lang/th.js new file mode 100644 index 0000000..9b3951c --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","th",{toolbar:"แสดงบล็อคข้อมูล"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/tr.js b/bower_components/ckeditor/plugins/showblocks/lang/tr.js new file mode 100644 index 0000000..060da3a --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","tr",{toolbar:"Blokları Göster"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/tt.js b/bower_components/ckeditor/plugins/showblocks/lang/tt.js new file mode 100644 index 0000000..519e6f7 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","tt",{toolbar:"Блокларны күрсәтү"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/ug.js b/bower_components/ckeditor/plugins/showblocks/lang/ug.js new file mode 100644 index 0000000..c44b660 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","ug",{toolbar:"بۆلەكنى كۆرسەت"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/uk.js b/bower_components/ckeditor/plugins/showblocks/lang/uk.js new file mode 100644 index 0000000..ca9f51c --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","uk",{toolbar:"Показувати блоки"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/vi.js b/bower_components/ckeditor/plugins/showblocks/lang/vi.js new file mode 100644 index 0000000..4356624 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","vi",{toolbar:"Hiển thị các khối"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/zh-cn.js b/bower_components/ckeditor/plugins/showblocks/lang/zh-cn.js new file mode 100644 index 0000000..abee734 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","zh-cn",{toolbar:"显示区块"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/lang/zh.js b/bower_components/ckeditor/plugins/showblocks/lang/zh.js new file mode 100644 index 0000000..84c1e7e --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("showblocks","zh",{toolbar:"顯示區塊"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/showblocks/plugin.js b/bower_components/ckeditor/plugins/showblocks/plugin.js new file mode 100644 index 0000000..7fd40f6 --- /dev/null +++ b/bower_components/ckeditor/plugins/showblocks/plugin.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){var i={readOnly:1,preserveState:!0,editorFocus:!1,exec:function(a){this.toggleState();this.refresh(a)},refresh:function(a){if(a.document){var c=this.state==CKEDITOR.TRISTATE_ON&&(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE||a.focusManager.hasFocus)?"attachClass":"removeClass";a.editable()[c]("cke_show_blocks")}}};CKEDITOR.plugins.add("showblocks",{lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn", +icons:"showblocks,showblocks-rtl",hidpi:!0,onLoad:function(){var a="p div pre address blockquote h1 h2 h3 h4 h5 h6".split(" "),c,b,e,f,i=CKEDITOR.getUrl(this.path),j=!(CKEDITOR.env.ie&&9>CKEDITOR.env.version),g=j?":not([contenteditable=false]):not(.cke_show_blocks_off)":"",d,h;for(c=b=e=f="";d=a.pop();)h=a.length?",":"",c+=".cke_show_blocks "+d+g+h,e+=".cke_show_blocks.cke_contents_ltr "+d+g+h,f+=".cke_show_blocks.cke_contents_rtl "+d+g+h,b+=".cke_show_blocks "+d+g+"{background-image:url("+CKEDITOR.getUrl(i+ +"images/block_"+d+".png")+")}";CKEDITOR.addCss((c+"{background-repeat:no-repeat;border:1px dotted gray;padding-top:8px}").concat(b,e+"{background-position:top left;padding-left:8px}",f+"{background-position:top right;padding-right:8px}"));j||CKEDITOR.addCss(".cke_show_blocks [contenteditable=false],.cke_show_blocks .cke_show_blocks_off{border:none;padding-top:0;background-image:none}.cke_show_blocks.cke_contents_rtl [contenteditable=false],.cke_show_blocks.cke_contents_rtl .cke_show_blocks_off{padding-right:0}.cke_show_blocks.cke_contents_ltr [contenteditable=false],.cke_show_blocks.cke_contents_ltr .cke_show_blocks_off{padding-left:0}")}, +init:function(a){function c(){b.refresh(a)}if(!a.blockless){var b=a.addCommand("showblocks",i);b.canUndo=!1;a.config.startupOutlineBlocks&&b.setState(CKEDITOR.TRISTATE_ON);a.ui.addButton&&a.ui.addButton("ShowBlocks",{label:a.lang.showblocks.toolbar,command:"showblocks",toolbar:"tools,20"});a.on("mode",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)});a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&&(a.on("focus",c),a.on("blur",c));a.on("contentDom",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&& +b.refresh(a)})}}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/dialogs/smiley.js b/bower_components/ckeditor/plugins/smiley/dialogs/smiley.js new file mode 100644 index 0000000..54250ab --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/dialogs/smiley.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("smiley",function(f){for(var e=f.config,a=f.lang.smiley,h=e.smiley_images,g=e.smiley_columns||8,i,k=function(j){var c=j.data.getTarget(),b=c.getName();if("a"==b)c=c.getChild(0);else if("img"!=b)return;var b=c.getAttribute("cke_src"),a=c.getAttribute("title"),c=f.document.createElement("img",{attributes:{src:b,"data-cke-saved-src":b,title:a,alt:a,width:c.$.width,height:c.$.height}});f.insertElement(c);i.hide();j.data.preventDefault()},n=CKEDITOR.tools.addFunction(function(a,c){var a= +new CKEDITOR.dom.event(a),c=new CKEDITOR.dom.element(c),b;b=a.getKeystroke();var d="rtl"==f.lang.dir;switch(b){case 38:if(b=c.getParent().getParent().getPrevious())b=b.getChild([c.getParent().getIndex(),0]),b.focus();a.preventDefault();break;case 40:if(b=c.getParent().getParent().getNext())(b=b.getChild([c.getParent().getIndex(),0]))&&b.focus();a.preventDefault();break;case 32:k({data:a});a.preventDefault();break;case d?37:39:if(b=c.getParent().getNext())b=b.getChild(0),b.focus(),a.preventDefault(!0); +else if(b=c.getParent().getParent().getNext())(b=b.getChild([0,0]))&&b.focus(),a.preventDefault(!0);break;case d?39:37:if(b=c.getParent().getPrevious())b=b.getChild(0),b.focus(),a.preventDefault(!0);else if(b=c.getParent().getParent().getPrevious())b=b.getLast().getChild(0),b.focus(),a.preventDefault(!0)}}),d=CKEDITOR.tools.getNextId()+"_smiley_emtions_label",d=['
        '+a.options+"",'"],l=h.length,a=0;a');var m="cke_smile_label_"+a+"_"+CKEDITOR.tools.getNextNumber();d.push('");a%g==g-1&&d.push("")}if(a");d.push("")}d.push("
        ','',e.smiley_descriptions[a],''+e.smiley_descriptions[a]+"","
        "); +e={type:"html",id:"smileySelector",html:d.join(""),onLoad:function(a){i=a.sender},focus:function(){var a=this;setTimeout(function(){a.getElement().getElementsByTag("a").getItem(0).focus()},0)},onClick:k,style:"width: 100%; border-collapse: separate;"};return{title:f.lang.smiley.title,minWidth:270,minHeight:120,contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[e]}],buttons:[CKEDITOR.dialog.cancelButton]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/icons/hidpi/smiley.png b/bower_components/ckeditor/plugins/smiley/icons/hidpi/smiley.png new file mode 100644 index 0000000..bad62ee Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/icons/hidpi/smiley.png differ diff --git a/bower_components/ckeditor/plugins/smiley/icons/smiley.png b/bower_components/ckeditor/plugins/smiley/icons/smiley.png new file mode 100644 index 0000000..9fafa28 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/icons/smiley.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/angel_smile.gif b/bower_components/ckeditor/plugins/smiley/images/angel_smile.gif new file mode 100644 index 0000000..21f81a2 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/angel_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/angel_smile.png b/bower_components/ckeditor/plugins/smiley/images/angel_smile.png new file mode 100644 index 0000000..559e5e7 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/angel_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/angry_smile.gif b/bower_components/ckeditor/plugins/smiley/images/angry_smile.gif new file mode 100644 index 0000000..c912d99 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/angry_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/angry_smile.png b/bower_components/ckeditor/plugins/smiley/images/angry_smile.png new file mode 100644 index 0000000..c05d2be Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/angry_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/broken_heart.gif b/bower_components/ckeditor/plugins/smiley/images/broken_heart.gif new file mode 100644 index 0000000..4162a7b Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/broken_heart.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/broken_heart.png b/bower_components/ckeditor/plugins/smiley/images/broken_heart.png new file mode 100644 index 0000000..a711c0d Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/broken_heart.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/confused_smile.gif b/bower_components/ckeditor/plugins/smiley/images/confused_smile.gif new file mode 100644 index 0000000..0e420cb Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/confused_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/confused_smile.png b/bower_components/ckeditor/plugins/smiley/images/confused_smile.png new file mode 100644 index 0000000..e0b8e5c Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/confused_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/cry_smile.gif b/bower_components/ckeditor/plugins/smiley/images/cry_smile.gif new file mode 100644 index 0000000..b513342 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/cry_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/cry_smile.png b/bower_components/ckeditor/plugins/smiley/images/cry_smile.png new file mode 100644 index 0000000..a1891a3 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/cry_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/devil_smile.gif b/bower_components/ckeditor/plugins/smiley/images/devil_smile.gif new file mode 100644 index 0000000..9b2a100 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/devil_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/devil_smile.png b/bower_components/ckeditor/plugins/smiley/images/devil_smile.png new file mode 100644 index 0000000..53247a8 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/devil_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/embaressed_smile.gif b/bower_components/ckeditor/plugins/smiley/images/embaressed_smile.gif new file mode 100644 index 0000000..8d39f25 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/embaressed_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/embarrassed_smile.gif b/bower_components/ckeditor/plugins/smiley/images/embarrassed_smile.gif new file mode 100644 index 0000000..8d39f25 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/embarrassed_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/embarrassed_smile.png b/bower_components/ckeditor/plugins/smiley/images/embarrassed_smile.png new file mode 100644 index 0000000..34904b6 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/embarrassed_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/envelope.gif b/bower_components/ckeditor/plugins/smiley/images/envelope.gif new file mode 100644 index 0000000..5294ec4 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/envelope.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/envelope.png b/bower_components/ckeditor/plugins/smiley/images/envelope.png new file mode 100644 index 0000000..44398ad Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/envelope.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/heart.gif b/bower_components/ckeditor/plugins/smiley/images/heart.gif new file mode 100644 index 0000000..160be8e Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/heart.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/heart.png b/bower_components/ckeditor/plugins/smiley/images/heart.png new file mode 100644 index 0000000..df409e6 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/heart.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/kiss.gif b/bower_components/ckeditor/plugins/smiley/images/kiss.gif new file mode 100644 index 0000000..ffb23db Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/kiss.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/kiss.png b/bower_components/ckeditor/plugins/smiley/images/kiss.png new file mode 100644 index 0000000..a4f2f36 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/kiss.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/lightbulb.gif b/bower_components/ckeditor/plugins/smiley/images/lightbulb.gif new file mode 100644 index 0000000..ceb6e2d Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/lightbulb.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/lightbulb.png b/bower_components/ckeditor/plugins/smiley/images/lightbulb.png new file mode 100644 index 0000000..0c4a924 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/lightbulb.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/omg_smile.gif b/bower_components/ckeditor/plugins/smiley/images/omg_smile.gif new file mode 100644 index 0000000..3177355 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/omg_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/omg_smile.png b/bower_components/ckeditor/plugins/smiley/images/omg_smile.png new file mode 100644 index 0000000..abc4e2d Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/omg_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/regular_smile.gif b/bower_components/ckeditor/plugins/smiley/images/regular_smile.gif new file mode 100644 index 0000000..fdcf5c3 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/regular_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/regular_smile.png b/bower_components/ckeditor/plugins/smiley/images/regular_smile.png new file mode 100644 index 0000000..0f2649b Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/regular_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/sad_smile.gif b/bower_components/ckeditor/plugins/smiley/images/sad_smile.gif new file mode 100644 index 0000000..cca0729 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/sad_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/sad_smile.png b/bower_components/ckeditor/plugins/smiley/images/sad_smile.png new file mode 100644 index 0000000..f20f3bf Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/sad_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/shades_smile.gif b/bower_components/ckeditor/plugins/smiley/images/shades_smile.gif new file mode 100644 index 0000000..7d93474 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/shades_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/shades_smile.png b/bower_components/ckeditor/plugins/smiley/images/shades_smile.png new file mode 100644 index 0000000..fdaa28b Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/shades_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/teeth_smile.gif b/bower_components/ckeditor/plugins/smiley/images/teeth_smile.gif new file mode 100644 index 0000000..44c3799 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/teeth_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/teeth_smile.png b/bower_components/ckeditor/plugins/smiley/images/teeth_smile.png new file mode 100644 index 0000000..5e63785 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/teeth_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/thumbs_down.gif b/bower_components/ckeditor/plugins/smiley/images/thumbs_down.gif new file mode 100644 index 0000000..5c8bee3 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/thumbs_down.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/thumbs_down.png b/bower_components/ckeditor/plugins/smiley/images/thumbs_down.png new file mode 100644 index 0000000..1823481 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/thumbs_down.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/thumbs_up.gif b/bower_components/ckeditor/plugins/smiley/images/thumbs_up.gif new file mode 100644 index 0000000..9cc3702 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/thumbs_up.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/thumbs_up.png b/bower_components/ckeditor/plugins/smiley/images/thumbs_up.png new file mode 100644 index 0000000..d4e8b22 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/thumbs_up.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/tongue_smile.gif b/bower_components/ckeditor/plugins/smiley/images/tongue_smile.gif new file mode 100644 index 0000000..81e05b0 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/tongue_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/tongue_smile.png b/bower_components/ckeditor/plugins/smiley/images/tongue_smile.png new file mode 100644 index 0000000..56553fb Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/tongue_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/tounge_smile.gif b/bower_components/ckeditor/plugins/smiley/images/tounge_smile.gif new file mode 100644 index 0000000..81e05b0 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/tounge_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif b/bower_components/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif new file mode 100644 index 0000000..eef4fc0 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.png b/bower_components/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.png new file mode 100644 index 0000000..f9714d1 Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/images/wink_smile.gif b/bower_components/ckeditor/plugins/smiley/images/wink_smile.gif new file mode 100644 index 0000000..6d3d64b Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/wink_smile.gif differ diff --git a/bower_components/ckeditor/plugins/smiley/images/wink_smile.png b/bower_components/ckeditor/plugins/smiley/images/wink_smile.png new file mode 100644 index 0000000..7c99c3f Binary files /dev/null and b/bower_components/ckeditor/plugins/smiley/images/wink_smile.png differ diff --git a/bower_components/ckeditor/plugins/smiley/lang/af.js b/bower_components/ckeditor/plugins/smiley/lang/af.js new file mode 100644 index 0000000..dd63a1c --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","af",{options:"Lagbekkie opsies",title:"Voeg lagbekkie by",toolbar:"Lagbekkie"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/ar.js b/bower_components/ckeditor/plugins/smiley/lang/ar.js new file mode 100644 index 0000000..83a8dfa --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","ar",{options:"خصائص الإبتسامات",title:"إدراج ابتسامات",toolbar:"ابتسامات"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/bg.js b/bower_components/ckeditor/plugins/smiley/lang/bg.js new file mode 100644 index 0000000..f8bf711 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","bg",{options:"Опции за усмивката",title:"Вмъкване на усмивка",toolbar:"Усмивка"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/bn.js b/bower_components/ckeditor/plugins/smiley/lang/bn.js new file mode 100644 index 0000000..61de3df --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","bn",{options:"Smiley Options",title:"স্মাইলী যুক্ত কর",toolbar:"স্মাইলী"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/bs.js b/bower_components/ckeditor/plugins/smiley/lang/bs.js new file mode 100644 index 0000000..422fb8b --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","bs",{options:"Smiley Options",title:"Ubaci smješka",toolbar:"Smješko"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/ca.js b/bower_components/ckeditor/plugins/smiley/lang/ca.js new file mode 100644 index 0000000..5164077 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","ca",{options:"Opcions d'emoticones",title:"Insereix una icona",toolbar:"Icona"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/cs.js b/bower_components/ckeditor/plugins/smiley/lang/cs.js new file mode 100644 index 0000000..aa0d7fa --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","cs",{options:"Nastavení smajlíků",title:"Vkládání smajlíků",toolbar:"Smajlíci"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/cy.js b/bower_components/ckeditor/plugins/smiley/lang/cy.js new file mode 100644 index 0000000..79164f5 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","cy",{options:"Opsiynau Gwenogluniau",title:"Mewnosod Gwenoglun",toolbar:"Gwenoglun"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/da.js b/bower_components/ckeditor/plugins/smiley/lang/da.js new file mode 100644 index 0000000..cfc0db1 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","da",{options:"Smileymuligheder",title:"Vælg smiley",toolbar:"Smiley"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/de.js b/bower_components/ckeditor/plugins/smiley/lang/de.js new file mode 100644 index 0000000..573e494 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","de",{options:"Smiley Optionen",title:"Smiley auswählen",toolbar:"Smiley"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/el.js b/bower_components/ckeditor/plugins/smiley/lang/el.js new file mode 100644 index 0000000..af8f260 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","el",{options:"Επιλογές Φατσούλων",title:"Εισάγετε μια Φατσούλα",toolbar:"Φατσούλα"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/en-au.js b/bower_components/ckeditor/plugins/smiley/lang/en-au.js new file mode 100644 index 0000000..8dd27c3 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","en-au",{options:"Smiley Options",title:"Insert a Smiley",toolbar:"Smiley"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/en-ca.js b/bower_components/ckeditor/plugins/smiley/lang/en-ca.js new file mode 100644 index 0000000..01b2701 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","en-ca",{options:"Smiley Options",title:"Insert a Smiley",toolbar:"Smiley"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/en-gb.js b/bower_components/ckeditor/plugins/smiley/lang/en-gb.js new file mode 100644 index 0000000..9967ebf --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","en-gb",{options:"Smiley Options",title:"Insert a Smiley",toolbar:"Smiley"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/en.js b/bower_components/ckeditor/plugins/smiley/lang/en.js new file mode 100644 index 0000000..aa2b1e2 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","en",{options:"Smiley Options",title:"Insert a Smiley",toolbar:"Smiley"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/eo.js b/bower_components/ckeditor/plugins/smiley/lang/eo.js new file mode 100644 index 0000000..b84cd50 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","eo",{options:"Opcioj pri mienvinjetoj",title:"Enmeti Mienvinjeton",toolbar:"Mienvinjeto"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/es.js b/bower_components/ckeditor/plugins/smiley/lang/es.js new file mode 100644 index 0000000..0a64de6 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","es",{options:"Opciones de emoticonos",title:"Insertar un Emoticon",toolbar:"Emoticonos"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/et.js b/bower_components/ckeditor/plugins/smiley/lang/et.js new file mode 100644 index 0000000..b3acbc8 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","et",{options:"Emotikonide valikud",title:"Sisesta emotikon",toolbar:"Emotikon"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/eu.js b/bower_components/ckeditor/plugins/smiley/lang/eu.js new file mode 100644 index 0000000..d5eb0d0 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","eu",{options:"Aurpegiera Aukerak",title:"Aurpegiera Sartu",toolbar:"Aurpegierak"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/fa.js b/bower_components/ckeditor/plugins/smiley/lang/fa.js new file mode 100644 index 0000000..536b934 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","fa",{options:"گزینه​های خندانک",title:"گنجاندن خندانک",toolbar:"خندانک"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/fi.js b/bower_components/ckeditor/plugins/smiley/lang/fi.js new file mode 100644 index 0000000..cdc06b9 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","fi",{options:"Hymiön ominaisuudet",title:"Lisää hymiö",toolbar:"Hymiö"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/fo.js b/bower_components/ckeditor/plugins/smiley/lang/fo.js new file mode 100644 index 0000000..1758e87 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","fo",{options:"Møguleikar fyri Smiley",title:"Vel Smiley",toolbar:"Smiley"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/fr-ca.js b/bower_components/ckeditor/plugins/smiley/lang/fr-ca.js new file mode 100644 index 0000000..efef564 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","fr-ca",{options:"Options d'émoticônes",title:"Insérer un émoticône",toolbar:"Émoticône"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/fr.js b/bower_components/ckeditor/plugins/smiley/lang/fr.js new file mode 100644 index 0000000..56b9c48 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","fr",{options:"Options des émoticones",title:"Insérer un émoticone",toolbar:"Émoticones"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/gl.js b/bower_components/ckeditor/plugins/smiley/lang/gl.js new file mode 100644 index 0000000..4706059 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","gl",{options:"Opcións de emoticonas",title:"Inserir unha emoticona",toolbar:"Emoticona"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/gu.js b/bower_components/ckeditor/plugins/smiley/lang/gu.js new file mode 100644 index 0000000..15a08c6 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","gu",{options:"સમ્ય્લી વિકલ્પો",title:"સ્માઇલી પસંદ કરો",toolbar:"સ્માઇલી"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/he.js b/bower_components/ckeditor/plugins/smiley/lang/he.js new file mode 100644 index 0000000..db6c4ac --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","he",{options:"אפשרויות סמיילים",title:"הוספת סמיילי",toolbar:"סמיילי"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/hi.js b/bower_components/ckeditor/plugins/smiley/lang/hi.js new file mode 100644 index 0000000..2aaa081 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","hi",{options:"Smiley Options",title:"स्माइली इन्सर्ट करें",toolbar:"स्माइली"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/hr.js b/bower_components/ckeditor/plugins/smiley/lang/hr.js new file mode 100644 index 0000000..65116ab --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","hr",{options:"Opcije smješka",title:"Ubaci smješka",toolbar:"Smješko"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/hu.js b/bower_components/ckeditor/plugins/smiley/lang/hu.js new file mode 100644 index 0000000..823e1d5 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","hu",{options:"Hangulatjel opciók",title:"Hangulatjel beszúrása",toolbar:"Hangulatjelek"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/id.js b/bower_components/ckeditor/plugins/smiley/lang/id.js new file mode 100644 index 0000000..07b5be1 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","id",{options:"Opsi Smiley",title:"Sisip sebuah Smiley",toolbar:"Smiley"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/is.js b/bower_components/ckeditor/plugins/smiley/lang/is.js new file mode 100644 index 0000000..dbb5256 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","is",{options:"Smiley Options",title:"Velja svip",toolbar:"Svipur"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/it.js b/bower_components/ckeditor/plugins/smiley/lang/it.js new file mode 100644 index 0000000..df131f8 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","it",{options:"Opzioni Smiley",title:"Inserisci emoticon",toolbar:"Emoticon"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/ja.js b/bower_components/ckeditor/plugins/smiley/lang/ja.js new file mode 100644 index 0000000..dab5662 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","ja",{options:"絵文字オプション",title:"顔文字挿入",toolbar:"絵文字"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/ka.js b/bower_components/ckeditor/plugins/smiley/lang/ka.js new file mode 100644 index 0000000..78218e0 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","ka",{options:"სიცილაკის პარამეტრები",title:"სიცილაკის ჩასმა",toolbar:"სიცილაკები"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/km.js b/bower_components/ckeditor/plugins/smiley/lang/km.js new file mode 100644 index 0000000..2b60340 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","km",{options:"ជម្រើស​រូប​សញ្ញា​អារម្មណ៍",title:"បញ្ចូល​រូប​សញ្ញា​អារម្មណ៍",toolbar:"រូប​សញ្ញ​អារម្មណ៍"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/ko.js b/bower_components/ckeditor/plugins/smiley/lang/ko.js new file mode 100644 index 0000000..cb3986a --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","ko",{options:"이모티콘 옵션",title:"아이콘 삽입",toolbar:"아이콘"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/ku.js b/bower_components/ckeditor/plugins/smiley/lang/ku.js new file mode 100644 index 0000000..9d1b8bd --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","ku",{options:"هەڵبژاردەی زەردەخەنه",title:"دانانی زەردەخەنەیەك",toolbar:"زەردەخەنه"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/lt.js b/bower_components/ckeditor/plugins/smiley/lang/lt.js new file mode 100644 index 0000000..49573be --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","lt",{options:"Šypsenėlių nustatymai",title:"Įterpti veidelį",toolbar:"Veideliai"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/lv.js b/bower_components/ckeditor/plugins/smiley/lang/lv.js new file mode 100644 index 0000000..b8299e5 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","lv",{options:"Smaidiņu uzstādījumi",title:"Ievietot smaidiņu",toolbar:"Smaidiņi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/mk.js b/bower_components/ckeditor/plugins/smiley/lang/mk.js new file mode 100644 index 0000000..e7e241b --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","mk",{options:"Smiley Options",title:"Insert a Smiley",toolbar:"Smiley"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/mn.js b/bower_components/ckeditor/plugins/smiley/lang/mn.js new file mode 100644 index 0000000..6f8cd09 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","mn",{options:"Smiley Options",title:"Тодорхойлолт оруулах",toolbar:"Тодорхойлолт"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/ms.js b/bower_components/ckeditor/plugins/smiley/lang/ms.js new file mode 100644 index 0000000..0df42a5 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","ms",{options:"Smiley Options",title:"Masukkan Smiley",toolbar:"Smiley"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/nb.js b/bower_components/ckeditor/plugins/smiley/lang/nb.js new file mode 100644 index 0000000..db957dc --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","nb",{options:"Alternativer for smil",title:"Sett inn smil",toolbar:"Smil"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/nl.js b/bower_components/ckeditor/plugins/smiley/lang/nl.js new file mode 100644 index 0000000..1b3ac44 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","nl",{options:"Smiley opties",title:"Smiley invoegen",toolbar:"Smiley"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/no.js b/bower_components/ckeditor/plugins/smiley/lang/no.js new file mode 100644 index 0000000..87f8534 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","no",{options:"Alternativer for smil",title:"Sett inn smil",toolbar:"Smil"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/pl.js b/bower_components/ckeditor/plugins/smiley/lang/pl.js new file mode 100644 index 0000000..eb1938a --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","pl",{options:"Opcje emotikonów",title:"Wstaw emotikona",toolbar:"Emotikony"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/pt-br.js b/bower_components/ckeditor/plugins/smiley/lang/pt-br.js new file mode 100644 index 0000000..e41f544 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","pt-br",{options:"Opções de Emoticons",title:"Inserir Emoticon",toolbar:"Emoticon"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/pt.js b/bower_components/ckeditor/plugins/smiley/lang/pt.js new file mode 100644 index 0000000..c9103e7 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","pt",{options:"Opções de Emoticons",title:"Inserir um Emoticon",toolbar:"Emoticons"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/ro.js b/bower_components/ckeditor/plugins/smiley/lang/ro.js new file mode 100644 index 0000000..1f6b89a --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","ro",{options:"Opțiuni figuri expresive",title:"Inserează o figură expresivă (Emoticon)",toolbar:"Figură expresivă (Emoticon)"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/ru.js b/bower_components/ckeditor/plugins/smiley/lang/ru.js new file mode 100644 index 0000000..b8f1d61 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","ru",{options:"Выбор смайла",title:"Вставить смайл",toolbar:"Смайлы"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/si.js b/bower_components/ckeditor/plugins/smiley/lang/si.js new file mode 100644 index 0000000..da884cf --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","si",{options:"හාස්‍ය විකල්ප",title:"හාස්‍යන් ඇතුලත් කිරීම",toolbar:"හාස්‍යන්"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/sk.js b/bower_components/ckeditor/plugins/smiley/lang/sk.js new file mode 100644 index 0000000..c1ce597 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","sk",{options:"Možnosti smajlíkov",title:"Vložiť smajlíka",toolbar:"Smajlíky"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/sl.js b/bower_components/ckeditor/plugins/smiley/lang/sl.js new file mode 100644 index 0000000..ef64a7a --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","sl",{options:"Možnosti Smeška",title:"Vstavi smeška",toolbar:"Smeško"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/sq.js b/bower_components/ckeditor/plugins/smiley/lang/sq.js new file mode 100644 index 0000000..d870960 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","sq",{options:"Opsionet e Ikonave",title:"Vendos Ikonë",toolbar:"Ikona"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/sr-latn.js b/bower_components/ckeditor/plugins/smiley/lang/sr-latn.js new file mode 100644 index 0000000..4e46a4d --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","sr-latn",{options:"Smiley Options",title:"Unesi smajlija",toolbar:"Smajli"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/sr.js b/bower_components/ckeditor/plugins/smiley/lang/sr.js new file mode 100644 index 0000000..d321eba --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","sr",{options:"Smiley Options",title:"Унеси смајлија",toolbar:"Смајли"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/sv.js b/bower_components/ckeditor/plugins/smiley/lang/sv.js new file mode 100644 index 0000000..29e4c57 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","sv",{options:"Smileyinställningar",title:"Infoga smiley",toolbar:"Smiley"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/th.js b/bower_components/ckeditor/plugins/smiley/lang/th.js new file mode 100644 index 0000000..e4e1277 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","th",{options:"ตัวเลือกไอคอนแสดงอารมณ์",title:"แทรกสัญลักษณ์สื่ออารมณ์",toolbar:"รูปสื่ออารมณ์"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/tr.js b/bower_components/ckeditor/plugins/smiley/lang/tr.js new file mode 100644 index 0000000..90481db --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","tr",{options:"İfade Seçenekleri",title:"İfade Ekle",toolbar:"İfade"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/tt.js b/bower_components/ckeditor/plugins/smiley/lang/tt.js new file mode 100644 index 0000000..7f1c8d3 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","tt",{options:"Смайл көйләүләре",title:"Смайл өстәү",toolbar:"Смайл"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/ug.js b/bower_components/ckeditor/plugins/smiley/lang/ug.js new file mode 100644 index 0000000..5d8ec4e --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","ug",{options:"چىراي ئىپادە سىنبەلگە تاللانمىسى",title:"چىراي ئىپادە سىنبەلگە قىستۇر",toolbar:"چىراي ئىپادە"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/uk.js b/bower_components/ckeditor/plugins/smiley/lang/uk.js new file mode 100644 index 0000000..f6c59ee --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","uk",{options:"Опції смайликів",title:"Вставити смайлик",toolbar:"Смайлик"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/vi.js b/bower_components/ckeditor/plugins/smiley/lang/vi.js new file mode 100644 index 0000000..f5d1a66 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","vi",{options:"Tùy chọn hình biểu lộ cảm xúc",title:"Chèn hình biểu lộ cảm xúc (mặt cười)",toolbar:"Hình biểu lộ cảm xúc (mặt cười)"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/zh-cn.js b/bower_components/ckeditor/plugins/smiley/lang/zh-cn.js new file mode 100644 index 0000000..daea857 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","zh-cn",{options:"表情图标选项",title:"插入表情图标",toolbar:"表情符"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/lang/zh.js b/bower_components/ckeditor/plugins/smiley/lang/zh.js new file mode 100644 index 0000000..dffc3f0 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("smiley","zh",{options:"表情符號選項",title:"插入表情符號",toolbar:"表情符號"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/smiley/plugin.js b/bower_components/ckeditor/plugins/smiley/plugin.js new file mode 100644 index 0000000..0affe63 --- /dev/null +++ b/bower_components/ckeditor/plugins/smiley/plugin.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.add("smiley",{requires:"dialog",lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"smiley",hidpi:!0,init:function(a){a.config.smiley_path=a.config.smiley_path||this.path+"images/";a.addCommand("smiley",new CKEDITOR.dialogCommand("smiley",{allowedContent:"img[alt,height,!src,title,width]",requiredContent:"img"})); +a.ui.addButton&&a.ui.addButton("Smiley",{label:a.lang.smiley.toolbar,command:"smiley",toolbar:"insert,50"});CKEDITOR.dialog.add("smiley",this.path+"dialogs/smiley.js")}});CKEDITOR.config.smiley_images="regular_smile.png sad_smile.png wink_smile.png teeth_smile.png confused_smile.png tongue_smile.png embarrassed_smile.png omg_smile.png whatchutalkingabout_smile.png angry_smile.png angel_smile.png shades_smile.png devil_smile.png cry_smile.png lightbulb.png thumbs_down.png thumbs_up.png heart.png broken_heart.png kiss.png envelope.png".split(" "); +CKEDITOR.config.smiley_descriptions="smiley;sad;wink;laugh;frown;cheeky;blush;surprise;indecision;angry;angel;cool;devil;crying;enlightened;no;yes;heart;broken heart;kiss;mail".split(";"); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/dialogs/sourcedialog.js b/bower_components/ckeditor/plugins/sourcedialog/dialogs/sourcedialog.js new file mode 100644 index 0000000..21e3292 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/dialogs/sourcedialog.js @@ -0,0 +1,6 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("sourcedialog",function(a){var b=CKEDITOR.document.getWindow().getViewPaneSize(),e=Math.min(b.width-70,800),b=b.height/1.5,d;return{title:a.lang.sourcedialog.title,minWidth:100,minHeight:100,onShow:function(){this.setValueOf("main","data",d=a.getData())},onOk:function(){function b(f,c){a.focus();a.setData(c,function(){f.hide();var b=a.createRange();b.moveToElementEditStart(a.editable());b.select()})}return function(){var a=this.getValueOf("main","data").replace(/\r/g,""),c=this; +if(a===d)return!0;setTimeout(function(){b(c,a)});return!1}}(),contents:[{id:"main",label:a.lang.sourcedialog.title,elements:[{type:"textarea",id:"data",dir:"ltr",inputStyle:"cursor:auto;width:"+e+"px;height:"+b+"px;tab-size:4;text-align:left;","class":"cke_source"}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/icons/hidpi/sourcedialog-rtl.png b/bower_components/ckeditor/plugins/sourcedialog/icons/hidpi/sourcedialog-rtl.png new file mode 100644 index 0000000..adf4af3 Binary files /dev/null and b/bower_components/ckeditor/plugins/sourcedialog/icons/hidpi/sourcedialog-rtl.png differ diff --git a/bower_components/ckeditor/plugins/sourcedialog/icons/hidpi/sourcedialog.png b/bower_components/ckeditor/plugins/sourcedialog/icons/hidpi/sourcedialog.png new file mode 100644 index 0000000..b4d0a15 Binary files /dev/null and b/bower_components/ckeditor/plugins/sourcedialog/icons/hidpi/sourcedialog.png differ diff --git a/bower_components/ckeditor/plugins/sourcedialog/icons/sourcedialog-rtl.png b/bower_components/ckeditor/plugins/sourcedialog/icons/sourcedialog-rtl.png new file mode 100644 index 0000000..27d1ba8 Binary files /dev/null and b/bower_components/ckeditor/plugins/sourcedialog/icons/sourcedialog-rtl.png differ diff --git a/bower_components/ckeditor/plugins/sourcedialog/icons/sourcedialog.png b/bower_components/ckeditor/plugins/sourcedialog/icons/sourcedialog.png new file mode 100644 index 0000000..e44db37 Binary files /dev/null and b/bower_components/ckeditor/plugins/sourcedialog/icons/sourcedialog.png differ diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/af.js b/bower_components/ckeditor/plugins/sourcedialog/lang/af.js new file mode 100644 index 0000000..f1491d1 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","af",{toolbar:"Bron",title:"Bron"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/ar.js b/bower_components/ckeditor/plugins/sourcedialog/lang/ar.js new file mode 100644 index 0000000..b755d75 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","ar",{toolbar:"المصدر",title:"المصدر"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/bg.js b/bower_components/ckeditor/plugins/sourcedialog/lang/bg.js new file mode 100644 index 0000000..1d8c6dc --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","bg",{toolbar:"Източник",title:"Източник"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/bn.js b/bower_components/ckeditor/plugins/sourcedialog/lang/bn.js new file mode 100644 index 0000000..fd41806 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","bn",{toolbar:"সোর্স",title:"সোর্স"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/bs.js b/bower_components/ckeditor/plugins/sourcedialog/lang/bs.js new file mode 100644 index 0000000..9cd0393 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","bs",{toolbar:"HTML kôd",title:"HTML kôd"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/ca.js b/bower_components/ckeditor/plugins/sourcedialog/lang/ca.js new file mode 100644 index 0000000..2419335 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","ca",{toolbar:"Codi font",title:"Codi font"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/cs.js b/bower_components/ckeditor/plugins/sourcedialog/lang/cs.js new file mode 100644 index 0000000..acd14e8 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","cs",{toolbar:"Zdroj",title:"Zdroj"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/cy.js b/bower_components/ckeditor/plugins/sourcedialog/lang/cy.js new file mode 100644 index 0000000..d61bd35 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","cy",{toolbar:"HTML",title:"HTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/da.js b/bower_components/ckeditor/plugins/sourcedialog/lang/da.js new file mode 100644 index 0000000..7c21ca4 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","da",{toolbar:"Kilde",title:"Kilde"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/de.js b/bower_components/ckeditor/plugins/sourcedialog/lang/de.js new file mode 100644 index 0000000..49f7c61 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","de",{toolbar:"Quellcode",title:"Quellcode"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/el.js b/bower_components/ckeditor/plugins/sourcedialog/lang/el.js new file mode 100644 index 0000000..58f9dd6 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","el",{toolbar:"Κώδικας",title:"Κώδικας"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/en-au.js b/bower_components/ckeditor/plugins/sourcedialog/lang/en-au.js new file mode 100644 index 0000000..9dede83 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","en-au",{toolbar:"Source",title:"Source"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/en-ca.js b/bower_components/ckeditor/plugins/sourcedialog/lang/en-ca.js new file mode 100644 index 0000000..244ef5f --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","en-ca",{toolbar:"Source",title:"Source"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/en-gb.js b/bower_components/ckeditor/plugins/sourcedialog/lang/en-gb.js new file mode 100644 index 0000000..9381cd0 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","en-gb",{toolbar:"Source",title:"Source"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/en.js b/bower_components/ckeditor/plugins/sourcedialog/lang/en.js new file mode 100644 index 0000000..20b116e --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","en",{toolbar:"Source",title:"Source"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/eo.js b/bower_components/ckeditor/plugins/sourcedialog/lang/eo.js new file mode 100644 index 0000000..902480d --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","eo",{toolbar:"Fonto",title:"Fonto"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/es.js b/bower_components/ckeditor/plugins/sourcedialog/lang/es.js new file mode 100644 index 0000000..e7f8551 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","es",{toolbar:"Fuente HTML",title:"Fuente HTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/et.js b/bower_components/ckeditor/plugins/sourcedialog/lang/et.js new file mode 100644 index 0000000..9c3848b --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","et",{toolbar:"Lähtekood",title:"Lähtekood"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/eu.js b/bower_components/ckeditor/plugins/sourcedialog/lang/eu.js new file mode 100644 index 0000000..dc75afe --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","eu",{toolbar:"HTML Iturburua",title:"HTML Iturburua"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/fa.js b/bower_components/ckeditor/plugins/sourcedialog/lang/fa.js new file mode 100644 index 0000000..65b6306 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","fa",{toolbar:"منبع",title:"منبع"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/fi.js b/bower_components/ckeditor/plugins/sourcedialog/lang/fi.js new file mode 100644 index 0000000..b7630ff --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","fi",{toolbar:"Koodi",title:"Koodi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/fo.js b/bower_components/ckeditor/plugins/sourcedialog/lang/fo.js new file mode 100644 index 0000000..ab4e557 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","fo",{toolbar:"Kelda",title:"Kelda"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/fr-ca.js b/bower_components/ckeditor/plugins/sourcedialog/lang/fr-ca.js new file mode 100644 index 0000000..23148f8 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","fr-ca",{toolbar:"Source",title:"Source"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/fr.js b/bower_components/ckeditor/plugins/sourcedialog/lang/fr.js new file mode 100644 index 0000000..8bc1978 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","fr",{toolbar:"Source",title:"Source"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/gl.js b/bower_components/ckeditor/plugins/sourcedialog/lang/gl.js new file mode 100644 index 0000000..8a3bcbc --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","gl",{toolbar:"Orixe",title:"Orixe"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/gu.js b/bower_components/ckeditor/plugins/sourcedialog/lang/gu.js new file mode 100644 index 0000000..2241ec6 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","gu",{toolbar:"મૂળ કે પ્રાથમિક દસ્તાવેજ",title:"મૂળ કે પ્રાથમિક દસ્તાવેજ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/he.js b/bower_components/ckeditor/plugins/sourcedialog/lang/he.js new file mode 100644 index 0000000..4f25550 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","he",{toolbar:"מקור",title:"מקור"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/hi.js b/bower_components/ckeditor/plugins/sourcedialog/lang/hi.js new file mode 100644 index 0000000..41ebe9b --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","hi",{toolbar:"सोर्स",title:"सोर्स"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/hr.js b/bower_components/ckeditor/plugins/sourcedialog/lang/hr.js new file mode 100644 index 0000000..51d2d4d --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","hr",{toolbar:"Kôd",title:"Kôd"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/hu.js b/bower_components/ckeditor/plugins/sourcedialog/lang/hu.js new file mode 100644 index 0000000..5e80c1e --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","hu",{toolbar:"Forráskód",title:"Forráskód"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/id.js b/bower_components/ckeditor/plugins/sourcedialog/lang/id.js new file mode 100644 index 0000000..e5af768 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","id",{toolbar:"Sumber",title:"Sumber"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/is.js b/bower_components/ckeditor/plugins/sourcedialog/lang/is.js new file mode 100644 index 0000000..fa21def --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","is",{toolbar:"Kóði",title:"Kóði"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/it.js b/bower_components/ckeditor/plugins/sourcedialog/lang/it.js new file mode 100644 index 0000000..0a6c8c0 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","it",{toolbar:"Sorgente",title:"Sorgente"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/ja.js b/bower_components/ckeditor/plugins/sourcedialog/lang/ja.js new file mode 100644 index 0000000..8183259 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","ja",{toolbar:"ソース",title:"ソース"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/ka.js b/bower_components/ckeditor/plugins/sourcedialog/lang/ka.js new file mode 100644 index 0000000..201586a --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","ka",{toolbar:"კოდები",title:"კოდები"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/km.js b/bower_components/ckeditor/plugins/sourcedialog/lang/km.js new file mode 100644 index 0000000..421b42c --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","km",{toolbar:"អក្សរ​កូដ",title:"អក្សរ​កូដ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/ko.js b/bower_components/ckeditor/plugins/sourcedialog/lang/ko.js new file mode 100644 index 0000000..64aa700 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","ko",{toolbar:"소스",title:"소스"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/ku.js b/bower_components/ckeditor/plugins/sourcedialog/lang/ku.js new file mode 100644 index 0000000..61faf97 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","ku",{toolbar:"سەرچاوە",title:"سەرچاوە"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/lt.js b/bower_components/ckeditor/plugins/sourcedialog/lang/lt.js new file mode 100644 index 0000000..4b297dd --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","lt",{toolbar:"Šaltinis",title:"Šaltinis"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/lv.js b/bower_components/ckeditor/plugins/sourcedialog/lang/lv.js new file mode 100644 index 0000000..1f45457 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","lv",{toolbar:"HTML kods",title:"HTML kods"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/mn.js b/bower_components/ckeditor/plugins/sourcedialog/lang/mn.js new file mode 100644 index 0000000..d1d2b63 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","mn",{toolbar:"Код",title:"Код"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/ms.js b/bower_components/ckeditor/plugins/sourcedialog/lang/ms.js new file mode 100644 index 0000000..69e7e9f --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","ms",{toolbar:"Sumber",title:"Sumber"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/nb.js b/bower_components/ckeditor/plugins/sourcedialog/lang/nb.js new file mode 100644 index 0000000..224b085 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","nb",{toolbar:"Kilde",title:"Kilde"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/nl.js b/bower_components/ckeditor/plugins/sourcedialog/lang/nl.js new file mode 100644 index 0000000..47d692d --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","nl",{toolbar:"Broncode",title:"Broncode"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/no.js b/bower_components/ckeditor/plugins/sourcedialog/lang/no.js new file mode 100644 index 0000000..02cadba --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","no",{toolbar:"Kilde",title:"Kilde"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/pl.js b/bower_components/ckeditor/plugins/sourcedialog/lang/pl.js new file mode 100644 index 0000000..80d4f44 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","pl",{toolbar:"Źródło dokumentu",title:"Źródło dokumentu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/pt-br.js b/bower_components/ckeditor/plugins/sourcedialog/lang/pt-br.js new file mode 100644 index 0000000..358cfd1 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","pt-br",{toolbar:"Código-Fonte",title:"Código-Fonte"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/pt.js b/bower_components/ckeditor/plugins/sourcedialog/lang/pt.js new file mode 100644 index 0000000..f924ce8 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","pt",{toolbar:"Fonte",title:"Fonte"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/ro.js b/bower_components/ckeditor/plugins/sourcedialog/lang/ro.js new file mode 100644 index 0000000..cc82c71 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","ro",{toolbar:"Sursa",title:"Sursa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/ru.js b/bower_components/ckeditor/plugins/sourcedialog/lang/ru.js new file mode 100644 index 0000000..fbf6efb --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","ru",{toolbar:"Исходник",title:"Источник"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/si.js b/bower_components/ckeditor/plugins/sourcedialog/lang/si.js new file mode 100644 index 0000000..f869386 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","si",{toolbar:"මුලාශ්‍රය",title:"මුලාශ්‍රය"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/sk.js b/bower_components/ckeditor/plugins/sourcedialog/lang/sk.js new file mode 100644 index 0000000..18dcae9 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","sk",{toolbar:"Zdroj",title:"Zdroj"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/sl.js b/bower_components/ckeditor/plugins/sourcedialog/lang/sl.js new file mode 100644 index 0000000..85cfe16 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","sl",{toolbar:"Izvorna koda",title:"Izvorna koda"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/sq.js b/bower_components/ckeditor/plugins/sourcedialog/lang/sq.js new file mode 100644 index 0000000..1266a7f --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","sq",{toolbar:"Burimi",title:"Burimi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/sr-latn.js b/bower_components/ckeditor/plugins/sourcedialog/lang/sr-latn.js new file mode 100644 index 0000000..4f0736c --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","sr-latn",{toolbar:"Kôd",title:"Kôd"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/sr.js b/bower_components/ckeditor/plugins/sourcedialog/lang/sr.js new file mode 100644 index 0000000..8407382 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","sr",{toolbar:"Kôд",title:"Kôд"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/sv.js b/bower_components/ckeditor/plugins/sourcedialog/lang/sv.js new file mode 100644 index 0000000..2fec89c --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","sv",{toolbar:"Källa",title:"Källa"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/th.js b/bower_components/ckeditor/plugins/sourcedialog/lang/th.js new file mode 100644 index 0000000..03e4890 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","th",{toolbar:"ดูรหัส HTML",title:"ดูรหัส HTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/tr.js b/bower_components/ckeditor/plugins/sourcedialog/lang/tr.js new file mode 100644 index 0000000..31ac46b --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","tr",{toolbar:"Kaynak",title:"Kaynak"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/tt.js b/bower_components/ckeditor/plugins/sourcedialog/lang/tt.js new file mode 100644 index 0000000..a4c7d5e --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","tt",{toolbar:"Чыганак",title:"Чыганак"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/ug.js b/bower_components/ckeditor/plugins/sourcedialog/lang/ug.js new file mode 100644 index 0000000..efcc9d7 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","ug",{toolbar:"مەنبە",title:"مەنبە"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/uk.js b/bower_components/ckeditor/plugins/sourcedialog/lang/uk.js new file mode 100644 index 0000000..ca9afc2 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","uk",{toolbar:"Джерело",title:"Джерело"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/vi.js b/bower_components/ckeditor/plugins/sourcedialog/lang/vi.js new file mode 100644 index 0000000..65c47d6 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","vi",{toolbar:"Mã HTML",title:"Mã HTML"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/zh-cn.js b/bower_components/ckeditor/plugins/sourcedialog/lang/zh-cn.js new file mode 100644 index 0000000..fc5bb0d --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","zh-cn",{toolbar:"源码",title:"源码"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/lang/zh.js b/bower_components/ckeditor/plugins/sourcedialog/lang/zh.js new file mode 100644 index 0000000..c49aa82 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("sourcedialog","zh",{toolbar:"原始碼",title:"原始碼"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/sourcedialog/plugin.js b/bower_components/ckeditor/plugins/sourcedialog/plugin.js new file mode 100644 index 0000000..e730d67 --- /dev/null +++ b/bower_components/ckeditor/plugins/sourcedialog/plugin.js @@ -0,0 +1,6 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.add("sourcedialog",{lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"sourcedialog,sourcedialog-rtl",hidpi:!0,init:function(a){a.addCommand("sourcedialog",new CKEDITOR.dialogCommand("sourcedialog"));CKEDITOR.dialog.add("sourcedialog",this.path+"dialogs/sourcedialog.js");a.ui.addButton&&a.ui.addButton("Sourcedialog", +{label:a.lang.sourcedialog.toolbar,command:"sourcedialog",toolbar:"mode,10"})}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt new file mode 100644 index 0000000..3ad20f5 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt @@ -0,0 +1,20 @@ +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license + +cs.js Found: 118 Missing: 0 +cy.js Found: 118 Missing: 0 +de.js Found: 118 Missing: 0 +el.js Found: 16 Missing: 102 +eo.js Found: 118 Missing: 0 +et.js Found: 31 Missing: 87 +fa.js Found: 24 Missing: 94 +fi.js Found: 23 Missing: 95 +fr.js Found: 118 Missing: 0 +hr.js Found: 23 Missing: 95 +it.js Found: 118 Missing: 0 +nb.js Found: 118 Missing: 0 +nl.js Found: 118 Missing: 0 +no.js Found: 118 Missing: 0 +tr.js Found: 118 Missing: 0 +ug.js Found: 39 Missing: 79 +zh-cn.js Found: 118 Missing: 0 diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/af.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/af.js new file mode 100644 index 0000000..27bb901 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/af.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","af",{euro:"Euroteken",lsquo:"Linker enkelkwotasie",rsquo:"Regter enkelkwotasie",ldquo:"Linker dubbelkwotasie",rdquo:"Regter dubbelkwotasie",ndash:"Kortkoppelteken",mdash:"Langkoppelteken",iexcl:"Omgekeerdeuitroepteken",cent:"Centteken",pound:"Pondteken",curren:"Geldeenheidteken",yen:"Yenteken",brvbar:"Gebreekte balk",sect:"Afdeelingsteken",uml:"Deelteken",copy:"Kopieregteken",ordf:"Vroulikekenteken",laquo:"Linkgeoorienteerde aanhaalingsteken",not:"Verbodeteken", +reg:"Regestrasieteken",macr:"Lengteteken",deg:"Gradeteken",sup2:"Kwadraatteken",sup3:"Kubiekteken",acute:"Akuutaksentteken",micro:"Mikroteken",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ar.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ar.js new file mode 100644 index 0000000..8c3cc20 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ar.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ar",{euro:"رمز اليورو",lsquo:"علامة تنصيص فردية علي اليسار",rsquo:"علامة تنصيص فردية علي اليمين",ldquo:"علامة تنصيص مزدوجة علي اليسار",rdquo:"علامة تنصيص مزدوجة علي اليمين",ndash:"En dash",mdash:"Em dash",iexcl:"علامة تعجب مقلوبة",cent:"رمز السنت",pound:"رمز الاسترليني",curren:"رمز العملة",yen:"رمز الين",brvbar:"شريط مقطوع",sect:"رمز القسم",uml:"Diaeresis",copy:"علامة حقوق الطبع",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"ليست علامة",reg:"علامة مسجّلة",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"علامة الإستفهام غير صحيحة",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/bg.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/bg.js new file mode 100644 index 0000000..74cc149 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/bg.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","bg",{euro:"Евро знак",lsquo:"Лява маркировка за цитат",rsquo:"Дясна маркировка за цитат",ldquo:"Лява двойна кавичка за цитат",rdquo:"Дясна двойна кавичка за цитат",ndash:"\\\\",mdash:"/",iexcl:"Обърната питанка",cent:"Знак за цент",pound:"Знак за паунд",curren:"Валутен знак",yen:"Знак за йена",brvbar:"Прекъсната линия",sect:"Знак за секция",uml:"Diaeresis",copy:"Знак за Copyright",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ca.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ca.js new file mode 100644 index 0000000..46dcb0a --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ca.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ca",{euro:"Símbol d'euro",lsquo:"Signe de cometa simple esquerra",rsquo:"Signe de cometa simple dreta",ldquo:"Signe de cometa doble esquerra",rdquo:"Signe de cometa doble dreta",ndash:"Guió",mdash:"Guió baix",iexcl:"Signe d'exclamació inversa",cent:"Símbol de percentatge",pound:"Símbol de lliura",curren:"Símbol de moneda",yen:"Símbol de Yen",brvbar:"Barra trencada",sect:"Símbol de secció",uml:"Dièresi",copy:"Símbol de Copyright",ordf:"Indicador ordinal femení", +laquo:"Signe de cometes angulars esquerra",not:"Símbol de negació",reg:"Símbol registrat",macr:"Macron",deg:"Símbol de grau",sup2:"Superíndex dos",sup3:"Superíndex tres",acute:"Accent agut",micro:"Símbol de micro",para:"Símbol de calderó",middot:"Punt volat",cedil:"Ce trencada",sup1:"Superíndex u",ordm:"Indicador ordinal masculí",raquo:"Signe de cometes angulars dreta",frac14:"Fracció vulgar un quart",frac12:"Fracció vulgar una meitat",frac34:"Fracció vulgar tres quarts",iquest:"Símbol d'interrogació invertit", +Agrave:"Lletra majúscula llatina A amb accent greu",Aacute:"Lletra majúscula llatina A amb accent agut",Acirc:"Lletra majúscula llatina A amb circumflex",Atilde:"Lletra majúscula llatina A amb titlla",Auml:"Lletra majúscula llatina A amb dièresi",Aring:"Lletra majúscula llatina A amb anell superior",AElig:"Lletra majúscula llatina Æ",Ccedil:"Lletra majúscula llatina C amb ce trencada",Egrave:"Lletra majúscula llatina E amb accent greu",Eacute:"Lletra majúscula llatina E amb accent agut",Ecirc:"Lletra majúscula llatina E amb circumflex", +Euml:"Lletra majúscula llatina E amb dièresi",Igrave:"Lletra majúscula llatina I amb accent greu",Iacute:"Lletra majúscula llatina I amb accent agut",Icirc:"Lletra majúscula llatina I amb circumflex",Iuml:"Lletra majúscula llatina I amb dièresi",ETH:"Lletra majúscula llatina Eth",Ntilde:"Lletra majúscula llatina N amb titlla",Ograve:"Lletra majúscula llatina O amb accent greu",Oacute:"Lletra majúscula llatina O amb accent agut",Ocirc:"Lletra majúscula llatina O amb circumflex",Otilde:"Lletra majúscula llatina O amb titlla", +Ouml:"Lletra majúscula llatina O amb dièresi",times:"Símbol de multiplicació",Oslash:"Lletra majúscula llatina O amb barra",Ugrave:"Lletra majúscula llatina U amb accent greu",Uacute:"Lletra majúscula llatina U amb accent agut",Ucirc:"Lletra majúscula llatina U amb circumflex",Uuml:"Lletra majúscula llatina U amb dièresi",Yacute:"Lletra majúscula llatina Y amb accent agut",THORN:"Lletra majúscula llatina Thorn",szlig:"Lletra minúscula llatina sharp s",agrave:"Lletra minúscula llatina a amb accent greu", +aacute:"Lletra minúscula llatina a amb accent agut",acirc:"Lletra minúscula llatina a amb circumflex",atilde:"Lletra minúscula llatina a amb titlla",auml:"Lletra minúscula llatina a amb dièresi",aring:"Lletra minúscula llatina a amb anell superior",aelig:"Lletra minúscula llatina æ",ccedil:"Lletra minúscula llatina c amb ce trencada",egrave:"Lletra minúscula llatina e amb accent greu",eacute:"Lletra minúscula llatina e amb accent agut",ecirc:"Lletra minúscula llatina e amb circumflex",euml:"Lletra minúscula llatina e amb dièresi", +igrave:"Lletra minúscula llatina i amb accent greu",iacute:"Lletra minúscula llatina i amb accent agut",icirc:"Lletra minúscula llatina i amb circumflex",iuml:"Lletra minúscula llatina i amb dièresi",eth:"Lletra minúscula llatina eth",ntilde:"Lletra minúscula llatina n amb titlla",ograve:"Lletra minúscula llatina o amb accent greu",oacute:"Lletra minúscula llatina o amb accent agut",ocirc:"Lletra minúscula llatina o amb circumflex",otilde:"Lletra minúscula llatina o amb titlla",ouml:"Lletra minúscula llatina o amb dièresi", +divide:"Símbol de divisió",oslash:"Lletra minúscula llatina o amb barra",ugrave:"Lletra minúscula llatina u amb accent greu",uacute:"Lletra minúscula llatina u amb accent agut",ucirc:"Lletra minúscula llatina u amb circumflex",uuml:"Lletra minúscula llatina u amb dièresi",yacute:"Lletra minúscula llatina y amb accent agut",thorn:"Lletra minúscula llatina thorn",yuml:"Lletra minúscula llatina y amb dièresi",OElig:"Lligadura majúscula llatina OE",oelig:"Lligadura minúscula llatina oe",372:"Lletra majúscula llatina W amb circumflex", +374:"Lletra majúscula llatina Y amb circumflex",373:"Lletra minúscula llatina w amb circumflex",375:"Lletra minúscula llatina y amb circumflex",sbquo:"Signe de cita simple baixa-9",8219:"Signe de cita simple alta-invertida-9",bdquo:"Signe de cita doble baixa-9",hellip:"Punts suspensius",trade:"Símbol de marca registrada",9658:"Punter negre apuntant cap a la dreta",bull:"Vinyeta",rarr:"Fletxa cap a la dreta",rArr:"Doble fletxa cap a la dreta",hArr:"Doble fletxa esquerra dreta",diams:"Vestit negre diamant", +asymp:"Gairebé igual a"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/cs.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/cs.js new file mode 100644 index 0000000..c8d129e --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/cs.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","cs",{euro:"Znak eura",lsquo:"Počáteční uvozovka jednoduchá",rsquo:"Koncová uvozovka jednoduchá",ldquo:"Počáteční uvozovka dvojitá",rdquo:"Koncová uvozovka dvojitá",ndash:"En pomlčka",mdash:"Em pomlčka",iexcl:"Obrácený vykřičník",cent:"Znak centu",pound:"Znak libry",curren:"Znak měny",yen:"Znak jenu",brvbar:"Přerušená svislá čára",sect:"Znak oddílu",uml:"Přehláska",copy:"Znak copyrightu",ordf:"Ženský indikátor rodu",laquo:"Znak dvojitých lomených uvozovek vlevo", +not:"Logistický zápor",reg:"Znak registrace",macr:"Pomlčka nad",deg:"Znak stupně",sup2:"Dvojka jako horní index",sup3:"Trojka jako horní index",acute:"Čárka nad vpravo",micro:"Znak mikro",para:"Znak odstavce",middot:"Tečka uprostřed",cedil:"Ocásek vlevo",sup1:"Jednička jako horní index",ordm:"Mužský indikátor rodu",raquo:"Znak dvojitých lomených uvozovek vpravo",frac14:"Obyčejný zlomek jedna čtvrtina",frac12:"Obyčejný zlomek jedna polovina",frac34:"Obyčejný zlomek tři čtvrtiny",iquest:"Znak obráceného otazníku", +Agrave:"Velké písmeno latinky A s čárkou nad vlevo",Aacute:"Velké písmeno latinky A s čárkou nad vpravo",Acirc:"Velké písmeno latinky A s vokáněm",Atilde:"Velké písmeno latinky A s tildou",Auml:"Velké písmeno latinky A s dvěma tečkami",Aring:"Velké písmeno latinky A s kroužkem nad",AElig:"Velké písmeno latinky Ae",Ccedil:"Velké písmeno latinky C s ocáskem vlevo",Egrave:"Velké písmeno latinky E s čárkou nad vlevo",Eacute:"Velké písmeno latinky E s čárkou nad vpravo",Ecirc:"Velké písmeno latinky E s vokáněm", +Euml:"Velké písmeno latinky E s dvěma tečkami",Igrave:"Velké písmeno latinky I s čárkou nad vlevo",Iacute:"Velké písmeno latinky I s čárkou nad vpravo",Icirc:"Velké písmeno latinky I s vokáněm",Iuml:"Velké písmeno latinky I s dvěma tečkami",ETH:"Velké písmeno latinky Eth",Ntilde:"Velké písmeno latinky N s tildou",Ograve:"Velké písmeno latinky O s čárkou nad vlevo",Oacute:"Velké písmeno latinky O s čárkou nad vpravo",Ocirc:"Velké písmeno latinky O s vokáněm",Otilde:"Velké písmeno latinky O s tildou", +Ouml:"Velké písmeno latinky O s dvěma tečkami",times:"Znak násobení",Oslash:"Velké písmeno latinky O přeškrtnuté",Ugrave:"Velké písmeno latinky U s čárkou nad vlevo",Uacute:"Velké písmeno latinky U s čárkou nad vpravo",Ucirc:"Velké písmeno latinky U s vokáněm",Uuml:"Velké písmeno latinky U s dvěma tečkami",Yacute:"Velké písmeno latinky Y s čárkou nad vpravo",THORN:"Velké písmeno latinky Thorn",szlig:"Malé písmeno latinky ostré s",agrave:"Malé písmeno latinky a s čárkou nad vlevo",aacute:"Malé písmeno latinky a s čárkou nad vpravo", +acirc:"Malé písmeno latinky a s vokáněm",atilde:"Malé písmeno latinky a s tildou",auml:"Malé písmeno latinky a s dvěma tečkami",aring:"Malé písmeno latinky a s kroužkem nad",aelig:"Malé písmeno latinky ae",ccedil:"Malé písmeno latinky c s ocáskem vlevo",egrave:"Malé písmeno latinky e s čárkou nad vlevo",eacute:"Malé písmeno latinky e s čárkou nad vpravo",ecirc:"Malé písmeno latinky e s vokáněm",euml:"Malé písmeno latinky e s dvěma tečkami",igrave:"Malé písmeno latinky i s čárkou nad vlevo",iacute:"Malé písmeno latinky i s čárkou nad vpravo", +icirc:"Malé písmeno latinky i s vokáněm",iuml:"Malé písmeno latinky i s dvěma tečkami",eth:"Malé písmeno latinky eth",ntilde:"Malé písmeno latinky n s tildou",ograve:"Malé písmeno latinky o s čárkou nad vlevo",oacute:"Malé písmeno latinky o s čárkou nad vpravo",ocirc:"Malé písmeno latinky o s vokáněm",otilde:"Malé písmeno latinky o s tildou",ouml:"Malé písmeno latinky o s dvěma tečkami",divide:"Znak dělení",oslash:"Malé písmeno latinky o přeškrtnuté",ugrave:"Malé písmeno latinky u s čárkou nad vlevo", +uacute:"Malé písmeno latinky u s čárkou nad vpravo",ucirc:"Malé písmeno latinky u s vokáněm",uuml:"Malé písmeno latinky u s dvěma tečkami",yacute:"Malé písmeno latinky y s čárkou nad vpravo",thorn:"Malé písmeno latinky thorn",yuml:"Malé písmeno latinky y s dvěma tečkami",OElig:"Velká ligatura latinky OE",oelig:"Malá ligatura latinky OE",372:"Velké písmeno latinky W s vokáněm",374:"Velké písmeno latinky Y s vokáněm",373:"Malé písmeno latinky w s vokáněm",375:"Malé písmeno latinky y s vokáněm",sbquo:"Dolní 9 uvozovka jednoduchá", +8219:"Horní obrácená 9 uvozovka jednoduchá",bdquo:"Dolní 9 uvozovka dvojitá",hellip:"Trojtečkový úvod",trade:"Obchodní značka",9658:"Černý ukazatel směřující vpravo",bull:"Kolečko",rarr:"Šipka vpravo",rArr:"Dvojitá šipka vpravo",hArr:"Dvojitá šipka vlevo a vpravo",diams:"Černé piky",asymp:"Téměř se rovná"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/cy.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/cy.js new file mode 100644 index 0000000..b873ac9 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/cy.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","cy",{euro:"Arwydd yr Ewro",lsquo:"Dyfynnod chwith unigol",rsquo:"Dyfynnod dde unigol",ldquo:"Dyfynnod chwith dwbl",rdquo:"Dyfynnod dde dwbl",ndash:"Cysylltnod en",mdash:"Cysylltnod em",iexcl:"Ebychnod gwrthdro",cent:"Arwydd sent",pound:"Arwydd punt",curren:"Arwydd arian cyfred",yen:"Arwydd yen",brvbar:"Bar toriedig",sect:"Arwydd adran",uml:"Didolnod",copy:"Arwydd hawlfraint",ordf:"Dangosydd benywaidd",laquo:"Dyfynnod dwbl ar ongl i'r chwith",not:"Arwydd Nid", +reg:"Arwydd cofrestredig",macr:"Macron",deg:"Arwydd gradd",sup2:"Dau uwchsgript",sup3:"Tri uwchsgript",acute:"Acen ddyrchafedig",micro:"Arwydd micro",para:"Arwydd pilcrow",middot:"Dot canol",cedil:"Sedila",sup1:"Un uwchsgript",ordm:"Dangosydd gwrywaidd",raquo:"Dyfynnod dwbl ar ongl i'r dde",frac14:"Ffracsiwn cyffredin un cwarter",frac12:"Ffracsiwn cyffredin un hanner",frac34:"Ffracsiwn cyffredin tri chwarter",iquest:"Marc cwestiwn gwrthdroëdig",Agrave:"Priflythyren A Lladinaidd gydag acen ddisgynedig", +Aacute:"Priflythyren A Lladinaidd gydag acen ddyrchafedig",Acirc:"Priflythyren A Lladinaidd gydag acen grom",Atilde:"Priflythyren A Lladinaidd gyda thild",Auml:"Priflythyren A Lladinaidd gyda didolnod",Aring:"Priflythyren A Lladinaidd gyda chylch uwchben",AElig:"Priflythyren Æ Lladinaidd",Ccedil:"Priflythyren C Lladinaidd gyda sedila",Egrave:"Priflythyren E Lladinaidd gydag acen ddisgynedig",Eacute:"Priflythyren E Lladinaidd gydag acen ddyrchafedig",Ecirc:"Priflythyren E Lladinaidd gydag acen grom", +Euml:"Priflythyren E Lladinaidd gyda didolnod",Igrave:"Priflythyren I Lladinaidd gydag acen ddisgynedig",Iacute:"Priflythyren I Lladinaidd gydag acen ddyrchafedig",Icirc:"Priflythyren I Lladinaidd gydag acen grom",Iuml:"Priflythyren I Lladinaidd gyda didolnod",ETH:"Priflythyren Eth",Ntilde:"Priflythyren N Lladinaidd gyda thild",Ograve:"Priflythyren O Lladinaidd gydag acen ddisgynedig",Oacute:"Priflythyren O Lladinaidd gydag acen ddyrchafedig",Ocirc:"Priflythyren O Lladinaidd gydag acen grom",Otilde:"Priflythyren O Lladinaidd gyda thild", +Ouml:"Priflythyren O Lladinaidd gyda didolnod",times:"Arwydd lluosi",Oslash:"Priflythyren O Lladinaidd gyda strôc",Ugrave:"Priflythyren U Lladinaidd gydag acen ddisgynedig",Uacute:"Priflythyren U Lladinaidd gydag acen ddyrchafedig",Ucirc:"Priflythyren U Lladinaidd gydag acen grom",Uuml:"Priflythyren U Lladinaidd gyda didolnod",Yacute:"Priflythyren Y Lladinaidd gydag acen ddyrchafedig",THORN:"Priflythyren Thorn",szlig:"Llythyren s fach Lladinaidd siarp ",agrave:"Llythyren a fach Lladinaidd gydag acen ddisgynedig", +aacute:"Llythyren a fach Lladinaidd gydag acen ddyrchafedig",acirc:"Llythyren a fach Lladinaidd gydag acen grom",atilde:"Llythyren a fach Lladinaidd gyda thild",auml:"Llythyren a fach Lladinaidd gyda didolnod",aring:"Llythyren a fach Lladinaidd gyda chylch uwchben",aelig:"Llythyren æ fach Lladinaidd",ccedil:"Llythyren c fach Lladinaidd gyda sedila",egrave:"Llythyren e fach Lladinaidd gydag acen ddisgynedig",eacute:"Llythyren e fach Lladinaidd gydag acen ddyrchafedig",ecirc:"Llythyren e fach Lladinaidd gydag acen grom", +euml:"Llythyren e fach Lladinaidd gyda didolnod",igrave:"Llythyren i fach Lladinaidd gydag acen ddisgynedig",iacute:"Llythyren i fach Lladinaidd gydag acen ddyrchafedig",icirc:"Llythyren i fach Lladinaidd gydag acen grom",iuml:"Llythyren i fach Lladinaidd gyda didolnod",eth:"Llythyren eth fach",ntilde:"Llythyren n fach Lladinaidd gyda thild",ograve:"Llythyren o fach Lladinaidd gydag acen ddisgynedig",oacute:"Llythyren o fach Lladinaidd gydag acen ddyrchafedig",ocirc:"Llythyren o fach Lladinaidd gydag acen grom", +otilde:"Llythyren o fach Lladinaidd gyda thild",ouml:"Llythyren o fach Lladinaidd gyda didolnod",divide:"Arwydd rhannu",oslash:"Llythyren o fach Lladinaidd gyda strôc",ugrave:"Llythyren u fach Lladinaidd gydag acen ddisgynedig",uacute:"Llythyren u fach Lladinaidd gydag acen ddyrchafedig",ucirc:"Llythyren u fach Lladinaidd gydag acen grom",uuml:"Llythyren u fach Lladinaidd gyda didolnod",yacute:"Llythyren y fach Lladinaidd gydag acen ddisgynedig",thorn:"Llythyren o fach Lladinaidd gyda strôc",yuml:"Llythyren y fach Lladinaidd gyda didolnod", +OElig:"Priflythyren cwlwm OE Lladinaidd ",oelig:"Priflythyren cwlwm oe Lladinaidd ",372:"Priflythyren W gydag acen grom",374:"Priflythyren Y gydag acen grom",373:"Llythyren w fach gydag acen grom",375:"Llythyren y fach gydag acen grom",sbquo:"Dyfynnod sengl 9-isel",8219:"Dyfynnod sengl 9-uchel cildro",bdquo:"Dyfynnod dwbl 9-isel",hellip:"Coll geiriau llorweddol",trade:"Arwydd marc masnachol",9658:"Pwyntydd du i'r dde",bull:"Bwled",rarr:"Saeth i'r dde",rArr:"Saeth ddwbl i'r dde",hArr:"Saeth ddwbl i'r chwith", +diams:"Siwt diemwnt du",asymp:"Bron yn hafal iddo"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/da.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/da.js new file mode 100644 index 0000000..e20f604 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/da.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","da",{euro:"Euro-tegn",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"Bindestreg",mdash:"Tankestreg",iexcl:"Inverted exclamation mark",cent:"Cent-tegn",pound:"Pund-tegn",curren:"Kurs-tegn",yen:"Yen-tegn",brvbar:"Brudt streg",sect:"Paragraftegn",uml:"Diaeresis",copy:"Copyright-tegn",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registreret varemærke tegn",macr:"Macron",deg:"Grad-tegn",sup2:"Superscript to",sup3:"Superscript tre",acute:"Acute accent",micro:"Mikro-tegn",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript et",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Varemærke-tegn",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/de.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/de.js new file mode 100644 index 0000000..a056347 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/de.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","de",{euro:"Euro Zeichen",lsquo:"Hochkomma links",rsquo:"Hochkomma rechts",ldquo:"Anführungszeichen links",rdquo:"Anführungszeichen rechts",ndash:"kleiner Strich",mdash:"mittlerer Strich",iexcl:"invertiertes Ausrufezeichen",cent:"Cent",pound:"Pfund",curren:"Währung",yen:"Yen",brvbar:"gestrichelte Linie",sect:"§ Zeichen",uml:"Diäresis",copy:"Copyright",ordf:"Feminine ordinal Anzeige",laquo:"Nach links zeigenden Doppel-Winkel Anführungszeichen",not:"Not-Zeichen", +reg:"Registriert",macr:"Längezeichen",deg:"Grad",sup2:"Hoch 2",sup3:"Hoch 3",acute:"Akzentzeichen ",micro:"Micro",para:"Pilcrow-Zeichen",middot:"Mittelpunkt",cedil:"Cedilla",sup1:"Hoch 1",ordm:"Männliche Ordnungszahl Anzeige",raquo:"Nach rechts zeigenden Doppel-Winkel Anführungszeichen",frac14:"ein Viertel",frac12:"Hälfte",frac34:"Dreiviertel",iquest:"Umgekehrtes Fragezeichen",Agrave:"Lateinischer Buchstabe A mit AkzentGrave",Aacute:"Lateinischer Buchstabe A mit Akutakzent",Acirc:"Lateinischer Buchstabe A mit Zirkumflex", +Atilde:"Lateinischer Buchstabe A mit Tilde",Auml:"Lateinischer Buchstabe A mit Trema",Aring:"Lateinischer Buchstabe A mit Ring oben",AElig:"Lateinischer Buchstabe Æ",Ccedil:"Lateinischer Buchstabe C mit Cedille",Egrave:"Lateinischer Buchstabe E mit AkzentGrave",Eacute:"Lateinischer Buchstabe E mit Akutakzent",Ecirc:"Lateinischer Buchstabe E mit Zirkumflex",Euml:"Lateinischer Buchstabe E Trema",Igrave:"Lateinischer Buchstabe I mit AkzentGrave",Iacute:"Lateinischer Buchstabe I mit Akutakzent",Icirc:"Lateinischer Buchstabe I mit Zirkumflex", +Iuml:"Lateinischer Buchstabe I mit Trema",ETH:"Lateinischer Buchstabe Eth",Ntilde:"Lateinischer Buchstabe N mit Tilde",Ograve:"Lateinischer Buchstabe O mit AkzentGrave",Oacute:"Lateinischer Buchstabe O mit Akutakzent",Ocirc:"Lateinischer Buchstabe O mit Zirkumflex",Otilde:"Lateinischer Buchstabe O mit Tilde",Ouml:"Lateinischer Buchstabe O mit Trema",times:"Multiplikation",Oslash:"Lateinischer Buchstabe O durchgestrichen",Ugrave:"Lateinischer Buchstabe U mit Akzentgrave",Uacute:"Lateinischer Buchstabe U mit Akutakzent", +Ucirc:"Lateinischer Buchstabe U mit Zirkumflex",Uuml:"Lateinischer Buchstabe a mit Trema",Yacute:"Lateinischer Buchstabe a mit Akzent",THORN:"Lateinischer Buchstabe mit Dorn",szlig:"Kleiner lateinischer Buchstabe scharfe s",agrave:"Kleiner lateinischer Buchstabe a mit Accent grave",aacute:"Kleiner lateinischer Buchstabe a mit Akut",acirc:"Lateinischer Buchstabe a mit Zirkumflex",atilde:"Lateinischer Buchstabe a mit Tilde",auml:"Kleiner lateinischer Buchstabe a mit Trema",aring:"Kleiner lateinischer Buchstabe a mit Ring oben", +aelig:"Lateinischer Buchstabe æ",ccedil:"Kleiner lateinischer Buchstabe c mit Cedille",egrave:"Kleiner lateinischer Buchstabe e mit Accent grave",eacute:"Kleiner lateinischer Buchstabe e mit Akut",ecirc:"Kleiner lateinischer Buchstabe e mit Zirkumflex",euml:"Kleiner lateinischer Buchstabe e mit Trema",igrave:"Kleiner lateinischer Buchstabe i mit AkzentGrave",iacute:"Kleiner lateinischer Buchstabe i mit Akzent",icirc:"Kleiner lateinischer Buchstabe i mit Zirkumflex",iuml:"Kleiner lateinischer Buchstabe i mit Trema", +eth:"Kleiner lateinischer Buchstabe eth",ntilde:"Kleiner lateinischer Buchstabe n mit Tilde",ograve:"Kleiner lateinischer Buchstabe o mit Accent grave",oacute:"Kleiner lateinischer Buchstabe o mit Akzent",ocirc:"Kleiner lateinischer Buchstabe o mit Zirkumflex",otilde:"Lateinischer Buchstabe i mit Tilde",ouml:"Kleiner lateinischer Buchstabe o mit Trema",divide:"Divisionszeichen",oslash:"Kleiner lateinischer Buchstabe o durchgestrichen",ugrave:"Kleiner lateinischer Buchstabe u mit Accent grave",uacute:"Kleiner lateinischer Buchstabe u mit Akut", +ucirc:"Kleiner lateinischer Buchstabe u mit Zirkumflex",uuml:"Kleiner lateinischer Buchstabe u mit Trema",yacute:"Kleiner lateinischer Buchstabe y mit Akut",thorn:"Kleiner lateinischer Buchstabe Dorn",yuml:"Kleiner lateinischer Buchstabe y mit Trema",OElig:"Lateinischer Buchstabe Ligatur OE",oelig:"Kleiner lateinischer Buchstabe Ligatur OE",372:"Lateinischer Buchstabe W mit Zirkumflex",374:"Lateinischer Buchstabe Y mit Zirkumflex",373:"Kleiner lateinischer Buchstabe w mit Zirkumflex",375:"Kleiner lateinischer Buchstabe y mit Zirkumflex", +sbquo:"Tiefergestelltes Komma",8219:"Rumgedrehtes Komma",bdquo:"Doppeltes Anführungszeichen unten",hellip:"horizontale Auslassungspunkte",trade:"Handelszeichen",9658:"Dreickspfeil rechts",bull:"Bullet",rarr:"Pfeil rechts",rArr:"Doppelpfeil rechts",hArr:"Doppelpfeil links",diams:"Karo",asymp:"Ungefähr"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/el.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/el.js new file mode 100644 index 0000000..31e69ab --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/el.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","el",{euro:"Σύμβολο Ευρώ",lsquo:"Αριστερός χαρακτήρας μονού εισαγωγικού",rsquo:"Δεξιός χαρακτήρας μονού εισαγωγικού",ldquo:"Αριστερός χαρακτήρας διπλού εισαγωγικού",rdquo:"Δεξιός χαρακτήρας διπλού εισαγωγικού",ndash:"Παύλα en",mdash:"Παύλα em",iexcl:"Ανάποδο θαυμαστικό",cent:"Σύμβολο σεντ",pound:"Σύμβολο λίρας",curren:"Σύμβολο συναλλαγματικής μονάδας",yen:"Σύμβολο Γιεν",brvbar:"Σπασμένη μπάρα",sect:"Σύμβολο τμήματος",uml:"Διαίρεση",copy:"Σύμβολο πνευματικών δικαιωμάτων", +ordf:"Feminine ordinal indicator",laquo:"Αριστερός χαρακτήρας διπλού εισαγωγικού",not:"Σύμβολο άρνησης",reg:"Σύμβολο σημάτων κατατεθέν",macr:"Μακρόν",deg:"Σύμβολο βαθμού",sup2:"Εκτεθειμένο δύο",sup3:"Εκτεθειμένο τρία",acute:"Οξεία",micro:"Σύμβολο μικρού",para:"Σύμβολο παραγράφου",middot:"Μέση τελεία",cedil:"Υπογεγραμμένη",sup1:"Εκτεθειμένο ένα",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Γνήσιο κλάσμα ενός τετάρτου",frac12:"Γνήσιο κλάσμα ενός δεύτερου", +frac34:"Γνήσιο κλάσμα τριών τετάρτων",iquest:"Ανάποδο θαυμαστικό",Agrave:"Λατινικό κεφαλαίο γράμμα A με βαρεία",Aacute:"Λατινικό κεφαλαίο γράμμα A με οξεία",Acirc:"Λατινικό κεφαλαίο γράμμα A με περισπωμένη",Atilde:"Λατινικό κεφαλαίο γράμμα A με περισπωμένη",Auml:"Λατινικό κεφαλαίο γράμμα A με διαλυτικά",Aring:"Λατινικό κεφαλαίο γράμμα A με δακτύλιο επάνω",AElig:"Λατινικό κεφαλαίο γράμμα Æ",Ccedil:"Λατινικό κεφαλαίο γράμμα C με υπογεγραμμένη",Egrave:"Λατινικό κεφαλαίο γράμμα E με βαρεία",Eacute:"Λατινικό κεφαλαίο γράμμα E με οξεία", +Ecirc:"Λατινικό κεφαλαίο γράμμα Ε με περισπωμένη ",Euml:"Λατινικό κεφαλαίο γράμμα Ε με διαλυτικά",Igrave:"Λατινικό κεφαλαίο γράμμα I με βαρεία",Iacute:"Λατινικό κεφαλαίο γράμμα I με οξεία",Icirc:"Λατινικό κεφαλαίο γράμμα I με περισπωμένη",Iuml:"Λατινικό κεφαλαίο γράμμα I με διαλυτικά ",ETH:"Λατινικό κεφαλαίο γράμμα Eth",Ntilde:"Λατινικό κεφαλαίο γράμμα N με περισπωμένη",Ograve:"Λατινικό κεφαλαίο γράμμα O με βαρεία",Oacute:"Λατινικό κεφαλαίο γράμμα O με οξεία",Ocirc:"Λατινικό κεφαλαίο γράμμα O με περισπωμένη ", +Otilde:"Λατινικό κεφαλαίο γράμμα O με περισπωμένη",Ouml:"Λατινικό κεφαλαίο γράμμα O με διαλυτικά",times:"Σύμβολο πολλαπλασιασμού",Oslash:"Λατινικό κεφαλαίο γράμμα O με μολυβιά",Ugrave:"Λατινικό κεφαλαίο γράμμα U με βαρεία",Uacute:"Λατινικό κεφαλαίο γράμμα U με οξεία",Ucirc:"Λατινικό κεφαλαίο γράμμα U με περισπωμένη",Uuml:"Λατινικό κεφαλαίο γράμμα U με διαλυτικά",Yacute:"Λατινικό κεφαλαίο γράμμα Y με οξεία",THORN:"Λατινικό κεφαλαίο γράμμα Thorn",szlig:"Λατινικό μικρό γράμμα απότομο s",agrave:"Λατινικό μικρό γράμμα a με βαρεία", +aacute:"Λατινικό μικρό γράμμα a με οξεία",acirc:"Λατινικό μικρό γράμμα a με περισπωμένη",atilde:"Λατινικό μικρό γράμμα a με περισπωμένη",auml:"Λατινικό μικρό γράμμα a με διαλυτικά",aring:"Λατινικό μικρό γράμμα a με δακτύλιο πάνω",aelig:"Λατινικό μικρό γράμμα æ",ccedil:"Λατινικό μικρό γράμμα c με υπογεγραμμένη",egrave:"Λατινικό μικρό γράμμα ε με βαρεία",eacute:"Λατινικό μικρό γράμμα e με οξεία",ecirc:"Λατινικό μικρό γράμμα e με περισπωμένη",euml:"Λατινικό μικρό γράμμα e με διαλυτικά",igrave:"Λατινικό μικρό γράμμα i με βαρεία", +iacute:"Λατινικό μικρό γράμμα i με οξεία",icirc:"Λατινικό μικρό γράμμα i με περισπωμένη",iuml:"Λατινικό μικρό γράμμα i με διαλυτικά",eth:"Λατινικό μικρό γράμμα eth",ntilde:"Λατινικό μικρό γράμμα n με περισπωμένη",ograve:"Λατινικό μικρό γράμμα o με βαρεία",oacute:"Λατινικό μικρό γράμμα o με οξεία ",ocirc:"Λατινικό πεζό γράμμα o με περισπωμένη",otilde:"Λατινικό μικρό γράμμα o με περισπωμένη ",ouml:"Λατινικό μικρό γράμμα o με διαλυτικά",divide:"Σύμβολο διαίρεσης",oslash:"Λατινικό μικρό γράμμα o με περισπωμένη", +ugrave:"Λατινικό μικρό γράμμα u με βαρεία",uacute:"Λατινικό μικρό γράμμα u με οξεία",ucirc:"Λατινικό μικρό γράμμα u με περισπωμένη",uuml:"Λατινικό μικρό γράμμα u με διαλυτικά",yacute:"Λατινικό μικρό γράμμα y με οξεία",thorn:"Λατινικό μικρό γράμμα thorn",yuml:"Λατινικό μικρό γράμμα y με διαλυτικά",OElig:"Λατινικό κεφαλαίο σύμπλεγμα ΟΕ",oelig:"Λατινικό μικρό σύμπλεγμα oe",372:"Λατινικό κεφαλαίο γράμμα W με περισπωμένη",374:"Λατινικό κεφαλαίο γράμμα Y με περισπωμένη",373:"Λατινικό μικρό γράμμα w με περισπωμένη", +375:"Λατινικό μικρό γράμμα y με περισπωμένη",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Οριζόντια αποσιωπητικά",trade:"Σύμβολο εμπορικού κατατεθέν",9658:"Μαύρος δείκτης που δείχνει προς τα δεξιά",bull:"Κουκκίδα",rarr:"Δεξί βελάκι",rArr:"Διπλό δεξί βελάκι",hArr:"Διπλό βελάκι αριστερά-δεξιά",diams:"Μαύρο διαμάντι",asymp:"Σχεδόν ίσο με"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js new file mode 100644 index 0000000..08de561 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","en-gb",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/en.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/en.js new file mode 100644 index 0000000..418406d --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/en.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","en",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/eo.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/eo.js new file mode 100644 index 0000000..c5803d5 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/eo.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","eo",{euro:"Eŭrosigno",lsquo:"Supra 6-citilo",rsquo:"Supra 9-citilo",ldquo:"Supra 66-citilo",rdquo:"Supra 99-citilo",ndash:"Streketo",mdash:"Substreko",iexcl:"Renversita krisigno",cent:"Cendosigno",pound:"Pundosigno",curren:"Monersigno",yen:"Enosigno",brvbar:"Rompita vertikala streko",sect:"Kurba paragrafo",uml:"Tremao",copy:"Kopirajtosigno",ordf:"Adjektiva numerfinaĵo",laquo:"Duobla malplio-citilo",not:"Negohoko",reg:"Registrita marko",macr:"Superstreko",deg:"Gradosigno", +sup2:"Supra indico 2",sup3:"Supra indico 3",acute:"Dekstra korno",micro:"Mikrosigno",para:"Rekta paragrafo",middot:"Meza punkto",cedil:"Zoeto",sup1:"Supra indico 1",ordm:"Substantiva numerfinaĵo",raquo:"Duobla plio-citilo",frac14:"Kvaronosigno",frac12:"Duonosigno",frac34:"Trikvaronosigno",iquest:"renversita demandosigno",Agrave:"Latina ĉeflitero A kun liva korno",Aacute:"Latina ĉeflitero A kun dekstra korno",Acirc:"Latina ĉeflitero A kun ĉapelo",Atilde:"Latina ĉeflitero A kun tildo",Auml:"Latina ĉeflitero A kun tremao", +Aring:"Latina ĉeflitero A kun superringo",AElig:"Latina ĉeflitera ligaturo Æ",Ccedil:"Latina ĉeflitero C kun zoeto",Egrave:"Latina ĉeflitero E kun liva korno",Eacute:"Latina ĉeflitero E kun dekstra korno",Ecirc:"Latina ĉeflitero E kun ĉapelo",Euml:"Latina ĉeflitero E kun tremao",Igrave:"Latina ĉeflitero I kun liva korno",Iacute:"Latina ĉeflitero I kun dekstra korno",Icirc:"Latina ĉeflitero I kun ĉapelo",Iuml:"Latina ĉeflitero I kun tremao",ETH:"Latina ĉeflitero islanda edo",Ntilde:"Latina ĉeflitero N kun tildo", +Ograve:"Latina ĉeflitero O kun liva korno",Oacute:"Latina ĉeflitero O kun dekstra korno",Ocirc:"Latina ĉeflitero O kun ĉapelo",Otilde:"Latina ĉeflitero O kun tildo",Ouml:"Latina ĉeflitero O kun tremao",times:"Multipliko",Oslash:"Latina ĉeflitero O trastrekita",Ugrave:"Latina ĉeflitero U kun liva korno",Uacute:"Latina ĉeflitero U kun dekstra korno",Ucirc:"Latina ĉeflitero U kun ĉapelo",Uuml:"Latina ĉeflitero U kun tremao",Yacute:"Latina ĉeflitero Y kun dekstra korno",THORN:"Latina ĉeflitero islanda dorno", +szlig:"Latina etlitero germana sozo (akra s)",agrave:"Latina etlitero a kun liva korno",aacute:"Latina etlitero a kun dekstra korno",acirc:"Latina etlitero a kun ĉapelo",atilde:"Latina etlitero a kun tildo",auml:"Latina etlitero a kun tremao",aring:"Latina etlitero a kun superringo",aelig:"Latina etlitera ligaturo æ",ccedil:"Latina etlitero c kun zoeto",egrave:"Latina etlitero e kun liva korno",eacute:"Latina etlitero e kun dekstra korno",ecirc:"Latina etlitero e kun ĉapelo",euml:"Latina etlitero e kun tremao", +igrave:"Latina etlitero i kun liva korno",iacute:"Latina etlitero i kun dekstra korno",icirc:"Latina etlitero i kun ĉapelo",iuml:"Latina etlitero i kun tremao",eth:"Latina etlitero islanda edo",ntilde:"Latina etlitero n kun tildo",ograve:"Latina etlitero o kun liva korno",oacute:"Latina etlitero o kun dekstra korno",ocirc:"Latina etlitero o kun ĉapelo",otilde:"Latina etlitero o kun tildo",ouml:"Latina etlitero o kun tremao",divide:"Dividosigno",oslash:"Latina etlitero o trastrekita",ugrave:"Latina etlitero u kun liva korno", +uacute:"Latina etlitero u kun dekstra korno",ucirc:"Latina etlitero u kun ĉapelo",uuml:"Latina etlitero u kun tremao",yacute:"Latina etlitero y kun dekstra korno",thorn:"Latina etlitero islanda dorno",yuml:"Latina etlitero y kun tremao",OElig:"Latina ĉeflitera ligaturo Œ",oelig:"Latina etlitera ligaturo œ",372:"Latina ĉeflitero W kun ĉapelo",374:"Latina ĉeflitero Y kun ĉapelo",373:"Latina etlitero w kun ĉapelo",375:"Latina etlitero y kun ĉapelo",sbquo:"Suba 9-citilo",8219:"Supra renversita 9-citilo", +bdquo:"Suba 99-citilo",hellip:"Tripunkto",trade:"Varmarka signo",9658:"Nigra sago dekstren",bull:"Bulmarko",rarr:"Sago dekstren",rArr:"Duobla sago dekstren",hArr:"Duobla sago maldekstren",diams:"Nigra kvadrato",asymp:"Preskaŭ egala"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/es.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/es.js new file mode 100644 index 0000000..e91f1a0 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/es.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","es",{euro:"Símbolo de euro",lsquo:"Comilla simple izquierda",rsquo:"Comilla simple derecha",ldquo:"Comilla doble izquierda",rdquo:"Comilla doble derecha",ndash:"Guión corto",mdash:"Guión medio largo",iexcl:"Signo de admiración invertido",cent:"Símbolo centavo",pound:"Símbolo libra",curren:"Símbolo moneda",yen:"Símbolo yen",brvbar:"Barra vertical rota",sect:"Símbolo sección",uml:"Diéresis",copy:"Signo de derechos de autor",ordf:"Indicador ordinal femenino",laquo:"Abre comillas angulares", +not:"Signo negación",reg:"Signo de marca registrada",macr:"Guión alto",deg:"Signo de grado",sup2:"Superíndice dos",sup3:"Superíndice tres",acute:"Acento agudo",micro:"Signo micro",para:"Signo de pi",middot:"Punto medio",cedil:"Cedilla",sup1:"Superíndice uno",ordm:"Indicador orginal masculino",raquo:"Cierra comillas angulares",frac14:"Fracción ordinaria de un quarto",frac12:"Fracción ordinaria de una mitad",frac34:"Fracción ordinaria de tres cuartos",iquest:"Signo de interrogación invertido",Agrave:"Letra A latina mayúscula con acento grave", +Aacute:"Letra A latina mayúscula con acento agudo",Acirc:"Letra A latina mayúscula con acento circunflejo",Atilde:"Letra A latina mayúscula con tilde",Auml:"Letra A latina mayúscula con diéresis",Aring:"Letra A latina mayúscula con aro arriba",AElig:"Letra Æ latina mayúscula",Ccedil:"Letra C latina mayúscula con cedilla",Egrave:"Letra E latina mayúscula con acento grave",Eacute:"Letra E latina mayúscula con acento agudo",Ecirc:"Letra E latina mayúscula con acento circunflejo",Euml:"Letra E latina mayúscula con diéresis", +Igrave:"Letra I latina mayúscula con acento grave",Iacute:"Letra I latina mayúscula con acento agudo",Icirc:"Letra I latina mayúscula con acento circunflejo",Iuml:"Letra I latina mayúscula con diéresis",ETH:"Letra Eth latina mayúscula",Ntilde:"Letra N latina mayúscula con tilde",Ograve:"Letra O latina mayúscula con acento grave",Oacute:"Letra O latina mayúscula con acento agudo",Ocirc:"Letra O latina mayúscula con acento circunflejo",Otilde:"Letra O latina mayúscula con tilde",Ouml:"Letra O latina mayúscula con diéresis", +times:"Signo de multiplicación",Oslash:"Letra O latina mayúscula con barra inclinada",Ugrave:"Letra U latina mayúscula con acento grave",Uacute:"Letra U latina mayúscula con acento agudo",Ucirc:"Letra U latina mayúscula con acento circunflejo",Uuml:"Letra U latina mayúscula con diéresis",Yacute:"Letra Y latina mayúscula con acento agudo",THORN:"Letra Thorn latina mayúscula",szlig:"Letra s latina fuerte pequeña",agrave:"Letra a latina pequeña con acento grave",aacute:"Letra a latina pequeña con acento agudo", +acirc:"Letra a latina pequeña con acento circunflejo",atilde:"Letra a latina pequeña con tilde",auml:"Letra a latina pequeña con diéresis",aring:"Letra a latina pequeña con aro arriba",aelig:"Letra æ latina pequeña",ccedil:"Letra c latina pequeña con cedilla",egrave:"Letra e latina pequeña con acento grave",eacute:"Letra e latina pequeña con acento agudo",ecirc:"Letra e latina pequeña con acento circunflejo",euml:"Letra e latina pequeña con diéresis",igrave:"Letra i latina pequeña con acento grave", +iacute:"Letra i latina pequeña con acento agudo",icirc:"Letra i latina pequeña con acento circunflejo",iuml:"Letra i latina pequeña con diéresis",eth:"Letra eth latina pequeña",ntilde:"Letra n latina pequeña con tilde",ograve:"Letra o latina pequeña con acento grave",oacute:"Letra o latina pequeña con acento agudo",ocirc:"Letra o latina pequeña con acento circunflejo",otilde:"Letra o latina pequeña con tilde",ouml:"Letra o latina pequeña con diéresis",divide:"Signo de división",oslash:"Letra o latina minúscula con barra inclinada", +ugrave:"Letra u latina pequeña con acento grave",uacute:"Letra u latina pequeña con acento agudo",ucirc:"Letra u latina pequeña con acento circunflejo",uuml:"Letra u latina pequeña con diéresis",yacute:"Letra u latina pequeña con acento agudo",thorn:"Letra thorn latina minúscula",yuml:"Letra y latina pequeña con diéresis",OElig:"Diptongo OE latino en mayúscula",oelig:"Diptongo oe latino en minúscula",372:"Letra W latina mayúscula con acento circunflejo",374:"Letra Y latina mayúscula con acento circunflejo", +373:"Letra w latina pequeña con acento circunflejo",375:"Letra y latina pequeña con acento circunflejo",sbquo:"Comilla simple baja-9",8219:"Comilla simple alta invertida-9",bdquo:"Comillas dobles bajas-9",hellip:"Puntos suspensivos horizontales",trade:"Signo de marca registrada",9658:"Apuntador negro apuntando a la derecha",bull:"Viñeta",rarr:"Flecha a la derecha",rArr:"Flecha doble a la derecha",hArr:"Flecha izquierda derecha doble",diams:"Diamante negro",asymp:"Casi igual a"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/et.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/et.js new file mode 100644 index 0000000..2a20883 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/et.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","et",{euro:"Euromärk",lsquo:"Alustav ühekordne jutumärk",rsquo:"Lõpetav ühekordne jutumärk",ldquo:"Alustav kahekordne jutumärk",rdquo:"Lõpetav kahekordne jutumärk",ndash:"Enn-kriips",mdash:"Emm-kriips",iexcl:"Pööratud hüüumärk",cent:"Sendimärk",pound:"Naela märk",curren:"Valuutamärk",yen:"Jeeni märk",brvbar:"Katkestatud kriips",sect:"Lõigu märk",uml:"Täpid",copy:"Autoriõiguse märk",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Ei-märk",reg:"Registered sign",macr:"Macron",deg:"Kraadimärk",sup2:"Ülaindeks kaks",sup3:"Ülaindeks kolm",acute:"Acute accent",micro:"Mikro-märk",para:"Pilcrow sign",middot:"Keskpunkt",cedil:"Cedilla",sup1:"Ülaindeks üks",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Ladina suur A tildega",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Täppidega ladina suur O",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Kandilise katusega suur ladina U",Uuml:"Täppidega ladina suur U",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Ladina väike terav s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Kandilise katusega ladina väike a",atilde:"Tildega ladina väike a",auml:"Täppidega ladina väike a",aring:"Latin small letter a with ring above", +aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde", +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Jagamismärk",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent", +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Kaubamärgi märk",9658:"Black right-pointing pointer", +bull:"Kuul",rarr:"Nool paremale",rArr:"Topeltnool paremale",hArr:"Topeltnool vasakule",diams:"Black diamond suit",asymp:"Ligikaudu võrdne"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/fa.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/fa.js new file mode 100644 index 0000000..c3efb3c --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/fa.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fa",{euro:"نشان یورو",lsquo:"علامت نقل قول تکی چپ",rsquo:"علامت نقل قول تکی راست",ldquo:"علامت نقل قول دوتایی چپ",rdquo:"علامت نقل قول دوتایی راست",ndash:"خط تیره En",mdash:"خط تیره Em",iexcl:"علامت تعجب وارونه",cent:"نشان سنت",pound:"نشان پوند",curren:"نشان ارز",yen:"نشان ین",brvbar:"نوار شکسته",sect:"نشان بخش",uml:"نشان سواگیری",copy:"نشان کپی رایت",ordf:"شاخص ترتیبی مونث",laquo:"اشاره چپ مکرر برای زاویه علامت نقل قول",not:"نشان ثبت نشده",reg:"نشان ثبت شده", +macr:"نشان خط بالای حرف",deg:"نشان درجه",sup2:"بالانویس دو",sup3:"بالانویس سه",acute:"لهجه غلیظ",micro:"نشان مایکرو",para:"نشان محل بند",middot:"نقطه میانی",cedil:"سدیل",sup1:"بالانویس 1",ordm:"شاخص ترتیبی مذکر",raquo:"نشان زاویه‌دار دوتایی نقل قول راست چین",frac14:"واحد عامیانه 1/4",frac12:"واحد عامینه نصف",frac34:"واحد عامیانه 3/4",iquest:"علامت سوال معکوس",Agrave:"حرف A بزرگ لاتین با تلفظ غلیظ",Aacute:"حرف A بزرگ لاتین با تلفظ شدید",Acirc:"حرف A بزرگ لاتین با دور",Atilde:"حرف A بزرگ لاتین با صدای کامی", +Auml:"حرف A بزرگ لاتین با نشان سواگیری",Aring:"حرف A بزرگ لاتین با حلقه بالا",AElig:"حرف Æ بزرگ لاتین",Ccedil:"حرف C بزرگ لاتین با نشان سواگیری",Egrave:"حرف E بزرگ لاتین با تلفظ درشت",Eacute:"حرف E بزرگ لاتین با تلفظ زیر",Ecirc:"حرف E بزرگ لاتین با خمان",Euml:"حرف E بزرگ لاتین با نشان سواگیری",Igrave:"حرف I بزرگ لاتین با تلفظ درشت",Iacute:"حرف I بزرگ لاتین با تلفظ ریز",Icirc:"حرف I بزرگ لاتین با خمان",Iuml:"حرف I بزرگ لاتین با نشان سواگیری",ETH:"حرف لاتین بزرگ واکه ترتیبی",Ntilde:"حرف N بزرگ لاتین با مد", +Ograve:"حرف O بزرگ لاتین با تلفظ درشت",Oacute:"حرف O بزرگ لاتین با تلفظ ریز",Ocirc:"حرف O بزرگ لاتین با خمان",Otilde:"حرف O بزرگ لاتین با مد",Ouml:"حرف O بزرگ لاتین با نشان سواگیری",times:"نشان ضربدر",Oslash:"حرف O بزرگ لاتین با میان خط",Ugrave:"حرف U بزرگ لاتین با تلفظ درشت",Uacute:"حرف U بزرگ لاتین با تلفظ ریز",Ucirc:"حرف U بزرگ لاتین با خمان",Uuml:"حرف U بزرگ لاتین با نشان سواگیری",Yacute:"حرف Y بزرگ لاتین با تلفظ ریز",THORN:"حرف بزرگ لاتین خاردار",szlig:"حرف کوچک لاتین شارپ s",agrave:"حرف a کوچک لاتین با تلفظ درشت", +aacute:"حرف a کوچک لاتین با تلفظ ریز",acirc:"حرف a کوچک لاتین با خمان",atilde:"حرف a کوچک لاتین با صدای کامی",auml:"حرف a کوچک لاتین با نشان سواگیری",aring:"حرف a کوچک لاتین گوشواره دار",aelig:"حرف کوچک لاتین æ",ccedil:"حرف c کوچک لاتین با نشان سدیل",egrave:"حرف e کوچک لاتین با تلفظ درشت",eacute:"حرف e کوچک لاتین با تلفظ ریز",ecirc:"حرف e کوچک لاتین با خمان",euml:"حرف e کوچک لاتین با نشان سواگیری",igrave:"حرف i کوچک لاتین با تلفظ درشت",iacute:"حرف i کوچک لاتین با تلفظ ریز",icirc:"حرف i کوچک لاتین با خمان", +iuml:"حرف i کوچک لاتین با نشان سواگیری",eth:"حرف کوچک لاتین eth",ntilde:"حرف n کوچک لاتین با صدای کامی",ograve:"حرف o کوچک لاتین با تلفظ درشت",oacute:"حرف o کوچک لاتین با تلفظ زیر",ocirc:"حرف o کوچک لاتین با خمان",otilde:"حرف o کوچک لاتین با صدای کامی",ouml:"حرف o کوچک لاتین با نشان سواگیری",divide:"نشان بخش",oslash:"حرف o کوچک لاتین با میان خط",ugrave:"حرف u کوچک لاتین با تلفظ درشت",uacute:"حرف u کوچک لاتین با تلفظ ریز",ucirc:"حرف u کوچک لاتین با خمان",uuml:"حرف u کوچک لاتین با نشان سواگیری",yacute:"حرف y کوچک لاتین با تلفظ ریز", +thorn:"حرف کوچک لاتین خاردار",yuml:"حرف y کوچک لاتین با نشان سواگیری",OElig:"بند بزرگ لاتین OE",oelig:"بند کوچک لاتین oe",372:"حرف W بزرگ لاتین با خمان",374:"حرف Y بزرگ لاتین با خمان",373:"حرف w کوچک لاتین با خمان",375:"حرف y کوچک لاتین با خمان",sbquo:"نشان نقل قول تکی زیر-9",8219:"نشان نقل قول تکی high-reversed-9",bdquo:"نقل قول دوتایی پایین-9",hellip:"حذف افقی",trade:"نشان تجاری",9658:"نشانگر سیاه جهت راست",bull:"گلوله",rarr:"فلش راست",rArr:"فلش دوتایی راست",hArr:"فلش دوتایی چپ راست",diams:"نشان الماس سیاه", +asymp:"تقریبا برابر با"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/fi.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/fi.js new file mode 100644 index 0000000..79f4a7d --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/fi.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fi",{euro:"Euron merkki",lsquo:"Vasen yksittäinen lainausmerkki",rsquo:"Oikea yksittäinen lainausmerkki",ldquo:"Vasen kaksoislainausmerkki",rdquo:"Oikea kaksoislainausmerkki",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Sentin merkki",pound:"Punnan merkki",curren:"Valuuttamerkki",yen:"Yenin merkki",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Rekisteröity merkki",macr:"Macron",deg:"Asteen merkki",sup2:"Yläindeksi kaksi",sup3:"Yläindeksi kolme",acute:"Acute accent",micro:"Mikron merkki",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Yläindeksi yksi",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Ylösalaisin oleva kysymysmerkki",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Kertomerkki",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Jakomerkki",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Tavaramerkki merkki",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Nuoli oikealle",rArr:"Kaksoisnuoli oikealle",hArr:"Kaksoisnuoli oikealle ja vasemmalle",diams:"Black diamond suit",asymp:"Noin"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js new file mode 100644 index 0000000..24a0d0d --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fr-ca",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret",iexcl:"Point d'exclamation inversé",cent:"Symbole de cent",pound:"Symbole de Livre Sterling",curren:"Symbole monétaire",yen:"Symbole du Yen",brvbar:"Barre scindée",sect:"Symbole de section",uml:"Tréma",copy:"Symbole de copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant", +not:"Indicateur de négation",reg:"Symbole de marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"Exposant 3",acute:"Accent aigüe",micro:"Symbole micro",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"Exposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Une demi",frac34:"Trois quart",iquest:"Point d'interrogation inversé",Agrave:"A accent grave",Aacute:"A accent aigüe",Acirc:"A circonflexe",Atilde:"A tilde",Auml:"A tréma", +Aring:"A avec un rond au dessus",AElig:"Æ majuscule",Ccedil:"C cédille",Egrave:"E accent grave",Eacute:"E accent aigüe",Ecirc:"E accent circonflexe",Euml:"E tréma",Igrave:"I accent grave",Iacute:"I accent aigüe",Icirc:"I accent circonflexe",Iuml:"I tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N tilde",Ograve:"O accent grave",Oacute:"O accent aigüe",Ocirc:"O accent circonflexe",Otilde:"O tilde",Ouml:"O tréma",times:"Symbole de multiplication",Oslash:"O barré",Ugrave:"U accent grave",Uacute:"U accent aigüe", +Ucirc:"U accent circonflexe",Uuml:"U tréma",Yacute:"Y accent aigüe",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a accent grave",aacute:"a accent aigüe",acirc:"a accent circonflexe",atilde:"a tilde",auml:"a tréma",aring:"a avec un cercle au dessus",aelig:"æ",ccedil:"c cédille",egrave:"e accent grave",eacute:"e accent aigüe",ecirc:"e accent circonflexe",euml:"e tréma",igrave:"i accent grave",iacute:"i accent aigüe",icirc:"i accent circonflexe",iuml:"i tréma", +eth:"Lettre minuscule islandaise ED",ntilde:"n tilde",ograve:"o accent grave",oacute:"o accent aigüe",ocirc:"O accent circonflexe",otilde:"O tilde",ouml:"O tréma",divide:"Symbole de division",oslash:"o barré",ugrave:"u accent grave",uacute:"u accent aigüe",ucirc:"u accent circonflexe",uuml:"u tréma",yacute:"y accent aigüe",thorn:"Lettre islandaise thorn minuscule",yuml:"y tréma",OElig:"ligature majuscule latine Œ",oelig:"ligature minuscule latine œ",372:"W accent circonflexe",374:"Y accent circonflexe", +373:"w accent circonflexe",375:"y accent circonflexe",sbquo:"Guillemet simple fermant",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Symbole de marque déposée",9658:"Flèche noire pointant vers la droite",bull:"Puce",rarr:"Flèche vers la droite",rArr:"Flèche double vers la droite",hArr:"Flèche double vers la gauche",diams:"Carreau",asymp:"Presque égal"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/fr.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/fr.js new file mode 100644 index 0000000..b224b1e --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/fr.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fr",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret cadratin",iexcl:"Point d'exclamation inversé",cent:"Symbole Cent",pound:"Symbole Livre Sterling",curren:"Symbole monétaire",yen:"Symbole Yen",brvbar:"Barre verticale scindée",sect:"Section",uml:"Tréma",copy:"Symbole Copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant", +not:"Crochet de négation",reg:"Marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"\\tExposant 3",acute:"Accent aigu",micro:"Omicron",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"\\tExposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Un demi",frac34:"Trois quarts",iquest:"Point d'interrogation inversé",Agrave:"A majuscule accent grave",Aacute:"A majuscule accent aigu",Acirc:"A majuscule accent circonflexe",Atilde:"A majuscule avec caron", +Auml:"A majuscule tréma",Aring:"A majuscule avec un rond au-dessus",AElig:"Æ majuscule ligaturés",Ccedil:"C majuscule cédille",Egrave:"E majuscule accent grave",Eacute:"E majuscule accent aigu",Ecirc:"E majuscule accent circonflexe",Euml:"E majuscule tréma",Igrave:"I majuscule accent grave",Iacute:"I majuscule accent aigu",Icirc:"I majuscule accent circonflexe",Iuml:"I majuscule tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N majuscule avec caron",Ograve:"O majuscule accent grave",Oacute:"O majuscule accent aigu", +Ocirc:"O majuscule accent circonflexe",Otilde:"O majuscule avec caron",Ouml:"O majuscule tréma",times:"Multiplication",Oslash:"O majuscule barré",Ugrave:"U majuscule accent grave",Uacute:"U majuscule accent aigu",Ucirc:"U majuscule accent circonflexe",Uuml:"U majuscule tréma",Yacute:"Y majuscule accent aigu",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a minuscule accent grave",aacute:"a minuscule accent aigu",acirc:"a minuscule accent circonflexe",atilde:"a minuscule avec caron", +auml:"a minuscule tréma",aring:"a minuscule avec un rond au-dessus",aelig:"æ minuscule ligaturés",ccedil:"c minuscule cédille",egrave:"e minuscule accent grave",eacute:"e minuscule accent aigu",ecirc:"e minuscule accent circonflexe",euml:"e minuscule tréma",igrave:"i minuscule accent grave",iacute:"i minuscule accent aigu",icirc:"i minuscule accent circonflexe",iuml:"i minuscule tréma",eth:"Lettre minuscule islandaise ED",ntilde:"n minuscule avec caron",ograve:"o minuscule accent grave",oacute:"o minuscule accent aigu", +ocirc:"o minuscule accent circonflexe",otilde:"o minuscule avec caron",ouml:"o minuscule tréma",divide:"Division",oslash:"o minuscule barré",ugrave:"u minuscule accent grave",uacute:"u minuscule accent aigu",ucirc:"u minuscule accent circonflexe",uuml:"u minuscule tréma",yacute:"y minuscule accent aigu",thorn:"Lettre islandaise thorn minuscule",yuml:"y minuscule tréma",OElig:"ligature majuscule latine Œ",oelig:"ligature minuscule latine œ",372:"W majuscule accent circonflexe",374:"Y majuscule accent circonflexe", +373:"w minuscule accent circonflexe",375:"y minuscule accent circonflexe",sbquo:"Guillemet simple fermant (anglais)",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Marque commerciale (trade mark)",9658:"Flèche noire pointant vers la droite",bull:"Gros point médian",rarr:"Flèche vers la droite",rArr:"Double flèche vers la droite",hArr:"Double flèche vers la gauche",diams:"Carreau noir",asymp:"Presque égal"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/gl.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/gl.js new file mode 100644 index 0000000..797ecc5 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/gl.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","gl",{euro:"Símbolo do euro",lsquo:"Comiña simple esquerda",rsquo:"Comiña simple dereita",ldquo:"Comiñas dobres esquerda",rdquo:"Comiñas dobres dereita",ndash:"Guión",mdash:"Raia",iexcl:"Signo de admiración invertido",cent:"Símbolo do centavo",pound:"Símbolo da libra",curren:"Símbolo de moeda",yen:"Símbolo do yen",brvbar:"Barra vertical rota",sect:"Símbolo de sección",uml:"Diérese",copy:"Símbolo de dereitos de autoría",ordf:"Indicador ordinal feminino",laquo:"Comiñas latinas, apertura", +not:"Signo negación",reg:"Símbolo de marca rexistrada",macr:"Guión alto",deg:"Signo de grao",sup2:"Superíndice dous",sup3:"Superíndice tres",acute:"Acento agudo",micro:"Signo de micro",para:"Signo de pi",middot:"Punto medio",cedil:"Cedilla",sup1:"Superíndice un",ordm:"Indicador ordinal masculino",raquo:"Comiñas latinas, peche",frac14:"Fracción ordinaria de un cuarto",frac12:"Fracción ordinaria de un medio",frac34:"Fracción ordinaria de tres cuartos",iquest:"Signo de interrogación invertido",Agrave:"Letra A latina maiúscula con acento grave", +Aacute:"Letra A latina maiúscula con acento agudo",Acirc:"Letra A latina maiúscula con acento circunflexo",Atilde:"Letra A latina maiúscula con til",Auml:"Letra A latina maiúscula con diérese",Aring:"Letra A latina maiúscula con aro enriba",AElig:"Letra Æ latina maiúscula",Ccedil:"Letra C latina maiúscula con cedilla",Egrave:"Letra E latina maiúscula con acento grave",Eacute:"Letra E latina maiúscula con acento agudo",Ecirc:"Letra E latina maiúscula con acento circunflexo",Euml:"Letra E latina maiúscula con diérese", +Igrave:"Letra I latina maiúscula con acento grave",Iacute:"Letra I latina maiúscula con acento agudo",Icirc:"Letra I latina maiúscula con acento circunflexo",Iuml:"Letra I latina maiúscula con diérese",ETH:"Letra Ed latina maiúscula",Ntilde:"Letra N latina maiúscula con til",Ograve:"Letra O latina maiúscula con acento grave",Oacute:"Letra O latina maiúscula con acento agudo",Ocirc:"Letra O latina maiúscula con acento circunflexo",Otilde:"Letra O latina maiúscula con til",Ouml:"Letra O latina maiúscula con diérese", +times:"Signo de multiplicación",Oslash:"Letra O latina maiúscula con barra transversal",Ugrave:"Letra U latina maiúscula con acento grave",Uacute:"Letra U latina maiúscula con acento agudo",Ucirc:"Letra U latina maiúscula con acento circunflexo",Uuml:"Letra U latina maiúscula con diérese",Yacute:"Letra Y latina maiúscula con acento agudo",THORN:"Letra Thorn latina maiúscula",szlig:"Letra s latina forte minúscula",agrave:"Letra a latina minúscula con acento grave",aacute:"Letra a latina minúscula con acento agudo", +acirc:"Letra a latina minúscula con acento circunflexo",atilde:"Letra a latina minúscula con til",auml:"Letra a latina minúscula con diérese",aring:"Letra a latina minúscula con aro enriba",aelig:"Letra æ latina minúscula",ccedil:"Letra c latina minúscula con cedilla",egrave:"Letra e latina minúscula con acento grave",eacute:"Letra e latina minúscula con acento agudo",ecirc:"Letra e latina minúscula con acento circunflexo",euml:"Letra e latina minúscula con diérese",igrave:"Letra i latina minúscula con acento grave", +iacute:"Letra i latina minúscula con acento agudo",icirc:"Letra i latina minúscula con acento circunflexo",iuml:"Letra i latina minúscula con diérese",eth:"Letra ed latina minúscula",ntilde:"Letra n latina minúscula con til",ograve:"Letra o latina minúscula con acento grave",oacute:"Letra o latina minúscula con acento agudo",ocirc:"Letra o latina minúscula con acento circunflexo",otilde:"Letra o latina minúscula con til",ouml:"Letra o latina minúscula con diérese",divide:"Signo de división",oslash:"Letra o latina minúscula con barra transversal", +ugrave:"Letra u latina minúscula con acento grave",uacute:"Letra u latina minúscula con acento agudo",ucirc:"Letra u latina minúscula con acento circunflexo",uuml:"Letra u latina minúscula con diérese",yacute:"Letra y latina minúscula con acento agudo",thorn:"Letra Thorn latina minúscula",yuml:"Letra y latina minúscula con diérese",OElig:"Ligadura OE latina maiúscula",oelig:"Ligadura oe latina minúscula",372:"Letra W latina maiúscula con acento circunflexo",374:"Letra Y latina maiúscula con acento circunflexo", +373:"Letra w latina minúscula con acento circunflexo",375:"Letra y latina minúscula con acento circunflexo",sbquo:"Comiña simple baixa, de apertura",8219:"Comiña simple alta, de peche",bdquo:"Comiñas dobres baixas, de apertura",hellip:"Elipse, puntos suspensivos",trade:"Signo de marca rexistrada",9658:"Apuntador negro apuntando á dereita",bull:"Viñeta",rarr:"Frecha á dereita",rArr:"Frecha dobre á dereita",hArr:"Frecha dobre da esquerda á dereita",diams:"Diamante negro",asymp:"Case igual a"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/he.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/he.js new file mode 100644 index 0000000..7593589 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/he.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","he",{euro:"יורו",lsquo:"סימן ציטוט יחיד שמאלי",rsquo:"סימן ציטוט יחיד ימני",ldquo:"סימן ציטוט כפול שמאלי",rdquo:"סימן ציטוט כפול ימני",ndash:"קו מפריד קצר",mdash:"קו מפריד ארוך",iexcl:"סימן קריאה הפוך",cent:"סנט",pound:"פאונד",curren:"מטבע",yen:"ין",brvbar:"קו שבור",sect:"סימן מקטע",uml:"שתי נקודות אופקיות (Diaeresis)",copy:"סימן זכויות יוצרים (Copyright)",ordf:"סימן אורדינאלי נקבי",laquo:"סימן ציטוט זווית כפולה לשמאל",not:"סימן שלילה מתמטי",reg:"סימן רשום", +macr:"מקרון (הגיה ארוכה)",deg:"מעלות",sup2:"2 בכתיב עילי",sup3:"3 בכתיב עילי",acute:"סימן דגוש (Acute)",micro:"מיקרו",para:"סימון פסקה",middot:"נקודה אמצעית",cedil:"סדיליה",sup1:"1 בכתיב עילי",ordm:"סימן אורדינאלי זכרי",raquo:"סימן ציטוט זווית כפולה לימין",frac14:"רבע בשבר פשוט",frac12:"חצי בשבר פשוט",frac34:"שלושה רבעים בשבר פשוט",iquest:"סימן שאלה הפוך",Agrave:"אות לטינית A עם גרש (Grave)",Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde", +Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"אות לטינית Æ גדולה",Ccedil:"Latin capital letter C with cedilla",Egrave:"אות לטינית E עם גרש (Grave)",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"אות לטינית I עם גרש (Grave)",Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis", +ETH:"אות לטינית Eth גדולה",Ntilde:"Latin capital letter N with tilde",Ograve:"אות לטינית O עם גרש (Grave)",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"סימן כפל",Oslash:"Latin capital letter O with stroke",Ugrave:"אות לטינית U עם גרש (Grave)",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis", +Yacute:"Latin capital letter Y with acute accent",THORN:"אות לטינית Thorn גדולה",szlig:"אות לטינית s חדה קטנה",agrave:"אות לטינית a עם גרש (Grave)",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"אות לטינית æ קטנה",ccedil:"Latin small letter c with cedilla",egrave:"אות לטינית e עם גרש (Grave)",eacute:"Latin small letter e with acute accent", +ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"אות לטינית i עם גרש (Grave)",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"אות לטינית eth קטנה",ntilde:"Latin small letter n with tilde",ograve:"אות לטינית o עם גרש (Grave)",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis", +divide:"סימן חלוקה",oslash:"Latin small letter o with stroke",ugrave:"אות לטינית u עם גרש (Grave)",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"אות לטינית thorn קטנה",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex", +373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"סימן ציטוט נמוך יחיד",8219:"סימן ציטוט",bdquo:"סימן ציטוט נמוך כפול",hellip:"שלוש נקודות",trade:"סימן טריידמארק",9658:"סמן שחור לצד ימין",bull:"תבליט (רשימה)",rarr:"חץ לימין",rArr:"חץ כפול לימין",hArr:"חץ כפול לימין ושמאל",diams:"יהלום מלא",asymp:"כמעט שווה"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/hr.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/hr.js new file mode 100644 index 0000000..6575432 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/hr.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","hr",{euro:"Euro znak",lsquo:"Lijevi jednostruki navodnik",rsquo:"Desni jednostruki navodnik",ldquo:"Lijevi dvostruki navodnik",rdquo:"Desni dvostruki navodnik",ndash:"En crtica",mdash:"Em crtica",iexcl:"Naopaki uskličnik",cent:"Cent znak",pound:"Funta znak",curren:"Znak valute",yen:"Yen znak",brvbar:"Potrgana prečka",sect:"Znak odjeljka",uml:"Prijeglasi",copy:"Copyright znak",ordf:"Feminine ordinal indicator",laquo:"Lijevi dvostruki uglati navodnik",not:"Not znak", +reg:"Registered znak",macr:"Macron",deg:"Stupanj znak",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Mikro znak",para:"Pilcrow sign",middot:"Srednja točka",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Desni dvostruku uglati navodnik",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Naopaki upitnik",Agrave:"Veliko latinsko slovo A s akcentom",Aacute:"Latinično veliko slovo A sa oštrim naglaskom", +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent", +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent", +Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above", +aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde", +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent", +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer", +bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/hu.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/hu.js new file mode 100644 index 0000000..4455483 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/hu.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","hu",{euro:"Euró jel",lsquo:"Bal szimpla idézőjel",rsquo:"Jobb szimpla idézőjel",ldquo:"Bal dupla idézőjel",rdquo:"Jobb dupla idézőjel",ndash:"Rövid gondolatjel",mdash:"Hosszú gondolatjel",iexcl:"Fordított felkiáltójel",cent:"Cent jel",pound:"Font jel",curren:"Valuta jel",yen:"Yen jel",brvbar:"Hosszú kettőspont",sect:"Paragrafus jel",uml:"Kettős hangzó jel",copy:"Szerzői jog jel",ordf:"Női sorrend mutatója",laquo:"Balra mutató duplanyíl",not:"Feltételes kötőjel", +reg:"Bejegyzett védjegy jele",macr:"Hosszúsági jel",deg:"Fok jel",sup2:"Négyzeten jel",sup3:"Köbön jel",acute:"Éles ékezet",micro:"Mikro-jel",para:"Bekezdés jel",middot:"Közép pont",cedil:"Cédille",sup1:"Elsőn jel",ordm:"Férfi sorrend mutatója",raquo:"Jobbra mutató duplanyíl",frac14:"Egy negyed jel",frac12:"Egy ketted jel",frac34:"Három negyed jel",iquest:"Fordított kérdőjel",Agrave:"Latin nagy A fordított ékezettel",Aacute:"Latin nagy A normál ékezettel",Acirc:"Latin nagy A hajtott ékezettel",Atilde:"Latin nagy A hullámjellel", +Auml:"Latin nagy A kettőspont ékezettel",Aring:"Latin nagy A gyűrű ékezettel",AElig:"Latin nagy Æ betű",Ccedil:"Latin nagy C cedillával",Egrave:"Latin nagy E fordított ékezettel",Eacute:"Latin nagy E normál ékezettel",Ecirc:"Latin nagy E hajtott ékezettel",Euml:"Latin nagy E dupla kettőspont ékezettel",Igrave:"Latin nagy I fordított ékezettel",Iacute:"Latin nagy I normál ékezettel",Icirc:"Latin nagy I hajtott ékezettel",Iuml:"Latin nagy I kettőspont ékezettel",ETH:"Latin nagy Eth betű",Ntilde:"Latin nagy N hullámjellel", +Ograve:"Latin nagy O fordított ékezettel",Oacute:"Latin nagy O normál ékezettel",Ocirc:"Latin nagy O hajtott ékezettel",Otilde:"Latin nagy O hullámjellel",Ouml:"Latin nagy O kettőspont ékezettel",times:"Szorzás jel",Oslash:"Latin O betű áthúzással",Ugrave:"Latin nagy U fordított ékezettel",Uacute:"Latin nagy U normál ékezettel",Ucirc:"Latin nagy U hajtott ékezettel",Uuml:"Latin nagy U kettőspont ékezettel",Yacute:"Latin nagy Y normál ékezettel",THORN:"Latin nagy Thorn betű",szlig:"Latin kis s betű", +agrave:"Latin kis a fordított ékezettel",aacute:"Latin kis a normál ékezettel",acirc:"Latin kis a hajtott ékezettel",atilde:"Latin kis a hullámjellel",auml:"Latin kis a kettőspont ékezettel",aring:"Latin kis a gyűrű ékezettel",aelig:"Latin kis æ betű",ccedil:"Latin kis c cedillával",egrave:"Latin kis e fordított ékezettel",eacute:"Latin kis e normál ékezettel",ecirc:"Latin kis e hajtott ékezettel",euml:"Latin kis e dupla kettőspont ékezettel",igrave:"Latin kis i fordított ékezettel",iacute:"Latin kis i normál ékezettel", +icirc:"Latin kis i hajtott ékezettel",iuml:"Latin kis i kettőspont ékezettel",eth:"Latin kis eth betű",ntilde:"Latin kis n hullámjellel",ograve:"Latin kis o fordított ékezettel",oacute:"Latin kis o normál ékezettel",ocirc:"Latin kis o hajtott ékezettel",otilde:"Latin kis o hullámjellel",ouml:"Latin kis o kettőspont ékezettel",divide:"Osztásjel",oslash:"Latin kis o betű áthúzással",ugrave:"Latin kis u fordított ékezettel",uacute:"Latin kis u normál ékezettel",ucirc:"Latin kis u hajtott ékezettel", +uuml:"Latin kis u kettőspont ékezettel",yacute:"Latin kis y normál ékezettel",thorn:"Latin kis thorn jel",yuml:"Latin kis y kettőspont ékezettel",OElig:"Latin nagy OE-jel",oelig:"Latin kis oe-jel",372:"Latin nagy W hajtott ékezettel",374:"Latin nagy Y hajtott ékezettel",373:"Latin kis w hajtott ékezettel",375:"Latin kis y hajtott ékezettel",sbquo:"Nyitó nyomdai szimpla idézőjel",8219:"Záró nyomdai záró idézőjel",bdquo:"Nyitó nyomdai dupla idézőjel",hellip:"Három pont",trade:"Kereskedelmi védjegy jele", +9658:"Jobbra mutató fekete mutató",bull:"Golyó",rarr:"Jobbra mutató nyíl",rArr:"Jobbra mutató duplanyíl",hArr:"Bal-jobb duplanyíl",diams:"Fekete gyémánt jel",asymp:"Majdnem egyenlő jel"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/id.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/id.js new file mode 100644 index 0000000..1b4bd67 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/id.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","id",{euro:"Tanda Euro",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Tanda Yen",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Tanda Hak Cipta",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Tanda Telah Terdaftar",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/it.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/it.js new file mode 100644 index 0000000..6b09097 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/it.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","it",{euro:"Simbolo Euro",lsquo:"Virgoletta singola sinistra",rsquo:"Virgoletta singola destra",ldquo:"Virgolette aperte",rdquo:"Virgolette chiuse",ndash:"Trattino",mdash:"Trattino lungo",iexcl:"Punto esclavamativo invertito",cent:"Simbolo Cent",pound:"Simbolo Sterlina",curren:"Simbolo Moneta",yen:"Simbolo Yen",brvbar:"Barra interrotta",sect:"Simbolo di sezione",uml:"Dieresi",copy:"Simbolo Copyright",ordf:"Indicatore ordinale femminile",laquo:"Virgolette basse aperte", +not:"Nessun segno",reg:"Simbolo Registrato",macr:"Macron",deg:"Simbolo Grado",sup2:"Apice Due",sup3:"Apice Tre",acute:"Accento acuto",micro:"Simbolo Micro",para:"Simbolo Paragrafo",middot:"Punto centrale",cedil:"Cediglia",sup1:"Apice Uno",ordm:"Indicatore ordinale maschile",raquo:"Virgolette basse chiuse",frac14:"Frazione volgare un quarto",frac12:"Frazione volgare un mezzo",frac34:"Frazione volgare tre quarti",iquest:"Punto interrogativo invertito",Agrave:"Lettera maiuscola latina A con accento grave", +Aacute:"Lettera maiuscola latina A con accento acuto",Acirc:"Lettera maiuscola latina A con accento circonflesso",Atilde:"Lettera maiuscola latina A con tilde",Auml:"Lettera maiuscola latina A con dieresi",Aring:"Lettera maiuscola latina A con anello sopra",AElig:"Lettera maiuscola latina AE",Ccedil:"Lettera maiuscola latina C con cediglia",Egrave:"Lettera maiuscola latina E con accento grave",Eacute:"Lettera maiuscola latina E con accento acuto",Ecirc:"Lettera maiuscola latina E con accento circonflesso", +Euml:"Lettera maiuscola latina E con dieresi",Igrave:"Lettera maiuscola latina I con accento grave",Iacute:"Lettera maiuscola latina I con accento acuto",Icirc:"Lettera maiuscola latina I con accento circonflesso",Iuml:"Lettera maiuscola latina I con dieresi",ETH:"Lettera maiuscola latina Eth",Ntilde:"Lettera maiuscola latina N con tilde",Ograve:"Lettera maiuscola latina O con accento grave",Oacute:"Lettera maiuscola latina O con accento acuto",Ocirc:"Lettera maiuscola latina O con accento circonflesso", +Otilde:"Lettera maiuscola latina O con tilde",Ouml:"Lettera maiuscola latina O con dieresi",times:"Simbolo di moltiplicazione",Oslash:"Lettera maiuscola latina O barrata",Ugrave:"Lettera maiuscola latina U con accento grave",Uacute:"Lettera maiuscola latina U con accento acuto",Ucirc:"Lettera maiuscola latina U con accento circonflesso",Uuml:"Lettera maiuscola latina U con accento circonflesso",Yacute:"Lettera maiuscola latina Y con accento acuto",THORN:"Lettera maiuscola latina Thorn",szlig:"Lettera latina minuscola doppia S", +agrave:"Lettera minuscola latina a con accento grave",aacute:"Lettera minuscola latina a con accento acuto",acirc:"Lettera minuscola latina a con accento circonflesso",atilde:"Lettera minuscola latina a con tilde",auml:"Lettera minuscola latina a con dieresi",aring:"Lettera minuscola latina a con anello superiore",aelig:"Lettera minuscola latina ae",ccedil:"Lettera minuscola latina c con cediglia",egrave:"Lettera minuscola latina e con accento grave",eacute:"Lettera minuscola latina e con accento acuto", +ecirc:"Lettera minuscola latina e con accento circonflesso",euml:"Lettera minuscola latina e con dieresi",igrave:"Lettera minuscola latina i con accento grave",iacute:"Lettera minuscola latina i con accento acuto",icirc:"Lettera minuscola latina i con accento circonflesso",iuml:"Lettera minuscola latina i con dieresi",eth:"Lettera minuscola latina eth",ntilde:"Lettera minuscola latina n con tilde",ograve:"Lettera minuscola latina o con accento grave",oacute:"Lettera minuscola latina o con accento acuto", +ocirc:"Lettera minuscola latina o con accento circonflesso",otilde:"Lettera minuscola latina o con tilde",ouml:"Lettera minuscola latina o con dieresi",divide:"Simbolo di divisione",oslash:"Lettera minuscola latina o barrata",ugrave:"Lettera minuscola latina u con accento grave",uacute:"Lettera minuscola latina u con accento acuto",ucirc:"Lettera minuscola latina u con accento circonflesso",uuml:"Lettera minuscola latina u con dieresi",yacute:"Lettera minuscola latina y con accento acuto",thorn:"Lettera minuscola latina thorn", +yuml:"Lettera minuscola latina y con dieresi",OElig:"Legatura maiuscola latina OE",oelig:"Legatura minuscola latina oe",372:"Lettera maiuscola latina W con accento circonflesso",374:"Lettera maiuscola latina Y con accento circonflesso",373:"Lettera minuscola latina w con accento circonflesso",375:"Lettera minuscola latina y con accento circonflesso",sbquo:"Singola virgoletta bassa low-9",8219:"Singola virgoletta bassa low-9 inversa",bdquo:"Doppia virgoletta bassa low-9",hellip:"Ellissi orizzontale", +trade:"Simbolo TM",9658:"Puntatore nero rivolto verso destra",bull:"Punto",rarr:"Freccia verso destra",rArr:"Doppia freccia verso destra",hArr:"Doppia freccia sinistra destra",diams:"Simbolo nero diamante",asymp:"Quasi uguale a"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ja.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ja.js new file mode 100644 index 0000000..b32e890 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ja.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ja",{euro:"ユーロ記号",lsquo:"左シングル引用符",rsquo:"右シングル引用符",ldquo:"左ダブル引用符",rdquo:"右ダブル引用符",ndash:"半角ダッシュ",mdash:"全角ダッシュ",iexcl:"逆さ感嘆符",cent:"セント記号",pound:"ポンド記号",curren:"通貨記号",yen:"円記号",brvbar:"上下に分かれた縦棒",sect:"節記号",uml:"分音記号(ウムラウト)",copy:"著作権表示記号",ordf:"女性序数標識",laquo:" 始め二重山括弧引用記号",not:"論理否定記号",reg:"登録商標記号",macr:"長音符",deg:"度記号",sup2:"上つき2, 2乗",sup3:"上つき3, 3乗",acute:"揚音符",micro:"ミクロン記号",para:"段落記号",middot:"中黒",cedil:"セディラ",sup1:"上つき1",ordm:"男性序数標識",raquo:"終わり二重山括弧引用記号", +frac14:"四分の一",frac12:"二分の一",frac34:"四分の三",iquest:"逆疑問符",Agrave:"抑音符つき大文字A",Aacute:"揚音符つき大文字A",Acirc:"曲折アクセントつき大文字A",Atilde:"チルダつき大文字A",Auml:"分音記号つき大文字A",Aring:"リングつき大文字A",AElig:"AとEの合字",Ccedil:"セディラつき大文字C",Egrave:"抑音符つき大文字E",Eacute:"揚音符つき大文字E",Ecirc:"曲折アクセントつき大文字E",Euml:"分音記号つき大文字E",Igrave:"抑音符つき大文字I",Iacute:"揚音符つき大文字I",Icirc:"曲折アクセントつき大文字I",Iuml:"分音記号つき大文字I",ETH:"[アイスランド語]大文字ETH",Ntilde:"チルダつき大文字N",Ograve:"抑音符つき大文字O",Oacute:"揚音符つき大文字O",Ocirc:"曲折アクセントつき大文字O",Otilde:"チルダつき大文字O",Ouml:" 分音記号つき大文字O", +times:"乗算記号",Oslash:"打ち消し線つき大文字O",Ugrave:"抑音符つき大文字U",Uacute:"揚音符つき大文字U",Ucirc:"曲折アクセントつき大文字U",Uuml:"分音記号つき大文字U",Yacute:"揚音符つき大文字Y",THORN:"[アイスランド語]大文字THORN",szlig:"ドイツ語エスツェット",agrave:"抑音符つき小文字a",aacute:"揚音符つき小文字a",acirc:"曲折アクセントつき小文字a",atilde:"チルダつき小文字a",auml:"分音記号つき小文字a",aring:"リングつき小文字a",aelig:"aとeの合字",ccedil:"セディラつき小文字c",egrave:"抑音符つき小文字e",eacute:"揚音符つき小文字e",ecirc:"曲折アクセントつき小文字e",euml:"分音記号つき小文字e",igrave:"抑音符つき小文字i",iacute:"揚音符つき小文字i",icirc:"曲折アクセントつき小文字i",iuml:"分音記号つき小文字i",eth:"アイスランド語小文字eth", +ntilde:"チルダつき小文字n",ograve:"抑音符つき小文字o",oacute:"揚音符つき小文字o",ocirc:"曲折アクセントつき小文字o",otilde:"チルダつき小文字o",ouml:"分音記号つき小文字o",divide:"除算記号",oslash:"打ち消し線つき小文字o",ugrave:"抑音符つき小文字u",uacute:"揚音符つき小文字u",ucirc:"曲折アクセントつき小文字u",uuml:"分音記号つき小文字u",yacute:"揚音符つき小文字y",thorn:"アイスランド語小文字thorn",yuml:"分音記号つき小文字y",OElig:"OとEの合字",oelig:"oとeの合字",372:"曲折アクセントつき大文字W",374:"曲折アクセントつき大文字Y",373:"曲折アクセントつき小文字w",375:"曲折アクセントつき小文字y",sbquo:"シングル下引用符",8219:"左右逆の左引用符",bdquo:"ダブル下引用符",hellip:"三点リーダ",trade:"商標記号",9658:"右黒三角ポインタ",bull:"黒丸", +rarr:"右矢印",rArr:"右二重矢印",hArr:"左右二重矢印",diams:"ダイヤ",asymp:"漸近"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/km.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/km.js new file mode 100644 index 0000000..8d6a3d1 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/km.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","km",{euro:"សញ្ញា​អឺរ៉ូ",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"សញ្ញា​សេន",pound:"សញ្ញា​ផោន",curren:"សញ្ញា​រូបិយបណ្ណ",yen:"សញ្ញា​យ៉េន",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"សញ្ញា​រក្សា​សិទ្ធិ",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"សញ្ញា​ដឺក្រេ",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"សញ្ញា​មីក្រូ",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ku.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ku.js new file mode 100644 index 0000000..5bed679 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ku.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ku",{euro:"نیشانەی یۆرۆ",lsquo:"نیشانەی فاریزەی سەرووژێری تاکی چەپ",rsquo:"نیشانەی فاریزەی سەرووژێری تاکی ڕاست",ldquo:"نیشانەی فاریزەی سەرووژێری دووهێندەی چه‌پ",rdquo:"نیشانەی فاریزەی سەرووژێری دووهێندەی ڕاست",ndash:"تەقەڵی کورت",mdash:"تەقەڵی درێژ",iexcl:"نیشانەی هەڵەوگێڕی سەرسوڕهێنەر",cent:"نیشانەی سەنت",pound:"نیشانەی پاوەند",curren:"نیشانەی دراو",yen:"نیشانەی یەنی ژاپۆنی",brvbar:"شریتی ئەستوونی پچڕاو",sect:"نیشانەی دوو s لەسەریەک",uml:"خاڵ",copy:"نیشانەی مافی چاپ", +ordf:"هێڵ لەسەر پیتی a",laquo:"دوو تیری بەدووایەکی چەپ",not:"نیشانەی نەخێر",reg:"نیشانەی R لەناو بازنەدا",macr:"ماکڕۆن",deg:"نیشانەی پلە",sup2:"سەرنووسی دوو",sup3:"سەرنووسی سێ",acute:"لاری تیژ",micro:"نیشانەی u لق درێژی چەپی خواروو",para:"نیشانەی پەڕەگراف",middot:"ناوەڕاستی خاڵ",cedil:"نیشانەی c ژێر چووکرە",sup1:"سەرنووسی یەک",ordm:"هێڵ لەژێر پیتی o",raquo:"دوو تیری بەدووایەکی ڕاست",frac14:"یەک لەسەر چووار",frac12:"یەک لەسەر دوو",frac34:"سێ لەسەر چووار",iquest:"هێمای هەڵەوگێری پرسیار",Agrave:"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری لار", +Aacute:"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری تیژ",Acirc:"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری",Atilde:"پیتی لاتینی A-ی گەورە لەگەڵ زەڕە",Auml:"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری",Aring:"پیتی لاتینی گەورەی Å",AElig:"پیتی لاتینی گەورەی Æ",Ccedil:"پیتی لاتینی C-ی گەورە لەگەڵ ژێر چووکرە",Egrave:"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری لار",Eacute:"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ecirc:"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری",Euml:"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری", +Igrave:"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری لار",Iacute:"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری تیژ",Icirc:"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری",Iuml:"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری",ETH:"پیتی لاتینی E-ی گەورەی",Ntilde:"پیتی لاتینی N-ی گەورە لەگەڵ زەڕە",Ograve:"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری لار",Oacute:"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ocirc:"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری",Otilde:"پیتی لاتینی O-ی گەورە لەگەڵ زەڕە",Ouml:"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری", +times:"نیشانەی لێکدان",Oslash:"پیتی لاتینی گەورەی Ø لەگەڵ هێمای دڵ وەستان",Ugrave:"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری لار",Uacute:"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ucirc:"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری",Uuml:"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری",Yacute:"پیتی لاتینی Y-ی گەورە لەگەڵ ڕوومەتداری تیژ",THORN:"پیتی لاتینی دڕکی گەورە",szlig:"پیتی لاتنی نووک تیژی s",agrave:"پیتی لاتینی a-ی بچووک لەگەڵ ڕوومەتداری لار",aacute:"پیتی لاتینی a-ی بچووك لەگەڵ ڕوومەتداری تیژ",acirc:"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری", +atilde:"پیتی لاتینی a-ی بچووك لەگەڵ زەڕە",auml:"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری",aring:"پیتی لاتینی å-ی بچووك",aelig:"پیتی لاتینی æ-ی بچووك",ccedil:"پیتی لاتینی c-ی بچووك لەگەڵ ژێر چووکرە",egrave:"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری لار",eacute:"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری تیژ",ecirc:"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری",euml:"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری",igrave:"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری لار",iacute:"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری تیژ", +icirc:"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری",iuml:"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری",eth:"پیتی لاتینی e-ی بچووك",ntilde:"پیتی لاتینی n-ی بچووك لەگەڵ زەڕە",ograve:"پیتی لاتینی o-ی بچووك لەگەڵ ڕوومەتداری لار",oacute:"پیتی لاتینی o-ی بچووك له‌گەڵ ڕوومەتداری تیژ",ocirc:"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری",otilde:"پیتی لاتینی o-ی بچووك لەگەڵ زەڕە",ouml:"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری",divide:"نیشانەی دابەش",oslash:"پیتی لاتینی گەورەی ø لەگەڵ هێمای دڵ وەستان",ugrave:"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری لار", +uacute:"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری تیژ",ucirc:"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری",uuml:"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری",yacute:"پیتی لاتینی y-ی بچووك لەگەڵ ڕوومەتداری تیژ",thorn:"پیتی لاتینی دڕکی بچووك",yuml:"پیتی لاتینی y-ی بچووك لەگەڵ نیشانە لەسەری",OElig:"پیتی لاتینی گەورەی پێکەوەنووسراوی OE",oelig:"پیتی لاتینی بچووکی پێکەوەنووسراوی oe",372:"پیتی لاتینی W-ی گەورە لەگەڵ نیشانە لەسەری",374:"پیتی لاتینی Y-ی گەورە لەگەڵ نیشانە لەسەری",373:"پیتی لاتینی w-ی بچووکی لەگەڵ نیشانە لەسەری", +375:"پیتی لاتینی y-ی بچووکی لەگەڵ نیشانە لەسەری",sbquo:"نیشانەی فاریزەی نزم",8219:"نیشانەی فاریزەی بەرزی پێچەوانە",bdquo:"دوو فاریزەی تەنیش یەك",hellip:"ئاسۆیی بازنە",trade:"نیشانەی بازرگانی",9658:"ئاراستەی ڕەشی دەستی ڕاست",bull:"فیشەك",rarr:"تیری دەستی ڕاست",rArr:"دووتیری دەستی ڕاست",hArr:"دوو تیری ڕاست و چەپ",diams:"ڕەشی پاقڵاوەیی",asymp:"نیشانەی یەکسانە"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/lt.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/lt.js new file mode 100644 index 0000000..f575dfd --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/lt.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","lt",{euro:"Euro ženklas",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cento ženklas",pound:"Svaro ženklas",curren:"Valiutos ženklas",yen:"Jenos ženklas",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Ne ženklas",reg:"Registered sign",macr:"Makronas",deg:"Laipsnio ženklas",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Mikro ženklas",para:"Pilcrow sign",middot:"Vidurinis taškas",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/lv.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/lv.js new file mode 100644 index 0000000..7ea58a0 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/lv.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","lv",{euro:"Euro zīme",lsquo:"Kreisā vienkārtīga pēdiņa",rsquo:"Labā vienkārtīga pēdiņa",ldquo:"Kreisā dubult pēdiņa",rdquo:"Labā dubult pēdiņa",ndash:"En svītra",mdash:"Em svītra",iexcl:"Apgriezta izsaukuma zīme",cent:"Centu naudas zīme",pound:"Sterliņu mārciņu naudas zīme",curren:"Valūtas zīme",yen:"Jenu naudas zīme",brvbar:"Vertikāla pārrauta līnija",sect:"Paragrāfa zīme",uml:"Diakritiska zīme",copy:"Autortiesību zīme",ordf:"Sievišķas kārtas rādītājs", +laquo:"Kreisā dubult stūra pēdiņu zīme",not:"Neparakstīts",reg:"Reģistrēta zīme",macr:"Garumzīme",deg:"Grādu zīme",sup2:"Augšraksts divi",sup3:"Augšraksts trīs",acute:"Akūta uzsvara zīme",micro:"Mikro zīme",para:"Rindkopas zīme ",middot:"Vidējs punkts",cedil:"Āķītis zem burta",sup1:"Augšraksts viens",ordm:"Vīrišķīgas kārtas rādītājs",raquo:"Labā dubult stūra pēdiņu zīme",frac14:"Vulgāra frakcija 1/4",frac12:"Vulgāra frakcija 1/2",frac34:"Vulgāra frakcija 3/4",iquest:"Apgriezta jautājuma zīme",Agrave:"Lielais latīņu burts A ar uzsvara zīmi", +Aacute:"Lielais latīņu burts A ar akūtu uzsvara zīmi",Acirc:"Lielais latīņu burts A ar diakritisku zīmi",Atilde:"Lielais latīņu burts A ar tildi ",Auml:"Lielais latīņu burts A ar diakritisko zīmi",Aring:"Lielais latīņu burts A ar aplīti augšā",AElig:"Lielais latīņu burts Æ",Ccedil:"Lielais latīņu burts C ar āķīti zem burta",Egrave:"Lielais latīņu burts E ar apostrofu",Eacute:"Lielais latīņu burts E ar akūtu uzsvara zīmi",Ecirc:"Lielais latīņu burts E ar diakritisko zīmi",Euml:"Lielais latīņu burts E ar diakritisko zīmi", +Igrave:"Lielais latīņu burts I ar uzsvaras zīmi",Iacute:"Lielais latīņu burts I ar akūtu uzsvara zīmi",Icirc:"Lielais latīņu burts I ar diakritisko zīmi",Iuml:"Lielais latīņu burts I ar diakritisko zīmi",ETH:"Lielais latīņu burts Eth",Ntilde:"Lielais latīņu burts N ar tildi",Ograve:"Lielais latīņu burts O ar uzsvara zīmi",Oacute:"Lielais latīņu burts O ar akūto uzsvara zīmi",Ocirc:"Lielais latīņu burts O ar diakritisko zīmi",Otilde:"Lielais latīņu burts O ar tildi",Ouml:"Lielais latīņu burts O ar diakritisko zīmi", +times:"Reizināšanas zīme ",Oslash:"Lielais latīņu burts O ar iesvītrojumu",Ugrave:"Lielais latīņu burts U ar uzsvaras zīmi",Uacute:"Lielais latīņu burts U ar akūto uzsvars zīmi",Ucirc:"Lielais latīņu burts U ar diakritisko zīmi",Uuml:"Lielais latīņu burts U ar diakritisko zīmi",Yacute:"Lielais latīņu burts Y ar akūto uzsvaras zīmi",THORN:"Lielais latīņu burts torn",szlig:"Mazs latīņu burts ar ligatūru",agrave:"Mazs latīņu burts a ar uzsvara zīmi",aacute:"Mazs latīņu burts a ar akūto uzsvara zīmi", +acirc:"Mazs latīņu burts a ar diakritisko zīmi",atilde:"Mazs latīņu burts a ar tildi",auml:"Mazs latīņu burts a ar diakritisko zīmi",aring:"Mazs latīņu burts a ar aplīti augšā",aelig:"Mazs latīņu burts æ",ccedil:"Mazs latīņu burts c ar āķīti zem burta",egrave:"Mazs latīņu burts e ar uzsvara zīmi ",eacute:"Mazs latīņu burts e ar akūtu uzsvara zīmi",ecirc:"Mazs latīņu burts e ar diakritisko zīmi",euml:"Mazs latīņu burts e ar diakritisko zīmi",igrave:"Mazs latīņu burts i ar uzsvara zīmi ",iacute:"Mazs latīņu burts i ar akūtu uzsvara zīmi", +icirc:"Mazs latīņu burts i ar diakritisko zīmi",iuml:"Mazs latīņu burts i ar diakritisko zīmi",eth:"Mazs latīņu burts eth",ntilde:"Mazs latīņu burts n ar tildi",ograve:"Mazs latīņu burts o ar uzsvara zīmi ",oacute:"Mazs latīņu burts o ar akūtu uzsvara zīmi",ocirc:"Mazs latīņu burts o ar diakritisko zīmi",otilde:"Mazs latīņu burts o ar tildi",ouml:"Mazs latīņu burts o ar diakritisko zīmi",divide:"Dalīšanas zīme",oslash:"Mazs latīņu burts o ar iesvītrojumu",ugrave:"Mazs latīņu burts u ar uzsvara zīmi ", +uacute:"Mazs latīņu burts u ar akūtu uzsvara zīmi",ucirc:"Mazs latīņu burts u ar diakritisko zīmi",uuml:"Mazs latīņu burts u ar diakritisko zīmi",yacute:"Mazs latīņu burts y ar akūtu uzsvaras zīmi",thorn:"Mazs latīņu burts torns",yuml:"Mazs latīņu burts y ar diakritisko zīmi",OElig:"Liela latīņu ligatūra OE",oelig:"Maza latīņu ligatūra oe",372:"Liels latīņu burts W ar diakritisko zīmi ",374:"Liels latīņu burts Y ar diakritisko zīmi ",373:"Mazs latīņu burts w ar diakritisko zīmi ",375:"Mazs latīņu burts y ar diakritisko zīmi ", +sbquo:"Mazas-9 vienkārtīgas pēdiņas",8219:"Lielas-9 vienkārtīgas apgrieztas pēdiņas",bdquo:"Mazas-9 dubultas pēdiņas",hellip:"Horizontāli daudzpunkti",trade:"Preču zīmes zīme",9658:"Melns pa labi pagriezts radītājs",bull:"Lode",rarr:"Bulta pa labi",rArr:"Dubulta Bulta pa labi",hArr:"Bulta pa kreisi",diams:"Dubulta Bulta pa kreisi",asymp:"Gandrīz vienāds ar"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/nb.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/nb.js new file mode 100644 index 0000000..f9fd879 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/nb.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","nb",{euro:"Eurosymbol",lsquo:"Venstre enkelt anførselstegn",rsquo:"Høyre enkelt anførselstegn",ldquo:"Venstre dobbelt anførselstegn",rdquo:"Høyre anførsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"Tøddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anførselstegn",not:"Negasjonstegn", +reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"Høyre anførselstegn",frac14:"Fjerdedelsbrøk",frac12:"Halvbrøk",frac34:"Tre fjerdedelers brøk",iquest:"Omvendt spørsmålstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde", +Auml:"Stor A med tøddel",Aring:"Stor Å",AElig:"Stor Æ",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med tøddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med tøddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med tøddel", +times:"Multiplikasjonstegn",Oslash:"Stor Ø",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med tøddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med tøddel",aring:"Liten å",aelig:"Liten æ",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent", +ecirc:"Liten e med cirkumfleks",euml:"Liten e med tøddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med tøddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med tøddel",divide:"Divisjonstegn",oslash:"Liten ø",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks", +uuml:"Liten u med tøddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med tøddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anførselstegn",8219:"Enkelt høyt reversert 9-anførselstegn",bdquo:"Dobbelt lavt 9-anførselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart høyrevendt peker",bull:"Tykk interpunkt",rarr:"Høyrevendt pil", +rArr:"Dobbel høyrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/nl.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/nl.js new file mode 100644 index 0000000..ba75bf3 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/nl.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","nl",{euro:"Euro-teken",lsquo:"Linker enkel aanhalingsteken",rsquo:"Rechter enkel aanhalingsteken",ldquo:"Linker dubbel aanhalingsteken",rdquo:"Rechter dubbel aanhalingsteken",ndash:"En dash",mdash:"Em dash",iexcl:"Omgekeerd uitroepteken",cent:"Cent-teken",pound:"Pond-teken",curren:"Valuta-teken",yen:"Yen-teken",brvbar:"Gebroken streep",sect:"Paragraaf-teken",uml:"Trema",copy:"Copyright-teken",ordf:"Vrouwelijk ordinaal",laquo:"Linker guillemet",not:"Ongelijk-teken", +reg:"Geregistreerd handelsmerk-teken",macr:"Macron",deg:"Graden-teken",sup2:"Superscript twee",sup3:"Superscript drie",acute:"Accent aigu",micro:"Micro-teken",para:"Alinea-teken",middot:"Halfhoge punt",cedil:"Cedille",sup1:"Superscript een",ordm:"Mannelijk ordinaal",raquo:"Rechter guillemet",frac14:"Breuk kwart",frac12:"Breuk half",frac34:"Breuk driekwart",iquest:"Omgekeerd vraagteken",Agrave:"Latijnse hoofdletter A met een accent grave",Aacute:"Latijnse hoofdletter A met een accent aigu",Acirc:"Latijnse hoofdletter A met een circonflexe", +Atilde:"Latijnse hoofdletter A met een tilde",Auml:"Latijnse hoofdletter A met een trema",Aring:"Latijnse hoofdletter A met een corona",AElig:"Latijnse hoofdletter Æ",Ccedil:"Latijnse hoofdletter C met een cedille",Egrave:"Latijnse hoofdletter E met een accent grave",Eacute:"Latijnse hoofdletter E met een accent aigu",Ecirc:"Latijnse hoofdletter E met een circonflexe",Euml:"Latijnse hoofdletter E met een trema",Igrave:"Latijnse hoofdletter I met een accent grave",Iacute:"Latijnse hoofdletter I met een accent aigu", +Icirc:"Latijnse hoofdletter I met een circonflexe",Iuml:"Latijnse hoofdletter I met een trema",ETH:"Latijnse hoofdletter Eth",Ntilde:"Latijnse hoofdletter N met een tilde",Ograve:"Latijnse hoofdletter O met een accent grave",Oacute:"Latijnse hoofdletter O met een accent aigu",Ocirc:"Latijnse hoofdletter O met een circonflexe",Otilde:"Latijnse hoofdletter O met een tilde",Ouml:"Latijnse hoofdletter O met een trema",times:"Maal-teken",Oslash:"Latijnse hoofdletter O met een schuine streep",Ugrave:"Latijnse hoofdletter U met een accent grave", +Uacute:"Latijnse hoofdletter U met een accent aigu",Ucirc:"Latijnse hoofdletter U met een circonflexe",Uuml:"Latijnse hoofdletter U met een trema",Yacute:"Latijnse hoofdletter Y met een accent aigu",THORN:"Latijnse hoofdletter Thorn",szlig:"Latijnse kleine ringel-s",agrave:"Latijnse kleine letter a met een accent grave",aacute:"Latijnse kleine letter a met een accent aigu",acirc:"Latijnse kleine letter a met een circonflexe",atilde:"Latijnse kleine letter a met een tilde",auml:"Latijnse kleine letter a met een trema", +aring:"Latijnse kleine letter a met een corona",aelig:"Latijnse kleine letter æ",ccedil:"Latijnse kleine letter c met een cedille",egrave:"Latijnse kleine letter e met een accent grave",eacute:"Latijnse kleine letter e met een accent aigu",ecirc:"Latijnse kleine letter e met een circonflexe",euml:"Latijnse kleine letter e met een trema",igrave:"Latijnse kleine letter i met een accent grave",iacute:"Latijnse kleine letter i met een accent aigu",icirc:"Latijnse kleine letter i met een circonflexe", +iuml:"Latijnse kleine letter i met een trema",eth:"Latijnse kleine letter eth",ntilde:"Latijnse kleine letter n met een tilde",ograve:"Latijnse kleine letter o met een accent grave",oacute:"Latijnse kleine letter o met een accent aigu",ocirc:"Latijnse kleine letter o met een circonflexe",otilde:"Latijnse kleine letter o met een tilde",ouml:"Latijnse kleine letter o met een trema",divide:"Deel-teken",oslash:"Latijnse kleine letter o met een schuine streep",ugrave:"Latijnse kleine letter u met een accent grave", +uacute:"Latijnse kleine letter u met een accent aigu",ucirc:"Latijnse kleine letter u met een circonflexe",uuml:"Latijnse kleine letter u met een trema",yacute:"Latijnse kleine letter y met een accent aigu",thorn:"Latijnse kleine letter thorn",yuml:"Latijnse kleine letter y met een trema",OElig:"Latijnse hoofdletter Œ",oelig:"Latijnse kleine letter œ",372:"Latijnse hoofdletter W met een circonflexe",374:"Latijnse hoofdletter Y met een circonflexe",373:"Latijnse kleine letter w met een circonflexe", +375:"Latijnse kleine letter y met een circonflexe",sbquo:"Lage enkele aanhalingsteken",8219:"Hoge omgekeerde enkele aanhalingsteken",bdquo:"Lage dubbele aanhalingsteken",hellip:"Beletselteken",trade:"Trademark-teken",9658:"Zwarte driehoek naar rechts",bull:"Bullet",rarr:"Pijl naar rechts",rArr:"Dubbele pijl naar rechts",hArr:"Dubbele pijl naar links",diams:"Zwart ruitje",asymp:"Benaderingsteken"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/no.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/no.js new file mode 100644 index 0000000..404b4fd --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/no.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","no",{euro:"Eurosymbol",lsquo:"Venstre enkelt anførselstegn",rsquo:"Høyre enkelt anførselstegn",ldquo:"Venstre dobbelt anførselstegn",rdquo:"Høyre anførsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"Tøddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anførselstegn",not:"Negasjonstegn", +reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"Høyre anførselstegn",frac14:"Fjerdedelsbrøk",frac12:"Halvbrøk",frac34:"Tre fjerdedelers brøk",iquest:"Omvendt spørsmålstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde", +Auml:"Stor A med tøddel",Aring:"Stor Å",AElig:"Stor Æ",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med tøddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med tøddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med tøddel", +times:"Multiplikasjonstegn",Oslash:"Stor Ø",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med tøddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med tøddel",aring:"Liten å",aelig:"Liten æ",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent", +ecirc:"Liten e med cirkumfleks",euml:"Liten e med tøddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med tøddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med tøddel",divide:"Divisjonstegn",oslash:"Liten ø",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks", +uuml:"Liten u med tøddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med tøddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anførselstegn",8219:"Enkelt høyt reversert 9-anførselstegn",bdquo:"Dobbelt lavt 9-anførselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart høyrevendt peker",bull:"Tykk interpunkt",rarr:"Høyrevendt pil", +rArr:"Dobbel høyrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/pl.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/pl.js new file mode 100644 index 0000000..76e2acd --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/pl.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","pl",{euro:"Znak euro",lsquo:"Cudzysłów pojedynczy otwierający",rsquo:"Cudzysłów pojedynczy zamykający",ldquo:"Cudzysłów apostrofowy otwierający",rdquo:"Cudzysłów apostrofowy zamykający",ndash:"Półpauza",mdash:"Pauza",iexcl:"Odwrócony wykrzyknik",cent:"Znak centa",pound:"Znak funta",curren:"Znak waluty",yen:"Znak jena",brvbar:"Przerwana pionowa kreska",sect:"Paragraf",uml:"Diereza",copy:"Znak praw autorskich",ordf:"Wskaźnik rodzaju żeńskiego liczebnika porządkowego", +laquo:"Lewy cudzysłów ostrokątny",not:"Znak negacji",reg:"Zastrzeżony znak towarowy",macr:"Makron",deg:"Znak stopnia",sup2:"Druga potęga",sup3:"Trzecia potęga",acute:"Akcent ostry",micro:"Znak mikro",para:"Znak akapitu",middot:"Kropka środkowa",cedil:"Cedylla",sup1:"Pierwsza potęga",ordm:"Wskaźnik rodzaju męskiego liczebnika porządkowego",raquo:"Prawy cudzysłów ostrokątny",frac14:"Ułamek zwykły jedna czwarta",frac12:"Ułamek zwykły jedna druga",frac34:"Ułamek zwykły trzy czwarte",iquest:"Odwrócony znak zapytania", +Agrave:"Wielka litera A z akcentem ciężkim",Aacute:"Wielka litera A z akcentem ostrym",Acirc:"Wielka litera A z akcentem przeciągłym",Atilde:"Wielka litera A z tyldą",Auml:"Wielka litera A z dierezą",Aring:"Wielka litera A z kółkiem",AElig:"Wielka ligatura Æ",Ccedil:"Wielka litera C z cedyllą",Egrave:"Wielka litera E z akcentem ciężkim",Eacute:"Wielka litera E z akcentem ostrym",Ecirc:"Wielka litera E z akcentem przeciągłym",Euml:"Wielka litera E z dierezą",Igrave:"Wielka litera I z akcentem ciężkim", +Iacute:"Wielka litera I z akcentem ostrym",Icirc:"Wielka litera I z akcentem przeciągłym",Iuml:"Wielka litera I z dierezą",ETH:"Wielka litera Eth",Ntilde:"Wielka litera N z tyldą",Ograve:"Wielka litera O z akcentem ciężkim",Oacute:"Wielka litera O z akcentem ostrym",Ocirc:"Wielka litera O z akcentem przeciągłym",Otilde:"Wielka litera O z tyldą",Ouml:"Wielka litera O z dierezą",times:"Znak mnożenia wektorowego",Oslash:"Wielka litera O z przekreśleniem",Ugrave:"Wielka litera U z akcentem ciężkim",Uacute:"Wielka litera U z akcentem ostrym", +Ucirc:"Wielka litera U z akcentem przeciągłym",Uuml:"Wielka litera U z dierezą",Yacute:"Wielka litera Y z akcentem ostrym",THORN:"Wielka litera Thorn",szlig:"Mała litera ostre s (eszet)",agrave:"Mała litera a z akcentem ciężkim",aacute:"Mała litera a z akcentem ostrym",acirc:"Mała litera a z akcentem przeciągłym",atilde:"Mała litera a z tyldą",auml:"Mała litera a z dierezą",aring:"Mała litera a z kółkiem",aelig:"Mała ligatura æ",ccedil:"Mała litera c z cedyllą",egrave:"Mała litera e z akcentem ciężkim", +eacute:"Mała litera e z akcentem ostrym",ecirc:"Mała litera e z akcentem przeciągłym",euml:"Mała litera e z dierezą",igrave:"Mała litera i z akcentem ciężkim",iacute:"Mała litera i z akcentem ostrym",icirc:"Mała litera i z akcentem przeciągłym",iuml:"Mała litera i z dierezą",eth:"Mała litera eth",ntilde:"Mała litera n z tyldą",ograve:"Mała litera o z akcentem ciężkim",oacute:"Mała litera o z akcentem ostrym",ocirc:"Mała litera o z akcentem przeciągłym",otilde:"Mała litera o z tyldą",ouml:"Mała litera o z dierezą", +divide:"Anglosaski znak dzielenia",oslash:"Mała litera o z przekreśleniem",ugrave:"Mała litera u z akcentem ciężkim",uacute:"Mała litera u z akcentem ostrym",ucirc:"Mała litera u z akcentem przeciągłym",uuml:"Mała litera u z dierezą",yacute:"Mała litera y z akcentem ostrym",thorn:"Mała litera thorn",yuml:"Mała litera y z dierezą",OElig:"Wielka ligatura OE",oelig:"Mała ligatura oe",372:"Wielka litera W z akcentem przeciągłym",374:"Wielka litera Y z akcentem przeciągłym",373:"Mała litera w z akcentem przeciągłym", +375:"Mała litera y z akcentem przeciągłym",sbquo:"Pojedynczy apostrof dolny",8219:"Pojedynczy apostrof górny",bdquo:"Podwójny apostrof dolny",hellip:"Wielokropek",trade:"Znak towarowy",9658:"Czarny wskaźnik wskazujący w prawo",bull:"Punktor",rarr:"Strzałka w prawo",rArr:"Podwójna strzałka w prawo",hArr:"Podwójna strzałka w lewo",diams:"Czarny znak karo",asymp:"Znak prawie równe"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js new file mode 100644 index 0000000..41f8c33 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","pt-br",{euro:"Euro",lsquo:"Aspas simples esquerda",rsquo:"Aspas simples direita",ldquo:"Aspas duplas esquerda",rdquo:"Aspas duplas direita",ndash:"Traço",mdash:"Travessão",iexcl:"Ponto de exclamação invertido",cent:"Cent",pound:"Cerquilha",curren:"Dinheiro",yen:"Yen",brvbar:"Bara interrompida",sect:"Símbolo de Parágrafo",uml:"Trema",copy:"Direito de Cópia",ordf:"Indicador ordinal feminino",laquo:"Aspas duplas angulares esquerda",not:"Negação",reg:"Marca Registrada", +macr:"Mácron",deg:"Grau",sup2:"2 Superscrito",sup3:"3 Superscrito",acute:"Acento agudo",micro:"Micro",para:"Pé de mosca",middot:"Ponto mediano",cedil:"Cedilha",sup1:"1 Superscrito",ordm:"Indicador ordinal masculino",raquo:"Aspas duplas angulares direita",frac14:"Um quarto",frac12:"Um meio",frac34:"Três quartos",iquest:"Interrogação invertida",Agrave:"A maiúsculo com acento grave",Aacute:"A maiúsculo com acento agudo",Acirc:"A maiúsculo com acento circunflexo",Atilde:"A maiúsculo com til",Auml:"A maiúsculo com trema", +Aring:"A maiúsculo com anel acima",AElig:"Æ maiúsculo",Ccedil:"Ç maiúlculo",Egrave:"E maiúsculo com acento grave",Eacute:"E maiúsculo com acento agudo",Ecirc:"E maiúsculo com acento circumflexo",Euml:"E maiúsculo com trema",Igrave:"I maiúsculo com acento grave",Iacute:"I maiúsculo com acento agudo",Icirc:"I maiúsculo com acento circunflexo",Iuml:"I maiúsculo com crase",ETH:"Eth maiúsculo",Ntilde:"N maiúsculo com til",Ograve:"O maiúsculo com acento grave",Oacute:"O maiúsculo com acento agudo",Ocirc:"O maiúsculo com acento circunflexo", +Otilde:"O maiúsculo com til",Ouml:"O maiúsculo com trema",times:"Multiplicação",Oslash:"Diâmetro",Ugrave:"U maiúsculo com acento grave",Uacute:"U maiúsculo com acento agudo",Ucirc:"U maiúsculo com acento circunflexo",Uuml:"U maiúsculo com trema",Yacute:"Y maiúsculo com acento agudo",THORN:"Thorn maiúsculo",szlig:"Eszett minúsculo",agrave:"a minúsculo com acento grave",aacute:"a minúsculo com acento agudo",acirc:"a minúsculo com acento circunflexo",atilde:"a minúsculo com til",auml:"a minúsculo com trema", +aring:"a minúsculo com anel acima",aelig:"æ minúsculo",ccedil:"ç minúsculo",egrave:"e minúsculo com acento grave",eacute:"e minúsculo com acento agudo",ecirc:"e minúsculo com acento circunflexo",euml:"e minúsculo com trema",igrave:"i minúsculo com acento grave",iacute:"i minúsculo com acento agudo",icirc:"i minúsculo com acento circunflexo",iuml:"i minúsculo com trema",eth:"eth minúsculo",ntilde:"n minúsculo com til",ograve:"o minúsculo com acento grave",oacute:"o minúsculo com acento agudo",ocirc:"o minúsculo com acento circunflexo", +otilde:"o minúsculo com til",ouml:"o minúsculo com trema",divide:"Divisão",oslash:"o minúsculo com cortado ou diâmetro",ugrave:"u minúsculo com acento grave",uacute:"u minúsculo com acento agudo",ucirc:"u minúsculo com acento circunflexo",uuml:"u minúsculo com trema",yacute:"y minúsculo com acento agudo",thorn:"thorn minúsculo",yuml:"y minúsculo com trema",OElig:"Ligação tipográfica OE maiúscula",oelig:"Ligação tipográfica oe minúscula",372:"W maiúsculo com acento circunflexo",374:"Y maiúsculo com acento circunflexo", +373:"w minúsculo com acento circunflexo",375:"y minúsculo com acento circunflexo",sbquo:"Aspas simples inferior direita",8219:"Aspas simples superior esquerda",bdquo:"Aspas duplas inferior direita",hellip:"Reticências",trade:"Trade mark",9658:"Ponta de seta preta para direita",bull:"Ponto lista",rarr:"Seta para direita",rArr:"Seta dupla para direita",hArr:"Seta dupla direita e esquerda",diams:"Ouros",asymp:"Aproximadamente"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/pt.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/pt.js new file mode 100644 index 0000000..9c73f0c --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/pt.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","pt",{euro:"Símbolo do Euro",lsquo:"Aspa esquerda simples",rsquo:"Aspa direita simples",ldquo:"Aspa esquerda dupla",rdquo:"Aspa direita dupla",ndash:"Travessão Simples",mdash:"Travessão Longo",iexcl:"Ponto de exclamação invertido",cent:"Símbolo do Cêntimo",pound:"Símbolo da Libra",curren:"Símbolo de Moeda",yen:"Símbolo do Iene",brvbar:"Barra quebrada",sect:"Símbolo de Secção",uml:"Trema",copy:"Símbolo dos Direitos de Autor",ordf:"Indicador ordinal feminino", +laquo:"Aspa esquerda ângulo duplo",not:"Não Símbolo",reg:"Símbolo de Registado",macr:"Mácron",deg:"Símbolo de Grau",sup2:"Expoente 2",sup3:"Expoente 3",acute:"Acento agudo",micro:"Símbolo de Micro",para:"Símbolo de Parágrafo",middot:"Ponto do Meio",cedil:"Cedilha",sup1:"Expoente 1",ordm:"Indicador ordinal masculino",raquo:"Aspas ângulo duplo pra Direita",frac14:"Fração vulgar 1/4",frac12:"Fração vulgar 1/2",frac34:"Fração vulgar 3/4",iquest:"Ponto de interrogação invertido",Agrave:"Letra maiúscula latina A com acento grave", +Aacute:"Letra maiúscula latina A com acento agudo",Acirc:"Letra maiúscula latina A com circunflexo",Atilde:"Letra maiúscula latina A com til",Auml:"Letra maiúscula latina A com trema",Aring:"Letra maiúscula latina A com sinal diacrítico",AElig:"Letra maiúscula latina Æ",Ccedil:"Letra maiúscula latina C com cedilha",Egrave:"Letra maiúscula latina E com acento grave",Eacute:"Letra maiúscula latina E com acento agudo",Ecirc:"Letra maiúscula latina E com circunflexo",Euml:"Letra maiúscula latina E com trema", +Igrave:"Letra maiúscula latina I com acento grave",Iacute:"Letra maiúscula latina I com acento agudo",Icirc:"Letra maiúscula latina I com cincunflexo",Iuml:"Letra maiúscula latina I com trema",ETH:"Letra maiúscula latina Eth (Ðð)",Ntilde:"Letra maiúscula latina N com til",Ograve:"Letra maiúscula latina O com acento grave",Oacute:"Letra maiúscula latina O com acento agudo",Ocirc:"Letra maiúscula latina I com circunflexo",Otilde:"Letra maiúscula latina O com til",Ouml:"Letra maiúscula latina O com trema", +times:"Símbolo de multiplicação",Oslash:"Letra maiúscula O com barra",Ugrave:"Letra maiúscula latina U com acento grave",Uacute:"Letra maiúscula latina U com acento agudo",Ucirc:"Letra maiúscula latina U com circunflexo",Uuml:"Letra maiúscula latina E com trema",Yacute:"Letra maiúscula latina Y com acento agudo",THORN:"Letra maiúscula latina Rúnico",szlig:"Letra minúscula latina s forte",agrave:"Letra minúscula latina a com acento grave",aacute:"Letra minúscula latina a com acento agudo",acirc:"Letra minúscula latina a com circunflexo", +atilde:"Letra minúscula latina a com til",auml:"Letra minúscula latina a com trema",aring:"Letra minúscula latina a com sinal diacrítico",aelig:"Letra minúscula latina æ",ccedil:"Letra minúscula latina c com cedilha",egrave:"Letra minúscula latina e com acento grave",eacute:"Letra minúscula latina e com acento agudo",ecirc:"Letra minúscula latina e com circunflexo",euml:"Letra minúscula latina e com trema",igrave:"Letra minúscula latina i com acento grave",iacute:"Letra minúscula latina i com acento agudo", +icirc:"Letra minúscula latina i com circunflexo",iuml:"Letra pequena latina i com trema",eth:"Letra minúscula latina eth",ntilde:"Letra minúscula latina n com til",ograve:"Letra minúscula latina o com acento grave",oacute:"Letra minúscula latina o com acento agudo",ocirc:"Letra minúscula latina o com circunflexo",otilde:"Letra minúscula latina o com til",ouml:"Letra minúscula latina o com trema",divide:"Símbolo de divisão",oslash:"Letra minúscula latina o com barra",ugrave:"Letra minúscula latina u com acento grave", +uacute:"Letra minúscula latina u com acento agudo",ucirc:"Letra minúscula latina u com circunflexo",uuml:"Letra minúscula latina u com trema",yacute:"Letra minúscula latina y com acento agudo",thorn:"Letra minúscula latina Rúnico",yuml:"Letra minúscula latina y com trema",OElig:"Ligadura maiúscula latina OE",oelig:"Ligadura minúscula latina oe",372:"Letra maiúscula latina W com circunflexo",374:"Letra maiúscula latina Y com circunflexo",373:"Letra minúscula latina w com circunflexo",375:"Letra minúscula latina y com circunflexo", +sbquo:"Aspa Simples inferior-9",8219:"Aspa Simples superior invertida-9",bdquo:"Aspa duplas inferior-9",hellip:"Elipse Horizontal ",trade:"Símbolo de Marca Registada",9658:"Ponteiro preto direito",bull:"Marca",rarr:"Seta para a direita",rArr:"Seta dupla para a direita",hArr:"Seta dupla direita esquerda",diams:"Naipe diamante preto",asymp:"Quase igual a "}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ru.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ru.js new file mode 100644 index 0000000..30633fd --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ru.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ru",{euro:"Знак евро",lsquo:"Левая одинарная кавычка",rsquo:"Правая одинарная кавычка",ldquo:"Левая двойная кавычка",rdquo:"Левая двойная кавычка",ndash:"Среднее тире",mdash:"Длинное тире",iexcl:"перевёрнутый восклицательный знак",cent:"Цент",pound:"Фунт",curren:"Знак валюты",yen:"Йена",brvbar:"Вертикальная черта с разрывом",sect:"Знак параграфа",uml:"Умлаут",copy:"Знак охраны авторского права",ordf:"Указатель окончания женского рода ...ая",laquo:"Левая кавычка-«ёлочка»", +not:"Отрицание",reg:"Знак охраны смежных прав\\t",macr:"Макрон",deg:"Градус",sup2:"Надстрочное два",sup3:"Надстрочное три",acute:"Акут",micro:"Микро",para:"Абзац",middot:"Интерпункт",cedil:"Седиль",sup1:"Надстрочная единица",ordm:"Порядковое числительное",raquo:"Правая кавычка-«ёлочка»",frac14:"Одна четвертая",frac12:"Одна вторая",frac34:"Три четвёртых",iquest:"Перевёрнутый вопросительный знак",Agrave:"Латинская заглавная буква А с апострофом",Aacute:"Латинская заглавная буква A с ударением",Acirc:"Латинская заглавная буква А с циркумфлексом", +Atilde:"Латинская заглавная буква А с тильдой",Auml:"Латинская заглавная буква А с тремой",Aring:"Латинская заглавная буква А с кольцом над ней",AElig:"Латинская большая буква Æ",Ccedil:"Латинская заглавная буква C с седилью",Egrave:"Латинская заглавная буква Е с апострофом",Eacute:"Латинская заглавная буква Е с ударением",Ecirc:"Латинская заглавная буква Е с циркумфлексом",Euml:"Латинская заглавная буква Е с тремой",Igrave:"Латинская заглавная буква I с апострофом",Iacute:"Латинская заглавная буква I с ударением", +Icirc:"Латинская заглавная буква I с циркумфлексом",Iuml:"Латинская заглавная буква I с тремой",ETH:"Латинская большая буква Eth",Ntilde:"Латинская заглавная буква N с тильдой",Ograve:"Латинская заглавная буква O с апострофом",Oacute:"Латинская заглавная буква O с ударением",Ocirc:"Латинская заглавная буква O с циркумфлексом",Otilde:"Латинская заглавная буква O с тильдой",Ouml:"Латинская заглавная буква O с тремой",times:"Знак умножения",Oslash:"Латинская большая перечеркнутая O",Ugrave:"Латинская заглавная буква U с апострофом", +Uacute:"Латинская заглавная буква U с ударением",Ucirc:"Латинская заглавная буква U с циркумфлексом",Uuml:"Латинская заглавная буква U с тремой",Yacute:"Латинская заглавная буква Y с ударением",THORN:"Латинская заглавная буква Thorn",szlig:"Знак диеза",agrave:"Латинская маленькая буква a с апострофом",aacute:"Латинская маленькая буква a с ударением",acirc:"Латинская маленькая буква a с циркумфлексом",atilde:"Латинская маленькая буква a с тильдой",auml:"Латинская маленькая буква a с тремой",aring:"Латинская маленькая буква a с кольцом", +aelig:"Латинская маленькая буква æ",ccedil:"Латинская маленькая буква с с седилью",egrave:"Латинская маленькая буква е с апострофом",eacute:"Латинская маленькая буква е с ударением",ecirc:"Латинская маленькая буква е с циркумфлексом",euml:"Латинская маленькая буква е с тремой",igrave:"Латинская маленькая буква i с апострофом",iacute:"Латинская маленькая буква i с ударением",icirc:"Латинская маленькая буква i с циркумфлексом",iuml:"Латинская маленькая буква i с тремой",eth:"Латинская маленькая буква eth", +ntilde:"Латинская маленькая буква n с тильдой",ograve:"Латинская маленькая буква o с апострофом",oacute:"Латинская маленькая буква o с ударением",ocirc:"Латинская маленькая буква o с циркумфлексом",otilde:"Латинская маленькая буква o с тильдой",ouml:"Латинская маленькая буква o с тремой",divide:"Знак деления",oslash:"Латинская строчная перечеркнутая o",ugrave:"Латинская маленькая буква u с апострофом",uacute:"Латинская маленькая буква u с ударением",ucirc:"Латинская маленькая буква u с циркумфлексом", +uuml:"Латинская маленькая буква u с тремой",yacute:"Латинская маленькая буква y с ударением",thorn:"Латинская маленькая буква thorn",yuml:"Латинская маленькая буква y с тремой",OElig:"Латинская прописная лигатура OE",oelig:"Латинская строчная лигатура oe",372:"Латинская заглавная буква W с циркумфлексом",374:"Латинская заглавная буква Y с циркумфлексом",373:"Латинская маленькая буква w с циркумфлексом",375:"Латинская маленькая буква y с циркумфлексом",sbquo:"Нижняя одинарная кавычка",8219:"Правая одинарная кавычка", +bdquo:"Левая двойная кавычка",hellip:"Горизонтальное многоточие",trade:"Товарный знак",9658:"Черный указатель вправо",bull:"Маркер списка",rarr:"Стрелка вправо",rArr:"Двойная стрелка вправо",hArr:"Двойная стрелка влево-вправо",diams:"Черный ромб",asymp:"Примерно равно"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/si.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/si.js new file mode 100644 index 0000000..12789fb --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/si.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","si",{euro:"යුරෝ සලකුණ",lsquo:"වමේ තනි උපුටා දක්වීම ",rsquo:"දකුණේ තනි උපුටා දක්වීම ",ldquo:"වමේ දිත්ව උපුටා දක්වීම ",rdquo:"දකුණේ දිත්ව උපුටා දක්වීම ",ndash:"En dash",mdash:"Em dash",iexcl:"යටිකුරු හර්ෂදී ",cent:"Cent sign",pound:"Pound sign",curren:"මුල්‍යමය ",yen:"යෙන් ",brvbar:"Broken bar",sect:"තෙරේම් ",uml:"Diaeresis",copy:"පිටපත් අයිතිය ",ordf:"දර්ශකය",laquo:"Left-pointing double angle quotation mark",not:"සලකුණක් නොවේ",reg:"සලකුණක් ලියාපදිංචි කිරීම", +macr:"මුද්‍රිත ",deg:"සලකුණේ ",sup2:"උඩු ලකුණු දෙක",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent", +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent", +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent", +Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above", +aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde", +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent", +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer", +bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/sk.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/sk.js new file mode 100644 index 0000000..6e5b534 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/sk.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sk",{euro:"Znak eura",lsquo:"Ľavá jednoduchá úvodzovka",rsquo:"Pravá jednoduchá úvodzovka",ldquo:"Pravá dvojitá úvodzovka",rdquo:"Pravá dvojitá úvodzovka",ndash:"En pomlčka",mdash:"Em pomlčka",iexcl:"Obrátený výkričník",cent:"Znak centu",pound:"Znak libry",curren:"Znak meny",yen:"Znak jenu",brvbar:"Prerušená zvislá čiara",sect:"Znak odseku",uml:"Prehláska",copy:"Znak copyrightu",ordf:"Ženský indikátor rodu",laquo:"Znak dvojitých lomených úvodzoviek vľavo",not:"Logistický zápor", +reg:"Znak registrácie",macr:"Pomlčka nad",deg:"Znak stupňa",sup2:"Dvojka ako horný index",sup3:"Trojka ako horný index",acute:"Dĺžeň",micro:"Znak mikro",para:"Znak odstavca",middot:"Bodka uprostred",cedil:"Chvost vľavo",sup1:"Jednotka ako horný index",ordm:"Mužský indikátor rodu",raquo:"Znak dvojitých lomených úvodzoviek vpravo",frac14:"Obyčajný zlomok jedna štvrtina",frac12:"Obyčajný zlomok jedna polovica",frac34:"Obyčajný zlomok tri štvrtiny",iquest:"Otočený otáznik",Agrave:"Veľké písmeno latinky A s accentom", +Aacute:"Veľké písmeno latinky A s dĺžňom",Acirc:"Veľké písmeno latinky A s mäkčeňom",Atilde:"Veľké písmeno latinky A s tildou",Auml:"Veľké písmeno latinky A s dvoma bodkami",Aring:"Veľké písmeno latinky A s krúžkom nad",AElig:"Veľké písmeno latinky Æ",Ccedil:"Veľké písmeno latinky C s chvostom vľavo",Egrave:"Veľké písmeno latinky E s accentom",Eacute:"Veľké písmeno latinky E s dĺžňom",Ecirc:"Veľké písmeno latinky E s mäkčeňom",Euml:"Veľké písmeno latinky E s dvoma bodkami",Igrave:"Veľké písmeno latinky I s accentom", +Iacute:"Veľké písmeno latinky I s dĺžňom",Icirc:"Veľké písmeno latinky I s mäkčeňom",Iuml:"Veľké písmeno latinky I s dvoma bodkami",ETH:"Veľké písmeno latinky Eth",Ntilde:"Veľké písmeno latinky N s tildou",Ograve:"Veľké písmeno latinky O s accentom",Oacute:"Veľké písmeno latinky O s dĺžňom",Ocirc:"Veľké písmeno latinky O s mäkčeňom",Otilde:"Veľké písmeno latinky O s tildou",Ouml:"Veľké písmeno latinky O s dvoma bodkami",times:"Znak násobenia",Oslash:"Veľké písmeno latinky O preškrtnuté",Ugrave:"Veľké písmeno latinky U s accentom", +Uacute:"Veľké písmeno latinky U s dĺžňom",Ucirc:"Veľké písmeno latinky U s mäkčeňom",Uuml:"Veľké písmeno latinky U s dvoma bodkami",Yacute:"Veľké písmeno latinky Y s dĺžňom",THORN:"Veľké písmeno latinky Thorn",szlig:"Malé písmeno latinky ostré s",agrave:"Malé písmeno latinky a s accentom",aacute:"Malé písmeno latinky a s dĺžňom",acirc:"Malé písmeno latinky a s mäkčeňom",atilde:"Malé písmeno latinky a s tildou",auml:"Malé písmeno latinky a s dvoma bodkami",aring:"Malé písmeno latinky a s krúžkom nad", +aelig:"Malé písmeno latinky æ",ccedil:"Malé písmeno latinky c s chvostom vľavo",egrave:"Malé písmeno latinky e s accentom",eacute:"Malé písmeno latinky e s dĺžňom",ecirc:"Malé písmeno latinky e s mäkčeňom",euml:"Malé písmeno latinky e s dvoma bodkami",igrave:"Malé písmeno latinky i s accentom",iacute:"Malé písmeno latinky i s dĺžňom",icirc:"Malé písmeno latinky i s mäkčeňom",iuml:"Malé písmeno latinky i s dvoma bodkami",eth:"Malé písmeno latinky eth",ntilde:"Malé písmeno latinky n s tildou",ograve:"Malé písmeno latinky o s accentom", +oacute:"Malé písmeno latinky o s dĺžňom",ocirc:"Malé písmeno latinky o s mäkčeňom",otilde:"Malé písmeno latinky o s tildou",ouml:"Malé písmeno latinky o s dvoma bodkami",divide:"Znak delenia",oslash:"Malé písmeno latinky o preškrtnuté",ugrave:"Malé písmeno latinky u s accentom",uacute:"Malé písmeno latinky u s dĺžňom",ucirc:"Malé písmeno latinky u s mäkčeňom",uuml:"Malé písmeno latinky u s dvoma bodkami",yacute:"Malé písmeno latinky y s dĺžňom",thorn:"Malé písmeno latinky thorn",yuml:"Malé písmeno latinky y s dvoma bodkami", +OElig:"Veľká ligatúra latinky OE",oelig:"Malá ligatúra latinky OE",372:"Veľké písmeno latinky W s mäkčeňom",374:"Veľké písmeno latinky Y s mäkčeňom",373:"Malé písmeno latinky w s mäkčeňom",375:"Malé písmeno latinky y s mäkčeňom",sbquo:"Dolná jednoduchá 9-úvodzovka",8219:"Horná jednoduchá otočená 9-úvodzovka",bdquo:"Dolná dvojitá 9-úvodzovka",hellip:"Trojbodkový úvod",trade:"Znak ibchodnej značky",9658:"Čierny ukazovateľ smerujúci vpravo",bull:"Kruh",rarr:"Šípka vpravo",rArr:"Dvojitá šipka vpravo", +hArr:"Dvojitá šipka vľavo a vpravo",diams:"Čierne piky",asymp:"Skoro sa rovná"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/sl.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/sl.js new file mode 100644 index 0000000..bdebbd1 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/sl.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sl",{euro:"Evro znak",lsquo:"Levi enojni narekovaj",rsquo:"Desni enojni narekovaj",ldquo:"Levi dvojni narekovaj",rdquo:"Desni dvojni narekovaj",ndash:"En pomišljaj",mdash:"Em pomišljaj",iexcl:"Obrnjen klicaj",cent:"Cent znak",pound:"Funt znak",curren:"Znak valute",yen:"Jen znak",brvbar:"Zlomljena črta",sect:"Znak oddelka",uml:"Diaeresis",copy:"Znak avtorskih pravic",ordf:"Ženski zaporedni kazalnik",laquo:"Levi obrnjen dvojni kotni narekovaj",not:"Ne znak",reg:"Registrirani znak", +macr:"Macron",deg:"Znak stopinj",sup2:"Nadpisano dva",sup3:"Nadpisano tri",acute:"Ostrivec",micro:"Mikro znak",para:"Pilcrow znak",middot:"Sredinska pika",cedil:"Cedilla",sup1:"Nadpisano ena",ordm:"Moški zaporedni kazalnik",raquo:"Desno obrnjen dvojni kotni narekovaj",frac14:"Ena četrtina",frac12:"Ena polovica",frac34:"Tri četrtine",iquest:"Obrnjen vprašaj",Agrave:"Velika latinska črka A s krativcem",Aacute:"Velika latinska črka A z ostrivcem",Acirc:"Velika latinska črka A s strešico",Atilde:"Velika latinska črka A z tildo", +Auml:"Velika latinska črka A z diaeresis-om",Aring:"Velika latinska črka A z obročem",AElig:"Velika latinska črka Æ",Ccedil:"Velika latinska črka C s cedillo",Egrave:"Velika latinska črka E s krativcem",Eacute:"Velika latinska črka E z ostrivcem",Ecirc:"Velika latinska črka E s strešico",Euml:"Velika latinska črka E z diaeresis-om",Igrave:"Velika latinska črka I s krativcem",Iacute:"Velika latinska črka I z ostrivcem",Icirc:"Velika latinska črka I s strešico",Iuml:"Velika latinska črka I z diaeresis-om", +ETH:"Velika latinska črka Eth",Ntilde:"Velika latinska črka N s tildo",Ograve:"Velika latinska črka O s krativcem",Oacute:"Velika latinska črka O z ostrivcem",Ocirc:"Velika latinska črka O s strešico",Otilde:"Velika latinska črka O s tildo",Ouml:"Velika latinska črka O z diaeresis-om",times:"Znak za množenje",Oslash:"Velika prečrtana latinska črka O",Ugrave:"Velika latinska črka U s krativcem",Uacute:"Velika latinska črka U z ostrivcem",Ucirc:"Velika latinska črka U s strešico",Uuml:"Velika latinska črka U z diaeresis-om", +Yacute:"Velika latinska črka Y z ostrivcem",THORN:"Velika latinska črka Thorn",szlig:"Mala ostra latinska črka s",agrave:"Mala latinska črka a s krativcem",aacute:"Mala latinska črka a z ostrivcem",acirc:"Mala latinska črka a s strešico",atilde:"Mala latinska črka a s tildo",auml:"Mala latinska črka a z diaeresis-om",aring:"Mala latinska črka a z obročem",aelig:"Mala latinska črka æ",ccedil:"Mala latinska črka c s cedillo",egrave:"Mala latinska črka e s krativcem",eacute:"Mala latinska črka e z ostrivcem", +ecirc:"Mala latinska črka e s strešico",euml:"Mala latinska črka e z diaeresis-om",igrave:"Mala latinska črka i s krativcem",iacute:"Mala latinska črka i z ostrivcem",icirc:"Mala latinska črka i s strešico",iuml:"Mala latinska črka i z diaeresis-om",eth:"Mala latinska črka eth",ntilde:"Mala latinska črka n s tildo",ograve:"Mala latinska črka o s krativcem",oacute:"Mala latinska črka o z ostrivcem",ocirc:"Mala latinska črka o s strešico",otilde:"Mala latinska črka o s tildo",ouml:"Mala latinska črka o z diaeresis-om", +divide:"Znak za deljenje",oslash:"Mala prečrtana latinska črka o",ugrave:"Mala latinska črka u s krativcem",uacute:"Mala latinska črka u z ostrivcem",ucirc:"Mala latinska črka u s strešico",uuml:"Mala latinska črka u z diaeresis-om",yacute:"Mala latinska črka y z ostrivcem",thorn:"Mala latinska črka thorn",yuml:"Mala latinska črka y z diaeresis-om",OElig:"Velika latinska ligatura OE",oelig:"Mala latinska ligatura oe",372:"Velika latinska črka W s strešico",374:"Velika latinska črka Y s strešico", +373:"Mala latinska črka w s strešico",375:"Mala latinska črka y s strešico",sbquo:"Enojni nizki-9 narekovaj",8219:"Enojni visoki-obrnjen-9 narekovaj",bdquo:"Dvojni nizki-9 narekovaj",hellip:"Horizontalni izpust",trade:"Znak blagovne znamke",9658:"Črni desno-usmerjen kazalec",bull:"Krogla",rarr:"Desno-usmerjena puščica",rArr:"Desno-usmerjena dvojna puščica",hArr:"Leva in desna dvojna puščica",diams:"Črna kara",asymp:"Skoraj enako"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/sq.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/sq.js new file mode 100644 index 0000000..967a048 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/sq.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sq",{euro:"Shenja e Euros",lsquo:"Thonjëza majtas me një vi",rsquo:"Thonjëza djathtas me një vi",ldquo:"Thonjëza majtas",rdquo:"Thonjëza djathtas",ndash:"En viza lidhëse",mdash:"Em viza lidhëse",iexcl:"Pikëçuditëse e përmbysur",cent:"Shenja e Centit",pound:"Shejna e Funtit",curren:"Shenja e valutës",yen:"Shenja e Jenit",brvbar:"Viza e këputur",sect:"Shenja e pjesës",uml:"Diaeresis",copy:"Shenja e të drejtave të kopjimit",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Nuk ka shenjë",reg:"Shenja e të regjistruarit",macr:"Macron",deg:"Shenja e shkallës",sup2:"Super-skripta dy",sup3:"Super-skripta tre",acute:"Theks i mprehtë",micro:"Shjenja e Mikros",para:"Pilcrow sign",middot:"Pika e Mesme",cedil:"Hark nën shkronja",sup1:"Super-skripta një",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Thyesa një të katrat",frac12:"Thyesa një të dytat",frac34:"Thyesa tre të katrat",iquest:"Pikëpyetje e përmbysur",Agrave:"Shkronja e madhe latine A me theks të rëndë", +Aacute:"Shkronja e madhe latine A me theks akute",Acirc:"Shkronja e madhe latine A me theks lakor",Atilde:"Shkronja e madhe latine A me tildë",Auml:"Shkronja e madhe latine A me dy pika",Aring:"Shkronja e madhe latine A me unazë mbi",AElig:"Shkronja e madhe latine Æ",Ccedil:"Shkronja e madhe latine C me hark poshtë",Egrave:"Shkronja e madhe latine E me theks të rëndë",Eacute:"Shkronja e madhe latine E me theks akute",Ecirc:"Shkronja e madhe latine E me theks lakor",Euml:"Shkronja e madhe latine E me dy pika", +Igrave:"Shkronja e madhe latine I me theks të rëndë",Iacute:"Shkronja e madhe latine I me theks akute",Icirc:"Shkronja e madhe latine I me theks lakor",Iuml:"Shkronja e madhe latine I me dy pika",ETH:"Shkronja e madhe latine Eth",Ntilde:"Shkronja e madhe latine N me tildë",Ograve:"Shkronja e madhe latine O me theks të rëndë",Oacute:"Shkronja e madhe latine O me theks akute",Ocirc:"Shkronja e madhe latine O me theks lakor",Otilde:"Shkronja e madhe latine O me tildë",Ouml:"Shkronja e madhe latine O me dy pika", +times:"Shenja e shumëzimit",Oslash:"Shkronja e madhe latine O me vizë në mes",Ugrave:"Shkronja e madhe latine U me theks të rëndë",Uacute:"Shkronja e madhe latine U me theks akute",Ucirc:"Shkronja e madhe latine U me theks lakor",Uuml:"Shkronja e madhe latine U me dy pika",Yacute:"Shkronja e madhe latine Y me theks akute",THORN:"Shkronja e madhe latine Thorn",szlig:"Shkronja e vogë latine s e mprehtë",agrave:"Shkronja e vogë latine a me theks të rëndë",aacute:"Shkronja e vogë latine a me theks të mprehtë", +acirc:"Shkronja e vogël latine a me theks lakor",atilde:"Shkronja e vogël latine a me tildë",auml:"Shkronja e vogël latine a me dy pika",aring:"Shkronja e vogë latine a me unazë mbi",aelig:"Shkronja e vogë latine æ",ccedil:"Shkronja e vogël latine c me hark poshtë",egrave:"Shkronja e vogë latine e me theks të rëndë",eacute:"Shkronja e vogë latine e me theks të mprehtë",ecirc:"Shkronja e vogël latine e me theks lakor",euml:"Shkronja e vogël latine e me dy pika",igrave:"Shkronja e vogë latine i me theks të rëndë", +iacute:"Shkronja e vogë latine i me theks të mprehtë",icirc:"Shkronja e vogël latine i me theks lakor",iuml:"Shkronja e vogël latine i me dy pika",eth:"Shkronja e vogë latine eth",ntilde:"Shkronja e vogël latine n me tildë",ograve:"Shkronja e vogë latine o me theks të rëndë",oacute:"Shkronja e vogë latine o me theks të mprehtë",ocirc:"Shkronja e vogël latine o me theks lakor",otilde:"Shkronja e vogël latine o me tildë",ouml:"Shkronja e vogël latine o me dy pika",divide:"Shenja ndarëse",oslash:"Shkronja e vogël latine o me vizë në mes", +ugrave:"Shkronja e vogë latine u me theks të rëndë",uacute:"Shkronja e vogë latine u me theks të mprehtë",ucirc:"Shkronja e vogël latine u me theks lakor",uuml:"Shkronja e vogël latine u me dy pika",yacute:"Shkronja e vogë latine y me theks të mprehtë",thorn:"Shkronja e vogël latine thorn",yuml:"Shkronja e vogël latine y me dy pika",OElig:"Shkronja e madhe e bashkuar latine OE",oelig:"Shkronja e vogël e bashkuar latine oe",372:"Shkronja e madhe latine W me theks lakor",374:"Shkronja e madhe latine Y me theks lakor", +373:"Shkronja e vogël latine w me theks lakor",375:"Shkronja e vogël latine y me theks lakor",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Shenja e Simbolit Tregtarë",9658:"Black right-pointing pointer",bull:"Pulla",rarr:"Shigjeta djathtas",rArr:"Shenja të dyfishta djathtas",hArr:"Shigjeta e dyfishë majtas-djathtas",diams:"Black diamond suit",asymp:"Gati e barabar me"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/sv.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/sv.js new file mode 100644 index 0000000..d177c86 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/sv.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sv",{euro:"Eurotecken",lsquo:"Enkelt vänster citattecken",rsquo:"Enkelt höger citattecken",ldquo:"Dubbelt vänster citattecken",rdquo:"Dubbelt höger citattecken",ndash:"Snedstreck",mdash:"Långt tankstreck",iexcl:"Inverterad utropstecken",cent:"Centtecken",pound:"Pundtecken",curren:"Valutatecken",yen:"Yentecken",brvbar:"Brutet lodrätt streck",sect:"Paragraftecken",uml:"Diaeresis",copy:"Upphovsrättstecken",ordf:"Feminit ordningstalsindikator",laquo:"Vänsterställt dubbelt vinkelcitationstecken", +not:"Icke-tecken",reg:"Registrerad",macr:"Macron",deg:"Grader",sup2:"Upphöjt två",sup3:"Upphöjt tre",acute:"Akut accent",micro:"Mikrotecken",para:"Alinea",middot:"Centrerad prick",cedil:"Cedilj",sup1:"Upphöjt en",ordm:"Maskulina ordningsändelsen",raquo:"Högerställt dubbelt vinkelcitationstecken",frac14:"Bråktal - en kvart",frac12:"Bråktal - en halv",frac34:"Bråktal - tre fjärdedelar",iquest:"Inverterat frågetecken",Agrave:"Stort A med grav accent",Aacute:"Stort A med akutaccent",Acirc:"Stort A med circumflex", +Atilde:"Stort A med tilde",Auml:"Stort A med diaresis",Aring:"Stort A med ring ovan",AElig:"Stort Æ",Ccedil:"Stort C med cedilj",Egrave:"Stort E med grav accent",Eacute:"Stort E med aktuaccent",Ecirc:"Stort E med circumflex",Euml:"Stort E med diaeresis",Igrave:"Stort I med grav accent",Iacute:"Stort I med akutaccent",Icirc:"Stort I med circumflex",Iuml:"Stort I med diaeresis",ETH:"Stort Eth",Ntilde:"Stort N med tilde",Ograve:"Stort O med grav accent",Oacute:"Stort O med aktuaccent",Ocirc:"Stort O med circumflex", +Otilde:"Stort O med tilde",Ouml:"Stort O med diaeresis",times:"Multiplicera",Oslash:"Stor Ø",Ugrave:"Stort U med grav accent",Uacute:"Stort U med akutaccent",Ucirc:"Stort U med circumflex",Uuml:"Stort U med diaeresis",Yacute:"Stort Y med akutaccent",THORN:"Stort Thorn",szlig:"Litet dubbel-s/Eszett",agrave:"Litet a med grav accent",aacute:"Litet a med akutaccent",acirc:"Litet a med circumflex",atilde:"Litet a med tilde",auml:"Litet a med diaeresis",aring:"Litet a med ring ovan",aelig:"Bokstaven æ", +ccedil:"Litet c med cedilj",egrave:"Litet e med grav accent",eacute:"Litet e med akutaccent",ecirc:"Litet e med circumflex",euml:"Litet e med diaeresis",igrave:"Litet i med grav accent",iacute:"Litet i med akutaccent",icirc:"LItet i med circumflex",iuml:"Litet i med didaeresis",eth:"Litet eth",ntilde:"Litet n med tilde",ograve:"LItet o med grav accent",oacute:"LItet o med akutaccent",ocirc:"Litet o med circumflex",otilde:"LItet o med tilde",ouml:"Litet o med diaeresis",divide:"Division",oslash:"ø", +ugrave:"Litet u med grav accent",uacute:"Litet u med akutaccent",ucirc:"LItet u med circumflex",uuml:"Litet u med diaeresis",yacute:"Litet y med akutaccent",thorn:"Litet thorn",yuml:"Litet y med diaeresis",OElig:"Stor ligatur av OE",oelig:"Liten ligatur av oe",372:"Stort W med circumflex",374:"Stort Y med circumflex",373:"Litet w med circumflex",375:"Litet y med circumflex",sbquo:"Enkelt lågt 9-citationstecken",8219:"Enkelt högt bakvänt 9-citationstecken",bdquo:"Dubbelt lågt 9-citationstecken",hellip:"Horisontellt uteslutningstecken", +trade:"Varumärke",9658:"Svart högervänd pekare",bull:"Listpunkt",rarr:"Högerpil",rArr:"Dubbel högerpil",hArr:"Dubbel vänsterpil",diams:"Svart ruter",asymp:"Ungefär lika med"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/th.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/th.js new file mode 100644 index 0000000..1d43ac9 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/th.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","th",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"สัญลักษณ์สกุลเงิน",yen:"สัญลักษณ์เงินเยน",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"สัญลักษณ์หัวข้อย่อย",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/tr.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/tr.js new file mode 100644 index 0000000..65c1a19 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/tr.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","tr",{euro:"Euro işareti",lsquo:"Sol tek tırnak işareti",rsquo:"Sağ tek tırnak işareti",ldquo:"Sol çift tırnak işareti",rdquo:"Sağ çift tırnak işareti",ndash:"En tire",mdash:"Em tire",iexcl:"Ters ünlem işareti",cent:"Cent işareti",pound:"Pound işareti",curren:"Para birimi işareti",yen:"Yen işareti",brvbar:"Kırık bar",sect:"Bölüm işareti",uml:"İki sesli harfin ayrılması",copy:"Telif hakkı işareti",ordf:"Dişil sıralı gösterge",laquo:"Sol-işaret çift açı tırnak işareti", +not:"Not işareti",reg:"Kayıtlı işareti",macr:"Makron",deg:"Derece işareti",sup2:"İkili üstsimge",sup3:"Üçlü üstsimge",acute:"Aksan işareti",micro:"Mikro işareti",para:"Pilcrow işareti",middot:"Orta nokta",cedil:"Kedilla",sup1:"Üstsimge",ordm:"Eril sıralı gösterge",raquo:"Sağ işaret çift açı tırnak işareti",frac14:"Bayağı kesrin dörtte biri",frac12:"Bayağı kesrin bir yarım",frac34:"Bayağı kesrin dörtte üç",iquest:"Ters soru işareti",Agrave:"Aksanlı latin harfi",Aacute:"Aşırı aksanıyla Latin harfi", +Acirc:"Çarpık Latin harfi",Atilde:"Tilde latin harfi",Auml:"Sesli harf ayrılımlıı latin harfi",Aring:"Halkalı latin büyük A harfi",AElig:"Latin büyük Æ harfi",Ccedil:"Latin büyük C harfi ile kedilla",Egrave:"Aksanlı latin büyük E harfi",Eacute:"Aşırı vurgulu latin büyük E harfi",Ecirc:"Çarpık latin büyük E harfi",Euml:"Sesli harf ayrılımlıı latin büyük E harfi",Igrave:"Aksanlı latin büyük I harfi",Iacute:"Aşırı aksanlı latin büyük I harfi",Icirc:"Çarpık latin büyük I harfi",Iuml:"Sesli harf ayrılımlıı latin büyük I harfi", +ETH:"Latin büyük Eth harfi",Ntilde:"Tildeli latin büyük N harfi",Ograve:"Aksanlı latin büyük O harfi",Oacute:"Aşırı aksanlı latin büyük O harfi",Ocirc:"Çarpık latin büyük O harfi",Otilde:"Tildeli latin büyük O harfi",Ouml:"Sesli harf ayrılımlı latin büyük O harfi",times:"Çarpma işareti",Oslash:"Vurgulu latin büyük O harfi",Ugrave:"Aksanlı latin büyük U harfi",Uacute:"Aşırı aksanlı latin büyük U harfi",Ucirc:"Çarpık latin büyük U harfi",Uuml:"Sesli harf ayrılımlı latin büyük U harfi",Yacute:"Aşırı aksanlı latin büyük Y harfi", +THORN:"Latin büyük Thorn harfi",szlig:"Latin küçük keskin s harfi",agrave:"Aksanlı latin küçük a harfi",aacute:"Aşırı aksanlı latin küçük a harfi",acirc:"Çarpık latin küçük a harfi",atilde:"Tildeli latin küçük a harfi",auml:"Sesli harf ayrılımlı latin küçük a harfi",aring:"Halkalı latin küçük a harfi",aelig:"Latin büyük æ harfi",ccedil:"Kedillalı latin küçük c harfi",egrave:"Aksanlı latin küçük e harfi",eacute:"Aşırı aksanlı latin küçük e harfi",ecirc:"Çarpık latin küçük e harfi",euml:"Sesli harf ayrılımlı latin küçük e harfi", +igrave:"Aksanlı latin küçük i harfi",iacute:"Aşırı aksanlı latin küçük i harfi",icirc:"Çarpık latin küçük i harfi",iuml:"Sesli harf ayrılımlı latin küçük i harfi",eth:"Latin küçük eth harfi",ntilde:"Tildeli latin küçük n harfi",ograve:"Aksanlı latin küçük o harfi",oacute:"Aşırı aksanlı latin küçük o harfi",ocirc:"Çarpık latin küçük o harfi",otilde:"Tildeli latin küçük o harfi",ouml:"Sesli harf ayrılımlı latin küçük o harfi",divide:"Bölme işareti",oslash:"Vurgulu latin küçük o harfi",ugrave:"Aksanlı latin küçük u harfi", +uacute:"Aşırı aksanlı latin küçük u harfi",ucirc:"Çarpık latin küçük u harfi",uuml:"Sesli harf ayrılımlı latin küçük u harfi",yacute:"Aşırı aksanlı latin küçük y harfi",thorn:"Latin küçük thorn harfi",yuml:"Sesli harf ayrılımlı latin küçük y harfi",OElig:"Latin büyük bağlı OE harfi",oelig:"Latin küçük bağlı oe harfi",372:"Çarpık latin büyük W harfi",374:"Çarpık latin büyük Y harfi",373:"Çarpık latin küçük w harfi",375:"Çarpık latin küçük y harfi",sbquo:"Tek düşük-9 tırnak işareti",8219:"Tek yüksek-ters-9 tırnak işareti", +bdquo:"Çift düşük-9 tırnak işareti",hellip:"Yatay elips",trade:"Marka tescili işareti",9658:"Siyah sağ işaret işaretçisi",bull:"Koyu nokta",rarr:"Sağa doğru ok",rArr:"Sağa doğru çift ok",hArr:"Sol, sağ çift ok",diams:"Siyah elmas takımı",asymp:"Hemen hemen eşit"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/tt.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/tt.js new file mode 100644 index 0000000..303d655 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/tt.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","tt",{euro:"Евро тамгасы",lsquo:"Сул бер иңле куштырнаклар",rsquo:"Уң бер иңле куштырнаклар",ldquo:"Сул ике иңле куштырнаклар",rdquo:"Уң ике иңле куштырнаклар",ndash:"Кыска сызык",mdash:"Озын сызык",iexcl:"Әйләндерелгән өндәү билгесе",cent:"Цент тамгасы",pound:"Фунт тамгасы",curren:"Акча берәмлеге тамгасы",yen:"Иена тамгасы",brvbar:"Broken bar",sect:"Параграф билгесе",uml:"Диерезис",copy:"Хокук иясе булу билгесе",ordf:"Feminine ordinal indicator",laquo:"Ачылучы чыршысыман җәя", +not:"Юклык ишарəсе",reg:"Теркәләнгән булу билгесе",macr:"Макрон",deg:"Градус билгесе",sup2:"Икенче өске индекс",sup3:"Өченче өске индекс",acute:"Басым билгесе",micro:"Микро билгесе",para:"Параграф билгесе",middot:"Уртадагы нокта",cedil:"Седиль",sup1:"Беренче өске индекс",ordm:"Masculine ordinal indicator",raquo:"Ябылучы чыршысыман җәя",frac14:"Гади дүрттән бер билгесе",frac12:"Гади икедән бер билгесе",frac34:"Гади дүрттән өч билгесе",iquest:"Әйләндерелгән өндәү билгесе",Agrave:"Гравис белән латин A баш хәрефе", +Aacute:"Басым билгесе белән латин A баш хәрефе",Acirc:"Циркумфлекс белән латин A баш хәрефе",Atilde:"Тильда белән латин A баш хәрефе",Auml:"Диерезис белән латин A баш хәрефе",Aring:"Өстендә боҗра булган латин A баш хәрефе",AElig:"Латин Æ баш хәрефе",Ccedil:"Седиль белән латин C баш хәрефе",Egrave:"Гравис белән латин E баш хәрефе",Eacute:"Басым билгесе белән латин E баш хәрефе",Ecirc:"Циркумфлекс белән латин E баш хәрефе",Euml:"Диерезис белән латин E баш хәрефе",Igrave:"Гравис белән латин I баш хәрефе", +Iacute:"Басым билгесе белән латин I баш хәрефе",Icirc:"Циркумфлекс белән латин I баш хәрефе",Iuml:"Диерезис белән латин I баш хәрефе",ETH:"Латин Eth баш хәрефе",Ntilde:"Тильда белән латин N баш хәрефе",Ograve:"Гравис белән латин O баш хәрефе",Oacute:"Басым билгесе белән латин O баш хәрефе",Ocirc:"Циркумфлекс белән латин O баш хәрефе",Otilde:"Тильда белән латин O баш хәрефе",Ouml:"Диерезис белән латин O баш хәрефе",times:"Тапкырлау билгесе",Oslash:"Сызык белән латин O баш хәрефе",Ugrave:"Гравис белән латин U баш хәрефе", +Uacute:"Басым билгесе белән латин U баш хәрефе",Ucirc:"Циркумфлекс белән латин U баш хәрефе",Uuml:"Диерезис белән латин U баш хәрефе",Yacute:"Басым билгесе белән латин Y баш хәрефе",THORN:"Латин Thorn баш хәрефе",szlig:"Латин beta юл хәрефе",agrave:"Гравис белән латин a юл хәрефе",aacute:"Басым билгесе белән латин a юл хәрефе",acirc:"Циркумфлекс белән латин a юл хәрефе",atilde:"Тильда белән латин a юл хәрефе",auml:"Диерезис белән латин a юл хәрефе",aring:"Өстендә боҗра булган латин a юл хәрефе",aelig:"Латин æ юл хәрефе", +ccedil:"Седиль белән латин c юл хәрефе",egrave:"Гравис белән латин e юл хәрефе",eacute:"Басым билгесе белән латин e юл хәрефе",ecirc:"Циркумфлекс белән латин e юл хәрефе",euml:"Диерезис белән латин e юл хәрефе",igrave:"Гравис белән латин i юл хәрефе",iacute:"Басым билгесе белән латин i юл хәрефе",icirc:"Циркумфлекс белән латин i юл хәрефе",iuml:"Диерезис белән латин i юл хәрефе",eth:"Латин eth юл хәрефе",ntilde:"Тильда белән латин n юл хәрефе",ograve:"Гравис белән латин o юл хәрефе",oacute:"Басым билгесе белән латин o юл хәрефе", +ocirc:"Циркумфлекс белән латин o юл хәрефе",otilde:"Тильда белән латин o юл хәрефе",ouml:"Диерезис белән латин o юл хәрефе",divide:"Бүлү билгесе",oslash:"Сызык белән латин o юл хәрефе",ugrave:"Гравис белән латин u юл хәрефе",uacute:"Басым билгесе белән латин u юл хәрефе",ucirc:"Циркумфлекс белән латин u юл хәрефе",uuml:"Диерезис белән латин u юл хәрефе",yacute:"Басым билгесе белән латин y юл хәрефе",thorn:"Латин thorn юл хәрефе",yuml:"Диерезис белән латин y юл хәрефе",OElig:"Латин лигатура OE баш хәрефе", +oelig:"Латин лигатура oe юл хәрефе",372:"Циркумфлекс белән латин W баш хәрефе",374:"Циркумфлекс белән латин Y баш хәрефе",373:"Циркумфлекс белән латин w юл хәрефе",375:"Циркумфлекс белән латин y юл хәрефе",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Ятма эллипс",trade:"Сәүдә маркасы билгесе",9658:"Black right-pointing pointer",bull:"Маркер",rarr:"Уң якка ук",rArr:"Уң якка икеләтә ук",hArr:"Ике якка икеләтә ук",diams:"Black diamond suit", +asymp:"якынча"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ug.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ug.js new file mode 100644 index 0000000..757e83f --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/ug.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ug",{euro:"ياۋرو بەلگىسى",lsquo:"يالاڭ پەش سول",rsquo:"يالاڭ پەش ئوڭ",ldquo:"قوش پەش سول",rdquo:"قوش پەش ئوڭ",ndash:"سىزىقچە",mdash:"سىزىق",iexcl:"ئۈندەش",cent:"تىيىن بەلگىسى",pound:"فوند ستېرلىڭ",curren:"پۇل بەلگىسى",yen:"ياپونىيە يىنى",brvbar:"ئۈزۈك بالداق",sect:"پاراگراف بەلگىسى",uml:"تاۋۇش ئايرىش بەلگىسى",copy:"نەشر ھوقۇقى بەلگىسى",ordf:"Feminine ordinal indicator",laquo:"قوش تىرناق سول",not:"غەيرى بەلگە",reg:"خەتلەتكەن تاۋار ماركىسى",macr:"سوزۇش بەلگىسى", +deg:"گىرادۇس بەلگىسى",sup2:"يۇقىرى ئىندېكىس 2",sup3:"يۇقىرى ئىندېكىس 3",acute:"ئۇرغۇ بەلگىسى",micro:"Micro sign",para:"ئابزاس بەلگىسى",middot:"ئوتتۇرا چېكىت",cedil:"ئاستىغا قوشۇلىدىغان بەلگە",sup1:"يۇقىرى ئىندېكىس 1",ordm:"Masculine ordinal indicator",raquo:"قوش تىرناق ئوڭ",frac14:"ئاددىي كەسىر تۆتتىن بىر",frac12:"ئاددىي كەسىر ئىككىدىن بىر",frac34:"ئاددىي كەسىر ئۈچتىن تۆرت",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent", +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent", +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"قوش پەش ئوڭ",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent", +Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"Latin small letter æ", +ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"تىك موللاق سوئال بەلگىسى",ograve:"Latin small letter o with grave accent", +oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"بۆلۈش بەلگىسى",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn", +yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"خەتلەتكەن تاۋار ماركىسى بەلگىسى",9658:"Black right-pointing pointer", +bull:"Bullet",rarr:"ئوڭ يا ئوق",rArr:"ئوڭ قوش سىزىق يا ئوق",hArr:"ئوڭ سول قوش سىزىق يا ئوق",diams:"ئۇيۇل غىچ",asymp:"تەخمىنەن تەڭ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/uk.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/uk.js new file mode 100644 index 0000000..2343e56 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/uk.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","uk",{euro:"Знак євро",lsquo:"Ліві одинарні лапки",rsquo:"Праві одинарні лапки",ldquo:"Ліві подвійні лапки",rdquo:"Праві подвійні лапки",ndash:"Середнє тире",mdash:"Довге тире",iexcl:"Перевернутий знак оклику",cent:"Знак цента",pound:"Знак фунта",curren:"Знак валюти",yen:"Знак єни",brvbar:"Переривчаста вертикальна лінія",sect:"Знак параграфу",uml:"Умлаут",copy:"Знак авторських прав",ordf:"Жіночий порядковий вказівник",laquo:"ліві вказівні подвійні кутові дужки", +not:"Заперечення",reg:"Знак охорони суміжних прав",macr:"Макрон",deg:"Знак градуса",sup2:"два у верхньому індексі",sup3:"три у верхньому індексі",acute:"Знак акута",micro:"Знак мікро",para:"Знак абзацу",middot:"Інтерпункт",cedil:"Седиль",sup1:"Один у верхньому індексі",ordm:"Чоловічий порядковий вказівник",raquo:"праві вказівні подвійні кутові дужки",frac14:"Одна четвертина",frac12:"Одна друга",frac34:"три четвертих",iquest:"Перевернутий знак питання",Agrave:"Велика латинська A з гравісом",Aacute:"Велика латинська А з акутом", +Acirc:"Велика латинська А з циркумфлексом",Atilde:"Велика латинська А з тильдою",Auml:"Велике латинське А з умлаутом",Aring:"Велика латинська A з кільцем згори",AElig:"Велика латинська Æ",Ccedil:"Велика латинська C з седиллю",Egrave:"Велика латинська E з гравісом",Eacute:"Велика латинська E з акутом",Ecirc:"Велика латинська E з циркумфлексом",Euml:"Велика латинська А з умлаутом",Igrave:"Велика латинська I з гравісом",Iacute:"Велика латинська I з акутом",Icirc:"Велика латинська I з циркумфлексом", +Iuml:"Велика латинська І з умлаутом",ETH:"Велика латинська Eth",Ntilde:"Велика латинська N з тильдою",Ograve:"Велика латинська O з гравісом",Oacute:"Велика латинська O з акутом",Ocirc:"Велика латинська O з циркумфлексом",Otilde:"Велика латинська O з тильдою",Ouml:"Велика латинська О з умлаутом",times:"Знак множення",Oslash:"Велика латинська перекреслена O ",Ugrave:"Велика латинська U з гравісом",Uacute:"Велика латинська U з акутом",Ucirc:"Велика латинська U з циркумфлексом",Uuml:"Велика латинська U з умлаутом", +Yacute:"Велика латинська Y з акутом",THORN:"Велика латинська Торн",szlig:"Мала латинська есцет",agrave:"Мала латинська a з гравісом",aacute:"Мала латинська a з акутом",acirc:"Мала латинська a з циркумфлексом",atilde:"Мала латинська a з тильдою",auml:"Мала латинська a з умлаутом",aring:"Мала латинська a з кільцем згори",aelig:"Мала латинська æ",ccedil:"Мала латинська C з седиллю",egrave:"Мала латинська e з гравісом",eacute:"Мала латинська e з акутом",ecirc:"Мала латинська e з циркумфлексом",euml:"Мала латинська e з умлаутом", +igrave:"Мала латинська i з гравісом",iacute:"Мала латинська i з акутом",icirc:"Мала латинська i з циркумфлексом",iuml:"Мала латинська i з умлаутом",eth:"Мала латинська Eth",ntilde:"Мала латинська n з тильдою",ograve:"Мала латинська o з гравісом",oacute:"Мала латинська o з акутом",ocirc:"Мала латинська o з циркумфлексом",otilde:"Мала латинська o з тильдою",ouml:"Мала латинська o з умлаутом",divide:"Знак ділення",oslash:"Мала латинська перекреслена o",ugrave:"Мала латинська u з гравісом",uacute:"Мала латинська u з акутом", +ucirc:"Мала латинська u з циркумфлексом",uuml:"Мала латинська u з умлаутом",yacute:"Мала латинська y з акутом",thorn:"Мала латинська торн",yuml:"Мала латинська y з умлаутом",OElig:"Велика латинська лігатура OE",oelig:"Мала латинська лігатура oe",372:"Велика латинська W з циркумфлексом",374:"Велика латинська Y з циркумфлексом",373:"Мала латинська w з циркумфлексом",375:"Мала латинська y з циркумфлексом",sbquo:"Одиничні нижні лабки",8219:"Верхні одиничні обернені лабки",bdquo:"Подвійні нижні лабки", +hellip:"Три крапки",trade:"Знак торгової марки",9658:"Чорний правий вказівник",bull:"Маркер списку",rarr:"Стрілка вправо",rArr:"Подвійна стрілка вправо",hArr:"Подвійна стрілка вліво-вправо",diams:"Чорний діамонт",asymp:"Наближено дорівнює"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/vi.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/vi.js new file mode 100644 index 0000000..a71305b --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/vi.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","vi",{euro:"Ký hiệu Euro",lsquo:"Dấu ngoặc đơn trái",rsquo:"Dấu ngoặc đơn phải",ldquo:"Dấu ngoặc đôi trái",rdquo:"Dấu ngoặc đôi phải",ndash:"Gạch ngang tiếng anh",mdash:"Gạch ngang Em",iexcl:"Chuyển đổi dấu chấm than",cent:"Ký tự tiền Mỹ",pound:"Ký tự tiền Anh",curren:"Ký tự tiền tệ",yen:"Ký tự tiền Yên Nhật",brvbar:"Thanh hỏng",sect:"Ký tự khu vực",uml:"Dấu tách đôi",copy:"Ký tự bản quyền",ordf:"Phần chỉ thị giống cái",laquo:"Chọn dấu ngoặc đôi trái",not:"Không có ký tự", +reg:"Ký tự đăng ký",macr:"Dấu nguyên âm dài",deg:"Ký tự độ",sup2:"Chữ trồi lên trên dạng 2",sup3:"Chữ trồi lên trên dạng 3",acute:"Dấu trọng âm",micro:"Ký tự micro",para:"Ký tự đoạn văn",middot:"Dấu chấm tròn",cedil:"Dấu móc lưới",sup1:"Ký tự trồi lên cấp 1",ordm:"Ký tự biểu hiện giống đực",raquo:"Chọn dấu ngoặc đôi phải",frac14:"Tỉ lệ một phần tư",frac12:"Tỉ lệ một nửa",frac34:"Tỉ lệ ba phần tư",iquest:"Chuyển đổi dấu chấm hỏi",Agrave:"Ký tự la-tinh viết hoa A với dấu huyền",Aacute:"Ký tự la-tinh viết hoa A với dấu sắc", +Acirc:"Ký tự la-tinh viết hoa A với dấu mũ",Atilde:"Ký tự la-tinh viết hoa A với dấu ngã",Auml:"Ký tự la-tinh viết hoa A với dấu hai chấm trên đầu",Aring:"Ký tự la-tinh viết hoa A với biểu tượng vòng tròn trên đầu",AElig:"Ký tự la-tinh viết hoa của Æ",Ccedil:"Ký tự la-tinh viết hoa C với dấu móc bên dưới",Egrave:"Ký tự la-tinh viết hoa E với dấu huyền",Eacute:"Ký tự la-tinh viết hoa E với dấu sắc",Ecirc:"Ký tự la-tinh viết hoa E với dấu mũ",Euml:"Ký tự la-tinh viết hoa E với dấu hai chấm trên đầu", +Igrave:"Ký tự la-tinh viết hoa I với dấu huyền",Iacute:"Ký tự la-tinh viết hoa I với dấu sắc",Icirc:"Ký tự la-tinh viết hoa I với dấu mũ",Iuml:"Ký tự la-tinh viết hoa I với dấu hai chấm trên đầu",ETH:"Viết hoa của ký tự Eth",Ntilde:"Ký tự la-tinh viết hoa N với dấu ngã",Ograve:"Ký tự la-tinh viết hoa O với dấu huyền",Oacute:"Ký tự la-tinh viết hoa O với dấu sắc",Ocirc:"Ký tự la-tinh viết hoa O với dấu mũ",Otilde:"Ký tự la-tinh viết hoa O với dấu ngã",Ouml:"Ký tự la-tinh viết hoa O với dấu hai chấm trên đầu", +times:"Ký tự phép toán nhân",Oslash:"Ký tự la-tinh viết hoa A với dấu ngã xuống",Ugrave:"Ký tự la-tinh viết hoa U với dấu huyền",Uacute:"Ký tự la-tinh viết hoa U với dấu sắc",Ucirc:"Ký tự la-tinh viết hoa U với dấu mũ",Uuml:"Ký tự la-tinh viết hoa U với dấu hai chấm trên đầu",Yacute:"Ký tự la-tinh viết hoa Y với dấu sắc",THORN:"Phần viết hoa của ký tự Thorn",szlig:"Ký tự viết nhỏ la-tinh của chữ s",agrave:"Ký tự la-tinh thường với dấu huyền",aacute:"Ký tự la-tinh thường với dấu sắc",acirc:"Ký tự la-tinh thường với dấu mũ", +atilde:"Ký tự la-tinh thường với dấu ngã",auml:"Ký tự la-tinh thường với dấu hai chấm trên đầu",aring:"Ký tự la-tinh viết thường với biểu tượng vòng tròn trên đầu",aelig:"Ký tự la-tinh viết thường của æ",ccedil:"Ký tự la-tinh viết thường của c với dấu móc bên dưới",egrave:"Ký tự la-tinh viết thường e với dấu huyền",eacute:"Ký tự la-tinh viết thường e với dấu sắc",ecirc:"Ký tự la-tinh viết thường e với dấu mũ",euml:"Ký tự la-tinh viết thường e với dấu hai chấm trên đầu",igrave:"Ký tự la-tinh viết thường i với dấu huyền", +iacute:"Ký tự la-tinh viết thường i với dấu sắc",icirc:"Ký tự la-tinh viết thường i với dấu mũ",iuml:"Ký tự la-tinh viết thường i với dấu hai chấm trên đầu",eth:"Ký tự la-tinh viết thường của eth",ntilde:"Ký tự la-tinh viết thường n với dấu ngã",ograve:"Ký tự la-tinh viết thường o với dấu huyền",oacute:"Ký tự la-tinh viết thường o với dấu sắc",ocirc:"Ký tự la-tinh viết thường o với dấu mũ",otilde:"Ký tự la-tinh viết thường o với dấu ngã",ouml:"Ký tự la-tinh viết thường o với dấu hai chấm trên đầu", +divide:"Ký hiệu phép tính chia",oslash:"Ký tự la-tinh viết thường o với dấu ngã",ugrave:"Ký tự la-tinh viết thường u với dấu huyền",uacute:"Ký tự la-tinh viết thường u với dấu sắc",ucirc:"Ký tự la-tinh viết thường u với dấu mũ",uuml:"Ký tự la-tinh viết thường u với dấu hai chấm trên đầu",yacute:"Ký tự la-tinh viết thường y với dấu sắc",thorn:"Ký tự la-tinh viết thường của chữ thorn",yuml:"Ký tự la-tinh viết thường y với dấu hai chấm trên đầu",OElig:"Ký tự la-tinh viết hoa gạch nối OE",oelig:"Ký tự la-tinh viết thường gạch nối OE", +372:"Ký tự la-tinh viết hoa W với dấu mũ",374:"Ký tự la-tinh viết hoa Y với dấu mũ",373:"Ký tự la-tinh viết thường w với dấu mũ",375:"Ký tự la-tinh viết thường y với dấu mũ",sbquo:"Dấu ngoặc đơn thấp số-9",8219:"Dấu ngoặc đơn đảo ngược số-9",bdquo:"Gấp đôi dấu ngoặc đơn số-9",hellip:"Tĩnh dược chiều ngang",trade:"Ký tự thương hiệu",9658:"Ký tự trỏ về hướng bên phải màu đen",bull:"Ký hiệu",rarr:"Mũi tên hướng bên phải",rArr:"Mũi tên hướng bên phải dạng đôi",hArr:"Mũi tên hướng bên trái dạng đôi",diams:"Ký hiệu hình thoi", +asymp:"Gần bằng với"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js new file mode 100644 index 0000000..d794a3d --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","zh-cn",{euro:"欧元符号",lsquo:"左单引号",rsquo:"右单引号",ldquo:"左双引号",rdquo:"右双引号",ndash:"短划线",mdash:"长划线",iexcl:"竖翻叹号",cent:"分币符号",pound:"英镑符号",curren:"货币符号",yen:"日元符号",brvbar:"间断条",sect:"节标记",uml:"分音符",copy:"版权所有标记",ordf:"阴性顺序指示符",laquo:"左指双尖引号",not:"非标记",reg:"注册标记",macr:"长音符",deg:"度标记",sup2:"上标二",sup3:"上标三",acute:"锐音符",micro:"微符",para:"段落标记",middot:"中间点",cedil:"下加符",sup1:"上标一",ordm:"阳性顺序指示符",raquo:"右指双尖引号",frac14:"普通分数四分之一",frac12:"普通分数二分之一",frac34:"普通分数四分之三",iquest:"竖翻问号", +Agrave:"带抑音符的拉丁文大写字母 A",Aacute:"带锐音符的拉丁文大写字母 A",Acirc:"带扬抑符的拉丁文大写字母 A",Atilde:"带颚化符的拉丁文大写字母 A",Auml:"带分音符的拉丁文大写字母 A",Aring:"带上圆圈的拉丁文大写字母 A",AElig:"拉丁文大写字母 Ae",Ccedil:"带下加符的拉丁文大写字母 C",Egrave:"带抑音符的拉丁文大写字母 E",Eacute:"带锐音符的拉丁文大写字母 E",Ecirc:"带扬抑符的拉丁文大写字母 E",Euml:"带分音符的拉丁文大写字母 E",Igrave:"带抑音符的拉丁文大写字母 I",Iacute:"带锐音符的拉丁文大写字母 I",Icirc:"带扬抑符的拉丁文大写字母 I",Iuml:"带分音符的拉丁文大写字母 I",ETH:"拉丁文大写字母 Eth",Ntilde:"带颚化符的拉丁文大写字母 N",Ograve:"带抑音符的拉丁文大写字母 O",Oacute:"带锐音符的拉丁文大写字母 O",Ocirc:"带扬抑符的拉丁文大写字母 O",Otilde:"带颚化符的拉丁文大写字母 O", +Ouml:"带分音符的拉丁文大写字母 O",times:"乘号",Oslash:"带粗线的拉丁文大写字母 O",Ugrave:"带抑音符的拉丁文大写字母 U",Uacute:"带锐音符的拉丁文大写字母 U",Ucirc:"带扬抑符的拉丁文大写字母 U",Uuml:"带分音符的拉丁文大写字母 U",Yacute:"带抑音符的拉丁文大写字母 Y",THORN:"拉丁文大写字母 Thorn",szlig:"拉丁文小写字母清音 S",agrave:"带抑音符的拉丁文小写字母 A",aacute:"带锐音符的拉丁文小写字母 A",acirc:"带扬抑符的拉丁文小写字母 A",atilde:"带颚化符的拉丁文小写字母 A",auml:"带分音符的拉丁文小写字母 A",aring:"带上圆圈的拉丁文小写字母 A",aelig:"拉丁文小写字母 Ae",ccedil:"带下加符的拉丁文小写字母 C",egrave:"带抑音符的拉丁文小写字母 E",eacute:"带锐音符的拉丁文小写字母 E",ecirc:"带扬抑符的拉丁文小写字母 E",euml:"带分音符的拉丁文小写字母 E",igrave:"带抑音符的拉丁文小写字母 I", +iacute:"带锐音符的拉丁文小写字母 I",icirc:"带扬抑符的拉丁文小写字母 I",iuml:"带分音符的拉丁文小写字母 I",eth:"拉丁文小写字母 Eth",ntilde:"带颚化符的拉丁文小写字母 N",ograve:"带抑音符的拉丁文小写字母 O",oacute:"带锐音符的拉丁文小写字母 O",ocirc:"带扬抑符的拉丁文小写字母 O",otilde:"带颚化符的拉丁文小写字母 O",ouml:"带分音符的拉丁文小写字母 O",divide:"除号",oslash:"带粗线的拉丁文小写字母 O",ugrave:"带抑音符的拉丁文小写字母 U",uacute:"带锐音符的拉丁文小写字母 U",ucirc:"带扬抑符的拉丁文小写字母 U",uuml:"带分音符的拉丁文小写字母 U",yacute:"带抑音符的拉丁文小写字母 Y",thorn:"拉丁文小写字母 Thorn",yuml:"带分音符的拉丁文小写字母 Y",OElig:"拉丁文大写连字 Oe",oelig:"拉丁文小写连字 Oe",372:"带扬抑符的拉丁文大写字母 W",374:"带扬抑符的拉丁文大写字母 Y", +373:"带扬抑符的拉丁文小写字母 W",375:"带扬抑符的拉丁文小写字母 Y",sbquo:"单下 9 形引号",8219:"单高横翻 9 形引号",bdquo:"双下 9 形引号",hellip:"水平省略号",trade:"商标标志",9658:"实心右指指针",bull:"加重号",rarr:"向右箭头",rArr:"向右双线箭头",hArr:"左右双线箭头",diams:"实心方块纸牌",asymp:"约等于"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/lang/zh.js b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/zh.js new file mode 100644 index 0000000..94c0cfb --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/lang/zh.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","zh",{euro:"歐元符號",lsquo:"左單引號",rsquo:"右單引號",ldquo:"左雙引號",rdquo:"右雙引號",ndash:"短破折號",mdash:"長破折號",iexcl:"倒置的驚嘆號",cent:"美分符號",pound:"英鎊符號",curren:"貨幣符號",yen:"日圓符號",brvbar:"Broken bar",sect:"章節符號",uml:"分音符號",copy:"版權符號",ordf:"雌性符號",laquo:"左雙角括號",not:"Not 符號",reg:"註冊商標符號",macr:"長音符號",deg:"度數符號",sup2:"上標字 2",sup3:"上標字 3",acute:"尖音符號",micro:"Micro sign",para:"段落符號",middot:"中間點",cedil:"字母 C 下面的尾型符號 ",sup1:"上標",ordm:"雄性符號",raquo:"右雙角括號",frac14:"四分之一符號",frac12:"Vulgar fraction one half", +frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"拉丁大寫字母 E 帶分音符號",Aring:"拉丁大寫字母 A 帶上圓圈",AElig:"拉丁大寫字母 Æ",Ccedil:"拉丁大寫字母 C 帶下尾符號",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis", +Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis", +times:"乘號",Oslash:"拉丁大寫字母 O 帶粗線符號",Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde", +auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis", +eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex", +uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark", +hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/specialchar/dialogs/specialchar.js b/bower_components/ckeditor/plugins/specialchar/dialogs/specialchar.js new file mode 100644 index 0000000..b343a83 --- /dev/null +++ b/bower_components/ckeditor/plugins/specialchar/dialogs/specialchar.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("specialchar",function(i){var e,l=i.lang.specialchar,k=function(c){var b,c=c.data?c.data.getTarget():new CKEDITOR.dom.element(c);if("a"==c.getName()&&(b=c.getChild(0).getHtml()))c.removeClass("cke_light_background"),e.hide(),c=i.document.createElement("span"),c.setHtml(b),i.insertText(c.getText())},m=CKEDITOR.tools.addFunction(k),j,g=function(c,b){var a,b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());if("a"==b.getName()&&(a=b.getChild(0).getHtml())){j&&d(null,j); +var f=e.getContentElement("info","htmlPreview").getElement();e.getContentElement("info","charPreview").getElement().setHtml(a);f.setHtml(CKEDITOR.tools.htmlEncode(a));b.getParent().addClass("cke_light_background");j=b}},d=function(c,b){b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());"a"==b.getName()&&(e.getContentElement("info","charPreview").getElement().setHtml(" "),e.getContentElement("info","htmlPreview").getElement().setHtml(" "),b.getParent().removeClass("cke_light_background"), +j=void 0)},n=CKEDITOR.tools.addFunction(function(c){var c=new CKEDITOR.dom.event(c),b=c.getTarget(),a;a=c.getKeystroke();var f="rtl"==i.lang.dir;switch(a){case 38:if(a=b.getParent().getParent().getPrevious())a=a.getChild([b.getParent().getIndex(),0]),a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 40:if(a=b.getParent().getParent().getNext())if((a=a.getChild([b.getParent().getIndex(),0]))&&1==a.type)a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 32:k({data:c});c.preventDefault(); +break;case f?37:39:if(a=b.getParent().getNext())a=a.getChild(0),1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);else if(a=b.getParent().getParent().getNext())(a=a.getChild([0,0]))&&1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);break;case f?39:37:(a=b.getParent().getPrevious())?(a=a.getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):(a=b.getParent().getParent().getPrevious())?(a=a.getLast().getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)): +d(null,b)}});return{title:l.title,minWidth:430,minHeight:280,buttons:[CKEDITOR.dialog.cancelButton],charColumns:17,onLoad:function(){for(var c=this.definition.charColumns,b=i.config.specialChars,a=CKEDITOR.tools.getNextId()+"_specialchar_table_label",f=[''],d=0,g=b.length,h,e;d');for(var j=0;j'+h+''+e+"")}else f.push('")}f.push("")}f.push("
         ');f.push("
        ",''+l.options+"");this.getContentElement("info","charContainer").getElement().setHtml(f.join(""))},contents:[{id:"info",label:i.lang.common.generalTab, +title:i.lang.common.generalTab,padding:0,align:"top",elements:[{type:"hbox",align:"top",widths:["320px","90px"],children:[{type:"html",id:"charContainer",html:"",onMouseover:g,onMouseout:d,focus:function(){var c=this.getElement().getElementsByTag("a").getItem(0);setTimeout(function(){c.focus();g(null,c)},0)},onShow:function(){var c=this.getElement().getChild([0,0,0,0,0]);setTimeout(function(){c.focus();g(null,c)},0)},onLoad:function(c){e=c.sender}},{type:"hbox",align:"top",widths:["100%"],children:[{type:"vbox", +align:"top",children:[{type:"html",html:"
        "},{type:"html",id:"charPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",html:"
         
        "},{type:"html",id:"htmlPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;", +html:"
         
        "}]}]}]}]}]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/stylesheetparser/plugin.js b/bower_components/ckeditor/plugins/stylesheetparser/plugin.js new file mode 100644 index 0000000..9609ff9 --- /dev/null +++ b/bower_components/ckeditor/plugins/stylesheetparser/plugin.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function h(b,e,c){var i=[],g=[],a;for(a=0;a|\+|~)/g," ");a=a.replace(/\[[^\]]*/g,"");a=a.replace(/#[^\s]*/g,"");a=a.replace(/\:{1,2}[^\s]*/g,"");a=a.replace(/\s+/g," ");a=a.split(" ");b=[];for(g=0;gl&&(l=e)}return l}function o(a){return function(){var e=this.getValue(),e=!!(CKEDITOR.dialog.validate.integer()(e)&&0n.getSize("width")?"100%":500:0,getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&& +a.updateStyle("width",this.getValue())},setup:function(a){this.setValue(a.getStyle("width"))},commit:k}]},{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtHeight",requiredContent:"table{height}",controlStyle:"width:5em",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles"); +a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:k}]},{type:"html",html:" "},{type:"text",id:"txtCellSpace",requiredContent:"table[cellspacing]",controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":a.filter.check("table[cellspacing]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing),setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellSpacing", +this.getValue()):d.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",requiredContent:"table[cellpadding]",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":a.filter.check("table[cellpadding]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellPadding",this.getValue()):d.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right", +html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",requiredContent:"caption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0b.indexOf("px")&&(b=b in j&&"none"!=a.getComputedStyle("border-style")?j[b]:0);return parseInt(b,10)}function w(a){var h=[],b=-1,j="rtl"==a.getComputedStyle("direction"),c;c=a.$.rows;for(var p=0,g,d,e,i=0,o=c.length;ip&&(p=g,d=e);c=d;p=new CKEDITOR.dom.element(a.$.tBodies[0]); +g=p.getDocumentPosition();d=0;for(e=c.cells.length;d',d);a.on("destroy",function(){e.remove()});s||d.getDocumentElement().append(e);this.attachTo=function(a){i|| +(s&&(d.getBody().append(e),k=0),g=a,e.setStyles({width:f(a.width),height:f(a.height),left:f(a.x),top:f(a.y)}),s&&e.setOpacity(0.25),e.on("mousedown",j,this),d.getBody().setStyle("cursor","col-resize"),e.show())};var r=this.move=function(a){if(!g)return 0;if(!i&&(ag.x+g.width))return g=null,i=k=0,d.removeListener("mouseup",c),e.removeListener("mousedown",j),e.removeListener("mousemove",p),d.getBody().setStyle("cursor","auto"),s?e.remove():e.hide(),0;a-=Math.round(e.$.offsetWidth/2);if(i){if(a== +y||a==z)return 1;a=Math.max(a,y);a=Math.min(a,z);k=a-o}e.setStyle("left",f(a));return 1}}function r(a){var h=a.data.getTarget();if("mouseout"==a.name){if(!h.is("table"))return;for(var b=new CKEDITOR.dom.element(a.data.$.relatedTarget||a.data.$.toElement);b&&b.$&&!b.equals(h)&&!b.is("body");)b=b.getParent();if(!b||b.equals(h))return}h.getAscendant("table",1).removeCustomData("_cke_table_pillars");a.removeListener()}var f=CKEDITOR.tools.cssLength,s=CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks); +CKEDITOR.plugins.add("tableresize",{requires:"tabletools",init:function(a){a.on("contentDom",function(){var h,b=a.editable();b.attachListener(b.isInline()?b:a.document,"mousemove",function(b){var b=b.data,c=b.getTarget();if(c.type==CKEDITOR.NODE_ELEMENT){var f=b.getPageOffset().x;if(h&&h.move(f))u(b);else if(c.is("table")||c.getAscendant("tbody",1))if(c=c.getAscendant("table",1),a.editable().contains(c)){if(!(b=c.getCustomData("_cke_table_pillars")))c.setCustomData("_cke_table_pillars",b=w(c)),c.on("mouseout", +r),c.on("mousedown",r);a:{for(var c=0,g=b.length;c=d.x&&f<=d.x+d.width){f=d;break a}}f=null}f&&(!h&&(h=new A(a)),h.attachTo(f))}}})})}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/tabletools/dialogs/tableCell.js b/bower_components/ckeditor/plugins/tabletools/dialogs/tableCell.js new file mode 100644 index 0000000..6efe765 --- /dev/null +++ b/bower_components/ckeditor/plugins/tabletools/dialogs/tableCell.js @@ -0,0 +1,17 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("cellProperties",function(g){function d(a){return function(b){for(var c=a(b[0]),d=1;d"+h.widthPx}]},f,{type:"select",id:"wordWrap",label:c.wordWrap,"default":"yes",items:[[c.yes,"yes"],[c.no,"no"]],setup:d(function(a){var b=a.getAttribute("noWrap");if("nowrap"==a.getStyle("white-space")|| +b)return"no"}),commit:function(a){"no"==this.getValue()?a.setStyle("white-space","nowrap"):a.removeStyle("white-space");a.removeAttribute("noWrap")}},f,{type:"select",id:"hAlign",label:c.hAlign,"default":"",items:[[e.notSet,""],[e.alignLeft,"left"],[e.alignCenter,"center"],[e.alignRight,"right"],[e.alignJustify,"justify"]],setup:d(function(a){var b=a.getAttribute("align");return a.getStyle("text-align")||b||""}),commit:function(a){var b=this.getValue();b?a.setStyle("text-align",b):a.removeStyle("text-align"); +a.removeAttribute("align")}},{type:"select",id:"vAlign",label:c.vAlign,"default":"",items:[[e.notSet,""],[e.alignTop,"top"],[e.alignMiddle,"middle"],[e.alignBottom,"bottom"],[c.alignBaseline,"baseline"]],setup:d(function(a){var b=a.getAttribute("vAlign"),a=a.getStyle("vertical-align");switch(a){case "top":case "middle":case "bottom":case "baseline":break;default:a=""}return a||b||""}),commit:function(a){var b=this.getValue();b?a.setStyle("vertical-align",b):a.removeStyle("vertical-align");a.removeAttribute("vAlign")}}]}, +f,{type:"vbox",padding:0,children:[{type:"select",id:"cellType",label:c.cellType,"default":"td",items:[[c.data,"td"],[c.header,"th"]],setup:d(function(a){return a.getName()}),commit:function(a){a.renameNode(this.getValue())}},f,{type:"text",id:"rowSpan",label:c.rowSpan,"default":"",validate:i.integer(c.invalidRowSpan),setup:d(function(a){if((a=parseInt(a.getAttribute("rowSpan"),10))&&1!=a)return a}),commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("rowSpan",this.getValue()): +a.removeAttribute("rowSpan")}},{type:"text",id:"colSpan",label:c.colSpan,"default":"",validate:i.integer(c.invalidColSpan),setup:d(function(a){if((a=parseInt(a.getAttribute("colSpan"),10))&&1!=a)return a}),commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("colSpan",this.getValue()):a.removeAttribute("colSpan")}},f,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"bgColor",label:c.bgColor,"default":"",setup:d(function(a){var b=a.getAttribute("bgColor"); +return a.getStyle("background-color")||b}),commit:function(a){this.getValue()?a.setStyle("background-color",this.getValue()):a.removeStyle("background-color");a.removeAttribute("bgColor")}},k?{type:"button",id:"bgColorChoose","class":"colorChooser",label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){g.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","bgColor").setValue(a);this.focus()},this)}}:f]},f, +{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"borderColor",label:c.borderColor,"default":"",setup:d(function(a){var b=a.getAttribute("borderColor");return a.getStyle("border-color")||b}),commit:function(a){this.getValue()?a.setStyle("border-color",this.getValue()):a.removeStyle("border-color");a.removeAttribute("borderColor")}},k?{type:"button",id:"borderColorChoose","class":"colorChooser",label:c.chooseColor,style:(m?"margin-right":"margin-left")+": 10px",onLoad:function(){this.getElement().getParent().setStyle("vertical-align", +"bottom")},onClick:function(){g.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","borderColor").setValue(a);this.focus()},this)}}:f]}]}]}]}],onShow:function(){this.cells=CKEDITOR.plugins.tabletools.getSelectedCells(this._.editor.getSelection());this.setupContent(this.cells)},onOk:function(){for(var a=this._.editor.getSelection(),b=a.createBookmarks(),c=this.cells,d=0;d
        '),d='';a.image&&b&&(d+='');d+='
        '+ +a.title+"
        ";a.description&&(d+=""+a.description+"");k.getFirst().setHtml(d+"
        ");k.on("click",function(){p(a.html)});return k}function p(a){var b=CKEDITOR.dialog.getCurrent();b.getValueOf("selectTpl","chkInsertOpt")?(c.fire("saveSnapshot"),c.setData(a,function(){b.hide();var a=c.createRange();a.moveToElementEditStart(c.editable());a.select();setTimeout(function(){c.fire("saveSnapshot")},0)})):(c.insertHtml(a),b.hide())}function i(a){var b=a.data.getTarget(), +c=g.equals(b);if(c||g.contains(b)){var d=a.data.getKeystroke(),f=g.getElementsByTag("a"),e;if(f){if(c)e=f.getItem(0);else switch(d){case 40:e=b.getNext();break;case 38:e=b.getPrevious();break;case 13:case 32:b.fire("click")}e&&(e.focus(),a.data.preventDefault())}}}var h=CKEDITOR.plugins.get("templates");CKEDITOR.document.appendStyleSheet(CKEDITOR.getUrl(h.path+"dialogs/templates.css"));var g,h="cke_tpl_list_label_"+CKEDITOR.tools.getNextNumber(),f=c.lang.templates,l=c.config;return{title:c.lang.templates.title, +minWidth:CKEDITOR.env.ie?440:400,minHeight:340,contents:[{id:"selectTpl",label:f.title,elements:[{type:"vbox",padding:5,children:[{id:"selectTplText",type:"html",html:""+f.selectPromptMsg+""},{id:"templatesList",type:"html",focus:!0,html:'
        '+f.options+""},{id:"chkInsertOpt",type:"checkbox",label:f.insertOption, +"default":l.templates_replaceContent}]}]}],buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var a=this.getContentElement("selectTpl","templatesList");g=a.getElement();CKEDITOR.loadTemplates(l.templates_files,function(){var b=(l.templates||"default").split(",");if(b.length){var c=g;c.setHtml("");for(var d=0,h=b.length;d'+f.emptyListMsg+"")});this._.element.on("keydown",i)},onHide:function(){this._.element.removeListener("keydown",i)}}})})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/icons/hidpi/templates-rtl.png b/bower_components/ckeditor/plugins/templates/icons/hidpi/templates-rtl.png new file mode 100644 index 0000000..9a26340 Binary files /dev/null and b/bower_components/ckeditor/plugins/templates/icons/hidpi/templates-rtl.png differ diff --git a/bower_components/ckeditor/plugins/templates/icons/hidpi/templates.png b/bower_components/ckeditor/plugins/templates/icons/hidpi/templates.png new file mode 100644 index 0000000..9a26340 Binary files /dev/null and b/bower_components/ckeditor/plugins/templates/icons/hidpi/templates.png differ diff --git a/bower_components/ckeditor/plugins/templates/icons/templates-rtl.png b/bower_components/ckeditor/plugins/templates/icons/templates-rtl.png new file mode 100644 index 0000000..202b604 Binary files /dev/null and b/bower_components/ckeditor/plugins/templates/icons/templates-rtl.png differ diff --git a/bower_components/ckeditor/plugins/templates/icons/templates.png b/bower_components/ckeditor/plugins/templates/icons/templates.png new file mode 100644 index 0000000..202b604 Binary files /dev/null and b/bower_components/ckeditor/plugins/templates/icons/templates.png differ diff --git a/bower_components/ckeditor/plugins/templates/lang/af.js b/bower_components/ckeditor/plugins/templates/lang/af.js new file mode 100644 index 0000000..3d31c9f --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/af.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","af",{button:"Sjablone",emptyListMsg:"(Geen sjablone gedefineer nie)",insertOption:"Vervang huidige inhoud",options:"Sjabloon opsies",selectPromptMsg:"Kies die sjabloon om te gebruik in die redigeerder (huidige inhoud gaan verlore):",title:"Inhoud Sjablone"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/ar.js b/bower_components/ckeditor/plugins/templates/lang/ar.js new file mode 100644 index 0000000..b4d6e74 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/ar.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","ar",{button:"القوالب",emptyListMsg:"(لم يتم تعريف أي قالب)",insertOption:"استبدال المحتوى",options:"خصائص القوالب",selectPromptMsg:"اختر القالب الذي تود وضعه في المحرر",title:"قوالب المحتوى"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/bg.js b/bower_components/ckeditor/plugins/templates/lang/bg.js new file mode 100644 index 0000000..766b87a --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/bg.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","bg",{button:"Шаблони",emptyListMsg:"(Няма дефинирани шаблони)",insertOption:"Препокрива актуалното съдържание",options:"Опции за шаблона",selectPromptMsg:"Изберете шаблон
        (текущото съдържание на редактора ще бъде загубено):",title:"Шаблони"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/bn.js b/bower_components/ckeditor/plugins/templates/lang/bn.js new file mode 100644 index 0000000..d8faf6f --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/bn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","bn",{button:"টেমপ্লেট",emptyListMsg:"(কোন টেমপ্লেট ডিফাইন করা নেই)",insertOption:"Replace actual contents",options:"Template Options",selectPromptMsg:"অনুগ্রহ করে এডিটরে ওপেন করার জন্য টেমপ্লেট বাছাই করুন
        (আসল কনটেন্ট হারিয়ে যাবে):",title:"কনটেন্ট টেমপ্লেট"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/bs.js b/bower_components/ckeditor/plugins/templates/lang/bs.js new file mode 100644 index 0000000..09cfcd7 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/bs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","bs",{button:"Templates",emptyListMsg:"(No templates defined)",insertOption:"Replace actual contents",options:"Template Options",selectPromptMsg:"Please select the template to open in the editor",title:"Content Templates"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/ca.js b/bower_components/ckeditor/plugins/templates/lang/ca.js new file mode 100644 index 0000000..5aec5ba --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","ca",{button:"Plantilles",emptyListMsg:"(No hi ha plantilles definides)",insertOption:"Reemplaça el contingut actual",options:"Opcions de plantilla",selectPromptMsg:"Seleccioneu una plantilla per usar a l'editor
        (per defecte s'elimina el contingut actual):",title:"Plantilles de contingut"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/cs.js b/bower_components/ckeditor/plugins/templates/lang/cs.js new file mode 100644 index 0000000..0ceb5a0 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/cs.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","cs",{button:"Šablony",emptyListMsg:"(Není definována žádná šablona)",insertOption:"Nahradit aktuální obsah",options:"Nastavení šablon",selectPromptMsg:"Prosím zvolte šablonu pro otevření v editoru
        (aktuální obsah editoru bude ztracen):",title:"Šablony obsahu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/cy.js b/bower_components/ckeditor/plugins/templates/lang/cy.js new file mode 100644 index 0000000..86896b0 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/cy.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","cy",{button:"Templedi",emptyListMsg:"(Dim templedi wedi'u diffinio)",insertOption:"Amnewid y cynnwys go iawn",options:"Opsiynau Templedi",selectPromptMsg:"Dewiswch dempled i'w agor yn y golygydd",title:"Templedi Cynnwys"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/da.js b/bower_components/ckeditor/plugins/templates/lang/da.js new file mode 100644 index 0000000..a7505cc --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/da.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","da",{button:"Skabeloner",emptyListMsg:"(Der er ikke defineret nogen skabelon)",insertOption:"Erstat det faktiske indhold",options:"Skabelon muligheder",selectPromptMsg:"Vælg den skabelon, som skal åbnes i editoren (nuværende indhold vil blive overskrevet):",title:"Indholdsskabeloner"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/de.js b/bower_components/ckeditor/plugins/templates/lang/de.js new file mode 100644 index 0000000..de5a761 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/de.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","de",{button:"Vorlagen",emptyListMsg:"(keine Vorlagen definiert)",insertOption:"Aktuellen Inhalt ersetzen",options:"Vorlagen Optionen",selectPromptMsg:"Klicken Sie auf eine Vorlage, um sie im Editor zu öffnen (der aktuelle Inhalt wird dabei gelöscht!):",title:"Vorlagen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/el.js b/bower_components/ckeditor/plugins/templates/lang/el.js new file mode 100644 index 0000000..ca7464d --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/el.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","el",{button:"Πρότυπα",emptyListMsg:"(Δεν έχουν καθοριστεί πρότυπα)",insertOption:"Αντικατάσταση υπάρχοντων περιεχομένων",options:"Επιλογές Προτύπου",selectPromptMsg:"Παρακαλώ επιλέξτε πρότυπο για εισαγωγή στο πρόγραμμα",title:"Πρότυπα Περιεχομένου"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/en-au.js b/bower_components/ckeditor/plugins/templates/lang/en-au.js new file mode 100644 index 0000000..65e5433 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/en-au.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","en-au",{button:"Templates",emptyListMsg:"(No templates defined)",insertOption:"Replace actual contents",options:"Template Options",selectPromptMsg:"Please select the template to open in the editor",title:"Content Templates"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/en-ca.js b/bower_components/ckeditor/plugins/templates/lang/en-ca.js new file mode 100644 index 0000000..5472454 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/en-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","en-ca",{button:"Templates",emptyListMsg:"(No templates defined)",insertOption:"Replace actual contents",options:"Template Options",selectPromptMsg:"Please select the template to open in the editor",title:"Content Templates"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/en-gb.js b/bower_components/ckeditor/plugins/templates/lang/en-gb.js new file mode 100644 index 0000000..ec9a7fd --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/en-gb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","en-gb",{button:"Templates",emptyListMsg:"(No templates defined)",insertOption:"Replace actual contents",options:"Template Options",selectPromptMsg:"Please select the template to open in the editor",title:"Content Templates"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/en.js b/bower_components/ckeditor/plugins/templates/lang/en.js new file mode 100644 index 0000000..c5fef88 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/en.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","en",{button:"Templates",emptyListMsg:"(No templates defined)",insertOption:"Replace actual contents",options:"Template Options",selectPromptMsg:"Please select the template to open in the editor",title:"Content Templates"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/eo.js b/bower_components/ckeditor/plugins/templates/lang/eo.js new file mode 100644 index 0000000..5d5afe6 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/eo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","eo",{button:"Ŝablonoj",emptyListMsg:"(Neniu ŝablono difinita)",insertOption:"Anstataŭigi la nunan enhavon",options:"Opcioj pri ŝablonoj",selectPromptMsg:"Bonvolu selekti la ŝablonon por malfermi ĝin en la redaktilo",title:"Enhavo de ŝablonoj"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/es.js b/bower_components/ckeditor/plugins/templates/lang/es.js new file mode 100644 index 0000000..c541e30 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/es.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","es",{button:"Plantillas",emptyListMsg:"(No hay plantillas definidas)",insertOption:"Reemplazar el contenido actual",options:"Opciones de plantillas",selectPromptMsg:"Por favor selecciona la plantilla a abrir en el editor
        (el contenido actual se perderá):",title:"Contenido de Plantillas"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/et.js b/bower_components/ckeditor/plugins/templates/lang/et.js new file mode 100644 index 0000000..7e5e585 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/et.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","et",{button:"Mall",emptyListMsg:"(Ühtegi malli ei ole defineeritud)",insertOption:"Praegune sisu asendatakse",options:"Malli valikud",selectPromptMsg:"Palun vali mall, mis avada redaktoris
        (praegune sisu läheb kaotsi):",title:"Sisumallid"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/eu.js b/bower_components/ckeditor/plugins/templates/lang/eu.js new file mode 100644 index 0000000..25b36ae --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/eu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","eu",{button:"Txantiloiak",emptyListMsg:"(Ez dago definitutako txantiloirik)",insertOption:"Ordeztu oraingo edukiak",options:"Txantiloi Aukerak",selectPromptMsg:"Mesedez txantiloia aukeratu editorean kargatzeko
        (orain dauden edukiak galduko dira):",title:"Eduki Txantiloiak"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/fa.js b/bower_components/ckeditor/plugins/templates/lang/fa.js new file mode 100644 index 0000000..b7a94ba --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/fa.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","fa",{button:"الگوها",emptyListMsg:"(الگوئی تعریف نشده است)",insertOption:"محتویات کنونی جایگزین شوند",options:"گزینه‌های الگو",selectPromptMsg:"لطفاً الگوی مورد نظر را برای بازکردن در ویرایشگر انتخاب کنید",title:"الگوهای محتویات"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/fi.js b/bower_components/ckeditor/plugins/templates/lang/fi.js new file mode 100644 index 0000000..e58e9e4 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/fi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","fi",{button:"Pohjat",emptyListMsg:"(Ei määriteltyjä pohjia)",insertOption:"Korvaa koko sisältö",options:"Sisältöpohjan ominaisuudet",selectPromptMsg:"Valitse editoriin avattava pohja",title:"Sisältöpohjat"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/fo.js b/bower_components/ckeditor/plugins/templates/lang/fo.js new file mode 100644 index 0000000..9ef42b3 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/fo.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","fo",{button:"Skabelónir",emptyListMsg:"(Ongar skabelónir tøkar)",insertOption:"Yvirskriva núverandi innihald",options:"Møguleikar fyri Template",selectPromptMsg:"Vinarliga vel ta skabelón, ið skal opnast í tekstviðgeranum
        (Hetta yvirskrivar núverandi innihald):",title:"Innihaldsskabelónir"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/fr-ca.js b/bower_components/ckeditor/plugins/templates/lang/fr-ca.js new file mode 100644 index 0000000..91003fc --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/fr-ca.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","fr-ca",{button:"Modèles",emptyListMsg:"(Aucun modèle disponible)",insertOption:"Remplacer tout le contenu actuel",options:"Options de modèles",selectPromptMsg:"Sélectionner le modèle à ouvrir dans l'éditeur",title:"Modèles de contenu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/fr.js b/bower_components/ckeditor/plugins/templates/lang/fr.js new file mode 100644 index 0000000..48cb6d3 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/fr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","fr",{button:"Modèles",emptyListMsg:"(Aucun modèle disponible)",insertOption:"Remplacer le contenu actuel",options:"Options des modèles",selectPromptMsg:"Veuillez sélectionner le modèle pour l'ouvrir dans l'éditeur",title:"Contenu des modèles"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/gl.js b/bower_components/ckeditor/plugins/templates/lang/gl.js new file mode 100644 index 0000000..24483d1 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/gl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","gl",{button:"Modelos",emptyListMsg:"(Non hai modelos definidos)",insertOption:"Substituír o contido actual",options:"Opcións de modelos",selectPromptMsg:"Seleccione o modelo a abrir no editor",title:"Modelos de contido"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/gu.js b/bower_components/ckeditor/plugins/templates/lang/gu.js new file mode 100644 index 0000000..ae12196 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/gu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","gu",{button:"ટેમ્પ્લેટ",emptyListMsg:"(કોઈ ટેમ્પ્લેટ ડિફાઇન નથી)",insertOption:"મૂળ શબ્દને બદલો",options:"ટેમ્પ્લેટના વિકલ્પો",selectPromptMsg:"એડિટરમાં ઓપન કરવા ટેમ્પ્લેટ પસંદ કરો (વર્તમાન કન્ટેન્ટ સેવ નહીં થાય):",title:"કન્ટેન્ટ ટેમ્પ્લેટ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/he.js b/bower_components/ckeditor/plugins/templates/lang/he.js new file mode 100644 index 0000000..0e970ca --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/he.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","he",{button:"תבניות",emptyListMsg:"(לא הוגדרו תבניות)",insertOption:"החלפת תוכן ממשי",options:"אפשרויות התבניות",selectPromptMsg:"יש לבחור תבנית לפתיחה בעורך.
        התוכן המקורי ימחק:",title:"תביות תוכן"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/hi.js b/bower_components/ckeditor/plugins/templates/lang/hi.js new file mode 100644 index 0000000..246bfe0 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/hi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","hi",{button:"टॅम्प्लेट",emptyListMsg:"(कोई टॅम्प्लेट डिफ़ाइन नहीं किया गया है)",insertOption:"मूल शब्दों को बदलें",options:"Template Options",selectPromptMsg:"ऍडिटर में ओपन करने हेतु टॅम्प्लेट चुनें(वर्तमान कन्टॅन्ट सेव नहीं होंगे):",title:"कन्टेन्ट टॅम्प्लेट"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/hr.js b/bower_components/ckeditor/plugins/templates/lang/hr.js new file mode 100644 index 0000000..3bc52ea --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/hr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","hr",{button:"Predlošci",emptyListMsg:"(Nema definiranih predložaka)",insertOption:"Zamijeni trenutne sadržaje",options:"Opcije predložaka",selectPromptMsg:"Molimo odaberite predložak koji želite otvoriti
        (stvarni sadržaj će biti izgubljen):",title:"Predlošci sadržaja"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/hu.js b/bower_components/ckeditor/plugins/templates/lang/hu.js new file mode 100644 index 0000000..90ccbb6 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/hu.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","hu",{button:"Sablonok",emptyListMsg:"(Nincs sablon megadva)",insertOption:"Kicseréli a jelenlegi tartalmat",options:"Sablon opciók",selectPromptMsg:"Válassza ki melyik sablon nyíljon meg a szerkesztőben
        (a jelenlegi tartalom elveszik):",title:"Elérhető sablonok"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/id.js b/bower_components/ckeditor/plugins/templates/lang/id.js new file mode 100644 index 0000000..8dc86b0 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/id.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","id",{button:"Contoh",emptyListMsg:"(Tidak ada contoh didefinisikan)",insertOption:"Ganti konten sebenarnya",options:"Opsi Contoh",selectPromptMsg:"Mohon pilih contoh untuk dibuka di editor",title:"Contoh Konten"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/is.js b/bower_components/ckeditor/plugins/templates/lang/is.js new file mode 100644 index 0000000..13e0736 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/is.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","is",{button:"Sniðmát",emptyListMsg:"(Ekkert sniðmát er skilgreint!)",insertOption:"Skipta út raunverulegu innihaldi",options:"Template Options",selectPromptMsg:"Veldu sniðmát til að opna í ritlinum.
        (Núverandi innihald víkur fyrir því!):",title:"Innihaldssniðmát"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/it.js b/bower_components/ckeditor/plugins/templates/lang/it.js new file mode 100644 index 0000000..c3303ce --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/it.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","it",{button:"Modelli",emptyListMsg:"(Nessun modello definito)",insertOption:"Cancella il contenuto corrente",options:"Opzioni del Modello",selectPromptMsg:"Seleziona il modello da aprire nell'editor",title:"Contenuto dei modelli"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/ja.js b/bower_components/ckeditor/plugins/templates/lang/ja.js new file mode 100644 index 0000000..dbf519c --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/ja.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","ja",{button:"テンプレート",emptyListMsg:"(テンプレートが定義されていません)",insertOption:"現在のエディタの内容と置き換えます",options:"テンプレートオプション",selectPromptMsg:"エディターで使用するテンプレートを選択してください。
        (現在のエディタの内容は失われます):",title:"内容テンプレート"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/ka.js b/bower_components/ckeditor/plugins/templates/lang/ka.js new file mode 100644 index 0000000..5864b75 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/ka.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","ka",{button:"თარგები",emptyListMsg:"(თარგი არაა განსაზღვრული)",insertOption:"მიმდინარე შეგთავსის შეცვლა",options:"თარგების პარამეტრები",selectPromptMsg:"აირჩიეთ თარგი რედაქტორისთვის",title:"თარგები"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/km.js b/bower_components/ckeditor/plugins/templates/lang/km.js new file mode 100644 index 0000000..14a0cf0 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/km.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","km",{button:"ពុម្ព​គំរូ",emptyListMsg:"(មិន​មាន​ពុម្ព​គំរូ​ត្រូវ​បាន​កំណត់)",insertOption:"ជំនួស​ក្នុង​មាតិកា​បច្ចុប្បន្ន",options:"ជម្រើស​ពុម្ព​គំរូ",selectPromptMsg:"សូម​រើស​ពុម្ព​គំរូ​ដើម្បី​បើក​ក្នុង​កម្មវិធី​សរសេរ​អត្ថបទ",title:"ពុម្ព​គំរូ​មាតិកា"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/ko.js b/bower_components/ckeditor/plugins/templates/lang/ko.js new file mode 100644 index 0000000..99c4f60 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/ko.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","ko",{button:"템플릿",emptyListMsg:"(템플릿이 없습니다.)",insertOption:"현재 내용 바꾸기",options:"템플릿 옵션",selectPromptMsg:"에디터에서 사용할 템플릿을 선택하십시요.
        (지금까지 작성된 내용은 사라집니다.):",title:"내용 템플릿"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/ku.js b/bower_components/ckeditor/plugins/templates/lang/ku.js new file mode 100644 index 0000000..a5bda7d --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/ku.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","ku",{button:"ڕووکار",emptyListMsg:"(هیچ ڕووکارێك دیارینەکراوە)",insertOption:"لە شوێن دانانی ئەم پێکهاتانەی ئێستا",options:"هەڵبژاردەکانی ڕووکار",selectPromptMsg:"ڕووکارێك هەڵبژێره بۆ کردنەوەی له سەرنووسەر:",title:"پێکهاتەی ڕووکار"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/lt.js b/bower_components/ckeditor/plugins/templates/lang/lt.js new file mode 100644 index 0000000..ebbf213 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/lt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","lt",{button:"Šablonai",emptyListMsg:"(Šablonų sąrašas tuščias)",insertOption:"Pakeisti dabartinį turinį pasirinktu šablonu",options:"Template Options",selectPromptMsg:"Pasirinkite norimą šabloną
        (Dėmesio! esamas turinys bus prarastas):",title:"Turinio šablonai"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/lv.js b/bower_components/ckeditor/plugins/templates/lang/lv.js new file mode 100644 index 0000000..a08ad5b --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/lv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","lv",{button:"Sagataves",emptyListMsg:"(Nav norādītas sagataves)",insertOption:"Aizvietot pašreizējo saturu",options:"Sagataves uzstādījumi",selectPromptMsg:"Lūdzu, norādiet sagatavi, ko atvērt editorā
        (patreizējie dati tiks zaudēti):",title:"Satura sagataves"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/mk.js b/bower_components/ckeditor/plugins/templates/lang/mk.js new file mode 100644 index 0000000..ade20ea --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/mk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","mk",{button:"Templates",emptyListMsg:"(No templates defined)",insertOption:"Replace actual contents",options:"Template Options",selectPromptMsg:"Please select the template to open in the editor",title:"Content Templates"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/mn.js b/bower_components/ckeditor/plugins/templates/lang/mn.js new file mode 100644 index 0000000..768bce5 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/mn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","mn",{button:"Загварууд",emptyListMsg:"(Загвар тодорхойлогдоогүй байна)",insertOption:"Одоогийн агууллагыг дарж бичих",options:"Template Options",selectPromptMsg:"Загварыг нээж editor-рүү сонгож оруулна уу
        (Одоогийн агууллагыг устаж магадгүй):",title:"Загварын агуулга"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/ms.js b/bower_components/ckeditor/plugins/templates/lang/ms.js new file mode 100644 index 0000000..5bf40cd --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/ms.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","ms",{button:"Templat",emptyListMsg:"(Tiada Templat Disimpan)",insertOption:"Replace actual contents",options:"Template Options",selectPromptMsg:"Sila pilih templat untuk dibuka oleh editor
        (kandungan sebenar akan hilang):",title:"Templat Kandungan"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/nb.js b/bower_components/ckeditor/plugins/templates/lang/nb.js new file mode 100644 index 0000000..5260dc8 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/nb.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","nb",{button:"Maler",emptyListMsg:"(Ingen maler definert)",insertOption:"Erstatt gjeldende innhold",options:"Alternativer for mal",selectPromptMsg:"Velg malen du vil åpne i redigeringsverktøyet:",title:"Innholdsmaler"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/nl.js b/bower_components/ckeditor/plugins/templates/lang/nl.js new file mode 100644 index 0000000..a752e4b --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/nl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","nl",{button:"Sjablonen",emptyListMsg:"(Geen sjablonen gedefinieerd)",insertOption:"Vervang de huidige inhoud",options:"Template opties",selectPromptMsg:"Selecteer het sjabloon dat in de editor geopend moet worden (de actuele inhoud gaat verloren):",title:"Inhoud sjablonen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/no.js b/bower_components/ckeditor/plugins/templates/lang/no.js new file mode 100644 index 0000000..cf5948b --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/no.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","no",{button:"Maler",emptyListMsg:"(Ingen maler definert)",insertOption:"Erstatt gjeldende innhold",options:"Alternativer for mal",selectPromptMsg:"Velg malen du vil åpne i redigeringsverktøyet:",title:"Innholdsmaler"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/pl.js b/bower_components/ckeditor/plugins/templates/lang/pl.js new file mode 100644 index 0000000..537d93c --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/pl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","pl",{button:"Szablony",emptyListMsg:"(Brak zdefiniowanych szablonów)",insertOption:"Zastąp obecną zawartość",options:"Opcje szablonów",selectPromptMsg:"Wybierz szablon do otwarcia w edytorze
        (obecna zawartość okna edytora zostanie utracona):",title:"Szablony zawartości"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/pt-br.js b/bower_components/ckeditor/plugins/templates/lang/pt-br.js new file mode 100644 index 0000000..6594950 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/pt-br.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","pt-br",{button:"Modelos de layout",emptyListMsg:"(Não foram definidos modelos de layout)",insertOption:"Substituir o conteúdo atual",options:"Opções de Template",selectPromptMsg:"Selecione um modelo de layout para ser aberto no editor
        (o conteúdo atual será perdido):",title:"Modelo de layout de conteúdo"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/pt.js b/bower_components/ckeditor/plugins/templates/lang/pt.js new file mode 100644 index 0000000..20135d3 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/pt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","pt",{button:"Modelos",emptyListMsg:"(Sem modelos definidos)",insertOption:"Substituir conteúdos atuais",options:"Opções do modelo",selectPromptMsg:"Por favor, selecione o modelo para abrir no editor",title:"Conteúdo dos Modelos"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/ro.js b/bower_components/ckeditor/plugins/templates/lang/ro.js new file mode 100644 index 0000000..8ef5d35 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/ro.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","ro",{button:"Template-uri (şabloane)",emptyListMsg:"(Niciun template (şablon) definit)",insertOption:"Înlocuieşte cuprinsul actual",options:"Opțiuni șabloane",selectPromptMsg:"Vă rugăm selectaţi template-ul (şablonul) ce se va deschide în editor
        (conţinutul actual va fi pierdut):",title:"Template-uri (şabloane) de conţinut"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/ru.js b/bower_components/ckeditor/plugins/templates/lang/ru.js new file mode 100644 index 0000000..201fa65 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/ru.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","ru",{button:"Шаблоны",emptyListMsg:"(не определено ни одного шаблона)",insertOption:"Заменить текущее содержимое",options:"Параметры шаблона",selectPromptMsg:"Пожалуйста, выберите, какой шаблон следует открыть в редакторе",title:"Шаблоны содержимого"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/si.js b/bower_components/ckeditor/plugins/templates/lang/si.js new file mode 100644 index 0000000..dc4ea69 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/si.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","si",{button:"අච්චුව",emptyListMsg:"කිසිම අච්චුවක් කලින් තීරණය කර ",insertOption:"සත්‍ය අන්තර්ගතයන් ප්‍රතිස්ථාපනය කරන්න",options:"අච්චු ",selectPromptMsg:"කරුණාකර සංස්කරණය සදහා අච්චුවක් ",title:"අන්තර්ගත් අච්චුන්"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/sk.js b/bower_components/ckeditor/plugins/templates/lang/sk.js new file mode 100644 index 0000000..60f3366 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/sk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","sk",{button:"Šablóny",emptyListMsg:"(Žiadne šablóny nedefinované)",insertOption:"Nahradiť aktuálny obsah",options:"Možnosti šablóny",selectPromptMsg:"Prosím vyberte šablónu na otvorenie v editore",title:"Šablóny obsahu"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/sl.js b/bower_components/ckeditor/plugins/templates/lang/sl.js new file mode 100644 index 0000000..db33ea9 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/sl.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","sl",{button:"Predloge",emptyListMsg:"(Ni pripravljenih predlog)",insertOption:"Zamenjaj trenutno vsebino",options:"Možnosti Predloge",selectPromptMsg:"Izberite predlogo, ki jo želite odpreti v urejevalniku
        (trenutna vsebina bo izgubljena):",title:"Vsebinske predloge"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/sq.js b/bower_components/ckeditor/plugins/templates/lang/sq.js new file mode 100644 index 0000000..f10c387 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/sq.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","sq",{button:"Shabllonet",emptyListMsg:"(Asnjë shabllon nuk është paradefinuar)",insertOption:"Zëvendëso përmbajtjen aktuale",options:"Opsionet e Shabllonit",selectPromptMsg:"Përzgjidhni shabllonin për të hapur tek redaktuesi",title:"Përmbajtja e Shabllonit"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/sr-latn.js b/bower_components/ckeditor/plugins/templates/lang/sr-latn.js new file mode 100644 index 0000000..9649883 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/sr-latn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","sr-latn",{button:"Obrasci",emptyListMsg:"(Nema definisanih obrazaca)",insertOption:"Replace actual contents",options:"Template Options",selectPromptMsg:"Molimo Vas da odaberete obrazac koji ce biti primenjen na stranicu (trenutni sadržaj ce biti obrisan):",title:"Obrasci za sadržaj"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/sr.js b/bower_components/ckeditor/plugins/templates/lang/sr.js new file mode 100644 index 0000000..fea8b5e --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/sr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","sr",{button:"Обрасци",emptyListMsg:"(Нема дефинисаних образаца)",insertOption:"Replace actual contents",options:"Template Options",selectPromptMsg:"Молимо Вас да одаберете образац који ће бити примењен на страницу (тренутни садржај ће бити обрисан):",title:"Обрасци за садржај"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/sv.js b/bower_components/ckeditor/plugins/templates/lang/sv.js new file mode 100644 index 0000000..78e82de --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/sv.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","sv",{button:"Sidmallar",emptyListMsg:"(Ingen mall är vald)",insertOption:"Ersätt aktuellt innehåll",options:"Inställningar för mall",selectPromptMsg:"Var god välj en mall att använda med editorn
        (allt nuvarande innehåll raderas):",title:"Sidmallar"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/th.js b/bower_components/ckeditor/plugins/templates/lang/th.js new file mode 100644 index 0000000..e9d8e6b --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/th.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","th",{button:"เทมเพลต",emptyListMsg:"(ยังไม่มีการกำหนดเทมเพลต)",insertOption:"แทนที่เนื้อหาเว็บไซต์ที่เลือก",options:"ตัวเลือกเกี่ยวกับเทมเพลท",selectPromptMsg:"กรุณาเลือก เทมเพลต เพื่อนำไปแก้ไขในอีดิตเตอร์
        (เนื้อหาส่วนนี้จะหายไป):",title:"เทมเพลตของส่วนเนื้อหาเว็บไซต์"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/tr.js b/bower_components/ckeditor/plugins/templates/lang/tr.js new file mode 100644 index 0000000..bd550fa --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/tr.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","tr",{button:"Şablonlar",emptyListMsg:"(Belirli bir şablon seçilmedi)",insertOption:"Mevcut içerik ile değiştir",options:"Şablon Seçenekleri",selectPromptMsg:"Düzenleyicide açmak için lütfen bir şablon seçin.
        (hali hazırdaki içerik kaybolacaktır.):",title:"İçerik Şablonları"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/tt.js b/bower_components/ckeditor/plugins/templates/lang/tt.js new file mode 100644 index 0000000..04f0c93 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/tt.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","tt",{button:"Шаблоннар",emptyListMsg:"(Шаблоннар билгеләнмәгән)",insertOption:"Әлеге эчтәлекне алмаштыру",options:"Шаблон үзлекләре",selectPromptMsg:"Please select the template to open in the editor",title:"Эчтәлек шаблоннары"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/ug.js b/bower_components/ckeditor/plugins/templates/lang/ug.js new file mode 100644 index 0000000..bb66471 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/ug.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","ug",{button:"قېلىپ",emptyListMsg:"(قېلىپ يوق)",insertOption:"نۆۋەتتىكى مەزمۇننى ئالماشتۇر",options:"قېلىپ تاللانمىسى",selectPromptMsg:"تەھرىرلىگۈچنىڭ مەزمۇن قېلىپىنى تاللاڭ:",title:"مەزمۇن قېلىپى"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/uk.js b/bower_components/ckeditor/plugins/templates/lang/uk.js new file mode 100644 index 0000000..9e54398 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/uk.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","uk",{button:"Шаблони",emptyListMsg:"(Не знайдено жодного шаблону)",insertOption:"Замінити поточний вміст",options:"Опції шаблону",selectPromptMsg:"Оберіть, будь ласка, шаблон для відкриття в редакторі
        (поточний зміст буде втрачено):",title:"Шаблони змісту"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/vi.js b/bower_components/ckeditor/plugins/templates/lang/vi.js new file mode 100644 index 0000000..3c182f4 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/vi.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","vi",{button:"Mẫu dựng sẵn",emptyListMsg:"(Không có mẫu dựng sẵn nào được định nghĩa)",insertOption:"Thay thế nội dung hiện tại",options:"Tùy chọn mẫu dựng sẵn",selectPromptMsg:"Hãy chọn mẫu dựng sẵn để mở trong trình biên tập
        (nội dung hiện tại sẽ bị mất):",title:"Nội dung Mẫu dựng sẵn"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/zh-cn.js b/bower_components/ckeditor/plugins/templates/lang/zh-cn.js new file mode 100644 index 0000000..f021648 --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/zh-cn.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","zh-cn",{button:"模板",emptyListMsg:"(没有模板)",insertOption:"替换当前内容",options:"模板选项",selectPromptMsg:"请选择要在编辑器中使用的模板:",title:"内容模板"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/lang/zh.js b/bower_components/ckeditor/plugins/templates/lang/zh.js new file mode 100644 index 0000000..dd974df --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/lang/zh.js @@ -0,0 +1 @@ +CKEDITOR.plugins.setLang("templates","zh",{button:"範本",emptyListMsg:"(尚未定義任何範本)",insertOption:"替代實際內容",options:"範本選項",selectPromptMsg:"請選擇要在編輯器中開啟的範本。",title:"內容範本"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/plugin.js b/bower_components/ckeditor/plugins/templates/plugin.js new file mode 100644 index 0000000..3315fdd --- /dev/null +++ b/bower_components/ckeditor/plugins/templates/plugin.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){CKEDITOR.plugins.add("templates",{requires:"dialog",lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",icons:"templates,templates-rtl",hidpi:!0,init:function(a){CKEDITOR.dialog.add("templates",CKEDITOR.getUrl(this.path+"dialogs/templates.js"));a.addCommand("templates",new CKEDITOR.dialogCommand("templates"));a.ui.addButton&& +a.ui.addButton("Templates",{label:a.lang.templates.button,command:"templates",toolbar:"doctools,10"})}});var c={},f={};CKEDITOR.addTemplates=function(a,d){c[a]=d};CKEDITOR.getTemplates=function(a){return c[a]};CKEDITOR.loadTemplates=function(a,d){for(var e=[],b=0,c=a.length;bType the title here

        Type the text here

        '},{title:"Strange Template",image:"template2.gif",description:"A template that defines two colums, each one with a title, and some text.", +html:'

        Title 1

        Title 2

        Text 1Text 2

        More text goes here.

        '},{title:"Text and Table",image:"template3.gif",description:"A title with some text and a table.",html:'

        Title goes here

        Table title
           
           
           

        Type the text here

        '}]}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/templates/templates/images/template1.gif b/bower_components/ckeditor/plugins/templates/templates/images/template1.gif new file mode 100644 index 0000000..efdabbe Binary files /dev/null and b/bower_components/ckeditor/plugins/templates/templates/images/template1.gif differ diff --git a/bower_components/ckeditor/plugins/templates/templates/images/template2.gif b/bower_components/ckeditor/plugins/templates/templates/images/template2.gif new file mode 100644 index 0000000..d1cebb3 Binary files /dev/null and b/bower_components/ckeditor/plugins/templates/templates/images/template2.gif differ diff --git a/bower_components/ckeditor/plugins/templates/templates/images/template3.gif b/bower_components/ckeditor/plugins/templates/templates/images/template3.gif new file mode 100644 index 0000000..db41cb4 Binary files /dev/null and b/bower_components/ckeditor/plugins/templates/templates/images/template3.gif differ diff --git a/bower_components/ckeditor/plugins/uicolor/dialogs/uicolor.js b/bower_components/ckeditor/plugins/uicolor/dialogs/uicolor.js new file mode 100644 index 0000000..0476969 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/dialogs/uicolor.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("uicolor",function(b){function f(a){/^#/.test(a)&&(a=window.YAHOO.util.Color.hex2rgb(a.substr(1)));c.setValue(a,!0);c.refresh(e)}function g(a){b.setUiColor(a);d._.contents.tab1.configBox.setValue('config.uiColor = "#'+c.get("hex")+'"')}var d,c,h=b.getUiColor(),e="cke_uicolor_picker"+CKEDITOR.tools.getNextNumber();return{title:b.lang.uicolor.title,minWidth:360,minHeight:320,onLoad:function(){d=this;this.setupContent();CKEDITOR.env.ie7Compat&&d.parts.contents.setStyle("overflow", +"hidden")},contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[{id:"yuiColorPicker",type:"html",html:"
        ",onLoad:function(){var a=CKEDITOR.getUrl("plugins/uicolor/yui/");this.picker=c=new window.YAHOO.widget.ColorPicker(e,{showhsvcontrols:!0,showhexcontrols:!0,images:{PICKER_THUMB:a+"assets/picker_thumb.png",HUE_THUMB:a+"assets/hue_thumb.png"}});h&&f(h);c.on("rgbChange",function(){d._.contents.tab1.predefined.setValue(""); +g("#"+c.get("hex"))});for(var a=new CKEDITOR.dom.nodeList(c.getElementsByTagName("input")),b=0;b
         
        '}]},{id:"configBox",type:"text",label:b.lang.uicolor.config,onShow:function(){var a=b.getUiColor();a&&this.setValue('config.uiColor = "'+a+'"')}}]}]}],buttons:[CKEDITOR.dialog.okButton]}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/icons/hidpi/uicolor.png b/bower_components/ckeditor/plugins/uicolor/icons/hidpi/uicolor.png new file mode 100644 index 0000000..e6efa4a Binary files /dev/null and b/bower_components/ckeditor/plugins/uicolor/icons/hidpi/uicolor.png differ diff --git a/bower_components/ckeditor/plugins/uicolor/icons/uicolor.png b/bower_components/ckeditor/plugins/uicolor/icons/uicolor.png new file mode 100644 index 0000000..d5739df Binary files /dev/null and b/bower_components/ckeditor/plugins/uicolor/icons/uicolor.png differ diff --git a/bower_components/ckeditor/plugins/uicolor/lang/_translationstatus.txt b/bower_components/ckeditor/plugins/uicolor/lang/_translationstatus.txt new file mode 100644 index 0000000..f37bceb --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/_translationstatus.txt @@ -0,0 +1,27 @@ +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license + +bg.js Found: 4 Missing: 0 +cs.js Found: 4 Missing: 0 +cy.js Found: 4 Missing: 0 +da.js Found: 4 Missing: 0 +de.js Found: 4 Missing: 0 +el.js Found: 4 Missing: 0 +eo.js Found: 4 Missing: 0 +et.js Found: 4 Missing: 0 +fa.js Found: 4 Missing: 0 +fi.js Found: 4 Missing: 0 +fr.js Found: 4 Missing: 0 +he.js Found: 4 Missing: 0 +hr.js Found: 4 Missing: 0 +it.js Found: 4 Missing: 0 +mk.js Found: 4 Missing: 0 +nb.js Found: 4 Missing: 0 +nl.js Found: 4 Missing: 0 +no.js Found: 4 Missing: 0 +pl.js Found: 4 Missing: 0 +tr.js Found: 4 Missing: 0 +ug.js Found: 4 Missing: 0 +uk.js Found: 4 Missing: 0 +vi.js Found: 4 Missing: 0 +zh-cn.js Found: 4 Missing: 0 diff --git a/bower_components/ckeditor/plugins/uicolor/lang/af.js b/bower_components/ckeditor/plugins/uicolor/lang/af.js new file mode 100644 index 0000000..6b67d50 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/af.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","af",{title:"UI kleur keuse",preview:"Voorskou",config:"Voeg hierdie in jou config.js lêr in",predefined:"Voordefinieerte kleur keuses"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/ar.js b/bower_components/ckeditor/plugins/uicolor/lang/ar.js new file mode 100644 index 0000000..56143ce --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/ar.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","ar",{title:"منتقي الألوان",preview:"معاينة مباشرة",config:"قص السطر إلى الملف config.js",predefined:"مجموعات ألوان معرفة مسبقا"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/bg.js b/bower_components/ckeditor/plugins/uicolor/lang/bg.js new file mode 100644 index 0000000..d4b991e --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/bg.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","bg",{title:"ПИ избор на цвят",preview:"Преглед",config:"Вмъкнете този низ във Вашия config.js fajl",predefined:"Предефинирани цветови палитри"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/ca.js b/bower_components/ckeditor/plugins/uicolor/lang/ca.js new file mode 100644 index 0000000..d1a03f4 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/ca.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","ca",{title:"UI Color Picker",preview:"Vista prèvia",config:"Enganxa aquest text dins el fitxer config.js",predefined:"Conjunts de colors predefinits"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/cs.js b/bower_components/ckeditor/plugins/uicolor/lang/cs.js new file mode 100644 index 0000000..6a97d78 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/cs.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","cs",{title:"Výběr barvy rozhraní",preview:"Živý náhled",config:"Vložte tento řetězec do vašeho souboru config.js",predefined:"Přednastavené sady barev"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/cy.js b/bower_components/ckeditor/plugins/uicolor/lang/cy.js new file mode 100644 index 0000000..774335c --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/cy.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","cy",{title:"Dewisydd Lliwiau'r UI",preview:"Rhagolwg Byw",config:"Gludwch y llinyn hwn i'ch ffeil config.js",predefined:"Setiau lliw wedi'u cyn-ddiffinio"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/da.js b/bower_components/ckeditor/plugins/uicolor/lang/da.js new file mode 100644 index 0000000..e3ce47e --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/da.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","da",{title:"Brugerflade på farvevælger",preview:"Vis liveeksempel",config:"Indsæt denne streng i din config.js fil",predefined:"Prædefinerede farveskemaer"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/de.js b/bower_components/ckeditor/plugins/uicolor/lang/de.js new file mode 100644 index 0000000..99d6c9d --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/de.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","de",{title:"UI Pipette",preview:"Live-Vorschau",config:"Fügen Sie diese Zeichenfolge in die 'config.js' Datei.",predefined:"Vordefinierte Farbsätze"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/el.js b/bower_components/ckeditor/plugins/uicolor/lang/el.js new file mode 100644 index 0000000..7857a9b --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/el.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","el",{title:"Διεπαφή Επιλογής Χρωμάτων",preview:"Ζωντανή Προεπισκόπηση",config:"Επικολλήστε αυτό το κείμενο στο αρχείο config.js",predefined:"Προκαθορισμένα σύνολα χρωμάτων"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/en-gb.js b/bower_components/ckeditor/plugins/uicolor/lang/en-gb.js new file mode 100644 index 0000000..b486d3c --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/en-gb.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","en-gb",{title:"UI Colour Picker",preview:"Live preview",config:"Paste this string into your config.js file",predefined:"Predefined colour sets"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/en.js b/bower_components/ckeditor/plugins/uicolor/lang/en.js new file mode 100644 index 0000000..ce67f53 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/en.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","en",{title:"UI Color Picker",preview:"Live preview",config:"Paste this string into your config.js file",predefined:"Predefined color sets"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/eo.js b/bower_components/ckeditor/plugins/uicolor/lang/eo.js new file mode 100644 index 0000000..68398e5 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/eo.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","eo",{title:"UI Kolorselektilo",preview:"Vidigi la aspekton",config:"Gluu tiun signoĉenon en vian dosieron config.js",predefined:"Antaŭdifinita koloraro"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/es.js b/bower_components/ckeditor/plugins/uicolor/lang/es.js new file mode 100644 index 0000000..cc65363 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/es.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","es",{title:"Recolector de Color de Interfaz de Usuario",preview:"Vista previa en vivo",config:"Pega esta cadena en tu archivo config.js",predefined:"Conjuntos predefinidos de colores"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/et.js b/bower_components/ckeditor/plugins/uicolor/lang/et.js new file mode 100644 index 0000000..52c608f --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/et.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","et",{title:"Värvivalija kasutajaliides",preview:"Automaatne eelvaade",config:"Aseta see sõne oma config.js faili.",predefined:"Eelmääratud värvikomplektid"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/eu.js b/bower_components/ckeditor/plugins/uicolor/lang/eu.js new file mode 100644 index 0000000..87c412f --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/eu.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","eu",{title:"EI Kolore Hautatzailea",preview:"Zuzeneko aurreikuspena",config:"Itsatsi karaktere kate hau zure config.js fitxategian.",predefined:"Aurredefinitutako kolore multzoak"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/fa.js b/bower_components/ckeditor/plugins/uicolor/lang/fa.js new file mode 100644 index 0000000..f853ef9 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/fa.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","fa",{title:"انتخاب رنگ رابط کاربری",preview:"پیش‌نمایش زنده",config:"این رشته را در پروندهٔ config.js خود رونوشت کنید.",predefined:"مجموعه رنگ از پیش تعریف شده"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/fi.js b/bower_components/ckeditor/plugins/uicolor/lang/fi.js new file mode 100644 index 0000000..c58d54c --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/fi.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","fi",{title:"Käyttöliittymän väripaletti",preview:"Esikatsele heti",config:"Liitä tämä merkkijono config.js tiedostoosi",predefined:"Esimääritellyt värijoukot"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/fr-ca.js b/bower_components/ckeditor/plugins/uicolor/lang/fr-ca.js new file mode 100644 index 0000000..bd49fa4 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/fr-ca.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","fr-ca",{title:"Sélecteur de couleur",preview:"Aperçu",config:"Insérez cette ligne dans votre fichier config.js",predefined:"Ensemble de couleur prédéfinies"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/fr.js b/bower_components/ckeditor/plugins/uicolor/lang/fr.js new file mode 100644 index 0000000..3bd42d0 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/fr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","fr",{title:"UI Sélecteur de couleur",preview:"Aperçu",config:"Collez cette chaîne de caractères dans votre fichier config.js",predefined:"Palettes de couleurs prédéfinies"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/gl.js b/bower_components/ckeditor/plugins/uicolor/lang/gl.js new file mode 100644 index 0000000..97e33cc --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/gl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","gl",{title:"Recolledor de cor da interface de usuario",preview:"Vista previa en vivo",config:"Pegue esta cadea no seu ficheiro config.js",predefined:"Conxuntos predefinidos de cores"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/he.js b/bower_components/ckeditor/plugins/uicolor/lang/he.js new file mode 100644 index 0000000..0f2325e --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/he.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","he",{title:"בחירת צבע ממשק משתמש",preview:"תצוגה מקדימה",config:"הדבק את הטקסט הבא לתוך הקובץ config.js",predefined:"קבוצות צבעים מוגדרות מראש"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/hr.js b/bower_components/ckeditor/plugins/uicolor/lang/hr.js new file mode 100644 index 0000000..7bf0470 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/hr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","hr",{title:"UI odabir boja",preview:"Pregled uživo",config:"Zalijepite ovaj tekst u Vašu config.js datoteku.",predefined:"Već postavljeni setovi boja"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/hu.js b/bower_components/ckeditor/plugins/uicolor/lang/hu.js new file mode 100644 index 0000000..a58bb43 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/hu.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","hu",{title:"UI Színválasztó",preview:"Élő előnézet",config:"Illessze be ezt a szöveget a config.js fájlba",predefined:"Előre definiált színbeállítások"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/id.js b/bower_components/ckeditor/plugins/uicolor/lang/id.js new file mode 100644 index 0000000..d64862d --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/id.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","id",{title:"Pengambil Warna UI",preview:"Pratinjau",config:"Tempel string ini ke arsip config.js anda.",predefined:"Set warna belum terdefinisi."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/it.js b/bower_components/ckeditor/plugins/uicolor/lang/it.js new file mode 100644 index 0000000..37752d4 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/it.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","it",{title:"Selettore Colore UI",preview:"Anteprima Live",config:"Incolla questa stringa nel tuo file config.js",predefined:"Set di colori predefiniti"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/ja.js b/bower_components/ckeditor/plugins/uicolor/lang/ja.js new file mode 100644 index 0000000..e745cb0 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/ja.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","ja",{title:"UIカラーピッカー",preview:"ライブプレビュー",config:"この文字列を config.js ファイルへ貼り付け",predefined:"既定カラーセット"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/km.js b/bower_components/ckeditor/plugins/uicolor/lang/km.js new file mode 100644 index 0000000..379804d --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/km.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","km",{title:"ប្រដាប់​រើស​ពណ៌",preview:"មើល​ជាមុន​ផ្ទាល់",config:"បិទ​ភ្ជាប់​ខ្សែ​អក្សរ​នេះ​ទៅ​ក្នុង​ឯកសារ config.js របស់​អ្នក",predefined:"ឈុត​ពណ៌​កំណត់​រួច​ស្រេច"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/ko.js b/bower_components/ckeditor/plugins/uicolor/lang/ko.js new file mode 100644 index 0000000..2767fb2 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/ko.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","ko",{title:"UI 색상 선택기",preview:"미리보기",config:"이 문자열을 config.js 에 붙여넣으세요",predefined:"미리 정의된 색깔들"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/ku.js b/bower_components/ckeditor/plugins/uicolor/lang/ku.js new file mode 100644 index 0000000..fd9fa92 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/ku.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","ku",{title:"هەڵگری ڕەنگ بۆ ڕووکاری بەکارهێنەر",preview:"پێشبینین بە زیندوویی",config:"ئەم دەقانە بلکێنە بە پەڕگەی config.js-fil",predefined:"کۆمەڵە ڕەنگە دیاریکراوەکانی پێشوو"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/lv.js b/bower_components/ckeditor/plugins/uicolor/lang/lv.js new file mode 100644 index 0000000..3984314 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/lv.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","lv",{title:"UI krāsas izvēle",preview:"Priekšskatījums",config:"Ielīmējiet šo rindu jūsu config.js failā",predefined:"Predefinēti krāsu komplekti"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/mk.js b/bower_components/ckeditor/plugins/uicolor/lang/mk.js new file mode 100644 index 0000000..e7bdee4 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/mk.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","mk",{title:"Палета со бои",preview:"Преглед",config:"Залепи го овој текст во config.js датотеката",predefined:"Предефинирани множества на бои"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/nb.js b/bower_components/ckeditor/plugins/uicolor/lang/nb.js new file mode 100644 index 0000000..5b82456 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/nb.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","nb",{title:"Fargevelger for brukergrensesnitt",preview:"Forhåndsvisning i sanntid",config:"Lim inn følgende tekst i din config.js-fil",predefined:"Forhåndsdefinerte fargesett"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/nl.js b/bower_components/ckeditor/plugins/uicolor/lang/nl.js new file mode 100644 index 0000000..2e7280a --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/nl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","nl",{title:"UI Kleurenkiezer",preview:"Live voorbeeld",config:"Plak deze tekst in jouw config.js bestand",predefined:"Voorgedefinieerde kleurensets"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/no.js b/bower_components/ckeditor/plugins/uicolor/lang/no.js new file mode 100644 index 0000000..7f91bd1 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/no.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","no",{title:"Fargevelger for brukergrensesnitt",preview:"Forhåndsvisning i sanntid",config:"Lim inn følgende tekst i din config.js-fil",predefined:"Forhåndsdefinerte fargesett"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/pl.js b/bower_components/ckeditor/plugins/uicolor/lang/pl.js new file mode 100644 index 0000000..8ba0df5 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/pl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","pl",{title:"Wybór koloru interfejsu",preview:"Podgląd na żywo",config:"Wklej poniższy łańcuch znaków do pliku config.js:",predefined:"Predefiniowane zestawy kolorów"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/pt-br.js b/bower_components/ckeditor/plugins/uicolor/lang/pt-br.js new file mode 100644 index 0000000..594f7f9 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/pt-br.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","pt-br",{title:"Paleta de Cores",preview:"Visualização ao vivo",config:"Cole o texto no seu arquivo config.js",predefined:"Conjuntos de cores predefinidos"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/pt.js b/bower_components/ckeditor/plugins/uicolor/lang/pt.js new file mode 100644 index 0000000..a5c3752 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/pt.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","pt",{title:"Seleção de Cor da IU",preview:"Pré-visualização ao vivo ",config:"Colar este item no seu ficheiro config.js",predefined:"Conjuntos de cor predefinidos"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/ru.js b/bower_components/ckeditor/plugins/uicolor/lang/ru.js new file mode 100644 index 0000000..a3a9248 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/ru.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","ru",{title:"Выбор цвета интерфейса",preview:"Предпросмотр в реальном времени",config:"Вставьте эту строку в файл config.js",predefined:"Предопределенные цветовые схемы"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/si.js b/bower_components/ckeditor/plugins/uicolor/lang/si.js new file mode 100644 index 0000000..aefbe8c --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/si.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","si",{title:"වර්ණ ",preview:"සජීව නැවත නරභීම",config:"මෙම අක්ෂර පේලිය ගෙන config.js ලිපිගොනුව මතින් තබන්න",predefined:"කලින් වෙන්කරගත් පරිදි ඇති වර්ණ"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/sk.js b/bower_components/ckeditor/plugins/uicolor/lang/sk.js new file mode 100644 index 0000000..033b075 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/sk.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","sk",{title:"UI výber farby",preview:"Živý náhľad",config:"Vložte tento reťazec do vášho config.js súboru",predefined:"Preddefinované sady farieb"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/sl.js b/bower_components/ckeditor/plugins/uicolor/lang/sl.js new file mode 100644 index 0000000..d46f6d3 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/sl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","sl",{title:"UI Izbiralec Barve",preview:"Živi predogled",config:"Prilepite ta niz v vašo config.js datoteko",predefined:"Vnaprej določeni barvni kompleti"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/sq.js b/bower_components/ckeditor/plugins/uicolor/lang/sq.js new file mode 100644 index 0000000..8b525d5 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/sq.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","sq",{title:"UI Mbledhës i Ngjyrave",preview:"Parapamje direkte",config:"Hidhni këtë varg në skedën tuaj config.js",predefined:"Setet e paradefinuara të ngjyrave"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/sv.js b/bower_components/ckeditor/plugins/uicolor/lang/sv.js new file mode 100644 index 0000000..b3ad9d4 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/sv.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","sv",{title:"UI Färgväljare",preview:"Live förhandsgranskning",config:"Klistra in den här strängen i din config.js-fil",predefined:"Fördefinierade färguppsättningar"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/tr.js b/bower_components/ckeditor/plugins/uicolor/lang/tr.js new file mode 100644 index 0000000..9b529be --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/tr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","tr",{title:"UI Renk Seçici",preview:"Canlı ön izleme",config:"Bu yazıyı config.js dosyasının içine yapıştırın",predefined:"Önceden tanımlı renk seti"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/tt.js b/bower_components/ckeditor/plugins/uicolor/lang/tt.js new file mode 100644 index 0000000..acca2c5 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/tt.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","tt",{title:"Интерфейс төсләрен сайлау",preview:"Тере карап алу",config:"Бу юлны config.js файлына языгыз",predefined:"Баштан билгеләнгән төсләр җыелмасы"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/ug.js b/bower_components/ckeditor/plugins/uicolor/lang/ug.js new file mode 100644 index 0000000..12eaba3 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/ug.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","ug",{title:"ئىشلەتكۈچى ئارايۈزى رەڭ تاللىغۇچ",preview:"شۇئان ئالدىن كۆزىتىش",config:"بۇ ھەرپ تىزىقىنى config.js ھۆججەتكە چاپلايدۇ",predefined:"ئالدىن بەلگىلەنگەن رەڭلەر"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/uk.js b/bower_components/ckeditor/plugins/uicolor/lang/uk.js new file mode 100644 index 0000000..f3f7d58 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/uk.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","uk",{title:"Color Picker Інтерфейс",preview:"Перегляд наживо",config:"Вставте цей рядок у файл config.js",predefined:"Стандартний набір кольорів"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/vi.js b/bower_components/ckeditor/plugins/uicolor/lang/vi.js new file mode 100644 index 0000000..aa961cd --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/vi.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","vi",{title:"Giao diện người dùng Color Picker",preview:"Xem trước trực tiếp",config:"Dán chuỗi này vào tập tin config.js của bạn",predefined:"Tập màu định nghĩa sẵn"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/zh-cn.js b/bower_components/ckeditor/plugins/uicolor/lang/zh-cn.js new file mode 100644 index 0000000..5e9c98b --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/zh-cn.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","zh-cn",{title:"用户界面颜色选择器",preview:"即时预览",config:"粘贴此字符串到您的 config.js 文件",predefined:"预定义颜色集"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/lang/zh.js b/bower_components/ckeditor/plugins/uicolor/lang/zh.js new file mode 100644 index 0000000..64e6774 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/lang/zh.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("uicolor","zh",{title:"UI 色彩選擇器",preview:"即時預覽",config:"請將此段字串複製到您的 config.js 檔案中。",predefined:"設定預先定義的色彩"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/plugin.js b/bower_components/ckeditor/plugins/uicolor/plugin.js new file mode 100644 index 0000000..0eb3920 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/plugin.js @@ -0,0 +1,6 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.add("uicolor",{requires:"dialog",lang:"af,ar,bg,ca,cs,cy,da,de,el,en,en-gb,eo,es,et,eu,fa,fi,fr,fr-ca,gl,he,hr,hu,id,it,ja,km,ko,ku,lv,mk,nb,nl,no,pl,pt,pt-br,ru,si,sk,sl,sq,sv,tr,tt,ug,uk,vi,zh,zh-cn",icons:"uicolor",hidpi:!0,init:function(a){CKEDITOR.env.ie6Compat||(a.addCommand("uicolor",new CKEDITOR.dialogCommand("uicolor")),a.ui.addButton&&a.ui.addButton("UIColor",{label:a.lang.uicolor.title,command:"uicolor",toolbar:"tools,1"}),CKEDITOR.dialog.add("uicolor",this.path+"dialogs/uicolor.js"), +CKEDITOR.scriptLoader.load(CKEDITOR.getUrl("plugins/uicolor/yui/yui.js")),CKEDITOR.document.appendStyleSheet(CKEDITOR.getUrl("plugins/uicolor/yui/assets/yui.css")))}}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/uicolor/yui/assets/hue_bg.png b/bower_components/ckeditor/plugins/uicolor/yui/assets/hue_bg.png new file mode 100644 index 0000000..d9bcdeb Binary files /dev/null and b/bower_components/ckeditor/plugins/uicolor/yui/assets/hue_bg.png differ diff --git a/bower_components/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png b/bower_components/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png new file mode 100644 index 0000000..14d5db4 Binary files /dev/null and b/bower_components/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png differ diff --git a/bower_components/ckeditor/plugins/uicolor/yui/assets/picker_mask.png b/bower_components/ckeditor/plugins/uicolor/yui/assets/picker_mask.png new file mode 100644 index 0000000..f8d9193 Binary files /dev/null and b/bower_components/ckeditor/plugins/uicolor/yui/assets/picker_mask.png differ diff --git a/bower_components/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png b/bower_components/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png new file mode 100644 index 0000000..78445a2 Binary files /dev/null and b/bower_components/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png differ diff --git a/bower_components/ckeditor/plugins/uicolor/yui/assets/yui.css b/bower_components/ckeditor/plugins/uicolor/yui/assets/yui.css new file mode 100644 index 0000000..5b5a519 --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/yui/assets/yui.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.cke_uicolor_picker .yui-picker-panel{background:#e3e3e3;border-color:#888;}.cke_uicolor_picker .yui-picker-panel .hd{background-color:#ccc;font-size:100%;line-height:100%;border:1px solid #e3e3e3;font-weight:bold;overflow:hidden;padding:6px;color:#000;}.cke_uicolor_picker .yui-picker-panel .bd{background:#e8e8e8;margin:1px;height:200px;}.cke_uicolor_picker .yui-picker-panel .ft{background:#e8e8e8;margin:1px;padding:1px;}.cke_uicolor_picker .yui-picker{position:relative;}.cke_uicolor_picker .yui-picker-hue-thumb{cursor:default;width:18px;height:18px;top:-8px;left:-2px;z-index:9;position:absolute;}.cke_uicolor_picker .yui-picker-hue-bg{-moz-outline:none;outline:0 none;position:absolute;left:200px;height:183px;width:14px;background:url(hue_bg.png) no-repeat;top:4px;}.cke_uicolor_picker .yui-picker-bg{-moz-outline:none;outline:0 none;position:absolute;top:4px;left:4px;height:182px;width:182px;background-color:#F00;background-image:url(picker_mask.png);}*html .cke_uicolor_picker .yui-picker-bg{background-image:none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='picker_mask.png',sizingMethod='scale');}.cke_uicolor_picker .yui-picker-mask{position:absolute;z-index:1;top:0;left:0;}.cke_uicolor_picker .yui-picker-thumb{cursor:default;width:11px;height:11px;z-index:9;position:absolute;top:-4px;left:-4px;}.cke_uicolor_picker .yui-picker-swatch{position:absolute;left:240px;top:4px;height:60px;width:55px;border:1px solid #888;}.cke_uicolor_picker .yui-picker-websafe-swatch{position:absolute;left:304px;top:4px;height:24px;width:24px;border:1px solid #888;}.cke_uicolor_picker .yui-picker-controls{position:absolute;top:72px;left:226px;font:1em monospace;}.cke_uicolor_picker .yui-picker-controls .hd{background:transparent;border-width:0!important;}.cke_uicolor_picker .yui-picker-controls .bd{height:100px;border-width:0!important;}.cke_uicolor_picker .yui-picker-controls ul{float:left;padding:0 2px 0 0;margin:0;}.cke_uicolor_picker .yui-picker-controls li{padding:2px;list-style:none;margin:0;}.cke_uicolor_picker .yui-picker-controls input{font-size:.85em;width:2.4em;}.cke_uicolor_picker .yui-picker-hex-controls{clear:both;padding:2px;}.cke_uicolor_picker .yui-picker-hex-controls input{width:4.6em;}.cke_uicolor_picker .yui-picker-controls a{font:1em arial,helvetica,clean,sans-serif;display:block;*display:inline-block;padding:0;color:#000;} diff --git a/bower_components/ckeditor/plugins/uicolor/yui/yui.js b/bower_components/ckeditor/plugins/uicolor/yui/yui.js new file mode 100644 index 0000000..cb187dd --- /dev/null +++ b/bower_components/ckeditor/plugins/uicolor/yui/yui.js @@ -0,0 +1,225 @@ +if("undefined"==typeof YAHOO||!YAHOO)var YAHOO={};YAHOO.namespace=function(){var c=arguments,e=null,b,d,a;for(b=0;b "),c.isObject(a[d])?i.push(0h)break;i=a.indexOf("}",h);if(h+1>=i)break;k=n=a.substring(h+1,i);l=null;j=k.indexOf(" ");-1b.ie&&(j=g=2,h=e.compatMode,m=o(e.documentElement,"borderLeftWidth"),e=o(e.documentElement,"borderTopWidth"),6===b.ie&&"BackCompat"!==h&&(j=g=0),"BackCompat"==h&&("medium"!==m&& +(g=parseInt(m,10)),"medium"!==e&&(j=parseInt(e,10))),f[0]-=g,f[1]-=j);if(d||a)f[0]+=a,f[1]+=d;f[0]=k(f[0]);f[1]=k(f[1])}return f}:function(a){var d,f,e,g=!1,j=a;if(c.Dom._canPosition(a)){g=[a.offsetLeft,a.offsetTop];d=c.Dom.getDocumentScrollLeft(a.ownerDocument);f=c.Dom.getDocumentScrollTop(a.ownerDocument);for(e=m||519=this.left&&c.right<=this.right&&c.top>=this.top&&c.bottom<=this.bottom};YAHOO.util.Region.prototype.getArea=function(){return(this.bottom-this.top)*(this.right-this.left)};YAHOO.util.Region.prototype.intersect=function(c){var e=Math.max(this.top,c.top),b=Math.min(this.right,c.right),d=Math.min(this.bottom,c.bottom),c=Math.max(this.left,c.left);return d>=e&&b>=c?new YAHOO.util.Region(e,b,d,c):null}; +YAHOO.util.Region.prototype.union=function(c){var e=Math.min(this.top,c.top),b=Math.max(this.right,c.right),d=Math.max(this.bottom,c.bottom),c=Math.min(this.left,c.left);return new YAHOO.util.Region(e,b,d,c)};YAHOO.util.Region.prototype.toString=function(){return"Region {top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+", height: "+this.height+", width: "+this.width+"}"}; +YAHOO.util.Region.getRegion=function(c){var e=YAHOO.util.Dom.getXY(c);return new YAHOO.util.Region(e[1],e[0]+c.offsetWidth,e[1]+c.offsetHeight,e[0])};YAHOO.util.Point=function(c,e){YAHOO.lang.isArray(c)&&(e=c[1],c=c[0]);YAHOO.util.Point.superclass.constructor.call(this,e,c,e,c)};YAHOO.extend(YAHOO.util.Point,YAHOO.util.Region); +(function(){var c=YAHOO.util,e=/^width|height$/,b=/^(\d[.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz|%){1}?/i,d={get:function(a,d){var e="",e=a.currentStyle[d];return e="opacity"===d?c.Dom.getStyle(a,"opacity"):!e||e.indexOf&&-1d&&(c=d-(a[j]-d)),a.style[b]="auto")):(!a.style[k]&&!a.style[b]&&(a.style[b]=d),c=a.style[k]);return c+"px"},getBorderWidth:function(a,b){var d=null;a.currentStyle.hasLayout||(a.style.zoom=1);switch(b){case "borderTopWidth":d=a.clientTop;break;case "borderBottomWidth":d=a.offsetHeight-a.clientHeight-a.clientTop;break;case "borderLeftWidth":d=a.clientLeft;break;case "borderRightWidth":d=a.offsetWidth-a.clientWidth-a.clientLeft}return d+"px"},getPixel:function(a, +b){var d=null,c=a.currentStyle.right;a.style.right=a.currentStyle[b];d=a.style.pixelRight;a.style.right=c;return d+"px"},getMargin:function(a,b){return"auto"==a.currentStyle[b]?"0px":c.Dom.IE.ComputedStyle.getPixel(a,b)},getVisibility:function(a,b){for(var d;(d=a.currentStyle)&&"inherit"==d[b];)a=a.parentNode;return d?d[b]:"visible"},getColor:function(a,b){return c.Dom.Color.toRGB(a.currentStyle[b])||"transparent"},getBorderColor:function(a,b){var d=a.currentStyle;return c.Dom.Color.toRGB(c.Dom.Color.toHex(d[b]|| +d.color))}},a={};a.top=a.right=a.bottom=a.left=a.width=a.height=d.getOffset;a.color=d.getColor;a.borderTopWidth=a.borderRightWidth=a.borderBottomWidth=a.borderLeftWidth=d.getBorderWidth;a.marginTop=a.marginRight=a.marginBottom=a.marginLeft=d.getMargin;a.visibility=d.getVisibility;a.borderColor=a.borderTopColor=a.borderRightColor=a.borderBottomColor=a.borderLeftColor=d.getBorderColor;c.Dom.IE_COMPUTED=a;c.Dom.IE_ComputedStyle=d})(); +(function(){var c=parseInt,e=RegExp,b=YAHOO.util;b.Dom.Color={KEYWORDS:{black:"000",silver:"c0c0c0",gray:"808080",white:"fff",maroon:"800000",red:"f00",purple:"800080",fuchsia:"f0f",green:"008000",lime:"0f0",olive:"808000",yellow:"ff0",navy:"000080",blue:"00f",teal:"008080",aqua:"0ff"},re_RGB:/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,re_hex:/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,re_hex3:/([0-9A-F])/gi,toRGB:function(d){b.Dom.Color.re_RGB.test(d)||(d=b.Dom.Color.toHex(d));b.Dom.Color.re_hex.exec(d)&& +(d="rgb("+[c(e.$1,16),c(e.$2,16),c(e.$3,16)].join(", ")+")");return d},toHex:function(d){d=b.Dom.Color.KEYWORDS[d]||d;if(b.Dom.Color.re_RGB.exec(d))var d=1===e.$2.length?"0"+e.$2:Number(e.$2),a=1===e.$3.length?"0"+e.$3:Number(e.$3),d=[(1===e.$1.length?"0"+e.$1:Number(e.$1)).toString(16),d.toString(16),a.toString(16)].join("");6>d.length&&(d=d.replace(b.Dom.Color.re_hex3,"$1$1"));"transparent"!==d&&0>d.indexOf("#")&&(d="#"+d);return d.toLowerCase()}}})(); +YAHOO.register("dom",YAHOO.util.Dom,{version:"2.7.0",build:"1796"});YAHOO.util.CustomEvent=function(c,e,b,d){this.type=c;this.scope=e||window;this.silent=b;this.signature=d||YAHOO.util.CustomEvent.LIST;this.subscribers=[];"_YUICEOnSubscribe"!==c&&(this.subscribeEvent=new YAHOO.util.CustomEvent("_YUICEOnSubscribe",this,!0));this.lastError=null};YAHOO.util.CustomEvent.LIST=0;YAHOO.util.CustomEvent.FLAT=1; +YAHOO.util.CustomEvent.prototype={subscribe:function(c,e,b){if(!c)throw Error("Invalid callback for subscriber to '"+this.type+"'");this.subscribeEvent&&this.subscribeEvent.fire(c,e,b);this.subscribers.push(new YAHOO.util.Subscriber(c,e,b))},unsubscribe:function(c,e){if(!c)return this.unsubscribeAll();for(var b=!1,d=0,a=this.subscribers.length;dthis.webkit&& +("click"==b||"dblclick"==b)},removeListener:function(d,c,f,g){var j,h,k;if("string"==typeof d)d=this.getEl(d);else if(this._isValidCollection(d)){g=!0;for(j=d.length-1;-1c.webkit?c._dri=setInterval(function(){var b=document.readyState;if("loaded"==b||"complete"==b)clearInterval(c._dri),c._dri=null,c._ready()},c.POLL_INTERVAL):c._simpleAdd(document,"DOMContentLoaded",c._ready);c._simpleAdd(window,"load",c._load);c._simpleAdd(window,"unload",c._unload);c._tryPreloadAttach()}());YAHOO.util.EventProvider=function(){}; +YAHOO.util.EventProvider.prototype={__yui_events:null,__yui_subscribers:null,subscribe:function(c,e,b,d){this.__yui_events=this.__yui_events||{};var a=this.__yui_events[c];if(a)a.subscribe(e,b,d);else{a=this.__yui_subscribers=this.__yui_subscribers||{};a[c]||(a[c]=[]);a[c].push({fn:e,obj:b,overrideContext:d})}},unsubscribe:function(c,e,b){var d=this.__yui_events=this.__yui_events||{};if(c){if(d=d[c])return d.unsubscribe(e,b)}else{var c=true,a;for(a in d)YAHOO.lang.hasOwnProperty(d,a)&&(c=c&&d[a].unsubscribe(e, +b));return c}return false},unsubscribeAll:function(c){return this.unsubscribe(c)},createEvent:function(c,e){this.__yui_events=this.__yui_events||{};var b=e||{},d=this.__yui_events;if(!d[c]){var a=new YAHOO.util.CustomEvent(c,b.scope||this,b.silent,YAHOO.util.CustomEvent.FLAT);d[c]=a;b.onSubscribeCallback&&a.subscribeEvent.subscribe(b.onSubscribeCallback);this.__yui_subscribers=this.__yui_subscribers||{};if(b=this.__yui_subscribers[c])for(var f=0;fthis.clickPixelThresh||c>this.clickPixelThresh)&&this.startDrag(this.startX,this.startY)}if(this.dragThreshMet){if(d&& +d.events.b4Drag){d.b4Drag(b);d.fireEvent("b4DragEvent",{e:b})}if(d&&d.events.drag){d.onDrag(b);d.fireEvent("dragEvent",{e:b})}d&&this.fireEvents(b,false)}this.stopEvent(b)}},fireEvents:function(b,d){var a=this.dragCurrent;if(a&&!a.isLocked()&&!a.dragOnly){var c=YAHOO.util.Event.getPageX(b),e=YAHOO.util.Event.getPageY(b),h=new YAHOO.util.Point(c,e),e=a.getTargetCoord(h.x,h.y),i=a.getDragEl(),c=["out","over","drop","enter"],j=new YAHOO.util.Region(e.y,e.x+i.offsetWidth,e.y+i.offsetHeight,e.x),k=[], +l={},e=[],i={outEvts:[],overEvts:[],dropEvts:[],enterEvts:[]},m;for(m in this.dragOvers){var n=this.dragOvers[m];if(this.isTypeOfDD(n)){this.isOverTarget(h,n,this.mode,j)||i.outEvts.push(n);k[m]=true;delete this.dragOvers[m]}}for(var o in a.groups)if("string"==typeof o)for(m in this.ids[o]){n=this.ids[o][m];if(this.isTypeOfDD(n)&&n.isTarget&&(!n.isLocked()&&n!=a)&&this.isOverTarget(h,n,this.mode,j)){l[o]=true;if(d)i.dropEvts.push(n);else{k[n.id]?i.overEvts.push(n):i.enterEvts.push(n);this.dragOvers[n.id]= +n}}}this.interactionInfo={out:i.outEvts,enter:i.enterEvts,over:i.overEvts,drop:i.dropEvts,point:h,draggedRegion:j,sourceRegion:this.locationCache[a.id],validDrop:d};for(var r in l)e.push(r);if(d&&!i.dropEvts.length){this.interactionInfo.validDrop=false;if(a.events.invalidDrop){a.onInvalidDrop(b);a.fireEvent("invalidDropEvent",{e:b})}}for(m=0;m2E3)){setTimeout(b._addListeners,10);if(document&&document.body)b._timeoutCount=b._timeoutCount+1}},handleWasClicked:function(b,d){if(this.isHandle(d,b.id))return true;for(var a=b.parentNode;a;){if(this.isHandle(d,a.id))return true;a=a.parentNode}return false}}}(), +YAHOO.util.DDM=YAHOO.util.DragDropMgr,YAHOO.util.DDM._addListeners()); +(function(){var c=YAHOO.util.Event,e=YAHOO.util.Dom;YAHOO.util.DragDrop=function(b,d,a){b&&this.init(b,d,a)};YAHOO.util.DragDrop.prototype={events:null,on:function(){this.subscribe.apply(this,arguments)},id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:false,lock:function(){this.locked=true},unlock:function(){this.locked=false},isTarget:true,padding:null,dragOnly:false,useShim:false, +_domRef:null,__ygDragDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,deltaX:0,deltaY:0,maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,available:false,hasOuterHandles:false,cursorIsOver:false,overlap:null,b4StartDrag:function(){},startDrag:function(){},b4Drag:function(){},onDrag:function(){},onDragEnter:function(){},b4DragOver:function(){},onDragOver:function(){},b4DragOut:function(){},onDragOut:function(){},b4DragDrop:function(){},onDragDrop:function(){}, +onInvalidDrop:function(){},b4EndDrag:function(){},endDrag:function(){},b4MouseDown:function(){},onMouseDown:function(){},onMouseUp:function(){},onAvailable:function(){},getEl:function(){if(!this._domRef)this._domRef=e.get(this.id);return this._domRef},getDragEl:function(){return e.get(this.dragElId)},init:function(b,d,a){this.initTarget(b,d,a);c.on(this._domRef||this.id,"mousedown",this.handleMouseDown,this,true);for(var e in this.events)this.createEvent(e+"Event")},initTarget:function(b,d,a){this.config= +a||{};this.events={};this.DDM=YAHOO.util.DDM;this.groups={};if(typeof b!=="string"){this._domRef=b;b=e.generateId(b)}this.id=b;this.addToGroup(d?d:"default");this.handleElId=b;c.onAvailable(b,this.handleOnAvailable,this,true);this.setDragElId(b);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig()},applyConfig:function(){this.events={mouseDown:true,b4MouseDown:true,mouseUp:true,b4StartDrag:true,startDrag:true,b4EndDrag:true,endDrag:true,drag:true, +b4Drag:true,invalidDrop:true,b4DragOut:true,dragOut:true,dragEnter:true,b4DragOver:true,dragOver:true,b4DragDrop:true,dragDrop:true};if(this.config.events)for(var b in this.config.events)this.config.events[b]===false&&(this.events[b]=false);this.padding=this.config.padding||[0,0,0,0];this.isTarget=this.config.isTarget!==false;this.maintainOffset=this.config.maintainOffset;this.primaryButtonOnly=this.config.primaryButtonOnly!==false;this.dragOnly=this.config.dragOnly===true?true:false;this.useShim= +this.config.useShim===true?true:false},handleOnAvailable:function(){this.available=true;this.resetConstraints();this.onAvailable()},setPadding:function(b,d,a,c){this.padding=!d&&0!==d?[b,b,b,b]:!a&&0!==a?[b,d,b,d]:[b,d,a,c]},setInitPosition:function(b,d){var a=this.getEl();if(this.DDM.verifyEl(a)){var c=b||0,g=d||0,a=e.getXY(a);this.initPageX=a[0]-c;this.initPageY=a[1]-g;this.lastPageX=a[0];this.lastPageY=a[1];this.setStartPosition(a)}},setStartPosition:function(b){b=b||e.getXY(this.getEl());this.deltaSetXY= +null;this.startPageX=b[0];this.startPageY=b[1]},addToGroup:function(b){this.groups[b]=true;this.DDM.regDragDrop(this,b)},removeFromGroup:function(b){this.groups[b]&&delete this.groups[b];this.DDM.removeDDFromGroup(this,b)},setDragElId:function(b){this.dragElId=b},setHandleElId:function(b){typeof b!=="string"&&(b=e.generateId(b));this.handleElId=b;this.DDM.regHandle(this.id,b)},setOuterHandleElId:function(b){typeof b!=="string"&&(b=e.generateId(b));c.on(b,"mousedown",this.handleMouseDown,this,true); +this.setHandleElId(b);this.hasOuterHandles=true},unreg:function(){c.removeListener(this.id,"mousedown",this.handleMouseDown);this._domRef=null;this.DDM._remove(this)},isLocked:function(){return this.DDM.isLocked()||this.locked},handleMouseDown:function(b){var d=b.which||b.button;if(!(this.primaryButtonOnly&&d>1)&&!this.isLocked()){var d=this.b4MouseDown(b),a=true;this.events.b4MouseDown&&(a=this.fireEvent("b4MouseDownEvent",b));var e=this.onMouseDown(b),g=true;this.events.mouseDown&&(g=this.fireEvent("mouseDownEvent", +b));if(!(d===false||e===false||a===false||g===false)){this.DDM.refreshCache(this.groups);d=new YAHOO.util.Point(c.getPageX(b),c.getPageY(b));if((this.hasOuterHandles||this.DDM.isOverTarget(d,this))&&this.clickValidator(b)){this.setStartPosition();this.DDM.handleMouseDown(b,this);this.DDM.stopEvent(b)}}}},clickValidator:function(b){b=YAHOO.util.Event.getTarget(b);return this.isValidHandleChild(b)&&(this.id==this.handleElId||this.DDM.handleWasClicked(b,this.id))},getTargetCoord:function(b,d){var a= +b-this.deltaX,c=d-this.deltaY;if(this.constrainX){if(athis.maxX)a=this.maxX}if(this.constrainY){if(cthis.maxY)c=this.maxY}a=this.getTick(a,this.xTicks);c=this.getTick(c,this.yTicks);return{x:a,y:c}},addInvalidHandleType:function(b){b=b.toUpperCase();this.invalidHandleTypes[b]=b},addInvalidHandleId:function(b){typeof b!=="string"&&(b=e.generateId(b));this.invalidHandleIds[b]=b},addInvalidHandleClass:function(b){this.invalidHandleClasses.push(b)}, +removeInvalidHandleType:function(b){delete this.invalidHandleTypes[b.toUpperCase()]},removeInvalidHandleId:function(b){typeof b!=="string"&&(b=e.generateId(b));delete this.invalidHandleIds[b]},removeInvalidHandleClass:function(b){for(var d=0,a=this.invalidHandleClasses.length;d=this.minX;c=c-d)if(!a[c]){this.xTicks[this.xTicks.length]=c;a[c]=true}for(c=this.initPageX;c<=this.maxX;c=c+d)if(!a[c]){this.xTicks[this.xTicks.length]=c;a[c]=true}this.xTicks.sort(this.DDM.numericSort)},setYTicks:function(b,d){this.yTicks=[];this.yTickSize=d;for(var a={},c=this.initPageY;c>=this.minY;c= +c-d)if(!a[c]){this.yTicks[this.yTicks.length]=c;a[c]=true}for(c=this.initPageY;c<=this.maxY;c=c+d)if(!a[c]){this.yTicks[this.yTicks.length]=c;a[c]=true}this.yTicks.sort(this.DDM.numericSort)},setXConstraint:function(b,d,a){this.leftConstraint=parseInt(b,10);this.rightConstraint=parseInt(d,10);this.minX=this.initPageX-this.leftConstraint;this.maxX=this.initPageX+this.rightConstraint;a&&this.setXTicks(this.initPageX,a);this.constrainX=true},clearConstraints:function(){this.constrainY=this.constrainX= +false;this.clearTicks()},clearTicks:function(){this.yTicks=this.xTicks=null;this.yTickSize=this.xTickSize=0},setYConstraint:function(b,d,a){this.topConstraint=parseInt(b,10);this.bottomConstraint=parseInt(d,10);this.minY=this.initPageY-this.topConstraint;this.maxY=this.initPageY+this.bottomConstraint;a&&this.setYTicks(this.initPageY,a);this.constrainY=true},resetConstraints:function(){this.initPageX||this.initPageX===0?this.setInitPosition(this.maintainOffset?this.lastPageX-this.initPageX:0,this.maintainOffset? +this.lastPageY-this.initPageY:0):this.setInitPosition();this.constrainX&&this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize);this.constrainY&&this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize)},getTick:function(b,d){if(d){if(d[0]>=b)return d[0];for(var a=0,c=d.length;a=b)return d[e]-b>b-d[a]?d[a]:d[e]}return d[d.length-1]}return b},toString:function(){return"DragDrop "+this.id}};YAHOO.augment(YAHOO.util.DragDrop,YAHOO.util.EventProvider)})(); +YAHOO.util.DD=function(c,e,b){c&&this.init(c,e,b)}; +YAHOO.extend(YAHOO.util.DD,YAHOO.util.DragDrop,{scroll:!0,autoOffset:function(c,e){this.setDelta(c-this.startPageX,e-this.startPageY)},setDelta:function(c,e){this.deltaX=c;this.deltaY=e},setDragElPos:function(c,e){this.alignElWithMouse(this.getDragEl(),c,e)},alignElWithMouse:function(c,e,b){var d=this.getTargetCoord(e,b);if(this.deltaSetXY){YAHOO.util.Dom.setStyle(c,"left",d.x+this.deltaSetXY[0]+"px");YAHOO.util.Dom.setStyle(c,"top",d.y+this.deltaSetXY[1]+"px")}else{YAHOO.util.Dom.setXY(c,[d.x,d.y]); +e=parseInt(YAHOO.util.Dom.getStyle(c,"left"),10);b=parseInt(YAHOO.util.Dom.getStyle(c,"top"),10);this.deltaSetXY=[e-d.x,b-d.y]}this.cachePosition(d.x,d.y);var a=this;setTimeout(function(){a.autoScroll.call(a,d.x,d.y,c.offsetHeight,c.offsetWidth)},0)},cachePosition:function(c,e){if(c){this.lastPageX=c;this.lastPageY=e}else{var b=YAHOO.util.Dom.getXY(this.getEl());this.lastPageX=b[0];this.lastPageY=b[1]}},autoScroll:function(c,e,b,d){if(this.scroll){var a=this.DDM.getClientHeight(),f=this.DDM.getClientWidth(), +g=this.DDM.getScrollTop(),h=this.DDM.getScrollLeft(),d=d+c,i=a+g-e-this.deltaY,j=f+h-c-this.deltaX,k=document.all?80:30;b+e>a&&i<40&&window.scrollTo(h,g+k);e0&&e-g<40)&&window.scrollTo(h,g-k);d>f&&j<40&&window.scrollTo(h+k,g);c0&&c-h<40)&&window.scrollTo(h-k,g)}},applyConfig:function(){YAHOO.util.DD.superclass.applyConfig.call(this);this.scroll=this.config.scroll!==false},b4MouseDown:function(c){this.setStartPosition();this.autoOffset(YAHOO.util.Event.getPageX(c),YAHOO.util.Event.getPageY(c))}, +b4Drag:function(c){this.setDragElPos(YAHOO.util.Event.getPageX(c),YAHOO.util.Event.getPageY(c))},toString:function(){return"DD "+this.id}});YAHOO.util.DDProxy=function(c,e,b){if(c){this.init(c,e,b);this.initFrame()}};YAHOO.util.DDProxy.dragElId="ygddfdiv"; +YAHOO.extend(YAHOO.util.DDProxy,YAHOO.util.DD,{resizeFrame:!0,centerFrame:!1,createFrame:function(){var c=this,e=document.body;if(!e||!e.firstChild)setTimeout(function(){c.createFrame()},50);else{var b=this.getDragEl(),d=YAHOO.util.Dom;if(!b){b=document.createElement("div");b.id=this.dragElId;var a=b.style;a.position="absolute";a.visibility="hidden";a.cursor="move";a.border="2px solid #aaa";a.zIndex=999;a.height="25px";a.width="25px";a=document.createElement("div");d.setStyle(a,"height","100%");d.setStyle(a, +"width","100%");d.setStyle(a,"background-color","#ccc");d.setStyle(a,"opacity","0");b.appendChild(a);e.insertBefore(b,e.firstChild)}}},initFrame:function(){this.createFrame()},applyConfig:function(){YAHOO.util.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=this.config.resizeFrame!==false;this.centerFrame=this.config.centerFrame;this.setDragElId(this.config.dragElId||YAHOO.util.DDProxy.dragElId)},showFrame:function(c,e){this.getEl();var b=this.getDragEl(),d=b.style;this._resizeProxy(); +this.centerFrame&&this.setDelta(Math.round(parseInt(d.width,10)/2),Math.round(parseInt(d.height,10)/2));this.setDragElPos(c,e);YAHOO.util.Dom.setStyle(b,"visibility","visible")},_resizeProxy:function(){if(this.resizeFrame){var c=YAHOO.util.Dom,e=this.getEl(),b=this.getDragEl(),d=parseInt(c.getStyle(b,"borderTopWidth"),10),a=parseInt(c.getStyle(b,"borderRightWidth"),10),f=parseInt(c.getStyle(b,"borderBottomWidth"),10),g=parseInt(c.getStyle(b,"borderLeftWidth"),10);isNaN(d)&&(d=0);isNaN(a)&&(a=0);isNaN(f)&& +(f=0);isNaN(g)&&(g=0);a=Math.max(0,e.offsetWidth-a-g);e=Math.max(0,e.offsetHeight-d-f);c.setStyle(b,"width",a+"px");c.setStyle(b,"height",e+"px")}},b4MouseDown:function(c){this.setStartPosition();var e=YAHOO.util.Event.getPageX(c),c=YAHOO.util.Event.getPageY(c);this.autoOffset(e,c)},b4StartDrag:function(c,e){this.showFrame(c,e)},b4EndDrag:function(){YAHOO.util.Dom.setStyle(this.getDragEl(),"visibility","hidden")},endDrag:function(){var c=YAHOO.util.Dom,e=this.getEl(),b=this.getDragEl();c.setStyle(b, +"visibility","");c.setStyle(e,"visibility","hidden");YAHOO.util.DDM.moveToEl(e,b);c.setStyle(b,"visibility","hidden");c.setStyle(e,"visibility","")},toString:function(){return"DDProxy "+this.id}});YAHOO.util.DDTarget=function(c,e,b){c&&this.initTarget(c,e,b)};YAHOO.extend(YAHOO.util.DDTarget,YAHOO.util.DragDrop,{toString:function(){return"DDTarget "+this.id}});YAHOO.register("dragdrop",YAHOO.util.DragDropMgr,{version:"2.7.0",build:"1796"}); +(function(){function c(a,b,d,e){c.ANIM_AVAIL=!YAHOO.lang.isUndefined(YAHOO.util.Anim);if(a){this.init(a,b,true);this.initSlider(e);this.initThumb(d)}}var e=YAHOO.util.Dom.getXY,b=YAHOO.util.Event,d=Array.prototype.slice;YAHOO.lang.augmentObject(c,{getHorizSlider:function(a,b,d,e,i){return new c(a,a,new YAHOO.widget.SliderThumb(b,a,d,e,0,0,i),"horiz")},getVertSlider:function(a,b,d,e,i){return new c(a,a,new YAHOO.widget.SliderThumb(b,a,0,0,d,e,i),"vert")},getSliderRegion:function(a,b,d,e,i,j,k){return new c(a, +a,new YAHOO.widget.SliderThumb(b,a,d,e,i,j,k),"region")},SOURCE_UI_EVENT:1,SOURCE_SET_VALUE:2,SOURCE_KEY_EVENT:3,ANIM_AVAIL:false},true);YAHOO.extend(c,YAHOO.util.DragDrop,{_mouseDown:false,dragOnly:true,initSlider:function(a){this.type=a;this.createEvent("change",this);this.createEvent("slideStart",this);this.createEvent("slideEnd",this);this.isTarget=false;this.animate=c.ANIM_AVAIL;this.backgroundEnabled=true;this.tickPause=40;this.enableKeys=true;this.keyIncrement=20;this.moveComplete=true;this.animationDuration= +0.2;this.SOURCE_UI_EVENT=1;this.SOURCE_SET_VALUE=2;this.valueChangeSource=0;this._silent=false;this.lastOffset=[0,0]},initThumb:function(a){var b=this;this.thumb=a;a.cacheBetweenDrags=true;if(a._isHoriz&&a.xTicks&&a.xTicks.length)this.tickPause=Math.round(360/a.xTicks.length);else if(a.yTicks&&a.yTicks.length)this.tickPause=Math.round(360/a.yTicks.length);a.onAvailable=function(){return b.setStartSliderState()};a.onMouseDown=function(){b._mouseDown=true;return b.focus()};a.startDrag=function(){b._slideStart()}; +a.onDrag=function(){b.fireEvents(true)};a.onMouseUp=function(){b.thumbMouseUp()}},onAvailable:function(){this._bindKeyEvents()},_bindKeyEvents:function(){b.on(this.id,"keydown",this.handleKeyDown,this,true);b.on(this.id,"keypress",this.handleKeyPress,this,true)},handleKeyPress:function(a){if(this.enableKeys)switch(b.getCharCode(a)){case 37:case 38:case 39:case 40:case 36:case 35:b.preventDefault(a)}},handleKeyDown:function(a){if(this.enableKeys){var d=b.getCharCode(a),e=this.thumb,h=this.getXValue(), +i=this.getYValue(),j=true;switch(d){case 37:h=h-this.keyIncrement;break;case 38:i=i-this.keyIncrement;break;case 39:h=h+this.keyIncrement;break;case 40:i=i+this.keyIncrement;break;case 36:h=e.leftConstraint;i=e.topConstraint;break;case 35:h=e.rightConstraint;i=e.bottomConstraint;break;default:j=false}if(j){e._isRegion?this._setRegionValue(c.SOURCE_KEY_EVENT,h,i,true):this._setValue(c.SOURCE_KEY_EVENT,e._isHoriz?h:i,true);b.stopEvent(a)}}},setStartSliderState:function(){this.setThumbCenterPoint(); +this.baselinePos=e(this.getEl());this.thumb.startOffset=this.thumb.getOffsetFromParent(this.baselinePos);if(this.thumb._isRegion)if(this.deferredSetRegionValue){this._setRegionValue.apply(this,this.deferredSetRegionValue);this.deferredSetRegionValue=null}else this.setRegionValue(0,0,true,true,true);else if(this.deferredSetValue){this._setValue.apply(this,this.deferredSetValue);this.deferredSetValue=null}else this.setValue(0,true,true,true)},setThumbCenterPoint:function(){var a=this.thumb.getEl(); +if(a)this.thumbCenterPoint={x:parseInt(a.offsetWidth/2,10),y:parseInt(a.offsetHeight/2,10)}},lock:function(){this.thumb.lock();this.locked=true},unlock:function(){this.thumb.unlock();this.locked=false},thumbMouseUp:function(){this._mouseDown=false;!this.isLocked()&&!this.moveComplete&&this.endMove()},onMouseUp:function(){this._mouseDown=false;this.backgroundEnabled&&(!this.isLocked()&&!this.moveComplete)&&this.endMove()},getThumb:function(){return this.thumb},focus:function(){this.valueChangeSource= +c.SOURCE_UI_EVENT;var a=this.getEl();if(a.focus)try{a.focus()}catch(b){}this.verifyOffset();return!this.isLocked()},onChange:function(){},onSlideStart:function(){},onSlideEnd:function(){},getValue:function(){return this.thumb.getValue()},getXValue:function(){return this.thumb.getXValue()},getYValue:function(){return this.thumb.getYValue()},setValue:function(){var a=d.call(arguments);a.unshift(c.SOURCE_SET_VALUE);return this._setValue.apply(this,a)},_setValue:function(a,b,d,e,i){var j=this.thumb,k; +if(!j.available){this.deferredSetValue=arguments;return false}if(this.isLocked()&&!e||isNaN(b)||j._isRegion)return false;this._silent=i;this.valueChangeSource=a||c.SOURCE_SET_VALUE;j.lastOffset=[b,b];this.verifyOffset(true);this._slideStart();if(j._isHoriz){k=j.initPageX+b+this.thumbCenterPoint.x;this.moveThumb(k,j.initPageY,d)}else{k=j.initPageY+b+this.thumbCenterPoint.y;this.moveThumb(j.initPageX,k,d)}return true},setRegionValue:function(){var a=d.call(arguments);a.unshift(c.SOURCE_SET_VALUE);return this._setRegionValue.apply(this, +a)},_setRegionValue:function(a,b,d,e,i,j){var k=this.thumb;if(!k.available){this.deferredSetRegionValue=arguments;return false}if(this.isLocked()&&!i||isNaN(b)||!k._isRegion)return false;this._silent=j;this.valueChangeSource=a||c.SOURCE_SET_VALUE;k.lastOffset=[b,d];this.verifyOffset(true);this._slideStart();this.moveThumb(k.initPageX+b+this.thumbCenterPoint.x,k.initPageY+d+this.thumbCenterPoint.y,e);return true},verifyOffset:function(){var a=e(this.getEl()),b=this.thumb;(!this.thumbCenterPoint||!this.thumbCenterPoint.x)&& +this.setThumbCenterPoint();if(a&&(a[0]!=this.baselinePos[0]||a[1]!=this.baselinePos[1])){this.setInitPosition();this.baselinePos=a;b.initPageX=this.initPageX+b.startOffset[0];b.initPageY=this.initPageY+b.startOffset[1];b.deltaSetXY=null;this.resetThumbConstraints();return false}return true},moveThumb:function(a,b,d,h){var i=this.thumb,j=this,k,l;if(i.available){i.setDelta(this.thumbCenterPoint.x,this.thumbCenterPoint.y);l=i.getTargetCoord(a,b);k=[Math.round(l.x),Math.round(l.y)];if(this.animate&& +i._graduated&&!d){this.lock();this.curCoord=e(this.thumb.getEl());this.curCoord=[Math.round(this.curCoord[0]),Math.round(this.curCoord[1])];setTimeout(function(){j.moveOneTick(k)},this.tickPause)}else if(this.animate&&c.ANIM_AVAIL&&!d){this.lock();a=new YAHOO.util.Motion(i.id,{points:{to:k}},this.animationDuration,YAHOO.util.Easing.easeOut);a.onComplete.subscribe(function(){j.unlock();j._mouseDown||j.endMove()});a.animate()}else{i.setDragElPos(a,b);!h&&!this._mouseDown&&this.endMove()}}},_slideStart:function(){if(!this._sliding){if(!this._silent){this.onSlideStart(); +this.fireEvent("slideStart")}this._sliding=true}},_slideEnd:function(){if(this._sliding&&this.moveComplete){var a=this._silent;this.moveComplete=this._silent=this._sliding=false;if(!a){this.onSlideEnd();this.fireEvent("slideEnd")}}},moveOneTick:function(a){var b=this.thumb,d=this,c=null,e;if(b._isRegion){c=this._getNextX(this.curCoord,a);e=c!==null?c[0]:this.curCoord[0];c=this._getNextY(this.curCoord,a);c=c!==null?c[1]:this.curCoord[1];c=e!==this.curCoord[0]||c!==this.curCoord[1]?[e,c]:null}else c= +b._isHoriz?this._getNextX(this.curCoord,a):this._getNextY(this.curCoord,a);if(c){this.curCoord=c;this.thumb.alignElWithMouse(b.getEl(),c[0]+this.thumbCenterPoint.x,c[1]+this.thumbCenterPoint.y);if(c[0]==a[0]&&c[1]==a[1]){this.unlock();this._mouseDown||this.endMove()}else setTimeout(function(){d.moveOneTick(a)},this.tickPause)}else{this.unlock();this._mouseDown||this.endMove()}},_getNextX:function(a,b){var d=this.thumb,c;c=[];c=null;if(a[0]>b[0]){c=d.tickSize-this.thumbCenterPoint.x;c=d.getTargetCoord(a[0]- +c,a[1]);c=[c.x,c.y]}else if(a[0]b[1]){c=d.tickSize-this.thumbCenterPoint.y;c=d.getTargetCoord(a[0],a[1]-c);c=[c.x,c.y]}else if(a[1]1)this._graduated=true;this._isHoriz=c||e;this._isVert=b||d;this._isRegion=this._isHoriz&&this._isVert},clearTicks:function(){YAHOO.widget.SliderThumb.superclass.clearTicks.call(this); +this.tickSize=0;this._graduated=false},getValue:function(){return this._isHoriz?this.getXValue():this.getYValue()},getXValue:function(){if(!this.available)return 0;var c=this.getOffsetFromParent();if(YAHOO.lang.isNumber(c[0])){this.lastOffset=c;return c[0]-this.startOffset[0]}return this.lastOffset[0]-this.startOffset[0]},getYValue:function(){if(!this.available)return 0;var c=this.getOffsetFromParent();if(YAHOO.lang.isNumber(c[1])){this.lastOffset=c;return c[1]-this.startOffset[1]}return this.lastOffset[1]- +this.startOffset[1]},toString:function(){return"SliderThumb "+this.id},onChange:function(){}}); +(function(){function c(b,a,c,e){var h=this,i=false,j=false,k,l;this.minSlider=b;this.maxSlider=a;this.activeSlider=b;this.isHoriz=b.thumb._isHoriz;k=this.minSlider.thumb.onMouseDown;l=this.maxSlider.thumb.onMouseDown;this.minSlider.thumb.onMouseDown=function(){h.activeSlider=h.minSlider;k.apply(this,arguments)};this.maxSlider.thumb.onMouseDown=function(){h.activeSlider=h.maxSlider;l.apply(this,arguments)};this.minSlider.thumb.onAvailable=function(){b.setStartSliderState();i=true;j&&h.fireEvent("ready", +h)};this.maxSlider.thumb.onAvailable=function(){a.setStartSliderState();j=true;i&&h.fireEvent("ready",h)};b.onMouseDown=a.onMouseDown=function(a){return this.backgroundEnabled&&h._handleMouseDown(a)};b.onDrag=a.onDrag=function(a){h._handleDrag(a)};b.onMouseUp=a.onMouseUp=function(a){h._handleMouseUp(a)};b._bindKeyEvents=function(){h._bindKeyEvents(this)};a._bindKeyEvents=function(){};b.subscribe("change",this._handleMinChange,b,this);b.subscribe("slideStart",this._handleSlideStart,b,this);b.subscribe("slideEnd", +this._handleSlideEnd,b,this);a.subscribe("change",this._handleMaxChange,a,this);a.subscribe("slideStart",this._handleSlideStart,a,this);a.subscribe("slideEnd",this._handleSlideEnd,a,this);this.createEvent("ready",this);this.createEvent("change",this);this.createEvent("slideStart",this);this.createEvent("slideEnd",this);e=YAHOO.lang.isArray(e)?e:[0,c];e[0]=Math.min(Math.max(parseInt(e[0],10)|0,0),c);e[1]=Math.max(Math.min(parseInt(e[1],10)|0,c),0);e[0]>e[1]&&e.splice(0,2,e[1],e[0]);this.minVal=e[0]; +this.maxVal=e[1];this.minSlider.setValue(this.minVal,true,true,true);this.maxSlider.setValue(this.maxVal,true,true,true)}var e=YAHOO.util.Event,b=YAHOO.widget;c.prototype={minVal:-1,maxVal:-1,minRange:0,_handleSlideStart:function(b,a){this.fireEvent("slideStart",a)},_handleSlideEnd:function(b,a){this.fireEvent("slideEnd",a)},_handleDrag:function(d){b.Slider.prototype.onDrag.call(this.activeSlider,d)},_handleMinChange:function(){this.activeSlider=this.minSlider;this.updateValue()},_handleMaxChange:function(){this.activeSlider= +this.maxSlider;this.updateValue()},_bindKeyEvents:function(b){e.on(b.id,"keydown",this._handleKeyDown,this,true);e.on(b.id,"keypress",this._handleKeyPress,this,true)},_handleKeyDown:function(b){this.activeSlider.handleKeyDown.apply(this.activeSlider,arguments)},_handleKeyPress:function(b){this.activeSlider.handleKeyPress.apply(this.activeSlider,arguments)},setValues:function(b,a,c,e,h){var i=this.minSlider,j=this.maxSlider,k=i.thumb,l=j.thumb,m=this,n=false,o=false;if(k._isHoriz){k.setXConstraint(k.leftConstraint, +l.rightConstraint,k.tickSize);l.setXConstraint(k.leftConstraint,l.rightConstraint,l.tickSize)}else{k.setYConstraint(k.topConstraint,l.bottomConstraint,k.tickSize);l.setYConstraint(k.topConstraint,l.bottomConstraint,l.tickSize)}this._oneTimeCallback(i,"slideEnd",function(){n=true;if(o){m.updateValue(h);setTimeout(function(){m._cleanEvent(i,"slideEnd");m._cleanEvent(j,"slideEnd")},0)}});this._oneTimeCallback(j,"slideEnd",function(){o=true;if(n){m.updateValue(h);setTimeout(function(){m._cleanEvent(i, +"slideEnd");m._cleanEvent(j,"slideEnd")},0)}});i.setValue(b,c,e,false);j.setValue(a,c,e,false)},setMinValue:function(b,a,c,e){var h=this.minSlider,i=this;this.activeSlider=h;i=this;this._oneTimeCallback(h,"slideEnd",function(){i.updateValue(e);setTimeout(function(){i._cleanEvent(h,"slideEnd")},0)});h.setValue(b,a,c)},setMaxValue:function(b,a,c,e){var h=this.maxSlider,i=this;this.activeSlider=h;this._oneTimeCallback(h,"slideEnd",function(){i.updateValue(e);setTimeout(function(){i._cleanEvent(h,"slideEnd")}, +0)});h.setValue(b,a,c)},updateValue:function(b){var a=this.minSlider.getValue(),c=this.maxSlider.getValue(),e=false,h,i,j,k;if(a!=this.minVal||c!=this.maxVal){e=true;h=this.minSlider.thumb;i=this.maxSlider.thumb;j=this.isHoriz?"x":"y";k=this.minSlider.thumbCenterPoint[j]+this.maxSlider.thumbCenterPoint[j];j=Math.max(c-k-this.minRange,0);k=Math.min(-a-k-this.minRange,0);if(this.isHoriz){j=Math.min(j,i.rightConstraint);h.setXConstraint(h.leftConstraint,j,h.tickSize);i.setXConstraint(k,i.rightConstraint, +i.tickSize)}else{j=Math.min(j,i.bottomConstraint);h.setYConstraint(h.leftConstraint,j,h.tickSize);i.setYConstraint(k,i.bottomConstraint,i.tickSize)}}this.minVal=a;this.maxVal=c;e&&!b&&this.fireEvent("change",this)},selectActiveSlider:function(b){var a=this.minSlider,c=this.maxSlider,e=a.isLocked()||!a.backgroundEnabled,h=c.isLocked()||!a.backgroundEnabled,i=YAHOO.util.Event;if(e||h)this.activeSlider=e?c:a;else{b=this.isHoriz?i.getPageX(b)-a.thumb.initPageX-a.thumbCenterPoint.x:i.getPageY(b)-a.thumb.initPageY- +a.thumbCenterPoint.y;this.activeSlider=b*2>c.getValue()+a.getValue()?c:a}},_handleMouseDown:function(d){if(d._handled)return false;d._handled=true;this.selectActiveSlider(d);return b.Slider.prototype.onMouseDown.call(this.activeSlider,d)},_handleMouseUp:function(d){b.Slider.prototype.onMouseUp.apply(this.activeSlider,arguments)},_oneTimeCallback:function(b,a,c){b.subscribe(a,function(){b.unsubscribe(a,arguments.callee);c.apply({},[].slice.apply(arguments))})},_cleanEvent:function(b,a){var c,e,h,i, +j,k;if(b.__yui_events&&b.events[a]){for(e=b.__yui_events.length;e>=0;--e)if(b.__yui_events[e].type===a){c=b.__yui_events[e];break}if(c){j=c.subscribers;k=[];e=i=0;for(h=j.length;e255||b<0?0:b).toString(16)).slice(-2).toUpperCase()}, +hex2dec:function(b){return parseInt(b,16)},hex2rgb:function(b){var c=this.hex2dec;return[c(b.slice(0,2)),c(b.slice(2,4)),c(b.slice(4,6))]},websafe:function(b,d,a){if(c(b))return this.websafe.apply(this,b);var f=function(a){if(e(a)){var a=Math.min(Math.max(0,a),255),b,c;for(b=0;b<256;b=b+51){c=b+51;if(a>=b&&a<=c)return a-b>25?c:b}}return a};return[f(b),f(d),f(a)]}}}(); +(function(){function c(a,b){e=e+1;b=b||{};if(arguments.length===1&&!YAHOO.lang.isString(a)&&!a.nodeName){b=a;a=b.element||null}!a&&!b.element&&(a=this._createHostElement(b));c.superclass.constructor.call(this,a,b);this.initPicker()}var e=0,b=YAHOO.util,d=YAHOO.lang,a=YAHOO.widget.Slider,f=b.Color,g=b.Dom,h=b.Event,i=d.substitute;YAHOO.extend(c,YAHOO.util.Element,{ID:{R:"yui-picker-r",R_HEX:"yui-picker-rhex",G:"yui-picker-g",G_HEX:"yui-picker-ghex",B:"yui-picker-b",B_HEX:"yui-picker-bhex",H:"yui-picker-h", +S:"yui-picker-s",V:"yui-picker-v",PICKER_BG:"yui-picker-bg",PICKER_THUMB:"yui-picker-thumb",HUE_BG:"yui-picker-hue-bg",HUE_THUMB:"yui-picker-hue-thumb",HEX:"yui-picker-hex",SWATCH:"yui-picker-swatch",WEBSAFE_SWATCH:"yui-picker-websafe-swatch",CONTROLS:"yui-picker-controls",RGB_CONTROLS:"yui-picker-rgb-controls",HSV_CONTROLS:"yui-picker-hsv-controls",HEX_CONTROLS:"yui-picker-hex-controls",HEX_SUMMARY:"yui-picker-hex-summary",CONTROLS_LABEL:"yui-picker-controls-label"},TXT:{ILLEGAL_HEX:"Illegal hex value entered", +SHOW_CONTROLS:"Show color details",HIDE_CONTROLS:"Hide color details",CURRENT_COLOR:"Currently selected color: {rgb}",CLOSEST_WEBSAFE:"Closest websafe color: {rgb}. Click to select.",R:"R",G:"G",B:"B",H:"H",S:"S",V:"V",HEX:"#",DEG:"°",PERCENT:"%"},IMAGE:{PICKER_THUMB:"../../build/colorpicker/assets/picker_thumb.png",HUE_THUMB:"../../build/colorpicker/assets/hue_thumb.png"},DEFAULT:{PICKER_SIZE:180},OPT:{HUE:"hue",SATURATION:"saturation",VALUE:"value",RED:"red",GREEN:"green",BLUE:"blue",HSV:"hsv", +RGB:"rgb",WEBSAFE:"websafe",HEX:"hex",PICKER_SIZE:"pickersize",SHOW_CONTROLS:"showcontrols",SHOW_RGB_CONTROLS:"showrgbcontrols",SHOW_HSV_CONTROLS:"showhsvcontrols",SHOW_HEX_CONTROLS:"showhexcontrols",SHOW_HEX_SUMMARY:"showhexsummary",SHOW_WEBSAFE:"showwebsafe",CONTAINER:"container",IDS:"ids",ELEMENTS:"elements",TXT:"txt",IMAGES:"images",ANIMATE:"animate"},skipAnim:true,_createHostElement:function(){var a=document.createElement("div");if(this.CSS.BASE)a.className=this.CSS.BASE;return a},_updateHueSlider:function(){var a= +this.get(this.OPT.PICKER_SIZE),b=this.get(this.OPT.HUE),b=a-Math.round(b/360*a);b===a&&(b=0);this.hueSlider.setValue(b,this.skipAnim)},_updatePickerSlider:function(){var a=this.get(this.OPT.PICKER_SIZE),b=this.get(this.OPT.SATURATION),c=this.get(this.OPT.VALUE),b=Math.round(b*a/100),c=Math.round(a-c*a/100);this.pickerSlider.setRegionValue(b,c,this.skipAnim)},_updateSliders:function(){this._updateHueSlider();this._updatePickerSlider()},setValue:function(a,b){this.set(this.OPT.RGB,a,b||false);this._updateSliders()}, +hueSlider:null,pickerSlider:null,_getH:function(){var a=this.get(this.OPT.PICKER_SIZE),a=(a-this.hueSlider.getValue())/a,a=Math.round(a*360);return a===360?0:a},_getS:function(){return this.pickerSlider.getXValue()/this.get(this.OPT.PICKER_SIZE)},_getV:function(){var a=this.get(this.OPT.PICKER_SIZE);return(a-this.pickerSlider.getYValue())/a},_updateSwatch:function(){var a=this.get(this.OPT.RGB),b=this.get(this.OPT.WEBSAFE),c=this.getElement(this.ID.SWATCH),a=a.join(","),d=this.get(this.OPT.TXT);g.setStyle(c, +"background-color","rgb("+a+")");c.title=i(d.CURRENT_COLOR,{rgb:"#"+this.get(this.OPT.HEX)});c=this.getElement(this.ID.WEBSAFE_SWATCH);a=b.join(",");g.setStyle(c,"background-color","rgb("+a+")");c.title=i(d.CLOSEST_WEBSAFE,{rgb:"#"+f.rgb2hex(b)})},_getValuesFromSliders:function(){this.set(this.OPT.RGB,f.hsv2rgb(this._getH(),this._getS(),this._getV()))},_updateFormFields:function(){this.getElement(this.ID.H).value=this.get(this.OPT.HUE);this.getElement(this.ID.S).value=this.get(this.OPT.SATURATION); +this.getElement(this.ID.V).value=this.get(this.OPT.VALUE);this.getElement(this.ID.R).value=this.get(this.OPT.RED);this.getElement(this.ID.R_HEX).innerHTML=f.dec2hex(this.get(this.OPT.RED));this.getElement(this.ID.G).value=this.get(this.OPT.GREEN);this.getElement(this.ID.G_HEX).innerHTML=f.dec2hex(this.get(this.OPT.GREEN));this.getElement(this.ID.B).value=this.get(this.OPT.BLUE);this.getElement(this.ID.B_HEX).innerHTML=f.dec2hex(this.get(this.OPT.BLUE));this.getElement(this.ID.HEX).value=this.get(this.OPT.HEX)}, +_onHueSliderChange:function(){var b=this._getH(),c="rgb("+f.hsv2rgb(b,1,1).join(",")+")";this.set(this.OPT.HUE,b,true);g.setStyle(this.getElement(this.ID.PICKER_BG),"background-color",c);this.hueSlider.valueChangeSource!==a.SOURCE_SET_VALUE&&this._getValuesFromSliders();this._updateFormFields();this._updateSwatch()},_onPickerSliderChange:function(){var b=this._getS(),c=this._getV();this.set(this.OPT.SATURATION,Math.round(b*100),true);this.set(this.OPT.VALUE,Math.round(c*100),true);this.pickerSlider.valueChangeSource!== +a.SOURCE_SET_VALUE&&this._getValuesFromSliders();this._updateFormFields();this._updateSwatch()},_getCommand:function(a){var b=h.getCharCode(a);return b===38?3:b===13?6:b===40?4:b>=48&&b<=57?1:b>=97&&b<=102?2:b>=65&&b<=70?2:"8, 9, 13, 27, 37, 39".indexOf(b)>-1||a.ctrlKey||a.metaKey?5:0},_useFieldValue:function(a,b,c){a=b.value;c!==this.OPT.HEX&&(a=parseInt(a,10));a!==this.get(c)&&this.set(c,a)},_rgbFieldKeypress:function(a,b,c){var d=this._getCommand(a),e=a.shiftKey?10:1;switch(d){case 6:this._useFieldValue.apply(this, +arguments);break;case 3:this.set(c,Math.min(this.get(c)+e,255));this._updateFormFields();break;case 4:this.set(c,Math.max(this.get(c)-e,0));this._updateFormFields()}},_hexFieldKeypress:function(a,b,c){this._getCommand(a)===6&&this._useFieldValue.apply(this,arguments)},_hexOnly:function(a,b){switch(this._getCommand(a)){case 6:case 5:case 1:break;case 2:if(b!==true)break;default:h.stopEvent(a);return false}},_numbersOnly:function(a){return this._hexOnly(a,true)},getElement:function(a){return this.get(this.OPT.ELEMENTS)[this.get(this.OPT.IDS)[a]]}, +_createElements:function(){var a,b,c,e,f=this.get(this.OPT.IDS),g=this.get(this.OPT.TXT),h=this.get(this.OPT.IMAGES),i=function(a,b){var c=document.createElement(a);b&&d.augmentObject(c,b,true);return c},q=function(a,b){var c=d.merge({autocomplete:"off",value:"0",size:3,maxlength:3},b);c.name=c.id;return new i(a,c)};e=this.get("element");a=new i("div",{id:f[this.ID.PICKER_BG],className:"yui-picker-bg",tabIndex:-1,hideFocus:true});b=new i("div",{id:f[this.ID.PICKER_THUMB],className:"yui-picker-thumb"}); +c=new i("img",{src:h.PICKER_THUMB});b.appendChild(c);a.appendChild(b);e.appendChild(a);a=new i("div",{id:f[this.ID.HUE_BG],className:"yui-picker-hue-bg",tabIndex:-1,hideFocus:true});b=new i("div",{id:f[this.ID.HUE_THUMB],className:"yui-picker-hue-thumb"});c=new i("img",{src:h.HUE_THUMB});b.appendChild(c);a.appendChild(b);e.appendChild(a);a=new i("div",{id:f[this.ID.CONTROLS],className:"yui-picker-controls"});e.appendChild(a);e=a;a=new i("div",{className:"hd"});b=new i("a",{id:f[this.ID.CONTROLS_LABEL], +href:"#"});a.appendChild(b);e.appendChild(a);a=new i("div",{className:"bd"});e.appendChild(a);e=a;a=new i("ul",{id:f[this.ID.RGB_CONTROLS],className:"yui-picker-rgb-controls"});b=new i("li");b.appendChild(document.createTextNode(g.R+" "));c=new q("input",{id:f[this.ID.R],className:"yui-picker-r"});b.appendChild(c);a.appendChild(b);b=new i("li");b.appendChild(document.createTextNode(g.G+" "));c=new q("input",{id:f[this.ID.G],className:"yui-picker-g"});b.appendChild(c);a.appendChild(b);b=new i("li"); +b.appendChild(document.createTextNode(g.B+" "));c=new q("input",{id:f[this.ID.B],className:"yui-picker-b"});b.appendChild(c);a.appendChild(b);e.appendChild(a);a=new i("ul",{id:f[this.ID.HSV_CONTROLS],className:"yui-picker-hsv-controls"});b=new i("li");b.appendChild(document.createTextNode(g.H+" "));c=new q("input",{id:f[this.ID.H],className:"yui-picker-h"});b.appendChild(c);b.appendChild(document.createTextNode(" "+g.DEG));a.appendChild(b);b=new i("li");b.appendChild(document.createTextNode(g.S+" ")); +c=new q("input",{id:f[this.ID.S],className:"yui-picker-s"});b.appendChild(c);b.appendChild(document.createTextNode(" "+g.PERCENT));a.appendChild(b);b=new i("li");b.appendChild(document.createTextNode(g.V+" "));c=new q("input",{id:f[this.ID.V],className:"yui-picker-v"});b.appendChild(c);b.appendChild(document.createTextNode(" "+g.PERCENT));a.appendChild(b);e.appendChild(a);a=new i("ul",{id:f[this.ID.HEX_SUMMARY],className:"yui-picker-hex_summary"});b=new i("li",{id:f[this.ID.R_HEX]});a.appendChild(b); +b=new i("li",{id:f[this.ID.G_HEX]});a.appendChild(b);b=new i("li",{id:f[this.ID.B_HEX]});a.appendChild(b);e.appendChild(a);a=new i("div",{id:f[this.ID.HEX_CONTROLS],className:"yui-picker-hex-controls"});a.appendChild(document.createTextNode(g.HEX+" "));b=new q("input",{id:f[this.ID.HEX],className:"yui-picker-hex",size:6,maxlength:6});a.appendChild(b);e.appendChild(a);e=this.get("element");a=new i("div",{id:f[this.ID.SWATCH],className:"yui-picker-swatch"});e.appendChild(a);a=new i("div",{id:f[this.ID.WEBSAFE_SWATCH], +className:"yui-picker-websafe-swatch"});e.appendChild(a)},_attachRGBHSV:function(a,b){h.on(this.getElement(a),"keydown",function(a,c){c._rgbFieldKeypress(a,this,b)},this);h.on(this.getElement(a),"keypress",this._numbersOnly,this,true);h.on(this.getElement(a),"blur",function(a,c){c._useFieldValue(a,this,b)},this)},_updateRGB:function(){this.set(this.OPT.RGB,[this.get(this.OPT.RED),this.get(this.OPT.GREEN),this.get(this.OPT.BLUE)]);this._updateSliders()},_initElements:function(){var a=this.OPT,b=this.get(a.IDS), +a=this.get(a.ELEMENTS),c,e,f;for(c in this.ID)d.hasOwnProperty(this.ID,c)&&(b[this.ID[c]]=b[c]);(e=g.get(b[this.ID.PICKER_BG]))||this._createElements();for(c in b)if(d.hasOwnProperty(b,c)){e=g.get(b[c]);f=g.generateId(e);b[c]=f;b[b[c]]=f;a[f]=e}},initPicker:function(){this._initSliders();this._bindUI();this.syncUI(true)},_initSliders:function(){var b=this.ID,c=this.get(this.OPT.PICKER_SIZE);this.hueSlider=a.getVertSlider(this.getElement(b.HUE_BG),this.getElement(b.HUE_THUMB),0,c);this.pickerSlider= +a.getSliderRegion(this.getElement(b.PICKER_BG),this.getElement(b.PICKER_THUMB),0,c,0,c);this.set(this.OPT.ANIMATE,this.get(this.OPT.ANIMATE))},_bindUI:function(){var a=this.ID,b=this.OPT;this.hueSlider.subscribe("change",this._onHueSliderChange,this,true);this.pickerSlider.subscribe("change",this._onPickerSliderChange,this,true);h.on(this.getElement(a.WEBSAFE_SWATCH),"click",function(){this.setValue(this.get(b.WEBSAFE))},this,true);h.on(this.getElement(a.CONTROLS_LABEL),"click",function(a){this.set(b.SHOW_CONTROLS, +!this.get(b.SHOW_CONTROLS));h.preventDefault(a)},this,true);this._attachRGBHSV(a.R,b.RED);this._attachRGBHSV(a.G,b.GREEN);this._attachRGBHSV(a.B,b.BLUE);this._attachRGBHSV(a.H,b.HUE);this._attachRGBHSV(a.S,b.SATURATION);this._attachRGBHSV(a.V,b.VALUE);h.on(this.getElement(a.HEX),"keydown",function(a,c){c._hexFieldKeypress(a,this,b.HEX)},this);h.on(this.getElement(this.ID.HEX),"keypress",this._hexOnly,this,true);h.on(this.getElement(this.ID.HEX),"blur",function(a,c){c._useFieldValue(a,this,b.HEX)}, +this)},syncUI:function(a){this.skipAnim=a;this._updateRGB();this.skipAnim=false},_updateRGBFromHSV:function(){var a=[this.get(this.OPT.HUE),this.get(this.OPT.SATURATION)/100,this.get(this.OPT.VALUE)/100];this.set(this.OPT.RGB,f.hsv2rgb(a));this._updateSliders()},_updateHex:function(){var a=this.get(this.OPT.HEX),b=a.length,c;if(b===3){a=a.split("");for(c=0;c1)for(h in b)d.hasOwnProperty(b,h)&&(b[h]=b[h]+e);this.setAttributeConfig(this.OPT.IDS,{value:b,writeonce:true});this.setAttributeConfig(this.OPT.TXT,{value:a.txt||this.TXT,writeonce:true});this.setAttributeConfig(this.OPT.IMAGES,{value:a.images||this.IMAGE,writeonce:true});this.setAttributeConfig(this.OPT.ELEMENTS,{value:{},readonly:true});this.setAttributeConfig(this.OPT.SHOW_CONTROLS,{value:d.isBoolean(a.showcontrols)?a.showcontrols:true, +method:function(a){this._hideShowEl(g.getElementsByClassName("bd","div",this.getElement(this.ID.CONTROLS))[0],a);this.getElement(this.ID.CONTROLS_LABEL).innerHTML=a?this.get(this.OPT.TXT).HIDE_CONTROLS:this.get(this.OPT.TXT).SHOW_CONTROLS}});this.setAttributeConfig(this.OPT.SHOW_RGB_CONTROLS,{value:d.isBoolean(a.showrgbcontrols)?a.showrgbcontrols:true,method:function(a){this._hideShowEl(this.ID.RGB_CONTROLS,a)}});this.setAttributeConfig(this.OPT.SHOW_HSV_CONTROLS,{value:d.isBoolean(a.showhsvcontrols)? +a.showhsvcontrols:false,method:function(a){this._hideShowEl(this.ID.HSV_CONTROLS,a);a&&this.get(this.OPT.SHOW_HEX_SUMMARY)&&this.set(this.OPT.SHOW_HEX_SUMMARY,false)}});this.setAttributeConfig(this.OPT.SHOW_HEX_CONTROLS,{value:d.isBoolean(a.showhexcontrols)?a.showhexcontrols:false,method:function(a){this._hideShowEl(this.ID.HEX_CONTROLS,a)}});this.setAttributeConfig(this.OPT.SHOW_WEBSAFE,{value:d.isBoolean(a.showwebsafe)?a.showwebsafe:true,method:function(a){this._hideShowEl(this.ID.WEBSAFE_SWATCH, +a)}});this.setAttributeConfig(this.OPT.SHOW_HEX_SUMMARY,{value:d.isBoolean(a.showhexsummary)?a.showhexsummary:true,method:function(a){this._hideShowEl(this.ID.HEX_SUMMARY,a);a&&this.get(this.OPT.SHOW_HSV_CONTROLS)&&this.set(this.OPT.SHOW_HSV_CONTROLS,false)}});this.setAttributeConfig(this.OPT.ANIMATE,{value:d.isBoolean(a.animate)?a.animate:true,method:function(a){if(this.pickerSlider){this.pickerSlider.animate=a;this.hueSlider.animate=a}}});this.on(this.OPT.HUE+"Change",this._updateRGBFromHSV,this, +true);this.on(this.OPT.SATURATION+"Change",this._updateRGBFromHSV,this,true);this.on(this.OPT.VALUE+"Change",this._updateRGBFromHSV,this,true);this.on(this.OPT.RED+"Change",this._updateRGB,this,true);this.on(this.OPT.GREEN+"Change",this._updateRGB,this,true);this.on(this.OPT.BLUE+"Change",this._updateRGB,this,true);this.on(this.OPT.HEX+"Change",this._updateHex,this,true);this._initElements()}});YAHOO.widget.ColorPicker=c})();YAHOO.register("colorpicker",YAHOO.widget.ColorPicker,{version:"2.7.0",build:"1796"}); +(function(){var c=YAHOO.util,e=function(b,c,a,e){this.init(b,c,a,e)};e.NAME="Anim";e.prototype={toString:function(){var b=this.getEl()||{};return this.constructor.NAME+": "+(b.id||b.tagName)},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(b,c,a){return this.method(this.currentFrame,c,a-c,this.totalFrames)},setAttribute:function(b, +d,a){var e=this.getEl();this.patterns.noNegatives.test(b)&&(d=d>0?d:0);"style"in e?c.Dom.setStyle(e,b,d+a):b in e&&(e[b]=d)},getAttribute:function(b){var d=this.getEl(),a=c.Dom.getStyle(d,b);if(a!=="auto"&&!this.patterns.offsetUnit.test(a))return parseFloat(a);var e=this.patterns.offsetAttribute.exec(b)||[],g=!!e[3],h=!!e[2];"style"in d?a=h||c.Dom.getStyle(d,"position")=="absolute"&&g?d["offset"+e[0].charAt(0).toUpperCase()+e[0].substr(1)]:0:b in d&&(a=d[b]);return a},getDefaultUnit:function(b){return this.patterns.defaultUnit.test(b)? +"px":""},setRuntimeAttribute:function(b){var c,a,e=this.attributes;this.runtimeAttributes[b]={};var g=function(a){return typeof a!=="undefined"};if(!g(e[b].to)&&!g(e[b].by))return false;c=g(e[b].from)?e[b].from:this.getAttribute(b);if(g(e[b].to))a=e[b].to;else if(g(e[b].by))if(c.constructor==Array){a=[];for(var h=0,i=c.length;h0&&isFinite(l)){g.currentFrame+l>=h&&(l=h-(i+1));g.currentFrame= +g.currentFrame+l}}c._onTween.fire()}else YAHOO.util.AnimMgr.stop(c,b)}}};YAHOO.util.Bezier=new function(){this.getPosition=function(c,e){for(var b=c.length,d=[],a=0;a0&&!(j[0]instanceof Array))j=[j];else{var n=[];l=0;for(m=j.length;l0&&(this.runtimeAttributes[c]=this.runtimeAttributes[c].concat(j)); +this.runtimeAttributes[c][this.runtimeAttributes[c].length]=k}else b.setRuntimeAttribute.call(this,c)};var a=function(a,b){var c=e.Dom.getXY(this.getEl());return a=[a[0]-c[0]+b[0],a[1]-c[1]+b[1]]},f=function(a){return typeof a!=="undefined"};e.Motion=c})(); +(function(){var c=function(a,b,d,e){a&&c.superclass.constructor.call(this,a,b,d,e)};c.NAME="Scroll";var e=YAHOO.util;YAHOO.extend(c,e.ColorAnim);var b=c.superclass,d=c.prototype;d.doMethod=function(a,c,d){var e=null;return e=a=="scroll"?[this.method(this.currentFrame,c[0],d[0]-c[0],this.totalFrames),this.method(this.currentFrame,c[1],d[1]-c[1],this.totalFrames)]:b.doMethod.call(this,a,c,d)};d.getAttribute=function(a){var c=null,c=this.getEl();return c=a=="scroll"?[c.scrollLeft,c.scrollTop]:b.getAttribute.call(this, +a)};d.setAttribute=function(a,c,d){var e=this.getEl();if(a=="scroll"){e.scrollLeft=c[0];e.scrollTop=c[1]}else b.setAttribute.call(this,a,c,d)};e.Scroll=c})();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.7.0",build:"1799"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/images/handle.png b/bower_components/ckeditor/plugins/widget/images/handle.png new file mode 100644 index 0000000..ba8cda5 Binary files /dev/null and b/bower_components/ckeditor/plugins/widget/images/handle.png differ diff --git a/bower_components/ckeditor/plugins/widget/lang/af.js b/bower_components/ckeditor/plugins/widget/lang/af.js new file mode 100644 index 0000000..a20b223 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/af.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","af",{move:"Klik en trek on te beweeg"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/ar.js b/bower_components/ckeditor/plugins/widget/lang/ar.js new file mode 100644 index 0000000..7ea5e52 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/ar.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","ar",{move:"Click and drag to move"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/ca.js b/bower_components/ckeditor/plugins/widget/lang/ca.js new file mode 100644 index 0000000..d80e597 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/ca.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","ca",{move:"Clicar i arrossegar per moure"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/cs.js b/bower_components/ckeditor/plugins/widget/lang/cs.js new file mode 100644 index 0000000..7dcb085 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/cs.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","cs",{move:"Klepněte a táhněte pro přesunutí"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/cy.js b/bower_components/ckeditor/plugins/widget/lang/cy.js new file mode 100644 index 0000000..bca5c69 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/cy.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","cy",{move:"Clcio a llusgo i symud"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/da.js b/bower_components/ckeditor/plugins/widget/lang/da.js new file mode 100644 index 0000000..5ebe806 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/da.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","da",{move:"Klik og træk for at flytte"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/de.js b/bower_components/ckeditor/plugins/widget/lang/de.js new file mode 100644 index 0000000..f916123 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/de.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","de",{move:"Zum verschieben anwählen und ziehen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/el.js b/bower_components/ckeditor/plugins/widget/lang/el.js new file mode 100644 index 0000000..9db5c5c --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/el.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","el",{move:"Κάνετε κλικ και σύρετε το ποντίκι για να μετακινήστε"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/en-gb.js b/bower_components/ckeditor/plugins/widget/lang/en-gb.js new file mode 100644 index 0000000..35a08fc --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/en-gb.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","en-gb",{move:"Click and drag to move"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/en.js b/bower_components/ckeditor/plugins/widget/lang/en.js new file mode 100644 index 0000000..7d5bf3a --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/en.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","en",{move:"Click and drag to move"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/eo.js b/bower_components/ckeditor/plugins/widget/lang/eo.js new file mode 100644 index 0000000..5dfaec1 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/eo.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","eo",{move:"klaki kaj treni por movi"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/es.js b/bower_components/ckeditor/plugins/widget/lang/es.js new file mode 100644 index 0000000..e182bc4 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/es.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","es",{move:"Dar clic y arrastrar para mover"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/fa.js b/bower_components/ckeditor/plugins/widget/lang/fa.js new file mode 100644 index 0000000..93b87e1 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/fa.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","fa",{move:"کلیک و کشیدن برای جابجایی"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/fi.js b/bower_components/ckeditor/plugins/widget/lang/fi.js new file mode 100644 index 0000000..4e63d5c --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/fi.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","fi",{move:"Siirrä klikkaamalla ja raahaamalla"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/fr.js b/bower_components/ckeditor/plugins/widget/lang/fr.js new file mode 100644 index 0000000..5ff1ebf --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/fr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","fr",{move:"Cliquer et glisser pour déplacer"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/gl.js b/bower_components/ckeditor/plugins/widget/lang/gl.js new file mode 100644 index 0000000..85e41ea --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/gl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","gl",{move:"Prema e arrastre para mover"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/he.js b/bower_components/ckeditor/plugins/widget/lang/he.js new file mode 100644 index 0000000..4698585 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/he.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","he",{move:"לחץ וגרור להזזה"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/hr.js b/bower_components/ckeditor/plugins/widget/lang/hr.js new file mode 100644 index 0000000..aaf8794 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/hr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","hr",{move:"Klikni i povuci da pomakneš"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/hu.js b/bower_components/ckeditor/plugins/widget/lang/hu.js new file mode 100644 index 0000000..13d414a --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/hu.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","hu",{move:"Kattints és húzd a mozgatáshoz"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/it.js b/bower_components/ckeditor/plugins/widget/lang/it.js new file mode 100644 index 0000000..10468fc --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/it.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","it",{move:"Fare clic e trascinare per spostare"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/ja.js b/bower_components/ckeditor/plugins/widget/lang/ja.js new file mode 100644 index 0000000..add6576 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/ja.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","ja",{move:"ドラッグして移動"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/km.js b/bower_components/ckeditor/plugins/widget/lang/km.js new file mode 100644 index 0000000..ddd4a92 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/km.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","km",{move:"ចុច​ហើយ​ទាញ​ដើម្បី​ផ្លាស់​ទី"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/ko.js b/bower_components/ckeditor/plugins/widget/lang/ko.js new file mode 100644 index 0000000..42bb884 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/ko.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","ko",{move:"움직이려면 클릭 후 드래그 하세요"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/ku.js b/bower_components/ckeditor/plugins/widget/lang/ku.js new file mode 100644 index 0000000..7ddec15 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/ku.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","ku",{move:"کرتەبکە و ڕایبکێشە بۆ جوڵاندن"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/nb.js b/bower_components/ckeditor/plugins/widget/lang/nb.js new file mode 100644 index 0000000..45cfd5b --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/nb.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","nb",{move:"Klikk og dra for å flytte"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/nl.js b/bower_components/ckeditor/plugins/widget/lang/nl.js new file mode 100644 index 0000000..f0e7c7f --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/nl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","nl",{move:"Klik en sleep om te verplaatsen"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/no.js b/bower_components/ckeditor/plugins/widget/lang/no.js new file mode 100644 index 0000000..87b0f57 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/no.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","no",{move:"Klikk og dra for å flytte"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/pl.js b/bower_components/ckeditor/plugins/widget/lang/pl.js new file mode 100644 index 0000000..96019ef --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/pl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","pl",{move:"Kliknij i przeciągnij, by przenieść."}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/pt-br.js b/bower_components/ckeditor/plugins/widget/lang/pt-br.js new file mode 100644 index 0000000..7e580a8 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/pt-br.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","pt-br",{move:"Click e arraste para mover"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/pt.js b/bower_components/ckeditor/plugins/widget/lang/pt.js new file mode 100644 index 0000000..d181d22 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/pt.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","pt",{move:"Clique e arraste para mover"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/ru.js b/bower_components/ckeditor/plugins/widget/lang/ru.js new file mode 100644 index 0000000..e8e046c --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/ru.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","ru",{move:"Нажмите и перетащите"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/sk.js b/bower_components/ckeditor/plugins/widget/lang/sk.js new file mode 100644 index 0000000..3920c36 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/sk.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","sk",{move:"Kliknite a potiahnite pre presunutie"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/sl.js b/bower_components/ckeditor/plugins/widget/lang/sl.js new file mode 100644 index 0000000..a228498 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/sl.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","sl",{move:"Kliknite in povlecite, da premaknete"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/sq.js b/bower_components/ckeditor/plugins/widget/lang/sq.js new file mode 100644 index 0000000..71d56bf --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/sq.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","sq",{move:"Kliko dhe tërhiqe për ta lëvizur"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/sv.js b/bower_components/ckeditor/plugins/widget/lang/sv.js new file mode 100644 index 0000000..f8a24c2 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/sv.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","sv",{move:"Klicka och drag för att flytta"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/tr.js b/bower_components/ckeditor/plugins/widget/lang/tr.js new file mode 100644 index 0000000..27d3692 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/tr.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","tr",{move:"Taşımak için, tıklayın ve sürükleyin"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/tt.js b/bower_components/ckeditor/plugins/widget/lang/tt.js new file mode 100644 index 0000000..8866a60 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/tt.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","tt",{move:"Күчереп куер өчен басып шудырыгыз"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/uk.js b/bower_components/ckeditor/plugins/widget/lang/uk.js new file mode 100644 index 0000000..a3ab024 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/uk.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","uk",{move:"Клікніть і потягніть для переміщення"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/vi.js b/bower_components/ckeditor/plugins/widget/lang/vi.js new file mode 100644 index 0000000..2d79369 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/vi.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","vi",{move:"Nhấp chuột và kéo để di chuyển"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/zh-cn.js b/bower_components/ckeditor/plugins/widget/lang/zh-cn.js new file mode 100644 index 0000000..cbdb0fd --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/zh-cn.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","zh-cn",{move:"点击并拖拽以移动"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/lang/zh.js b/bower_components/ckeditor/plugins/widget/lang/zh.js new file mode 100644 index 0000000..473a9f8 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/lang/zh.js @@ -0,0 +1,5 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("widget","zh",{move:"拖曳以移動"}); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/widget/plugin.js b/bower_components/ckeditor/plugins/widget/plugin.js new file mode 100644 index 0000000..674ff01 --- /dev/null +++ b/bower_components/ckeditor/plugins/widget/plugin.js @@ -0,0 +1,58 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function o(a){this.editor=a;this.registered={};this.instances={};this.selected=[];this.widgetHoldingFocusedEditable=this.focused=null;this._={nextId:0,upcasts:[],upcastCallbacks:[],filters:{}};I(this);J(this);this.on("checkWidgets",K);this.editor.on("contentDomInvalidated",this.checkWidgets,this);L(this);M(this);N(this);O(this);P(this)}function k(a,b,c,d,e){var f=a.editor;CKEDITOR.tools.extend(this,d,{editor:f,id:b,inline:"span"==c.getParent().getName(),element:c,data:CKEDITOR.tools.extend({}, +"function"==typeof d.defaults?d.defaults():d.defaults),dataReady:!1,inited:!1,ready:!1,edit:k.prototype.edit,focusedEditable:null,definition:d,repository:a,draggable:!1!==d.draggable,_:{downcastFn:d.downcast&&"string"==typeof d.downcast?d.downcasts[d.downcast]:d.downcast}},!0);a.fire("instanceCreated",this);Q(this,d);this.init&&this.init();this.inited=!0;(a=this.element.data("cke-widget-data"))&&this.setData(JSON.parse(decodeURIComponent(a)));e&&this.setData(e);this.data.classes||this.setData("classes", +this.getClasses());this.dataReady=!0;s(this);this.fire("data",this.data);this.isInited()&&f.editable().contains(this.wrapper)&&(this.ready=!0,this.fire("ready"))}function q(a,b,c){CKEDITOR.dom.element.call(this,b.$);this.editor=a;b=this.filter=c.filter;CKEDITOR.dtd[this.getName()].p?(this.enterMode=b?b.getAllowedEnterMode(a.enterMode):a.enterMode,this.shiftEnterMode=b?b.getAllowedEnterMode(a.shiftEnterMode,!0):a.shiftEnterMode):this.enterMode=this.shiftEnterMode=CKEDITOR.ENTER_BR}function R(a,b){a.addCommand(b.name, +{exec:function(){function c(){a.widgets.finalizeCreation(g)}var d=a.widgets.focused;if(d&&d.name==b.name)d.edit();else if(b.insert)b.insert();else if(b.template){var d="function"==typeof b.defaults?b.defaults():b.defaults,d=CKEDITOR.dom.element.createFromHtml(b.template.output(d)),e,f=a.widgets.wrapElement(d,b.name),g=new CKEDITOR.dom.documentFragment(f.getDocument());g.append(f);(e=a.widgets.initOn(d,b))?(d=e.once("edit",function(b){if(b.data.dialog)e.once("dialog",function(b){var b=b.data,d,f;d= +b.once("ok",c,null,null,20);f=b.once("cancel",function(){a.widgets.destroy(e,!0)});b.once("hide",function(){d.removeListener();f.removeListener()})});else c()},null,null,999),e.edit(),d.removeListener()):c()}},refresh:function(a,b){this.setState(l(a.editable(),b.blockLimit)?CKEDITOR.TRISTATE_DISABLED:CKEDITOR.TRISTATE_OFF)},context:"div",allowedContent:b.allowedContent,requiredContent:b.requiredContent,contentForms:b.contentForms,contentTransformations:b.contentTransformations})}function t(a,b){a.focused= +null;if(b.isInited()){var c=b.editor.checkDirty();a.fire("widgetBlurred",{widget:b});b.setFocused(!1);!c&&b.editor.resetDirty()}}function K(a){a=a.data;if("wysiwyg"==this.editor.mode){var b=this.editor.editable(),c=this.instances,d,e;if(b){for(d in c)b.contains(c[d].wrapper)||this.destroy(c[d],!0);if(a&&a.initOnlyNew)b=this.initOnAll();else{var f=b.find(".cke_widget_wrapper"),b=[];d=0;for(c=f.count();dCKEDITOR.env.version||d.isInline()?d:b.document;d.attachListener(e, +"drop",function(c){var d=c.data.$.dataTransfer.getData("text"),e,h;if(d){try{e=JSON.parse(d)}catch(j){return}if("cke-widget"==e.type&&(c.data.preventDefault(),e.editor==b.name&&(h=a.instances[e.id]))){a:if(e=c.data.$,d=b.createRange(),c.data.testRange)d=c.data.testRange;else if(document.caretRangeFromPoint)c=b.document.$.caretRangeFromPoint(e.clientX,e.clientY),d.setStart(CKEDITOR.dom.node(c.startContainer),c.startOffset),d.collapse(!0);else if(e.rangeParent)d.setStart(CKEDITOR.dom.node(e.rangeParent), +e.rangeOffset),d.collapse(!0);else if(document.body.createTextRange)c=b.document.getBody().$.createTextRange(),c.moveToPoint(e.clientX,e.clientY),e="cke-temp-"+(new Date).getTime(),c.pasteHTML('​'),c=b.document.getById(e),d.moveToPosition(c,CKEDITOR.POSITION_BEFORE_START),c.remove();else{d=null;break a}d&&(CKEDITOR.env.gecko?setTimeout(A,0,b,h,d):A(b,h,d))}}});CKEDITOR.tools.extend(a,{finder:new c.finder(b,{lookups:{"default":function(a){if(!a.is(CKEDITOR.dtd.$listItem)&&a.is(CKEDITOR.dtd.$block)){for(;a;){if(w(a))return; +a=a.getParent()}return CKEDITOR.LINEUTILS_BEFORE|CKEDITOR.LINEUTILS_AFTER}}}}),locator:new c.locator(b),liner:new c.liner(b,{lineStyle:{cursor:"move !important","border-top-color":"#666"},tipLeftStyle:{"border-left-color":"#666"},tipRightStyle:{"border-right-color":"#666"}})},!0)})}function M(a){var b=a.editor;b.on("contentDom",function(){var c=b.editable(),d=c.isInline()?c:b.document,e,f;c.attachListener(d,"mousedown",function(c){var b=c.data.getTarget();if(!b.type)return!1;e=a.getByElement(b);f= +0;e&&(e.inline&&b.type==CKEDITOR.NODE_ELEMENT&&b.hasAttribute("data-cke-widget-drag-handler")?f=1:l(e.wrapper,b)?e=null:(c.data.preventDefault(),CKEDITOR.env.ie||e.focus()))});c.attachListener(d,"mouseup",function(){e&&f&&(f=0,e.focus())});CKEDITOR.env.ie&&c.attachListener(d,"mouseup",function(){e&&setTimeout(function(){e.focus();e=null})})});b.on("doubleclick",function(c){var b=a.getByElement(c.data.element);if(b&&!l(b.wrapper,c.data.element))return b.fire("doubleclick",{element:c.data.element})}, +null,null,1)}function N(a){a.editor.on("key",function(b){var c=a.focused,d=a.widgetHoldingFocusedEditable,e;c?e=c.fire("key",{keyCode:b.data.keyCode}):d&&(c=b.data.keyCode,b=d.focusedEditable,c==CKEDITOR.CTRL+65?(c=b.getBogus(),d=d.editor.createRange(),d.selectNodeContents(b),c&&d.setEndAt(c,CKEDITOR.POSITION_BEFORE_START),d.select(),e=!1):8==c||46==c?(e=d.editor.getSelection().getRanges(),d=e[0],e=!(1==e.length&&d.collapsed&&d.checkBoundaryOfElement(b,CKEDITOR[8==c?"START":"END"]))):e=void 0);return e}, +null,null,1)}function P(a){function b(c){a.focused&&B(a.focused,"cut"==c.name)}var c=a.editor;c.on("contentDom",function(){var a=c.editable();a.attachListener(a,"copy",b);a.attachListener(a,"cut",b)})}function L(a){var b=a.editor;b.on("selectionCheck",function(){a.fire("checkSelection")});a.on("checkSelection",a.checkSelection,a);b.on("selectionChange",function(c){var d=(c=l(b.editable(),c.data.selection.getStartElement()))&&a.getByElement(c),e=a.widgetHoldingFocusedEditable;if(e){if(e!==d||!e.focusedEditable.equals(c))n(a, +e,null),d&&c&&n(a,d,c)}else d&&c&&n(a,d,c)});b.on("dataReady",function(){C(a).commit()});b.on("blur",function(){var c;(c=a.focused)&&t(a,c);(c=a.widgetHoldingFocusedEditable)&&n(a,c,null)})}function J(a){var b=a.editor,c={};b.on("toDataFormat",function(b){var e=CKEDITOR.tools.getNextNumber(),f=[];b.data.downcastingSessionId=e;c[e]=f;b.data.dataValue.forEach(function(c){var b=c.attributes,d;if("data-cke-widget-id"in b){if(b=a.instances[b["data-cke-widget-id"]])d=c.getFirst(v),f.push({wrapper:c,element:d, +widget:b,editables:{}}),"1"!=d.attributes["data-cke-widget-keep-attr"]&&delete d.attributes["data-widget"]}else if("data-cke-widget-editable"in b)return f[f.length-1].editables[b["data-cke-widget-editable"]]=c,!1},CKEDITOR.NODE_ELEMENT,!0)},null,null,8);b.on("toDataFormat",function(a){if(a.data.downcastingSessionId)for(var a=c[a.data.downcastingSessionId],b,f,g,i,h,j;b=a.shift();){f=b.widget;g=b.element;i=f._.downcastFn&&f._.downcastFn.call(f,g);for(j in b.editables)h=b.editables[j],delete h.attributes.contenteditable, +h.setHtml(f.editables[j].getData());i||(i=g);b.wrapper.replaceWith(i)}},null,null,13);b.on("contentDomUnload",function(){a.destroyAll(!0)})}function I(a){function b(){c.fire("lockSnapshot");a.checkWidgets({initOnlyNew:!0,focusInited:d});c.fire("unlockSnapshot")}var c=a.editor,d,e;c.on("toHtml",function(c){var b=T(a),e;for(c.data.dataValue.forEach(b.iterator,CKEDITOR.NODE_ELEMENT,!0);e=b.toBeWrapped.pop();){var h=e[0],j=h.parent;j.type==CKEDITOR.NODE_ELEMENT&&j.attributes["data-cke-widget-wrapper"]&& +j.replaceWith(h);a.wrapElement(e[0],e[1])}d=1==c.data.dataValue.children.length&&c.data.dataValue.children[0].type==CKEDITOR.NODE_ELEMENT&&c.data.dataValue.children[0].attributes["data-cke-widget-wrapper"]},null,null,8);c.on("dataReady",function(){if(e)for(var b=a,d=c.editable().find(".cke_widget_wrapper"),i,h,j=0,k=d.count();jCKEDITOR.tools.indexOf(b,a)&&c.push(a);a=CKEDITOR.tools.indexOf(d,a);0<=a&&d.splice(a,1);return this},focus:function(a){e=a;return this},commit:function(){var f=a.focused!==e,g,i;a.editor.fire("lockSnapshot"); +for(f&&(g=a.focused)&&t(a,g);g=d.pop();)b.splice(CKEDITOR.tools.indexOf(b,g),1),g.isInited()&&(i=g.editor.checkDirty(),g.setSelected(!1),!i&&g.editor.resetDirty());f&&e&&(i=a.editor.checkDirty(),a.focused=e,a.fire("widgetFocused",{widget:e}),e.setFocused(!0),!i&&a.editor.resetDirty());for(;g=c.pop();)b.push(g),g.setSelected(!0);a.editor.fire("unlockSnapshot")}}}function D(a,b,c){var d=0,b=E(b),e=a.data.classes||{},f;if(b){for(e=CKEDITOR.tools.clone(e);f=b.pop();)c?e[f]||(d=e[f]=1):e[f]&&(delete e[f], +d=1);d&&a.setData("classes",e)}}function F(a){a.cancel()}function B(a,b){var c=a.editor,d=c.document;if(!d.getById("cke_copybin")){var e=c.blockless||CKEDITOR.env.ie?"span":"div",f=d.createElement(e),g=d.createElement(e),e=CKEDITOR.env.ie&&9>CKEDITOR.env.version;g.setAttributes({id:"cke_copybin","data-cke-temp":"1"});f.setStyles({position:"absolute",width:"1px",height:"1px",overflow:"hidden"});f.setStyle("ltr"==c.config.contentsLangDirection?"left":"right","-5000px");f.setHtml('​'+ +a.wrapper.getOuterHtml()+'​');c.fire("saveSnapshot");c.fire("lockSnapshot");g.append(f);c.editable().append(g);var i=c.on("selectionChange",F,null,null,0),h=a.repository.on("checkSelection",F,null,null,0);if(e)var j=d.getDocumentElement().$,k=j.scrollTop;d=c.createRange();d.selectNodeContents(f);d.select();e&&(j.scrollTop=k);setTimeout(function(){b||a.focus();g.remove();i.removeListener();h.removeListener();c.fire("unlockSnapshot");if(b){a.repository.del(a);c.fire("saveSnapshot")}}, +100)}}function E(a){return(a=(a=a.getDefinition().attributes)&&a["class"])?a.split(/\s+/):null}function G(){var a=CKEDITOR.document.getActive(),b=this.editor,c=b.editable();(c.isInline()?c:b.document.getWindow().getFrame()).equals(a)&&b.focusManager.focus(c)}function H(){CKEDITOR.env.gecko&&this.editor.unlockSelection();CKEDITOR.env.webkit||(this.editor.forceNextSelectionCheck(),this.editor.selectionChange(1))}function Y(a){var b=null;a.on("data",function(){var a=this.data.classes,d;if(b!=a){for(d in b)(!a|| +!a[d])&&this.removeClass(d);for(d in a)this.addClass(d);b=a}})}function Z(a){if(a.draggable){var b=a.editor,c=a.wrapper.getLast(U),d;c?d=c.findOne("img"):(c=new CKEDITOR.dom.element("span",b.document),c.setAttributes({"class":"cke_reset cke_widget_drag_handler_container",style:"background:rgba(220,220,220,0.5);background-image:url("+b.plugins.widget.path+"images/handle.png)"}),d=new CKEDITOR.dom.element("img",b.document),d.setAttributes({"class":"cke_reset cke_widget_drag_handler","data-cke-widget-drag-handler":"1", +src:CKEDITOR.tools.transparentImageData,width:m,title:b.lang.widget.move,height:m}),a.inline&&d.setAttribute("draggable","true"),c.append(d),a.wrapper.append(c));a.wrapper.on("mouseenter",a.updateDragHandlerPosition,a);setTimeout(function(){a.on("data",a.updateDragHandlerPosition,a)},50);if(a.inline)d.on("dragstart",function(c){c.data.$.dataTransfer.setData("text",JSON.stringify({type:"cke-widget",editor:b.name,id:a.id}))});else d.on("mousedown",$,a);a.dragHandlerContainer=c}}function $(){function a(){var a; +for(j.reset();a=g.pop();)a.removeListener();var c=i,b=this.repository.finder;a=this.repository.liner;var d=this.editor,e=this.editor.editable();CKEDITOR.tools.isEmpty(a.visible)||(c=b.getRange(c[0]),this.focus(),d.fire("saveSnapshot"),d.fire("lockSnapshot",{dontUpdate:1}),d.getSelection().reset(),e.insertElementIntoRange(this.wrapper,c),this.focus(),d.fire("unlockSnapshot"),d.fire("saveSnapshot"));e.removeClass("cke_widget_dragging");a.hideVisible()}var b=this.repository.finder,c=this.repository.locator, +d=this.repository.liner,e=this.editor,f=e.editable(),g=[],i=[],h=b.greedySearch(),j=CKEDITOR.tools.eventsBuffer(50,function(){k=c.locate(h);i=c.sort(l,1);i.length&&(d.prepare(h,k),d.placeLine(i[0]),d.cleanup())}),k,l;f.addClass("cke_widget_dragging");g.push(f.on("mousemove",function(a){l=a.data.$.clientY;j.input()}));g.push(e.document.once("mouseup",a,this));g.push(CKEDITOR.document.once("mouseup",a,this))}function aa(a){var b,c,d=a.editables;a.editables={};if(a.editables)for(b in d)c=d[b],a.initEditable(b, +"string"==typeof c?{selector:c}:c)}function ba(a){if(a.mask){var b=a.wrapper.findOne(".cke_widget_mask");b||(b=new CKEDITOR.dom.element("img",a.editor.document),b.setAttributes({src:CKEDITOR.tools.transparentImageData,"class":"cke_reset cke_widget_mask"}),a.wrapper.append(b));a.mask=b}}function ca(a){if(a.parts){var b={},c,d;for(d in a.parts)c=a.wrapper.findOne(a.parts[d]),b[d]=c;a.parts=b}}function Q(a,b){da(a);ca(a);aa(a);ba(a);Z(a);Y(a);if(CKEDITOR.env.ie&&9>CKEDITOR.env.version)a.wrapper.on("dragstart", +function(c){var b=c.data.getTarget();!l(a,b)&&(!a.inline||!(b.type==CKEDITOR.NODE_ELEMENT&&b.hasAttribute("data-cke-widget-drag-handler")))&&c.data.preventDefault()});a.wrapper.removeClass("cke_widget_new");a.element.addClass("cke_widget_element");a.on("key",function(b){b=b.data.keyCode;if(13==b)a.edit();else{if(b==CKEDITOR.CTRL+67||b==CKEDITOR.CTRL+88){B(a,b==CKEDITOR.CTRL+88);return}if(b in ea||CKEDITOR.CTRL&b||CKEDITOR.ALT&b)return}return!1},null,null,999);a.on("doubleclick",function(b){a.edit()&& +b.cancel()});if(b.data)a.on("data",b.data);if(b.edit)a.on("edit",b.edit)}function da(a){(a.wrapper=a.element.getParent()).setAttribute("data-cke-widget-id",a.id)}function s(a){a.element.data("cke-widget-data",encodeURIComponent(JSON.stringify(a.data)))}var m=15;CKEDITOR.plugins.add("widget",{lang:"af,ar,ca,cs,cy,da,de,el,en,en-gb,eo,es,fa,fi,fr,gl,he,hr,hu,it,ja,km,ko,ku,nb,nl,no,pl,pt,pt-br,ru,sk,sl,sq,sv,tr,tt,uk,vi,zh,zh-cn",requires:"lineutils,clipboard",onLoad:function(){CKEDITOR.addCss(".cke_widget_wrapper{position:relative;outline:none}.cke_widget_inline{display:inline-block}.cke_widget_wrapper:hover>.cke_widget_element{outline:2px solid yellow;cursor:default}.cke_widget_wrapper:hover .cke_widget_editable{outline:2px solid yellow}.cke_widget_wrapper.cke_widget_focused>.cke_widget_element,.cke_widget_wrapper .cke_widget_editable.cke_widget_editable_focused{outline:2px solid #ace}.cke_widget_editable{cursor:text}.cke_widget_drag_handler_container{position:absolute;width:"+ +m+"px;height:0;left:-9999px;opacity:0.75;transition:height 0s 0.2s;line-height:0}.cke_widget_wrapper:hover>.cke_widget_drag_handler_container{height:"+m+"px;transition:none}.cke_widget_drag_handler_container:hover{opacity:1}img.cke_widget_drag_handler{cursor:move;width:"+m+"px;height:"+m+"px;display:inline-block}.cke_widget_mask{position:absolute;top:0;left:0;width:100%;height:100%;display:block}.cke_editable.cke_widget_dragging, .cke_editable.cke_widget_dragging *{cursor:move !important}")},beforeInit:function(a){a.widgets= +new o(a)},afterInit:function(a){var b=a.widgets.registered,c,d,e;for(d in b)c=b[d],(e=c.button)&&a.ui.addButton&&a.ui.addButton(CKEDITOR.tools.capitalize(c.name,!0),{label:e,command:c.name,toolbar:"insert,10"});V(a)}});o.prototype={MIN_SELECTION_CHECK_INTERVAL:500,add:function(a,b){b=CKEDITOR.tools.prototypedCopy(b);b.name=a;b._=b._||{};this.editor.fire("widgetDefinition",b);b.template&&(b.template=new CKEDITOR.template(b.template));R(this.editor,b);var c=b,d=c.upcast;if(d)if("string"==typeof d)for(d= +d.split(",");d.length;)this._.upcasts.push([c.upcasts[d.pop()],c.name]);else this._.upcasts.push([d,c.name]);return this.registered[a]=b},addUpcastCallback:function(a){this._.upcastCallbacks.push(a)},checkSelection:function(){var a=this.editor.getSelection(),b=a.getSelectedElement(),c=C(this),d;if(b&&(d=this.getByElement(b,!0)))return c.focus(d).select(d).commit();a=a.getRanges()[0];if(!a||a.collapsed)return c.commit();a=new CKEDITOR.dom.walker(a);for(a.evaluator=r;b=a.next();)c.select(this.getByElement(b)); +c.commit()},checkWidgets:function(a){this.fire("checkWidgets",CKEDITOR.tools.copy(a||{}))},del:function(a){if(this.focused===a){var b=a.editor,c=b.createRange(),d;if(!(d=c.moveToClosestEditablePosition(a.wrapper,!0)))d=c.moveToClosestEditablePosition(a.wrapper,!1);d&&b.getSelection().selectRanges([c])}a.wrapper.remove();this.destroy(a,!0)},destroy:function(a,b){this.widgetHoldingFocusedEditable===a&&n(this,a,null,b);a.destroy(b);delete this.instances[a.id];this.fire("instanceDestroyed",a)},destroyAll:function(a){var b= +this.instances,c,d;for(d in b)c=b[d],this.destroy(c,a)},finalizeCreation:function(a){if((a=a.getFirst())&&r(a))this.editor.insertElement(a),a=this.getByElement(a),a.ready=!0,a.fire("ready"),a.focus()},getByElement:function(){var a={div:1,span:1};return function(b,c){if(!b)return null;var d=b.is(a)&&b.data("cke-widget-id");if(!c&&!d){var e=this.editor.editable();do b=b.getParent();while(b&&!b.equals(e)&&!(d=b.is(a)&&b.data("cke-widget-id")))}return this.instances[d]||null}}(),initOn:function(a,b,c){b? +"string"==typeof b&&(b=this.registered[b]):b=this.registered[a.data("widget")];if(!b)return null;var d=this.wrapElement(a,b.name);return d?d.hasClass("cke_widget_new")?(a=new k(this,this._.nextId++,a,b,c),a.isInited()?this.instances[a.id]=a:null):this.getByElement(a):null},initOnAll:function(a){for(var a=(a||this.editor.editable()).find(".cke_widget_new"),b=[],c,d=a.count();d--;)(c=this.initOn(a.getItem(d).getFirst(p)))&&b.push(c);return b},parseElementClasses:function(a){if(!a)return null;for(var a= +CKEDITOR.tools.trim(a).split(/\s+/),b,c={},d=0;b=a.pop();)-1==b.indexOf("cke_")&&(c[b]=d=1);return d?c:null},wrapElement:function(a,b){var c=null,d,e;if(a instanceof CKEDITOR.dom.element){d=this.registered[b||a.data("widget")];if(!d)return null;if((c=a.getParent())&&c.type==CKEDITOR.NODE_ELEMENT&&c.data("cke-widget-wrapper"))return c;a.hasAttribute("data-cke-widget-keep-attr")||a.data("cke-widget-keep-attr",a.data("widget")?1:0);b&&a.data("widget",b);e=z(d,a.getName());c=new CKEDITOR.dom.element(e? +"span":"div");c.setAttributes(x(e));c.data("cke-display-name",d.pathName?d.pathName:a.getName());a.getParent(!0)&&c.replace(a);a.appendTo(c)}else if(a instanceof CKEDITOR.htmlParser.element){d=this.registered[b||a.attributes["data-widget"]];if(!d)return null;if((c=a.parent)&&c.type==CKEDITOR.NODE_ELEMENT&&c.attributes["data-cke-widget-wrapper"])return c;"data-cke-widget-keep-attr"in a.attributes||(a.attributes["data-cke-widget-keep-attr"]=a.attributes["data-widget"]?1:0);b&&(a.attributes["data-widget"]= +b);e=z(d,a.name);c=new CKEDITOR.htmlParser.element(e?"span":"div",x(e));c.attributes["data-cke-display-name"]=d.pathName?d.pathName:a.name;d=a.parent;var f;d&&(f=a.getIndex(),a.remove());c.add(a);d&&y(d,f,c)}return c},_tests_getNestedEditable:l,_tests_createEditableFilter:u};CKEDITOR.event.implementOn(o.prototype);k.prototype={addClass:function(a){this.element.addClass(a)},applyStyle:function(a){D(this,a,1)},checkStyleActive:function(a){var a=E(a),b;if(!a)return!1;for(;b=a.pop();)if(!this.hasClass(b))return!1; +return!0},destroy:function(a){this.fire("destroy");if(this.editables)for(var b in this.editables)this.destroyEditable(b,a);a||("0"==this.element.data("cke-widget-keep-attr")&&this.element.removeAttribute("data-widget"),this.element.removeAttributes(["data-cke-widget-data","data-cke-widget-keep-attr"]),this.element.removeClass("cke_widget_element"),this.element.replace(this.wrapper));this.wrapper=null},destroyEditable:function(a,b){var c=this.editables[a];c.removeListener("focus",H);c.removeListener("blur", +G);this.editor.focusManager.remove(c);b||(c.removeClass("cke_widget_editable"),c.removeClass("cke_widget_editable_focused"),c.removeAttributes(["contenteditable","data-cke-widget-editable","data-cke-enter-mode"]));delete this.editables[a]},edit:function(){var a={dialog:this.dialog},b=this;if(!1===this.fire("edit",a)||!a.dialog)return!1;this.editor.openDialog(a.dialog,function(a){var d,e;!1!==b.fire("dialog",a)&&(d=a.on("show",function(){a.setupContent(b)}),e=a.on("ok",function(){var d,e=b.on("data", +function(a){d=1;a.cancel()},null,null,0);b.editor.fire("saveSnapshot");a.commitContent(b);e.removeListener();d&&(b.fire("data",b.data),b.editor.fire("saveSnapshot"))}),a.once("hide",function(){d.removeListener();e.removeListener()}))});return!0},getClasses:function(){return this.repository.parseElementClasses(this.element.getAttribute("class"))},hasClass:function(a){return this.element.hasClass(a)},initEditable:function(a,b){var c=this.wrapper.findOne(b.selector);return c&&c.is(CKEDITOR.dtd.$editable)? +(c=new q(this.editor,c,{filter:u.call(this.repository,this.name,a,b)}),this.editables[a]=c,c.setAttributes({contenteditable:"true","data-cke-widget-editable":a,"data-cke-enter-mode":c.enterMode}),c.filter&&c.data("cke-filter",c.filter.id),c.addClass("cke_widget_editable"),c.removeClass("cke_widget_editable_focused"),b.pathName&&c.data("cke-display-name",b.pathName),this.editor.focusManager.add(c),c.on("focus",H,this),CKEDITOR.env.ie&&c.on("blur",G,this),c.setData(c.getHtml()),!0):!1},isInited:function(){return!(!this.wrapper|| +!this.inited)},isReady:function(){return this.isInited()&&this.ready},focus:function(){var a=this.editor.getSelection();if(a){var b=this.editor.checkDirty();a.fake(this.wrapper);!b&&this.editor.resetDirty()}this.editor.focus()},removeClass:function(a){this.element.removeClass(a)},removeStyle:function(a){D(this,a,0)},setData:function(a,b){var c=this.data,d=0;if("string"==typeof a)c[a]!==b&&(c[a]=b,d=1);else{var e=a;for(a in e)c[a]!==e[a]&&(d=1,c[a]=e[a])}d&&this.dataReady&&(s(this),this.fire("data", +c));return this},setFocused:function(a){this.wrapper[a?"addClass":"removeClass"]("cke_widget_focused");this.fire(a?"focus":"blur");return this},setSelected:function(a){this.wrapper[a?"addClass":"removeClass"]("cke_widget_selected");this.fire(a?"select":"deselect");return this},updateDragHandlerPosition:function(){var a=this.editor,b=this.element.$,c=this._.dragHandlerOffset,b={x:b.offsetLeft,y:b.offsetTop-m};if(!c||!(b.x==c.x&&b.y==c.y))c=a.checkDirty(),a.fire("lockSnapshot"),this.dragHandlerContainer.setStyles({top:b.y+ +"px",left:b.x+"px"}),a.fire("unlockSnapshot"),!c&&a.resetDirty(),this._.dragHandlerOffset=b}};CKEDITOR.event.implementOn(k.prototype);q.prototype=CKEDITOR.tools.extend(CKEDITOR.tools.prototypedCopy(CKEDITOR.dom.element.prototype),{setData:function(a){a=this.editor.dataProcessor.toHtml(a,{context:this.getName(),filter:this.filter,enterMode:this.enterMode});this.setHtml(a);this.editor.widgets.initOnAll(this)},getData:function(){return this.editor.dataProcessor.toDataFormat(this.getHtml(),{context:this.getName(), +filter:this.filter,enterMode:this.enterMode})}});var X=RegExp('^(?:<(?:div|span)(?: data-cke-temp="1")?(?: id="cke_copybin")?(?: data-cke-temp="1")?>)?(?:<(?:div|span)(?: style="[^"]+")?>)?]*data-cke-copybin-start="1"[^>]*>.?([\\s\\S]+)]*data-cke-copybin-end="1"[^>]*>.?(?:)?(?:)?$'),ea={37:1,38:1,39:1,40:1,8:1,46:1};(function(){function a(){}function b(a,b,e){return!e||!this.checkElement(a)?!1:(a=e.widgets.getByElement(a,!0))&&a.checkStyleActive(this)} +CKEDITOR.style.addCustomHandler({type:"widget",setup:function(a){this.widget=a.widget},apply:function(a){a instanceof CKEDITOR.editor&&this.checkApplicable(a.elementPath(),a)&&a.widgets.focused.applyStyle(this)},remove:function(a){a instanceof CKEDITOR.editor&&this.checkApplicable(a.elementPath(),a)&&a.widgets.focused.removeStyle(this)},checkActive:function(a,b){return this.checkElementMatch(a.lastElement,0,b)},checkApplicable:function(a,b){return!(b instanceof CKEDITOR.editor)?!1:this.checkElement(a.lastElement)}, +checkElementMatch:b,checkElementRemovable:b,checkElement:function(a){return!r(a)?!1:(a=a.getFirst(p))&&a.data("widget")==this.widget},buildPreview:function(a){return a||this._.definition.name},toAllowedContentRules:function(a){if(!a)return null;var a=a.widgets.registered[this.widget],b,e={};if(!a)return null;if(a.styleableElements){b=this.getClassesArray();if(!b)return null;e[a.styleableElements]={classes:b,propertiesOnly:!0};return e}return a.styleToAllowedContentRules?a.styleToAllowedContentRules(this): +null},getClassesArray:function(){var a=this._.definition.attributes&&this._.definition.attributes["class"];return a?CKEDITOR.tools.trim(a).split(/\s+/):null},applyToRange:a,removeFromRange:a,applyToObject:a})})();CKEDITOR.plugins.widget=k;k.repository=o;k.nestedEditable=q})(); \ No newline at end of file diff --git a/bower_components/ckeditor/plugins/wsc/LICENSE.md b/bower_components/ckeditor/plugins/wsc/LICENSE.md new file mode 100644 index 0000000..c7d374a --- /dev/null +++ b/bower_components/ckeditor/plugins/wsc/LICENSE.md @@ -0,0 +1,28 @@ +Software License Agreement +========================== + +**CKEditor WSC Plugin** +Copyright © 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: + +* GNU General Public License Version 2 or later (the "GPL"): + http://www.gnu.org/licenses/gpl.html + +* GNU Lesser General Public License Version 2.1 or later (the "LGPL"): + http://www.gnu.org/licenses/lgpl.html + +* Mozilla Public License Version 1.1 or later (the "MPL"): + http://www.mozilla.org/MPL/MPL-1.1.html + +You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice. + +Sources of Intellectual Property Included in this plugin +-------------------------------------------------------- + +Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/bower_components/ckeditor/plugins/wsc/dialogs/ciframe.html b/bower_components/ckeditor/plugins/wsc/dialogs/ciframe.html new file mode 100644 index 0000000..82df25b --- /dev/null +++ b/bower_components/ckeditor/plugins/wsc/dialogs/ciframe.html @@ -0,0 +1,66 @@ + + + + + + + + +

        + diff --git a/bower_components/ckeditor/plugins/wsc/dialogs/tmpFrameset.html b/bower_components/ckeditor/plugins/wsc/dialogs/tmpFrameset.html new file mode 100644 index 0000000..c2d82aa --- /dev/null +++ b/bower_components/ckeditor/plugins/wsc/dialogs/tmpFrameset.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + diff --git a/bower_components/ckeditor/plugins/wsc/dialogs/wsc.css b/bower_components/ckeditor/plugins/wsc/dialogs/wsc.css new file mode 100644 index 0000000..496d731 --- /dev/null +++ b/bower_components/ckeditor/plugins/wsc/dialogs/wsc.css @@ -0,0 +1,82 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +html, body +{ + background-color: transparent; + margin: 0px; + padding: 0px; +} + +body +{ + padding: 10px; +} + +body, td, input, select, textarea +{ + font-size: 11px; + font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana; +} + +.midtext +{ + padding:0px; + margin:10px; +} + +.midtext p +{ + padding:0px; + margin:10px; +} + +.Button +{ + border: #737357 1px solid; + color: #3b3b1f; + background-color: #c7c78f; +} + +.PopupTabArea +{ + color: #737357; + background-color: #e3e3c7; +} + +.PopupTitleBorder +{ + border-bottom: #d5d59d 1px solid; +} +.PopupTabEmptyArea +{ + padding-left: 10px; + border-bottom: #d5d59d 1px solid; +} + +.PopupTab, .PopupTabSelected +{ + border-right: #d5d59d 1px solid; + border-top: #d5d59d 1px solid; + border-left: #d5d59d 1px solid; + padding: 3px 5px 3px 5px; + color: #737357; +} + +.PopupTab +{ + margin-top: 1px; + border-bottom: #d5d59d 1px solid; + cursor: pointer; +} + +.PopupTabSelected +{ + font-weight: bold; + cursor: default; + padding-top: 4px; + border-bottom: #f1f1e3 1px solid; + background-color: #f1f1e3; +} diff --git a/bower_components/ckeditor/plugins/wsc/dialogs/wsc.js b/bower_components/ckeditor/plugins/wsc/dialogs/wsc.js new file mode 100644 index 0000000..b53a48c --- /dev/null +++ b/bower_components/ckeditor/plugins/wsc/dialogs/wsc.js @@ -0,0 +1,74 @@ +/* + Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +(function(){function q(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}function z(a){if(!a)throw"Languages-by-groups list are required for construct selectbox";var c=[],d="",f;for(f in a)for(var g in a[f]){var h=a[f][g];"en_US"==h?d=h:c.push(h)}c.sort();d&&c.unshift(d);return{getCurrentLangGroup:function(c){a:{for(var d in a)for(var f in a[d])if(f.toUpperCase()===c.toUpperCase()){c=d;break a}c=""}return c},setLangList:function(){var c={},d;for(d in a)for(var f in a[d])c[a[d][f]]= +f;return c}()}}var e=function(){var a=function(a,b,f){var f=f||{},g=f.expires;if("number"==typeof g&&g){var h=new Date;h.setTime(h.getTime()+1E3*g);g=f.expires=h}g&&g.toUTCString&&(f.expires=g.toUTCString());var b=encodeURIComponent(b),a=a+"="+b,e;for(e in f)b=f[e],a+="; "+e,!0!==b&&(a+="="+b);document.cookie=a};return{postMessage:{init:function(a){window.addEventListener?window.addEventListener("message",a,!1):window.attachEvent("onmessage",a)},send:function(a){var b=Object.prototype.toString,f= +a.fn||null,g=a.id||"",e=a.target||window,i=a.message||{id:g};a.message&&"[object Object]"==b.call(a.message)&&(a.message.id||(a.message.id=g),i=a.message);a=window.JSON.stringify(i,f);e.postMessage(a,"*")},unbindHandler:function(a){window.removeEventListener?window.removeEventListener("message",a,!1):window.detachEvent("onmessage",a)}},hash:{create:function(){},parse:function(){}},cookie:{set:a,get:function(a){return(a=document.cookie.match(RegExp("(?:^|; )"+a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, +"\\$1")+"=([^;]*)")))?decodeURIComponent(a[1]):void 0},remove:function(c){a(c,"",{expires:-1})}},misc:{findFocusable:function(a){var b=null;a&&(b=a.find("a[href], area[href], input, select, textarea, button, *[tabindex], *[contenteditable]"));return b},isVisible:function(a){return!(0===a.offsetWidth||0==a.offsetHeight||"none"===(document.defaultView&&document.defaultView.getComputedStyle?document.defaultView.getComputedStyle(a,null).display:a.currentStyle?a.currentStyle.display:a.style.display))}, +hasClass:function(a,b){return!(!a.className||!a.className.match(RegExp("(\\s|^)"+b+"(\\s|$)")))}}}}(),a=a||{};a.TextAreaNumber=null;a.load=!0;a.cmd={SpellTab:"spell",Thesaurus:"thes",GrammTab:"grammar"};a.dialog=null;a.optionNode=null;a.selectNode=null;a.grammerSuggest=null;a.textNode={};a.iframeMain=null;a.dataTemp="";a.div_overlay=null;a.textNodeInfo={};a.selectNode={};a.selectNodeResponce={};a.langList=null;a.langSelectbox=null;a.banner="";a.show_grammar=null;a.div_overlay_no_check=null;a.targetFromFrame= +{};a.onLoadOverlay=null;a.LocalizationComing={};a.OverlayPlace=null;a.LocalizationButton={ChangeTo:{instance:null,text:"Change to"},ChangeAll:{instance:null,text:"Change All"},IgnoreWord:{instance:null,text:"Ignore word"},IgnoreAllWords:{instance:null,text:"Ignore all words"},Options:{instance:null,text:"Options",optionsDialog:{instance:null}},AddWord:{instance:null,text:"Add word"},FinishChecking:{instance:null,text:"Finish Checking"}};a.LocalizationLabel={ChangeTo:{instance:null,text:"Change to"}, +Suggestions:{instance:null,text:"Suggestions"}};var A=function(b){var c,d;for(d in b)c=b[d].instance.getElement().getFirst()||b[d].instance.getElement(),c.setText(a.LocalizationComing[d])},B=function(b){for(var c in b){if(!b[c].instance.setLabel)break;b[c].instance.setLabel(a.LocalizationComing[c])}},j,r;a.framesetHtml=function(b){return"'}; +a.setIframe=function(b,c){var d;d=a.framesetHtml(c);var f=a.iframeNumber+"_"+c;b.getElement().setHtml(d);d=document.getElementById(f);d=d.contentWindow?d.contentWindow:d.contentDocument.document?d.contentDocument.document:d.contentDocument;d.document.open();d.document.write('iframe
        + + + + +

        + CKEditor Samples » Create and Destroy Editor Instances for Ajax Applications +

        +
        +

        + This sample shows how to create and destroy CKEditor instances on the fly. After the removal of CKEditor the content created inside the editing + area will be displayed in a <div> element. +

        +

        + For details of how to create this setup check the source code of this sample page + for JavaScript code responsible for the creation and destruction of a CKEditor instance. +

        +
        +

        Click the buttons to create and remove a CKEditor instance.

        +

        + + +

        + +
        +
        +
        +

        + Edited Contents: +

        + +
        +
        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/api.html b/bower_components/ckeditor/samples/api.html new file mode 100644 index 0000000..50f568e --- /dev/null +++ b/bower_components/ckeditor/samples/api.html @@ -0,0 +1,207 @@ + + + + + + API Usage — CKEditor Sample + + + + + + +

        + CKEditor Samples » Using CKEditor JavaScript API +

        +
        +

        + This sample shows how to use the + CKEditor JavaScript API + to interact with the editor at runtime. +

        +

        + For details on how to create this setup check the source code of this sample page. +

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

        +

        + +
        + + + +

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

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/appendto.html b/bower_components/ckeditor/samples/appendto.html new file mode 100644 index 0000000..8ed16b6 --- /dev/null +++ b/bower_components/ckeditor/samples/appendto.html @@ -0,0 +1,56 @@ + + + + + + Append To Page Element Using JavaScript Code — CKEditor Sample + + + + +

        + CKEditor Samples » Append To Page Element Using JavaScript Code +

        +
        +
        +

        + The CKEDITOR.appendTo() method serves to to place editors inside existing DOM elements. Unlike CKEDITOR.replace(), + a target container to be replaced is no longer necessary. A new editor + instance is inserted directly wherever it is desired. +

        +
        CKEDITOR.appendTo( 'container_id',
        +	{ /* Configuration options to be used. */ }
        +	'Editor content to be used.'
        +);
        +
        + +
        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/assets/inlineall/logo.png b/bower_components/ckeditor/samples/assets/inlineall/logo.png new file mode 100644 index 0000000..b4d5979 Binary files /dev/null and b/bower_components/ckeditor/samples/assets/inlineall/logo.png differ diff --git a/bower_components/ckeditor/samples/assets/outputxhtml/outputxhtml.css b/bower_components/ckeditor/samples/assets/outputxhtml/outputxhtml.css new file mode 100644 index 0000000..1b3bf64 --- /dev/null +++ b/bower_components/ckeditor/samples/assets/outputxhtml/outputxhtml.css @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + * + * Styles used by the XHTML 1.1 sample page (xhtml.html). + */ + +/** + * Basic definitions for the editing area. + */ +body +{ + font-family: Arial, Verdana, sans-serif; + font-size: 80%; + color: #000000; + background-color: #ffffff; + padding: 5px; + margin: 0px; +} + +/** + * Core styles. + */ + +.Bold +{ + font-weight: bold; +} + +.Italic +{ + font-style: italic; +} + +.Underline +{ + text-decoration: underline; +} + +.StrikeThrough +{ + text-decoration: line-through; +} + +.Subscript +{ + vertical-align: sub; + font-size: smaller; +} + +.Superscript +{ + vertical-align: super; + font-size: smaller; +} + +/** + * Font faces. + */ + +.FontComic +{ + font-family: 'Comic Sans MS'; +} + +.FontCourier +{ + font-family: 'Courier New'; +} + +.FontTimes +{ + font-family: 'Times New Roman'; +} + +/** + * Font sizes. + */ + +.FontSmaller +{ + font-size: smaller; +} + +.FontLarger +{ + font-size: larger; +} + +.FontSmall +{ + font-size: 8pt; +} + +.FontBig +{ + font-size: 14pt; +} + +.FontDouble +{ + font-size: 200%; +} + +/** + * Font colors. + */ +.FontColor1 +{ + color: #ff9900; +} + +.FontColor2 +{ + color: #0066cc; +} + +.FontColor3 +{ + color: #ff0000; +} + +.FontColor1BG +{ + background-color: #ff9900; +} + +.FontColor2BG +{ + background-color: #0066cc; +} + +.FontColor3BG +{ + background-color: #ff0000; +} + +/** + * Indentation. + */ + +.Indent1 +{ + margin-left: 40px; +} + +.Indent2 +{ + margin-left: 80px; +} + +.Indent3 +{ + margin-left: 120px; +} + +/** + * Alignment. + */ + +.JustifyLeft +{ + text-align: left; +} + +.JustifyRight +{ + text-align: right; +} + +.JustifyCenter +{ + text-align: center; +} + +.JustifyFull +{ + text-align: justify; +} + +/** + * Other. + */ + +code +{ + font-family: courier, monospace; + background-color: #eeeeee; + padding-left: 1px; + padding-right: 1px; + border: #c0c0c0 1px solid; +} + +kbd +{ + padding: 0px 1px 0px 1px; + border-width: 1px 2px 2px 1px; + border-style: solid; +} + +blockquote +{ + color: #808080; +} diff --git a/bower_components/ckeditor/samples/assets/posteddata.php b/bower_components/ckeditor/samples/assets/posteddata.php new file mode 100644 index 0000000..1e1406f --- /dev/null +++ b/bower_components/ckeditor/samples/assets/posteddata.php @@ -0,0 +1,59 @@ + + + + + + Sample — CKEditor + + + +

        + CKEditor — Posted Data +

        + + + + + + + + + $value ) + { + if ( ( !is_string($value) && !is_numeric($value) ) || !is_string($key) ) + continue; + + if ( get_magic_quotes_gpc() ) + $value = htmlspecialchars( stripslashes((string)$value) ); + else + $value = htmlspecialchars( (string)$value ); +?> + + + + + +
        Field NameValue
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/assets/sample.jpg b/bower_components/ckeditor/samples/assets/sample.jpg new file mode 100644 index 0000000..9498271 Binary files /dev/null and b/bower_components/ckeditor/samples/assets/sample.jpg differ diff --git a/bower_components/ckeditor/samples/assets/uilanguages/languages.js b/bower_components/ckeditor/samples/assets/uilanguages/languages.js new file mode 100644 index 0000000..df9c682 --- /dev/null +++ b/bower_components/ckeditor/samples/assets/uilanguages/languages.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +var CKEDITOR_LANGS=function(){var c={af:"Afrikaans",ar:"Arabic",bg:"Bulgarian",bn:"Bengali/Bangla",bs:"Bosnian",ca:"Catalan",cs:"Czech",cy:"Welsh",da:"Danish",de:"German",el:"Greek",en:"English","en-au":"English (Australia)","en-ca":"English (Canadian)","en-gb":"English (United Kingdom)",eo:"Esperanto",es:"Spanish",et:"Estonian",eu:"Basque",fa:"Persian",fi:"Finnish",fo:"Faroese",fr:"French","fr-ca":"French (Canada)",gl:"Galician",gu:"Gujarati",he:"Hebrew",hi:"Hindi",hr:"Croatian",hu:"Hungarian",id:"Indonesian", +is:"Icelandic",it:"Italian",ja:"Japanese",ka:"Georgian",km:"Khmer",ko:"Korean",ku:"Kurdish",lt:"Lithuanian",lv:"Latvian",mk:"Macedonian",mn:"Mongolian",ms:"Malay",nb:"Norwegian Bokmal",nl:"Dutch",no:"Norwegian",pl:"Polish",pt:"Portuguese (Portugal)","pt-br":"Portuguese (Brazil)",ro:"Romanian",ru:"Russian",si:"Sinhala",sk:"Slovak",sq:"Albanian",sl:"Slovenian",sr:"Serbian (Cyrillic)","sr-latn":"Serbian (Latin)",sv:"Swedish",th:"Thai",tr:"Turkish",tt:"Tatar",ug:"Uighur",uk:"Ukrainian",vi:"Vietnamese", +zh:"Chinese Traditional","zh-cn":"Chinese Simplified"},b=[],a;for(a in CKEDITOR.lang.languages)b.push({code:a,name:c[a]||a});b.sort(function(a,b){return a.name + + + + + Data Filtering — CKEditor Sample + + + + + +

        + CKEditor Samples » Data Filtering and Features Activation +

        +
        +

        + This sample page demonstrates the idea of Advanced Content Filter + (ACF), a sophisticated + tool that takes control over what kind of data is accepted by the editor and what + kind of output is produced. +

        +

        When and what is being filtered?

        +

        + ACF controls + every single source of data that comes to the editor. + It process both HTML that is inserted manually (i.e. pasted by the user) + and programmatically like: +

        +
        +editor.setData( '<p>Hello world!</p>' );
        +
        +

        + ACF discards invalid, + useless HTML tags and attributes so the editor remains "clean" during + runtime. ACF behaviour + can be configured and adjusted for a particular case to prevent the + output HTML (i.e. in CMS systems) from being polluted. + + This kind of filtering is a first, client-side line of defense + against "tag soups", + the tool that precisely restricts which tags, attributes and styles + are allowed (desired). When properly configured, ACF + is an easy and fast way to produce a high-quality, intentionally filtered HTML. +

        + +

        How to configure or disable ACF?

        +

        + Advanced Content Filter is enabled by default, working in "automatic mode", yet + it provides a set of easy rules that allow adjusting filtering rules + and disabling the entire feature when necessary. The config property + responsible for this feature is config.allowedContent. +

        +

        + By "automatic mode" is meant that loaded plugins decide which kind + of content is enabled and which is not. For example, if the link + plugin is loaded it implies that <a> tag is + automatically allowed. Each plugin is given a set + of predefined ACF rules + that control the editor until + config.allowedContent + is defined manually. +

        +

        + Let's assume our intention is to restrict the editor to accept (produce) paragraphs + only: no attributes, no styles, no other tags. + With ACF + this is very simple. Basically set + config.allowedContent to 'p': +

        +
        +var editor = CKEDITOR.replace( textarea_id, {
        +	allowedContent: 'p'
        +} );
        +
        +

        + Now try to play with allowed content: +

        +
        +// Trying to insert disallowed tag and attribute.
        +editor.setData( '<p style="color: red">Hello <em>world</em>!</p>' );
        +alert( editor.getData() );
        +
        +// Filtered data is returned.
        +"<p>Hello world!</p>"
        +
        +

        + What happened? Since config.allowedContent: 'p' is set the editor assumes + that only plain <p> are accepted. Nothing more. This is why + style attribute and <em> tag are gone. The same + filtering would happen if we pasted disallowed HTML into this editor. +

        +

        + This is just a small sample of what ACF + can do. To know more, please refer to the sample section below and + the official Advanced Content Filter guide. +

        +

        + You may, of course, want CKEditor to avoid filtering of any kind. + To get rid of ACF, + basically set + config.allowedContent to true like this: +

        +
        +CKEDITOR.replace( textarea_id, {
        +	allowedContent: true
        +} );
        +
        + +

        Beyond data flow: Features activation

        +

        + ACF is far more than + I/O control: the entire + UI of the editor is adjusted to what + filters restrict. For example: if <a> tag is + disallowed + by ACF, + then accordingly link command, toolbar button and link dialog + are also disabled. Editor is smart: it knows which features must be + removed from the interface to match filtering rules. +

        +

        + CKEditor can be far more specific. If <a> tag is + allowed by filtering rules to be used but it is restricted + to have only one attribute (href) + config.allowedContent = 'a[!href]', then + "Target" tab of the link dialog is automatically disabled as target + attribute isn't included in ACF rules + for <a>. This behaviour applies to dialog fields, context + menus and toolbar buttons. +

        + +

        Sample configurations

        +

        + There are several editor instances below that present different + ACF setups. All of them, + except the last inline instance, share the same HTML content to visualize + how different filtering rules affect the same input data. +

        +
        + +
        + +
        +

        + This editor is using default configuration ("automatic mode"). It means that + + config.allowedContent is defined by loaded plugins. + Each plugin extends filtering rules to make it's own associated content + available for the user. +

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

        + This editor is using a custom configuration for + ACF: +

        +
        +CKEDITOR.replace( 'editor2', {
        +	allowedContent:
        +		'h1 h2 h3 p blockquote strong em;' +
        +		'a[!href];' +
        +		'img(left,right)[!src,alt,width,height];' +
        +		'table tr th td caption;' +
        +		'span{!font-family};' +'
        +		'span{!color};' +
        +		'span(!marker);' +
        +		'del ins'
        +} );
        +
        +

        + The following rules may require additional explanation: +

        +
          +
        • + h1 h2 h3 p blockquote strong em - These tags + are accepted by the editor. Any tag attributes will be discarded. +
        • +
        • + a[!href] - href attribute is obligatory + for <a> tag. Tags without this attribute + are disarded. No other attribute will be accepted. +
        • +
        • + img(left,right)[!src,alt,width,height] - src + attribute is obligatory for <img> tag. + alt, width, height + and class attributes are accepted but + class must be either class="left" + or class="right" +
        • +
        • + table tr th td caption - These tags + are accepted by the editor. Any tag attributes will be discarded. +
        • +
        • + span{!font-family}, span{!color}, + span(!marker) - <span> tags + will be accepted if either font-family or + color style is set or class="marker" + is present. +
        • +
        • + del ins - These tags + are accepted by the editor. Any tag attributes will be discarded. +
        • +
        +

        + Please note that UI of the + editor is different. It's a response to what happened to the filters. + Since text-align isn't allowed, the align toolbar is gone. + The same thing happened to subscript/superscript, strike, underline + (<u>, <sub>, <sup> + are disallowed by + config.allowedContent) and many other buttons. +

        +
        + + +
        + +
        + +
        + +
        +

        + This editor is using a custom configuration for + ACF. + Note that filters can be configured as an object literal + as an alternative to a string-based definition. +

        +
        +CKEDITOR.replace( 'editor3', {
        +	allowedContent: {
        +		'b i ul ol big small': true,
        +		'h1 h2 h3 p blockquote li': {
        +			styles: 'text-align'
        +		},
        +		a: { attributes: '!href,target' },
        +		img: {
        +			attributes: '!src,alt',
        +			styles: 'width,height',
        +			classes: 'left,right'
        +		}
        +	}
        +} );
        +
        +
        + + +
        + +
        + +
        + +
        +

        + This editor is using a custom set of plugins and buttons. +

        +
        +CKEDITOR.replace( 'editor4', {
        +	removePlugins: 'bidi,font,forms,flash,horizontalrule,iframe,justify,table,tabletools,smiley',
        +	removeButtons: 'Anchor,Underline,Strike,Subscript,Superscript,Image',
        +	format_tags: 'p;h1;h2;h3;pre;address'
        +} );
        +
        +

        + As you can see, removing plugins and buttons implies filtering. + Several tags are not allowed in the editor because there's no + plugin/button that is responsible for creating and editing this + kind of content (for example: the image is missing because + of removeButtons: 'Image'). The conclusion is that + ACF works "backwards" + as well: modifying UI + elements is changing allowed content rules. +

        +
        + + +
        + +
        + +
        + +
        +

        + This editor is built on editable <h1> element. + ACF takes care of + what can be included in <h1>. Note that there + are no block styles in Styles combo. Also why lists, indentation, + blockquote, div, form and other buttons are missing. +

        +

        + ACF makes sure that + no disallowed tags will come to <h1> so the final + markup is valid. If the user tried to paste some invalid HTML + into this editor (let's say a list), it would be automatically + converted into plain text. +

        +
        +

        + Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. +

        +
        + +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/divreplace.html b/bower_components/ckeditor/samples/divreplace.html new file mode 100644 index 0000000..b87086a --- /dev/null +++ b/bower_components/ckeditor/samples/divreplace.html @@ -0,0 +1,141 @@ + + + + + + Replace DIV — CKEditor Sample + + + + + + +

        + CKEditor Samples » Replace DIV with CKEditor on the Fly +

        +
        +

        + This sample shows how to automatically replace <div> elements + with a CKEditor instance on the fly, following user's doubleclick. The content + that was previously placed inside the <div> element will now + be moved into CKEditor editing area. +

        +

        + For details on how to create this setup check the source code of this sample page. +

        +
        +

        + Double-click any of the following <div> elements to transform them into + editor instances. +

        +
        +

        + Part 1 +

        +

        + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi + semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna + rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla + nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce + eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus. +

        +
        +
        +

        + Part 2 +

        +

        + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi + semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna + rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla + nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce + eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus. +

        +

        + Donec velit. Mauris massa. Vestibulum non nulla. Nam suscipit arcu nec elit. Phasellus + sollicitudin iaculis ante. Ut non mauris et sapien tincidunt adipiscing. Vestibulum + vitae leo. Suspendisse nec mi tristique nulla laoreet vulputate. +

        +
        +
        +

        + Part 3 +

        +

        + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi + semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna + rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla + nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce + eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus. +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/index.html b/bower_components/ckeditor/samples/index.html new file mode 100644 index 0000000..5bdb8ce --- /dev/null +++ b/bower_components/ckeditor/samples/index.html @@ -0,0 +1,170 @@ + + + + + + CKEditor Samples + + + +

        + CKEditor Samples +

        +
        +
        +

        + Basic Samples +

        +
        +
        Replace textarea elements by class name
        +
        Automatic replacement of all textarea elements of a given class with a CKEditor instance.
        + +
        Replace textarea elements by code
        +
        Replacement of textarea elements with CKEditor instances by using a JavaScript call.
        + +
        Create editors with jQuery
        +
        Creating standard and inline CKEditor instances with jQuery adapter.
        +
        + +

        + Basic Customization +

        +
        +
        User Interface color
        +
        Changing CKEditor User Interface color and adding a toolbar button that lets the user set the UI color.
        + +
        User Interface languages
        +
        Changing CKEditor User Interface language and adding a drop-down list that lets the user choose the UI language.
        +
        + + +

        Plugins

        +
        +
        Code Snippet plugin New!
        +
        View and modify code using the Code Snippet plugin.
        + +
        New Image plugin New!
        +
        Using the new Image plugin to insert captioned images and adjust their dimensions.
        + +
        Mathematics plugin New!
        +
        Create mathematical equations in TeX and display them in visual form.
        + +
        Editing source code in a dialog New!
        +
        Editing HTML content of both inline and classic editor instances.
        + +
        AutoGrow plugin
        +
        Using the AutoGrow plugin in order to make the editor grow to fit the size of its content.
        + +
        Output for BBCode
        +
        Configuring CKEditor to produce BBCode tags instead of HTML.
        + +
        Developer Tools plugin
        +
        Using the Developer Tools plugin to display information about dialog window UI elements to allow for easier customization.
        + +
        Document Properties plugin
        +
        Manage various page meta data with a dialog.
        + +
        Magicline plugin
        +
        Using the Magicline plugin to access difficult focus spaces.
        + +
        Placeholder plugin
        +
        Using the Placeholder plugin to create uneditable sections that can only be created and modified with a proper dialog window.
        + +
        Shared-Space plugin
        +
        Having the toolbar and the bottom bar spaces shared by different editor instances.
        + +
        Stylesheet Parser plugin
        +
        Using the Stylesheet Parser plugin to fill the Styles drop-down list based on the CSS classes available in the document stylesheet.
        + +
        TableResize plugin
        +
        Using the TableResize plugin to enable table column resizing.
        + +
        UIColor plugin
        +
        Using the UIColor plugin to pick up skin color.
        + +
        Full page support
        +
        CKEditor inserted with a JavaScript call and used to edit the whole page from <html> to </html>.
        +
        +
        +
        +

        + Inline Editing +

        +
        +
        Massive inline editor creation
        +
        Turn all elements with contentEditable = true attribute into inline editors.
        + +
        Convert element into an inline editor by code
        +
        Conversion of DOM elements into inline CKEditor instances by using a JavaScript call.
        + +
        Replace textarea with inline editor New!
        +
        A form with a textarea that is replaced by an inline editor at runtime.
        + + +
        + +

        + Advanced Samples +

        +
        +
        Data filtering and features activation New!
        +
        Data filtering and automatic features activation basing on configuration.
        + +
        Replace DIV elements on the fly
        +
        Transforming a div element into an instance of CKEditor with a mouse click.
        + +
        Append editor instances
        +
        Appending editor instances to existing DOM elements.
        + +
        Create and destroy editor instances for Ajax applications
        +
        Creating and destroying CKEditor instances on the fly and saving the contents entered into the editor window.
        + +
        Basic usage of the API
        +
        Using the CKEditor JavaScript API to interact with the editor at runtime.
        + +
        XHTML-compliant style
        +
        Configuring CKEditor to produce XHTML 1.1 compliant attributes and styles.
        + +
        Read-only mode
        +
        Using the readOnly API to block introducing changes to the editor contents.
        + +
        "Tab" key-based navigation
        +
        Navigating among editor instances with tab key.
        + + + +
        Using the JavaScript API to customize dialog windows
        +
        Using the dialog windows API to customize dialog windows without changing the original editor code.
        + +
        Replace Textarea with a "DIV-based" editor
        +
        Using div instead of iframe for rich editing.
        + +
        Using the "Enter" key in CKEditor
        +
        Configuring the behavior of Enter and Shift+Enter keys.
        + +
        Output for Flash
        +
        Configuring CKEditor to produce HTML code that can be used with Adobe Flash.
        + +
        Output HTML
        +
        Configuring CKEditor to produce legacy HTML 4 code.
        + +
        Toolbar Configurations
        +
        Configuring CKEditor to display full or custom toolbar layout.
        + +
        +
        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/inlineall.html b/bower_components/ckeditor/samples/inlineall.html new file mode 100644 index 0000000..fc33619 --- /dev/null +++ b/bower_components/ckeditor/samples/inlineall.html @@ -0,0 +1,311 @@ + + + + + + Massive inline editing — CKEditor Sample + + + + + + +
        +

        CKEditor Samples » Massive inline editing

        +
        +

        This sample page demonstrates the inline editing feature - CKEditor instances will be created automatically from page elements with contentEditable attribute set to value true:

        +
        <div contenteditable="true" > ... </div>
        +

        Click inside of any element below to start editing.

        +
        +
        +
        +
        +
        +

        + CKEditor
        Goes Inline! +

        +

        + Lorem ipsum dolor sit amet dolor duis blandit vestibulum faucibus a, tortor. +

        +
        +
        +
        +

        + Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. +

        +

        + Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac. +

        +
        +
        +
        +
        +
        +
        +

        + Fusce vitae porttitor +

        +

        + + Lorem ipsum dolor sit amet dolor. Duis blandit vestibulum faucibus a, tortor. + +

        +

        + Proin nunc justo felis mollis tincidunt, risus risus pede, posuere cubilia Curae, Nullam euismod, enim. Etiam nibh ultricies dolor ac dignissim erat volutpat. Vivamus fermentum nisl nulla sem in metus. Maecenas wisi. Donec nec erat volutpat. +

        +
        +

        + Fusce vitae porttitor a, euismod convallis nisl, blandit risus tortor, pretium. + Vehicula vitae, imperdiet vel, ornare enim vel sodales rutrum +

        +
        +
        +

        + Libero nunc, rhoncus ante ipsum non ipsum. Nunc eleifend pede turpis id sollicitudin fringilla. Phasellus ultrices, velit ac arcu. +

        +
        +

        Pellentesque nunc. Donec suscipit erat. Pellentesque habitant morbi tristique ullamcorper.

        +

        Mauris mattis feugiat lectus nec mauris. Nullam vitae ante.

        +
        +
        +
        +
        +

        + Integer condimentum sit amet +

        +

        + Aenean nonummy a, mattis varius. Cras aliquet. + Praesent magna non mattis ac, rhoncus nunc, rhoncus eget, cursus pulvinar mollis.

        +

        Proin id nibh. Sed eu libero posuere sed, lectus. Phasellus dui gravida gravida feugiat mattis ac, felis.

        +

        Integer condimentum sit amet, tempor elit odio, a dolor non ante at sapien. Sed ac lectus. Nulla ligula quis eleifend mi, id leo velit pede cursus arcu id nulla ac lectus. Phasellus vestibulum. Nunc viverra enim quis diam.

        +
        +
        +

        + Praesent wisi accumsan sit amet nibh +

        +

        Donec ullamcorper, risus tortor, pretium porttitor. Morbi quam quis lectus non leo.

        +

        Integer faucibus scelerisque. Proin faucibus at, aliquet vulputate, odio at eros. Fusce gravida, erat vitae augue. Fusce urna fringilla gravida.

        +

        In hac habitasse platea dictumst. Praesent wisi accumsan sit amet nibh. Maecenas orci luctus a, lacinia quam sem, posuere commodo, odio condimentum tempor, pede semper risus. Suspendisse pede. In hac habitasse platea dictumst. Nam sed laoreet sit amet erat. Integer.

        +
        +
        +
        +
        +

        + CKEditor logo +

        +

        Quisque justo neque, mattis sed, fermentum ultrices posuere cubilia Curae, Vestibulum elit metus, quis placerat ut, lectus. Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi.

        +

        + Nullam laoreet vel consectetuer tellus suscipit +

        +
          +
        • Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis.
        • +
        • Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi.
        • +
        • Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.
        • +
        +

        Quisque justo neque, mattis sed, fermentum ultrices posuere cubilia Curae, Vestibulum elit metus, quis placerat ut, lectus.

        +

        Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis.

        +

        Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi. Sed in nonummy faucibus turpis. Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.

        +
        +
        +
        +
        + Tags of this article: +

        + inline, editing, floating, CKEditor +

        +
        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - + http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource + - Frederico Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/inlinebycode.html b/bower_components/ckeditor/samples/inlinebycode.html new file mode 100644 index 0000000..c1df0e9 --- /dev/null +++ b/bower_components/ckeditor/samples/inlinebycode.html @@ -0,0 +1,121 @@ + + + + + + Inline Editing by Code — CKEditor Sample + + + + + +

        + CKEditor Samples » Inline Editing by Code +

        +
        +

        + This sample shows how to create an inline editor instance of CKEditor. It is created + with a JavaScript call using the following code: +

        +
        +// This property tells CKEditor to not activate every element with contenteditable=true element.
        +CKEDITOR.disableAutoInline = true;
        +
        +var editor = CKEDITOR.inline( document.getElementById( 'editable' ) );
        +
        +

        + Note that editable in the code above is the id + attribute of the <div> element to be converted into an inline instance. +

        +
        +
        +

        Saturn V carrying Apollo 11 Apollo 11

        + +

        Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.

        + +

        Armstrong spent about three and a half two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5 kg) of lunar material for return to Earth. A third member of the mission, Michael Collins, piloted the command spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.

        + +

        Broadcasting and quotes

        + +

        Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:

        + +
        +

        One small step for [a] man, one giant leap for mankind.

        +
        + +

        Apollo 11 effectively ended the Space Race and fulfilled a national goal proposed in 1961 by the late U.S. President John F. Kennedy in a speech before the United States Congress:

        + +
        +

        [...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.

        +
        + +

        Technical details

        + + + + + + + + + + + + + + + + + + + + + + + +
        Mission crew
        PositionAstronaut
        CommanderNeil A. Armstrong
        Command Module PilotMichael Collins
        Lunar Module PilotEdwin "Buzz" E. Aldrin, Jr.
        + +

        Launched by a Saturn V rocket from Kennedy Space Center in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of NASA's Apollo program. The Apollo spacecraft had three parts:

        + +
          +
        1. Command Module with a cabin for the three astronauts which was the only part which landed back on Earth
        2. +
        3. Service Module which supported the Command Module with propulsion, electrical power, oxygen and water
        4. +
        5. Lunar Module for landing on the Moon.
        6. +
        + +

        After being sent to the Moon by the Saturn V's upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the Sea of Tranquility. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the Pacific Ocean on July 24.

        + +
        +

        Source: Wikipedia.org

        +
        + + +
        +
        +

        + CKEditor - The text editor for the Internet - + http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource + - Frederico Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/inlinetextarea.html b/bower_components/ckeditor/samples/inlinetextarea.html new file mode 100644 index 0000000..9e3d077 --- /dev/null +++ b/bower_components/ckeditor/samples/inlinetextarea.html @@ -0,0 +1,110 @@ + + + + + + Replace Textarea with Inline Editor — CKEditor Sample + + + + + +

        + CKEditor Samples » Replace Textarea with Inline Editor +

        +
        +

        + You can also create an inline editor from a textarea + element. In this case the textarea will be replaced + by a div element with inline editing enabled. +

        +
        +// "article-body" is the name of a textarea element.
        +var editor = CKEDITOR.inline( 'article-body' );
        +
        +
        +
        +

        This is a sample form with some fields

        +

        + Title:
        +

        +

        + Article Body (Textarea converted to CKEditor):
        + +

        +

        + +

        +
        + + +
        +
        +

        + CKEditor - The text editor for the Internet - + http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource + - Frederico Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/jquery.html b/bower_components/ckeditor/samples/jquery.html new file mode 100644 index 0000000..74e128a --- /dev/null +++ b/bower_components/ckeditor/samples/jquery.html @@ -0,0 +1,100 @@ + + + + + + jQuery Adapter — CKEditor Sample + + + + + + + + +

        + CKEditor Samples » Create Editors with jQuery +

        +
        +
        +

        + This sample shows how to use the jQuery adapter. + Note that you have to include both CKEditor and jQuery scripts before including the adapter. +

        + +
        +<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
        +<script src="/ckeditor/ckeditor.js"></script>
        +<script src="/ckeditor/adapters/jquery.js"></script>
        +
        + +

        Then you can replace HTML elements with a CKEditor instance using the ckeditor() method.

        + +
        +$( document ).ready( function() {
        +	$( 'textarea#editor1' ).ckeditor();
        +} );
        +
        +
        + +

        Inline Example

        + +
        +

        Saturn V carrying Apollo 11Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.

        +

        Armstrong spent about three and a half two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5 kg) of lunar material for return to Earth. A third member of the mission, Michael Collins, piloted the command spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth. +

        Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:

        +

        One small step for [a] man, one giant leap for mankind.

        Apollo 11 effectively ended the Space Race and fulfilled a national goal proposed in 1961 by the late U.S. President John F. Kennedy in a speech before the United States Congress:

        [...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.

        +
        + +
        + +

        Classic (iframe-based) Example

        + + + +

        + + + + + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/autogrow/autogrow.html b/bower_components/ckeditor/samples/plugins/autogrow/autogrow.html new file mode 100644 index 0000000..ce82dc8 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/autogrow/autogrow.html @@ -0,0 +1,99 @@ + + + + + + AutoGrow Plugin — CKEditor Sample + + + + + + + +

        + CKEditor Samples » Using AutoGrow Plugin +

        +
        +

        + This sample shows how to configure CKEditor instances to use the + AutoGrow (autogrow) plugin that lets the editor window expand + and shrink depending on the amount and size of content entered in the editing area. +

        +

        + In its default implementation the AutoGrow feature can expand the + CKEditor window infinitely in order to avoid introducing scrollbars to the editing area. +

        +

        + It is also possible to set a maximum height for the editor window. Once CKEditor + editing area reaches the value in pixels specified in the + autoGrow_maxHeight + configuration setting, scrollbars will be added and the editor window will no longer expand. +

        +

        + To add a CKEditor instance using the autogrow plugin and its + autoGrow_maxHeight attribute, insert the following JavaScript call to your code: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	extraPlugins: 'autogrow',
        +	autoGrow_maxHeight: 800,
        +
        +	// Remove the Resize plugin as it does not make sense to use it in conjunction with the AutoGrow plugin.
        +	removePlugins: 'resize'
        +});
        +

        + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced with CKEditor. The maximum height should + be given in pixels. +

        +
        +
        +

        + + + +

        +

        + + + +

        +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/bbcode/bbcode.html b/bower_components/ckeditor/samples/plugins/bbcode/bbcode.html new file mode 100644 index 0000000..d78f406 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/bbcode/bbcode.html @@ -0,0 +1,111 @@ + + + + + + BBCode Plugin — CKEditor Sample + + + + + + + + + +

        + CKEditor Samples » BBCode Plugin +

        +
        +

        + This sample shows how to configure CKEditor to output BBCode format instead of HTML. + Please note that the editor configuration was modified to reflect what is needed in a BBCode editing environment. + Smiley images, for example, were stripped to the emoticons that are commonly used in some BBCode dialects. +

        +

        + Please note that currently there is no standard for the BBCode markup language, so its implementation + for different platforms (message boards, blogs etc.) can vary. This means that before using CKEditor to + output BBCode you may need to adjust the implementation to your own environment. +

        +

        + A snippet of the configuration code can be seen below; check the source of this page for + a full definition: +

        +
        +CKEDITOR.replace( 'editor1', {
        +	extraPlugins: 'bbcode',
        +	toolbar: [
        +		[ 'Source', '-', 'Save', 'NewPage', '-', 'Undo', 'Redo' ],
        +		[ 'Find', 'Replace', '-', 'SelectAll', 'RemoveFormat' ],
        +		[ 'Link', 'Unlink', 'Image' ],
        +		'/',
        +		[ 'FontSize', 'Bold', 'Italic', 'Underline' ],
        +		[ 'NumberedList', 'BulletedList', '-', 'Blockquote' ],
        +		[ 'TextColor', '-', 'Smiley', 'SpecialChar', '-', 'Maximize' ]
        +	],
        +	... some other configurations omitted here
        +});	
        +
        +
        +

        + + + +

        +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/codesnippet/codesnippet.html b/bower_components/ckeditor/samples/plugins/codesnippet/codesnippet.html new file mode 100644 index 0000000..7df8e02 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/codesnippet/codesnippet.html @@ -0,0 +1,233 @@ + + + + + + Code Snippet — CKEditor Sample + + + + + + + + + + +

        + CKEditor Samples » Code Snippet Plugin +

        + +
        +

        + This editor is using the Code Snippet plugin which introduces beautiful code snippets. + By default the codesnippet plugin depends on the built-in client-side syntax highlighting + library highlight.js. +

        +

        + You can adjust the appearance of code snippets using the codeSnippet_theme configuration variable + (see available themes). +

        +

        + Select theme: +

        +

        + The CKEditor instance below was created by using the following configuration settings: +

        + +
        +CKEDITOR.replace( 'editor1', {
        +	extraPlugins: 'codesnippet',
        +	codeSnippet_theme: 'monokai_sublime'
        +} );
        +
        + +

        + Please note that this plugin is not compatible with Internet Explorer 8. +

        +
        + + + +

        Inline editor

        + +
        +

        + The following sample shows the Code Snippet plugin running inside + an inline CKEditor instance. The CKEditor instance below was created by using the following configuration settings: +

        + +
        +CKEDITOR.inline( 'editable', {
        +	extraPlugins: 'codesnippet'
        +} );
        +
        + +

        + Note: The highlight.js themes + must be loaded manually to be applied inside an inline editor instance, as the + codeSnippet_theme setting will not work in that case. + You need to include the stylesheet in the <head> section of the page, for example: +

        + +
        +<head>
        +	...
        +	<link href="path/to/highlight.js/styles/monokai_sublime.css" rel="stylesheet">
        +</head>
        +
        + +
        + +
        + +

        JavaScript code:

        + +
        function isEmpty( object ) {
        +	for ( var i in object ) {
        +		if ( object.hasOwnProperty( i ) )
        +			return false;
        +	}
        +	return true;
        +}
        + +

        SQL query:

        + +
        SELECT cust.id, cust.name, loc.city FROM cust LEFT JOIN loc ON ( cust.loc_id = loc.id ) WHERE cust.type IN ( 1, 2 );
        + +

        Unknown markup:

        + +
         ________________
        +/                \
        +| How about moo? |  ^__^
        +\________________/  (oo)\_______
        +                  \ (__)\       )\/\
        +                        ||----w |
        +                        ||     ||
        +
        +
        + +

        Server-side Highlighting and Custom Highlighting Engines

        + +

        + The Code Snippet GeSHi plugin is an + extension of the Code Snippet plugin which uses a server-side highligter. +

        + +

        + It also is possible to replace the default highlighter with any library using + the Highlighter API + and the editor.plugins.codesnippet.setHighlighter() method. +

        + + + +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/devtools/devtools.html b/bower_components/ckeditor/samples/plugins/devtools/devtools.html new file mode 100644 index 0000000..99dce62 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/devtools/devtools.html @@ -0,0 +1,83 @@ + + + + + + Using DevTools Plugin — CKEditor Sample + + + + + + + +

        + CKEditor Samples » Using the Developer Tools Plugin +

        +
        +

        + This sample shows how to configure CKEditor instances to use the + Developer Tools (devtools) plugin that displays + information about dialog window elements, including the name of the dialog window, + tab, and UI element. Please note that the tooltip also contains a link to the + CKEditor JavaScript API + documentation for each of the selected elements. +

        +

        + This plugin is aimed at developers who would like to customize their CKEditor + instances and create their own plugins. By default it is turned off; it is + usually useful to only turn it on in the development phase. Note that it works with + all CKEditor dialog windows, including the ones that were created by custom plugins. +

        +

        + To add a CKEditor instance using the devtools plugin, insert + the following JavaScript call into your code: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	extraPlugins: 'devtools'
        +});
        +

        + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced with CKEditor. +

        +
        +
        +

        + + + +

        +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/dialog/assets/my_dialog.js b/bower_components/ckeditor/samples/plugins/dialog/assets/my_dialog.js new file mode 100644 index 0000000..8a9ea63 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/dialog/assets/my_dialog.js @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.dialog.add( 'myDialog', function() { + return { + title: 'My Dialog', + minWidth: 400, + minHeight: 200, + contents: [ + { + id: 'tab1', + label: 'First Tab', + title: 'First Tab', + elements: [ + { + id: 'input1', + type: 'text', + label: 'Text Field' + }, + { + id: 'select1', + type: 'select', + label: 'Select Field', + items: [ + [ 'option1', 'value1' ], + [ 'option2', 'value2' ] + ] + } + ] + }, + { + id: 'tab2', + label: 'Second Tab', + title: 'Second Tab', + elements: [ + { + id: 'button1', + type: 'button', + label: 'Button Field' + } + ] + } + ] + }; +} ); + diff --git a/bower_components/ckeditor/samples/plugins/dialog/dialog.html b/bower_components/ckeditor/samples/plugins/dialog/dialog.html new file mode 100644 index 0000000..a85c566 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/dialog/dialog.html @@ -0,0 +1,187 @@ + + + + + + Using API to Customize Dialog Windows — CKEditor Sample + + + + + + + + + +

        + CKEditor Samples » Using CKEditor Dialog API +

        +
        +

        + This sample shows how to use the + CKEditor Dialog API + to customize CKEditor dialog windows without changing the original editor code. + The following customizations are being done in the example below: +

        +

        + For details on how to create this setup check the source code of this sample page. +

        +
        +

        A custom dialog is added to the editors using the pluginsLoaded event, from an external dialog definition file:

        +
          +
        1. Creating a custom dialog window – "My Dialog" dialog window opened with the "My Dialog" toolbar button.
        2. +
        3. Creating a custom button – Add button to open the dialog with "My Dialog" toolbar button.
        4. +
        + + +

        The below editor modify the dialog definition of the above added dialog using the dialogDefinition event:

        +
          +
        1. Adding dialog tab – Add new tab "My Tab" to dialog window.
        2. +
        3. Removing a dialog window tab – Remove "Second Tab" page from the dialog window.
        4. +
        5. Adding dialog window fields – Add "My Custom Field" to the dialog window.
        6. +
        7. Removing dialog window field – Remove "Select Field" selection field from the dialog window.
        8. +
        9. Setting default values for dialog window fields – Set default value of "Text Field" text field.
        10. +
        11. Setup initial focus for dialog window – Put initial focus on "My Custom Field" text field.
        12. +
        + + +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/divarea/divarea.html b/bower_components/ckeditor/samples/plugins/divarea/divarea.html new file mode 100644 index 0000000..68b191c --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/divarea/divarea.html @@ -0,0 +1,61 @@ + + + + + + Replace Textarea with a "DIV-based" editor — CKEditor Sample + + + + + + + +

        + CKEditor Samples » Replace Textarea with a "DIV-based" editor +

        +
        +
        +

        + This editor is using a <div> element-based editing area, provided by the Divarea plugin. +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	extraPlugins: 'divarea'
        +});
        +
        + + +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/docprops/docprops.html b/bower_components/ckeditor/samples/plugins/docprops/docprops.html new file mode 100644 index 0000000..d71a001 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/docprops/docprops.html @@ -0,0 +1,78 @@ + + + + + + Document Properties — CKEditor Sample + + + + + + + +

        + CKEditor Samples » Document Properties Plugin +

        +
        +

        + This sample shows how to configure CKEditor to use the Document Properties plugin. + This plugin allows you to set the metadata of the page, including the page encoding, margins, + meta tags, or background. +

        +

        Note: This plugin is to be used along with the fullPage configuration.

        +

        + The CKEditor instance below is inserted with a JavaScript call using the following code: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	fullPage: true,
        +	extraPlugins: 'docprops',
        +	allowedContent: true
        +});
        +
        +

        + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced. +

        +

        + The allowedContent in the code above is set to true to disable content filtering. + Setting this option is not obligatory, but in full page mode there is a strong chance that one may want be able to freely enter any HTML content in source mode without any limitations. +

        +
        +
        + + + +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/enterkey/enterkey.html b/bower_components/ckeditor/samples/plugins/enterkey/enterkey.html new file mode 100644 index 0000000..61fbc72 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/enterkey/enterkey.html @@ -0,0 +1,103 @@ + + + + + + ENTER Key Configuration — CKEditor Sample + + + + + + + + +

        + CKEditor Samples » ENTER Key Configuration +

        +
        +

        + This sample shows how to configure the Enter and Shift+Enter keys + to perform actions specified in the + enterMode + and shiftEnterMode + parameters, respectively. + You can choose from the following options: +

        +
          +
        • ENTER_P – new <p> paragraphs are created;
        • +
        • ENTER_BR – lines are broken with <br> elements;
        • +
        • ENTER_DIV – new <div> blocks are created.
        • +
        +

        + The sample code below shows how to configure CKEditor to create a <div> block when Enter key is pressed. +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	enterMode: CKEDITOR.ENTER_DIV
        +});
        +

        + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced. +

        +
        +
        + When Enter is pressed:
        + +
        +
        + When Shift+Enter is pressed:
        + +
        +
        +
        +

        +
        + +

        +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla b/bower_components/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla new file mode 100644 index 0000000..27e68cc Binary files /dev/null and b/bower_components/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla differ diff --git a/bower_components/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf b/bower_components/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf new file mode 100644 index 0000000..dbe17b6 Binary files /dev/null and b/bower_components/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf differ diff --git a/bower_components/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js b/bower_components/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js new file mode 100644 index 0000000..95fdf0a --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js @@ -0,0 +1,18 @@ +var swfobject=function(){function u(){if(!s){try{var a=d.getElementsByTagName("body")[0].appendChild(d.createElement("span"));a.parentNode.removeChild(a)}catch(b){return}s=!0;for(var a=x.length,c=0;cf){f++;setTimeout(arguments.callee,10);return}a.removeChild(b);c=null;D()})()}else D()}function D(){var a=p.length;if(0e.wk))t(c,!0),f&&(g.success=!0,g.ref=E(c),f(g));else if(p[b].expressInstall&&F()){g={};g.data=p[b].expressInstall;g.width=d.getAttribute("width")||"0";g.height=d.getAttribute("height")||"0";d.getAttribute("class")&&(g.styleclass=d.getAttribute("class"));d.getAttribute("align")&&(g.align=d.getAttribute("align"));for(var h={},d=d.getElementsByTagName("param"),j=d.length,k=0;ke.wk)}function G(a,b,c,f){A=!0;H=f||null;N={success:!1,id:c};var g=n(c);if(g){"OBJECT"==g.nodeName?(w=I(g),B=null):(w=g,B=c);a.id= +O;if(typeof a.width==i||!/%$/.test(a.width)&&310>parseInt(a.width,10))a.width="310";if(typeof a.height==i||!/%$/.test(a.height)&&137>parseInt(a.height,10))a.height="137";d.title=d.title.slice(0,47)+" - Flash Player Installation";f=e.ie&&e.win?"ActiveX":"PlugIn";f="MMredirectURL="+m.location.toString().replace(/&/g,"%26")+"&MMplayerType="+f+"&MMdoctitle="+d.title;b.flashvars=typeof b.flashvars!=i?b.flashvars+("&"+f):f;e.ie&&(e.win&&4!=g.readyState)&&(f=d.createElement("div"),c+="SWFObjectNew",f.setAttribute("id", +c),g.parentNode.insertBefore(f,g),g.style.display="none",function(){g.readyState==4?g.parentNode.removeChild(g):setTimeout(arguments.callee,10)}());J(a,b,c)}}function W(a){if(e.ie&&e.win&&4!=a.readyState){var b=d.createElement("div");a.parentNode.insertBefore(b,a);b.parentNode.replaceChild(I(a),b);a.style.display="none";(function(){4==a.readyState?a.parentNode.removeChild(a):setTimeout(arguments.callee,10)})()}else a.parentNode.replaceChild(I(a),a)}function I(a){var b=d.createElement("div");if(e.win&& +e.ie)b.innerHTML=a.innerHTML;else if(a=a.getElementsByTagName(r)[0])if(a=a.childNodes)for(var c=a.length,f=0;fe.wk)return f;if(g)if(typeof a.id==i&&(a.id=c),e.ie&&e.win){var o="",h;for(h in a)a[h]!=Object.prototype[h]&&("data"==h.toLowerCase()?b.movie=a[h]:"styleclass"==h.toLowerCase()?o+=' class="'+a[h]+'"':"classid"!=h.toLowerCase()&&(o+=" "+ +h+'="'+a[h]+'"'));h="";for(var j in b)b[j]!=Object.prototype[j]&&(h+='');g.outerHTML='"+h+"";C[C.length]=a.id;f=n(a.id)}else{j=d.createElement(r);j.setAttribute("type",y);for(var k in a)a[k]!=Object.prototype[k]&&("styleclass"==k.toLowerCase()?j.setAttribute("class",a[k]):"classid"!=k.toLowerCase()&&j.setAttribute(k,a[k]));for(o in b)b[o]!=Object.prototype[o]&&"movie"!=o.toLowerCase()&& +(a=j,h=o,k=b[o],c=d.createElement("param"),c.setAttribute("name",h),c.setAttribute("value",k),a.appendChild(c));g.parentNode.replaceChild(j,g);f=j}return f}function P(a){var b=n(a);b&&"OBJECT"==b.nodeName&&(e.ie&&e.win?(b.style.display="none",function(){if(4==b.readyState){var c=n(a);if(c){for(var f in c)"function"==typeof c[f]&&(c[f]=null);c.parentNode.removeChild(c)}}else setTimeout(arguments.callee,10)}()):b.parentNode.removeChild(b))}function n(a){var b=null;try{b=d.getElementById(a)}catch(c){}return b} +function U(a,b,c){a.attachEvent(b,c);v[v.length]=[a,b,c]}function z(a){var b=e.pv,a=a.split(".");a[0]=parseInt(a[0],10);a[1]=parseInt(a[1],10)||0;a[2]=parseInt(a[2],10)||0;return b[0]>a[0]||b[0]==a[0]&&b[1]>a[1]||b[0]==a[0]&&b[1]==a[1]&&b[2]>=a[2]?!0:!1}function Q(a,b,c,f){if(!e.ie||!e.mac){var g=d.getElementsByTagName("head")[0];if(g){c=c&&"string"==typeof c?c:"screen";f&&(K=l=null);if(!l||K!=c)f=d.createElement("style"),f.setAttribute("type","text/css"),f.setAttribute("media",c),l=g.appendChild(f), +e.ie&&(e.win&&typeof d.styleSheets!=i&&0\.;]/.exec(a)&&typeof encodeURIComponent!=i?encodeURIComponent(a):a}var i="undefined",r="object",y="application/x-shockwave-flash", +O="SWFObjectExprInst",m=window,d=document,q=navigator,T=!1,x=[function(){T?V():D()}],p=[],C=[],v=[],w,B,H,N,s=!1,A=!1,l,K,R=!0,e=function(){var a=typeof d.getElementById!=i&&typeof d.getElementsByTagName!=i&&typeof d.createElement!=i,b=q.userAgent.toLowerCase(),c=q.platform.toLowerCase(),f=c?/win/.test(c):/win/.test(b),c=c?/mac/.test(c):/mac/.test(b),b=/webkit/.test(b)?parseFloat(b.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):!1,g=!+"\v1",e=[0,0,0],h=null;if(typeof q.plugins!=i&&typeof q.plugins["Shockwave Flash"]== +r){if((h=q.plugins["Shockwave Flash"].description)&&!(typeof q.mimeTypes!=i&&q.mimeTypes[y]&&!q.mimeTypes[y].enabledPlugin))T=!0,g=!1,h=h.replace(/^.*\s+(\S+\s+\S+$)/,"$1"),e[0]=parseInt(h.replace(/^(.*)\..*$/,"$1"),10),e[1]=parseInt(h.replace(/^.*\.(.*)\s.*$/,"$1"),10),e[2]=/[a-zA-Z]/.test(h)?parseInt(h.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}else if(typeof m.ActiveXObject!=i)try{var j=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(j&&(h=j.GetVariable("$version")))g=!0,h=h.split(" ")[1].split(","), +e=[parseInt(h[0],10),parseInt(h[1],10),parseInt(h[2],10)]}catch(k){}return{w3:a,pv:e,wk:b,ie:g,win:f,mac:c}}();(function(){e.w3&&((typeof d.readyState!=i&&"complete"==d.readyState||typeof d.readyState==i&&(d.getElementsByTagName("body")[0]||d.body))&&u(),s||(typeof d.addEventListener!=i&&d.addEventListener("DOMContentLoaded",u,!1),e.ie&&e.win&&(d.attachEvent("onreadystatechange",function(){"complete"==d.readyState&&(d.detachEvent("onreadystatechange",arguments.callee),u())}),m==top&&function(){if(!s){try{d.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee, +0);return}u()}}()),e.wk&&function(){s||(/loaded|complete/.test(d.readyState)?u():setTimeout(arguments.callee,0))}(),M(u)))})();(function(){e.ie&&e.win&&window.attachEvent("onunload",function(){for(var a=v.length,b=0;be.wk)&&a&&b&&c&&d&&g?(t(b,!1),L(function(){c+="";d+="";var e={};if(k&&typeof k===r)for(var l in k)e[l]=k[l];e.data=a;e.width=c;e.height=d;l={};if(j&&typeof j===r)for(var p in j)l[p]=j[p];if(h&&typeof h===r)for(var q in h)l.flashvars=typeof l.flashvars!=i?l.flashvars+("&"+q+"="+h[q]):q+"="+h[q];if(z(g))p=J(e,l,b),e.id== +b&&t(b,!0),n.success=!0,n.ref=p;else{if(o&&F()){e.data=o;G(e,l,b,m);return}t(b,!0)}m&&m(n)})):m&&m(n)},switchOffAutoHideShow:function(){R=!1},ua:e,getFlashPlayerVersion:function(){return{major:e.pv[0],minor:e.pv[1],release:e.pv[2]}},hasFlashPlayerVersion:z,createSWF:function(a,b,c){if(e.w3)return J(a,b,c)},showExpressInstall:function(a,b,c,d){e.w3&&F()&&G(a,b,c,d)},removeSWF:function(a){e.w3&&P(a)},createCSS:function(a,b,c,d){e.w3&&Q(a,b,c,d)},addDomLoadEvent:L,addLoadEvent:M,getQueryParamValue:function(a){var b= +d.location.search||d.location.hash;if(b){/\?/.test(b)&&(b=b.split("?")[1]);if(null==a)return S(b);for(var b=b.split("&"),c=0;c + + + + + Output for Flash — CKEditor Sample + + + + + + + + + + + +

        + CKEditor Samples » Producing Flash Compliant HTML Output +

        +
        +

        + This sample shows how to configure CKEditor to output + HTML code that can be used with + + Adobe Flash. + The code will contain a subset of standard HTML elements like <b>, + <i>, and <p> as well as HTML attributes. +

        +

        + To add a CKEditor instance outputting Flash compliant HTML code, load the editor using a standard + JavaScript call, and define CKEditor features to use HTML elements and attributes. +

        +

        + For details on how to create this setup check the source code of this sample page. +

        +
        +

        + To see how it works, create some content in the editing area of CKEditor on the left + and send it to the Flash object on the right side of the page by using the + Send to Flash button. +

        + + + + + +
        + + +

        + +

        +
        +
        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/htmlwriter/outputhtml.html b/bower_components/ckeditor/samples/plugins/htmlwriter/outputhtml.html new file mode 100644 index 0000000..587988a --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/htmlwriter/outputhtml.html @@ -0,0 +1,221 @@ + + + + + + HTML Compliant Output — CKEditor Sample + + + + + + + + + +

        + CKEditor Samples » Producing HTML Compliant Output +

        +
        +

        + This sample shows how to configure CKEditor to output valid + HTML 4.01 code. + Traditional HTML elements like <b>, + <i>, and <font> are used in place of + <strong>, <em>, and CSS styles. +

        +

        + To add a CKEditor instance outputting legacy HTML 4.01 code, load the editor using a standard + JavaScript call, and define CKEditor features to use the HTML compliant elements and attributes. +

        +

        + A snippet of the configuration code can be seen below; check the source of this page for + full definition: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	coreStyles_bold: { element: 'b' },
        +	coreStyles_italic: { element: 'i' },
        +
        +	fontSize_style: {
        +		element: 'font',
        +		attributes: { 'size': '#(size)' }
        +	}
        +
        +	...
        +});
        +
        +
        +

        + + + +

        +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/image2/assets/image1.jpg b/bower_components/ckeditor/samples/plugins/image2/assets/image1.jpg new file mode 100644 index 0000000..ca491e3 Binary files /dev/null and b/bower_components/ckeditor/samples/plugins/image2/assets/image1.jpg differ diff --git a/bower_components/ckeditor/samples/plugins/image2/assets/image2.jpg b/bower_components/ckeditor/samples/plugins/image2/assets/image2.jpg new file mode 100644 index 0000000..3dd6d61 Binary files /dev/null and b/bower_components/ckeditor/samples/plugins/image2/assets/image2.jpg differ diff --git a/bower_components/ckeditor/samples/plugins/image2/image2.html b/bower_components/ckeditor/samples/plugins/image2/image2.html new file mode 100644 index 0000000..75452bc --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/image2/image2.html @@ -0,0 +1,65 @@ + + + + + + New Image plugin — CKEditor Sample + + + + + + + + + +

        + CKEditor Samples » New Image plugin +

        + +
        +

        + This editor is using the new Image (image2) plugin, which implements a dynamic click-and-drag resizing + and easy captioning of the images. +

        +

        + To use the new plugin, extend config.extraPlugins: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	extraPlugins: 'image2'
        +} );
        +
        +
        + + + + + +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/magicline/magicline.html b/bower_components/ckeditor/samples/plugins/magicline/magicline.html new file mode 100644 index 0000000..996c3b9 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/magicline/magicline.html @@ -0,0 +1,206 @@ + + + + + + Using Magicline plugin — CKEditor Sample + + + + + + + +

        + CKEditor Samples » Using Magicline plugin +

        +
        +

        + This sample shows the advantages of Magicline plugin + which is to enhance the editing process. Thanks to this plugin, + a number of difficult focus spaces which are inaccessible due to + browser issues can now be focused. +

        +

        + Magicline plugin shows a red line with a handler + which, when clicked, inserts a paragraph and allows typing. To see this, + focus an editor and move your mouse above the focus space you want + to access. The plugin is enabled by default so no additional + configuration is necessary. +

        +
        +
        + +
        +

        + This editor uses a default Magicline setup. +

        +
        + + +
        +
        +
        + +
        +

        + This editor is using a blue line. +

        +
        +CKEDITOR.replace( 'editor2', {
        +	magicline_color: 'blue'
        +});
        +
        + + +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/mathjax/mathjax.html b/bower_components/ckeditor/samples/plugins/mathjax/mathjax.html new file mode 100644 index 0000000..27b95ee --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/mathjax/mathjax.html @@ -0,0 +1,82 @@ + + + + + + Mathematical Formulas — CKEditor Sample + + + + + + + + + +

        + CKEditor Samples » Mathematical Formulas +

        + +
        +

        + This sample shows the usage of the CKEditor mathematical plugin that introduces a MathJax widget. You can now use it to create or modify equations using TeX. +

        +

        + TeX content will be automatically replaced by a widget when you put it in a <span class="math-tex"> element. You can also add new equations by using the Math toolbar button and entering TeX content in the plugin dialog window. After you click OK, a widget will be inserted into the editor content. +

        +

        + The output of the editor will be plain TeX with MathJax delimiters: \( and \), as in the code below: +

        +
        +<span class="math-tex">\( \sqrt{1} + (1)^2 = 2 \)</span>
        +
        +

        + To transform TeX into a visual equation, a page must include the MathJax script. +

        +

        + In order to use the new plugin, include it in the config.extraPlugins configuration setting. +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	extraPlugins: 'mathjax'
        +} );
        +
        +

        + Please note that this plugin is not compatible with Internet Explorer 8. +

        +
        + + + + +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/placeholder/placeholder.html b/bower_components/ckeditor/samples/plugins/placeholder/placeholder.html new file mode 100644 index 0000000..1d4478c --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/placeholder/placeholder.html @@ -0,0 +1,72 @@ + + + + + + Placeholder Plugin — CKEditor Sample + + + + + + + + +

        + CKEditor Samples » Using the Placeholder Plugin +

        +
        +

        + This sample shows how to configure CKEditor instances to use the + Placeholder plugin that lets you insert read-only elements + into your content. To enter and modify read-only text, use the + Create Placeholder   button and its matching dialog window. +

        +

        + To add a CKEditor instance that uses the placeholder plugin and a related + Create Placeholder   toolbar button, insert the following JavaScript + call to your code: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	extraPlugins: 'placeholder',
        +	toolbar: [ [ 'Source', 'Bold' ], ['CreatePlaceholder'] ]
        +});
        +

        + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced with CKEditor. +

        +
        +
        +

        + + + +

        +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/sharedspace/sharedspace.html b/bower_components/ckeditor/samples/plugins/sharedspace/sharedspace.html new file mode 100644 index 0000000..df7ff4d --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/sharedspace/sharedspace.html @@ -0,0 +1,119 @@ + + + + + + Shared-Space Plugin — CKEditor Sample + + + + + + + +

        + CKEditor Samples » Sharing Toolbar and Bottom-bar Spaces +

        +
        +

        + This sample shows several editor instances that share the very same spaces for both the toolbar and the bottom bar. +

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

        + Integer condimentum sit amet +

        +

        + Aenean nonummy a, mattis varius. Cras aliquet. + Praesent magna non mattis ac, rhoncus nunc, rhoncus eget, cursus pulvinar mollis.

        +

        Proin id nibh. Sed eu libero posuere sed, lectus. Phasellus dui gravida gravida feugiat mattis ac, felis.

        +

        Integer condimentum sit amet, tempor elit odio, a dolor non ante at sapien. Sed ac lectus. Nulla ligula quis eleifend mi, id leo velit pede cursus arcu id nulla ac lectus. Phasellus vestibulum. Nunc viverra enim quis diam.

        +
        +
        +

        + Praesent wisi accumsan sit amet nibh +

        +

        Donec ullamcorper, risus tortor, pretium porttitor. Morbi quam quis lectus non leo.

        +

        Integer faucibus scelerisque. Proin faucibus at, aliquet vulputate, odio at eros. Fusce gravida, erat vitae augue. Fusce urna fringilla gravida.

        +

        In hac habitasse platea dictumst. Praesent wisi accumsan sit amet nibh. Maecenas orci luctus a, lacinia quam sem, posuere commodo, odio condimentum tempor, pede semper risus. Suspendisse pede. In hac habitasse platea dictumst. Nam sed laoreet sit amet erat. Integer.

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

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2012, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/sourcedialog/sourcedialog.html b/bower_components/ckeditor/samples/plugins/sourcedialog/sourcedialog.html new file mode 100644 index 0000000..af38b35 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/sourcedialog/sourcedialog.html @@ -0,0 +1,118 @@ + + + + + + Editing source code in a dialog — CKEditor Sample + + + + + + + + + +

        + CKEditor Samples » Editing source code in a dialog +

        +
        +

        + Sourcedialog plugin provides an easy way to edit raw HTML content + of an editor, similarly to what is possible with Sourcearea + plugin for classic (iframe-based) instances but using dialogs. Thanks to that, it's also possible + to manipulate raw content of inline editor instances. +

        +

        + This plugin extends the toolbar with a button, + which opens a dialog window with a source code editor. It works with both classic + and inline instances. To enable this + plugin, basically add extraPlugins: 'sourcedialog' to editor's + config: +

        +
        +// Inline editor.
        +CKEDITOR.inline( 'editable', {
        +	extraPlugins: 'sourcedialog'
        +});
        +
        +// Classic (iframe-based) editor.
        +CKEDITOR.replace( 'textarea_id', {
        +	extraPlugins: 'sourcedialog',
        +	removePlugins: 'sourcearea'
        +});
        +
        +

        + Note that you may want to include removePlugins: 'sourcearea' + in your config when using Sourcedialog in classic editor instances. + This prevents feature redundancy. +

        +

        + Note that editable in the code above is the id + attribute of the <div> element to be converted into an inline instance. +

        +

        + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced with CKEditor. +

        +
        +
        + +
        +

        This is some sample text. You are using CKEditor.

        +
        +
        +
        +
        + + +
        + +
        +
        +

        + CKEditor - The text editor for the Internet - + http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource + - Frederico Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/stylesheetparser/assets/sample.css b/bower_components/ckeditor/samples/plugins/stylesheetparser/assets/sample.css new file mode 100644 index 0000000..5d5178c --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/stylesheetparser/assets/sample.css @@ -0,0 +1,70 @@ +body +{ + font-family: Arial, Verdana, sans-serif; + font-size: 12px; + color: #222; + background-color: #fff; +} + +/* preserved spaces for rtl list item bullets. (#6249)*/ +ol,ul,dl +{ + padding-right:40px; +} + +h1,h2,h3,h4 +{ + font-family: Georgia, Times, serif; +} + +h1.lightBlue +{ + color: #00A6C7; + font-size: 1.8em; + font-weight:normal; +} + +h3.green +{ + color: #739E39; + font-weight:normal; +} + +span.markYellow { background-color: yellow; } +span.markGreen { background-color: lime; } + +img.left +{ + padding: 5px; + margin-right: 5px; + float:left; + border:2px solid #DDD; +} + +img.right +{ + padding: 5px; + margin-right: 5px; + float:right; + border:2px solid #DDD; +} + +a.green +{ + color:#739E39; +} + +table.grey +{ + background-color : #F5F5F5; +} + +table.grey th +{ + background-color : #DDD; +} + +ul.square +{ + list-style-type : square; +} diff --git a/bower_components/ckeditor/samples/plugins/stylesheetparser/stylesheetparser.html b/bower_components/ckeditor/samples/plugins/stylesheetparser/stylesheetparser.html new file mode 100644 index 0000000..55ed5f1 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/stylesheetparser/stylesheetparser.html @@ -0,0 +1,82 @@ + + + + + + Using Stylesheet Parser Plugin — CKEditor Sample + + + + + + + + + +

        + CKEditor Samples » Using the Stylesheet Parser Plugin +

        +
        +

        + This sample shows how to configure CKEditor instances to use the + Stylesheet Parser (stylesheetparser) plugin that fills + the Styles drop-down list based on the CSS rules available in the document stylesheet. +

        +

        + To add a CKEditor instance using the stylesheetparser plugin, insert + the following JavaScript call into your code: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	extraPlugins: 'stylesheetparser'
        +});
        +

        + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced with CKEditor. +

        +
        +
        +

        + + + +

        +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/tableresize/tableresize.html b/bower_components/ckeditor/samples/plugins/tableresize/tableresize.html new file mode 100644 index 0000000..533b35c --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/tableresize/tableresize.html @@ -0,0 +1,104 @@ + + + + + + Using TableResize Plugin — CKEditor Sample + + + + + + + +

        + CKEditor Samples » Using the TableResize Plugin +

        +
        +

        + This sample shows how to configure CKEditor instances to use the + TableResize (tableresize) plugin that allows + the user to edit table columns by using the mouse. +

        +

        + The TableResize plugin makes it possible to modify table column width. Hover + your mouse over the column border to see the cursor change to indicate that + the column can be resized. Click and drag your mouse to set the desired width. +

        +

        + By default the plugin is turned off. To add a CKEditor instance using the + TableResize plugin, insert the following JavaScript call into your code: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	extraPlugins: 'tableresize'
        +});
        +

        + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced with CKEditor. +

        +
        +
        +

        + + + +

        +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/toolbar/toolbar.html b/bower_components/ckeditor/samples/plugins/toolbar/toolbar.html new file mode 100644 index 0000000..79d230b --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/toolbar/toolbar.html @@ -0,0 +1,232 @@ + + + + + + Toolbar Configuration — CKEditor Sample + + + + + + + +

        + CKEditor Samples » Toolbar Configuration +

        +
        +

        + This sample page demonstrates editor with loaded full toolbar (all registered buttons) and, if + current editor's configuration modifies default settings, also editor with modified toolbar. +

        + +

        Since CKEditor 4 there are two ways to configure toolbar buttons.

        + +

        By config.toolbar

        + +

        + You can explicitly define which buttons are displayed in which groups and in which order. + This is the more precise setting, but less flexible. If newly added plugin adds its + own button you'll have to add it manually to your config.toolbar setting as well. +

        + +

        To add a CKEditor instance with custom toolbar setting, insert the following JavaScript call to your code:

        + +
        +CKEDITOR.replace( 'textarea_id', {
        +	toolbar: [
        +		{ name: 'document', items: [ 'Source', '-', 'NewPage', 'Preview', '-', 'Templates' ] },	// Defines toolbar group with name (used to create voice label) and items in 3 subgroups.
        +		[ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo' ],			// Defines toolbar group without name.
        +		'/',																					// Line break - next group will be placed in new line.
        +		{ name: 'basicstyles', items: [ 'Bold', 'Italic' ] }
        +	]
        +});
        + +

        By config.toolbarGroups

        + +

        + You can define which groups of buttons (like e.g. basicstyles, clipboard + and forms) are displayed and in which order. Registered buttons are associated + with toolbar groups by toolbar property in their definition. + This setting's advantage is that you don't have to modify toolbar configuration + when adding/removing plugins which register their own buttons. +

        + +

        To add a CKEditor instance with custom toolbar groups setting, insert the following JavaScript call to your code:

        + +
        +CKEDITOR.replace( 'textarea_id', {
        +	toolbarGroups: [
        +		{ name: 'document',	   groups: [ 'mode', 'document' ] },			// Displays document group with its two subgroups.
        + 		{ name: 'clipboard',   groups: [ 'clipboard', 'undo' ] },			// Group's name will be used to create voice label.
        + 		'/',																// Line break - next group will be placed in new line.
        + 		{ name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
        + 		{ name: 'links' }
        +	]
        +
        +	// NOTE: Remember to leave 'toolbar' property with the default value (null).
        +});
        +
        + +
        +

        Current toolbar configuration

        +

        Below you can see editor with current toolbar definition.

        + +
        
        +	
        + +
        +

        Full toolbar configuration

        +

        Below you can see editor with full toolbar, generated automatically by the editor.

        +

        + Note: To create editor instance with full toolbar you don't have to set anything. + Just leave toolbar and toolbarGroups with the default, null values. +

        + +
        
        +	
        + + + +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/uicolor/uicolor.html b/bower_components/ckeditor/samples/plugins/uicolor/uicolor.html new file mode 100644 index 0000000..59ec293 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/uicolor/uicolor.html @@ -0,0 +1,103 @@ + + + + + + UI Color Picker — CKEditor Sample + + + + + + + +

        + CKEditor Samples » UI Color Plugin +

        +
        +

        + This sample shows how to use the UI Color picker toolbar button to preview the skin color of the editor. + Note:The UI skin color feature depends on the CKEditor skin + compatibility. The Moono and Kama skins are examples of skins that work with it. +

        +
        +
        +
        +

        + If the uicolor plugin along with the dedicated UIColor + toolbar button is added to CKEditor, the user will also be able to pick the color of the + UI from the color palette available in the UI Color Picker dialog window. +

        +

        + To insert a CKEditor instance with the uicolor plugin enabled, + use the following JavaScript call: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	extraPlugins: 'uicolor',
        +	toolbar: [ [ 'Bold', 'Italic' ], [ 'UIColor' ] ]
        +});
        +

        Used in themed instance

        +

        + Click the UI Color Picker toolbar button to open up a color picker dialog. +

        +

        + + +

        +

        Used in inline instance

        +

        + Click the below editable region to display floating toolbar, then click UI Color Picker button. +

        +
        +

        This is some sample text. You are using CKEditor.

        +
        + +
        +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/plugins/wysiwygarea/fullpage.html b/bower_components/ckeditor/samples/plugins/wysiwygarea/fullpage.html new file mode 100644 index 0000000..66b3f12 --- /dev/null +++ b/bower_components/ckeditor/samples/plugins/wysiwygarea/fullpage.html @@ -0,0 +1,77 @@ + + + + + + Full Page Editing — CKEditor Sample + + + + + + + + + +

        + CKEditor Samples » Full Page Editing +

        +
        +

        + This sample shows how to configure CKEditor to edit entire HTML pages, from the + <html> tag to the </html> tag. +

        +

        + The CKEditor instance below is inserted with a JavaScript call using the following code: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	fullPage: true,
        +	allowedContent: true
        +});
        +
        +

        + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced. +

        +

        + The allowedContent in the code above is set to true to disable content filtering. + Setting this option is not obligatory, but in full page mode there is a strong chance that one may want be able to freely enter any HTML content in source mode without any limitations. +

        +
        +
        + + + +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/readonly.html b/bower_components/ckeditor/samples/readonly.html new file mode 100644 index 0000000..bbd9f69 --- /dev/null +++ b/bower_components/ckeditor/samples/readonly.html @@ -0,0 +1,73 @@ + + + + + + Using the CKEditor Read-Only API — CKEditor Sample + + + + + +

        + CKEditor Samples » Using the CKEditor Read-Only API +

        +
        +

        + This sample shows how to use the + setReadOnly + API to put editor into the read-only state that makes it impossible for users to change the editor contents. +

        +

        + For details on how to create this setup check the source code of this sample page. +

        +
        +
        +

        + +

        +

        + + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/replacebyclass.html b/bower_components/ckeditor/samples/replacebyclass.html new file mode 100644 index 0000000..1547f33 --- /dev/null +++ b/bower_components/ckeditor/samples/replacebyclass.html @@ -0,0 +1,57 @@ + + + + + + Replace Textareas by Class Name — CKEditor Sample + + + + +

        + CKEditor Samples » Replace Textarea Elements by Class Name +

        +
        +

        + This sample shows how to automatically replace all <textarea> elements + of a given class with a CKEditor instance. +

        +

        + To replace a <textarea> element, simply assign it the ckeditor + class, as in the code below: +

        +
        +<textarea class="ckeditor" name="editor1"></textarea>
        +
        +

        + Note that other <textarea> attributes (like id or name) need to be adjusted to your document. +

        +
        +
        +

        + + +

        +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/replacebycode.html b/bower_components/ckeditor/samples/replacebycode.html new file mode 100644 index 0000000..e25e915 --- /dev/null +++ b/bower_components/ckeditor/samples/replacebycode.html @@ -0,0 +1,56 @@ + + + + + + Replace Textarea by Code — CKEditor Sample + + + + +

        + CKEditor Samples » Replace Textarea Elements Using JavaScript Code +

        +
        +
        +

        + This editor is using an <iframe> element-based editing area, provided by the Wysiwygarea plugin. +

        +
        +CKEDITOR.replace( 'textarea_id' )
        +
        +
        + + +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/sample.css b/bower_components/ckeditor/samples/sample.css new file mode 100644 index 0000000..4d138a8 --- /dev/null +++ b/bower_components/ckeditor/samples/sample.css @@ -0,0 +1,365 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ + +html, body, h1, h2, h3, h4, h5, h6, div, span, blockquote, p, address, form, fieldset, img, ul, ol, dl, dt, dd, li, hr, table, td, th, strong, em, sup, sub, dfn, ins, del, q, cite, var, samp, code, kbd, tt, pre +{ + line-height: 1.5; +} + +body +{ + padding: 10px 30px; +} + +input, textarea, select, option, optgroup, button, td, th +{ + font-size: 100%; +} + +pre +{ + -moz-tab-size: 4; + -o-tab-size: 4; + -webkit-tab-size: 4; + tab-size: 4; +} + +pre, code, kbd, samp, tt +{ + font-family: monospace,monospace; + font-size: 1em; +} + +body { + width: 960px; + margin: 0 auto; +} + +code +{ + background: #f3f3f3; + border: 1px solid #ddd; + padding: 1px 4px; + + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +abbr +{ + border-bottom: 1px dotted #555; + cursor: pointer; +} + +.new, .beta +{ + text-transform: uppercase; + font-size: 10px; + font-weight: bold; + padding: 1px 4px; + margin: 0 0 0 5px; + color: #fff; + float: right; + + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.new +{ + background: #FF7E00; + border: 1px solid #DA8028; + text-shadow: 0 1px 0 #C97626; + + -moz-box-shadow: 0 2px 3px 0 #FFA54E inset; + -webkit-box-shadow: 0 2px 3px 0 #FFA54E inset; + box-shadow: 0 2px 3px 0 #FFA54E inset; +} + +.beta +{ + background: #18C0DF; + border: 1px solid #19AAD8; + text-shadow: 0 1px 0 #048CAD; + font-style: italic; + + -moz-box-shadow: 0 2px 3px 0 #50D4FD inset; + -webkit-box-shadow: 0 2px 3px 0 #50D4FD inset; + box-shadow: 0 2px 3px 0 #50D4FD inset; +} + +h1.samples +{ + color: #0782C1; + font-size: 200%; + font-weight: normal; + margin: 0; + padding: 0; +} + +h1.samples a +{ + color: #0782C1; + text-decoration: none; + border-bottom: 1px dotted #0782C1; +} + +.samples a:hover +{ + border-bottom: 1px dotted #0782C1; +} + +h2.samples +{ + color: #000000; + font-size: 130%; + margin: 15px 0 0 0; + padding: 0; +} + +p, blockquote, address, form, pre, dl, h1.samples, h2.samples +{ + margin-bottom: 15px; +} + +ul.samples +{ + margin-bottom: 15px; +} + +.clear +{ + clear: both; +} + +fieldset +{ + margin: 0; + padding: 10px; +} + +body, input, textarea +{ + color: #333333; + font-family: Arial, Helvetica, sans-serif; +} + +body +{ + font-size: 75%; +} + +a.samples +{ + color: #189DE1; + text-decoration: none; +} + +form +{ + margin: 0; + padding: 0; +} + +pre.samples +{ + background-color: #F7F7F7; + border: 1px solid #D7D7D7; + overflow: auto; + padding: 0.25em; + white-space: pre-wrap; /* CSS 2.1 */ + word-wrap: break-word; /* IE7 */ +} + +#footer +{ + clear: both; + padding-top: 10px; +} + +#footer hr +{ + margin: 10px 0 15px 0; + height: 1px; + border: solid 1px gray; + border-bottom: none; +} + +#footer p +{ + margin: 0 10px 10px 10px; + float: left; +} + +#footer #copy +{ + float: right; +} + +#outputSample +{ + width: 100%; + table-layout: fixed; +} + +#outputSample thead th +{ + color: #dddddd; + background-color: #999999; + padding: 4px; + white-space: nowrap; +} + +#outputSample tbody th +{ + vertical-align: top; + text-align: left; +} + +#outputSample pre +{ + margin: 0; + padding: 0; +} + +.description +{ + border: 1px dotted #B7B7B7; + margin-bottom: 10px; + padding: 10px 10px 0; + overflow: hidden; +} + +label +{ + display: block; + margin-bottom: 6px; +} + +/** + * CKEditor editables are automatically set with the "cke_editable" class + * plus cke_editable_(inline|themed) depending on the editor type. + */ + +/* Style a bit the inline editables. */ +.cke_editable.cke_editable_inline +{ + cursor: pointer; +} + +/* Once an editable element gets focused, the "cke_focus" class is + added to it, so we can style it differently. */ +.cke_editable.cke_editable_inline.cke_focus +{ + box-shadow: inset 0px 0px 20px 3px #ddd, inset 0 0 1px #000; + outline: none; + background: #eee; + cursor: text; +} + +/* Avoid pre-formatted overflows inline editable. */ +.cke_editable_inline pre +{ + white-space: pre-wrap; + word-wrap: break-word; +} + +/** + * Samples index styles. + */ + +.twoColumns, +.twoColumnsLeft, +.twoColumnsRight +{ + overflow: hidden; +} + +.twoColumnsLeft, +.twoColumnsRight +{ + width: 45%; +} + +.twoColumnsLeft +{ + float: left; +} + +.twoColumnsRight +{ + float: right; +} + +dl.samples +{ + padding: 0 0 0 40px; +} +dl.samples > dt +{ + display: list-item; + list-style-type: disc; + list-style-position: outside; + margin: 0 0 3px; +} +dl.samples > dd +{ + margin: 0 0 3px; +} +.warning +{ + color: #ff0000; + background-color: #FFCCBA; + border: 2px dotted #ff0000; + padding: 15px 10px; + margin: 10px 0; +} + +/* Used on inline samples */ + +blockquote +{ + font-style: italic; + font-family: Georgia, Times, "Times New Roman", serif; + padding: 2px 0; + border-style: solid; + border-color: #ccc; + border-width: 0; +} + +.cke_contents_ltr blockquote +{ + padding-left: 20px; + padding-right: 8px; + border-left-width: 5px; +} + +.cke_contents_rtl blockquote +{ + padding-left: 8px; + padding-right: 20px; + border-right-width: 5px; +} + +img.right { + border: 1px solid #ccc; + float: right; + margin-left: 15px; + padding: 5px; +} + +img.left { + border: 1px solid #ccc; + float: left; + margin-right: 15px; + padding: 5px; +} + +.marker +{ + background-color: Yellow; +} diff --git a/bower_components/ckeditor/samples/sample.js b/bower_components/ckeditor/samples/sample.js new file mode 100644 index 0000000..2bdcd98 --- /dev/null +++ b/bower_components/ckeditor/samples/sample.js @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +// Tool scripts for the sample pages. +// This file can be ignored and is not required to make use of CKEditor. + +( function() { + CKEDITOR.on( 'instanceReady', function( ev ) { + // Check for sample compliance. + var editor = ev.editor, + meta = CKEDITOR.document.$.getElementsByName( 'ckeditor-sample-required-plugins' ), + requires = meta.length ? CKEDITOR.dom.element.get( meta[ 0 ] ).getAttribute( 'content' ).split( ',' ) : [], + missing = [], + i; + + if ( requires.length ) { + for ( i = 0; i < requires.length; i++ ) { + if ( !editor.plugins[ requires[ i ] ] ) + missing.push( '' + requires[ i ] + '' ); + } + + if ( missing.length ) { + var warn = CKEDITOR.dom.element.createFromHtml( + '
        ' + + 'To fully experience this demo, the ' + missing.join( ', ' ) + ' plugin' + ( missing.length > 1 ? 's are' : ' is' ) + ' required.' + + '
        ' + ); + warn.insertBefore( editor.container ); + } + } + + // Set icons. + var doc = new CKEDITOR.dom.document( document ), + icons = doc.find( '.button_icon' ); + + for ( i = 0; i < icons.count(); i++ ) { + var icon = icons.getItem( i ), + name = icon.getAttribute( 'data-icon' ), + style = CKEDITOR.skin.getIconStyle( name, ( CKEDITOR.lang.dir == 'rtl' ) ); + + icon.addClass( 'cke_button_icon' ); + icon.addClass( 'cke_button__' + name + '_icon' ); + icon.setAttribute( 'style', style ); + icon.setStyle( 'float', 'none' ); + + } + } ); +} )(); diff --git a/bower_components/ckeditor/samples/sample_posteddata.php b/bower_components/ckeditor/samples/sample_posteddata.php new file mode 100644 index 0000000..7775f07 --- /dev/null +++ b/bower_components/ckeditor/samples/sample_posteddata.php @@ -0,0 +1,16 @@ +
        +
        +-------------------------------------------------------------------------------------------
        +  CKEditor - Posted Data
        +
        +  We are sorry, but your Web server does not support the PHP language used in this script.
        +
        +  Please note that CKEditor can be used with any other server-side language than just PHP.
        +  To save the content created with CKEditor you need to read the POST data on the server
        +  side and write it to a file or the database.
        +
        +  Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
        +  For licensing, see LICENSE.md or http://ckeditor.com/license
        +-------------------------------------------------------------------------------------------
        +
        +
        */ include "assets/posteddata.php"; ?> diff --git a/bower_components/ckeditor/samples/tabindex.html b/bower_components/ckeditor/samples/tabindex.html new file mode 100644 index 0000000..5d1ab63 --- /dev/null +++ b/bower_components/ckeditor/samples/tabindex.html @@ -0,0 +1,75 @@ + + + + + + TAB Key-Based Navigation — CKEditor Sample + + + + + + +

        + CKEditor Samples » TAB Key-Based Navigation +

        +
        +

        + This sample shows how tab key navigation among editor instances is + affected by the tabIndex attribute from + the original page element. Use TAB key to move between the editors. +

        +
        +

        + +

        +
        +

        + +

        +

        + +

        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/uicolor.html b/bower_components/ckeditor/samples/uicolor.html new file mode 100644 index 0000000..d7c5dea --- /dev/null +++ b/bower_components/ckeditor/samples/uicolor.html @@ -0,0 +1,69 @@ + + + + + + UI Color Picker — CKEditor Sample + + + + +

        + CKEditor Samples » UI Color +

        +
        +

        + This sample shows how to automatically replace <textarea> elements + with a CKEditor instance with an option to change the color of its user interface.
        + Note:The UI skin color feature depends on the CKEditor skin + compatibility. The Moono and Kama skins are examples of skins that work with it. +

        +
        +
        +

        + This editor instance has a UI color value defined in configuration to change the skin color, + To specify the color of the user interface, set the uiColor property: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	uiColor: '#14B8C4'
        +});
        +

        + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced. +

        +

        + + +

        +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/uilanguages.html b/bower_components/ckeditor/samples/uilanguages.html new file mode 100644 index 0000000..4e73dcc --- /dev/null +++ b/bower_components/ckeditor/samples/uilanguages.html @@ -0,0 +1,119 @@ + + + + + + User Interface Globalization — CKEditor Sample + + + + + +

        + CKEditor Samples » User Interface Languages +

        +
        +

        + This sample shows how to automatically replace <textarea> elements + with a CKEditor instance with an option to change the language of its user interface. +

        +

        + It pulls the language list from CKEditor _languages.js file that contains the list of supported languages and creates + a drop-down list that lets the user change the UI language. +

        +

        + By default, CKEditor automatically localizes the editor to the language of the user. + The UI language can be controlled with two configuration options: + language and + + defaultLanguage. The defaultLanguage setting specifies the + default CKEditor language to be used when a localization suitable for user's settings is not available. +

        +

        + To specify the user interface language that will be used no matter what language is + specified in user's browser or operating system, set the language property: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	// Load the German interface.
        +	language: 'de'
        +});
        +

        + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced. +

        +
        +
        +

        + Available languages ( languages!):
        + +
        + + (You may see strange characters if your system does not support the selected language) + +

        +

        + + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/samples/xhtmlstyle.html b/bower_components/ckeditor/samples/xhtmlstyle.html new file mode 100644 index 0000000..b53b431 --- /dev/null +++ b/bower_components/ckeditor/samples/xhtmlstyle.html @@ -0,0 +1,231 @@ + + + + + + XHTML Compliant Output — CKEditor Sample + + + + + + +

        + CKEditor Samples » Producing XHTML Compliant Output +

        +
        +

        + This sample shows how to configure CKEditor to output valid + XHTML 1.1 code. + Deprecated elements (<font>, <u>) or attributes + (size, face) will be replaced with XHTML compliant code. +

        +

        + To add a CKEditor instance outputting valid XHTML code, load the editor using a standard + JavaScript call and define CKEditor features to use the XHTML compliant elements and styles. +

        +

        + A snippet of the configuration code can be seen below; check the source of this page for + full definition: +

        +
        +CKEDITOR.replace( 'textarea_id', {
        +	contentsCss: 'assets/outputxhtml.css',
        +
        +	coreStyles_bold: {
        +		element: 'span',
        +		attributes: { 'class': 'Bold' }
        +	},
        +	coreStyles_italic: {
        +		element: 'span',
        +		attributes: { 'class': 'Italic' }
        +	},
        +
        +	...
        +});
        +
        +
        +

        + + + +

        +

        + +

        +
        +
        +
        +

        + CKEditor - The text editor for the Internet - http://ckeditor.com +

        +

        + Copyright © 2003-2015, CKSource - Frederico + Knabben. All rights reserved. +

        +
        + + diff --git a/bower_components/ckeditor/skins/kama/dialog.css b/bower_components/ckeditor/skins/kama/dialog.css new file mode 100644 index 0000000..03d7b73 --- /dev/null +++ b/bower_components/ckeditor/skins/kama/dialog.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;border:solid 1px #ddd;padding:5px;background-color:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:14px;padding:3px 3px 8px;cursor:move;position:relative;border-bottom:1px solid #eee}.cke_dialog_contents{background-color:#ebebeb;border:solid 1px #fff;border-bottom:0;overflow:auto;padding:17px 10px 5px 10px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;border-top-left-radius:5px;border-top-right-radius:5px;margin-top:22px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;background-color:#ebebeb;border:solid 1px #fff;border-bottom:0;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.cke_rtl .cke_dialog_footer{text-align:left}.cke_dialog_footer .cke_resizer{margin-top:24px}.cke_dialog_footer .cke_resizer_ltr{border-right-color:#ccc}.cke_dialog_footer .cke_resizer_rtl{border-left-color:#ccc}.cke_hc .cke_dialog_footer .cke_resizer{margin-bottom:1px}.cke_hc .cke_dialog_footer .cke_resizer_ltr{margin-right:1px}.cke_hc .cke_dialog_footer .cke_resizer_rtl{margin-left:1px}.cke_dialog_tabs{height:23px;display:inline-block;margin-left:10px;margin-right:10px;margin-top:11px;position:absolute;z-index:2}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1323px;background-color:#ebebeb;height:14px;padding:4px 8px;display:inline-block;cursor:pointer}a.cke_dialog_tab:hover{background-color:#f1f1e3}.cke_hc a.cke_dialog_tab:hover{padding:2px 6px!important;border-width:3px}a.cke_dialog_tab_selected{background-position:0 -1279px;cursor:default}.cke_hc a.cke_dialog_tab_selected{padding:2px 6px!important;border-width:3px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:10px}.cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:0 -1022px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px}.cke_dialog_close_button span{display:none}.cke_dialog_close_button:hover{background-position:0 -1045px}.cke_ltr .cke_dialog_close_button{right:10px}.cke_rtl .cke_dialog_close_button{left:10px}.cke_dialog_close_button{top:7px}div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password{background-color:white;border:0;padding:0;width:100%;height:14px}div.cke_dialog_ui_input_text,div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0}textarea.cke_dialog_ui_input_textarea{background-color:white;border:0;padding:0;width:100%;overflow:auto;resize:none}div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0}a.cke_dialog_ui_button{border-collapse:separate;cursor:default;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent url(images/sprites.png) repeat-x scroll 0 -1069px;text-align:center;display:inline-block}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{width:60px;padding:5px 20px 5px;display:inline-block}a.cke_dialog_ui_button_ok{background-position:0 -1144px}a.cke_dialog_ui_button_ok span{background:transparent url(images/sprites.png) no-repeat scroll right -1216px}.cke_rtl a.cke_dialog_ui_button_ok span{background-position:left -1216px}a.cke_dialog_ui_button_cancel{background-position:0 -1105px}a.cke_dialog_ui_button_cancel span{background:transparent url(images/sprites.png) no-repeat scroll right -1242px}.cke_rtl a.cke_dialog_ui_button_cancel span{background-position:left -1242px}span.cke_dialog_ui_button{padding:2px 10px;text-align:center;color:#222;display:inline-block;cursor:default;min-width:60px}a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3}a.cke_dialog_ui_button:hover,a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{background-position:0 -1180px}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border-width:2px}.cke_dialog_footer_buttons{display:inline-table;margin:6px 12px 0 12px;width:auto;position:relative}.cke_dialog_footer_buttons span.cke_dialog_ui_button{text-align:center}select.cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_dialog .cke_dark_background{background-color:#eaead1}.cke_dialog .cke_light_background{background-color:#ffffbe}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid black}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_tabs,.cke_hc .cke_dialog_contents,.cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid}.cke_hc .cke_dialog_title{border-top:1px solid}.cke_hc .cke_dialog_footer{border-bottom:1px solid}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}.cke_hc .cke_dialog_body .cke_label{display:inline;cursor:inherit}.cke_hc a.cke_btn_locked,.cke_hc a.cke_btn_unlocked,.cke_hc a.cke_btn_reset{border-style:solid;float:left;width:auto;height:auto;padding:0 2px}.cke_rtl.cke_hc a.cke_btn_locked,.cke_rtl.cke_hc a.cke_btn_unlocked,.cke_rtl.cke_hc a.cke_btn_reset{float:right}.cke_hc a.cke_btn_locked .cke_icon{display:inline}a.cke_smile img{border:2px solid #eaead1}a.cke_smile:focus img,a.cke_smile:active img,a.cke_smile:hover img{border-color:#c7c78f}.cke_hc .cke_dialog_tabs a,.cke_hc .cke_dialog_footer a{opacity:1.0;filter:alpha(opacity=100);border:1px solid white}.cke_hc .ImagePreviewBox{width:260px}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_dialog_ui_input_select:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0);width:100%;height:100%} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/kama/dialog_ie.css b/bower_components/ckeditor/skins/kama/dialog_ie.css new file mode 100644 index 0000000..31741b8 --- /dev/null +++ b/bower_components/ckeditor/skins/kama/dialog_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;border:solid 1px #ddd;padding:5px;background-color:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:14px;padding:3px 3px 8px;cursor:move;position:relative;border-bottom:1px solid #eee}.cke_dialog_contents{background-color:#ebebeb;border:solid 1px #fff;border-bottom:0;overflow:auto;padding:17px 10px 5px 10px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;border-top-left-radius:5px;border-top-right-radius:5px;margin-top:22px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;background-color:#ebebeb;border:solid 1px #fff;border-bottom:0;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.cke_rtl .cke_dialog_footer{text-align:left}.cke_dialog_footer .cke_resizer{margin-top:24px}.cke_dialog_footer .cke_resizer_ltr{border-right-color:#ccc}.cke_dialog_footer .cke_resizer_rtl{border-left-color:#ccc}.cke_hc .cke_dialog_footer .cke_resizer{margin-bottom:1px}.cke_hc .cke_dialog_footer .cke_resizer_ltr{margin-right:1px}.cke_hc .cke_dialog_footer .cke_resizer_rtl{margin-left:1px}.cke_dialog_tabs{height:23px;display:inline-block;margin-left:10px;margin-right:10px;margin-top:11px;position:absolute;z-index:2}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1323px;background-color:#ebebeb;height:14px;padding:4px 8px;display:inline-block;cursor:pointer}a.cke_dialog_tab:hover{background-color:#f1f1e3}.cke_hc a.cke_dialog_tab:hover{padding:2px 6px!important;border-width:3px}a.cke_dialog_tab_selected{background-position:0 -1279px;cursor:default}.cke_hc a.cke_dialog_tab_selected{padding:2px 6px!important;border-width:3px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:10px}.cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:0 -1022px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px}.cke_dialog_close_button span{display:none}.cke_dialog_close_button:hover{background-position:0 -1045px}.cke_ltr .cke_dialog_close_button{right:10px}.cke_rtl .cke_dialog_close_button{left:10px}.cke_dialog_close_button{top:7px}div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password{background-color:white;border:0;padding:0;width:100%;height:14px}div.cke_dialog_ui_input_text,div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0}textarea.cke_dialog_ui_input_textarea{background-color:white;border:0;padding:0;width:100%;overflow:auto;resize:none}div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0}a.cke_dialog_ui_button{border-collapse:separate;cursor:default;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent url(images/sprites.png) repeat-x scroll 0 -1069px;text-align:center;display:inline-block}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{width:60px;padding:5px 20px 5px;display:inline-block}a.cke_dialog_ui_button_ok{background-position:0 -1144px}a.cke_dialog_ui_button_ok span{background:transparent url(images/sprites.png) no-repeat scroll right -1216px}.cke_rtl a.cke_dialog_ui_button_ok span{background-position:left -1216px}a.cke_dialog_ui_button_cancel{background-position:0 -1105px}a.cke_dialog_ui_button_cancel span{background:transparent url(images/sprites.png) no-repeat scroll right -1242px}.cke_rtl a.cke_dialog_ui_button_cancel span{background-position:left -1242px}span.cke_dialog_ui_button{padding:2px 10px;text-align:center;color:#222;display:inline-block;cursor:default;min-width:60px}a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3}a.cke_dialog_ui_button:hover,a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{background-position:0 -1180px}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border-width:2px}.cke_dialog_footer_buttons{display:inline-table;margin:6px 12px 0 12px;width:auto;position:relative}.cke_dialog_footer_buttons span.cke_dialog_ui_button{text-align:center}select.cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_dialog .cke_dark_background{background-color:#eaead1}.cke_dialog .cke_light_background{background-color:#ffffbe}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid black}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_tabs,.cke_hc .cke_dialog_contents,.cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid}.cke_hc .cke_dialog_title{border-top:1px solid}.cke_hc .cke_dialog_footer{border-bottom:1px solid}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}.cke_hc .cke_dialog_body .cke_label{display:inline;cursor:inherit}.cke_hc a.cke_btn_locked,.cke_hc a.cke_btn_unlocked,.cke_hc a.cke_btn_reset{border-style:solid;float:left;width:auto;height:auto;padding:0 2px}.cke_rtl.cke_hc a.cke_btn_locked,.cke_rtl.cke_hc a.cke_btn_unlocked,.cke_rtl.cke_hc a.cke_btn_reset{float:right}.cke_hc a.cke_btn_locked .cke_icon{display:inline}a.cke_smile img{border:2px solid #eaead1}a.cke_smile:focus img,a.cke_smile:active img,a.cke_smile:hover img{border-color:#c7c78f}.cke_hc .cke_dialog_tabs a,.cke_hc .cke_dialog_footer a{opacity:1.0;filter:alpha(opacity=100);border:1px solid white}.cke_hc .ImagePreviewBox{width:260px}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_dialog_ui_input_select:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/kama/dialog_ie7.css b/bower_components/ckeditor/skins/kama/dialog_ie7.css new file mode 100644 index 0000000..e63e960 --- /dev/null +++ b/bower_components/ckeditor/skins/kama/dialog_ie7.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;border:solid 1px #ddd;padding:5px;background-color:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:14px;padding:3px 3px 8px;cursor:move;position:relative;border-bottom:1px solid #eee}.cke_dialog_contents{background-color:#ebebeb;border:solid 1px #fff;border-bottom:0;overflow:auto;padding:17px 10px 5px 10px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;border-top-left-radius:5px;border-top-right-radius:5px;margin-top:22px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;background-color:#ebebeb;border:solid 1px #fff;border-bottom:0;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.cke_rtl .cke_dialog_footer{text-align:left}.cke_dialog_footer .cke_resizer{margin-top:24px}.cke_dialog_footer .cke_resizer_ltr{border-right-color:#ccc}.cke_dialog_footer .cke_resizer_rtl{border-left-color:#ccc}.cke_hc .cke_dialog_footer .cke_resizer{margin-bottom:1px}.cke_hc .cke_dialog_footer .cke_resizer_ltr{margin-right:1px}.cke_hc .cke_dialog_footer .cke_resizer_rtl{margin-left:1px}.cke_dialog_tabs{height:23px;display:inline-block;margin-left:10px;margin-right:10px;margin-top:11px;position:absolute;z-index:2}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1323px;background-color:#ebebeb;height:14px;padding:4px 8px;display:inline-block;cursor:pointer}a.cke_dialog_tab:hover{background-color:#f1f1e3}.cke_hc a.cke_dialog_tab:hover{padding:2px 6px!important;border-width:3px}a.cke_dialog_tab_selected{background-position:0 -1279px;cursor:default}.cke_hc a.cke_dialog_tab_selected{padding:2px 6px!important;border-width:3px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:10px}.cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:0 -1022px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px}.cke_dialog_close_button span{display:none}.cke_dialog_close_button:hover{background-position:0 -1045px}.cke_ltr .cke_dialog_close_button{right:10px}.cke_rtl .cke_dialog_close_button{left:10px}.cke_dialog_close_button{top:7px}div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password{background-color:white;border:0;padding:0;width:100%;height:14px}div.cke_dialog_ui_input_text,div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0}textarea.cke_dialog_ui_input_textarea{background-color:white;border:0;padding:0;width:100%;overflow:auto;resize:none}div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0}a.cke_dialog_ui_button{border-collapse:separate;cursor:default;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent url(images/sprites.png) repeat-x scroll 0 -1069px;text-align:center;display:inline-block}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{width:60px;padding:5px 20px 5px;display:inline-block}a.cke_dialog_ui_button_ok{background-position:0 -1144px}a.cke_dialog_ui_button_ok span{background:transparent url(images/sprites.png) no-repeat scroll right -1216px}.cke_rtl a.cke_dialog_ui_button_ok span{background-position:left -1216px}a.cke_dialog_ui_button_cancel{background-position:0 -1105px}a.cke_dialog_ui_button_cancel span{background:transparent url(images/sprites.png) no-repeat scroll right -1242px}.cke_rtl a.cke_dialog_ui_button_cancel span{background-position:left -1242px}span.cke_dialog_ui_button{padding:2px 10px;text-align:center;color:#222;display:inline-block;cursor:default;min-width:60px}a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3}a.cke_dialog_ui_button:hover,a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{background-position:0 -1180px}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border-width:2px}.cke_dialog_footer_buttons{display:inline-table;margin:6px 12px 0 12px;width:auto;position:relative}.cke_dialog_footer_buttons span.cke_dialog_ui_button{text-align:center}select.cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_dialog .cke_dark_background{background-color:#eaead1}.cke_dialog .cke_light_background{background-color:#ffffbe}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid black}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_tabs,.cke_hc .cke_dialog_contents,.cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid}.cke_hc .cke_dialog_title{border-top:1px solid}.cke_hc .cke_dialog_footer{border-bottom:1px solid}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}.cke_hc .cke_dialog_body .cke_label{display:inline;cursor:inherit}.cke_hc a.cke_btn_locked,.cke_hc a.cke_btn_unlocked,.cke_hc a.cke_btn_reset{border-style:solid;float:left;width:auto;height:auto;padding:0 2px}.cke_rtl.cke_hc a.cke_btn_locked,.cke_rtl.cke_hc a.cke_btn_unlocked,.cke_rtl.cke_hc a.cke_btn_reset{float:right}.cke_hc a.cke_btn_locked .cke_icon{display:inline}a.cke_smile img{border:2px solid #eaead1}a.cke_smile:focus img,a.cke_smile:active img,a.cke_smile:hover img{border-color:#c7c78f}.cke_hc .cke_dialog_tabs a,.cke_hc .cke_dialog_footer a{opacity:1.0;filter:alpha(opacity=100);border:1px solid white}.cke_hc .ImagePreviewBox{width:260px}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_dialog_ui_input_select:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_dialog_title{margin-bottom:22px}.cke_single_page .cke_dialog_title{margin-bottom:10px}.cke_single_page .cke_dialog_footer{margin-top:22px}.cke_dialog_footer .cke_resizer{margin-top:27px}.cke_dialog_tabs{top:33px}.cke_dialog_footer_buttons{position:static;margin-top:7px;margin-right:24px}.cke_rtl .cke_dialog_footer_buttons{margin-right:0;margin-left:24px}.cke_rtl .cke_dialog_close_button{margin-top:0;position:absolute;left:10px;top:5px}span.cke_dialog_ui_buttonm{margin:2px 0}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password{position:absolute}div.cke_dialog_ui_input_text,div.cke_dialog_ui_input_password{height:14px;position:relative} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/kama/dialog_ie8.css b/bower_components/ckeditor/skins/kama/dialog_ie8.css new file mode 100644 index 0000000..07b4a41 --- /dev/null +++ b/bower_components/ckeditor/skins/kama/dialog_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;border:solid 1px #ddd;padding:5px;background-color:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:14px;padding:3px 3px 8px;cursor:move;position:relative;border-bottom:1px solid #eee}.cke_dialog_contents{background-color:#ebebeb;border:solid 1px #fff;border-bottom:0;overflow:auto;padding:17px 10px 5px 10px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;border-top-left-radius:5px;border-top-right-radius:5px;margin-top:22px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;background-color:#ebebeb;border:solid 1px #fff;border-bottom:0;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.cke_rtl .cke_dialog_footer{text-align:left}.cke_dialog_footer .cke_resizer{margin-top:24px}.cke_dialog_footer .cke_resizer_ltr{border-right-color:#ccc}.cke_dialog_footer .cke_resizer_rtl{border-left-color:#ccc}.cke_hc .cke_dialog_footer .cke_resizer{margin-bottom:1px}.cke_hc .cke_dialog_footer .cke_resizer_ltr{margin-right:1px}.cke_hc .cke_dialog_footer .cke_resizer_rtl{margin-left:1px}.cke_dialog_tabs{height:23px;display:inline-block;margin-left:10px;margin-right:10px;margin-top:11px;position:absolute;z-index:2}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1323px;background-color:#ebebeb;height:14px;padding:4px 8px;display:inline-block;cursor:pointer}a.cke_dialog_tab:hover{background-color:#f1f1e3}.cke_hc a.cke_dialog_tab:hover{padding:2px 6px!important;border-width:3px}a.cke_dialog_tab_selected{background-position:0 -1279px;cursor:default}.cke_hc a.cke_dialog_tab_selected{padding:2px 6px!important;border-width:3px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:10px}.cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:0 -1022px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px}.cke_dialog_close_button span{display:none}.cke_dialog_close_button:hover{background-position:0 -1045px}.cke_ltr .cke_dialog_close_button{right:10px}.cke_rtl .cke_dialog_close_button{left:10px}.cke_dialog_close_button{top:7px}div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password{background-color:white;border:0;padding:0;width:100%;height:14px}div.cke_dialog_ui_input_text,div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0}textarea.cke_dialog_ui_input_textarea{background-color:white;border:0;padding:0;width:100%;overflow:auto;resize:none}div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0}a.cke_dialog_ui_button{border-collapse:separate;cursor:default;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent url(images/sprites.png) repeat-x scroll 0 -1069px;text-align:center;display:inline-block}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{width:60px;padding:5px 20px 5px;display:inline-block}a.cke_dialog_ui_button_ok{background-position:0 -1144px}a.cke_dialog_ui_button_ok span{background:transparent url(images/sprites.png) no-repeat scroll right -1216px}.cke_rtl a.cke_dialog_ui_button_ok span{background-position:left -1216px}a.cke_dialog_ui_button_cancel{background-position:0 -1105px}a.cke_dialog_ui_button_cancel span{background:transparent url(images/sprites.png) no-repeat scroll right -1242px}.cke_rtl a.cke_dialog_ui_button_cancel span{background-position:left -1242px}span.cke_dialog_ui_button{padding:2px 10px;text-align:center;color:#222;display:inline-block;cursor:default;min-width:60px}a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3}a.cke_dialog_ui_button:hover,a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{background-position:0 -1180px}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border-width:2px}.cke_dialog_footer_buttons{display:inline-table;margin:6px 12px 0 12px;width:auto;position:relative}.cke_dialog_footer_buttons span.cke_dialog_ui_button{text-align:center}select.cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_dialog .cke_dark_background{background-color:#eaead1}.cke_dialog .cke_light_background{background-color:#ffffbe}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid black}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_tabs,.cke_hc .cke_dialog_contents,.cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid}.cke_hc .cke_dialog_title{border-top:1px solid}.cke_hc .cke_dialog_footer{border-bottom:1px solid}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}.cke_hc .cke_dialog_body .cke_label{display:inline;cursor:inherit}.cke_hc a.cke_btn_locked,.cke_hc a.cke_btn_unlocked,.cke_hc a.cke_btn_reset{border-style:solid;float:left;width:auto;height:auto;padding:0 2px}.cke_rtl.cke_hc a.cke_btn_locked,.cke_rtl.cke_hc a.cke_btn_unlocked,.cke_rtl.cke_hc a.cke_btn_reset{float:right}.cke_hc a.cke_btn_locked .cke_icon{display:inline}a.cke_smile img{border:2px solid #eaead1}a.cke_smile:focus img,a.cke_smile:active img,a.cke_smile:hover img{border-color:#c7c78f}.cke_hc .cke_dialog_tabs a,.cke_hc .cke_dialog_footer a{opacity:1.0;filter:alpha(opacity=100);border:1px solid white}.cke_hc .ImagePreviewBox{width:260px}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_dialog_ui_input_select:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_rtl .cke_dialog_footer_buttons td{padding-left:2px}.cke_rtl .cke_dialog_close_button{left:8px} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/kama/dialog_iequirks.css b/bower_components/ckeditor/skins/kama/dialog_iequirks.css new file mode 100644 index 0000000..bdac091 --- /dev/null +++ b/bower_components/ckeditor/skins/kama/dialog_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;border:solid 1px #ddd;padding:5px;background-color:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:14px;padding:3px 3px 8px;cursor:move;position:relative;border-bottom:1px solid #eee}.cke_dialog_contents{background-color:#ebebeb;border:solid 1px #fff;border-bottom:0;overflow:auto;padding:17px 10px 5px 10px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;border-top-left-radius:5px;border-top-right-radius:5px;margin-top:22px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;background-color:#ebebeb;border:solid 1px #fff;border-bottom:0;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.cke_rtl .cke_dialog_footer{text-align:left}.cke_dialog_footer .cke_resizer{margin-top:24px}.cke_dialog_footer .cke_resizer_ltr{border-right-color:#ccc}.cke_dialog_footer .cke_resizer_rtl{border-left-color:#ccc}.cke_hc .cke_dialog_footer .cke_resizer{margin-bottom:1px}.cke_hc .cke_dialog_footer .cke_resizer_ltr{margin-right:1px}.cke_hc .cke_dialog_footer .cke_resizer_rtl{margin-left:1px}.cke_dialog_tabs{height:23px;display:inline-block;margin-left:10px;margin-right:10px;margin-top:11px;position:absolute;z-index:2}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1323px;background-color:#ebebeb;height:14px;padding:4px 8px;display:inline-block;cursor:pointer}a.cke_dialog_tab:hover{background-color:#f1f1e3}.cke_hc a.cke_dialog_tab:hover{padding:2px 6px!important;border-width:3px}a.cke_dialog_tab_selected{background-position:0 -1279px;cursor:default}.cke_hc a.cke_dialog_tab_selected{padding:2px 6px!important;border-width:3px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:10px}.cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:0 -1022px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px}.cke_dialog_close_button span{display:none}.cke_dialog_close_button:hover{background-position:0 -1045px}.cke_ltr .cke_dialog_close_button{right:10px}.cke_rtl .cke_dialog_close_button{left:10px}.cke_dialog_close_button{top:7px}div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password{background-color:white;border:0;padding:0;width:100%;height:14px}div.cke_dialog_ui_input_text,div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0}textarea.cke_dialog_ui_input_textarea{background-color:white;border:0;padding:0;width:100%;overflow:auto;resize:none}div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0}a.cke_dialog_ui_button{border-collapse:separate;cursor:default;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent url(images/sprites.png) repeat-x scroll 0 -1069px;text-align:center;display:inline-block}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{width:60px;padding:5px 20px 5px;display:inline-block}a.cke_dialog_ui_button_ok{background-position:0 -1144px}a.cke_dialog_ui_button_ok span{background:transparent url(images/sprites.png) no-repeat scroll right -1216px}.cke_rtl a.cke_dialog_ui_button_ok span{background-position:left -1216px}a.cke_dialog_ui_button_cancel{background-position:0 -1105px}a.cke_dialog_ui_button_cancel span{background:transparent url(images/sprites.png) no-repeat scroll right -1242px}.cke_rtl a.cke_dialog_ui_button_cancel span{background-position:left -1242px}span.cke_dialog_ui_button{padding:2px 10px;text-align:center;color:#222;display:inline-block;cursor:default;min-width:60px}a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3}a.cke_dialog_ui_button:hover,a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{background-position:0 -1180px}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border-width:2px}.cke_dialog_footer_buttons{display:inline-table;margin:6px 12px 0 12px;width:auto;position:relative}.cke_dialog_footer_buttons span.cke_dialog_ui_button{text-align:center}select.cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_dialog .cke_dark_background{background-color:#eaead1}.cke_dialog .cke_light_background{background-color:#ffffbe}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid black}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_tabs,.cke_hc .cke_dialog_contents,.cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid}.cke_hc .cke_dialog_title{border-top:1px solid}.cke_hc .cke_dialog_footer{border-bottom:1px solid}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}.cke_hc .cke_dialog_body .cke_label{display:inline;cursor:inherit}.cke_hc a.cke_btn_locked,.cke_hc a.cke_btn_unlocked,.cke_hc a.cke_btn_reset{border-style:solid;float:left;width:auto;height:auto;padding:0 2px}.cke_rtl.cke_hc a.cke_btn_locked,.cke_rtl.cke_hc a.cke_btn_unlocked,.cke_rtl.cke_hc a.cke_btn_reset{float:right}.cke_hc a.cke_btn_locked .cke_icon{display:inline}a.cke_smile img{border:2px solid #eaead1}a.cke_smile:focus img,a.cke_smile:active img,a.cke_smile:hover img{border-color:#c7c78f}.cke_hc .cke_dialog_tabs a,.cke_hc .cke_dialog_footer a{opacity:1.0;filter:alpha(opacity=100);border:1px solid white}.cke_hc .ImagePreviewBox{width:260px}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_dialog_ui_input_select:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_dialog_title{margin-bottom:22px}.cke_dialog_page_contents{position:absolute}.cke_single_page .cke_dialog_title{margin-bottom:10px}.cke_dialog_close_button{top:27px;background-image:url(images/sprites_ie6.png)}.cke_dialog_footer .cke_resizer{margin-top:27px}.cke_dialog_tabs{display:block;top:33px;margin-top:33px}.cke_rtl .cke_dialog_ui_labeled_content{_width:95%}a.cke_dialog_ui_button{background:0;padding:0}a.cke_dialog_ui_button span{width:70px;padding:5px 15px;text-align:center;color:#3b3b1f;background:#53d9f0 none;display:inline-block;cursor:default}a.cke_dialog_ui_button_ok span{background-image:none;background-color:#b8e834;margin-right:0}a.cke_dialog_ui_button_cancel span{background-image:none;background-color:#f65d20;margin-right:0}a.cke_dialog_ui_button:hover span,a.cke_dialog_ui_button:focus span,a.cke_dialog_ui_button:active span{background-image:none;background:#f7a922}div.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{width:99%}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid red!important;filter:chroma(color=red)}.cke_dialog_ui_focused,.cke_btn_over{border:1px dotted #696969!important} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/kama/editor.css b/bower_components/ckeditor/skins/kama/editor.css new file mode 100644 index 0000000..b5e5c6e --- /dev/null +++ b/bower_components/ckeditor/skins/kama/editor.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d3d3d3;padding:5px}.cke_hc.cke_chrome{padding:2px}.cke_inner{display:block;-moz-border-radius:5px;-webkit-border-radius:5px;-webkit-touch-callout:none;border-radius:5px;background:#d3d3d3 url(images/sprites.png) repeat-x 0 -1950px;background:-webkit-gradient(linear,0 -15,0 40,from(#fff),to(#d3d3d3));background:-moz-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-webkit-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-o-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-ms-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:linear-gradient(top,#fff -15px,#d3d3d3 40px);padding:5px}.cke_float{background:#fff}.cke_float .cke_inner{padding-bottom:0}.cke_hc .cke_contents{border:1px solid black}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{white-space:normal}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:12px 12px 0 12px;border-color:transparent #efefef transparent transparent;border-style:dashed solid dashed dashed;margin:10px 0 0;font-size:0;float:right;vertical-align:bottom;cursor:se-resize;opacity:.8}.cke_resizer_ltr{margin-left:-12px}.cke_resizer_rtl{float:left;border-color:transparent transparent transparent #efefef;border-style:dashed dashed dashed solid;margin-right:-12px;cursor:sw-resize}.cke_hc .cke_resizer{width:10px;height:10px;border:1px solid #fff;margin-left:0}.cke_hc .cke_resizer_rtl{margin-right:0}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_menu_panel{padding:2px;margin:0}.cke_combopanel{border:1px solid #8f8f73;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-family:Arial,Verdana,sans-serif;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff}.cke_hc .cke_panel_listItem.cke_selected a,.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border-width:3px;padding:0}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:3px;margin-bottom:3px}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#316ac5 1px solid;background-color:#dff1ff}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#316ac5 1px solid;background-color:#dff1ff}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;float:left;margin:0 6px 5px 0;padding:2px;background:url(images/sprites.png) repeat-x 0 -500px;background:-webkit-gradient(linear,0 0,0 100,from(#fff),to(#d3d3d3));background:-moz-linear-gradient(top,#fff,#d3d3d3 100px);background:-webkit-linear-gradient(top,#fff,#d3d3d3 100px);background:-o-linear-gradient(top,#fff,#d3d3d3 100px);background:-ms-linear-gradient(top,#fff,#d3d3d3 100px);background:linear-gradient(top,#fff,#d3d3d3 100px)}.cke_hc .cke_toolgroup{padding-right:0;margin-right:4px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}.cke_rtl.cke_hc .cke_toolgroup{padding-left:0;margin-left:4px}a.cke_button{display:inline-block;height:18px;padding:2px 4px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_rtl.cke_hc .cke_button{margin:-2px -2px 0 4px}.cke_button_on{background-color:#a3d7ff}.cke_hc .cke_button_on{border-width:3px;padding:1px 3px}.cke_button_off{opacity:.7}.cke_button_disabled{opacity:.3}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{background-color:#86caff}.cke_hc a.cke_button:hover{background:black}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background-color:#dff1ff;opacity:1}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:16px;vertical-align:middle;float:left;cursor:default}.cke_hc .cke_button_label{padding:0;display:inline-block}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_button_arrow{display:inline-block;margin:7px 0 0 1px;width:0;height:0;border-width:3px;border-color:#2f2f2f transparent transparent transparent;border-style:solid dashed dashed dashed;cursor:default;vertical-align:middle}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:0 -2px 0 3px;width:auto;border:0}.cke_rtl.cke_hc .cke_button_arrow{margin:0 3px 0 -2px}.cke_toolbar_separator{float:left;border-left:solid 1px #d3d3d3;margin:3px 2px 0;height:16px}.cke_rtl .cke_toolbar_separator{border-right:solid 1px #d3d3d3;border-left:0;float:right}.cke_hc .cke_toolbar_separator{margin-left:0;width:3px}.cke_rtl.cke_hc .cke_toolbar_separator{margin:3px 0 0 2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;border:1px outset #d3d3d3;margin:11px 0 0;font-size:0;cursor:default;text-align:center}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_hc .cke_toolbox_collapser{border-width:1px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;border-width:3px;border-style:solid;border-color:transparent transparent #2f2f2f}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin:4px 2px 0 0;border-color:#2f2f2f transparent transparent}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d3d3d3;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#9d9d9d}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #ccc;background-color:#e9f5ff}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3}.cke_menubutton_on:hover,.cke_menubutton_on:focus,.cke_menubutton_on:active{border-color:#316ac5;background-color:#dff1ff}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:2px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/sprites.png);background-position:0 -1400px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-image:url(images/sprites.png);background-position:7px -1380px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px;filter:alpha(opacity = 70);opacity:.7}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:url(images/sprites.png) 0 -100px repeat-x;float:left;padding:2px 4px 2px 6px;height:22px;margin:0 5px 5px 0;background:-moz-linear-gradient(bottom,#fff,#d3d3d3 100px);background:-webkit-gradient(linear,left bottom,left -100,from(#fff),to(#d3d3d3))}.cke_combo_off .cke_combo_button:hover,.cke_combo_off .cke_combo_button:focus,.cke_combo_off .cke_combo_button:active{background:#dff1ff;outline:0}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc .cke_combo_button{border:1px solid black;padding:1px 3px 1px 3px}.cke_hc .cke_rtl .cke_combo_button{border:1px solid black}.cke_combo_text{line-height:24px;text-overflow:ellipsis;overflow:hidden;color:#666;float:left;cursor:default;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right}.cke_combo_inlinelabel{font-style:italic;opacity:.70}.cke_combo_off .cke_combo_button:hover .cke_combo_inlinelabel,.cke_combo_off .cke_combo_button:active .cke_combo_inlinelabel,.cke_combo_off .cke_combo_button:focus .cke_combo_inlinelabel{opacity:1}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 3px;width:5px}.cke_combo_arrow{margin:9px 0 0;float:left;opacity:.70;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #2f2f2f}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:4px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{margin-top:5px;float:left}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:1px 4px 0;color:#60676a;cursor:default;text-decoration:none;outline:0;border:0}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#efefef;opacity:.7;color:#000}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -24px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -48px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -72px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -120px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -144px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -168px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -216px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -240px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -264px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -312px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -336px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -360px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -408px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -432px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -456px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -504px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -528px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -552px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -600px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -624px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -648px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -696px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -720px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -744px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -792px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -816px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -840px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -888px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -912px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -936px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -984px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1008px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1032px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1080px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1104px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1128px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1176px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1200px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -1224px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1272px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1296px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -1320px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1368px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1392px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -1416px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1464px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1488px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1512px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1560px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1584px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -1608px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1656px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -1680px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -1704px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -1752px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -1776px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -1800px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -1848px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -1872px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -1896px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -1944px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -1968px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -1992px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -2040px!important}.cke_button__codesnippet_icon{background:url(icons.png) no-repeat 0 -2064px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2088px!important}.cke_button__language_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_button__mathjax_icon{background:url(icons.png) no-repeat 0 -2136px!important}.cke_rtl .cke_button__sourcedialog_icon,.cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -2160px!important}.cke_ltr .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -2184px!important}.cke_button__uicolor_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__simplebox_icon{background:url(icons.png) no-repeat 0 -2232px!important}.cke_hidpi .cke_button__about_icon{background:url(icons_hidpi.png) no-repeat 0 -0px!important}.cke_rtl.cke_hidpi .cke_button__anchor_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -48px!important}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -96px!important}.cke_hidpi .cke_button__bgcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -144px!important}.cke_hidpi .cke_button__bidiltr_icon{background:url(icons_hidpi.png) no-repeat 0 -192px!important}.cke_hidpi .cke_button__bidirtl_icon{background:url(icons_hidpi.png) no-repeat 0 -240px!important}.cke_hidpi .cke_button__blockquote_icon{background:url(icons_hidpi.png) no-repeat 0 -288px!important}.cke_hidpi .cke_button__bold_icon{background:url(icons_hidpi.png) no-repeat 0 -336px!important}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -384px!important}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -432px!important}.cke_hidpi .cke_button__button_icon{background:url(icons_hidpi.png) no-repeat 0 -480px!important}.cke_hidpi .cke_button__checkbox_icon{background:url(icons_hidpi.png) no-repeat 0 -528px!important}.cke_rtl.cke_hidpi .cke_button__copy_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -576px!important}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -624px!important}.cke_hidpi .cke_button__creatediv_icon{background:url(icons_hidpi.png) no-repeat 0 -672px!important}.cke_rtl.cke_hidpi .cke_button__cut_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -720px!important}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -768px!important}.cke_rtl.cke_hidpi .cke_button__docprops_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -816px!important}.cke_hidpi .cke_ltr .cke_button__docprops_icon,.cke_ltr.cke_hidpi .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -864px!important}.cke_rtl.cke_hidpi .cke_button__find_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -912px!important}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -960px!important}.cke_hidpi .cke_button__flash_icon{background:url(icons_hidpi.png) no-repeat 0 -1008px!important}.cke_hidpi .cke_button__form_icon{background:url(icons_hidpi.png) no-repeat 0 -1056px!important}.cke_hidpi .cke_button__hiddenfield_icon{background:url(icons_hidpi.png) no-repeat 0 -1104px!important}.cke_hidpi .cke_button__horizontalrule_icon{background:url(icons_hidpi.png) no-repeat 0 -1152px!important}.cke_hidpi .cke_button__iframe_icon{background:url(icons_hidpi.png) no-repeat 0 -1200px!important}.cke_hidpi .cke_button__image_icon{background:url(icons_hidpi.png) no-repeat 0 -1248px!important}.cke_hidpi .cke_button__imagebutton_icon{background:url(icons_hidpi.png) no-repeat 0 -1296px!important}.cke_rtl.cke_hidpi .cke_button__indent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1344px!important}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1392px!important}.cke_hidpi .cke_button__italic_icon{background:url(icons_hidpi.png) no-repeat 0 -1440px!important}.cke_hidpi .cke_button__justifyblock_icon{background:url(icons_hidpi.png) no-repeat 0 -1488px!important}.cke_hidpi .cke_button__justifycenter_icon{background:url(icons_hidpi.png) no-repeat 0 -1536px!important}.cke_hidpi .cke_button__justifyleft_icon{background:url(icons_hidpi.png) no-repeat 0 -1584px!important}.cke_hidpi .cke_button__justifyright_icon{background:url(icons_hidpi.png) no-repeat 0 -1632px!important}.cke_hidpi .cke_button__link_icon{background:url(icons_hidpi.png) no-repeat 0 -1680px!important}.cke_hidpi .cke_button__maximize_icon{background:url(icons_hidpi.png) no-repeat 0 -1728px!important}.cke_rtl.cke_hidpi .cke_button__newpage_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1776px!important}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1824px!important}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1872px!important}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1920px!important}.cke_rtl.cke_hidpi .cke_button__outdent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1968px!important}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -2016px!important}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important}.cke_rtl.cke_hidpi .cke_button__paste_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -2208px!important}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -2256px!important}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -2304px!important}.cke_rtl.cke_hidpi .cke_button__pastetext_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -2352px!important}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -2400px!important}.cke_hidpi .cke_button__placeholder_icon{background:url(icons_hidpi.png) no-repeat 0 -2448px!important}.cke_rtl.cke_hidpi .cke_button__preview_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -2496px!important}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -2544px!important}.cke_hidpi .cke_button__print_icon{background:url(icons_hidpi.png) no-repeat 0 -2592px!important}.cke_hidpi .cke_button__radio_icon{background:url(icons_hidpi.png) no-repeat 0 -2640px!important}.cke_rtl.cke_hidpi .cke_button__redo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2688px!important}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2736px!important}.cke_hidpi .cke_button__removeformat_icon{background:url(icons_hidpi.png) no-repeat 0 -2784px!important}.cke_hidpi .cke_button__replace_icon{background:url(icons_hidpi.png) no-repeat 0 -2832px!important}.cke_hidpi .cke_button__save_icon{background:url(icons_hidpi.png) no-repeat 0 -2880px!important}.cke_hidpi .cke_button__scayt_icon{background:url(icons_hidpi.png) no-repeat 0 -2928px!important}.cke_rtl.cke_hidpi .cke_button__select_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -2976px!important}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -3024px!important}.cke_hidpi .cke_button__selectall_icon{background:url(icons_hidpi.png) no-repeat 0 -3072px!important}.cke_rtl.cke_hidpi .cke_button__showblocks_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -3120px!important}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -3168px!important}.cke_hidpi .cke_button__smiley_icon{background:url(icons_hidpi.png) no-repeat 0 -3216px!important}.cke_rtl.cke_hidpi .cke_button__source_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -3264px!important}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -3312px!important}.cke_hidpi .cke_button__specialchar_icon{background:url(icons_hidpi.png) no-repeat 0 -3360px!important}.cke_hidpi .cke_button__spellchecker_icon{background:url(icons_hidpi.png) no-repeat 0 -3408px!important}.cke_hidpi .cke_button__strike_icon{background:url(icons_hidpi.png) no-repeat 0 -3456px!important}.cke_hidpi .cke_button__subscript_icon{background:url(icons_hidpi.png) no-repeat 0 -3504px!important}.cke_hidpi .cke_button__superscript_icon{background:url(icons_hidpi.png) no-repeat 0 -3552px!important}.cke_hidpi .cke_button__table_icon{background:url(icons_hidpi.png) no-repeat 0 -3600px!important}.cke_rtl.cke_hidpi .cke_button__templates_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -3648px!important}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -3696px!important}.cke_rtl.cke_hidpi .cke_button__textarea_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -3744px!important}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -3792px!important}.cke_hidpi .cke_button__textcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -3840px!important}.cke_hidpi .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -3888px!important}.cke_hidpi .cke_button__underline_icon{background:url(icons_hidpi.png) no-repeat 0 -3936px!important}.cke_rtl.cke_hidpi .cke_button__undo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -3984px!important}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -4032px!important}.cke_hidpi .cke_button__unlink_icon{background:url(icons_hidpi.png) no-repeat 0 -4080px!important}.cke_hidpi .cke_button__codesnippet_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textfield_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -2088px!important;background-size:16px!important}.cke_hidpi .cke_button__language_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important;background-size:16px!important}.cke_hidpi .cke_button__mathjax_icon{background:url(icons_hidpi.png) no-repeat 0 -2136px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -2184px!important;background-size:16px!important}.cke_hidpi .cke_button__uicolor_icon{background:url(icons_hidpi.png) no-repeat 0 -2208px!important;background-size:16px!important}.cke_hidpi .cke_button__simplebox_icon{background:url(icons_hidpi.png) no-repeat 0 -4464px!important} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/kama/editor_ie.css b/bower_components/ckeditor/skins/kama/editor_ie.css new file mode 100644 index 0000000..413ebfa --- /dev/null +++ b/bower_components/ckeditor/skins/kama/editor_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d3d3d3;padding:5px}.cke_hc.cke_chrome{padding:2px}.cke_inner{display:block;-moz-border-radius:5px;-webkit-border-radius:5px;-webkit-touch-callout:none;border-radius:5px;background:#d3d3d3 url(images/sprites.png) repeat-x 0 -1950px;background:-webkit-gradient(linear,0 -15,0 40,from(#fff),to(#d3d3d3));background:-moz-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-webkit-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-o-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-ms-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:linear-gradient(top,#fff -15px,#d3d3d3 40px);padding:5px}.cke_float{background:#fff}.cke_float .cke_inner{padding-bottom:0}.cke_hc .cke_contents{border:1px solid black}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{white-space:normal}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:12px 12px 0 12px;border-color:transparent #efefef transparent transparent;border-style:dashed solid dashed dashed;margin:10px 0 0;font-size:0;float:right;vertical-align:bottom;cursor:se-resize;opacity:.8}.cke_resizer_ltr{margin-left:-12px}.cke_resizer_rtl{float:left;border-color:transparent transparent transparent #efefef;border-style:dashed dashed dashed solid;margin-right:-12px;cursor:sw-resize}.cke_hc .cke_resizer{width:10px;height:10px;border:1px solid #fff;margin-left:0}.cke_hc .cke_resizer_rtl{margin-right:0}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_menu_panel{padding:2px;margin:0}.cke_combopanel{border:1px solid #8f8f73;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-family:Arial,Verdana,sans-serif;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff}.cke_hc .cke_panel_listItem.cke_selected a,.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border-width:3px;padding:0}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:3px;margin-bottom:3px}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#316ac5 1px solid;background-color:#dff1ff}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#316ac5 1px solid;background-color:#dff1ff}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;float:left;margin:0 6px 5px 0;padding:2px;background:url(images/sprites.png) repeat-x 0 -500px;background:-webkit-gradient(linear,0 0,0 100,from(#fff),to(#d3d3d3));background:-moz-linear-gradient(top,#fff,#d3d3d3 100px);background:-webkit-linear-gradient(top,#fff,#d3d3d3 100px);background:-o-linear-gradient(top,#fff,#d3d3d3 100px);background:-ms-linear-gradient(top,#fff,#d3d3d3 100px);background:linear-gradient(top,#fff,#d3d3d3 100px)}.cke_hc .cke_toolgroup{padding-right:0;margin-right:4px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}.cke_rtl.cke_hc .cke_toolgroup{padding-left:0;margin-left:4px}a.cke_button{display:inline-block;height:18px;padding:2px 4px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_rtl.cke_hc .cke_button{margin:-2px -2px 0 4px}.cke_button_on{background-color:#a3d7ff}.cke_hc .cke_button_on{border-width:3px;padding:1px 3px}.cke_button_off{opacity:.7}.cke_button_disabled{opacity:.3}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{background-color:#86caff}.cke_hc a.cke_button:hover{background:black}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background-color:#dff1ff;opacity:1}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:16px;vertical-align:middle;float:left;cursor:default}.cke_hc .cke_button_label{padding:0;display:inline-block}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_button_arrow{display:inline-block;margin:7px 0 0 1px;width:0;height:0;border-width:3px;border-color:#2f2f2f transparent transparent transparent;border-style:solid dashed dashed dashed;cursor:default;vertical-align:middle}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:0 -2px 0 3px;width:auto;border:0}.cke_rtl.cke_hc .cke_button_arrow{margin:0 3px 0 -2px}.cke_toolbar_separator{float:left;border-left:solid 1px #d3d3d3;margin:3px 2px 0;height:16px}.cke_rtl .cke_toolbar_separator{border-right:solid 1px #d3d3d3;border-left:0;float:right}.cke_hc .cke_toolbar_separator{margin-left:0;width:3px}.cke_rtl.cke_hc .cke_toolbar_separator{margin:3px 0 0 2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;border:1px outset #d3d3d3;margin:11px 0 0;font-size:0;cursor:default;text-align:center}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_hc .cke_toolbox_collapser{border-width:1px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;border-width:3px;border-style:solid;border-color:transparent transparent #2f2f2f}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin:4px 2px 0 0;border-color:#2f2f2f transparent transparent}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d3d3d3;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#9d9d9d}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #ccc;background-color:#e9f5ff}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3}.cke_menubutton_on:hover,.cke_menubutton_on:focus,.cke_menubutton_on:active{border-color:#316ac5;background-color:#dff1ff}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:2px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/sprites.png);background-position:0 -1400px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-image:url(images/sprites.png);background-position:7px -1380px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px;filter:alpha(opacity = 70);opacity:.7}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:url(images/sprites.png) 0 -100px repeat-x;float:left;padding:2px 4px 2px 6px;height:22px;margin:0 5px 5px 0;background:-moz-linear-gradient(bottom,#fff,#d3d3d3 100px);background:-webkit-gradient(linear,left bottom,left -100,from(#fff),to(#d3d3d3))}.cke_combo_off .cke_combo_button:hover,.cke_combo_off .cke_combo_button:focus,.cke_combo_off .cke_combo_button:active{background:#dff1ff;outline:0}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc .cke_combo_button{border:1px solid black;padding:1px 3px 1px 3px}.cke_hc .cke_rtl .cke_combo_button{border:1px solid black}.cke_combo_text{line-height:24px;text-overflow:ellipsis;overflow:hidden;color:#666;float:left;cursor:default;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right}.cke_combo_inlinelabel{font-style:italic;opacity:.70}.cke_combo_off .cke_combo_button:hover .cke_combo_inlinelabel,.cke_combo_off .cke_combo_button:active .cke_combo_inlinelabel,.cke_combo_off .cke_combo_button:focus .cke_combo_inlinelabel{opacity:1}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 3px;width:5px}.cke_combo_arrow{margin:9px 0 0;float:left;opacity:.70;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #2f2f2f}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:4px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{margin-top:5px;float:left}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:1px 4px 0;color:#60676a;cursor:default;text-decoration:none;outline:0;border:0}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#efefef;opacity:.7;color:#000}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -24px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -48px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -72px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -120px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -144px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -168px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -216px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -240px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -264px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -312px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -336px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -360px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -408px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -432px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -456px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -504px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -528px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -552px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -600px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -624px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -648px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -696px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -720px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -744px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -792px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -816px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -840px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -888px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -912px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -936px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -984px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1008px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1032px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1080px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1104px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1128px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1176px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1200px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -1224px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1272px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1296px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -1320px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1368px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1392px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -1416px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1464px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1488px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1512px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1560px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1584px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -1608px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1656px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -1680px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -1704px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -1752px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -1776px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -1800px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -1848px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -1872px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -1896px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -1944px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -1968px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -1992px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -2040px!important}.cke_button__codesnippet_icon{background:url(icons.png) no-repeat 0 -2064px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2088px!important}.cke_button__language_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_button__mathjax_icon{background:url(icons.png) no-repeat 0 -2136px!important}.cke_rtl .cke_button__sourcedialog_icon,.cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -2160px!important}.cke_ltr .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -2184px!important}.cke_button__uicolor_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__simplebox_icon{background:url(icons.png) no-repeat 0 -2232px!important}.cke_hidpi .cke_button__about_icon{background:url(icons_hidpi.png) no-repeat 0 -0px!important}.cke_rtl.cke_hidpi .cke_button__anchor_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -48px!important}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -96px!important}.cke_hidpi .cke_button__bgcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -144px!important}.cke_hidpi .cke_button__bidiltr_icon{background:url(icons_hidpi.png) no-repeat 0 -192px!important}.cke_hidpi .cke_button__bidirtl_icon{background:url(icons_hidpi.png) no-repeat 0 -240px!important}.cke_hidpi .cke_button__blockquote_icon{background:url(icons_hidpi.png) no-repeat 0 -288px!important}.cke_hidpi .cke_button__bold_icon{background:url(icons_hidpi.png) no-repeat 0 -336px!important}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -384px!important}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -432px!important}.cke_hidpi .cke_button__button_icon{background:url(icons_hidpi.png) no-repeat 0 -480px!important}.cke_hidpi .cke_button__checkbox_icon{background:url(icons_hidpi.png) no-repeat 0 -528px!important}.cke_rtl.cke_hidpi .cke_button__copy_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -576px!important}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -624px!important}.cke_hidpi .cke_button__creatediv_icon{background:url(icons_hidpi.png) no-repeat 0 -672px!important}.cke_rtl.cke_hidpi .cke_button__cut_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -720px!important}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -768px!important}.cke_rtl.cke_hidpi .cke_button__docprops_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -816px!important}.cke_hidpi .cke_ltr .cke_button__docprops_icon,.cke_ltr.cke_hidpi .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -864px!important}.cke_rtl.cke_hidpi .cke_button__find_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -912px!important}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -960px!important}.cke_hidpi .cke_button__flash_icon{background:url(icons_hidpi.png) no-repeat 0 -1008px!important}.cke_hidpi .cke_button__form_icon{background:url(icons_hidpi.png) no-repeat 0 -1056px!important}.cke_hidpi .cke_button__hiddenfield_icon{background:url(icons_hidpi.png) no-repeat 0 -1104px!important}.cke_hidpi .cke_button__horizontalrule_icon{background:url(icons_hidpi.png) no-repeat 0 -1152px!important}.cke_hidpi .cke_button__iframe_icon{background:url(icons_hidpi.png) no-repeat 0 -1200px!important}.cke_hidpi .cke_button__image_icon{background:url(icons_hidpi.png) no-repeat 0 -1248px!important}.cke_hidpi .cke_button__imagebutton_icon{background:url(icons_hidpi.png) no-repeat 0 -1296px!important}.cke_rtl.cke_hidpi .cke_button__indent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1344px!important}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1392px!important}.cke_hidpi .cke_button__italic_icon{background:url(icons_hidpi.png) no-repeat 0 -1440px!important}.cke_hidpi .cke_button__justifyblock_icon{background:url(icons_hidpi.png) no-repeat 0 -1488px!important}.cke_hidpi .cke_button__justifycenter_icon{background:url(icons_hidpi.png) no-repeat 0 -1536px!important}.cke_hidpi .cke_button__justifyleft_icon{background:url(icons_hidpi.png) no-repeat 0 -1584px!important}.cke_hidpi .cke_button__justifyright_icon{background:url(icons_hidpi.png) no-repeat 0 -1632px!important}.cke_hidpi .cke_button__link_icon{background:url(icons_hidpi.png) no-repeat 0 -1680px!important}.cke_hidpi .cke_button__maximize_icon{background:url(icons_hidpi.png) no-repeat 0 -1728px!important}.cke_rtl.cke_hidpi .cke_button__newpage_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1776px!important}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1824px!important}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1872px!important}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1920px!important}.cke_rtl.cke_hidpi .cke_button__outdent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1968px!important}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -2016px!important}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important}.cke_rtl.cke_hidpi .cke_button__paste_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -2208px!important}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -2256px!important}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -2304px!important}.cke_rtl.cke_hidpi .cke_button__pastetext_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -2352px!important}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -2400px!important}.cke_hidpi .cke_button__placeholder_icon{background:url(icons_hidpi.png) no-repeat 0 -2448px!important}.cke_rtl.cke_hidpi .cke_button__preview_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -2496px!important}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -2544px!important}.cke_hidpi .cke_button__print_icon{background:url(icons_hidpi.png) no-repeat 0 -2592px!important}.cke_hidpi .cke_button__radio_icon{background:url(icons_hidpi.png) no-repeat 0 -2640px!important}.cke_rtl.cke_hidpi .cke_button__redo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2688px!important}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2736px!important}.cke_hidpi .cke_button__removeformat_icon{background:url(icons_hidpi.png) no-repeat 0 -2784px!important}.cke_hidpi .cke_button__replace_icon{background:url(icons_hidpi.png) no-repeat 0 -2832px!important}.cke_hidpi .cke_button__save_icon{background:url(icons_hidpi.png) no-repeat 0 -2880px!important}.cke_hidpi .cke_button__scayt_icon{background:url(icons_hidpi.png) no-repeat 0 -2928px!important}.cke_rtl.cke_hidpi .cke_button__select_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -2976px!important}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -3024px!important}.cke_hidpi .cke_button__selectall_icon{background:url(icons_hidpi.png) no-repeat 0 -3072px!important}.cke_rtl.cke_hidpi .cke_button__showblocks_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -3120px!important}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -3168px!important}.cke_hidpi .cke_button__smiley_icon{background:url(icons_hidpi.png) no-repeat 0 -3216px!important}.cke_rtl.cke_hidpi .cke_button__source_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -3264px!important}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -3312px!important}.cke_hidpi .cke_button__specialchar_icon{background:url(icons_hidpi.png) no-repeat 0 -3360px!important}.cke_hidpi .cke_button__spellchecker_icon{background:url(icons_hidpi.png) no-repeat 0 -3408px!important}.cke_hidpi .cke_button__strike_icon{background:url(icons_hidpi.png) no-repeat 0 -3456px!important}.cke_hidpi .cke_button__subscript_icon{background:url(icons_hidpi.png) no-repeat 0 -3504px!important}.cke_hidpi .cke_button__superscript_icon{background:url(icons_hidpi.png) no-repeat 0 -3552px!important}.cke_hidpi .cke_button__table_icon{background:url(icons_hidpi.png) no-repeat 0 -3600px!important}.cke_rtl.cke_hidpi .cke_button__templates_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -3648px!important}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -3696px!important}.cke_rtl.cke_hidpi .cke_button__textarea_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -3744px!important}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -3792px!important}.cke_hidpi .cke_button__textcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -3840px!important}.cke_hidpi .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -3888px!important}.cke_hidpi .cke_button__underline_icon{background:url(icons_hidpi.png) no-repeat 0 -3936px!important}.cke_rtl.cke_hidpi .cke_button__undo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -3984px!important}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -4032px!important}.cke_hidpi .cke_button__unlink_icon{background:url(icons_hidpi.png) no-repeat 0 -4080px!important}.cke_hidpi .cke_button__codesnippet_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textfield_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -2088px!important;background-size:16px!important}.cke_hidpi .cke_button__language_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important;background-size:16px!important}.cke_hidpi .cke_button__mathjax_icon{background:url(icons_hidpi.png) no-repeat 0 -2136px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -2184px!important;background-size:16px!important}.cke_hidpi .cke_button__uicolor_icon{background:url(icons_hidpi.png) no-repeat 0 -2208px!important;background-size:16px!important}.cke_hidpi .cke_button__simplebox_icon{background:url(icons_hidpi.png) no-repeat 0 -4464px!important}.cke_button_off{filter:alpha(opacity = 70)}.cke_button_on{filter:alpha(opacity = 100)}.cke_button_disabled{filter:alpha(opacity = 30)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_hc .cke_button_arrow{margin-top:5px}.cke_combo_inlinelabel{filter:alpha(opacity = 70)}.cke_combo_button_off:hover .cke_combo_inlinelabel{filter:alpha(opacity = 100)}.cke_combo_button_disabled .cke_combo_inlinelabel,.cke_combo_button_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:2px outset #efefef}.cke_toolbox_collapser .cke_arrow{margin:0 1px 1px 1px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-left:2px}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{filter:alpha(opacity = 70)}.cke_resizer{filter:alpha(opacity = 80)}.cke_hc .cke_resizer{filter:none;font-size:28px}.cke_menuarrow{position:absolute;right:2px}.cke_rtl .cke_menuarrow{position:absolute;left:2px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first{padding-left:10px!important} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/kama/editor_ie7.css b/bower_components/ckeditor/skins/kama/editor_ie7.css new file mode 100644 index 0000000..f820b79 --- /dev/null +++ b/bower_components/ckeditor/skins/kama/editor_ie7.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d3d3d3;padding:5px}.cke_hc.cke_chrome{padding:2px}.cke_inner{display:block;-moz-border-radius:5px;-webkit-border-radius:5px;-webkit-touch-callout:none;border-radius:5px;background:#d3d3d3 url(images/sprites.png) repeat-x 0 -1950px;background:-webkit-gradient(linear,0 -15,0 40,from(#fff),to(#d3d3d3));background:-moz-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-webkit-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-o-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-ms-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:linear-gradient(top,#fff -15px,#d3d3d3 40px);padding:5px}.cke_float{background:#fff}.cke_float .cke_inner{padding-bottom:0}.cke_hc .cke_contents{border:1px solid black}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{white-space:normal}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:12px 12px 0 12px;border-color:transparent #efefef transparent transparent;border-style:dashed solid dashed dashed;margin:10px 0 0;font-size:0;float:right;vertical-align:bottom;cursor:se-resize;opacity:.8}.cke_resizer_ltr{margin-left:-12px}.cke_resizer_rtl{float:left;border-color:transparent transparent transparent #efefef;border-style:dashed dashed dashed solid;margin-right:-12px;cursor:sw-resize}.cke_hc .cke_resizer{width:10px;height:10px;border:1px solid #fff;margin-left:0}.cke_hc .cke_resizer_rtl{margin-right:0}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_menu_panel{padding:2px;margin:0}.cke_combopanel{border:1px solid #8f8f73;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-family:Arial,Verdana,sans-serif;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff}.cke_hc .cke_panel_listItem.cke_selected a,.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border-width:3px;padding:0}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:3px;margin-bottom:3px}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#316ac5 1px solid;background-color:#dff1ff}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#316ac5 1px solid;background-color:#dff1ff}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;float:left;margin:0 6px 5px 0;padding:2px;background:url(images/sprites.png) repeat-x 0 -500px;background:-webkit-gradient(linear,0 0,0 100,from(#fff),to(#d3d3d3));background:-moz-linear-gradient(top,#fff,#d3d3d3 100px);background:-webkit-linear-gradient(top,#fff,#d3d3d3 100px);background:-o-linear-gradient(top,#fff,#d3d3d3 100px);background:-ms-linear-gradient(top,#fff,#d3d3d3 100px);background:linear-gradient(top,#fff,#d3d3d3 100px)}.cke_hc .cke_toolgroup{padding-right:0;margin-right:4px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}.cke_rtl.cke_hc .cke_toolgroup{padding-left:0;margin-left:4px}a.cke_button{display:inline-block;height:18px;padding:2px 4px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_rtl.cke_hc .cke_button{margin:-2px -2px 0 4px}.cke_button_on{background-color:#a3d7ff}.cke_hc .cke_button_on{border-width:3px;padding:1px 3px}.cke_button_off{opacity:.7}.cke_button_disabled{opacity:.3}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{background-color:#86caff}.cke_hc a.cke_button:hover{background:black}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background-color:#dff1ff;opacity:1}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:16px;vertical-align:middle;float:left;cursor:default}.cke_hc .cke_button_label{padding:0;display:inline-block}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_button_arrow{display:inline-block;margin:7px 0 0 1px;width:0;height:0;border-width:3px;border-color:#2f2f2f transparent transparent transparent;border-style:solid dashed dashed dashed;cursor:default;vertical-align:middle}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:0 -2px 0 3px;width:auto;border:0}.cke_rtl.cke_hc .cke_button_arrow{margin:0 3px 0 -2px}.cke_toolbar_separator{float:left;border-left:solid 1px #d3d3d3;margin:3px 2px 0;height:16px}.cke_rtl .cke_toolbar_separator{border-right:solid 1px #d3d3d3;border-left:0;float:right}.cke_hc .cke_toolbar_separator{margin-left:0;width:3px}.cke_rtl.cke_hc .cke_toolbar_separator{margin:3px 0 0 2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;border:1px outset #d3d3d3;margin:11px 0 0;font-size:0;cursor:default;text-align:center}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_hc .cke_toolbox_collapser{border-width:1px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;border-width:3px;border-style:solid;border-color:transparent transparent #2f2f2f}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin:4px 2px 0 0;border-color:#2f2f2f transparent transparent}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d3d3d3;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#9d9d9d}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #ccc;background-color:#e9f5ff}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3}.cke_menubutton_on:hover,.cke_menubutton_on:focus,.cke_menubutton_on:active{border-color:#316ac5;background-color:#dff1ff}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:2px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/sprites.png);background-position:0 -1400px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-image:url(images/sprites.png);background-position:7px -1380px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px;filter:alpha(opacity = 70);opacity:.7}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:url(images/sprites.png) 0 -100px repeat-x;float:left;padding:2px 4px 2px 6px;height:22px;margin:0 5px 5px 0;background:-moz-linear-gradient(bottom,#fff,#d3d3d3 100px);background:-webkit-gradient(linear,left bottom,left -100,from(#fff),to(#d3d3d3))}.cke_combo_off .cke_combo_button:hover,.cke_combo_off .cke_combo_button:focus,.cke_combo_off .cke_combo_button:active{background:#dff1ff;outline:0}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc .cke_combo_button{border:1px solid black;padding:1px 3px 1px 3px}.cke_hc .cke_rtl .cke_combo_button{border:1px solid black}.cke_combo_text{line-height:24px;text-overflow:ellipsis;overflow:hidden;color:#666;float:left;cursor:default;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right}.cke_combo_inlinelabel{font-style:italic;opacity:.70}.cke_combo_off .cke_combo_button:hover .cke_combo_inlinelabel,.cke_combo_off .cke_combo_button:active .cke_combo_inlinelabel,.cke_combo_off .cke_combo_button:focus .cke_combo_inlinelabel{opacity:1}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 3px;width:5px}.cke_combo_arrow{margin:9px 0 0;float:left;opacity:.70;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #2f2f2f}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:4px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{margin-top:5px;float:left}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:1px 4px 0;color:#60676a;cursor:default;text-decoration:none;outline:0;border:0}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#efefef;opacity:.7;color:#000}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -24px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -48px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -72px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -120px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -144px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -168px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -216px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -240px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -264px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -312px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -336px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -360px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -408px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -432px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -456px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -504px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -528px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -552px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -600px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -624px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -648px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -696px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -720px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -744px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -792px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -816px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -840px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -888px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -912px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -936px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -984px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1008px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1032px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1080px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1104px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1128px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1176px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1200px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -1224px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1272px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1296px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -1320px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1368px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1392px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -1416px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1464px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1488px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1512px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1560px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1584px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -1608px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1656px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -1680px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -1704px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -1752px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -1776px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -1800px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -1848px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -1872px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -1896px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -1944px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -1968px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -1992px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -2040px!important}.cke_button__codesnippet_icon{background:url(icons.png) no-repeat 0 -2064px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2088px!important}.cke_button__language_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_button__mathjax_icon{background:url(icons.png) no-repeat 0 -2136px!important}.cke_rtl .cke_button__sourcedialog_icon,.cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -2160px!important}.cke_ltr .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -2184px!important}.cke_button__uicolor_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__simplebox_icon{background:url(icons.png) no-repeat 0 -2232px!important}.cke_hidpi .cke_button__about_icon{background:url(icons_hidpi.png) no-repeat 0 -0px!important}.cke_rtl.cke_hidpi .cke_button__anchor_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -48px!important}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -96px!important}.cke_hidpi .cke_button__bgcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -144px!important}.cke_hidpi .cke_button__bidiltr_icon{background:url(icons_hidpi.png) no-repeat 0 -192px!important}.cke_hidpi .cke_button__bidirtl_icon{background:url(icons_hidpi.png) no-repeat 0 -240px!important}.cke_hidpi .cke_button__blockquote_icon{background:url(icons_hidpi.png) no-repeat 0 -288px!important}.cke_hidpi .cke_button__bold_icon{background:url(icons_hidpi.png) no-repeat 0 -336px!important}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -384px!important}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -432px!important}.cke_hidpi .cke_button__button_icon{background:url(icons_hidpi.png) no-repeat 0 -480px!important}.cke_hidpi .cke_button__checkbox_icon{background:url(icons_hidpi.png) no-repeat 0 -528px!important}.cke_rtl.cke_hidpi .cke_button__copy_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -576px!important}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -624px!important}.cke_hidpi .cke_button__creatediv_icon{background:url(icons_hidpi.png) no-repeat 0 -672px!important}.cke_rtl.cke_hidpi .cke_button__cut_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -720px!important}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -768px!important}.cke_rtl.cke_hidpi .cke_button__docprops_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -816px!important}.cke_hidpi .cke_ltr .cke_button__docprops_icon,.cke_ltr.cke_hidpi .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -864px!important}.cke_rtl.cke_hidpi .cke_button__find_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -912px!important}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -960px!important}.cke_hidpi .cke_button__flash_icon{background:url(icons_hidpi.png) no-repeat 0 -1008px!important}.cke_hidpi .cke_button__form_icon{background:url(icons_hidpi.png) no-repeat 0 -1056px!important}.cke_hidpi .cke_button__hiddenfield_icon{background:url(icons_hidpi.png) no-repeat 0 -1104px!important}.cke_hidpi .cke_button__horizontalrule_icon{background:url(icons_hidpi.png) no-repeat 0 -1152px!important}.cke_hidpi .cke_button__iframe_icon{background:url(icons_hidpi.png) no-repeat 0 -1200px!important}.cke_hidpi .cke_button__image_icon{background:url(icons_hidpi.png) no-repeat 0 -1248px!important}.cke_hidpi .cke_button__imagebutton_icon{background:url(icons_hidpi.png) no-repeat 0 -1296px!important}.cke_rtl.cke_hidpi .cke_button__indent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1344px!important}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1392px!important}.cke_hidpi .cke_button__italic_icon{background:url(icons_hidpi.png) no-repeat 0 -1440px!important}.cke_hidpi .cke_button__justifyblock_icon{background:url(icons_hidpi.png) no-repeat 0 -1488px!important}.cke_hidpi .cke_button__justifycenter_icon{background:url(icons_hidpi.png) no-repeat 0 -1536px!important}.cke_hidpi .cke_button__justifyleft_icon{background:url(icons_hidpi.png) no-repeat 0 -1584px!important}.cke_hidpi .cke_button__justifyright_icon{background:url(icons_hidpi.png) no-repeat 0 -1632px!important}.cke_hidpi .cke_button__link_icon{background:url(icons_hidpi.png) no-repeat 0 -1680px!important}.cke_hidpi .cke_button__maximize_icon{background:url(icons_hidpi.png) no-repeat 0 -1728px!important}.cke_rtl.cke_hidpi .cke_button__newpage_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1776px!important}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1824px!important}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1872px!important}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1920px!important}.cke_rtl.cke_hidpi .cke_button__outdent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1968px!important}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -2016px!important}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important}.cke_rtl.cke_hidpi .cke_button__paste_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -2208px!important}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -2256px!important}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -2304px!important}.cke_rtl.cke_hidpi .cke_button__pastetext_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -2352px!important}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -2400px!important}.cke_hidpi .cke_button__placeholder_icon{background:url(icons_hidpi.png) no-repeat 0 -2448px!important}.cke_rtl.cke_hidpi .cke_button__preview_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -2496px!important}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -2544px!important}.cke_hidpi .cke_button__print_icon{background:url(icons_hidpi.png) no-repeat 0 -2592px!important}.cke_hidpi .cke_button__radio_icon{background:url(icons_hidpi.png) no-repeat 0 -2640px!important}.cke_rtl.cke_hidpi .cke_button__redo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2688px!important}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2736px!important}.cke_hidpi .cke_button__removeformat_icon{background:url(icons_hidpi.png) no-repeat 0 -2784px!important}.cke_hidpi .cke_button__replace_icon{background:url(icons_hidpi.png) no-repeat 0 -2832px!important}.cke_hidpi .cke_button__save_icon{background:url(icons_hidpi.png) no-repeat 0 -2880px!important}.cke_hidpi .cke_button__scayt_icon{background:url(icons_hidpi.png) no-repeat 0 -2928px!important}.cke_rtl.cke_hidpi .cke_button__select_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -2976px!important}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -3024px!important}.cke_hidpi .cke_button__selectall_icon{background:url(icons_hidpi.png) no-repeat 0 -3072px!important}.cke_rtl.cke_hidpi .cke_button__showblocks_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -3120px!important}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -3168px!important}.cke_hidpi .cke_button__smiley_icon{background:url(icons_hidpi.png) no-repeat 0 -3216px!important}.cke_rtl.cke_hidpi .cke_button__source_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -3264px!important}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -3312px!important}.cke_hidpi .cke_button__specialchar_icon{background:url(icons_hidpi.png) no-repeat 0 -3360px!important}.cke_hidpi .cke_button__spellchecker_icon{background:url(icons_hidpi.png) no-repeat 0 -3408px!important}.cke_hidpi .cke_button__strike_icon{background:url(icons_hidpi.png) no-repeat 0 -3456px!important}.cke_hidpi .cke_button__subscript_icon{background:url(icons_hidpi.png) no-repeat 0 -3504px!important}.cke_hidpi .cke_button__superscript_icon{background:url(icons_hidpi.png) no-repeat 0 -3552px!important}.cke_hidpi .cke_button__table_icon{background:url(icons_hidpi.png) no-repeat 0 -3600px!important}.cke_rtl.cke_hidpi .cke_button__templates_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -3648px!important}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -3696px!important}.cke_rtl.cke_hidpi .cke_button__textarea_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -3744px!important}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -3792px!important}.cke_hidpi .cke_button__textcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -3840px!important}.cke_hidpi .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -3888px!important}.cke_hidpi .cke_button__underline_icon{background:url(icons_hidpi.png) no-repeat 0 -3936px!important}.cke_rtl.cke_hidpi .cke_button__undo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -3984px!important}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -4032px!important}.cke_hidpi .cke_button__unlink_icon{background:url(icons_hidpi.png) no-repeat 0 -4080px!important}.cke_hidpi .cke_button__codesnippet_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textfield_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -2088px!important;background-size:16px!important}.cke_hidpi .cke_button__language_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important;background-size:16px!important}.cke_hidpi .cke_button__mathjax_icon{background:url(icons_hidpi.png) no-repeat 0 -2136px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -2184px!important;background-size:16px!important}.cke_hidpi .cke_button__uicolor_icon{background:url(icons_hidpi.png) no-repeat 0 -2208px!important;background-size:16px!important}.cke_hidpi .cke_button__simplebox_icon{background:url(icons_hidpi.png) no-repeat 0 -4464px!important}.cke_button_off{filter:alpha(opacity = 70)}.cke_button_on{filter:alpha(opacity = 100)}.cke_button_disabled{filter:alpha(opacity = 30)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_hc .cke_button_arrow{margin-top:5px}.cke_combo_inlinelabel{filter:alpha(opacity = 70)}.cke_combo_button_off:hover .cke_combo_inlinelabel{filter:alpha(opacity = 100)}.cke_combo_button_disabled .cke_combo_inlinelabel,.cke_combo_button_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:2px outset #efefef}.cke_toolbox_collapser .cke_arrow{margin:0 1px 1px 1px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-left:2px}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{filter:alpha(opacity = 70)}.cke_resizer{filter:alpha(opacity = 80)}.cke_hc .cke_resizer{filter:none;font-size:28px}.cke_menuarrow{position:absolute;right:2px}.cke_rtl .cke_menuarrow{position:absolute;left:2px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first{padding-left:10px!important}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:22px}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle;padding-bottom:8px}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:3px;height:5px;padding:0;position:absolute;right:8px;top:11px;background-position:0 -1411px}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -1390px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/kama/editor_ie8.css b/bower_components/ckeditor/skins/kama/editor_ie8.css new file mode 100644 index 0000000..539ad8c --- /dev/null +++ b/bower_components/ckeditor/skins/kama/editor_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d3d3d3;padding:5px}.cke_hc.cke_chrome{padding:2px}.cke_inner{display:block;-moz-border-radius:5px;-webkit-border-radius:5px;-webkit-touch-callout:none;border-radius:5px;background:#d3d3d3 url(images/sprites.png) repeat-x 0 -1950px;background:-webkit-gradient(linear,0 -15,0 40,from(#fff),to(#d3d3d3));background:-moz-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-webkit-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-o-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-ms-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:linear-gradient(top,#fff -15px,#d3d3d3 40px);padding:5px}.cke_float{background:#fff}.cke_float .cke_inner{padding-bottom:0}.cke_hc .cke_contents{border:1px solid black}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{white-space:normal}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:12px 12px 0 12px;border-color:transparent #efefef transparent transparent;border-style:dashed solid dashed dashed;margin:10px 0 0;font-size:0;float:right;vertical-align:bottom;cursor:se-resize;opacity:.8}.cke_resizer_ltr{margin-left:-12px}.cke_resizer_rtl{float:left;border-color:transparent transparent transparent #efefef;border-style:dashed dashed dashed solid;margin-right:-12px;cursor:sw-resize}.cke_hc .cke_resizer{width:10px;height:10px;border:1px solid #fff;margin-left:0}.cke_hc .cke_resizer_rtl{margin-right:0}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_menu_panel{padding:2px;margin:0}.cke_combopanel{border:1px solid #8f8f73;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-family:Arial,Verdana,sans-serif;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff}.cke_hc .cke_panel_listItem.cke_selected a,.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border-width:3px;padding:0}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:3px;margin-bottom:3px}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#316ac5 1px solid;background-color:#dff1ff}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#316ac5 1px solid;background-color:#dff1ff}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;float:left;margin:0 6px 5px 0;padding:2px;background:url(images/sprites.png) repeat-x 0 -500px;background:-webkit-gradient(linear,0 0,0 100,from(#fff),to(#d3d3d3));background:-moz-linear-gradient(top,#fff,#d3d3d3 100px);background:-webkit-linear-gradient(top,#fff,#d3d3d3 100px);background:-o-linear-gradient(top,#fff,#d3d3d3 100px);background:-ms-linear-gradient(top,#fff,#d3d3d3 100px);background:linear-gradient(top,#fff,#d3d3d3 100px)}.cke_hc .cke_toolgroup{padding-right:0;margin-right:4px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}.cke_rtl.cke_hc .cke_toolgroup{padding-left:0;margin-left:4px}a.cke_button{display:inline-block;height:18px;padding:2px 4px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_rtl.cke_hc .cke_button{margin:-2px -2px 0 4px}.cke_button_on{background-color:#a3d7ff}.cke_hc .cke_button_on{border-width:3px;padding:1px 3px}.cke_button_off{opacity:.7}.cke_button_disabled{opacity:.3}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{background-color:#86caff}.cke_hc a.cke_button:hover{background:black}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background-color:#dff1ff;opacity:1}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:16px;vertical-align:middle;float:left;cursor:default}.cke_hc .cke_button_label{padding:0;display:inline-block}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_button_arrow{display:inline-block;margin:7px 0 0 1px;width:0;height:0;border-width:3px;border-color:#2f2f2f transparent transparent transparent;border-style:solid dashed dashed dashed;cursor:default;vertical-align:middle}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:0 -2px 0 3px;width:auto;border:0}.cke_rtl.cke_hc .cke_button_arrow{margin:0 3px 0 -2px}.cke_toolbar_separator{float:left;border-left:solid 1px #d3d3d3;margin:3px 2px 0;height:16px}.cke_rtl .cke_toolbar_separator{border-right:solid 1px #d3d3d3;border-left:0;float:right}.cke_hc .cke_toolbar_separator{margin-left:0;width:3px}.cke_rtl.cke_hc .cke_toolbar_separator{margin:3px 0 0 2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;border:1px outset #d3d3d3;margin:11px 0 0;font-size:0;cursor:default;text-align:center}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_hc .cke_toolbox_collapser{border-width:1px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;border-width:3px;border-style:solid;border-color:transparent transparent #2f2f2f}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin:4px 2px 0 0;border-color:#2f2f2f transparent transparent}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d3d3d3;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#9d9d9d}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #ccc;background-color:#e9f5ff}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3}.cke_menubutton_on:hover,.cke_menubutton_on:focus,.cke_menubutton_on:active{border-color:#316ac5;background-color:#dff1ff}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:2px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/sprites.png);background-position:0 -1400px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-image:url(images/sprites.png);background-position:7px -1380px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px;filter:alpha(opacity = 70);opacity:.7}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:url(images/sprites.png) 0 -100px repeat-x;float:left;padding:2px 4px 2px 6px;height:22px;margin:0 5px 5px 0;background:-moz-linear-gradient(bottom,#fff,#d3d3d3 100px);background:-webkit-gradient(linear,left bottom,left -100,from(#fff),to(#d3d3d3))}.cke_combo_off .cke_combo_button:hover,.cke_combo_off .cke_combo_button:focus,.cke_combo_off .cke_combo_button:active{background:#dff1ff;outline:0}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc .cke_combo_button{border:1px solid black;padding:1px 3px 1px 3px}.cke_hc .cke_rtl .cke_combo_button{border:1px solid black}.cke_combo_text{line-height:24px;text-overflow:ellipsis;overflow:hidden;color:#666;float:left;cursor:default;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right}.cke_combo_inlinelabel{font-style:italic;opacity:.70}.cke_combo_off .cke_combo_button:hover .cke_combo_inlinelabel,.cke_combo_off .cke_combo_button:active .cke_combo_inlinelabel,.cke_combo_off .cke_combo_button:focus .cke_combo_inlinelabel{opacity:1}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 3px;width:5px}.cke_combo_arrow{margin:9px 0 0;float:left;opacity:.70;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #2f2f2f}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:4px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{margin-top:5px;float:left}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:1px 4px 0;color:#60676a;cursor:default;text-decoration:none;outline:0;border:0}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#efefef;opacity:.7;color:#000}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -24px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -48px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -72px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -120px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -144px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -168px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -216px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -240px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -264px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -312px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -336px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -360px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -408px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -432px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -456px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -504px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -528px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -552px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -600px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -624px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -648px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -696px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -720px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -744px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -792px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -816px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -840px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -888px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -912px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -936px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -984px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1008px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1032px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1080px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1104px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1128px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1176px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1200px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -1224px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1272px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1296px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -1320px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1368px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1392px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -1416px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1464px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1488px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1512px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1560px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1584px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -1608px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1656px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -1680px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -1704px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -1752px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -1776px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -1800px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -1848px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -1872px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -1896px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -1944px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -1968px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -1992px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -2040px!important}.cke_button__codesnippet_icon{background:url(icons.png) no-repeat 0 -2064px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2088px!important}.cke_button__language_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_button__mathjax_icon{background:url(icons.png) no-repeat 0 -2136px!important}.cke_rtl .cke_button__sourcedialog_icon,.cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -2160px!important}.cke_ltr .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -2184px!important}.cke_button__uicolor_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__simplebox_icon{background:url(icons.png) no-repeat 0 -2232px!important}.cke_hidpi .cke_button__about_icon{background:url(icons_hidpi.png) no-repeat 0 -0px!important}.cke_rtl.cke_hidpi .cke_button__anchor_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -48px!important}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -96px!important}.cke_hidpi .cke_button__bgcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -144px!important}.cke_hidpi .cke_button__bidiltr_icon{background:url(icons_hidpi.png) no-repeat 0 -192px!important}.cke_hidpi .cke_button__bidirtl_icon{background:url(icons_hidpi.png) no-repeat 0 -240px!important}.cke_hidpi .cke_button__blockquote_icon{background:url(icons_hidpi.png) no-repeat 0 -288px!important}.cke_hidpi .cke_button__bold_icon{background:url(icons_hidpi.png) no-repeat 0 -336px!important}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -384px!important}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -432px!important}.cke_hidpi .cke_button__button_icon{background:url(icons_hidpi.png) no-repeat 0 -480px!important}.cke_hidpi .cke_button__checkbox_icon{background:url(icons_hidpi.png) no-repeat 0 -528px!important}.cke_rtl.cke_hidpi .cke_button__copy_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -576px!important}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -624px!important}.cke_hidpi .cke_button__creatediv_icon{background:url(icons_hidpi.png) no-repeat 0 -672px!important}.cke_rtl.cke_hidpi .cke_button__cut_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -720px!important}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -768px!important}.cke_rtl.cke_hidpi .cke_button__docprops_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -816px!important}.cke_hidpi .cke_ltr .cke_button__docprops_icon,.cke_ltr.cke_hidpi .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -864px!important}.cke_rtl.cke_hidpi .cke_button__find_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -912px!important}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -960px!important}.cke_hidpi .cke_button__flash_icon{background:url(icons_hidpi.png) no-repeat 0 -1008px!important}.cke_hidpi .cke_button__form_icon{background:url(icons_hidpi.png) no-repeat 0 -1056px!important}.cke_hidpi .cke_button__hiddenfield_icon{background:url(icons_hidpi.png) no-repeat 0 -1104px!important}.cke_hidpi .cke_button__horizontalrule_icon{background:url(icons_hidpi.png) no-repeat 0 -1152px!important}.cke_hidpi .cke_button__iframe_icon{background:url(icons_hidpi.png) no-repeat 0 -1200px!important}.cke_hidpi .cke_button__image_icon{background:url(icons_hidpi.png) no-repeat 0 -1248px!important}.cke_hidpi .cke_button__imagebutton_icon{background:url(icons_hidpi.png) no-repeat 0 -1296px!important}.cke_rtl.cke_hidpi .cke_button__indent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1344px!important}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1392px!important}.cke_hidpi .cke_button__italic_icon{background:url(icons_hidpi.png) no-repeat 0 -1440px!important}.cke_hidpi .cke_button__justifyblock_icon{background:url(icons_hidpi.png) no-repeat 0 -1488px!important}.cke_hidpi .cke_button__justifycenter_icon{background:url(icons_hidpi.png) no-repeat 0 -1536px!important}.cke_hidpi .cke_button__justifyleft_icon{background:url(icons_hidpi.png) no-repeat 0 -1584px!important}.cke_hidpi .cke_button__justifyright_icon{background:url(icons_hidpi.png) no-repeat 0 -1632px!important}.cke_hidpi .cke_button__link_icon{background:url(icons_hidpi.png) no-repeat 0 -1680px!important}.cke_hidpi .cke_button__maximize_icon{background:url(icons_hidpi.png) no-repeat 0 -1728px!important}.cke_rtl.cke_hidpi .cke_button__newpage_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1776px!important}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1824px!important}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1872px!important}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1920px!important}.cke_rtl.cke_hidpi .cke_button__outdent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1968px!important}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -2016px!important}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important}.cke_rtl.cke_hidpi .cke_button__paste_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -2208px!important}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -2256px!important}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -2304px!important}.cke_rtl.cke_hidpi .cke_button__pastetext_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -2352px!important}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -2400px!important}.cke_hidpi .cke_button__placeholder_icon{background:url(icons_hidpi.png) no-repeat 0 -2448px!important}.cke_rtl.cke_hidpi .cke_button__preview_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -2496px!important}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -2544px!important}.cke_hidpi .cke_button__print_icon{background:url(icons_hidpi.png) no-repeat 0 -2592px!important}.cke_hidpi .cke_button__radio_icon{background:url(icons_hidpi.png) no-repeat 0 -2640px!important}.cke_rtl.cke_hidpi .cke_button__redo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2688px!important}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2736px!important}.cke_hidpi .cke_button__removeformat_icon{background:url(icons_hidpi.png) no-repeat 0 -2784px!important}.cke_hidpi .cke_button__replace_icon{background:url(icons_hidpi.png) no-repeat 0 -2832px!important}.cke_hidpi .cke_button__save_icon{background:url(icons_hidpi.png) no-repeat 0 -2880px!important}.cke_hidpi .cke_button__scayt_icon{background:url(icons_hidpi.png) no-repeat 0 -2928px!important}.cke_rtl.cke_hidpi .cke_button__select_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -2976px!important}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -3024px!important}.cke_hidpi .cke_button__selectall_icon{background:url(icons_hidpi.png) no-repeat 0 -3072px!important}.cke_rtl.cke_hidpi .cke_button__showblocks_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -3120px!important}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -3168px!important}.cke_hidpi .cke_button__smiley_icon{background:url(icons_hidpi.png) no-repeat 0 -3216px!important}.cke_rtl.cke_hidpi .cke_button__source_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -3264px!important}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -3312px!important}.cke_hidpi .cke_button__specialchar_icon{background:url(icons_hidpi.png) no-repeat 0 -3360px!important}.cke_hidpi .cke_button__spellchecker_icon{background:url(icons_hidpi.png) no-repeat 0 -3408px!important}.cke_hidpi .cke_button__strike_icon{background:url(icons_hidpi.png) no-repeat 0 -3456px!important}.cke_hidpi .cke_button__subscript_icon{background:url(icons_hidpi.png) no-repeat 0 -3504px!important}.cke_hidpi .cke_button__superscript_icon{background:url(icons_hidpi.png) no-repeat 0 -3552px!important}.cke_hidpi .cke_button__table_icon{background:url(icons_hidpi.png) no-repeat 0 -3600px!important}.cke_rtl.cke_hidpi .cke_button__templates_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -3648px!important}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -3696px!important}.cke_rtl.cke_hidpi .cke_button__textarea_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -3744px!important}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -3792px!important}.cke_hidpi .cke_button__textcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -3840px!important}.cke_hidpi .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -3888px!important}.cke_hidpi .cke_button__underline_icon{background:url(icons_hidpi.png) no-repeat 0 -3936px!important}.cke_rtl.cke_hidpi .cke_button__undo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -3984px!important}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -4032px!important}.cke_hidpi .cke_button__unlink_icon{background:url(icons_hidpi.png) no-repeat 0 -4080px!important}.cke_hidpi .cke_button__codesnippet_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textfield_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -2088px!important;background-size:16px!important}.cke_hidpi .cke_button__language_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important;background-size:16px!important}.cke_hidpi .cke_button__mathjax_icon{background:url(icons_hidpi.png) no-repeat 0 -2136px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -2184px!important;background-size:16px!important}.cke_hidpi .cke_button__uicolor_icon{background:url(icons_hidpi.png) no-repeat 0 -2208px!important;background-size:16px!important}.cke_hidpi .cke_button__simplebox_icon{background:url(icons_hidpi.png) no-repeat 0 -4464px!important}.cke_button_off{filter:alpha(opacity = 70)}.cke_button_on{filter:alpha(opacity = 100)}.cke_button_disabled{filter:alpha(opacity = 30)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_hc .cke_button_arrow{margin-top:5px}.cke_combo_inlinelabel{filter:alpha(opacity = 70)}.cke_combo_button_off:hover .cke_combo_inlinelabel{filter:alpha(opacity = 100)}.cke_combo_button_disabled .cke_combo_inlinelabel,.cke_combo_button_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:2px outset #efefef}.cke_toolbox_collapser .cke_arrow{margin:0 1px 1px 1px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-left:2px}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{filter:alpha(opacity = 70)}.cke_resizer{filter:alpha(opacity = 80)}.cke_hc .cke_resizer{filter:none;font-size:28px}.cke_menuarrow{position:absolute;right:2px}.cke_rtl .cke_menuarrow{position:absolute;left:2px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first{padding-left:10px!important}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/kama/editor_iequirks.css b/bower_components/ckeditor/skins/kama/editor_iequirks.css new file mode 100644 index 0000000..4500b13 --- /dev/null +++ b/bower_components/ckeditor/skins/kama/editor_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d3d3d3;padding:5px}.cke_hc.cke_chrome{padding:2px}.cke_inner{display:block;-moz-border-radius:5px;-webkit-border-radius:5px;-webkit-touch-callout:none;border-radius:5px;background:#d3d3d3 url(images/sprites.png) repeat-x 0 -1950px;background:-webkit-gradient(linear,0 -15,0 40,from(#fff),to(#d3d3d3));background:-moz-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-webkit-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-o-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:-ms-linear-gradient(top,#fff -15px,#d3d3d3 40px);background:linear-gradient(top,#fff -15px,#d3d3d3 40px);padding:5px}.cke_float{background:#fff}.cke_float .cke_inner{padding-bottom:0}.cke_hc .cke_contents{border:1px solid black}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{white-space:normal}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:12px 12px 0 12px;border-color:transparent #efefef transparent transparent;border-style:dashed solid dashed dashed;margin:10px 0 0;font-size:0;float:right;vertical-align:bottom;cursor:se-resize;opacity:.8}.cke_resizer_ltr{margin-left:-12px}.cke_resizer_rtl{float:left;border-color:transparent transparent transparent #efefef;border-style:dashed dashed dashed solid;margin-right:-12px;cursor:sw-resize}.cke_hc .cke_resizer{width:10px;height:10px;border:1px solid #fff;margin-left:0}.cke_hc .cke_resizer_rtl{margin-right:0}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_menu_panel{padding:2px;margin:0}.cke_combopanel{border:1px solid #8f8f73;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-family:Arial,Verdana,sans-serif;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff}.cke_hc .cke_panel_listItem.cke_selected a,.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border-width:3px;padding:0}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:3px;margin-bottom:3px}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#316ac5 1px solid;background-color:#dff1ff}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#316ac5 1px solid;background-color:#dff1ff}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;float:left;margin:0 6px 5px 0;padding:2px;background:url(images/sprites.png) repeat-x 0 -500px;background:-webkit-gradient(linear,0 0,0 100,from(#fff),to(#d3d3d3));background:-moz-linear-gradient(top,#fff,#d3d3d3 100px);background:-webkit-linear-gradient(top,#fff,#d3d3d3 100px);background:-o-linear-gradient(top,#fff,#d3d3d3 100px);background:-ms-linear-gradient(top,#fff,#d3d3d3 100px);background:linear-gradient(top,#fff,#d3d3d3 100px)}.cke_hc .cke_toolgroup{padding-right:0;margin-right:4px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}.cke_rtl.cke_hc .cke_toolgroup{padding-left:0;margin-left:4px}a.cke_button{display:inline-block;height:18px;padding:2px 4px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_rtl.cke_hc .cke_button{margin:-2px -2px 0 4px}.cke_button_on{background-color:#a3d7ff}.cke_hc .cke_button_on{border-width:3px;padding:1px 3px}.cke_button_off{opacity:.7}.cke_button_disabled{opacity:.3}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{background-color:#86caff}.cke_hc a.cke_button:hover{background:black}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background-color:#dff1ff;opacity:1}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:16px;vertical-align:middle;float:left;cursor:default}.cke_hc .cke_button_label{padding:0;display:inline-block}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_button_arrow{display:inline-block;margin:7px 0 0 1px;width:0;height:0;border-width:3px;border-color:#2f2f2f transparent transparent transparent;border-style:solid dashed dashed dashed;cursor:default;vertical-align:middle}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:0 -2px 0 3px;width:auto;border:0}.cke_rtl.cke_hc .cke_button_arrow{margin:0 3px 0 -2px}.cke_toolbar_separator{float:left;border-left:solid 1px #d3d3d3;margin:3px 2px 0;height:16px}.cke_rtl .cke_toolbar_separator{border-right:solid 1px #d3d3d3;border-left:0;float:right}.cke_hc .cke_toolbar_separator{margin-left:0;width:3px}.cke_rtl.cke_hc .cke_toolbar_separator{margin:3px 0 0 2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;border:1px outset #d3d3d3;margin:11px 0 0;font-size:0;cursor:default;text-align:center}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_hc .cke_toolbox_collapser{border-width:1px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;border-width:3px;border-style:solid;border-color:transparent transparent #2f2f2f}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin:4px 2px 0 0;border-color:#2f2f2f transparent transparent}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d3d3d3;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#9d9d9d}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #ccc;background-color:#e9f5ff}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3}.cke_menubutton_on:hover,.cke_menubutton_on:focus,.cke_menubutton_on:active{border-color:#316ac5;background-color:#dff1ff}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:2px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/sprites.png);background-position:0 -1400px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-image:url(images/sprites.png);background-position:7px -1380px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px;filter:alpha(opacity = 70);opacity:.7}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:url(images/sprites.png) 0 -100px repeat-x;float:left;padding:2px 4px 2px 6px;height:22px;margin:0 5px 5px 0;background:-moz-linear-gradient(bottom,#fff,#d3d3d3 100px);background:-webkit-gradient(linear,left bottom,left -100,from(#fff),to(#d3d3d3))}.cke_combo_off .cke_combo_button:hover,.cke_combo_off .cke_combo_button:focus,.cke_combo_off .cke_combo_button:active{background:#dff1ff;outline:0}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc .cke_combo_button{border:1px solid black;padding:1px 3px 1px 3px}.cke_hc .cke_rtl .cke_combo_button{border:1px solid black}.cke_combo_text{line-height:24px;text-overflow:ellipsis;overflow:hidden;color:#666;float:left;cursor:default;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right}.cke_combo_inlinelabel{font-style:italic;opacity:.70}.cke_combo_off .cke_combo_button:hover .cke_combo_inlinelabel,.cke_combo_off .cke_combo_button:active .cke_combo_inlinelabel,.cke_combo_off .cke_combo_button:focus .cke_combo_inlinelabel{opacity:1}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 3px;width:5px}.cke_combo_arrow{margin:9px 0 0;float:left;opacity:.70;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #2f2f2f}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:4px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{margin-top:5px;float:left}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:1px 4px 0;color:#60676a;cursor:default;text-decoration:none;outline:0;border:0}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#efefef;opacity:.7;color:#000}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -24px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -48px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -72px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -120px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -144px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -168px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -216px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -240px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -264px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -312px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -336px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -360px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -408px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -432px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -456px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -504px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -528px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -552px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -600px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -624px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -648px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -696px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -720px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -744px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -792px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -816px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -840px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -888px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -912px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -936px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -984px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1008px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1032px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1080px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1104px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1128px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1176px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1200px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -1224px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1272px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1296px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -1320px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1368px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1392px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -1416px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1464px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1488px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1512px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1560px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1584px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -1608px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1656px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -1680px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -1704px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -1752px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -1776px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -1800px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -1848px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -1872px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -1896px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -1944px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -1968px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -1992px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -2040px!important}.cke_button__codesnippet_icon{background:url(icons.png) no-repeat 0 -2064px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2088px!important}.cke_button__language_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_button__mathjax_icon{background:url(icons.png) no-repeat 0 -2136px!important}.cke_rtl .cke_button__sourcedialog_icon,.cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -2160px!important}.cke_ltr .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -2184px!important}.cke_button__uicolor_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__simplebox_icon{background:url(icons.png) no-repeat 0 -2232px!important}.cke_hidpi .cke_button__about_icon{background:url(icons_hidpi.png) no-repeat 0 -0px!important}.cke_rtl.cke_hidpi .cke_button__anchor_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -48px!important}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -96px!important}.cke_hidpi .cke_button__bgcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -144px!important}.cke_hidpi .cke_button__bidiltr_icon{background:url(icons_hidpi.png) no-repeat 0 -192px!important}.cke_hidpi .cke_button__bidirtl_icon{background:url(icons_hidpi.png) no-repeat 0 -240px!important}.cke_hidpi .cke_button__blockquote_icon{background:url(icons_hidpi.png) no-repeat 0 -288px!important}.cke_hidpi .cke_button__bold_icon{background:url(icons_hidpi.png) no-repeat 0 -336px!important}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -384px!important}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -432px!important}.cke_hidpi .cke_button__button_icon{background:url(icons_hidpi.png) no-repeat 0 -480px!important}.cke_hidpi .cke_button__checkbox_icon{background:url(icons_hidpi.png) no-repeat 0 -528px!important}.cke_rtl.cke_hidpi .cke_button__copy_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -576px!important}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -624px!important}.cke_hidpi .cke_button__creatediv_icon{background:url(icons_hidpi.png) no-repeat 0 -672px!important}.cke_rtl.cke_hidpi .cke_button__cut_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -720px!important}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -768px!important}.cke_rtl.cke_hidpi .cke_button__docprops_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -816px!important}.cke_hidpi .cke_ltr .cke_button__docprops_icon,.cke_ltr.cke_hidpi .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -864px!important}.cke_rtl.cke_hidpi .cke_button__find_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -912px!important}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -960px!important}.cke_hidpi .cke_button__flash_icon{background:url(icons_hidpi.png) no-repeat 0 -1008px!important}.cke_hidpi .cke_button__form_icon{background:url(icons_hidpi.png) no-repeat 0 -1056px!important}.cke_hidpi .cke_button__hiddenfield_icon{background:url(icons_hidpi.png) no-repeat 0 -1104px!important}.cke_hidpi .cke_button__horizontalrule_icon{background:url(icons_hidpi.png) no-repeat 0 -1152px!important}.cke_hidpi .cke_button__iframe_icon{background:url(icons_hidpi.png) no-repeat 0 -1200px!important}.cke_hidpi .cke_button__image_icon{background:url(icons_hidpi.png) no-repeat 0 -1248px!important}.cke_hidpi .cke_button__imagebutton_icon{background:url(icons_hidpi.png) no-repeat 0 -1296px!important}.cke_rtl.cke_hidpi .cke_button__indent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1344px!important}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1392px!important}.cke_hidpi .cke_button__italic_icon{background:url(icons_hidpi.png) no-repeat 0 -1440px!important}.cke_hidpi .cke_button__justifyblock_icon{background:url(icons_hidpi.png) no-repeat 0 -1488px!important}.cke_hidpi .cke_button__justifycenter_icon{background:url(icons_hidpi.png) no-repeat 0 -1536px!important}.cke_hidpi .cke_button__justifyleft_icon{background:url(icons_hidpi.png) no-repeat 0 -1584px!important}.cke_hidpi .cke_button__justifyright_icon{background:url(icons_hidpi.png) no-repeat 0 -1632px!important}.cke_hidpi .cke_button__link_icon{background:url(icons_hidpi.png) no-repeat 0 -1680px!important}.cke_hidpi .cke_button__maximize_icon{background:url(icons_hidpi.png) no-repeat 0 -1728px!important}.cke_rtl.cke_hidpi .cke_button__newpage_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1776px!important}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1824px!important}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1872px!important}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1920px!important}.cke_rtl.cke_hidpi .cke_button__outdent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1968px!important}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -2016px!important}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important}.cke_rtl.cke_hidpi .cke_button__paste_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -2208px!important}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -2256px!important}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -2304px!important}.cke_rtl.cke_hidpi .cke_button__pastetext_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -2352px!important}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -2400px!important}.cke_hidpi .cke_button__placeholder_icon{background:url(icons_hidpi.png) no-repeat 0 -2448px!important}.cke_rtl.cke_hidpi .cke_button__preview_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -2496px!important}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -2544px!important}.cke_hidpi .cke_button__print_icon{background:url(icons_hidpi.png) no-repeat 0 -2592px!important}.cke_hidpi .cke_button__radio_icon{background:url(icons_hidpi.png) no-repeat 0 -2640px!important}.cke_rtl.cke_hidpi .cke_button__redo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2688px!important}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2736px!important}.cke_hidpi .cke_button__removeformat_icon{background:url(icons_hidpi.png) no-repeat 0 -2784px!important}.cke_hidpi .cke_button__replace_icon{background:url(icons_hidpi.png) no-repeat 0 -2832px!important}.cke_hidpi .cke_button__save_icon{background:url(icons_hidpi.png) no-repeat 0 -2880px!important}.cke_hidpi .cke_button__scayt_icon{background:url(icons_hidpi.png) no-repeat 0 -2928px!important}.cke_rtl.cke_hidpi .cke_button__select_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -2976px!important}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -3024px!important}.cke_hidpi .cke_button__selectall_icon{background:url(icons_hidpi.png) no-repeat 0 -3072px!important}.cke_rtl.cke_hidpi .cke_button__showblocks_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -3120px!important}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -3168px!important}.cke_hidpi .cke_button__smiley_icon{background:url(icons_hidpi.png) no-repeat 0 -3216px!important}.cke_rtl.cke_hidpi .cke_button__source_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -3264px!important}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -3312px!important}.cke_hidpi .cke_button__specialchar_icon{background:url(icons_hidpi.png) no-repeat 0 -3360px!important}.cke_hidpi .cke_button__spellchecker_icon{background:url(icons_hidpi.png) no-repeat 0 -3408px!important}.cke_hidpi .cke_button__strike_icon{background:url(icons_hidpi.png) no-repeat 0 -3456px!important}.cke_hidpi .cke_button__subscript_icon{background:url(icons_hidpi.png) no-repeat 0 -3504px!important}.cke_hidpi .cke_button__superscript_icon{background:url(icons_hidpi.png) no-repeat 0 -3552px!important}.cke_hidpi .cke_button__table_icon{background:url(icons_hidpi.png) no-repeat 0 -3600px!important}.cke_rtl.cke_hidpi .cke_button__templates_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -3648px!important}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -3696px!important}.cke_rtl.cke_hidpi .cke_button__textarea_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -3744px!important}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -3792px!important}.cke_hidpi .cke_button__textcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -3840px!important}.cke_hidpi .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -3888px!important}.cke_hidpi .cke_button__underline_icon{background:url(icons_hidpi.png) no-repeat 0 -3936px!important}.cke_rtl.cke_hidpi .cke_button__undo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -3984px!important}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -4032px!important}.cke_hidpi .cke_button__unlink_icon{background:url(icons_hidpi.png) no-repeat 0 -4080px!important}.cke_hidpi .cke_button__codesnippet_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textfield_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -2088px!important;background-size:16px!important}.cke_hidpi .cke_button__language_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important;background-size:16px!important}.cke_hidpi .cke_button__mathjax_icon{background:url(icons_hidpi.png) no-repeat 0 -2136px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -2184px!important;background-size:16px!important}.cke_hidpi .cke_button__uicolor_icon{background:url(icons_hidpi.png) no-repeat 0 -2208px!important;background-size:16px!important}.cke_hidpi .cke_button__simplebox_icon{background:url(icons_hidpi.png) no-repeat 0 -4464px!important}.cke_button_off{filter:alpha(opacity = 70)}.cke_button_on{filter:alpha(opacity = 100)}.cke_button_disabled{filter:alpha(opacity = 30)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_hc .cke_button_arrow{margin-top:5px}.cke_combo_inlinelabel{filter:alpha(opacity = 70)}.cke_combo_button_off:hover .cke_combo_inlinelabel{filter:alpha(opacity = 100)}.cke_combo_button_disabled .cke_combo_inlinelabel,.cke_combo_button_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:2px outset #efefef}.cke_toolbox_collapser .cke_arrow{margin:0 1px 1px 1px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-left:2px}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{filter:alpha(opacity = 70)}.cke_resizer{filter:alpha(opacity = 80)}.cke_hc .cke_resizer{filter:none;font-size:28px}.cke_menuarrow{position:absolute;right:2px}.cke_rtl .cke_menuarrow{position:absolute;left:2px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first{padding-left:10px!important}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *{float:none}.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,.cke_rtl .cke_button_arrow{vertical-align:top;display:inline-block}.cke_toolgroup,.cke_combo_button,.cke_combo_arrow,.cke_button_arrow,.cke_toolbox_collapser,.cke_resizer{background-image:url(images/sprites_ie6.png)}.cke_toolgroup{background-color:#fff;display:inline-block;padding:2px}.cke_inner{padding-top:2px;background-color:#d3d3d3;background-image:none}.cke_toolbar{margin:2px 0}.cke_rtl .cke_toolbar{margin-bottom:-1px;margin-top:-1px}.cke_toolbar_separator{vertical-align:top}.cke_toolbox{width:100%;float:left;padding-bottom:4px}.cke_rtl .cke_toolbox{margin-top:2px;margin-bottom:-4px}.cke_combo_button{background-color:#fff}.cke_rtl .cke_combo_button{padding-right:6px;padding-left:0}.cke_combo_text{line-height:21px}.cke_ltr .cke_combo_open{margin-left:-3px}.cke_combo_arrow{background-position:2px -1467px;margin:2px 0 0;border:0;width:8px;height:13px}.cke_rtl .cke_button_arrow{background-position-x:0}.cke_toolbox_collapser .cke_arrow{display:block;visibility:hidden;font-size:0;color:transparent;border:0}.cke_button_arrow{background-position:2px -1467px;margin:0;border:0;width:8px;height:15px}.cke_ltr .cke_button_arrow{background-position:0 -1467px;margin-left:-3px}.cke_toolbox_collapser{background-position:3px -1367px}.cke_toolbox_collapser_min{background-position:4px -1387px;margin:2px 0 0}.cke_rtl .cke_toolbox_collapser_min{background-position:4px -1408px}.cke_resizer{background-position:0 -1427px;width:12px;height:12px;border:0;margin:9px 0 0;vertical-align:baseline}.cke_dialog_tabs{position:absolute;top:38px;left:0}.cke_dialog_body{clear:both;margin-top:20px}a.cke_dialog_ui_button{background:url(images/sprites.png) repeat_x 0 _ 1069px}a.cke_dialog_ui_button:hover,a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{background-position:0 -1179px}a.cke_dialog_ui_button_ok{background:url(images/sprites.png) repeat_x 0 _ 1144px}a.cke_dialog_ui_button_cancel{background:url(images/sprites.png) repeat_x 0 _ 1105px}a.cke_dialog_ui_button_ok span,a.cke_dialog_ui_button_cancel span{background-image:none}.cke_menubutton_label{height:25px}.cke_menuarrow{background-image:url(images/sprites_ie6.png)}.cke_menuitem .cke_icon,.cke_button_icon,.cke_menuitem .cke_disabled .cke_icon,.cke_button_disabled .cke_button_icon{filter:""}.cke_menuseparator{font-size:0}.cke_colorbox{font-size:0}.cke_source{white-space:normal} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/kama/icons.png b/bower_components/ckeditor/skins/kama/icons.png new file mode 100644 index 0000000..a041850 Binary files /dev/null and b/bower_components/ckeditor/skins/kama/icons.png differ diff --git a/bower_components/ckeditor/skins/kama/icons_hidpi.png b/bower_components/ckeditor/skins/kama/icons_hidpi.png new file mode 100644 index 0000000..1581f60 Binary files /dev/null and b/bower_components/ckeditor/skins/kama/icons_hidpi.png differ diff --git a/bower_components/ckeditor/skins/kama/images/dialog_sides.gif b/bower_components/ckeditor/skins/kama/images/dialog_sides.gif new file mode 100644 index 0000000..b5d9a53 Binary files /dev/null and b/bower_components/ckeditor/skins/kama/images/dialog_sides.gif differ diff --git a/bower_components/ckeditor/skins/kama/images/dialog_sides.png b/bower_components/ckeditor/skins/kama/images/dialog_sides.png new file mode 100644 index 0000000..2df7a15 Binary files /dev/null and b/bower_components/ckeditor/skins/kama/images/dialog_sides.png differ diff --git a/bower_components/ckeditor/skins/kama/images/dialog_sides_rtl.png b/bower_components/ckeditor/skins/kama/images/dialog_sides_rtl.png new file mode 100644 index 0000000..b179935 Binary files /dev/null and b/bower_components/ckeditor/skins/kama/images/dialog_sides_rtl.png differ diff --git a/bower_components/ckeditor/skins/kama/images/mini.gif b/bower_components/ckeditor/skins/kama/images/mini.gif new file mode 100644 index 0000000..babc31a Binary files /dev/null and b/bower_components/ckeditor/skins/kama/images/mini.gif differ diff --git a/bower_components/ckeditor/skins/kama/images/sprites.png b/bower_components/ckeditor/skins/kama/images/sprites.png new file mode 100644 index 0000000..5fc409d Binary files /dev/null and b/bower_components/ckeditor/skins/kama/images/sprites.png differ diff --git a/bower_components/ckeditor/skins/kama/images/sprites_ie6.png b/bower_components/ckeditor/skins/kama/images/sprites_ie6.png new file mode 100644 index 0000000..070a8ce Binary files /dev/null and b/bower_components/ckeditor/skins/kama/images/sprites_ie6.png differ diff --git a/bower_components/ckeditor/skins/kama/images/toolbar_start.gif b/bower_components/ckeditor/skins/kama/images/toolbar_start.gif new file mode 100644 index 0000000..94aa4ab Binary files /dev/null and b/bower_components/ckeditor/skins/kama/images/toolbar_start.gif differ diff --git a/bower_components/ckeditor/skins/kama/readme.md b/bower_components/ckeditor/skins/kama/readme.md new file mode 100644 index 0000000..a6a4861 --- /dev/null +++ b/bower_components/ckeditor/skins/kama/readme.md @@ -0,0 +1,40 @@ +"Kama" Skin +==================== + +"Kama" is the default skin of CKEditor 3.x. +It's been ported to CKEditor 4 and fully featured. + +For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK) +documentation. + +Directory Structure +------------------- + +CSS parts: +- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance, +- **mainui.css**: the file contains styles of entire editor outline structures, +- **toolbar.css**: the file contains styles of the editor toolbar space (top), +- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar, +- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded +until the first panel open up, +- **elementspath.css**: the file contains styles of the editor elements path bar (bottom), +- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down, +it's not loaded until the first menu open up, +- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open, +- **reset.css**: the file defines the basis of style resets among all editor UI spaces, +- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference, +- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks. + +Other parts: +- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature, +- **icons/**: contains all skin defined icons, +- **images/**: contains a fill general used images. + +License +------- + +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). + +See LICENSE.md for more information. diff --git a/bower_components/ckeditor/skins/kama/skin.js b/bower_components/ckeditor/skins/kama/skin.js new file mode 100644 index 0000000..c7ea59f --- /dev/null +++ b/bower_components/ckeditor/skins/kama/skin.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.skin.name="kama";CKEDITOR.skin.ua_editor="ie,iequirks,ie7,ie8";CKEDITOR.skin.ua_dialog="ie,iequirks,ie7,ie8"; +CKEDITOR.skin.chameleon=function(e,d){function b(a){return"background:-moz-linear-gradient("+a+");background:-webkit-linear-gradient("+a+");background:-o-linear-gradient("+a+");background:-ms-linear-gradient("+a+");background:linear-gradient("+a+");"}var c,a="."+e.id;"editor"==d?c=a+" .cke_inner,"+a+" .cke_dialog_tab{background-color:$color;background:-webkit-gradient(linear,0 -15,0 40,from(#fff),to($color));"+b("top,#fff -15px,$color 40px")+"}"+a+" .cke_toolgroup{background:-webkit-gradient(linear,0 0,0 100,from(#fff),to($color));"+ +b("top,#fff,$color 100px")+"}"+a+" .cke_combo_button{background:-webkit-gradient(linear, left bottom, left -100, from(#fff), to($color));"+b("bottom,#fff,$color 100px")+"}"+a+" .cke_dialog_contents,"+a+" .cke_dialog_footer{background-color:$color !important;}"+a+" .cke_dialog_tab:hover,"+a+" .cke_dialog_tab:active,"+a+" .cke_dialog_tab:focus,"+a+" .cke_dialog_tab_selected{background-color:$color;background-image:none;}":"panel"==d&&(c=".cke_menubutton_icon{background-color:$color !important;border-color:$color !important;}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:$color !important;border-color:$color !important;}.cke_menubutton:hover .cke_menubutton_label,.cke_menubutton:focus .cke_menubutton_label,.cke_menubutton:active .cke_menubutton_label{background-color:$color !important;}.cke_menubutton_disabled:hover .cke_menubutton_label,.cke_menubutton_disabled:focus .cke_menubutton_label,.cke_menubutton_disabled:active .cke_menubutton_label{background-color: transparent !important;}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:$color !important;border-color:$color !important;}.cke_menubutton_disabled .cke_menubutton_icon{background-color:$color !important;border-color:$color !important;}.cke_menuseparator{background-color:$color !important;}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:$color !important;}"); +return c}; \ No newline at end of file diff --git a/bower_components/ckeditor/skins/moono/dialog.css b/bower_components/ckeditor/skins/moono/dialog.css new file mode 100644 index 0000000..8fdd5ab --- /dev/null +++ b/bower_components/ckeditor/skins/moono/dialog.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/moono/dialog_ie.css b/bower_components/ckeditor/skins/moono/dialog_ie.css new file mode 100644 index 0000000..48c1b4b --- /dev/null +++ b/bower_components/ckeditor/skins/moono/dialog_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/moono/dialog_ie7.css b/bower_components/ckeditor/skins/moono/dialog_ie7.css new file mode 100644 index 0000000..bdc5a38 --- /dev/null +++ b/bower_components/ckeditor/skins/moono/dialog_ie7.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/moono/dialog_ie8.css b/bower_components/ckeditor/skins/moono/dialog_ie8.css new file mode 100644 index 0000000..89b1664 --- /dev/null +++ b/bower_components/ckeditor/skins/moono/dialog_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/moono/dialog_iequirks.css b/bower_components/ckeditor/skins/moono/dialog_iequirks.css new file mode 100644 index 0000000..a168d84 --- /dev/null +++ b/bower_components/ckeditor/skins/moono/dialog_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/moono/editor.css b/bower_components/ckeditor/skins/moono/editor.css new file mode 100644 index 0000000..58793f7 --- /dev/null +++ b/bower_components/ckeditor/skins/moono/editor.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -24px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -48px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -72px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -120px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -144px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -168px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -216px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -240px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -264px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -312px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -336px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -360px!important}.cke_button__codesnippet_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -408px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -432px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -456px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -504px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -528px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -552px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -600px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -624px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -648px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -696px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -720px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -744px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -792px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -816px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -840px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_ltr .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -888px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -912px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -936px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -984px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -1008px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1032px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -1080px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -1104px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -1128px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_button__language_icon{background:url(icons.png) no-repeat 0 -1176px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -1200px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -1224px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -1272px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -1296px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -1320px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1368px!important}.cke_button__mathjax_icon{background:url(icons.png) no-repeat 0 -1392px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -1416px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1464px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1488px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1512px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1560px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1584px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1608px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1656px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1680px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1704px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1752px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1776px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1800px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1848px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -1872px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1896px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_rtl .cke_button__sourcedialog_icon,.cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -1944px!important}.cke_ltr .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -1968px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -1992px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2040px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2064px!important}.cke_button__uicolor_icon{background:url(icons.png) no-repeat 0 -2088px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -2136px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2160px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2184px!important}.cke_button__simplebox_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -2232px!important}.cke_hidpi .cke_button__about_icon{background:url(icons_hidpi.png) no-repeat 0 -0px!important;background-size:16px!important}.cke_hidpi .cke_button__bold_icon{background:url(icons_hidpi.png) no-repeat 0 -24px!important;background-size:16px!important}.cke_hidpi .cke_button__italic_icon{background:url(icons_hidpi.png) no-repeat 0 -48px!important;background-size:16px!important}.cke_hidpi .cke_button__strike_icon{background:url(icons_hidpi.png) no-repeat 0 -72px!important;background-size:16px!important}.cke_hidpi .cke_button__subscript_icon{background:url(icons_hidpi.png) no-repeat 0 -96px!important;background-size:16px!important}.cke_hidpi .cke_button__superscript_icon{background:url(icons_hidpi.png) no-repeat 0 -120px!important;background-size:16px!important}.cke_hidpi .cke_button__underline_icon{background:url(icons_hidpi.png) no-repeat 0 -144px!important;background-size:16px!important}.cke_hidpi .cke_button__bidiltr_icon{background:url(icons_hidpi.png) no-repeat 0 -168px!important;background-size:16px!important}.cke_hidpi .cke_button__bidirtl_icon{background:url(icons_hidpi.png) no-repeat 0 -192px!important;background-size:16px!important}.cke_hidpi .cke_button__blockquote_icon{background:url(icons_hidpi.png) no-repeat 0 -216px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__copy_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -240px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -264px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__cut_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -288px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -312px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__paste_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -336px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -360px!important;background-size:16px!important}.cke_hidpi .cke_button__codesnippet_icon{background:url(icons_hidpi.png) no-repeat 0 -384px!important;background-size:16px!important}.cke_hidpi .cke_button__bgcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -408px!important;background-size:16px!important}.cke_hidpi .cke_button__textcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -432px!important;background-size:16px!important}.cke_hidpi .cke_button__creatediv_icon{background:url(icons_hidpi.png) no-repeat 0 -456px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__docprops_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -480px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__docprops_icon,.cke_ltr.cke_hidpi .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -504px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__find_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -528px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -552px!important;background-size:16px!important}.cke_hidpi .cke_button__replace_icon{background:url(icons_hidpi.png) no-repeat 0 -576px!important;background-size:16px!important}.cke_hidpi .cke_button__flash_icon{background:url(icons_hidpi.png) no-repeat 0 -600px!important;background-size:16px!important}.cke_hidpi .cke_button__button_icon{background:url(icons_hidpi.png) no-repeat 0 -624px!important;background-size:16px!important}.cke_hidpi .cke_button__checkbox_icon{background:url(icons_hidpi.png) no-repeat 0 -648px!important;background-size:16px!important}.cke_hidpi .cke_button__form_icon{background:url(icons_hidpi.png) no-repeat 0 -672px!important;background-size:16px!important}.cke_hidpi .cke_button__hiddenfield_icon{background:url(icons_hidpi.png) no-repeat 0 -696px!important;background-size:16px!important}.cke_hidpi .cke_button__imagebutton_icon{background:url(icons_hidpi.png) no-repeat 0 -720px!important;background-size:16px!important}.cke_hidpi .cke_button__radio_icon{background:url(icons_hidpi.png) no-repeat 0 -744px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__select_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -768px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -792px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textarea_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -816px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -840px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textfield_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -864px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -888px!important;background-size:16px!important}.cke_hidpi .cke_button__horizontalrule_icon{background:url(icons_hidpi.png) no-repeat 0 -912px!important;background-size:16px!important}.cke_hidpi .cke_button__iframe_icon{background:url(icons_hidpi.png) no-repeat 0 -936px!important;background-size:16px!important}.cke_hidpi .cke_button__image_icon{background:url(icons_hidpi.png) no-repeat 0 -960px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__indent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -984px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1008px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__outdent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1032px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1056px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyblock_icon{background:url(icons_hidpi.png) no-repeat 0 -1080px!important;background-size:16px!important}.cke_hidpi .cke_button__justifycenter_icon{background:url(icons_hidpi.png) no-repeat 0 -1104px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyleft_icon{background:url(icons_hidpi.png) no-repeat 0 -1128px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyright_icon{background:url(icons_hidpi.png) no-repeat 0 -1152px!important;background-size:16px!important}.cke_hidpi .cke_button__language_icon{background:url(icons_hidpi.png) no-repeat 0 -1176px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__anchor_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -1200px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -1224px!important;background-size:16px!important}.cke_hidpi .cke_button__link_icon{background:url(icons_hidpi.png) no-repeat 0 -1248px!important;background-size:16px!important}.cke_hidpi .cke_button__unlink_icon{background:url(icons_hidpi.png) no-repeat 0 -1272px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1296px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1320px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1344px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1368px!important;background-size:16px!important}.cke_hidpi .cke_button__mathjax_icon{background:url(icons_hidpi.png) no-repeat 0 -1392px!important;background-size:16px!important}.cke_hidpi .cke_button__maximize_icon{background:url(icons_hidpi.png) no-repeat 0 -1416px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__newpage_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1440px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1464px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -1488px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -1512px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -1536px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -1560px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pastetext_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -1584px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -1608px!important;background-size:16px!important}.cke_hidpi .cke_button__placeholder_icon{background:url(icons_hidpi.png) no-repeat 0 -1632px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__preview_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -1656px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -1680px!important;background-size:16px!important}.cke_hidpi .cke_button__print_icon{background:url(icons_hidpi.png) no-repeat 0 -1704px!important;background-size:16px!important}.cke_hidpi .cke_button__removeformat_icon{background:url(icons_hidpi.png) no-repeat 0 -1728px!important;background-size:16px!important}.cke_hidpi .cke_button__save_icon{background:url(icons_hidpi.png) no-repeat 0 -1752px!important;background-size:16px!important}.cke_hidpi .cke_button__scayt_icon{background:url(icons_hidpi.png) no-repeat 0 -1776px!important;background-size:16px!important}.cke_hidpi .cke_button__selectall_icon{background:url(icons_hidpi.png) no-repeat 0 -1800px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__showblocks_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -1824px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -1848px!important;background-size:16px!important}.cke_hidpi .cke_button__smiley_icon{background:url(icons_hidpi.png) no-repeat 0 -1872px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__source_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -1896px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -1920px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -1944px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -1968px!important;background-size:16px!important}.cke_hidpi .cke_button__specialchar_icon{background:url(icons_hidpi.png) no-repeat 0 -1992px!important;background-size:16px!important}.cke_hidpi .cke_button__table_icon{background:url(icons_hidpi.png) no-repeat 0 -2016px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__templates_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -2040px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important;background-size:16px!important}.cke_hidpi .cke_button__uicolor_icon{background:url(icons_hidpi.png) no-repeat 0 -2088px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__redo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2136px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__undo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -2184px!important;background-size:16px!important}.cke_hidpi .cke_button__simplebox_icon{background:url(icons_hidpi.png) no-repeat 0 -4416px!important}.cke_hidpi .cke_button__spellchecker_icon{background:url(icons_hidpi.png) no-repeat 0 -2232px!important;background-size:16px!important} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/moono/editor_gecko.css b/bower_components/ckeditor/skins/moono/editor_gecko.css new file mode 100644 index 0000000..806e23f --- /dev/null +++ b/bower_components/ckeditor/skins/moono/editor_gecko.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -24px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -48px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -72px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -120px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -144px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -168px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -216px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -240px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -264px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -312px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -336px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -360px!important}.cke_button__codesnippet_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -408px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -432px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -456px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -504px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -528px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -552px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -600px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -624px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -648px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -696px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -720px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -744px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -792px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -816px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -840px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_ltr .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -888px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -912px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -936px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -984px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -1008px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1032px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -1080px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -1104px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -1128px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_button__language_icon{background:url(icons.png) no-repeat 0 -1176px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -1200px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -1224px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -1272px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -1296px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -1320px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1368px!important}.cke_button__mathjax_icon{background:url(icons.png) no-repeat 0 -1392px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -1416px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1464px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1488px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1512px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1560px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1584px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1608px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1656px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1680px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1704px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1752px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1776px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1800px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1848px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -1872px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1896px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_rtl .cke_button__sourcedialog_icon,.cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -1944px!important}.cke_ltr .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -1968px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -1992px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2040px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2064px!important}.cke_button__uicolor_icon{background:url(icons.png) no-repeat 0 -2088px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -2136px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2160px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2184px!important}.cke_button__simplebox_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -2232px!important}.cke_hidpi .cke_button__about_icon{background:url(icons_hidpi.png) no-repeat 0 -0px!important;background-size:16px!important}.cke_hidpi .cke_button__bold_icon{background:url(icons_hidpi.png) no-repeat 0 -24px!important;background-size:16px!important}.cke_hidpi .cke_button__italic_icon{background:url(icons_hidpi.png) no-repeat 0 -48px!important;background-size:16px!important}.cke_hidpi .cke_button__strike_icon{background:url(icons_hidpi.png) no-repeat 0 -72px!important;background-size:16px!important}.cke_hidpi .cke_button__subscript_icon{background:url(icons_hidpi.png) no-repeat 0 -96px!important;background-size:16px!important}.cke_hidpi .cke_button__superscript_icon{background:url(icons_hidpi.png) no-repeat 0 -120px!important;background-size:16px!important}.cke_hidpi .cke_button__underline_icon{background:url(icons_hidpi.png) no-repeat 0 -144px!important;background-size:16px!important}.cke_hidpi .cke_button__bidiltr_icon{background:url(icons_hidpi.png) no-repeat 0 -168px!important;background-size:16px!important}.cke_hidpi .cke_button__bidirtl_icon{background:url(icons_hidpi.png) no-repeat 0 -192px!important;background-size:16px!important}.cke_hidpi .cke_button__blockquote_icon{background:url(icons_hidpi.png) no-repeat 0 -216px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__copy_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -240px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -264px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__cut_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -288px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -312px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__paste_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -336px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -360px!important;background-size:16px!important}.cke_hidpi .cke_button__codesnippet_icon{background:url(icons_hidpi.png) no-repeat 0 -384px!important;background-size:16px!important}.cke_hidpi .cke_button__bgcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -408px!important;background-size:16px!important}.cke_hidpi .cke_button__textcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -432px!important;background-size:16px!important}.cke_hidpi .cke_button__creatediv_icon{background:url(icons_hidpi.png) no-repeat 0 -456px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__docprops_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -480px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__docprops_icon,.cke_ltr.cke_hidpi .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -504px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__find_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -528px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -552px!important;background-size:16px!important}.cke_hidpi .cke_button__replace_icon{background:url(icons_hidpi.png) no-repeat 0 -576px!important;background-size:16px!important}.cke_hidpi .cke_button__flash_icon{background:url(icons_hidpi.png) no-repeat 0 -600px!important;background-size:16px!important}.cke_hidpi .cke_button__button_icon{background:url(icons_hidpi.png) no-repeat 0 -624px!important;background-size:16px!important}.cke_hidpi .cke_button__checkbox_icon{background:url(icons_hidpi.png) no-repeat 0 -648px!important;background-size:16px!important}.cke_hidpi .cke_button__form_icon{background:url(icons_hidpi.png) no-repeat 0 -672px!important;background-size:16px!important}.cke_hidpi .cke_button__hiddenfield_icon{background:url(icons_hidpi.png) no-repeat 0 -696px!important;background-size:16px!important}.cke_hidpi .cke_button__imagebutton_icon{background:url(icons_hidpi.png) no-repeat 0 -720px!important;background-size:16px!important}.cke_hidpi .cke_button__radio_icon{background:url(icons_hidpi.png) no-repeat 0 -744px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__select_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -768px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -792px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textarea_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -816px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -840px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textfield_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -864px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -888px!important;background-size:16px!important}.cke_hidpi .cke_button__horizontalrule_icon{background:url(icons_hidpi.png) no-repeat 0 -912px!important;background-size:16px!important}.cke_hidpi .cke_button__iframe_icon{background:url(icons_hidpi.png) no-repeat 0 -936px!important;background-size:16px!important}.cke_hidpi .cke_button__image_icon{background:url(icons_hidpi.png) no-repeat 0 -960px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__indent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -984px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1008px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__outdent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1032px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1056px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyblock_icon{background:url(icons_hidpi.png) no-repeat 0 -1080px!important;background-size:16px!important}.cke_hidpi .cke_button__justifycenter_icon{background:url(icons_hidpi.png) no-repeat 0 -1104px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyleft_icon{background:url(icons_hidpi.png) no-repeat 0 -1128px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyright_icon{background:url(icons_hidpi.png) no-repeat 0 -1152px!important;background-size:16px!important}.cke_hidpi .cke_button__language_icon{background:url(icons_hidpi.png) no-repeat 0 -1176px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__anchor_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -1200px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -1224px!important;background-size:16px!important}.cke_hidpi .cke_button__link_icon{background:url(icons_hidpi.png) no-repeat 0 -1248px!important;background-size:16px!important}.cke_hidpi .cke_button__unlink_icon{background:url(icons_hidpi.png) no-repeat 0 -1272px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1296px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1320px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1344px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1368px!important;background-size:16px!important}.cke_hidpi .cke_button__mathjax_icon{background:url(icons_hidpi.png) no-repeat 0 -1392px!important;background-size:16px!important}.cke_hidpi .cke_button__maximize_icon{background:url(icons_hidpi.png) no-repeat 0 -1416px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__newpage_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1440px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1464px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -1488px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -1512px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -1536px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -1560px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pastetext_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -1584px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -1608px!important;background-size:16px!important}.cke_hidpi .cke_button__placeholder_icon{background:url(icons_hidpi.png) no-repeat 0 -1632px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__preview_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -1656px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -1680px!important;background-size:16px!important}.cke_hidpi .cke_button__print_icon{background:url(icons_hidpi.png) no-repeat 0 -1704px!important;background-size:16px!important}.cke_hidpi .cke_button__removeformat_icon{background:url(icons_hidpi.png) no-repeat 0 -1728px!important;background-size:16px!important}.cke_hidpi .cke_button__save_icon{background:url(icons_hidpi.png) no-repeat 0 -1752px!important;background-size:16px!important}.cke_hidpi .cke_button__scayt_icon{background:url(icons_hidpi.png) no-repeat 0 -1776px!important;background-size:16px!important}.cke_hidpi .cke_button__selectall_icon{background:url(icons_hidpi.png) no-repeat 0 -1800px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__showblocks_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -1824px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -1848px!important;background-size:16px!important}.cke_hidpi .cke_button__smiley_icon{background:url(icons_hidpi.png) no-repeat 0 -1872px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__source_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -1896px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -1920px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -1944px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -1968px!important;background-size:16px!important}.cke_hidpi .cke_button__specialchar_icon{background:url(icons_hidpi.png) no-repeat 0 -1992px!important;background-size:16px!important}.cke_hidpi .cke_button__table_icon{background:url(icons_hidpi.png) no-repeat 0 -2016px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__templates_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -2040px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important;background-size:16px!important}.cke_hidpi .cke_button__uicolor_icon{background:url(icons_hidpi.png) no-repeat 0 -2088px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__redo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2136px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__undo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -2184px!important;background-size:16px!important}.cke_hidpi .cke_button__simplebox_icon{background:url(icons_hidpi.png) no-repeat 0 -4416px!important}.cke_hidpi .cke_button__spellchecker_icon{background:url(icons_hidpi.png) no-repeat 0 -2232px!important;background-size:16px!important}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/moono/editor_ie.css b/bower_components/ckeditor/skins/moono/editor_ie.css new file mode 100644 index 0000000..bb4e142 --- /dev/null +++ b/bower_components/ckeditor/skins/moono/editor_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -24px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -48px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -72px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -120px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -144px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -168px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -216px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -240px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -264px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -312px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -336px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -360px!important}.cke_button__codesnippet_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -408px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -432px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -456px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -504px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -528px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -552px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -600px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -624px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -648px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -696px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -720px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -744px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -792px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -816px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -840px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_ltr .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -888px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -912px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -936px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -984px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -1008px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1032px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -1080px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -1104px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -1128px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_button__language_icon{background:url(icons.png) no-repeat 0 -1176px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -1200px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -1224px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -1272px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -1296px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -1320px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1368px!important}.cke_button__mathjax_icon{background:url(icons.png) no-repeat 0 -1392px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -1416px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1464px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1488px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1512px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1560px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1584px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1608px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1656px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1680px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1704px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1752px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1776px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1800px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1848px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -1872px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1896px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_rtl .cke_button__sourcedialog_icon,.cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -1944px!important}.cke_ltr .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -1968px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -1992px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2040px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2064px!important}.cke_button__uicolor_icon{background:url(icons.png) no-repeat 0 -2088px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -2136px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2160px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2184px!important}.cke_button__simplebox_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -2232px!important}.cke_hidpi .cke_button__about_icon{background:url(icons_hidpi.png) no-repeat 0 -0px!important;background-size:16px!important}.cke_hidpi .cke_button__bold_icon{background:url(icons_hidpi.png) no-repeat 0 -24px!important;background-size:16px!important}.cke_hidpi .cke_button__italic_icon{background:url(icons_hidpi.png) no-repeat 0 -48px!important;background-size:16px!important}.cke_hidpi .cke_button__strike_icon{background:url(icons_hidpi.png) no-repeat 0 -72px!important;background-size:16px!important}.cke_hidpi .cke_button__subscript_icon{background:url(icons_hidpi.png) no-repeat 0 -96px!important;background-size:16px!important}.cke_hidpi .cke_button__superscript_icon{background:url(icons_hidpi.png) no-repeat 0 -120px!important;background-size:16px!important}.cke_hidpi .cke_button__underline_icon{background:url(icons_hidpi.png) no-repeat 0 -144px!important;background-size:16px!important}.cke_hidpi .cke_button__bidiltr_icon{background:url(icons_hidpi.png) no-repeat 0 -168px!important;background-size:16px!important}.cke_hidpi .cke_button__bidirtl_icon{background:url(icons_hidpi.png) no-repeat 0 -192px!important;background-size:16px!important}.cke_hidpi .cke_button__blockquote_icon{background:url(icons_hidpi.png) no-repeat 0 -216px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__copy_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -240px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -264px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__cut_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -288px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -312px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__paste_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -336px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -360px!important;background-size:16px!important}.cke_hidpi .cke_button__codesnippet_icon{background:url(icons_hidpi.png) no-repeat 0 -384px!important;background-size:16px!important}.cke_hidpi .cke_button__bgcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -408px!important;background-size:16px!important}.cke_hidpi .cke_button__textcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -432px!important;background-size:16px!important}.cke_hidpi .cke_button__creatediv_icon{background:url(icons_hidpi.png) no-repeat 0 -456px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__docprops_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -480px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__docprops_icon,.cke_ltr.cke_hidpi .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -504px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__find_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -528px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -552px!important;background-size:16px!important}.cke_hidpi .cke_button__replace_icon{background:url(icons_hidpi.png) no-repeat 0 -576px!important;background-size:16px!important}.cke_hidpi .cke_button__flash_icon{background:url(icons_hidpi.png) no-repeat 0 -600px!important;background-size:16px!important}.cke_hidpi .cke_button__button_icon{background:url(icons_hidpi.png) no-repeat 0 -624px!important;background-size:16px!important}.cke_hidpi .cke_button__checkbox_icon{background:url(icons_hidpi.png) no-repeat 0 -648px!important;background-size:16px!important}.cke_hidpi .cke_button__form_icon{background:url(icons_hidpi.png) no-repeat 0 -672px!important;background-size:16px!important}.cke_hidpi .cke_button__hiddenfield_icon{background:url(icons_hidpi.png) no-repeat 0 -696px!important;background-size:16px!important}.cke_hidpi .cke_button__imagebutton_icon{background:url(icons_hidpi.png) no-repeat 0 -720px!important;background-size:16px!important}.cke_hidpi .cke_button__radio_icon{background:url(icons_hidpi.png) no-repeat 0 -744px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__select_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -768px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -792px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textarea_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -816px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -840px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textfield_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -864px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -888px!important;background-size:16px!important}.cke_hidpi .cke_button__horizontalrule_icon{background:url(icons_hidpi.png) no-repeat 0 -912px!important;background-size:16px!important}.cke_hidpi .cke_button__iframe_icon{background:url(icons_hidpi.png) no-repeat 0 -936px!important;background-size:16px!important}.cke_hidpi .cke_button__image_icon{background:url(icons_hidpi.png) no-repeat 0 -960px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__indent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -984px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1008px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__outdent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1032px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1056px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyblock_icon{background:url(icons_hidpi.png) no-repeat 0 -1080px!important;background-size:16px!important}.cke_hidpi .cke_button__justifycenter_icon{background:url(icons_hidpi.png) no-repeat 0 -1104px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyleft_icon{background:url(icons_hidpi.png) no-repeat 0 -1128px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyright_icon{background:url(icons_hidpi.png) no-repeat 0 -1152px!important;background-size:16px!important}.cke_hidpi .cke_button__language_icon{background:url(icons_hidpi.png) no-repeat 0 -1176px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__anchor_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -1200px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -1224px!important;background-size:16px!important}.cke_hidpi .cke_button__link_icon{background:url(icons_hidpi.png) no-repeat 0 -1248px!important;background-size:16px!important}.cke_hidpi .cke_button__unlink_icon{background:url(icons_hidpi.png) no-repeat 0 -1272px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1296px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1320px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1344px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1368px!important;background-size:16px!important}.cke_hidpi .cke_button__mathjax_icon{background:url(icons_hidpi.png) no-repeat 0 -1392px!important;background-size:16px!important}.cke_hidpi .cke_button__maximize_icon{background:url(icons_hidpi.png) no-repeat 0 -1416px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__newpage_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1440px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1464px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -1488px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -1512px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -1536px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -1560px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pastetext_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -1584px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -1608px!important;background-size:16px!important}.cke_hidpi .cke_button__placeholder_icon{background:url(icons_hidpi.png) no-repeat 0 -1632px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__preview_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -1656px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -1680px!important;background-size:16px!important}.cke_hidpi .cke_button__print_icon{background:url(icons_hidpi.png) no-repeat 0 -1704px!important;background-size:16px!important}.cke_hidpi .cke_button__removeformat_icon{background:url(icons_hidpi.png) no-repeat 0 -1728px!important;background-size:16px!important}.cke_hidpi .cke_button__save_icon{background:url(icons_hidpi.png) no-repeat 0 -1752px!important;background-size:16px!important}.cke_hidpi .cke_button__scayt_icon{background:url(icons_hidpi.png) no-repeat 0 -1776px!important;background-size:16px!important}.cke_hidpi .cke_button__selectall_icon{background:url(icons_hidpi.png) no-repeat 0 -1800px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__showblocks_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -1824px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -1848px!important;background-size:16px!important}.cke_hidpi .cke_button__smiley_icon{background:url(icons_hidpi.png) no-repeat 0 -1872px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__source_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -1896px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -1920px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -1944px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -1968px!important;background-size:16px!important}.cke_hidpi .cke_button__specialchar_icon{background:url(icons_hidpi.png) no-repeat 0 -1992px!important;background-size:16px!important}.cke_hidpi .cke_button__table_icon{background:url(icons_hidpi.png) no-repeat 0 -2016px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__templates_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -2040px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important;background-size:16px!important}.cke_hidpi .cke_button__uicolor_icon{background:url(icons_hidpi.png) no-repeat 0 -2088px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__redo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2136px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__undo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -2184px!important;background-size:16px!important}.cke_hidpi .cke_button__simplebox_icon{background:url(icons_hidpi.png) no-repeat 0 -4416px!important}.cke_hidpi .cke_button__spellchecker_icon{background:url(icons_hidpi.png) no-repeat 0 -2232px!important;background-size:16px!important}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/moono/editor_ie7.css b/bower_components/ckeditor/skins/moono/editor_ie7.css new file mode 100644 index 0000000..836814c --- /dev/null +++ b/bower_components/ckeditor/skins/moono/editor_ie7.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -24px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -48px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -72px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -120px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -144px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -168px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -216px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -240px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -264px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -312px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -336px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -360px!important}.cke_button__codesnippet_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -408px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -432px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -456px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -504px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -528px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -552px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -600px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -624px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -648px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -696px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -720px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -744px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -792px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -816px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -840px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_ltr .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -888px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -912px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -936px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -984px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -1008px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1032px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -1080px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -1104px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -1128px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_button__language_icon{background:url(icons.png) no-repeat 0 -1176px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -1200px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -1224px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -1272px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -1296px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -1320px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1368px!important}.cke_button__mathjax_icon{background:url(icons.png) no-repeat 0 -1392px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -1416px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1464px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1488px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1512px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1560px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1584px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1608px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1656px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1680px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1704px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1752px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1776px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1800px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1848px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -1872px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1896px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_rtl .cke_button__sourcedialog_icon,.cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -1944px!important}.cke_ltr .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -1968px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -1992px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2040px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2064px!important}.cke_button__uicolor_icon{background:url(icons.png) no-repeat 0 -2088px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -2136px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2160px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2184px!important}.cke_button__simplebox_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -2232px!important}.cke_hidpi .cke_button__about_icon{background:url(icons_hidpi.png) no-repeat 0 -0px!important;background-size:16px!important}.cke_hidpi .cke_button__bold_icon{background:url(icons_hidpi.png) no-repeat 0 -24px!important;background-size:16px!important}.cke_hidpi .cke_button__italic_icon{background:url(icons_hidpi.png) no-repeat 0 -48px!important;background-size:16px!important}.cke_hidpi .cke_button__strike_icon{background:url(icons_hidpi.png) no-repeat 0 -72px!important;background-size:16px!important}.cke_hidpi .cke_button__subscript_icon{background:url(icons_hidpi.png) no-repeat 0 -96px!important;background-size:16px!important}.cke_hidpi .cke_button__superscript_icon{background:url(icons_hidpi.png) no-repeat 0 -120px!important;background-size:16px!important}.cke_hidpi .cke_button__underline_icon{background:url(icons_hidpi.png) no-repeat 0 -144px!important;background-size:16px!important}.cke_hidpi .cke_button__bidiltr_icon{background:url(icons_hidpi.png) no-repeat 0 -168px!important;background-size:16px!important}.cke_hidpi .cke_button__bidirtl_icon{background:url(icons_hidpi.png) no-repeat 0 -192px!important;background-size:16px!important}.cke_hidpi .cke_button__blockquote_icon{background:url(icons_hidpi.png) no-repeat 0 -216px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__copy_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -240px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -264px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__cut_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -288px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -312px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__paste_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -336px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -360px!important;background-size:16px!important}.cke_hidpi .cke_button__codesnippet_icon{background:url(icons_hidpi.png) no-repeat 0 -384px!important;background-size:16px!important}.cke_hidpi .cke_button__bgcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -408px!important;background-size:16px!important}.cke_hidpi .cke_button__textcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -432px!important;background-size:16px!important}.cke_hidpi .cke_button__creatediv_icon{background:url(icons_hidpi.png) no-repeat 0 -456px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__docprops_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -480px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__docprops_icon,.cke_ltr.cke_hidpi .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -504px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__find_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -528px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -552px!important;background-size:16px!important}.cke_hidpi .cke_button__replace_icon{background:url(icons_hidpi.png) no-repeat 0 -576px!important;background-size:16px!important}.cke_hidpi .cke_button__flash_icon{background:url(icons_hidpi.png) no-repeat 0 -600px!important;background-size:16px!important}.cke_hidpi .cke_button__button_icon{background:url(icons_hidpi.png) no-repeat 0 -624px!important;background-size:16px!important}.cke_hidpi .cke_button__checkbox_icon{background:url(icons_hidpi.png) no-repeat 0 -648px!important;background-size:16px!important}.cke_hidpi .cke_button__form_icon{background:url(icons_hidpi.png) no-repeat 0 -672px!important;background-size:16px!important}.cke_hidpi .cke_button__hiddenfield_icon{background:url(icons_hidpi.png) no-repeat 0 -696px!important;background-size:16px!important}.cke_hidpi .cke_button__imagebutton_icon{background:url(icons_hidpi.png) no-repeat 0 -720px!important;background-size:16px!important}.cke_hidpi .cke_button__radio_icon{background:url(icons_hidpi.png) no-repeat 0 -744px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__select_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -768px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -792px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textarea_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -816px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -840px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textfield_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -864px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -888px!important;background-size:16px!important}.cke_hidpi .cke_button__horizontalrule_icon{background:url(icons_hidpi.png) no-repeat 0 -912px!important;background-size:16px!important}.cke_hidpi .cke_button__iframe_icon{background:url(icons_hidpi.png) no-repeat 0 -936px!important;background-size:16px!important}.cke_hidpi .cke_button__image_icon{background:url(icons_hidpi.png) no-repeat 0 -960px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__indent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -984px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1008px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__outdent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1032px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1056px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyblock_icon{background:url(icons_hidpi.png) no-repeat 0 -1080px!important;background-size:16px!important}.cke_hidpi .cke_button__justifycenter_icon{background:url(icons_hidpi.png) no-repeat 0 -1104px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyleft_icon{background:url(icons_hidpi.png) no-repeat 0 -1128px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyright_icon{background:url(icons_hidpi.png) no-repeat 0 -1152px!important;background-size:16px!important}.cke_hidpi .cke_button__language_icon{background:url(icons_hidpi.png) no-repeat 0 -1176px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__anchor_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -1200px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -1224px!important;background-size:16px!important}.cke_hidpi .cke_button__link_icon{background:url(icons_hidpi.png) no-repeat 0 -1248px!important;background-size:16px!important}.cke_hidpi .cke_button__unlink_icon{background:url(icons_hidpi.png) no-repeat 0 -1272px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1296px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1320px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1344px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1368px!important;background-size:16px!important}.cke_hidpi .cke_button__mathjax_icon{background:url(icons_hidpi.png) no-repeat 0 -1392px!important;background-size:16px!important}.cke_hidpi .cke_button__maximize_icon{background:url(icons_hidpi.png) no-repeat 0 -1416px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__newpage_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1440px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1464px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -1488px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -1512px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -1536px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -1560px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pastetext_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -1584px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -1608px!important;background-size:16px!important}.cke_hidpi .cke_button__placeholder_icon{background:url(icons_hidpi.png) no-repeat 0 -1632px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__preview_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -1656px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -1680px!important;background-size:16px!important}.cke_hidpi .cke_button__print_icon{background:url(icons_hidpi.png) no-repeat 0 -1704px!important;background-size:16px!important}.cke_hidpi .cke_button__removeformat_icon{background:url(icons_hidpi.png) no-repeat 0 -1728px!important;background-size:16px!important}.cke_hidpi .cke_button__save_icon{background:url(icons_hidpi.png) no-repeat 0 -1752px!important;background-size:16px!important}.cke_hidpi .cke_button__scayt_icon{background:url(icons_hidpi.png) no-repeat 0 -1776px!important;background-size:16px!important}.cke_hidpi .cke_button__selectall_icon{background:url(icons_hidpi.png) no-repeat 0 -1800px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__showblocks_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -1824px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -1848px!important;background-size:16px!important}.cke_hidpi .cke_button__smiley_icon{background:url(icons_hidpi.png) no-repeat 0 -1872px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__source_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -1896px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -1920px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -1944px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -1968px!important;background-size:16px!important}.cke_hidpi .cke_button__specialchar_icon{background:url(icons_hidpi.png) no-repeat 0 -1992px!important;background-size:16px!important}.cke_hidpi .cke_button__table_icon{background:url(icons_hidpi.png) no-repeat 0 -2016px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__templates_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -2040px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important;background-size:16px!important}.cke_hidpi .cke_button__uicolor_icon{background:url(icons_hidpi.png) no-repeat 0 -2088px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__redo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2136px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__undo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -2184px!important;background-size:16px!important}.cke_hidpi .cke_button__simplebox_icon{background:url(icons_hidpi.png) no-repeat 0 -4416px!important}.cke_hidpi .cke_button__spellchecker_icon{background:url(icons_hidpi.png) no-repeat 0 -2232px!important;background-size:16px!important}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/moono/editor_ie8.css b/bower_components/ckeditor/skins/moono/editor_ie8.css new file mode 100644 index 0000000..bed2931 --- /dev/null +++ b/bower_components/ckeditor/skins/moono/editor_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -24px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -48px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -72px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -120px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -144px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -168px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -216px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -240px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -264px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -312px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -336px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -360px!important}.cke_button__codesnippet_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -408px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -432px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -456px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -504px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -528px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -552px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -600px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -624px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -648px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -696px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -720px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -744px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -792px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -816px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -840px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_ltr .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -888px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -912px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -936px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -984px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -1008px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1032px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -1080px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -1104px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -1128px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_button__language_icon{background:url(icons.png) no-repeat 0 -1176px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -1200px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -1224px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -1272px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -1296px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -1320px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1368px!important}.cke_button__mathjax_icon{background:url(icons.png) no-repeat 0 -1392px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -1416px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1464px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1488px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1512px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1560px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1584px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1608px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1656px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1680px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1704px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1752px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1776px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1800px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1848px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -1872px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1896px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_rtl .cke_button__sourcedialog_icon,.cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -1944px!important}.cke_ltr .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -1968px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -1992px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2040px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2064px!important}.cke_button__uicolor_icon{background:url(icons.png) no-repeat 0 -2088px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -2136px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2160px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2184px!important}.cke_button__simplebox_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -2232px!important}.cke_hidpi .cke_button__about_icon{background:url(icons_hidpi.png) no-repeat 0 -0px!important;background-size:16px!important}.cke_hidpi .cke_button__bold_icon{background:url(icons_hidpi.png) no-repeat 0 -24px!important;background-size:16px!important}.cke_hidpi .cke_button__italic_icon{background:url(icons_hidpi.png) no-repeat 0 -48px!important;background-size:16px!important}.cke_hidpi .cke_button__strike_icon{background:url(icons_hidpi.png) no-repeat 0 -72px!important;background-size:16px!important}.cke_hidpi .cke_button__subscript_icon{background:url(icons_hidpi.png) no-repeat 0 -96px!important;background-size:16px!important}.cke_hidpi .cke_button__superscript_icon{background:url(icons_hidpi.png) no-repeat 0 -120px!important;background-size:16px!important}.cke_hidpi .cke_button__underline_icon{background:url(icons_hidpi.png) no-repeat 0 -144px!important;background-size:16px!important}.cke_hidpi .cke_button__bidiltr_icon{background:url(icons_hidpi.png) no-repeat 0 -168px!important;background-size:16px!important}.cke_hidpi .cke_button__bidirtl_icon{background:url(icons_hidpi.png) no-repeat 0 -192px!important;background-size:16px!important}.cke_hidpi .cke_button__blockquote_icon{background:url(icons_hidpi.png) no-repeat 0 -216px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__copy_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -240px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -264px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__cut_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -288px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -312px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__paste_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -336px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -360px!important;background-size:16px!important}.cke_hidpi .cke_button__codesnippet_icon{background:url(icons_hidpi.png) no-repeat 0 -384px!important;background-size:16px!important}.cke_hidpi .cke_button__bgcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -408px!important;background-size:16px!important}.cke_hidpi .cke_button__textcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -432px!important;background-size:16px!important}.cke_hidpi .cke_button__creatediv_icon{background:url(icons_hidpi.png) no-repeat 0 -456px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__docprops_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -480px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__docprops_icon,.cke_ltr.cke_hidpi .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -504px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__find_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -528px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -552px!important;background-size:16px!important}.cke_hidpi .cke_button__replace_icon{background:url(icons_hidpi.png) no-repeat 0 -576px!important;background-size:16px!important}.cke_hidpi .cke_button__flash_icon{background:url(icons_hidpi.png) no-repeat 0 -600px!important;background-size:16px!important}.cke_hidpi .cke_button__button_icon{background:url(icons_hidpi.png) no-repeat 0 -624px!important;background-size:16px!important}.cke_hidpi .cke_button__checkbox_icon{background:url(icons_hidpi.png) no-repeat 0 -648px!important;background-size:16px!important}.cke_hidpi .cke_button__form_icon{background:url(icons_hidpi.png) no-repeat 0 -672px!important;background-size:16px!important}.cke_hidpi .cke_button__hiddenfield_icon{background:url(icons_hidpi.png) no-repeat 0 -696px!important;background-size:16px!important}.cke_hidpi .cke_button__imagebutton_icon{background:url(icons_hidpi.png) no-repeat 0 -720px!important;background-size:16px!important}.cke_hidpi .cke_button__radio_icon{background:url(icons_hidpi.png) no-repeat 0 -744px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__select_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -768px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -792px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textarea_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -816px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -840px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textfield_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -864px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -888px!important;background-size:16px!important}.cke_hidpi .cke_button__horizontalrule_icon{background:url(icons_hidpi.png) no-repeat 0 -912px!important;background-size:16px!important}.cke_hidpi .cke_button__iframe_icon{background:url(icons_hidpi.png) no-repeat 0 -936px!important;background-size:16px!important}.cke_hidpi .cke_button__image_icon{background:url(icons_hidpi.png) no-repeat 0 -960px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__indent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -984px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1008px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__outdent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1032px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1056px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyblock_icon{background:url(icons_hidpi.png) no-repeat 0 -1080px!important;background-size:16px!important}.cke_hidpi .cke_button__justifycenter_icon{background:url(icons_hidpi.png) no-repeat 0 -1104px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyleft_icon{background:url(icons_hidpi.png) no-repeat 0 -1128px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyright_icon{background:url(icons_hidpi.png) no-repeat 0 -1152px!important;background-size:16px!important}.cke_hidpi .cke_button__language_icon{background:url(icons_hidpi.png) no-repeat 0 -1176px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__anchor_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -1200px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -1224px!important;background-size:16px!important}.cke_hidpi .cke_button__link_icon{background:url(icons_hidpi.png) no-repeat 0 -1248px!important;background-size:16px!important}.cke_hidpi .cke_button__unlink_icon{background:url(icons_hidpi.png) no-repeat 0 -1272px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1296px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1320px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1344px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1368px!important;background-size:16px!important}.cke_hidpi .cke_button__mathjax_icon{background:url(icons_hidpi.png) no-repeat 0 -1392px!important;background-size:16px!important}.cke_hidpi .cke_button__maximize_icon{background:url(icons_hidpi.png) no-repeat 0 -1416px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__newpage_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1440px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1464px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -1488px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -1512px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -1536px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -1560px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pastetext_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -1584px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -1608px!important;background-size:16px!important}.cke_hidpi .cke_button__placeholder_icon{background:url(icons_hidpi.png) no-repeat 0 -1632px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__preview_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -1656px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -1680px!important;background-size:16px!important}.cke_hidpi .cke_button__print_icon{background:url(icons_hidpi.png) no-repeat 0 -1704px!important;background-size:16px!important}.cke_hidpi .cke_button__removeformat_icon{background:url(icons_hidpi.png) no-repeat 0 -1728px!important;background-size:16px!important}.cke_hidpi .cke_button__save_icon{background:url(icons_hidpi.png) no-repeat 0 -1752px!important;background-size:16px!important}.cke_hidpi .cke_button__scayt_icon{background:url(icons_hidpi.png) no-repeat 0 -1776px!important;background-size:16px!important}.cke_hidpi .cke_button__selectall_icon{background:url(icons_hidpi.png) no-repeat 0 -1800px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__showblocks_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -1824px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -1848px!important;background-size:16px!important}.cke_hidpi .cke_button__smiley_icon{background:url(icons_hidpi.png) no-repeat 0 -1872px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__source_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -1896px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -1920px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -1944px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -1968px!important;background-size:16px!important}.cke_hidpi .cke_button__specialchar_icon{background:url(icons_hidpi.png) no-repeat 0 -1992px!important;background-size:16px!important}.cke_hidpi .cke_button__table_icon{background:url(icons_hidpi.png) no-repeat 0 -2016px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__templates_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -2040px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important;background-size:16px!important}.cke_hidpi .cke_button__uicolor_icon{background:url(icons_hidpi.png) no-repeat 0 -2088px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__redo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2136px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__undo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -2184px!important;background-size:16px!important}.cke_hidpi .cke_button__simplebox_icon{background:url(icons_hidpi.png) no-repeat 0 -4416px!important}.cke_hidpi .cke_button__spellchecker_icon{background:url(icons_hidpi.png) no-repeat 0 -2232px!important;background-size:16px!important}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/moono/editor_iequirks.css b/bower_components/ckeditor/skins/moono/editor_iequirks.css new file mode 100644 index 0000000..a9109d1 --- /dev/null +++ b/bower_components/ckeditor/skins/moono/editor_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -24px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -48px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -72px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -120px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -144px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -168px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -216px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -240px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -264px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -312px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -336px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -360px!important}.cke_button__codesnippet_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -408px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -432px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -456px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -504px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -528px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -552px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -600px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -624px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -648px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -696px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -720px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -744px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -792px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -816px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -840px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_ltr .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -888px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -912px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -936px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -984px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -1008px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1032px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -1080px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -1104px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -1128px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_button__language_icon{background:url(icons.png) no-repeat 0 -1176px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -1200px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -1224px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -1272px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -1296px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -1320px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1368px!important}.cke_button__mathjax_icon{background:url(icons.png) no-repeat 0 -1392px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -1416px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1464px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1488px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1512px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1560px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1584px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1608px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1656px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1680px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1704px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1752px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1776px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1800px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1848px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -1872px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1896px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_rtl .cke_button__sourcedialog_icon,.cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -1944px!important}.cke_ltr .cke_button__sourcedialog_icon{background:url(icons.png) no-repeat 0 -1968px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -1992px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2040px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2064px!important}.cke_button__uicolor_icon{background:url(icons.png) no-repeat 0 -2088px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -2136px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2160px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2184px!important}.cke_button__simplebox_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -2232px!important}.cke_hidpi .cke_button__about_icon{background:url(icons_hidpi.png) no-repeat 0 -0px!important;background-size:16px!important}.cke_hidpi .cke_button__bold_icon{background:url(icons_hidpi.png) no-repeat 0 -24px!important;background-size:16px!important}.cke_hidpi .cke_button__italic_icon{background:url(icons_hidpi.png) no-repeat 0 -48px!important;background-size:16px!important}.cke_hidpi .cke_button__strike_icon{background:url(icons_hidpi.png) no-repeat 0 -72px!important;background-size:16px!important}.cke_hidpi .cke_button__subscript_icon{background:url(icons_hidpi.png) no-repeat 0 -96px!important;background-size:16px!important}.cke_hidpi .cke_button__superscript_icon{background:url(icons_hidpi.png) no-repeat 0 -120px!important;background-size:16px!important}.cke_hidpi .cke_button__underline_icon{background:url(icons_hidpi.png) no-repeat 0 -144px!important;background-size:16px!important}.cke_hidpi .cke_button__bidiltr_icon{background:url(icons_hidpi.png) no-repeat 0 -168px!important;background-size:16px!important}.cke_hidpi .cke_button__bidirtl_icon{background:url(icons_hidpi.png) no-repeat 0 -192px!important;background-size:16px!important}.cke_hidpi .cke_button__blockquote_icon{background:url(icons_hidpi.png) no-repeat 0 -216px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__copy_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -240px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon{background:url(icons_hidpi.png) no-repeat 0 -264px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__cut_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -288px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon{background:url(icons_hidpi.png) no-repeat 0 -312px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__paste_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -336px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon{background:url(icons_hidpi.png) no-repeat 0 -360px!important;background-size:16px!important}.cke_hidpi .cke_button__codesnippet_icon{background:url(icons_hidpi.png) no-repeat 0 -384px!important;background-size:16px!important}.cke_hidpi .cke_button__bgcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -408px!important;background-size:16px!important}.cke_hidpi .cke_button__textcolor_icon{background:url(icons_hidpi.png) no-repeat 0 -432px!important;background-size:16px!important}.cke_hidpi .cke_button__creatediv_icon{background:url(icons_hidpi.png) no-repeat 0 -456px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__docprops_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -480px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__docprops_icon,.cke_ltr.cke_hidpi .cke_button__docprops_icon{background:url(icons_hidpi.png) no-repeat 0 -504px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__find_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -528px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon{background:url(icons_hidpi.png) no-repeat 0 -552px!important;background-size:16px!important}.cke_hidpi .cke_button__replace_icon{background:url(icons_hidpi.png) no-repeat 0 -576px!important;background-size:16px!important}.cke_hidpi .cke_button__flash_icon{background:url(icons_hidpi.png) no-repeat 0 -600px!important;background-size:16px!important}.cke_hidpi .cke_button__button_icon{background:url(icons_hidpi.png) no-repeat 0 -624px!important;background-size:16px!important}.cke_hidpi .cke_button__checkbox_icon{background:url(icons_hidpi.png) no-repeat 0 -648px!important;background-size:16px!important}.cke_hidpi .cke_button__form_icon{background:url(icons_hidpi.png) no-repeat 0 -672px!important;background-size:16px!important}.cke_hidpi .cke_button__hiddenfield_icon{background:url(icons_hidpi.png) no-repeat 0 -696px!important;background-size:16px!important}.cke_hidpi .cke_button__imagebutton_icon{background:url(icons_hidpi.png) no-repeat 0 -720px!important;background-size:16px!important}.cke_hidpi .cke_button__radio_icon{background:url(icons_hidpi.png) no-repeat 0 -744px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__select_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -768px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon{background:url(icons_hidpi.png) no-repeat 0 -792px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textarea_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -816px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon{background:url(icons_hidpi.png) no-repeat 0 -840px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__textfield_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -864px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon{background:url(icons_hidpi.png) no-repeat 0 -888px!important;background-size:16px!important}.cke_hidpi .cke_button__horizontalrule_icon{background:url(icons_hidpi.png) no-repeat 0 -912px!important;background-size:16px!important}.cke_hidpi .cke_button__iframe_icon{background:url(icons_hidpi.png) no-repeat 0 -936px!important;background-size:16px!important}.cke_hidpi .cke_button__image_icon{background:url(icons_hidpi.png) no-repeat 0 -960px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__indent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -984px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon{background:url(icons_hidpi.png) no-repeat 0 -1008px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__outdent_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1032px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon{background:url(icons_hidpi.png) no-repeat 0 -1056px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyblock_icon{background:url(icons_hidpi.png) no-repeat 0 -1080px!important;background-size:16px!important}.cke_hidpi .cke_button__justifycenter_icon{background:url(icons_hidpi.png) no-repeat 0 -1104px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyleft_icon{background:url(icons_hidpi.png) no-repeat 0 -1128px!important;background-size:16px!important}.cke_hidpi .cke_button__justifyright_icon{background:url(icons_hidpi.png) no-repeat 0 -1152px!important;background-size:16px!important}.cke_hidpi .cke_button__language_icon{background:url(icons_hidpi.png) no-repeat 0 -1176px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__anchor_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -1200px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon{background:url(icons_hidpi.png) no-repeat 0 -1224px!important;background-size:16px!important}.cke_hidpi .cke_button__link_icon{background:url(icons_hidpi.png) no-repeat 0 -1248px!important;background-size:16px!important}.cke_hidpi .cke_button__unlink_icon{background:url(icons_hidpi.png) no-repeat 0 -1272px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1296px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1320px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1344px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon{background:url(icons_hidpi.png) no-repeat 0 -1368px!important;background-size:16px!important}.cke_hidpi .cke_button__mathjax_icon{background:url(icons_hidpi.png) no-repeat 0 -1392px!important;background-size:16px!important}.cke_hidpi .cke_button__maximize_icon{background:url(icons_hidpi.png) no-repeat 0 -1416px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__newpage_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1440px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon{background:url(icons_hidpi.png) no-repeat 0 -1464px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -1488px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon{background:url(icons_hidpi.png) no-repeat 0 -1512px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -1536px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon{background:url(icons_hidpi.png) no-repeat 0 -1560px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__pastetext_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -1584px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon{background:url(icons_hidpi.png) no-repeat 0 -1608px!important;background-size:16px!important}.cke_hidpi .cke_button__placeholder_icon{background:url(icons_hidpi.png) no-repeat 0 -1632px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__preview_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -1656px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon{background:url(icons_hidpi.png) no-repeat 0 -1680px!important;background-size:16px!important}.cke_hidpi .cke_button__print_icon{background:url(icons_hidpi.png) no-repeat 0 -1704px!important;background-size:16px!important}.cke_hidpi .cke_button__removeformat_icon{background:url(icons_hidpi.png) no-repeat 0 -1728px!important;background-size:16px!important}.cke_hidpi .cke_button__save_icon{background:url(icons_hidpi.png) no-repeat 0 -1752px!important;background-size:16px!important}.cke_hidpi .cke_button__scayt_icon{background:url(icons_hidpi.png) no-repeat 0 -1776px!important;background-size:16px!important}.cke_hidpi .cke_button__selectall_icon{background:url(icons_hidpi.png) no-repeat 0 -1800px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__showblocks_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -1824px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon{background:url(icons_hidpi.png) no-repeat 0 -1848px!important;background-size:16px!important}.cke_hidpi .cke_button__smiley_icon{background:url(icons_hidpi.png) no-repeat 0 -1872px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__source_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -1896px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon{background:url(icons_hidpi.png) no-repeat 0 -1920px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -1944px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon{background:url(icons_hidpi.png) no-repeat 0 -1968px!important;background-size:16px!important}.cke_hidpi .cke_button__specialchar_icon{background:url(icons_hidpi.png) no-repeat 0 -1992px!important;background-size:16px!important}.cke_hidpi .cke_button__table_icon{background:url(icons_hidpi.png) no-repeat 0 -2016px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__templates_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -2040px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon{background:url(icons_hidpi.png) no-repeat 0 -2064px!important;background-size:16px!important}.cke_hidpi .cke_button__uicolor_icon{background:url(icons_hidpi.png) no-repeat 0 -2088px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__redo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2112px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon{background:url(icons_hidpi.png) no-repeat 0 -2136px!important;background-size:16px!important}.cke_rtl.cke_hidpi .cke_button__undo_icon,.cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -2160px!important;background-size:16px!important}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon{background:url(icons_hidpi.png) no-repeat 0 -2184px!important;background-size:16px!important}.cke_hidpi .cke_button__simplebox_icon{background:url(icons_hidpi.png) no-repeat 0 -4416px!important}.cke_hidpi .cke_button__spellchecker_icon{background:url(icons_hidpi.png) no-repeat 0 -2232px!important;background-size:16px!important}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0} \ No newline at end of file diff --git a/bower_components/ckeditor/skins/moono/icons.png b/bower_components/ckeditor/skins/moono/icons.png new file mode 100644 index 0000000..163fd0d Binary files /dev/null and b/bower_components/ckeditor/skins/moono/icons.png differ diff --git a/bower_components/ckeditor/skins/moono/icons_hidpi.png b/bower_components/ckeditor/skins/moono/icons_hidpi.png new file mode 100644 index 0000000..c181faa Binary files /dev/null and b/bower_components/ckeditor/skins/moono/icons_hidpi.png differ diff --git a/bower_components/ckeditor/skins/moono/images/arrow.png b/bower_components/ckeditor/skins/moono/images/arrow.png new file mode 100644 index 0000000..d72b5f3 Binary files /dev/null and b/bower_components/ckeditor/skins/moono/images/arrow.png differ diff --git a/bower_components/ckeditor/skins/moono/images/close.png b/bower_components/ckeditor/skins/moono/images/close.png new file mode 100644 index 0000000..6a04ab5 Binary files /dev/null and b/bower_components/ckeditor/skins/moono/images/close.png differ diff --git a/bower_components/ckeditor/skins/moono/images/hidpi/close.png b/bower_components/ckeditor/skins/moono/images/hidpi/close.png new file mode 100644 index 0000000..e406c2c Binary files /dev/null and b/bower_components/ckeditor/skins/moono/images/hidpi/close.png differ diff --git a/bower_components/ckeditor/skins/moono/images/hidpi/lock-open.png b/bower_components/ckeditor/skins/moono/images/hidpi/lock-open.png new file mode 100644 index 0000000..edbd12f Binary files /dev/null and b/bower_components/ckeditor/skins/moono/images/hidpi/lock-open.png differ diff --git a/bower_components/ckeditor/skins/moono/images/hidpi/lock.png b/bower_components/ckeditor/skins/moono/images/hidpi/lock.png new file mode 100644 index 0000000..1b87bbb Binary files /dev/null and b/bower_components/ckeditor/skins/moono/images/hidpi/lock.png differ diff --git a/bower_components/ckeditor/skins/moono/images/hidpi/refresh.png b/bower_components/ckeditor/skins/moono/images/hidpi/refresh.png new file mode 100644 index 0000000..c6c2b86 Binary files /dev/null and b/bower_components/ckeditor/skins/moono/images/hidpi/refresh.png differ diff --git a/bower_components/ckeditor/skins/moono/images/lock-open.png b/bower_components/ckeditor/skins/moono/images/lock-open.png new file mode 100644 index 0000000..0476987 Binary files /dev/null and b/bower_components/ckeditor/skins/moono/images/lock-open.png differ diff --git a/bower_components/ckeditor/skins/moono/images/lock.png b/bower_components/ckeditor/skins/moono/images/lock.png new file mode 100644 index 0000000..c5a1440 Binary files /dev/null and b/bower_components/ckeditor/skins/moono/images/lock.png differ diff --git a/bower_components/ckeditor/skins/moono/images/refresh.png b/bower_components/ckeditor/skins/moono/images/refresh.png new file mode 100644 index 0000000..1ff63c3 Binary files /dev/null and b/bower_components/ckeditor/skins/moono/images/refresh.png differ diff --git a/bower_components/ckeditor/skins/moono/readme.md b/bower_components/ckeditor/skins/moono/readme.md new file mode 100644 index 0000000..e3abd58 --- /dev/null +++ b/bower_components/ckeditor/skins/moono/readme.md @@ -0,0 +1,51 @@ +"Moono" Skin +==================== + +This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor +[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by +the CKEditor team. "Moono" is maintained by the core developers. + +For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK) +documentation. + +Features +------------------- +"Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency. +It comes with the following features: + +- Chameleon feature with brightness, +- high-contrast compatibility, +- graphics source provided in SVG. + +Directory Structure +------------------- + +CSS parts: +- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance, +- **mainui.css**: the file contains styles of entire editor outline structures, +- **toolbar.css**: the file contains styles of the editor toolbar space (top), +- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar, +- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded +until the first panel open up, +- **elementspath.css**: the file contains styles of the editor elements path bar (bottom), +- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down, +it's not loaded until the first menu open up, +- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open, +- **reset.css**: the file defines the basis of style resets among all editor UI spaces, +- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference, +- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks. + +Other parts: +- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature, +- **icons/**: contains all skin defined icons, +- **images/**: contains a fill general used images, +- **dev/**: contains SVG source of the skin icons. + +License +------- + +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). + +See LICENSE.md for more information. diff --git a/bower_components/ckeditor/styles.js b/bower_components/ckeditor/styles.js new file mode 100644 index 0000000..38bb680 --- /dev/null +++ b/bower_components/ckeditor/styles.js @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +// This file contains style definitions that can be used by CKEditor plugins. +// +// The most common use for it is the "stylescombo" plugin, which shows a combo +// in the editor toolbar, containing all styles. Other plugins instead, like +// the div plugin, use a subset of the styles on their feature. +// +// If you don't have plugins that depend on this file, you can simply ignore it. +// Otherwise it is strongly recommended to customize this file to match your +// website requirements and design properly. + +CKEDITOR.stylesSet.add( 'default', [ + /* Block Styles */ + + // These styles are already available in the "Format" combo ("format" plugin), + // so they are not needed here by default. You may enable them to avoid + // placing the "Format" combo in the toolbar, maintaining the same features. + /* + { name: 'Paragraph', element: 'p' }, + { name: 'Heading 1', element: 'h1' }, + { name: 'Heading 2', element: 'h2' }, + { name: 'Heading 3', element: 'h3' }, + { name: 'Heading 4', element: 'h4' }, + { name: 'Heading 5', element: 'h5' }, + { name: 'Heading 6', element: 'h6' }, + { name: 'Preformatted Text',element: 'pre' }, + { name: 'Address', element: 'address' }, + */ + + { name: 'Italic Title', element: 'h2', styles: { 'font-style': 'italic' } }, + { name: 'Subtitle', element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } }, + { + name: 'Special Container', + element: 'div', + styles: { + padding: '5px 10px', + background: '#eee', + border: '1px solid #ccc' + } + }, + + /* Inline Styles */ + + // These are core styles available as toolbar buttons. You may opt enabling + // some of them in the Styles combo, removing them from the toolbar. + // (This requires the "stylescombo" plugin) + /* + { name: 'Strong', element: 'strong', overrides: 'b' }, + { name: 'Emphasis', element: 'em' , overrides: 'i' }, + { name: 'Underline', element: 'u' }, + { name: 'Strikethrough', element: 'strike' }, + { name: 'Subscript', element: 'sub' }, + { name: 'Superscript', element: 'sup' }, + */ + + { name: 'Marker', element: 'span', attributes: { 'class': 'marker' } }, + + { name: 'Big', element: 'big' }, + { name: 'Small', element: 'small' }, + { name: 'Typewriter', element: 'tt' }, + + { name: 'Computer Code', element: 'code' }, + { name: 'Keyboard Phrase', element: 'kbd' }, + { name: 'Sample Text', element: 'samp' }, + { name: 'Variable', element: 'var' }, + + { name: 'Deleted Text', element: 'del' }, + { name: 'Inserted Text', element: 'ins' }, + + { name: 'Cited Work', element: 'cite' }, + { name: 'Inline Quotation', element: 'q' }, + + { name: 'Language: RTL', element: 'span', attributes: { 'dir': 'rtl' } }, + { name: 'Language: LTR', element: 'span', attributes: { 'dir': 'ltr' } }, + + /* Object Styles */ + + { + name: 'Styled image (left)', + element: 'img', + attributes: { 'class': 'left' } + }, + + { + name: 'Styled image (right)', + element: 'img', + attributes: { 'class': 'right' } + }, + + { + name: 'Compact table', + element: 'table', + attributes: { + cellpadding: '5', + cellspacing: '0', + border: '1', + bordercolor: '#ccc' + }, + styles: { + 'border-collapse': 'collapse' + } + }, + + { name: 'Borderless Table', element: 'table', styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } }, + { name: 'Square Bulleted List', element: 'ul', styles: { 'list-style-type': 'square' } } +] ); + diff --git a/bower_components/components-modernizr/.bower.json b/bower_components/components-modernizr/.bower.json new file mode 100644 index 0000000..11a3476 --- /dev/null +++ b/bower_components/components-modernizr/.bower.json @@ -0,0 +1,25 @@ +{ + "name": "modernizr", + "version": "2.8.3", + "description": "Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user's browser.", + "homepage": "http://modernizr.com/", + "keywords": [ + "html5", + "css3", + "browser", + "feature detection" + ], + "author": "Modernizr ", + "main": [ + "modernizr.js" + ], + "_release": "2.8.3", + "_resolution": { + "type": "version", + "tag": "2.8.3", + "commit": "4115686a0f488b370b169e5a702d5028e7650bd3" + }, + "_source": "git://github.com/components/modernizr.git", + "_target": "~2.8.3", + "_originalSource": "components-modernizr" +} \ No newline at end of file diff --git a/bower_components/components-modernizr/.gitignore b/bower_components/components-modernizr/.gitignore new file mode 100644 index 0000000..c44899b --- /dev/null +++ b/bower_components/components-modernizr/.gitignore @@ -0,0 +1,4 @@ +vendor +build +node_modules +components diff --git a/bower_components/components-modernizr/LICENSE b/bower_components/components-modernizr/LICENSE new file mode 100644 index 0000000..b932df9 --- /dev/null +++ b/bower_components/components-modernizr/LICENSE @@ -0,0 +1 @@ +/* Modernizr 3.0.0pre (Custom Build) | MIT & BSD */ diff --git a/bower_components/components-modernizr/README.md b/bower_components/components-modernizr/README.md new file mode 100644 index 0000000..79eea9d --- /dev/null +++ b/bower_components/components-modernizr/README.md @@ -0,0 +1,59 @@ +# Modernizr [![Build Status](https://secure.travis-ci.org/Modernizr/Modernizr.png?branch=master)](http://travis-ci.org/Modernizr/Modernizr) + +##### Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user’s browser. + +- [Website](http://www.modernizr.com) +- [Documentation](http://www.modernizr.com/docs/) + +Modernizr tests which native CSS3 and HTML5 features are available in the current UA and makes the results available to you in two ways: as properties on a global `Modernizr` object, and as classes on the `` element. This information allows you to progressively enhance your pages with a granular level of control over the experience. + +Modernizr has an optional (*not included*) conditional resource loader called `Modernizr.load()`, based on [Yepnope.js](http://yepnopejs.com). You can get a build that includes `Modernizr.load()`, as well as choosing which feature tests to include on the [Download page](http://www.modernizr.com/download/). + + +## Test suite + +Run the [test suite](http://modernizr.github.com/Modernizr/test/) + + +## Building Modernizr v3 + +### To generate everything in 'config-all.json': + +```js +grunt build +//outputs to ./dist/modernizr-build.js +``` + +### To run tests (in phantom): + +```js +grunt qunit +``` + +### To run tests (in browser): + +```shell +grunt build +serve . +visit /tests +``` + +### To see simple build in browser: + +serve the root dir, `/test/modular.html` + + +### To see the build tool: + + +* checkout the modernizr.com code +* install all your gems and bundles and jekyll and shit +* `jekyll` +* `serve ./_sites` +* visit /download +* It should be just a big list of things you can build with no frills. + + +## License + +MIT license diff --git a/bower_components/components-modernizr/bower.json b/bower_components/components-modernizr/bower.json new file mode 100644 index 0000000..f692afc --- /dev/null +++ b/bower_components/components-modernizr/bower.json @@ -0,0 +1,16 @@ +{ + "name": "modernizr", + "version": "2.8.3", + "description": "Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user's browser.", + "homepage": "http://modernizr.com/", + "keywords": [ + "html5", + "css3", + "browser", + "feature detection" + ], + "author": "Modernizr ", + "main": [ + "modernizr.js" + ] +} diff --git a/bower_components/components-modernizr/component.json b/bower_components/components-modernizr/component.json new file mode 100644 index 0000000..d14aa52 --- /dev/null +++ b/bower_components/components-modernizr/component.json @@ -0,0 +1,18 @@ +{ + "name": "modernizr", + "repo": "components/modernizr", + "version": "2.8.3", + "description": "Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user's browser.", + "homepage": "http://modernizr.com/", + "keywords": [ + "html5", + "css3", + "browser", + "feature detection" + ], + "author": "Modernizr ", + "main": "modernizr.js", + "scripts": [ + "modernizr.js" + ] +} diff --git a/bower_components/components-modernizr/composer.json b/bower_components/components-modernizr/composer.json new file mode 100644 index 0000000..18083c3 --- /dev/null +++ b/bower_components/components-modernizr/composer.json @@ -0,0 +1,39 @@ +{ + "name": "components/modernizr", + "description": "Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user's browser.", + "keywords": [ + "html5", + "css3", + "browser", + "feature detection" + ], + "type": "component", + "homepage": "http://modernizr.com", + "license": "MIT", + "authors": [ + { + "name": "Modernizr", + "homepage": "http://modernizr.com" + }, + { "name": "Faruk Ates" }, + { "name": "Paul Irish" }, + { "name": "Alex Sexton" }, + { "name": "Ryan Seddon" }, + { "name": "Alexander Farkas" }, + { "name": "Ben Alman" }, + { "name": "Stu Cox" } + ], + "require": { + "robloach/component-installer": "*" + }, + "extra": { + "component": { + "scripts": [ + "modernizr.js" + ], + "shim": { + "exports": "window.Modernizr" + } + } + } +} diff --git a/bower_components/components-modernizr/modernizr.js b/bower_components/components-modernizr/modernizr.js new file mode 100644 index 0000000..3365339 --- /dev/null +++ b/bower_components/components-modernizr/modernizr.js @@ -0,0 +1,1406 @@ +/*! + * Modernizr v2.8.3 + * www.modernizr.com + * + * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton + * Available under the BSD and MIT licenses: www.modernizr.com/license/ + */ + +/* + * Modernizr tests which native CSS3 and HTML5 features are available in + * the current UA and makes the results available to you in two ways: + * as properties on a global Modernizr object, and as classes on the + * element. This information allows you to progressively enhance + * your pages with a granular level of control over the experience. + * + * Modernizr has an optional (not included) conditional resource loader + * called Modernizr.load(), based on Yepnope.js (yepnopejs.com). + * To get a build that includes Modernizr.load(), as well as choosing + * which tests to include, go to www.modernizr.com/download/ + * + * Authors Faruk Ates, Paul Irish, Alex Sexton + * Contributors Ryan Seddon, Ben Alman + */ + +window.Modernizr = (function( window, document, undefined ) { + + var version = '2.8.3', + + Modernizr = {}, + + /*>>cssclasses*/ + // option for enabling the HTML classes to be added + enableClasses = true, + /*>>cssclasses*/ + + docElement = document.documentElement, + + /** + * Create our "modernizr" element that we do most feature tests on. + */ + mod = 'modernizr', + modElem = document.createElement(mod), + mStyle = modElem.style, + + /** + * Create the input element for various Web Forms feature tests. + */ + inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ , + + /*>>smile*/ + smile = ':)', + /*>>smile*/ + + toString = {}.toString, + + // TODO :: make the prefixes more granular + /*>>prefixes*/ + // List of property values to set for css tests. See ticket #21 + prefixes = ' -webkit- -moz- -o- -ms- '.split(' '), + /*>>prefixes*/ + + /*>>domprefixes*/ + // Following spec is to expose vendor-specific style properties as: + // elem.style.WebkitBorderRadius + // and the following would be incorrect: + // elem.style.webkitBorderRadius + + // Webkit ghosts their properties in lowercase but Opera & Moz do not. + // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+ + // erik.eae.net/archives/2008/03/10/21.48.10/ + + // More here: github.com/Modernizr/Modernizr/issues/issue/21 + omPrefixes = 'Webkit Moz O ms', + + cssomPrefixes = omPrefixes.split(' '), + + domPrefixes = omPrefixes.toLowerCase().split(' '), + /*>>domprefixes*/ + + /*>>ns*/ + ns = {'svg': 'http://www.w3.org/2000/svg'}, + /*>>ns*/ + + tests = {}, + inputs = {}, + attrs = {}, + + classes = [], + + slice = classes.slice, + + featureName, // used in testing loop + + + /*>>teststyles*/ + // Inject element with style element and some CSS rules + injectElementWithStyles = function( rule, callback, nodes, testnames ) { + + var style, ret, node, docOverflow, + div = document.createElement('div'), + // After page load injecting a fake body doesn't work so check if body exists + body = document.body, + // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it. + fakeBody = body || document.createElement('body'); + + if ( parseInt(nodes, 10) ) { + // In order not to give false positives we create a node for each test + // This also allows the method to scale for unspecified uses + while ( nodes-- ) { + node = document.createElement('div'); + node.id = testnames ? testnames[nodes] : mod + (nodes + 1); + div.appendChild(node); + } + } + + // '].join(''); + div.id = mod; + // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody. + // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270 + (body ? div : fakeBody).innerHTML += style; + fakeBody.appendChild(div); + if ( !body ) { + //avoid crashing IE8, if background image is used + fakeBody.style.background = ''; + //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible + fakeBody.style.overflow = 'hidden'; + docOverflow = docElement.style.overflow; + docElement.style.overflow = 'hidden'; + docElement.appendChild(fakeBody); + } + + ret = callback(div, rule); + // If this is done after page load we don't want to remove the body so check if body exists + if ( !body ) { + fakeBody.parentNode.removeChild(fakeBody); + docElement.style.overflow = docOverflow; + } else { + div.parentNode.removeChild(div); + } + + return !!ret; + + }, + /*>>teststyles*/ + + /*>>mq*/ + // adapted from matchMedia polyfill + // by Scott Jehl and Paul Irish + // gist.github.com/786768 + testMediaQuery = function( mq ) { + + var matchMedia = window.matchMedia || window.msMatchMedia; + if ( matchMedia ) { + return matchMedia(mq) && matchMedia(mq).matches || false; + } + + var bool; + + injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) { + bool = (window.getComputedStyle ? + getComputedStyle(node, null) : + node.currentStyle)['position'] == 'absolute'; + }); + + return bool; + + }, + /*>>mq*/ + + + /*>>hasevent*/ + // + // isEventSupported determines if a given element supports the given event + // kangax.github.com/iseventsupported/ + // + // The following results are known incorrects: + // Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative + // Modernizr.hasEvent("textInput") // in Webkit. github.com/Modernizr/Modernizr/issues/333 + // ... + isEventSupported = (function() { + + var TAGNAMES = { + 'select': 'input', 'change': 'input', + 'submit': 'form', 'reset': 'form', + 'error': 'img', 'load': 'img', 'abort': 'img' + }; + + function isEventSupported( eventName, element ) { + + element = element || document.createElement(TAGNAMES[eventName] || 'div'); + eventName = 'on' + eventName; + + // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those + var isSupported = eventName in element; + + if ( !isSupported ) { + // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element + if ( !element.setAttribute ) { + element = document.createElement('div'); + } + if ( element.setAttribute && element.removeAttribute ) { + element.setAttribute(eventName, ''); + isSupported = is(element[eventName], 'function'); + + // If property was created, "remove it" (by setting value to `undefined`) + if ( !is(element[eventName], 'undefined') ) { + element[eventName] = undefined; + } + element.removeAttribute(eventName); + } + } + + element = null; + return isSupported; + } + return isEventSupported; + })(), + /*>>hasevent*/ + + // TODO :: Add flag for hasownprop ? didn't last time + + // hasOwnProperty shim by kangax needed for Safari 2.0 support + _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp; + + if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) { + hasOwnProp = function (object, property) { + return _hasOwnProperty.call(object, property); + }; + } + else { + hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */ + return ((property in object) && is(object.constructor.prototype[property], 'undefined')); + }; + } + + // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js + // es5.github.com/#x15.3.4.5 + + if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { + + var target = this; + + if (typeof target != "function") { + throw new TypeError(); + } + + var args = slice.call(arguments, 1), + bound = function () { + + if (this instanceof bound) { + + var F = function(){}; + F.prototype = target.prototype; + var self = new F(); + + var result = target.apply( + self, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return self; + + } else { + + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + + return bound; + }; + } + + /** + * setCss applies given styles to the Modernizr DOM node. + */ + function setCss( str ) { + mStyle.cssText = str; + } + + /** + * setCssAll extrapolates all vendor-specific css strings. + */ + function setCssAll( str1, str2 ) { + return setCss(prefixes.join(str1 + ';') + ( str2 || '' )); + } + + /** + * is returns a boolean for if typeof obj is exactly type. + */ + function is( obj, type ) { + return typeof obj === type; + } + + /** + * contains returns a boolean for if substr is found within str. + */ + function contains( str, substr ) { + return !!~('' + str).indexOf(substr); + } + + /*>>testprop*/ + + // testProps is a generic CSS / DOM property test. + + // In testing support for a given CSS property, it's legit to test: + // `elem.style[styleName] !== undefined` + // If the property is supported it will return an empty string, + // if unsupported it will return undefined. + + // We'll take advantage of this quick test and skip setting a style + // on our modernizr element, but instead just testing undefined vs + // empty string. + + // Because the testing of the CSS property names (with "-", as + // opposed to the camelCase DOM properties) is non-portable and + // non-standard but works in WebKit and IE (but not Gecko or Opera), + // we explicitly reject properties with dashes so that authors + // developing in WebKit or IE first don't end up with + // browser-specific content by accident. + + function testProps( props, prefixed ) { + for ( var i in props ) { + var prop = props[i]; + if ( !contains(prop, "-") && mStyle[prop] !== undefined ) { + return prefixed == 'pfx' ? prop : true; + } + } + return false; + } + /*>>testprop*/ + + // TODO :: add testDOMProps + /** + * testDOMProps is a generic DOM property test; if a browser supports + * a certain property, it won't return undefined for it. + */ + function testDOMProps( props, obj, elem ) { + for ( var i in props ) { + var item = obj[props[i]]; + if ( item !== undefined) { + + // return the property name as a string + if (elem === false) return props[i]; + + // let's bind a function + if (is(item, 'function')){ + // default to autobind unless override + return item.bind(elem || obj); + } + + // return the unbound function or obj or value + return item; + } + } + return false; + } + + /*>>testallprops*/ + /** + * testPropsAll tests a list of DOM properties we want to check against. + * We specify literally ALL possible (known and/or likely) properties on + * the element including the non-vendor prefixed one, for forward- + * compatibility. + */ + function testPropsAll( prop, prefixed, elem ) { + + var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1), + props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' '); + + // did they call .prefixed('boxSizing') or are we just testing a prop? + if(is(prefixed, "string") || is(prefixed, "undefined")) { + return testProps(props, prefixed); + + // otherwise, they called .prefixed('requestAnimationFrame', window[, elem]) + } else { + props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' '); + return testDOMProps(props, prefixed, elem); + } + } + /*>>testallprops*/ + + + /** + * Tests + * ----- + */ + + // The *new* flexbox + // dev.w3.org/csswg/css3-flexbox + + tests['flexbox'] = function() { + return testPropsAll('flexWrap'); + }; + + // The *old* flexbox + // www.w3.org/TR/2009/WD-css3-flexbox-20090723/ + + tests['flexboxlegacy'] = function() { + return testPropsAll('boxDirection'); + }; + + // On the S60 and BB Storm, getContext exists, but always returns undefined + // so we actually have to call getContext() to verify + // github.com/Modernizr/Modernizr/issues/issue/97/ + + tests['canvas'] = function() { + var elem = document.createElement('canvas'); + return !!(elem.getContext && elem.getContext('2d')); + }; + + tests['canvastext'] = function() { + return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function')); + }; + + // webk.it/70117 is tracking a legit WebGL feature detect proposal + + // We do a soft detect which may false positive in order to avoid + // an expensive context creation: bugzil.la/732441 + + tests['webgl'] = function() { + return !!window.WebGLRenderingContext; + }; + + /* + * The Modernizr.touch test only indicates if the browser supports + * touch events, which does not necessarily reflect a touchscreen + * device, as evidenced by tablets running Windows 7 or, alas, + * the Palm Pre / WebOS (touch) phones. + * + * Additionally, Chrome (desktop) used to lie about its support on this, + * but that has since been rectified: crbug.com/36415 + * + * We also test for Firefox 4 Multitouch Support. + * + * For more info, see: modernizr.github.com/Modernizr/touch.html + */ + + tests['touch'] = function() { + var bool; + + if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) { + bool = true; + } else { + injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) { + bool = node.offsetTop === 9; + }); + } + + return bool; + }; + + + // geolocation is often considered a trivial feature detect... + // Turns out, it's quite tricky to get right: + // + // Using !!navigator.geolocation does two things we don't want. It: + // 1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513 + // 2. Disables page caching in WebKit: webk.it/43956 + // + // Meanwhile, in Firefox < 8, an about:config setting could expose + // a false positive that would throw an exception: bugzil.la/688158 + + tests['geolocation'] = function() { + return 'geolocation' in navigator; + }; + + + tests['postmessage'] = function() { + return !!window.postMessage; + }; + + + // Chrome incognito mode used to throw an exception when using openDatabase + // It doesn't anymore. + tests['websqldatabase'] = function() { + return !!window.openDatabase; + }; + + // Vendors had inconsistent prefixing with the experimental Indexed DB: + // - Webkit's implementation is accessible through webkitIndexedDB + // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB + // For speed, we don't test the legacy (and beta-only) indexedDB + tests['indexedDB'] = function() { + return !!testPropsAll("indexedDB", window); + }; + + // documentMode logic from YUI to filter out IE8 Compat Mode + // which false positives. + tests['hashchange'] = function() { + return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7); + }; + + // Per 1.6: + // This used to be Modernizr.historymanagement but the longer + // name has been deprecated in favor of a shorter and property-matching one. + // The old API is still available in 1.6, but as of 2.0 will throw a warning, + // and in the first release thereafter disappear entirely. + tests['history'] = function() { + return !!(window.history && history.pushState); + }; + + tests['draganddrop'] = function() { + var div = document.createElement('div'); + return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div); + }; + + // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10 + // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17. + // FF10 still uses prefixes, so check for it until then. + // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/ + tests['websockets'] = function() { + return 'WebSocket' in window || 'MozWebSocket' in window; + }; + + + // css-tricks.com/rgba-browser-support/ + tests['rgba'] = function() { + // Set an rgba() color and check the returned value + + setCss('background-color:rgba(150,255,150,.5)'); + + return contains(mStyle.backgroundColor, 'rgba'); + }; + + tests['hsla'] = function() { + // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally, + // except IE9 who retains it as hsla + + setCss('background-color:hsla(120,40%,100%,.5)'); + + return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla'); + }; + + tests['multiplebgs'] = function() { + // Setting multiple images AND a color on the background shorthand property + // and then querying the style.background property value for the number of + // occurrences of "url(" is a reliable method for detecting ACTUAL support for this! + + setCss('background:url(https://),url(https://),red url(https://)'); + + // If the UA supports multiple backgrounds, there should be three occurrences + // of the string "url(" in the return value for elemStyle.background + + return (/(url\s*\(.*?){3}/).test(mStyle.background); + }; + + + + // this will false positive in Opera Mini + // github.com/Modernizr/Modernizr/issues/396 + + tests['backgroundsize'] = function() { + return testPropsAll('backgroundSize'); + }; + + tests['borderimage'] = function() { + return testPropsAll('borderImage'); + }; + + + // Super comprehensive table about all the unique implementations of + // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance + + tests['borderradius'] = function() { + return testPropsAll('borderRadius'); + }; + + // WebOS unfortunately false positives on this test. + tests['boxshadow'] = function() { + return testPropsAll('boxShadow'); + }; + + // FF3.0 will false positive on this test + tests['textshadow'] = function() { + return document.createElement('div').style.textShadow === ''; + }; + + + tests['opacity'] = function() { + // Browsers that actually have CSS Opacity implemented have done so + // according to spec, which means their return values are within the + // range of [0.0,1.0] - including the leading zero. + + setCssAll('opacity:.55'); + + // The non-literal . in this regex is intentional: + // German Chrome returns this value as 0,55 + // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632 + return (/^0.55$/).test(mStyle.opacity); + }; + + + // Note, Android < 4 will pass this test, but can only animate + // a single property at a time + // goo.gl/v3V4Gp + tests['cssanimations'] = function() { + return testPropsAll('animationName'); + }; + + + tests['csscolumns'] = function() { + return testPropsAll('columnCount'); + }; + + + tests['cssgradients'] = function() { + /** + * For CSS Gradients syntax, please see: + * webkit.org/blog/175/introducing-css-gradients/ + * developer.mozilla.org/en/CSS/-moz-linear-gradient + * developer.mozilla.org/en/CSS/-moz-radial-gradient + * dev.w3.org/csswg/css3-images/#gradients- + */ + + var str1 = 'background-image:', + str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));', + str3 = 'linear-gradient(left top,#9f9, white);'; + + setCss( + // legacy webkit syntax (FIXME: remove when syntax not in use anymore) + (str1 + '-webkit- '.split(' ').join(str2 + str1) + + // standard syntax // trailing 'background-image:' + prefixes.join(str3 + str1)).slice(0, -str1.length) + ); + + return contains(mStyle.backgroundImage, 'gradient'); + }; + + + tests['cssreflections'] = function() { + return testPropsAll('boxReflect'); + }; + + + tests['csstransforms'] = function() { + return !!testPropsAll('transform'); + }; + + + tests['csstransforms3d'] = function() { + + var ret = !!testPropsAll('perspective'); + + // Webkit's 3D transforms are passed off to the browser's own graphics renderer. + // It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in + // some conditions. As a result, Webkit typically recognizes the syntax but + // will sometimes throw a false positive, thus we must do a more thorough check: + if ( ret && 'webkitPerspective' in docElement.style ) { + + // Webkit allows this media query to succeed only if the feature is enabled. + // `@media (transform-3d),(-webkit-transform-3d){ ... }` + injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) { + ret = node.offsetLeft === 9 && node.offsetHeight === 3; + }); + } + return ret; + }; + + + tests['csstransitions'] = function() { + return testPropsAll('transition'); + }; + + + /*>>fontface*/ + // @font-face detection routine by Diego Perini + // javascript.nwbox.com/CSSSupport/ + + // false positives: + // WebOS github.com/Modernizr/Modernizr/issues/342 + // WP7 github.com/Modernizr/Modernizr/issues/538 + tests['fontface'] = function() { + var bool; + + injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) { + var style = document.getElementById('smodernizr'), + sheet = style.sheet || style.styleSheet, + cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : ''; + + bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0; + }); + + return bool; + }; + /*>>fontface*/ + + // CSS generated content detection + tests['generatedcontent'] = function() { + var bool; + + injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) { + bool = node.offsetHeight >= 3; + }); + + return bool; + }; + + + + // These tests evaluate support of the video/audio elements, as well as + // testing what types of content they support. + // + // We're using the Boolean constructor here, so that we can extend the value + // e.g. Modernizr.video // true + // Modernizr.video.ogg // 'probably' + // + // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845 + // thx to NielsLeenheer and zcorpan + + // Note: in some older browsers, "no" was a return value instead of empty string. + // It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2 + // It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5 + + tests['video'] = function() { + var elem = document.createElement('video'), + bool = false; + + // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224 + try { + if ( bool = !!elem.canPlayType ) { + bool = new Boolean(bool); + bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,''); + + // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546 + bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,''); + + bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,''); + } + + } catch(e) { } + + return bool; + }; + + tests['audio'] = function() { + var elem = document.createElement('audio'), + bool = false; + + try { + if ( bool = !!elem.canPlayType ) { + bool = new Boolean(bool); + bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,''); + bool.mp3 = elem.canPlayType('audio/mpeg;') .replace(/^no$/,''); + + // Mimetypes accepted: + // developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements + // bit.ly/iphoneoscodecs + bool.wav = elem.canPlayType('audio/wav; codecs="1"') .replace(/^no$/,''); + bool.m4a = ( elem.canPlayType('audio/x-m4a;') || + elem.canPlayType('audio/aac;')) .replace(/^no$/,''); + } + } catch(e) { } + + return bool; + }; + + + // In FF4, if disabled, window.localStorage should === null. + + // Normally, we could not test that directly and need to do a + // `('localStorage' in window) && ` test first because otherwise Firefox will + // throw bugzil.la/365772 if cookies are disabled + + // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem + // will throw the exception: + // QUOTA_EXCEEDED_ERRROR DOM Exception 22. + // Peculiarly, getItem and removeItem calls do not throw. + + // Because we are forced to try/catch this, we'll go aggressive. + + // Just FWIW: IE8 Compat mode supports these features completely: + // www.quirksmode.org/dom/html5.html + // But IE8 doesn't support either with local files + + tests['localstorage'] = function() { + try { + localStorage.setItem(mod, mod); + localStorage.removeItem(mod); + return true; + } catch(e) { + return false; + } + }; + + tests['sessionstorage'] = function() { + try { + sessionStorage.setItem(mod, mod); + sessionStorage.removeItem(mod); + return true; + } catch(e) { + return false; + } + }; + + + tests['webworkers'] = function() { + return !!window.Worker; + }; + + + tests['applicationcache'] = function() { + return !!window.applicationCache; + }; + + + // Thanks to Erik Dahlstrom + tests['svg'] = function() { + return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect; + }; + + // specifically for SVG inline in HTML, not within XHTML + // test page: paulirish.com/demo/inline-svg + tests['inlinesvg'] = function() { + var div = document.createElement('div'); + div.innerHTML = ''; + return (div.firstChild && div.firstChild.namespaceURI) == ns.svg; + }; + + // SVG SMIL animation + tests['smil'] = function() { + return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate'))); + }; + + // This test is only for clip paths in SVG proper, not clip paths on HTML content + // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg + + // However read the comments to dig into applying SVG clippaths to HTML content here: + // github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491 + tests['svgclippaths'] = function() { + return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath'))); + }; + + /*>>webforms*/ + // input features and input types go directly onto the ret object, bypassing the tests loop. + // Hold this guy to execute in a moment. + function webforms() { + /*>>input*/ + // Run through HTML5's new input attributes to see if the UA understands any. + // We're using f which is the element created early on + // Mike Taylr has created a comprehensive resource for testing these attributes + // when applied to all input types: + // miketaylr.com/code/input-type-attr.html + // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary + + // Only input placeholder is tested while textarea's placeholder is not. + // Currently Safari 4 and Opera 11 have support only for the input placeholder + // Both tests are available in feature-detects/forms-placeholder.js + Modernizr['input'] = (function( props ) { + for ( var i = 0, len = props.length; i < len; i++ ) { + attrs[ props[i] ] = !!(props[i] in inputElem); + } + if (attrs.list){ + // safari false positive's on datalist: webk.it/74252 + // see also github.com/Modernizr/Modernizr/issues/146 + attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement); + } + return attrs; + })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); + /*>>input*/ + + /*>>inputtypes*/ + // Run through HTML5's new input types to see if the UA understands any. + // This is put behind the tests runloop because it doesn't return a + // true/false like all the other tests; instead, it returns an object + // containing each input type with its corresponding true/false value + + // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/ + Modernizr['inputtypes'] = (function(props) { + + for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) { + + inputElem.setAttribute('type', inputElemType = props[i]); + bool = inputElem.type !== 'text'; + + // We first check to see if the type we give it sticks.. + // If the type does, we feed it a textual value, which shouldn't be valid. + // If the value doesn't stick, we know there's input sanitization which infers a custom UI + if ( bool ) { + + inputElem.value = smile; + inputElem.style.cssText = 'position:absolute;visibility:hidden;'; + + if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) { + + docElement.appendChild(inputElem); + defaultView = document.defaultView; + + // Safari 2-4 allows the smiley as a value, despite making a slider + bool = defaultView.getComputedStyle && + defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' && + // Mobile android web browser has false positive, so must + // check the height to see if the widget is actually there. + (inputElem.offsetHeight !== 0); + + docElement.removeChild(inputElem); + + } else if ( /^(search|tel)$/.test(inputElemType) ){ + // Spec doesn't define any special parsing or detectable UI + // behaviors so we pass these through as true + + // Interestingly, opera fails the earlier test, so it doesn't + // even make it here. + + } else if ( /^(url|email)$/.test(inputElemType) ) { + // Real url and email support comes with prebaked validation. + bool = inputElem.checkValidity && inputElem.checkValidity() === false; + + } else { + // If the upgraded input compontent rejects the :) text, we got a winner + bool = inputElem.value != smile; + } + } + + inputs[ props[i] ] = !!bool; + } + return inputs; + })('search tel url email datetime date month week time datetime-local number range color'.split(' ')); + /*>>inputtypes*/ + } + /*>>webforms*/ + + + // End of test definitions + // ----------------------- + + + + // Run through all tests and detect their support in the current UA. + // todo: hypothetically we could be doing an array of tests and use a basic loop here. + for ( var feature in tests ) { + if ( hasOwnProp(tests, feature) ) { + // run the test, throw the return value into the Modernizr, + // then based on that boolean, define an appropriate className + // and push it into an array of classes we'll join later. + featureName = feature.toLowerCase(); + Modernizr[featureName] = tests[feature](); + + classes.push((Modernizr[featureName] ? '' : 'no-') + featureName); + } + } + + /*>>webforms*/ + // input tests need to run. + Modernizr.input || webforms(); + /*>>webforms*/ + + + /** + * addTest allows the user to define their own feature tests + * the result will be added onto the Modernizr object, + * as well as an appropriate className set on the html element + * + * @param feature - String naming the feature + * @param test - Function returning true if feature is supported, false if not + */ + Modernizr.addTest = function ( feature, test ) { + if ( typeof feature == 'object' ) { + for ( var key in feature ) { + if ( hasOwnProp( feature, key ) ) { + Modernizr.addTest( key, feature[ key ] ); + } + } + } else { + + feature = feature.toLowerCase(); + + if ( Modernizr[feature] !== undefined ) { + // we're going to quit if you're trying to overwrite an existing test + // if we were to allow it, we'd do this: + // var re = new RegExp("\\b(no-)?" + feature + "\\b"); + // docElement.className = docElement.className.replace( re, '' ); + // but, no rly, stuff 'em. + return Modernizr; + } + + test = typeof test == 'function' ? test() : test; + + if (typeof enableClasses !== "undefined" && enableClasses) { + docElement.className += ' ' + (test ? '' : 'no-') + feature; + } + Modernizr[feature] = test; + + } + + return Modernizr; // allow chaining. + }; + + + // Reset modElem.cssText to nothing to reduce memory footprint. + setCss(''); + modElem = inputElem = null; + + /*>>shiv*/ + /** + * @preserve HTML5 Shiv prev3.7.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed + */ + ;(function(window, document) { + /*jshint evil:true */ + /** version */ + var version = '3.7.0'; + + /** Preset options */ + var options = window.html5 || {}; + + /** Used to skip problem elements */ + var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; + + /** Not all elements can be cloned in IE **/ + var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i; + + /** Detect whether the browser supports default html5 styles */ + var supportsHtml5Styles; + + /** Name of the expando, to work with multiple documents or to re-shiv one document */ + var expando = '_html5shiv'; + + /** The id for the the documents expando */ + var expanID = 0; + + /** Cached data for each document */ + var expandoData = {}; + + /** Detect whether the browser supports unknown elements */ + var supportsUnknownElements; + + (function() { + try { + var a = document.createElement('a'); + a.innerHTML = ''; + //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles + supportsHtml5Styles = ('hidden' in a); + + supportsUnknownElements = a.childNodes.length == 1 || (function() { + // assign a false positive if unable to shiv + (document.createElement)('a'); + var frag = document.createDocumentFragment(); + return ( + typeof frag.cloneNode == 'undefined' || + typeof frag.createDocumentFragment == 'undefined' || + typeof frag.createElement == 'undefined' + ); + }()); + } catch(e) { + // assign a false positive if detection fails => unable to shiv + supportsHtml5Styles = true; + supportsUnknownElements = true; + } + + }()); + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a style sheet with the given CSS text and adds it to the document. + * @private + * @param {Document} ownerDocument The document. + * @param {String} cssText The CSS text. + * @returns {StyleSheet} The style element. + */ + function addStyleSheet(ownerDocument, cssText) { + var p = ownerDocument.createElement('p'), + parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement; + + p.innerHTML = 'x'; + return parent.insertBefore(p.lastChild, parent.firstChild); + } + + /** + * Returns the value of `html5.elements` as an array. + * @private + * @returns {Array} An array of shived element node names. + */ + function getElements() { + var elements = html5.elements; + return typeof elements == 'string' ? elements.split(' ') : elements; + } + + /** + * Returns the data associated to the given document + * @private + * @param {Document} ownerDocument The document. + * @returns {Object} An object of data. + */ + function getExpandoData(ownerDocument) { + var data = expandoData[ownerDocument[expando]]; + if (!data) { + data = {}; + expanID++; + ownerDocument[expando] = expanID; + expandoData[expanID] = data; + } + return data; + } + + /** + * returns a shived element for the given nodeName and document + * @memberOf html5 + * @param {String} nodeName name of the element + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived element. + */ + function createElement(nodeName, ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createElement(nodeName); + } + if (!data) { + data = getExpandoData(ownerDocument); + } + var node; + + if (data.cache[nodeName]) { + node = data.cache[nodeName].cloneNode(); + } else if (saveClones.test(nodeName)) { + node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); + } else { + node = data.createElem(nodeName); + } + + // Avoid adding some elements to fragments in IE < 9 because + // * Attributes like `name` or `type` cannot be set/changed once an element + // is inserted into a document/fragment + // * Link elements with `src` attributes that are inaccessible, as with + // a 403 response, will cause the tab/window to crash + // * Script elements appended to fragments will execute when their `src` + // or `text` property is set + return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node; + } + + /** + * returns a shived DocumentFragment for the given document + * @memberOf html5 + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived DocumentFragment. + */ + function createDocumentFragment(ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createDocumentFragment(); + } + data = data || getExpandoData(ownerDocument); + var clone = data.frag.cloneNode(), + i = 0, + elems = getElements(), + l = elems.length; + for(;i>shiv*/ + + // Assign private properties to the return object with prefix + Modernizr._version = version; + + // expose these for the plugin API. Look in the source for how to join() them against your input + /*>>prefixes*/ + Modernizr._prefixes = prefixes; + /*>>prefixes*/ + /*>>domprefixes*/ + Modernizr._domPrefixes = domPrefixes; + Modernizr._cssomPrefixes = cssomPrefixes; + /*>>domprefixes*/ + + /*>>mq*/ + // Modernizr.mq tests a given media query, live against the current state of the window + // A few important notes: + // * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false + // * A max-width or orientation query will be evaluated against the current state, which may change later. + // * You must specify values. Eg. If you are testing support for the min-width media query use: + // Modernizr.mq('(min-width:0)') + // usage: + // Modernizr.mq('only screen and (max-width:768)') + Modernizr.mq = testMediaQuery; + /*>>mq*/ + + /*>>hasevent*/ + // Modernizr.hasEvent() detects support for a given event, with an optional element to test on + // Modernizr.hasEvent('gesturestart', elem) + Modernizr.hasEvent = isEventSupported; + /*>>hasevent*/ + + /*>>testprop*/ + // Modernizr.testProp() investigates whether a given style property is recognized + // Note that the property names must be provided in the camelCase variant. + // Modernizr.testProp('pointerEvents') + Modernizr.testProp = function(prop){ + return testProps([prop]); + }; + /*>>testprop*/ + + /*>>testallprops*/ + // Modernizr.testAllProps() investigates whether a given style property, + // or any of its vendor-prefixed variants, is recognized + // Note that the property names must be provided in the camelCase variant. + // Modernizr.testAllProps('boxSizing') + Modernizr.testAllProps = testPropsAll; + /*>>testallprops*/ + + + /*>>teststyles*/ + // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards + // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... }) + Modernizr.testStyles = injectElementWithStyles; + /*>>teststyles*/ + + + /*>>prefixed*/ + // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input + // Modernizr.prefixed('boxSizing') // 'MozBoxSizing' + + // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style. + // Return values will also be the camelCase variant, if you need to translate that to hypenated style use: + // + // str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-'); + + // If you're trying to ascertain which transition end event to bind to, you might do something like... + // + // var transEndEventNames = { + // 'WebkitTransition' : 'webkitTransitionEnd', + // 'MozTransition' : 'transitionend', + // 'OTransition' : 'oTransitionEnd', + // 'msTransition' : 'MSTransitionEnd', + // 'transition' : 'transitionend' + // }, + // transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ]; + + Modernizr.prefixed = function(prop, obj, elem){ + if(!obj) { + return testPropsAll(prop, 'pfx'); + } else { + // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame' + return testPropsAll(prop, obj, elem); + } + }; + /*>>prefixed*/ + + + /*>>cssclasses*/ + // Remove "no-js" class from element, if it exists: + docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') + + + // Add the new classes to the element. + (enableClasses ? ' js ' + classes.join(' ') : ''); + /*>>cssclasses*/ + + return Modernizr; + +})(this, this.document); diff --git a/bower_components/components-modernizr/package.json b/bower_components/components-modernizr/package.json new file mode 100644 index 0000000..1344701 --- /dev/null +++ b/bower_components/components-modernizr/package.json @@ -0,0 +1,32 @@ +{ + "name": "component-modernizr", + "version": "2.8.3", + "description": "Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user's browser.", + "repository": { + "type": "git", + "url": "git://github.com/component/modernizr.git" + }, + "bugs": { + "url": "https://github.com/component/modernizr/issues" + }, + "keywords": [ + "html5", + "css3", + "browser", + "feature detection" + ], + "author": { + "name": "Modernizr", + "url": "http://modernizr.com/" + }, + "contributors": [ + { "name": "Faruk Ates" }, + { "name": "Paul Irish" }, + { "name": "Alex Sexton" }, + { "name": "Ryan Seddon" }, + { "name": "Alexander Farkas" }, + { "name": "Ben Alman" }, + { "name": "Stu Cox" } + ], + "license": "MIT" +} diff --git a/bower_components/es5-shim/.bower.json b/bower_components/es5-shim/.bower.json new file mode 100644 index 0000000..3f80301 --- /dev/null +++ b/bower_components/es5-shim/.bower.json @@ -0,0 +1,43 @@ +{ + "name": "es5-shim", + "version": "4.1.0", + "main": "es5-shim.js", + "repository": { + "type": "git", + "url": "git://github.com/es-shims/es5-shim" + }, + "homepage": "https://github.com/es-shims/es5-shim", + "authors": [ + "Kris Kowal (http://github.com/kriskowal/)", + "Sami Samhuri (http://samhuri.net/)", + "Florian Schäfer (http://github.com/fschaefer)", + "Irakli Gozalishvili (http://jeditoolkit.com)", + "Kit Cambridge (http://kitcambridge.github.com)", + "Jordan Harband (https://github.com/ljharb/)" + ], + "description": "ECMAScript 5 compatibility shims for legacy JavaScript engines", + "keywords": [ + "shim", + "es5", + "es5 shim", + "javascript", + "ecmascript", + "polyfill" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "tests" + ], + "_release": "4.1.0", + "_resolution": { + "type": "version", + "tag": "v4.1.0", + "commit": "1f7e846f5c72480e19ef8f2a56dc04dae8deff29" + }, + "_source": "git://github.com/es-shims/es5-shim.git", + "_target": ">=3.4.0", + "_originalSource": "es5-shim" +} \ No newline at end of file diff --git a/bower_components/es5-shim/CHANGES b/bower_components/es5-shim/CHANGES new file mode 100644 index 0000000..5b1d61a --- /dev/null +++ b/bower_components/es5-shim/CHANGES @@ -0,0 +1,183 @@ +4.1.0 + - Update `eslint` + - Improve type checks: `Array.isArray`, `isRegex` + - Replace `isRegex`/`isString`/`isCallable` checks with inlined versions from npm modules + - Note which ES abstract methods are replaceable via `es-abstract` + - Run `travis-ci` tests on `iojs`! + +4.0.6 + - Update `jscs`, `uglify-js`, add `eslint` + - es5-sham: fix Object.defineProperty to not check for own properties (#211) + - Fix Array#splice bug in Safari 5 (#284) + - Fix `Object.keys` issue with boxed primitives with extra properties in older browsers. (#242, #285) + +4.0.5 + - Update `jscs` so tests pass + +4.0.4 + - Style/indentation/whitespace cleanups. + - README tweaks + +4.0.3 + - Fix keywords (#268) + - add some Date tests + - Note in README that the es5-sham requires the es5-shim (https://github.com/es-shims/es5-shim/issues/256#issuecomment-52875710) + +4.0.2 + - Start including version numbers in minified files (#267) + +4.0.1 + - Fix legacy arguments object detection in Object.keys (#260) + +4.0.0 + - No longer shim the ES5-spec behavior of splice when `deleteCount` is omitted - since no engines implement it, and ES6 changes it. (#255) + - Use Object.defineProperty where available, so that polyfills are non-enumerable when possible (#250) + - lots of internal refactoring + - Fixed a bug referencing String#indexOf and String#lastIndexOf before polyfilling it (#253, #254) + +3.4.0 + - Removed nonstandard SpiderMonkey extension to Array#splice - when `deleteCount` is omitted, it's now treated as 0. (#192, #239) + - Fix Object.keys with Arguments objects in Safari 5.0 + - Now shimming String#split in Opera 10.6 + - Avoid using "toString" as a variable name, since that breaks Opera + - Internal implementation and test cleanups + +3.3.2 + - Remove an internal "bind" call, which should make the shim a bit faster + - Fix a bug with object boxing in Array#reduceRight that was failing a test in IE 6 + +3.3.1 + - Fixing an Array#splice bug in IE 6/7 + - cleaning up Array#splice tests + +3.3.0 + - Fix Array#reduceRight in node 0.6 and older browsers (#238) + +3.2.0 + - Fix es5-sham UMD definition to work properly with AMD (#237) + - Ensure that Array methods do not autobox context in strict mode (#233) + +3.1.1 + - Update minified files (#231) + +3.1.0 + - Fix String#replace in Firefox up through 29 (#228) + +3.0.2 + - Fix `Function#bind` in IE 7 and 8 (#224, #225, #226) + +3.0.1 + - Version bump to ensure npm has newest minified assets + +3.0.0 + - es5-sham: fix `Object.getPrototypeOf` and `Object.getOwnPropertyDescriptor` for Opera Mini + - Better override noncompliant native ES5 methods: `Array#forEach`, `Array#map`, `Array#filter`, `Array#every`, `Array#some`, `Array#reduce`, `Date.parse`, `String#trim` + - Added spec-compliant shim for `parseInt` + - Ensure `Object.keys` handles more edge cases with `arguments` objects and boxed primitives + - Improve minification of builds + +2.3.0 + - parseInt is now properly shimmed in ES3 browsers to default the radix + - update URLs to point to the new organization + +2.2.0 + - Function.prototype.bind shim now reports correct length on a bound function + - fix node 0.6.x v8 bug in Array#forEach + - test improvements + +2.1.0 + - Object.create fixes + - tweaks to the Object.defineProperties shim + +2.0.0 + - Separate reliable shims from dubious shims (shams). + +1.2.10 + - Group-effort Style Cleanup + - Took a stab at fixing Object.defineProperty on IE8 without + bad side-effects. (@hax) + - Object.isExtensible no longer fakes it. (@xavierm) + - Date.prototype.toISOString no longer deals with partial + ISO dates, per spec (@kitcambridge) + - More (mostly from @bryanforbes) + +1.2.9 + - Corrections to toISOString by @kitcambridge + - Fixed three bugs in array methods revealed by Jasmine tests. + - Cleaned up Function.prototype.bind with more fixes and tests from + @bryanforbes. + +1.2.8 + - Actually fixed problems with Function.prototype.bind, and regressions + from 1.2.7 (@bryanforbes, @jdalton #36) + +1.2.7 - REGRESSED + - Fixed problems with Function.prototype.bind when called as a constructor. + (@jdalton #36) + +1.2.6 + - Revised Date.parse to match ES 5.1 (kitcambridge) + +1.2.5 + - Fixed a bug for padding it Date..toISOString (tadfisher issue #33) + +1.2.4 + - Fixed a descriptor bug in Object.defineProperty (raynos) + +1.2.3 + - Cleaned up RequireJS and +``` + +The script must be loaded prior to instantiating FastClick on any element of the page. + +To instantiate FastClick on the `body`, which is the recommended method of use: + +```js +if ('addEventListener' in document) { + document.addEventListener('DOMContentLoaded', function() { + FastClick.attach(document.body); + }, false); +} +``` + +Or, if you're using jQuery: + +```js +$(function() { + FastClick.attach(document.body); +}); +``` + +If you're using Browserify or another CommonJS-style module system, the `FastClick.attach` function will be returned when you call `require('fastclick')`. As a result, the easiest way to use FastClick with these loaders is as follows: + +```js +var attachFastClick = require('fastclick'); +attachFastClick(document.body); +``` + +### Minified ### + +Run `make` to build a minified version of FastClick using the Closure Compiler REST API. The minified file is saved to `build/fastclick.min.js` or you can [download a pre-minified version](http://build.origami.ft.com/bundles/js?modules=fastclick). + +Note: the pre-minified version is built using [our build service](http://origami.ft.com/docs/developer-guide/build-service/) which exposes the `FastClick` object through `Origami.fastclick` and will have the Browserify/CommonJS API (see above). + +```js +var attachFastClick = Origami.fastclick; +attachFastClick(document.body); +``` + +### AMD ### + +FastClick has AMD (Asynchronous Module Definition) support. This allows it to be lazy-loaded with an AMD loader, such as [RequireJS](http://requirejs.org/). Note that when using the AMD style require, the full `FastClick` object will be returned, _not_ `FastClick.attach` + +```js +var FastClick = require('fastclick'); +FastClick.attach(document.body, options); +``` + +### Package managers ### + +You can install FastClick using [Component](https://github.com/component/component), [npm](https://npmjs.org/package/fastclick) or [Bower](http://bower.io/). + +For Ruby, there's a third-party gem called [fastclick-rails](http://rubygems.org/gems/fastclick-rails). For .NET there's a [NuGet package](http://nuget.org/packages/FastClick). + +## Advanced ## + +### Ignore certain elements with `needsclick` ### + +Sometimes you need FastClick to ignore certain elements. You can do this easily by adding the `needsclick` class. +```html +Ignored by FastClick +``` + +#### Use case 1: non-synthetic click required #### + +Internally, FastClick uses `document.createEvent` to fire a synthetic `click` event as soon as `touchend` is fired by the browser. It then suppresses the additional `click` event created by the browser after that. In some cases, the non-synthetic `click` event created by the browser is required, as described in the [triggering focus example](http://ftlabs.github.com/fastclick/examples/focus.html). + +This is where the `needsclick` class comes in. Add the class to any element that requires a non-synthetic click. + +#### Use case 2: Twitter Bootstrap 2.2.2 dropdowns #### + +Another example of when to use the `needsclick` class is with dropdowns in Twitter Bootstrap 2.2.2. Bootstrap add its own `touchstart` listener for dropdowns, so you want to tell FastClick to ignore those. If you don't, touch devices will automatically close the dropdown as soon as it is clicked, because both FastClick and Bootstrap execute the synthetic click, one opens the dropdown, the second closes it immediately after. + +```html +Dropdown +``` + +## Examples ## + +FastClick is designed to cope with many different browser oddities. Here are some examples to illustrate this: + +* [basic use](http://ftlabs.github.com/fastclick/examples/layer.html) showing the increase in perceived responsiveness +* [triggering focus](http://ftlabs.github.com/fastclick/examples/focus.html) on an input element from a `click` handler +* [input element](http://ftlabs.github.com/fastclick/examples/input.html) which never receives clicks but gets fast focus + +## Tests ## + +There are no automated tests. The files in `tests/` are manual reduced test cases. We've had a think about how best to test these cases, but they tend to be very browser/device specific and sometimes subjective which means it's not so trivial to test. + +## Credits and collaboration ## + +FastClick is maintained by [Rowan Beentje](http://twitter.com/rowanbeentje), [Matthew Caruana Galizia](http://twitter.com/mcaruanagalizia) and [Matthew Andrews](http://twitter.com/andrewsmatt) at [FT Labs](http://labs.ft.com). All open source code released by FT Labs is licenced under the MIT licence. We welcome comments, feedback and suggestions. Please feel free to raise an issue or pull request. diff --git a/bower_components/fastclick/bower.json b/bower_components/fastclick/bower.json new file mode 100644 index 0000000..18e1abd --- /dev/null +++ b/bower_components/fastclick/bower.json @@ -0,0 +1,12 @@ +{ + "name": "fastclick", + "main": "lib/fastclick.js", + "ignore": [ + "**/.*", + "component.json", + "package.json", + "Makefile", + "tests", + "examples" + ] +} diff --git a/bower_components/fastclick/lib/fastclick.js b/bower_components/fastclick/lib/fastclick.js new file mode 100644 index 0000000..3af4f9d --- /dev/null +++ b/bower_components/fastclick/lib/fastclick.js @@ -0,0 +1,841 @@ +;(function () { + 'use strict'; + + /** + * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs. + * + * @codingstandard ftlabs-jsv2 + * @copyright The Financial Times Limited [All Rights Reserved] + * @license MIT License (see LICENSE.txt) + */ + + /*jslint browser:true, node:true*/ + /*global define, Event, Node*/ + + + /** + * Instantiate fast-clicking listeners on the specified layer. + * + * @constructor + * @param {Element} layer The layer to listen on + * @param {Object} [options={}] The options to override the defaults + */ + function FastClick(layer, options) { + var oldOnClick; + + options = options || {}; + + /** + * Whether a click is currently being tracked. + * + * @type boolean + */ + this.trackingClick = false; + + + /** + * Timestamp for when click tracking started. + * + * @type number + */ + this.trackingClickStart = 0; + + + /** + * The element being tracked for a click. + * + * @type EventTarget + */ + this.targetElement = null; + + + /** + * X-coordinate of touch start event. + * + * @type number + */ + this.touchStartX = 0; + + + /** + * Y-coordinate of touch start event. + * + * @type number + */ + this.touchStartY = 0; + + + /** + * ID of the last touch, retrieved from Touch.identifier. + * + * @type number + */ + this.lastTouchIdentifier = 0; + + + /** + * Touchmove boundary, beyond which a click will be cancelled. + * + * @type number + */ + this.touchBoundary = options.touchBoundary || 10; + + + /** + * The FastClick layer. + * + * @type Element + */ + this.layer = layer; + + /** + * The minimum time between tap(touchstart and touchend) events + * + * @type number + */ + this.tapDelay = options.tapDelay || 200; + + /** + * The maximum time for a tap + * + * @type number + */ + this.tapTimeout = options.tapTimeout || 700; + + if (FastClick.notNeeded(layer)) { + return; + } + + // Some old versions of Android don't have Function.prototype.bind + function bind(method, context) { + return function() { return method.apply(context, arguments); }; + } + + + var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel']; + var context = this; + for (var i = 0, l = methods.length; i < l; i++) { + context[methods[i]] = bind(context[methods[i]], context); + } + + // Set up event handlers as required + if (deviceIsAndroid) { + layer.addEventListener('mouseover', this.onMouse, true); + layer.addEventListener('mousedown', this.onMouse, true); + layer.addEventListener('mouseup', this.onMouse, true); + } + + layer.addEventListener('click', this.onClick, true); + layer.addEventListener('touchstart', this.onTouchStart, false); + layer.addEventListener('touchmove', this.onTouchMove, false); + layer.addEventListener('touchend', this.onTouchEnd, false); + layer.addEventListener('touchcancel', this.onTouchCancel, false); + + // Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) + // which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick + // layer when they are cancelled. + if (!Event.prototype.stopImmediatePropagation) { + layer.removeEventListener = function(type, callback, capture) { + var rmv = Node.prototype.removeEventListener; + if (type === 'click') { + rmv.call(layer, type, callback.hijacked || callback, capture); + } else { + rmv.call(layer, type, callback, capture); + } + }; + + layer.addEventListener = function(type, callback, capture) { + var adv = Node.prototype.addEventListener; + if (type === 'click') { + adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) { + if (!event.propagationStopped) { + callback(event); + } + }), capture); + } else { + adv.call(layer, type, callback, capture); + } + }; + } + + // If a handler is already declared in the element's onclick attribute, it will be fired before + // FastClick's onClick handler. Fix this by pulling out the user-defined handler function and + // adding it as listener. + if (typeof layer.onclick === 'function') { + + // Android browser on at least 3.2 requires a new reference to the function in layer.onclick + // - the old one won't work if passed to addEventListener directly. + oldOnClick = layer.onclick; + layer.addEventListener('click', function(event) { + oldOnClick(event); + }, false); + layer.onclick = null; + } + } + + /** + * Windows Phone 8.1 fakes user agent string to look like Android and iPhone. + * + * @type boolean + */ + var deviceIsWindowsPhone = navigator.userAgent.indexOf("Windows Phone") >= 0; + + /** + * Android requires exceptions. + * + * @type boolean + */ + var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone; + + + /** + * iOS requires exceptions. + * + * @type boolean + */ + var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone; + + + /** + * iOS 4 requires an exception for select elements. + * + * @type boolean + */ + var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent); + + + /** + * iOS 6.0-7.* requires the target element to be manually derived + * + * @type boolean + */ + var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\d/).test(navigator.userAgent); + + /** + * BlackBerry requires exceptions. + * + * @type boolean + */ + var deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0; + + /** + * Determine whether a given element requires a native click. + * + * @param {EventTarget|Element} target Target DOM element + * @returns {boolean} Returns true if the element needs a native click + */ + FastClick.prototype.needsClick = function(target) { + switch (target.nodeName.toLowerCase()) { + + // Don't send a synthetic click to disabled inputs (issue #62) + case 'button': + case 'select': + case 'textarea': + if (target.disabled) { + return true; + } + + break; + case 'input': + + // File inputs need real clicks on iOS 6 due to a browser bug (issue #68) + if ((deviceIsIOS && target.type === 'file') || target.disabled) { + return true; + } + + break; + case 'label': + case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames + case 'video': + return true; + } + + return (/\bneedsclick\b/).test(target.className); + }; + + + /** + * Determine whether a given element requires a call to focus to simulate click into element. + * + * @param {EventTarget|Element} target Target DOM element + * @returns {boolean} Returns true if the element requires a call to focus to simulate native click. + */ + FastClick.prototype.needsFocus = function(target) { + switch (target.nodeName.toLowerCase()) { + case 'textarea': + return true; + case 'select': + return !deviceIsAndroid; + case 'input': + switch (target.type) { + case 'button': + case 'checkbox': + case 'file': + case 'image': + case 'radio': + case 'submit': + return false; + } + + // No point in attempting to focus disabled inputs + return !target.disabled && !target.readOnly; + default: + return (/\bneedsfocus\b/).test(target.className); + } + }; + + + /** + * Send a click event to the specified element. + * + * @param {EventTarget|Element} targetElement + * @param {Event} event + */ + FastClick.prototype.sendClick = function(targetElement, event) { + var clickEvent, touch; + + // On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24) + if (document.activeElement && document.activeElement !== targetElement) { + document.activeElement.blur(); + } + + touch = event.changedTouches[0]; + + // Synthesise a click event, with an extra attribute so it can be tracked + clickEvent = document.createEvent('MouseEvents'); + clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); + clickEvent.forwardedTouchEvent = true; + targetElement.dispatchEvent(clickEvent); + }; + + FastClick.prototype.determineEventType = function(targetElement) { + + //Issue #159: Android Chrome Select Box does not open with a synthetic click event + if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') { + return 'mousedown'; + } + + return 'click'; + }; + + + /** + * @param {EventTarget|Element} targetElement + */ + FastClick.prototype.focus = function(targetElement) { + var length; + + // Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724. + if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') { + length = targetElement.value.length; + targetElement.setSelectionRange(length, length); + } else { + targetElement.focus(); + } + }; + + + /** + * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it. + * + * @param {EventTarget|Element} targetElement + */ + FastClick.prototype.updateScrollParent = function(targetElement) { + var scrollParent, parentElement; + + scrollParent = targetElement.fastClickScrollParent; + + // Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the + // target element was moved to another parent. + if (!scrollParent || !scrollParent.contains(targetElement)) { + parentElement = targetElement; + do { + if (parentElement.scrollHeight > parentElement.offsetHeight) { + scrollParent = parentElement; + targetElement.fastClickScrollParent = parentElement; + break; + } + + parentElement = parentElement.parentElement; + } while (parentElement); + } + + // Always update the scroll top tracker if possible. + if (scrollParent) { + scrollParent.fastClickLastScrollTop = scrollParent.scrollTop; + } + }; + + + /** + * @param {EventTarget} targetElement + * @returns {Element|EventTarget} + */ + FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) { + + // On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node. + if (eventTarget.nodeType === Node.TEXT_NODE) { + return eventTarget.parentNode; + } + + return eventTarget; + }; + + + /** + * On touch start, record the position and scroll offset. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onTouchStart = function(event) { + var targetElement, touch, selection; + + // Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111). + if (event.targetTouches.length > 1) { + return true; + } + + targetElement = this.getTargetElementFromEventTarget(event.target); + touch = event.targetTouches[0]; + + if (deviceIsIOS) { + + // Only trusted events will deselect text on iOS (issue #49) + selection = window.getSelection(); + if (selection.rangeCount && !selection.isCollapsed) { + return true; + } + + if (!deviceIsIOS4) { + + // Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23): + // when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched + // with the same identifier as the touch event that previously triggered the click that triggered the alert. + // Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an + // immediately preceeding touch event (issue #52), so this fix is unavailable on that platform. + // Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string, + // which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long, + // random integers, it's safe to to continue if the identifier is 0 here. + if (touch.identifier && touch.identifier === this.lastTouchIdentifier) { + event.preventDefault(); + return false; + } + + this.lastTouchIdentifier = touch.identifier; + + // If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and: + // 1) the user does a fling scroll on the scrollable layer + // 2) the user stops the fling scroll with another tap + // then the event.target of the last 'touchend' event will be the element that was under the user's finger + // when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check + // is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42). + this.updateScrollParent(targetElement); + } + } + + this.trackingClick = true; + this.trackingClickStart = event.timeStamp; + this.targetElement = targetElement; + + this.touchStartX = touch.pageX; + this.touchStartY = touch.pageY; + + // Prevent phantom clicks on fast double-tap (issue #36) + if ((event.timeStamp - this.lastClickTime) < this.tapDelay) { + event.preventDefault(); + } + + return true; + }; + + + /** + * Based on a touchmove event object, check whether the touch has moved past a boundary since it started. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.touchHasMoved = function(event) { + var touch = event.changedTouches[0], boundary = this.touchBoundary; + + if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) { + return true; + } + + return false; + }; + + + /** + * Update the last position. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onTouchMove = function(event) { + if (!this.trackingClick) { + return true; + } + + // If the touch has moved, cancel the click tracking + if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) { + this.trackingClick = false; + this.targetElement = null; + } + + return true; + }; + + + /** + * Attempt to find the labelled control for the given label element. + * + * @param {EventTarget|HTMLLabelElement} labelElement + * @returns {Element|null} + */ + FastClick.prototype.findControl = function(labelElement) { + + // Fast path for newer browsers supporting the HTML5 control attribute + if (labelElement.control !== undefined) { + return labelElement.control; + } + + // All browsers under test that support touch events also support the HTML5 htmlFor attribute + if (labelElement.htmlFor) { + return document.getElementById(labelElement.htmlFor); + } + + // If no for attribute exists, attempt to retrieve the first labellable descendant element + // the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label + return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea'); + }; + + + /** + * On touch end, determine whether to send a click event at once. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onTouchEnd = function(event) { + var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement; + + if (!this.trackingClick) { + return true; + } + + // Prevent phantom clicks on fast double-tap (issue #36) + if ((event.timeStamp - this.lastClickTime) < this.tapDelay) { + this.cancelNextClick = true; + return true; + } + + if ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) { + return true; + } + + // Reset to prevent wrong click cancel on input (issue #156). + this.cancelNextClick = false; + + this.lastClickTime = event.timeStamp; + + trackingClickStart = this.trackingClickStart; + this.trackingClick = false; + this.trackingClickStart = 0; + + // On some iOS devices, the targetElement supplied with the event is invalid if the layer + // is performing a transition or scroll, and has to be re-detected manually. Note that + // for this to function correctly, it must be called *after* the event target is checked! + // See issue #57; also filed as rdar://13048589 . + if (deviceIsIOSWithBadTarget) { + touch = event.changedTouches[0]; + + // In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null + targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement; + targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent; + } + + targetTagName = targetElement.tagName.toLowerCase(); + if (targetTagName === 'label') { + forElement = this.findControl(targetElement); + if (forElement) { + this.focus(targetElement); + if (deviceIsAndroid) { + return false; + } + + targetElement = forElement; + } + } else if (this.needsFocus(targetElement)) { + + // Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through. + // Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37). + if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) { + this.targetElement = null; + return false; + } + + this.focus(targetElement); + this.sendClick(targetElement, event); + + // Select elements need the event to go through on iOS 4, otherwise the selector menu won't open. + // Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others) + if (!deviceIsIOS || targetTagName !== 'select') { + this.targetElement = null; + event.preventDefault(); + } + + return false; + } + + if (deviceIsIOS && !deviceIsIOS4) { + + // Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled + // and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42). + scrollParent = targetElement.fastClickScrollParent; + if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) { + return true; + } + } + + // Prevent the actual click from going though - unless the target node is marked as requiring + // real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted. + if (!this.needsClick(targetElement)) { + event.preventDefault(); + this.sendClick(targetElement, event); + } + + return false; + }; + + + /** + * On touch cancel, stop tracking the click. + * + * @returns {void} + */ + FastClick.prototype.onTouchCancel = function() { + this.trackingClick = false; + this.targetElement = null; + }; + + + /** + * Determine mouse events which should be permitted. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onMouse = function(event) { + + // If a target element was never set (because a touch event was never fired) allow the event + if (!this.targetElement) { + return true; + } + + if (event.forwardedTouchEvent) { + return true; + } + + // Programmatically generated events targeting a specific element should be permitted + if (!event.cancelable) { + return true; + } + + // Derive and check the target element to see whether the mouse event needs to be permitted; + // unless explicitly enabled, prevent non-touch click events from triggering actions, + // to prevent ghost/doubleclicks. + if (!this.needsClick(this.targetElement) || this.cancelNextClick) { + + // Prevent any user-added listeners declared on FastClick element from being fired. + if (event.stopImmediatePropagation) { + event.stopImmediatePropagation(); + } else { + + // Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) + event.propagationStopped = true; + } + + // Cancel the event + event.stopPropagation(); + event.preventDefault(); + + return false; + } + + // If the mouse event is permitted, return true for the action to go through. + return true; + }; + + + /** + * On actual clicks, determine whether this is a touch-generated click, a click action occurring + * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or + * an actual click which should be permitted. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onClick = function(event) { + var permitted; + + // It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early. + if (this.trackingClick) { + this.targetElement = null; + this.trackingClick = false; + return true; + } + + // Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target. + if (event.target.type === 'submit' && event.detail === 0) { + return true; + } + + permitted = this.onMouse(event); + + // Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through. + if (!permitted) { + this.targetElement = null; + } + + // If clicks are permitted, return true for the action to go through. + return permitted; + }; + + + /** + * Remove all FastClick's event listeners. + * + * @returns {void} + */ + FastClick.prototype.destroy = function() { + var layer = this.layer; + + if (deviceIsAndroid) { + layer.removeEventListener('mouseover', this.onMouse, true); + layer.removeEventListener('mousedown', this.onMouse, true); + layer.removeEventListener('mouseup', this.onMouse, true); + } + + layer.removeEventListener('click', this.onClick, true); + layer.removeEventListener('touchstart', this.onTouchStart, false); + layer.removeEventListener('touchmove', this.onTouchMove, false); + layer.removeEventListener('touchend', this.onTouchEnd, false); + layer.removeEventListener('touchcancel', this.onTouchCancel, false); + }; + + + /** + * Check whether FastClick is needed. + * + * @param {Element} layer The layer to listen on + */ + FastClick.notNeeded = function(layer) { + var metaViewport; + var chromeVersion; + var blackberryVersion; + var firefoxVersion; + + // Devices that don't support touch don't need FastClick + if (typeof window.ontouchstart === 'undefined') { + return true; + } + + // Chrome version - zero for other browsers + chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1]; + + if (chromeVersion) { + + if (deviceIsAndroid) { + metaViewport = document.querySelector('meta[name=viewport]'); + + if (metaViewport) { + // Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89) + if (metaViewport.content.indexOf('user-scalable=no') !== -1) { + return true; + } + // Chrome 32 and above with width=device-width or less don't need FastClick + if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) { + return true; + } + } + + // Chrome desktop doesn't need FastClick (issue #15) + } else { + return true; + } + } + + if (deviceIsBlackBerry10) { + blackberryVersion = navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/); + + // BlackBerry 10.3+ does not require Fastclick library. + // https://github.com/ftlabs/fastclick/issues/251 + if (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) { + metaViewport = document.querySelector('meta[name=viewport]'); + + if (metaViewport) { + // user-scalable=no eliminates click delay. + if (metaViewport.content.indexOf('user-scalable=no') !== -1) { + return true; + } + // width=device-width (or less than device-width) eliminates click delay. + if (document.documentElement.scrollWidth <= window.outerWidth) { + return true; + } + } + } + } + + // IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97) + if (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') { + return true; + } + + // Firefox version - zero for other browsers + firefoxVersion = +(/Firefox\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1]; + + if (firefoxVersion >= 27) { + // Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896 + + metaViewport = document.querySelector('meta[name=viewport]'); + if (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) { + return true; + } + } + + // IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version + // http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx + if (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') { + return true; + } + + return false; + }; + + + /** + * Factory method for creating a FastClick object + * + * @param {Element} layer The layer to listen on + * @param {Object} [options={}] The options to override the defaults + */ + FastClick.attach = function(layer, options) { + return new FastClick(layer, options); + }; + + + if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { + + // AMD. Register as an anonymous module. + define(function() { + return FastClick; + }); + } else if (typeof module !== 'undefined' && module.exports) { + module.exports = FastClick.attach; + module.exports.FastClick = FastClick; + } else { + window.FastClick = FastClick; + } +}()); diff --git a/bower_components/flow.js/.bower.json b/bower_components/flow.js/.bower.json new file mode 100644 index 0000000..f7fe953 --- /dev/null +++ b/bower_components/flow.js/.bower.json @@ -0,0 +1,28 @@ +{ + "name": "flow.js", + "version": "2.9.0", + "main": "./dist/flow.js", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests", + "samples", + "CHANGELOG.md", + "karma.conf.js", + "package.json", + "src/*", + "Gruntfile.js" + ], + "homepage": "https://github.com/flowjs/flow.js", + "_release": "2.9.0", + "_resolution": { + "type": "version", + "tag": "v2.9.0", + "commit": "0467da5c2820e87623c7f720c7d21493c2655511" + }, + "_source": "git://github.com/flowjs/flow.js.git", + "_target": "~2", + "_originalSource": "flow.js" +} \ No newline at end of file diff --git a/bower_components/flow.js/LICENSE b/bower_components/flow.js/LICENSE new file mode 100644 index 0000000..72e7441 --- /dev/null +++ b/bower_components/flow.js/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2011, 23, http://www.23developer.com + 2013, Aidas Klimas + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/bower_components/flow.js/README.md b/bower_components/flow.js/README.md new file mode 100644 index 0000000..9bc2fdb --- /dev/null +++ b/bower_components/flow.js/README.md @@ -0,0 +1,273 @@ +# Flow.js [![Build Status](https://travis-ci.org/flowjs/flow.js.png)](https://travis-ci.org/flowjs/flow.js) [![Coverage Status](https://coveralls.io/repos/flowjs/flow.js/badge.png?branch=master)](https://coveralls.io/r/flowjs/flow.js?branch=master) + +Flow.js is a JavaScript library providing multiple simultaneous, stable and resumable uploads via the HTML5 File API. + +The library is designed to introduce fault-tolerance into the upload of large files through HTTP. This is done by splitting each file into small chunks. Then, whenever the upload of a chunk fails, uploading is retried until the procedure completes. This allows uploads to automatically resume uploading after a network connection is lost either locally or to the server. Additionally, it allows for users to pause, resume and even recover uploads without losing state because only the currently uploading chunks will be aborted, not the entire upload. + +Flow.js does not have any external dependencies other than the `HTML5 File API`. This is relied on for the ability to chunk files into smaller pieces. Currently, this means that support is limited to Firefox 4+, Chrome 11+, Safari 6+ and Internet Explorer 10+. + +Samples and examples are available in the `samples/` folder. Please push your own as Markdown to help document the project. + +## Whould you like to contribute? [View our development branch](https://github.com/flowjs/flow.js/tree/develop) + +## Can I see a demo? +[Flow.js + angular.js file upload demo](http://flowjs.github.io/ng-flow/) - ng-flow extension page https://github.com/flowjs/ng-flow + +JQuery and node.js backend demo https://github.com/flowjs/flow.js/tree/master/samples/Node.js + +## How can I install it? + +Download a latest build from https://github.com/flowjs/flow.js/releases +it contains development and minified production files in `dist/` folder. + +or use bower: +```console +bower install flow.js#~2 +``` +or use git clone +```console +git clone https://github.com/flowjs/flow.js +``` +## How can I use it? + +A new `Flow` object is created with information of what and where to post: +```javascript +var flow = new Flow({ + target:'/api/photo/redeem-upload-token', + query:{upload_token:'my_token'} +}); +// Flow.js isn't supported, fall back on a different method +if(!flow.support) location.href = '/some-old-crappy-uploader'; +``` +To allow files to be either selected and drag-dropped, you'll assign drop target and a DOM item to be clicked for browsing: +```javascript +flow.assignBrowse(document.getElementById('browseButton')); +flow.assignDrop(document.getElementById('dropTarget')); +``` +After this, interaction with Flow.js is done by listening to events: +```javascript +flow.on('fileAdded', function(file, event){ + console.log(file, event); +}); +flow.on('fileSuccess', function(file,message){ + console.log(file,message); +}); +flow.on('fileError', function(file, message){ + console.log(file, message); +}); +``` +## How do I set it up with my server? + +Most of the magic for Flow.js happens in the user's browser, but files still need to be reassembled from chunks on the server side. This should be a fairly simple task and can be achieved in any web framework or language, which is able to receive file uploads. + +To handle the state of upload chunks, a number of extra parameters are sent along with all requests: + +* `flowChunkNumber`: The index of the chunk in the current upload. First chunk is `1` (no base-0 counting here). +* `flowTotalChunks`: The total number of chunks. +* `flowChunkSize`: The general chunk size. Using this value and `flowTotalSize` you can calculate the total number of chunks. Please note that the size of the data received in the HTTP might be lower than `flowChunkSize` of this for the last chunk for a file. +* `flowTotalSize`: The total file size. +* `flowIdentifier`: A unique identifier for the file contained in the request. +* `flowFilename`: The original file name (since a bug in Firefox results in the file name not being transmitted in chunk multipart posts). +* `flowRelativePath`: The file's relative path when selecting a directory (defaults to file name in all browsers except Chrome). + +You should allow for the same chunk to be uploaded more than once; this isn't standard behaviour, but on an unstable network environment it could happen, and this case is exactly what Flow.js is designed for. + +For every request, you can confirm reception in HTTP status codes (can be change through the `permanentErrors` option): + +* `200`: The chunk was accepted and correct. No need to re-upload. +* `404`, `415`. `500`, `501`: The file for which the chunk was uploaded is not supported, cancel the entire upload. +* _Anything else_: Something went wrong, but try reuploading the file. + +## Handling GET (or `test()` requests) + +Enabling the `testChunks` option will allow uploads to be resumed after browser restarts and even across browsers (in theory you could even run the same file upload across multiple tabs or different browsers). The `POST` data requests listed are required to use Flow.js to receive data, but you can extend support by implementing a corresponding `GET` request with the same parameters: + +* If this request returns a `200` HTTP code, the chunks is assumed to have been completed. +* If request returns a permanent error status, upload is stopped. +* If request returns anything else, the chunk will be uploaded in the standard fashion. + +After this is done and `testChunks` enabled, an upload can quickly catch up even after a browser restart by simply verifying already uploaded chunks that do not need to be uploaded again. + +## Full documentation + +### Flow +#### Configuration + +The object is loaded with a configuration options: +```javascript +var r = new Flow({opt1:'val', ...}); +``` +Available configuration options are: + +* `target` The target URL for the multipart POST request. This can be a string or a function. If a +function, it will be passed a FlowFile, a FlowChunk and isTest boolean (Default: `/`) +* `singleFile` Enable single file upload. Once one file is uploaded, second file will overtake existing one, first one will be canceled. (Default: false) +* `chunkSize` The size in bytes of each uploaded chunk of data. The last uploaded chunk will be at least this size and up to two the size, see [Issue #51](https://github.com/23/resumable.js/issues/51) for details and reasons. (Default: `1*1024*1024`) +* `forceChunkSize` Force all chunks to be less or equal than chunkSize. Otherwise, the last chunk will be greater than or equal to `chunkSize`. (Default: `false`) +* `simultaneousUploads` Number of simultaneous uploads (Default: `3`) +* `fileParameterName` The name of the multipart POST parameter to use for the file chunk (Default: `file`) +* `query` Extra parameters to include in the multipart POST with data. This can be an object or a + function. If a function, it will be passed a FlowFile, a FlowChunk object and a isTest boolean + (Default: `{}`) +* `headers` Extra headers to include in the multipart POST with data. If a function, it will be passed a FlowFile, a FlowChunk object and a isTest boolean (Default: `{}`) +* `withCredentials` Standard CORS requests do not send or set any cookies by default. In order to + include cookies as part of the request, you need to set the `withCredentials` property to true. +(Default: `false`) +* `method` Method to use when POSTing chunks to the server (`multipart` or `octet`) (Default: `multipart`) +* `testMethod` HTTP method to use when chunks are being tested. If set to a function, it will be passed a FlowFile and a FlowChunk arguments. (Default: `GET`) +* `uploadMethod` HTTP method to use when chunks are being uploaded. If set to a function, it will be passed a FlowFile and a FlowChunk arguments. (Default: `GET`) +* `prioritizeFirstAndLastChunk` Prioritize first and last chunks of all files. This can be handy if you can determine if a file is valid for your service from only the first or last chunk. For example, photo or video meta data is usually located in the first part of a file, making it easy to test support from only the first chunk. (Default: `false`) +* `testChunks` Make a GET request to the server for each chunks to see if it already exists. If implemented on the server-side, this will allow for upload resumes even after a browser crash or even a computer restart. (Default: `true`) +* `preprocess` Optional function to process each chunk before testing & sending. Function is passed the chunk as parameter, and should call the `preprocessFinished` method on the chunk when finished. (Default: `null`) +* `generateUniqueIdentifier` Override the function that generates unique identifiers for each file. (Default: `null`) +* `maxChunkRetries` The maximum number of retries for a chunk before the upload is failed. Valid values are any positive integer and `undefined` for no limit. (Default: `0`) +* `chunkRetryInterval` The number of milliseconds to wait before retrying a chunk on a non-permanent error. Valid values are any positive integer and `undefined` for immediate retry. (Default: `undefined`) +* `progressCallbacksInterval` The time interval in milliseconds between progress reports. Set it +to 0 to handle each progress callback. (Default: `500`) +* `speedSmoothingFactor` Used for calculating average upload speed. Number from 1 to 0. Set to 1 +and average upload speed wil be equal to current upload speed. For longer file uploads it is +better set this number to 0.02, because time remaining estimation will be more accurate. This +parameter must be adjusted together with `progressCallbacksInterval` parameter. (Default 0.1) +* `successStatuses` Response is success if response status is in this list (Default: `[200,201, +202]`) +* `permanentErrors` Response fails if response status is in this list (Default: `[404, 415, 500, 501]`) + + +#### Properties + +* `.support` A boolean value indicator whether or not Flow.js is supported by the current browser. +* `.supportDirectory` A boolean value, which indicates if browser supports directory uploads. +* `.opts` A hash object of the configuration of the Flow.js instance. +* `.files` An array of `FlowFile` file objects added by the user (see full docs for this object type below). + +#### Methods + +* `.assignBrowse(domNodes, isDirectory, singleFile, attributes)` Assign a browse action to one or more DOM nodes. + * `domNodes` array of dom nodes or a single node. + * `isDirectory` Pass in `true` to allow directories to be selected (Chrome only, support can be checked with `supportDirectory` property). + * `singleFile` To prevent multiple file uploads set this to true. Also look at config parameter `singleFile`. + * `attributes` Pass object of keys and values to set custom attributes on input fields. + For example, you can set `accept` attribute to `image/*`. This means that user will be able to select only images. + Full list of attributes: http://www.w3.org/TR/html-markup/input.file.html#input.file-attributes + + Note: avoid using `a` and `button` tags as file upload buttons, use span instead. +* `.assignDrop(domNodes)` Assign one or more DOM nodes as a drop target. +* `.on(event, callback)` Listen for event from Flow.js (see below) +* `.off([event, [callback]])`: + * `.off()` All events are removed. + * `.off(event)` Remove all callbacks of specific event. + * `.off(event, callback)` Remove specific callback of event. `callback` should be a `Function`. +* `.upload()` Start or resume uploading. +* `.pause()` Pause uploading. +* `.resume()` Resume uploading. +* `.cancel()` Cancel upload of all `FlowFile` objects and remove them from the list. +* `.progress()` Returns a float between 0 and 1 indicating the current upload progress of all files. +* `.isUploading()` Returns a boolean indicating whether or not the instance is currently uploading anything. +* `.addFile(file)` Add a HTML5 File object to the list of files. +* `.removeFile(file)` Cancel upload of a specific `FlowFile` object on the list from the list. +* `.getFromUniqueIdentifier(uniqueIdentifier)` Look up a `FlowFile` object by its unique identifier. +* `.getSize()` Returns the total size of the upload in bytes. +* `.sizeUploaded()` Returns the total size uploaded of all files in bytes. +* `.timeRemaining()` Returns remaining time to upload all files in seconds. Accuracy is based on average speed. If speed is zero, time remaining will be equal to positive infinity `Number.POSITIVE_INFINITY` + +#### Events + +* `.fileSuccess(file, message, chunk)` A specific file was completed. First argument `file` is instance of `FlowFile`, second argument `message` contains server response. Response is always a string. +Third argument `chunk` is instance of `FlowChunk`. You can get response status by accessing xhr +object `chunk.xhr.status`. +* `.fileProgress(file, chunk)` Uploading progressed for a specific file. +* `.fileAdded(file, event)` This event is used for file validation. To reject this file return false. +This event is also called before file is added to upload queue, +this means that calling `flow.upload()` function will not start current file upload. +Optionally, you can use the browser `event` object from when the file was +added. +* `.filesAdded(array, event)` Same as fileAdded, but used for multiple file validation. +* `.filesSubmitted(array, event)` Can be used to start upload of currently added files. +* `.fileRetry(file, chunk)` Something went wrong during upload of a specific file, uploading is being +retried. +* `.fileError(file, message, chunk)` An error occurred during upload of a specific file. +* `.uploadStart()` Upload has been started on the Flow object. +* `.complete()` Uploading completed. +* `.progress()` Uploading progress. +* `.error(message, file, chunk)` An error, including fileError, occurred. +* `.catchAll(event, ...)` Listen to all the events listed above with the same callback function. + +### FlowFile +FlowFile constructor can be accessed in `Flow.FlowFile`. +#### Properties + +* `.flowObj` A back-reference to the parent `Flow` object. +* `.file` The correlating HTML5 `File` object. +* `.name` The name of the file. +* `.relativePath` The relative path to the file (defaults to file name if relative path doesn't exist) +* `.size` Size in bytes of the file. +* `.uniqueIdentifier` A unique identifier assigned to this file object. This value is included in uploads to the server for reference, but can also be used in CSS classes etc when building your upload UI. +* `.averageSpeed` Average upload speed, bytes per second. +* `.currentSpeed` Current upload speed, bytes per second. +* `.chunks` An array of `FlowChunk` items. You shouldn't need to dig into these. +* `.paused` Indicated if file is paused. +* `.error` Indicated if file has encountered an error. + +#### Methods + +* `.progress(relative)` Returns a float between 0 and 1 indicating the current upload progress of the file. If `relative` is `true`, the value is returned relative to all files in the Flow.js instance. +* `.pause()` Pause uploading the file. +* `.resume()` Resume uploading the file. +* `.cancel()` Abort uploading the file and delete it from the list of files to upload. +* `.retry()` Retry uploading the file. +* `.bootstrap()` Rebuild the state of a `FlowFile` object, including reassigning chunks and XMLHttpRequest instances. +* `.isUploading()` Returns a boolean indicating whether file chunks is uploading. +* `.isComplete()` Returns a boolean indicating whether the file has completed uploading and received a server response. +* `.sizeUploaded()` Returns size uploaded in bytes. +* `.timeRemaining()` Returns remaining time to finish upload file in seconds. Accuracy is based on average speed. If speed is zero, time remaining will be equal to positive infinity `Number.POSITIVE_INFINITY` +* `.getExtension()` Returns file extension in lowercase. +* `.getType()` Returns file type. + +## Contribution + +To ensure consistency throughout the source code, keep these rules in mind as you are working: + +* All features or bug fixes must be tested by one or more specs. + +* We follow the rules contained in [Google's JavaScript Style Guide](http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml) with an exception we wrap all code at 100 characters. + + +## Installation Dependencies +1. To clone your Github repository, run: +```console +git clone git@github.com:/flow.js.git +``` +2. To go to the Flow.js directory, run: +```console +cd flow.js +``` +3. To add node.js dependencies +```console +npm install +``` +## Testing + +Our unit and integration tests are written with Jasmine and executed with Karma. To run all of the +tests on Chrome run: +```console +grunt karma:watch +``` +Or choose other browser +```console +grunt karma:watch --browsers=Firefox,Chrome +``` +Browsers should be comma separated and case sensitive. + +To re-run tests just change any source or test file. + +Automated tests is running after every commit at travis-ci. + +### Running test on sauceLabs + +1. Connect to sauce labs https://saucelabs.com/docs/connect +2. `grunt test --sauce-local=true --sauce-username=**** --sauce-access-key=***` + +other browsers can be used with `--browsers` flag, available browsers: sl_opera,sl_iphone,sl_safari,sl_ie10,sl_chorme,sl_firefox + +## Origin +Flow.js was inspired by and evolved from https://github.com/23/resumable.js. Library has been supplemented with tests and features, such as drag and drop for folders, upload speed, time remaining estimation, separate files pause, resume and more. diff --git a/bower_components/flow.js/bower.json b/bower_components/flow.js/bower.json new file mode 100644 index 0000000..09e98a4 --- /dev/null +++ b/bower_components/flow.js/bower.json @@ -0,0 +1,18 @@ +{ + "name": "flow.js", + "version": "2.9.0", + "main": "./dist/flow.js", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests", + "samples", + "CHANGELOG.md", + "karma.conf.js", + "package.json", + "src/*", + "Gruntfile.js" + ] +} diff --git a/bower_components/flow.js/dist/flow.js b/bower_components/flow.js/dist/flow.js new file mode 100644 index 0000000..8f4ce61 --- /dev/null +++ b/bower_components/flow.js/dist/flow.js @@ -0,0 +1,1561 @@ +/** + * @license MIT + */ +(function(window, document, undefined) {'use strict'; + // ie10+ + var ie10plus = window.navigator.msPointerEnabled; + /** + * Flow.js is a library providing multiple simultaneous, stable and + * resumable uploads via the HTML5 File API. + * @param [opts] + * @param {number} [opts.chunkSize] + * @param {bool} [opts.forceChunkSize] + * @param {number} [opts.simultaneousUploads] + * @param {bool} [opts.singleFile] + * @param {string} [opts.fileParameterName] + * @param {number} [opts.progressCallbacksInterval] + * @param {number} [opts.speedSmoothingFactor] + * @param {Object|Function} [opts.query] + * @param {Object|Function} [opts.headers] + * @param {bool} [opts.withCredentials] + * @param {Function} [opts.preprocess] + * @param {string} [opts.method] + * @param {string|Function} [opts.testMethod] + * @param {string|Function} [opts.uploadMethod] + * @param {bool} [opts.prioritizeFirstAndLastChunk] + * @param {string|Function} [opts.target] + * @param {number} [opts.maxChunkRetries] + * @param {number} [opts.chunkRetryInterval] + * @param {Array.} [opts.permanentErrors] + * @param {Array.} [opts.successStatuses] + * @param {Function} [opts.generateUniqueIdentifier] + * @constructor + */ + function Flow(opts) { + /** + * Supported by browser? + * @type {boolean} + */ + this.support = ( + typeof File !== 'undefined' && + typeof Blob !== 'undefined' && + typeof FileList !== 'undefined' && + ( + !!Blob.prototype.slice || !!Blob.prototype.webkitSlice || !!Blob.prototype.mozSlice || + false + ) // slicing files support + ); + + if (!this.support) { + return ; + } + + /** + * Check if directory upload is supported + * @type {boolean} + */ + this.supportDirectory = /WebKit/.test(window.navigator.userAgent); + + /** + * List of FlowFile objects + * @type {Array.} + */ + this.files = []; + + /** + * Default options for flow.js + * @type {Object} + */ + this.defaults = { + chunkSize: 1024 * 1024, + forceChunkSize: false, + simultaneousUploads: 3, + singleFile: false, + fileParameterName: 'file', + progressCallbacksInterval: 500, + speedSmoothingFactor: 0.1, + query: {}, + headers: {}, + withCredentials: false, + preprocess: null, + method: 'multipart', + testMethod: 'GET', + uploadMethod: 'POST', + prioritizeFirstAndLastChunk: false, + target: '/', + testChunks: true, + generateUniqueIdentifier: null, + maxChunkRetries: 0, + chunkRetryInterval: null, + permanentErrors: [404, 415, 500, 501], + successStatuses: [200, 201, 202], + onDropStopPropagation: false + }; + + /** + * Current options + * @type {Object} + */ + this.opts = {}; + + /** + * List of events: + * key stands for event name + * value array list of callbacks + * @type {} + */ + this.events = {}; + + var $ = this; + + /** + * On drop event + * @function + * @param {MouseEvent} event + */ + this.onDrop = function (event) { + if ($.opts.onDropStopPropagation) { + event.stopPropagation(); + } + event.preventDefault(); + var dataTransfer = event.dataTransfer; + if (dataTransfer.items && dataTransfer.items[0] && + dataTransfer.items[0].webkitGetAsEntry) { + $.webkitReadDataTransfer(event); + } else { + $.addFiles(dataTransfer.files, event); + } + }; + + /** + * Prevent default + * @function + * @param {MouseEvent} event + */ + this.preventEvent = function (event) { + event.preventDefault(); + }; + + + /** + * Current options + * @type {Object} + */ + this.opts = Flow.extend({}, this.defaults, opts || {}); + } + + Flow.prototype = { + /** + * Set a callback for an event, possible events: + * fileSuccess(file), fileProgress(file), fileAdded(file, event), + * fileRetry(file), fileError(file, message), complete(), + * progress(), error(message, file), pause() + * @function + * @param {string} event + * @param {Function} callback + */ + on: function (event, callback) { + event = event.toLowerCase(); + if (!this.events.hasOwnProperty(event)) { + this.events[event] = []; + } + this.events[event].push(callback); + }, + + /** + * Remove event callback + * @function + * @param {string} [event] removes all events if not specified + * @param {Function} [fn] removes all callbacks of event if not specified + */ + off: function (event, fn) { + if (event !== undefined) { + event = event.toLowerCase(); + if (fn !== undefined) { + if (this.events.hasOwnProperty(event)) { + arrayRemove(this.events[event], fn); + } + } else { + delete this.events[event]; + } + } else { + this.events = {}; + } + }, + + /** + * Fire an event + * @function + * @param {string} event event name + * @param {...} args arguments of a callback + * @return {bool} value is false if at least one of the event handlers which handled this event + * returned false. Otherwise it returns true. + */ + fire: function (event, args) { + // `arguments` is an object, not array, in FF, so: + args = Array.prototype.slice.call(arguments); + event = event.toLowerCase(); + var preventDefault = false; + if (this.events.hasOwnProperty(event)) { + each(this.events[event], function (callback) { + preventDefault = callback.apply(this, args.slice(1)) === false || preventDefault; + }, this); + } + if (event != 'catchall') { + args.unshift('catchAll'); + preventDefault = this.fire.apply(this, args) === false || preventDefault; + } + return !preventDefault; + }, + + /** + * Read webkit dataTransfer object + * @param event + */ + webkitReadDataTransfer: function (event) { + var $ = this; + var queue = event.dataTransfer.items.length; + var files = []; + each(event.dataTransfer.items, function (item) { + var entry = item.webkitGetAsEntry(); + if (!entry) { + decrement(); + return ; + } + if (entry.isFile) { + // due to a bug in Chrome's File System API impl - #149735 + fileReadSuccess(item.getAsFile(), entry.fullPath); + } else { + entry.createReader().readEntries(readSuccess, readError); + } + }); + function readSuccess(entries) { + queue += entries.length; + each(entries, function(entry) { + if (entry.isFile) { + var fullPath = entry.fullPath; + entry.file(function (file) { + fileReadSuccess(file, fullPath); + }, readError); + } else if (entry.isDirectory) { + entry.createReader().readEntries(readSuccess, readError); + } + }); + decrement(); + } + function fileReadSuccess(file, fullPath) { + // relative path should not start with "/" + file.relativePath = fullPath.substring(1); + files.push(file); + decrement(); + } + function readError(fileError) { + throw fileError; + } + function decrement() { + if (--queue == 0) { + $.addFiles(files, event); + } + } + }, + + /** + * Generate unique identifier for a file + * @function + * @param {FlowFile} file + * @returns {string} + */ + generateUniqueIdentifier: function (file) { + var custom = this.opts.generateUniqueIdentifier; + if (typeof custom === 'function') { + return custom(file); + } + // Some confusion in different versions of Firefox + var relativePath = file.relativePath || file.webkitRelativePath || file.fileName || file.name; + return file.size + '-' + relativePath.replace(/[^0-9a-zA-Z_-]/img, ''); + }, + + /** + * Upload next chunk from the queue + * @function + * @returns {boolean} + * @private + */ + uploadNextChunk: function (preventEvents) { + // In some cases (such as videos) it's really handy to upload the first + // and last chunk of a file quickly; this let's the server check the file's + // metadata and determine if there's even a point in continuing. + var found = false; + if (this.opts.prioritizeFirstAndLastChunk) { + each(this.files, function (file) { + if (!file.paused && file.chunks.length && + file.chunks[0].status() === 'pending' && + file.chunks[0].preprocessState === 0) { + file.chunks[0].send(); + found = true; + return false; + } + if (!file.paused && file.chunks.length > 1 && + file.chunks[file.chunks.length - 1].status() === 'pending' && + file.chunks[0].preprocessState === 0) { + file.chunks[file.chunks.length - 1].send(); + found = true; + return false; + } + }); + if (found) { + return found; + } + } + + // Now, simply look for the next, best thing to upload + each(this.files, function (file) { + if (!file.paused) { + each(file.chunks, function (chunk) { + if (chunk.status() === 'pending' && chunk.preprocessState === 0) { + chunk.send(); + found = true; + return false; + } + }); + } + if (found) { + return false; + } + }); + if (found) { + return true; + } + + // The are no more outstanding chunks to upload, check is everything is done + var outstanding = false; + each(this.files, function (file) { + if (!file.isComplete()) { + outstanding = true; + return false; + } + }); + if (!outstanding && !preventEvents) { + // All chunks have been uploaded, complete + async(function () { + this.fire('complete'); + }, this); + } + return false; + }, + + + /** + * Assign a browse action to one or more DOM nodes. + * @function + * @param {Element|Array.} domNodes + * @param {boolean} isDirectory Pass in true to allow directories to + * @param {boolean} singleFile prevent multi file upload + * @param {Object} attributes set custom attributes: + * http://www.w3.org/TR/html-markup/input.file.html#input.file-attributes + * eg: accept: 'image/*' + * be selected (Chrome only). + */ + assignBrowse: function (domNodes, isDirectory, singleFile, attributes) { + if (typeof domNodes.length === 'undefined') { + domNodes = [domNodes]; + } + + each(domNodes, function (domNode) { + var input; + if (domNode.tagName === 'INPUT' && domNode.type === 'file') { + input = domNode; + } else { + input = document.createElement('input'); + input.setAttribute('type', 'file'); + // display:none - not working in opera 12 + extend(input.style, { + visibility: 'hidden', + position: 'absolute' + }); + // for opera 12 browser, input must be assigned to a document + domNode.appendChild(input); + // https://developer.mozilla.org/en/using_files_from_web_applications) + // event listener is executed two times + // first one - original mouse click event + // second - input.click(), input is inside domNode + domNode.addEventListener('click', function() { + input.click(); + }, false); + } + if (!this.opts.singleFile && !singleFile) { + input.setAttribute('multiple', 'multiple'); + } + if (isDirectory) { + input.setAttribute('webkitdirectory', 'webkitdirectory'); + } + each(attributes, function (value, key) { + input.setAttribute(key, value); + }); + // When new files are added, simply append them to the overall list + var $ = this; + input.addEventListener('change', function (e) { + $.addFiles(e.target.files, e); + e.target.value = ''; + }, false); + }, this); + }, + + /** + * Assign one or more DOM nodes as a drop target. + * @function + * @param {Element|Array.} domNodes + */ + assignDrop: function (domNodes) { + if (typeof domNodes.length === 'undefined') { + domNodes = [domNodes]; + } + each(domNodes, function (domNode) { + domNode.addEventListener('dragover', this.preventEvent, false); + domNode.addEventListener('dragenter', this.preventEvent, false); + domNode.addEventListener('drop', this.onDrop, false); + }, this); + }, + + /** + * Un-assign drop event from DOM nodes + * @function + * @param domNodes + */ + unAssignDrop: function (domNodes) { + if (typeof domNodes.length === 'undefined') { + domNodes = [domNodes]; + } + each(domNodes, function (domNode) { + domNode.removeEventListener('dragover', this.preventEvent); + domNode.removeEventListener('dragenter', this.preventEvent); + domNode.removeEventListener('drop', this.onDrop); + }, this); + }, + + /** + * Returns a boolean indicating whether or not the instance is currently + * uploading anything. + * @function + * @returns {boolean} + */ + isUploading: function () { + var uploading = false; + each(this.files, function (file) { + if (file.isUploading()) { + uploading = true; + return false; + } + }); + return uploading; + }, + + /** + * should upload next chunk + * @function + * @returns {boolean|number} + */ + _shouldUploadNext: function () { + var num = 0; + var should = true; + var simultaneousUploads = this.opts.simultaneousUploads; + each(this.files, function (file) { + each(file.chunks, function(chunk) { + if (chunk.status() === 'uploading') { + num++; + if (num >= simultaneousUploads) { + should = false; + return false; + } + } + }); + }); + // if should is true then return uploading chunks's length + return should && num; + }, + + /** + * Start or resume uploading. + * @function + */ + upload: function () { + // Make sure we don't start too many uploads at once + var ret = this._shouldUploadNext(); + if (ret === false) { + return; + } + // Kick off the queue + this.fire('uploadStart'); + var started = false; + for (var num = 1; num <= this.opts.simultaneousUploads - ret; num++) { + started = this.uploadNextChunk(true) || started; + } + if (!started) { + async(function () { + this.fire('complete'); + }, this); + } + }, + + /** + * Resume uploading. + * @function + */ + resume: function () { + each(this.files, function (file) { + file.resume(); + }); + }, + + /** + * Pause uploading. + * @function + */ + pause: function () { + each(this.files, function (file) { + file.pause(); + }); + }, + + /** + * Cancel upload of all FlowFile objects and remove them from the list. + * @function + */ + cancel: function () { + for (var i = this.files.length - 1; i >= 0; i--) { + this.files[i].cancel(); + } + }, + + /** + * Returns a number between 0 and 1 indicating the current upload progress + * of all files. + * @function + * @returns {number} + */ + progress: function () { + var totalDone = 0; + var totalSize = 0; + // Resume all chunks currently being uploaded + each(this.files, function (file) { + totalDone += file.progress() * file.size; + totalSize += file.size; + }); + return totalSize > 0 ? totalDone / totalSize : 0; + }, + + /** + * Add a HTML5 File object to the list of files. + * @function + * @param {File} file + * @param {Event} [event] event is optional + */ + addFile: function (file, event) { + this.addFiles([file], event); + }, + + /** + * Add a HTML5 File object to the list of files. + * @function + * @param {FileList|Array} fileList + * @param {Event} [event] event is optional + */ + addFiles: function (fileList, event) { + var files = []; + each(fileList, function (file) { + // Uploading empty file IE10/IE11 hangs indefinitely + // see https://connect.microsoft.com/IE/feedback/details/813443/uploading-empty-file-ie10-ie11-hangs-indefinitely + // Directories have size `0` and name `.` + // Ignore already added files + if ((!ie10plus || ie10plus && file.size > 0) && !(file.size % 4096 === 0 && (file.name === '.' || file.fileName === '.')) && + !this.getFromUniqueIdentifier(this.generateUniqueIdentifier(file))) { + var f = new FlowFile(this, file); + if (this.fire('fileAdded', f, event)) { + files.push(f); + } + } + }, this); + if (this.fire('filesAdded', files, event)) { + each(files, function (file) { + if (this.opts.singleFile && this.files.length > 0) { + this.removeFile(this.files[0]); + } + this.files.push(file); + }, this); + } + this.fire('filesSubmitted', files, event); + }, + + + /** + * Cancel upload of a specific FlowFile object from the list. + * @function + * @param {FlowFile} file + */ + removeFile: function (file) { + for (var i = this.files.length - 1; i >= 0; i--) { + if (this.files[i] === file) { + this.files.splice(i, 1); + file.abort(); + } + } + }, + + /** + * Look up a FlowFile object by its unique identifier. + * @function + * @param {string} uniqueIdentifier + * @returns {boolean|FlowFile} false if file was not found + */ + getFromUniqueIdentifier: function (uniqueIdentifier) { + var ret = false; + each(this.files, function (file) { + if (file.uniqueIdentifier === uniqueIdentifier) { + ret = file; + } + }); + return ret; + }, + + /** + * Returns the total size of all files in bytes. + * @function + * @returns {number} + */ + getSize: function () { + var totalSize = 0; + each(this.files, function (file) { + totalSize += file.size; + }); + return totalSize; + }, + + /** + * Returns the total size uploaded of all files in bytes. + * @function + * @returns {number} + */ + sizeUploaded: function () { + var size = 0; + each(this.files, function (file) { + size += file.sizeUploaded(); + }); + return size; + }, + + /** + * Returns remaining time to upload all files in seconds. Accuracy is based on average speed. + * If speed is zero, time remaining will be equal to positive infinity `Number.POSITIVE_INFINITY` + * @function + * @returns {number} + */ + timeRemaining: function () { + var sizeDelta = 0; + var averageSpeed = 0; + each(this.files, function (file) { + if (!file.paused && !file.error) { + sizeDelta += file.size - file.sizeUploaded(); + averageSpeed += file.averageSpeed; + } + }); + if (sizeDelta && !averageSpeed) { + return Number.POSITIVE_INFINITY; + } + if (!sizeDelta && !averageSpeed) { + return 0; + } + return Math.floor(sizeDelta / averageSpeed); + } + }; + + + + + + + /** + * FlowFile class + * @name FlowFile + * @param {Flow} flowObj + * @param {File} file + * @constructor + */ + function FlowFile(flowObj, file) { + + /** + * Reference to parent Flow instance + * @type {Flow} + */ + this.flowObj = flowObj; + + /** + * Reference to file + * @type {File} + */ + this.file = file; + + /** + * File name. Some confusion in different versions of Firefox + * @type {string} + */ + this.name = file.fileName || file.name; + + /** + * File size + * @type {number} + */ + this.size = file.size; + + /** + * Relative file path + * @type {string} + */ + this.relativePath = file.relativePath || file.webkitRelativePath || this.name; + + /** + * File unique identifier + * @type {string} + */ + this.uniqueIdentifier = flowObj.generateUniqueIdentifier(file); + + /** + * List of chunks + * @type {Array.} + */ + this.chunks = []; + + /** + * Indicated if file is paused + * @type {boolean} + */ + this.paused = false; + + /** + * Indicated if file has encountered an error + * @type {boolean} + */ + this.error = false; + + /** + * Average upload speed + * @type {number} + */ + this.averageSpeed = 0; + + /** + * Current upload speed + * @type {number} + */ + this.currentSpeed = 0; + + /** + * Date then progress was called last time + * @type {number} + * @private + */ + this._lastProgressCallback = Date.now(); + + /** + * Previously uploaded file size + * @type {number} + * @private + */ + this._prevUploadedSize = 0; + + /** + * Holds previous progress + * @type {number} + * @private + */ + this._prevProgress = 0; + + this.bootstrap(); + } + + FlowFile.prototype = { + /** + * Update speed parameters + * @link http://stackoverflow.com/questions/2779600/how-to-estimate-download-time-remaining-accurately + * @function + */ + measureSpeed: function () { + var timeSpan = Date.now() - this._lastProgressCallback; + if (!timeSpan) { + return ; + } + var smoothingFactor = this.flowObj.opts.speedSmoothingFactor; + var uploaded = this.sizeUploaded(); + // Prevent negative upload speed after file upload resume + this.currentSpeed = Math.max((uploaded - this._prevUploadedSize) / timeSpan * 1000, 0); + this.averageSpeed = smoothingFactor * this.currentSpeed + (1 - smoothingFactor) * this.averageSpeed; + this._prevUploadedSize = uploaded; + }, + + /** + * For internal usage only. + * Callback when something happens within the chunk. + * @function + * @param {FlowChunk} chunk + * @param {string} event can be 'progress', 'success', 'error' or 'retry' + * @param {string} [message] + */ + chunkEvent: function (chunk, event, message) { + switch (event) { + case 'progress': + if (Date.now() - this._lastProgressCallback < + this.flowObj.opts.progressCallbacksInterval) { + break; + } + this.measureSpeed(); + this.flowObj.fire('fileProgress', this, chunk); + this.flowObj.fire('progress'); + this._lastProgressCallback = Date.now(); + break; + case 'error': + this.error = true; + this.abort(true); + this.flowObj.fire('fileError', this, message, chunk); + this.flowObj.fire('error', message, this, chunk); + break; + case 'success': + if (this.error) { + return; + } + this.measureSpeed(); + this.flowObj.fire('fileProgress', this, chunk); + this.flowObj.fire('progress'); + this._lastProgressCallback = Date.now(); + if (this.isComplete()) { + this.currentSpeed = 0; + this.averageSpeed = 0; + this.flowObj.fire('fileSuccess', this, message, chunk); + } + break; + case 'retry': + this.flowObj.fire('fileRetry', this, chunk); + break; + } + }, + + /** + * Pause file upload + * @function + */ + pause: function() { + this.paused = true; + this.abort(); + }, + + /** + * Resume file upload + * @function + */ + resume: function() { + this.paused = false; + this.flowObj.upload(); + }, + + /** + * Abort current upload + * @function + */ + abort: function (reset) { + this.currentSpeed = 0; + this.averageSpeed = 0; + var chunks = this.chunks; + if (reset) { + this.chunks = []; + } + each(chunks, function (c) { + if (c.status() === 'uploading') { + c.abort(); + this.flowObj.uploadNextChunk(); + } + }, this); + }, + + /** + * Cancel current upload and remove from a list + * @function + */ + cancel: function () { + this.flowObj.removeFile(this); + }, + + /** + * Retry aborted file upload + * @function + */ + retry: function () { + this.bootstrap(); + this.flowObj.upload(); + }, + + /** + * Clear current chunks and slice file again + * @function + */ + bootstrap: function () { + this.abort(true); + this.error = false; + // Rebuild stack of chunks from file + this._prevProgress = 0; + var round = this.flowObj.opts.forceChunkSize ? Math.ceil : Math.floor; + var chunks = Math.max( + round(this.file.size / this.flowObj.opts.chunkSize), 1 + ); + for (var offset = 0; offset < chunks; offset++) { + this.chunks.push( + new FlowChunk(this.flowObj, this, offset) + ); + } + }, + + /** + * Get current upload progress status + * @function + * @returns {number} from 0 to 1 + */ + progress: function () { + if (this.error) { + return 1; + } + if (this.chunks.length === 1) { + this._prevProgress = Math.max(this._prevProgress, this.chunks[0].progress()); + return this._prevProgress; + } + // Sum up progress across everything + var bytesLoaded = 0; + each(this.chunks, function (c) { + // get chunk progress relative to entire file + bytesLoaded += c.progress() * (c.endByte - c.startByte); + }); + var percent = bytesLoaded / this.size; + // We don't want to lose percentages when an upload is paused + this._prevProgress = Math.max(this._prevProgress, percent > 0.9999 ? 1 : percent); + return this._prevProgress; + }, + + /** + * Indicates if file is being uploaded at the moment + * @function + * @returns {boolean} + */ + isUploading: function () { + var uploading = false; + each(this.chunks, function (chunk) { + if (chunk.status() === 'uploading') { + uploading = true; + return false; + } + }); + return uploading; + }, + + /** + * Indicates if file is has finished uploading and received a response + * @function + * @returns {boolean} + */ + isComplete: function () { + var outstanding = false; + each(this.chunks, function (chunk) { + var status = chunk.status(); + if (status === 'pending' || status === 'uploading' || chunk.preprocessState === 1) { + outstanding = true; + return false; + } + }); + return !outstanding; + }, + + /** + * Count total size uploaded + * @function + * @returns {number} + */ + sizeUploaded: function () { + var size = 0; + each(this.chunks, function (chunk) { + size += chunk.sizeUploaded(); + }); + return size; + }, + + /** + * Returns remaining time to finish upload file in seconds. Accuracy is based on average speed. + * If speed is zero, time remaining will be equal to positive infinity `Number.POSITIVE_INFINITY` + * @function + * @returns {number} + */ + timeRemaining: function () { + if (this.paused || this.error) { + return 0; + } + var delta = this.size - this.sizeUploaded(); + if (delta && !this.averageSpeed) { + return Number.POSITIVE_INFINITY; + } + if (!delta && !this.averageSpeed) { + return 0; + } + return Math.floor(delta / this.averageSpeed); + }, + + /** + * Get file type + * @function + * @returns {string} + */ + getType: function () { + return this.file.type && this.file.type.split('/')[1]; + }, + + /** + * Get file extension + * @function + * @returns {string} + */ + getExtension: function () { + return this.name.substr((~-this.name.lastIndexOf(".") >>> 0) + 2).toLowerCase(); + } + }; + + + + + + + + + /** + * Class for storing a single chunk + * @name FlowChunk + * @param {Flow} flowObj + * @param {FlowFile} fileObj + * @param {number} offset + * @constructor + */ + function FlowChunk(flowObj, fileObj, offset) { + + /** + * Reference to parent flow object + * @type {Flow} + */ + this.flowObj = flowObj; + + /** + * Reference to parent FlowFile object + * @type {FlowFile} + */ + this.fileObj = fileObj; + + /** + * File size + * @type {number} + */ + this.fileObjSize = fileObj.size; + + /** + * File offset + * @type {number} + */ + this.offset = offset; + + /** + * Indicates if chunk existence was checked on the server + * @type {boolean} + */ + this.tested = false; + + /** + * Number of retries performed + * @type {number} + */ + this.retries = 0; + + /** + * Pending retry + * @type {boolean} + */ + this.pendingRetry = false; + + /** + * Preprocess state + * @type {number} 0 = unprocessed, 1 = processing, 2 = finished + */ + this.preprocessState = 0; + + /** + * Bytes transferred from total request size + * @type {number} + */ + this.loaded = 0; + + /** + * Total request size + * @type {number} + */ + this.total = 0; + + /** + * Size of a chunk + * @type {number} + */ + var chunkSize = this.flowObj.opts.chunkSize; + + /** + * Chunk start byte in a file + * @type {number} + */ + this.startByte = this.offset * chunkSize; + + /** + * Chunk end byte in a file + * @type {number} + */ + this.endByte = Math.min(this.fileObjSize, (this.offset + 1) * chunkSize); + + /** + * XMLHttpRequest + * @type {XMLHttpRequest} + */ + this.xhr = null; + + if (this.fileObjSize - this.endByte < chunkSize && + !this.flowObj.opts.forceChunkSize) { + // The last chunk will be bigger than the chunk size, + // but less than 2*chunkSize + this.endByte = this.fileObjSize; + } + + var $ = this; + + + /** + * Send chunk event + * @param event + * @param {...} args arguments of a callback + */ + this.event = function (event, args) { + args = Array.prototype.slice.call(arguments); + args.unshift($); + $.fileObj.chunkEvent.apply($.fileObj, args); + }; + /** + * Catch progress event + * @param {ProgressEvent} event + */ + this.progressHandler = function(event) { + if (event.lengthComputable) { + $.loaded = event.loaded ; + $.total = event.total; + } + $.event('progress', event); + }; + + /** + * Catch test event + * @param {Event} event + */ + this.testHandler = function(event) { + var status = $.status(true); + if (status === 'error') { + $.event(status, $.message()); + $.flowObj.uploadNextChunk(); + } else if (status === 'success') { + $.tested = true; + $.event(status, $.message()); + $.flowObj.uploadNextChunk(); + } else if (!$.fileObj.paused) { + // Error might be caused by file pause method + // Chunks does not exist on the server side + $.tested = true; + $.send(); + } + }; + + /** + * Upload has stopped + * @param {Event} event + */ + this.doneHandler = function(event) { + var status = $.status(); + if (status === 'success' || status === 'error') { + $.event(status, $.message()); + $.flowObj.uploadNextChunk(); + } else { + $.event('retry', $.message()); + $.pendingRetry = true; + $.abort(); + $.retries++; + var retryInterval = $.flowObj.opts.chunkRetryInterval; + if (retryInterval !== null) { + setTimeout(function () { + $.send(); + }, retryInterval); + } else { + $.send(); + } + } + }; + } + + FlowChunk.prototype = { + /** + * Get params for a request + * @function + */ + getParams: function () { + return { + flowChunkNumber: this.offset + 1, + flowChunkSize: this.flowObj.opts.chunkSize, + flowCurrentChunkSize: this.endByte - this.startByte, + flowTotalSize: this.fileObjSize, + flowIdentifier: this.fileObj.uniqueIdentifier, + flowFilename: this.fileObj.name, + flowRelativePath: this.fileObj.relativePath, + flowTotalChunks: this.fileObj.chunks.length + }; + }, + + /** + * Get target option with query params + * @function + * @param params + * @returns {string} + */ + getTarget: function(target, params){ + if(target.indexOf('?') < 0) { + target += '?'; + } else { + target += '&'; + } + return target + params.join('&'); + }, + + /** + * Makes a GET request without any data to see if the chunk has already + * been uploaded in a previous session + * @function + */ + test: function () { + // Set up request and listen for event + this.xhr = new XMLHttpRequest(); + this.xhr.addEventListener("load", this.testHandler, false); + this.xhr.addEventListener("error", this.testHandler, false); + var testMethod = evalOpts(this.flowObj.opts.testMethod, this.fileObj, this); + var data = this.prepareXhrRequest(testMethod, true); + this.xhr.send(data); + }, + + /** + * Finish preprocess state + * @function + */ + preprocessFinished: function () { + this.preprocessState = 2; + this.send(); + }, + + /** + * Uploads the actual data in a POST call + * @function + */ + send: function () { + var preprocess = this.flowObj.opts.preprocess; + if (typeof preprocess === 'function') { + switch (this.preprocessState) { + case 0: + this.preprocessState = 1; + preprocess(this); + return; + case 1: + return; + } + } + if (this.flowObj.opts.testChunks && !this.tested) { + this.test(); + return; + } + + this.loaded = 0; + this.total = 0; + this.pendingRetry = false; + + var func = (this.fileObj.file.slice ? 'slice' : + (this.fileObj.file.mozSlice ? 'mozSlice' : + (this.fileObj.file.webkitSlice ? 'webkitSlice' : + 'slice'))); + var bytes = this.fileObj.file[func](this.startByte, this.endByte, this.fileObj.file.type); + + // Set up request and listen for event + this.xhr = new XMLHttpRequest(); + this.xhr.upload.addEventListener('progress', this.progressHandler, false); + this.xhr.addEventListener("load", this.doneHandler, false); + this.xhr.addEventListener("error", this.doneHandler, false); + + var uploadMethod = evalOpts(this.flowObj.opts.uploadMethod, this.fileObj, this); + var data = this.prepareXhrRequest(uploadMethod, false, this.flowObj.opts.method, bytes); + this.xhr.send(data); + }, + + /** + * Abort current xhr request + * @function + */ + abort: function () { + // Abort and reset + var xhr = this.xhr; + this.xhr = null; + if (xhr) { + xhr.abort(); + } + }, + + /** + * Retrieve current chunk upload status + * @function + * @returns {string} 'pending', 'uploading', 'success', 'error' + */ + status: function (isTest) { + if (this.pendingRetry || this.preprocessState === 1) { + // if pending retry then that's effectively the same as actively uploading, + // there might just be a slight delay before the retry starts + return 'uploading'; + } else if (!this.xhr) { + return 'pending'; + } else if (this.xhr.readyState < 4) { + // Status is really 'OPENED', 'HEADERS_RECEIVED' + // or 'LOADING' - meaning that stuff is happening + return 'uploading'; + } else { + if (this.flowObj.opts.successStatuses.indexOf(this.xhr.status) > -1) { + // HTTP 200, perfect + // HTTP 202 Accepted - The request has been accepted for processing, but the processing has not been completed. + return 'success'; + } else if (this.flowObj.opts.permanentErrors.indexOf(this.xhr.status) > -1 || + !isTest && this.retries >= this.flowObj.opts.maxChunkRetries) { + // HTTP 415/500/501, permanent error + return 'error'; + } else { + // this should never happen, but we'll reset and queue a retry + // a likely case for this would be 503 service unavailable + this.abort(); + return 'pending'; + } + } + }, + + /** + * Get response from xhr request + * @function + * @returns {String} + */ + message: function () { + return this.xhr ? this.xhr.responseText : ''; + }, + + /** + * Get upload progress + * @function + * @returns {number} + */ + progress: function () { + if (this.pendingRetry) { + return 0; + } + var s = this.status(); + if (s === 'success' || s === 'error') { + return 1; + } else if (s === 'pending') { + return 0; + } else { + return this.total > 0 ? this.loaded / this.total : 0; + } + }, + + /** + * Count total size uploaded + * @function + * @returns {number} + */ + sizeUploaded: function () { + var size = this.endByte - this.startByte; + // can't return only chunk.loaded value, because it is bigger than chunk size + if (this.status() !== 'success') { + size = this.progress() * size; + } + return size; + }, + + /** + * Prepare Xhr request. Set query, headers and data + * @param {string} method GET or POST + * @param {bool} isTest is this a test request + * @param {string} [paramsMethod] octet or form + * @param {Blob} [blob] to send + * @returns {FormData|Blob|Null} data to send + */ + prepareXhrRequest: function(method, isTest, paramsMethod, blob) { + // Add data from the query options + var query = evalOpts(this.flowObj.opts.query, this.fileObj, this, isTest); + query = extend(this.getParams(), query); + + var target = evalOpts(this.flowObj.opts.target, this.fileObj, this, isTest); + var data = null; + if (method === 'GET' || paramsMethod === 'octet') { + // Add data from the query options + var params = []; + each(query, function (v, k) { + params.push([encodeURIComponent(k), encodeURIComponent(v)].join('=')); + }); + target = this.getTarget(target, params); + data = blob || null; + } else { + // Add data from the query options + data = new FormData(); + each(query, function (v, k) { + data.append(k, v); + }); + data.append(this.flowObj.opts.fileParameterName, blob, this.fileObj.file.name); + } + + this.xhr.open(method, target, true); + this.xhr.withCredentials = this.flowObj.opts.withCredentials; + + // Add data from header options + each(evalOpts(this.flowObj.opts.headers, this.fileObj, this, isTest), function (v, k) { + this.xhr.setRequestHeader(k, v); + }, this); + + return data; + } + }; + + /** + * Remove value from array + * @param array + * @param value + */ + function arrayRemove(array, value) { + var index = array.indexOf(value); + if (index > -1) { + array.splice(index, 1); + } + } + + /** + * If option is a function, evaluate it with given params + * @param {*} data + * @param {...} args arguments of a callback + * @returns {*} + */ + function evalOpts(data, args) { + if (typeof data === "function") { + // `arguments` is an object, not array, in FF, so: + args = Array.prototype.slice.call(arguments); + data = data.apply(null, args.slice(1)); + } + return data; + } + Flow.evalOpts = evalOpts; + + /** + * Execute function asynchronously + * @param fn + * @param context + */ + function async(fn, context) { + setTimeout(fn.bind(context), 0); + } + + /** + * Extends the destination object `dst` by copying all of the properties from + * the `src` object(s) to `dst`. You can specify multiple `src` objects. + * @function + * @param {Object} dst Destination object. + * @param {...Object} src Source object(s). + * @returns {Object} Reference to `dst`. + */ + function extend(dst, src) { + each(arguments, function(obj) { + if (obj !== dst) { + each(obj, function(value, key){ + dst[key] = value; + }); + } + }); + return dst; + } + Flow.extend = extend; + + /** + * Iterate each element of an object + * @function + * @param {Array|Object} obj object or an array to iterate + * @param {Function} callback first argument is a value and second is a key. + * @param {Object=} context Object to become context (`this`) for the iterator function. + */ + function each(obj, callback, context) { + if (!obj) { + return ; + } + var key; + // Is Array? + if (typeof(obj.length) !== 'undefined') { + for (key = 0; key < obj.length; key++) { + if (callback.call(context, obj[key], key) === false) { + return ; + } + } + } else { + for (key in obj) { + if (obj.hasOwnProperty(key) && callback.call(context, obj[key], key) === false) { + return ; + } + } + } + } + Flow.each = each; + + /** + * FlowFile constructor + * @type {FlowFile} + */ + Flow.FlowFile = FlowFile; + + /** + * FlowFile constructor + * @type {FlowChunk} + */ + Flow.FlowChunk = FlowChunk; + + /** + * Library version + * @type {string} + */ + Flow.version = '2.9.0'; + + if ( typeof module === "object" && module && typeof module.exports === "object" ) { + // Expose Flow as module.exports in loaders that implement the Node + // module pattern (including browserify). Do not create the global, since + // the user will be storing it themselves locally, and globals are frowned + // upon in the Node module world. + module.exports = Flow; + } else { + // Otherwise expose Flow to the global object as usual + window.Flow = Flow; + + // Register as a named AMD module, since Flow can be concatenated with other + // files that may use define, but not via a proper concatenation script that + // understands anonymous AMD modules. A named AMD is safest and most robust + // way to register. Lowercase flow is used because AMD module names are + // derived from file names, and Flow is normally delivered in a lowercase + // file name. Do this after creating the global so that if an AMD module wants + // to call noConflict to hide this version of Flow, it will work. + if ( typeof define === "function" && define.amd ) { + define( "flow", [], function () { return Flow; } ); + } + } +})(window, document); diff --git a/bower_components/flow.js/dist/flow.min.js b/bower_components/flow.js/dist/flow.min.js new file mode 100644 index 0000000..34b888e --- /dev/null +++ b/bower_components/flow.js/dist/flow.min.js @@ -0,0 +1,2 @@ +/*! flow.js 2.9.0 */ +!function(a,b,c){"use strict";function d(b){if(this.support=!("undefined"==typeof File||"undefined"==typeof Blob||"undefined"==typeof FileList||!Blob.prototype.slice&&!Blob.prototype.webkitSlice&&!Blob.prototype.mozSlice),this.support){this.supportDirectory=/WebKit/.test(a.navigator.userAgent),this.files=[],this.defaults={chunkSize:1048576,forceChunkSize:!1,simultaneousUploads:3,singleFile:!1,fileParameterName:"file",progressCallbacksInterval:500,speedSmoothingFactor:.1,query:{},headers:{},withCredentials:!1,preprocess:null,method:"multipart",testMethod:"GET",uploadMethod:"POST",prioritizeFirstAndLastChunk:!1,target:"/",testChunks:!0,generateUniqueIdentifier:null,maxChunkRetries:0,chunkRetryInterval:null,permanentErrors:[404,415,500,501],successStatuses:[200,201,202],onDropStopPropagation:!1},this.opts={},this.events={};var c=this;this.onDrop=function(a){c.opts.onDropStopPropagation&&a.stopPropagation(),a.preventDefault();var b=a.dataTransfer;b.items&&b.items[0]&&b.items[0].webkitGetAsEntry?c.webkitReadDataTransfer(a):c.addFiles(b.files,a)},this.preventEvent=function(a){a.preventDefault()},this.opts=d.extend({},this.defaults,b||{})}}function e(a,b){this.flowObj=a,this.file=b,this.name=b.fileName||b.name,this.size=b.size,this.relativePath=b.relativePath||b.webkitRelativePath||this.name,this.uniqueIdentifier=a.generateUniqueIdentifier(b),this.chunks=[],this.paused=!1,this.error=!1,this.averageSpeed=0,this.currentSpeed=0,this._lastProgressCallback=Date.now(),this._prevUploadedSize=0,this._prevProgress=0,this.bootstrap()}function f(a,b,c){this.flowObj=a,this.fileObj=b,this.fileObjSize=b.size,this.offset=c,this.tested=!1,this.retries=0,this.pendingRetry=!1,this.preprocessState=0,this.loaded=0,this.total=0;var d=this.flowObj.opts.chunkSize;this.startByte=this.offset*d,this.endByte=Math.min(this.fileObjSize,(this.offset+1)*d),this.xhr=null,this.fileObjSize-this.endByte-1&&a.splice(c,1)}function h(a,b){return"function"==typeof a&&(b=Array.prototype.slice.call(arguments),a=a.apply(null,b.slice(1))),a}function i(a,b){setTimeout(a.bind(b),0)}function j(a){return k(arguments,function(b){b!==a&&k(b,function(b,c){a[c]=b})}),a}function k(a,b,c){if(a){var d;if("undefined"!=typeof a.length){for(d=0;d1&&"pending"===a.chunks[a.chunks.length-1].status()&&0===a.chunks[0].preprocessState?(a.chunks[a.chunks.length-1].send(),b=!0,!1):void 0}),b))return b;if(k(this.files,function(a){return a.paused||k(a.chunks,function(a){return"pending"===a.status()&&0===a.preprocessState?(a.send(),b=!0,!1):void 0}),b?!1:void 0}),b)return!0;var c=!1;return k(this.files,function(a){return a.isComplete()?void 0:(c=!0,!1)}),c||a||i(function(){this.fire("complete")},this),!1},assignBrowse:function(a,c,d,e){"undefined"==typeof a.length&&(a=[a]),k(a,function(a){var f;"INPUT"===a.tagName&&"file"===a.type?f=a:(f=b.createElement("input"),f.setAttribute("type","file"),j(f.style,{visibility:"hidden",position:"absolute"}),a.appendChild(f),a.addEventListener("click",function(){f.click()},!1)),this.opts.singleFile||d||f.setAttribute("multiple","multiple"),c&&f.setAttribute("webkitdirectory","webkitdirectory"),k(e,function(a,b){f.setAttribute(b,a)});var g=this;f.addEventListener("change",function(a){g.addFiles(a.target.files,a),a.target.value=""},!1)},this)},assignDrop:function(a){"undefined"==typeof a.length&&(a=[a]),k(a,function(a){a.addEventListener("dragover",this.preventEvent,!1),a.addEventListener("dragenter",this.preventEvent,!1),a.addEventListener("drop",this.onDrop,!1)},this)},unAssignDrop:function(a){"undefined"==typeof a.length&&(a=[a]),k(a,function(a){a.removeEventListener("dragover",this.preventEvent),a.removeEventListener("dragenter",this.preventEvent),a.removeEventListener("drop",this.onDrop)},this)},isUploading:function(){var a=!1;return k(this.files,function(b){return b.isUploading()?(a=!0,!1):void 0}),a},_shouldUploadNext:function(){var a=0,b=!0,c=this.opts.simultaneousUploads;return k(this.files,function(d){k(d.chunks,function(d){return"uploading"===d.status()&&(a++,a>=c)?(b=!1,!1):void 0})}),b&&a},upload:function(){var a=this._shouldUploadNext();if(a!==!1){this.fire("uploadStart");for(var b=!1,c=1;c<=this.opts.simultaneousUploads-a;c++)b=this.uploadNextChunk(!0)||b;b||i(function(){this.fire("complete")},this)}},resume:function(){k(this.files,function(a){a.resume()})},pause:function(){k(this.files,function(a){a.pause()})},cancel:function(){for(var a=this.files.length-1;a>=0;a--)this.files[a].cancel()},progress:function(){var a=0,b=0;return k(this.files,function(c){a+=c.progress()*c.size,b+=c.size}),b>0?a/b:0},addFile:function(a,b){this.addFiles([a],b)},addFiles:function(a,b){var c=[];k(a,function(a){if((!l||l&&a.size>0)&&(a.size%4096!==0||"."!==a.name&&"."!==a.fileName)&&!this.getFromUniqueIdentifier(this.generateUniqueIdentifier(a))){var d=new e(this,a);this.fire("fileAdded",d,b)&&c.push(d)}},this),this.fire("filesAdded",c,b)&&k(c,function(a){this.opts.singleFile&&this.files.length>0&&this.removeFile(this.files[0]),this.files.push(a)},this),this.fire("filesSubmitted",c,b)},removeFile:function(a){for(var b=this.files.length-1;b>=0;b--)this.files[b]===a&&(this.files.splice(b,1),a.abort())},getFromUniqueIdentifier:function(a){var b=!1;return k(this.files,function(c){c.uniqueIdentifier===a&&(b=c)}),b},getSize:function(){var a=0;return k(this.files,function(b){a+=b.size}),a},sizeUploaded:function(){var a=0;return k(this.files,function(b){a+=b.sizeUploaded()}),a},timeRemaining:function(){var a=0,b=0;return k(this.files,function(c){c.paused||c.error||(a+=c.size-c.sizeUploaded(),b+=c.averageSpeed)}),a&&!b?Number.POSITIVE_INFINITY:a||b?Math.floor(a/b):0}},e.prototype={measureSpeed:function(){var a=Date.now()-this._lastProgressCallback;if(a){var b=this.flowObj.opts.speedSmoothingFactor,c=this.sizeUploaded();this.currentSpeed=Math.max((c-this._prevUploadedSize)/a*1e3,0),this.averageSpeed=b*this.currentSpeed+(1-b)*this.averageSpeed,this._prevUploadedSize=c}},chunkEvent:function(a,b,c){switch(b){case"progress":if(Date.now()-this._lastProgressCallbackc;c++)this.chunks.push(new f(this.flowObj,this,c))},progress:function(){if(this.error)return 1;if(1===this.chunks.length)return this._prevProgress=Math.max(this._prevProgress,this.chunks[0].progress()),this._prevProgress;var a=0;k(this.chunks,function(b){a+=b.progress()*(b.endByte-b.startByte)});var b=a/this.size;return this._prevProgress=Math.max(this._prevProgress,b>.9999?1:b),this._prevProgress},isUploading:function(){var a=!1;return k(this.chunks,function(b){return"uploading"===b.status()?(a=!0,!1):void 0}),a},isComplete:function(){var a=!1;return k(this.chunks,function(b){var c=b.status();return"pending"===c||"uploading"===c||1===b.preprocessState?(a=!0,!1):void 0}),!a},sizeUploaded:function(){var a=0;return k(this.chunks,function(b){a+=b.sizeUploaded()}),a},timeRemaining:function(){if(this.paused||this.error)return 0;var a=this.size-this.sizeUploaded();return a&&!this.averageSpeed?Number.POSITIVE_INFINITY:a||this.averageSpeed?Math.floor(a/this.averageSpeed):0},getType:function(){return this.file.type&&this.file.type.split("/")[1]},getExtension:function(){return this.name.substr((~-this.name.lastIndexOf(".")>>>0)+2).toLowerCase()}},f.prototype={getParams:function(){return{flowChunkNumber:this.offset+1,flowChunkSize:this.flowObj.opts.chunkSize,flowCurrentChunkSize:this.endByte-this.startByte,flowTotalSize:this.fileObjSize,flowIdentifier:this.fileObj.uniqueIdentifier,flowFilename:this.fileObj.name,flowRelativePath:this.fileObj.relativePath,flowTotalChunks:this.fileObj.chunks.length}},getTarget:function(a,b){return a+=a.indexOf("?")<0?"?":"&",a+b.join("&")},test:function(){this.xhr=new XMLHttpRequest,this.xhr.addEventListener("load",this.testHandler,!1),this.xhr.addEventListener("error",this.testHandler,!1);var a=h(this.flowObj.opts.testMethod,this.fileObj,this),b=this.prepareXhrRequest(a,!0);this.xhr.send(b)},preprocessFinished:function(){this.preprocessState=2,this.send()},send:function(){var a=this.flowObj.opts.preprocess;if("function"==typeof a)switch(this.preprocessState){case 0:return this.preprocessState=1,void a(this);case 1:return}if(this.flowObj.opts.testChunks&&!this.tested)return void this.test();this.loaded=0,this.total=0,this.pendingRetry=!1;var b=this.fileObj.file.slice?"slice":this.fileObj.file.mozSlice?"mozSlice":this.fileObj.file.webkitSlice?"webkitSlice":"slice",c=this.fileObj.file[b](this.startByte,this.endByte,this.fileObj.file.type);this.xhr=new XMLHttpRequest,this.xhr.upload.addEventListener("progress",this.progressHandler,!1),this.xhr.addEventListener("load",this.doneHandler,!1),this.xhr.addEventListener("error",this.doneHandler,!1);var d=h(this.flowObj.opts.uploadMethod,this.fileObj,this),e=this.prepareXhrRequest(d,!1,this.flowObj.opts.method,c);this.xhr.send(e)},abort:function(){var a=this.xhr;this.xhr=null,a&&a.abort()},status:function(a){return this.pendingRetry||1===this.preprocessState?"uploading":this.xhr?this.xhr.readyState<4?"uploading":this.flowObj.opts.successStatuses.indexOf(this.xhr.status)>-1?"success":this.flowObj.opts.permanentErrors.indexOf(this.xhr.status)>-1||!a&&this.retries>=this.flowObj.opts.maxChunkRetries?"error":(this.abort(),"pending"):"pending"},message:function(){return this.xhr?this.xhr.responseText:""},progress:function(){if(this.pendingRetry)return 0;var a=this.status();return"success"===a||"error"===a?1:"pending"===a?0:this.total>0?this.loaded/this.total:0},sizeUploaded:function(){var a=this.endByte-this.startByte;return"success"!==this.status()&&(a=this.progress()*a),a},prepareXhrRequest:function(a,b,c,d){var e=h(this.flowObj.opts.query,this.fileObj,this,b);e=j(this.getParams(),e);var f=h(this.flowObj.opts.target,this.fileObj,this,b),g=null;if("GET"===a||"octet"===c){var i=[];k(e,function(a,b){i.push([encodeURIComponent(b),encodeURIComponent(a)].join("="))}),f=this.getTarget(f,i),g=d||null}else g=new FormData,k(e,function(a,b){g.append(b,a)}),g.append(this.flowObj.opts.fileParameterName,d,this.fileObj.file.name);return this.xhr.open(a,f,!0),this.xhr.withCredentials=this.flowObj.opts.withCredentials,k(h(this.flowObj.opts.headers,this.fileObj,this,b),function(a,b){this.xhr.setRequestHeader(b,a)},this),g}},d.evalOpts=h,d.extend=j,d.each=k,d.FlowFile=e,d.FlowChunk=f,d.version="2.9.0","object"==typeof module&&module&&"object"==typeof module.exports?module.exports=d:(a.Flow=d,"function"==typeof define&&define.amd&&define("flow",[],function(){return d}))}(window,document); \ No newline at end of file diff --git a/bower_components/font-awesome/.bower.json b/bower_components/font-awesome/.bower.json new file mode 100644 index 0000000..c565638 --- /dev/null +++ b/bower_components/font-awesome/.bower.json @@ -0,0 +1,36 @@ +{ + "name": "font-awesome", + "description": "Font Awesome", + "version": "4.2.0", + "keywords": [], + "homepage": "http://fontawesome.io", + "dependencies": {}, + "devDependencies": {}, + "license": [ + "OFL-1.1", + "MIT", + "CC-BY-3.0" + ], + "main": [ + "./css/font-awesome.css", + "./fonts/*" + ], + "ignore": [ + "*/.*", + "*.json", + "src", + "*.yml", + "Gemfile", + "Gemfile.lock", + "*.md" + ], + "_release": "4.2.0", + "_resolution": { + "type": "version", + "tag": "v4.2.0", + "commit": "0b924144a95a54fa738d0450ff66c1dabd11ae74" + }, + "_source": "git://github.com/FortAwesome/Font-Awesome.git", + "_target": "~4.2.0", + "_originalSource": "font-awesome" +} \ No newline at end of file diff --git a/bower_components/font-awesome/.gitignore b/bower_components/font-awesome/.gitignore new file mode 100644 index 0000000..63dd521 --- /dev/null +++ b/bower_components/font-awesome/.gitignore @@ -0,0 +1,32 @@ +*.pyc +*.egg-info +*.db +*.db.old +*.swp +*.db-journal + +.coverage +.DS_Store +.installed.cfg +_gh_pages/* + +.idea/* +.svn/* +src/website/static/* +src/website/media/* + +bin +cfcache +develop-eggs +dist +downloads +eggs +parts +tmp +.sass-cache +node_modules + +src/website/settingslocal.py +stunnel.log + +.ruby-version diff --git a/bower_components/font-awesome/.npmignore b/bower_components/font-awesome/.npmignore new file mode 100644 index 0000000..54a691f --- /dev/null +++ b/bower_components/font-awesome/.npmignore @@ -0,0 +1,42 @@ +*.pyc +*.egg-info +*.db +*.db.old +*.swp +*.db-journal + +.coverage +.DS_Store +.installed.cfg +_gh_pages/* + +.idea/* +.svn/* +src/website/static/* +src/website/media/* + +bin +cfcache +develop-eggs +dist +downloads +eggs +parts +tmp +.sass-cache +node_modules + +src/website/settingslocal.py +stunnel.log + +.ruby-version + +# don't need these in the npm package. +src/ +_config.yml +bower.json +component.json +composer.json +CONTRIBUTING.md +Gemfile +Gemfile.lock diff --git a/bower_components/font-awesome/bower.json b/bower_components/font-awesome/bower.json new file mode 100644 index 0000000..76dc682 --- /dev/null +++ b/bower_components/font-awesome/bower.json @@ -0,0 +1,23 @@ +{ + "name": "font-awesome", + "description": "Font Awesome", + "version": "4.2.0", + "keywords": [], + "homepage": "http://fontawesome.io", + "dependencies": {}, + "devDependencies": {}, + "license": ["OFL-1.1", "MIT", "CC-BY-3.0"], + "main": [ + "./css/font-awesome.css", + "./fonts/*" + ], + "ignore": [ + "*/.*", + "*.json", + "src", + "*.yml", + "Gemfile", + "Gemfile.lock", + "*.md" + ] +} diff --git a/bower_components/font-awesome/css/font-awesome.css b/bower_components/font-awesome/css/font-awesome.css new file mode 100644 index 0000000..4040b3c --- /dev/null +++ b/bower_components/font-awesome/css/font-awesome.css @@ -0,0 +1,1672 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.2.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.2.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; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.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: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.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; +} +@-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 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + 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 { + 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: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.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:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.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 { + 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: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-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.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"; +} diff --git a/bower_components/font-awesome/css/font-awesome.min.css b/bower_components/font-awesome/css/font-awesome.min.css new file mode 100644 index 0000000..ec53d4d --- /dev/null +++ b/bower_components/font-awesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.2.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-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.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}.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}@-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{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{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{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:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.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{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: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-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.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"} \ No newline at end of file diff --git a/bower_components/font-awesome/fonts/FontAwesome.otf b/bower_components/font-awesome/fonts/FontAwesome.otf new file mode 100644 index 0000000..81c9ad9 Binary files /dev/null and b/bower_components/font-awesome/fonts/FontAwesome.otf differ diff --git a/bower_components/font-awesome/fonts/fontawesome-webfont.eot b/bower_components/font-awesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..84677bc Binary files /dev/null and b/bower_components/font-awesome/fonts/fontawesome-webfont.eot differ diff --git a/bower_components/font-awesome/fonts/fontawesome-webfont.svg b/bower_components/font-awesome/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..d907b25 --- /dev/null +++ b/bower_components/font-awesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,520 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bower_components/font-awesome/fonts/fontawesome-webfont.ttf b/bower_components/font-awesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..96a3639 Binary files /dev/null and b/bower_components/font-awesome/fonts/fontawesome-webfont.ttf differ diff --git a/bower_components/font-awesome/fonts/fontawesome-webfont.woff b/bower_components/font-awesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..628b6a5 Binary files /dev/null and b/bower_components/font-awesome/fonts/fontawesome-webfont.woff differ diff --git a/bower_components/font-awesome/less/bordered-pulled.less b/bower_components/font-awesome/less/bordered-pulled.less new file mode 100644 index 0000000..0c90eb5 --- /dev/null +++ b/bower_components/font-awesome/less/bordered-pulled.less @@ -0,0 +1,16 @@ +// Bordered & Pulled +// ------------------------- + +.@{fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em @fa-border-color; + border-radius: .1em; +} + +.pull-right { float: right; } +.pull-left { float: left; } + +.@{fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/bower_components/font-awesome/less/core.less b/bower_components/font-awesome/less/core.less new file mode 100644 index 0000000..01d1910 --- /dev/null +++ b/bower_components/font-awesome/less/core.less @@ -0,0 +1,11 @@ +// Base Class Definition +// ------------------------- + +.@{fa-css-prefix} { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/bower_components/font-awesome/less/extras.less b/bower_components/font-awesome/less/extras.less new file mode 100644 index 0000000..89faf70 --- /dev/null +++ b/bower_components/font-awesome/less/extras.less @@ -0,0 +1,2 @@ +// Extras +// -------------------------- diff --git a/bower_components/font-awesome/less/fixed-width.less b/bower_components/font-awesome/less/fixed-width.less new file mode 100644 index 0000000..110289f --- /dev/null +++ b/bower_components/font-awesome/less/fixed-width.less @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.@{fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/bower_components/font-awesome/less/font-awesome.less b/bower_components/font-awesome/less/font-awesome.less new file mode 100644 index 0000000..195fd46 --- /dev/null +++ b/bower_components/font-awesome/less/font-awesome.less @@ -0,0 +1,17 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables.less"; +@import "mixins.less"; +@import "path.less"; +@import "core.less"; +@import "larger.less"; +@import "fixed-width.less"; +@import "list.less"; +@import "bordered-pulled.less"; +@import "spinning.less"; +@import "rotated-flipped.less"; +@import "stacked.less"; +@import "icons.less"; diff --git a/bower_components/font-awesome/less/icons.less b/bower_components/font-awesome/less/icons.less new file mode 100644 index 0000000..b5c26c7 --- /dev/null +++ b/bower_components/font-awesome/less/icons.less @@ -0,0 +1,552 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } +.@{fa-css-prefix}-music:before { content: @fa-var-music; } +.@{fa-css-prefix}-search:before { content: @fa-var-search; } +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } +.@{fa-css-prefix}-star:before { content: @fa-var-star; } +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } +.@{fa-css-prefix}-user:before { content: @fa-var-user; } +.@{fa-css-prefix}-film:before { content: @fa-var-film; } +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } +.@{fa-css-prefix}-th:before { content: @fa-var-th; } +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } +.@{fa-css-prefix}-check:before { content: @fa-var-check; } +.@{fa-css-prefix}-remove:before, +.@{fa-css-prefix}-close:before, +.@{fa-css-prefix}-times:before { content: @fa-var-times; } +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } +.@{fa-css-prefix}-gear:before, +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } +.@{fa-css-prefix}-home:before { content: @fa-var-home; } +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } +.@{fa-css-prefix}-road:before { content: @fa-var-road; } +.@{fa-css-prefix}-download:before { content: @fa-var-download; } +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } +.@{fa-css-prefix}-rotate-right:before, +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } +.@{fa-css-prefix}-book:before { content: @fa-var-book; } +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } +.@{fa-css-prefix}-print:before { content: @fa-var-print; } +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } +.@{fa-css-prefix}-font:before { content: @fa-var-font; } +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } +.@{fa-css-prefix}-list:before { content: @fa-var-list; } +.@{fa-css-prefix}-dedent:before, +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } +.@{fa-css-prefix}-photo:before, +.@{fa-css-prefix}-image:before, +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } +.@{fa-css-prefix}-edit:before, +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } +.@{fa-css-prefix}-play:before { content: @fa-var-play; } +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } +.@{fa-css-prefix}-mail-forward:before, +.@{fa-css-prefix}-share:before { content: @fa-var-share; } +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } +.@{fa-css-prefix}-warning:before, +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } +.@{fa-css-prefix}-random:before { content: @fa-var-random; } +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } +.@{fa-css-prefix}-bar-chart-o:before, +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } +.@{fa-css-prefix}-key:before { content: @fa-var-key; } +.@{fa-css-prefix}-gears:before, +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } +.@{fa-css-prefix}-github:before { content: @fa-var-github; } +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } +.@{fa-css-prefix}-group:before, +.@{fa-css-prefix}-users:before { content: @fa-var-users; } +.@{fa-css-prefix}-chain:before, +.@{fa-css-prefix}-link:before { content: @fa-var-link; } +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } +.@{fa-css-prefix}-cut:before, +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } +.@{fa-css-prefix}-copy:before, +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } +.@{fa-css-prefix}-save:before, +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } +.@{fa-css-prefix}-square:before { content: @fa-var-square; } +.@{fa-css-prefix}-navicon:before, +.@{fa-css-prefix}-reorder:before, +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } +.@{fa-css-prefix}-table:before { content: @fa-var-table; } +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } +.@{fa-css-prefix}-money:before { content: @fa-var-money; } +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } +.@{fa-css-prefix}-unsorted:before, +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } +.@{fa-css-prefix}-sort-down:before, +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } +.@{fa-css-prefix}-sort-up:before, +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } +.@{fa-css-prefix}-rotate-left:before, +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } +.@{fa-css-prefix}-legal:before, +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } +.@{fa-css-prefix}-dashboard:before, +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } +.@{fa-css-prefix}-flash:before, +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } +.@{fa-css-prefix}-paste:before, +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } +.@{fa-css-prefix}-mobile-phone:before, +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } +.@{fa-css-prefix}-mail-reply:before, +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } +.@{fa-css-prefix}-code:before { content: @fa-var-code; } +.@{fa-css-prefix}-mail-reply-all:before, +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } +.@{fa-css-prefix}-star-half-empty:before, +.@{fa-css-prefix}-star-half-full:before, +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } +.@{fa-css-prefix}-unlink:before, +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } +.@{fa-css-prefix}-question:before { content: @fa-var-question; } +.@{fa-css-prefix}-info:before { content: @fa-var-info; } +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } +.@{fa-css-prefix}-toggle-down:before, +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } +.@{fa-css-prefix}-toggle-up:before, +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } +.@{fa-css-prefix}-toggle-right:before, +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } +.@{fa-css-prefix}-euro:before, +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } +.@{fa-css-prefix}-dollar:before, +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } +.@{fa-css-prefix}-rupee:before, +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } +.@{fa-css-prefix}-cny:before, +.@{fa-css-prefix}-rmb:before, +.@{fa-css-prefix}-yen:before, +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } +.@{fa-css-prefix}-ruble:before, +.@{fa-css-prefix}-rouble:before, +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } +.@{fa-css-prefix}-won:before, +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } +.@{fa-css-prefix}-bitcoin:before, +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } +.@{fa-css-prefix}-file:before { content: @fa-var-file; } +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } +.@{fa-css-prefix}-android:before { content: @fa-var-android; } +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } +.@{fa-css-prefix}-female:before { content: @fa-var-female; } +.@{fa-css-prefix}-male:before { content: @fa-var-male; } +.@{fa-css-prefix}-gittip:before { content: @fa-var-gittip; } +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } +.@{fa-css-prefix}-toggle-left:before, +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } +.@{fa-css-prefix}-turkish-lira:before, +.@{fa-css-prefix}-try:before { content: @fa-var-try; } +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } +.@{fa-css-prefix}-institution:before, +.@{fa-css-prefix}-bank:before, +.@{fa-css-prefix}-university:before { content: @fa-var-university; } +.@{fa-css-prefix}-mortar-board:before, +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } +.@{fa-css-prefix}-google:before { content: @fa-var-google; } +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } +.@{fa-css-prefix}-language:before { content: @fa-var-language; } +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } +.@{fa-css-prefix}-building:before { content: @fa-var-building; } +.@{fa-css-prefix}-child:before { content: @fa-var-child; } +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } +.@{fa-css-prefix}-automobile:before, +.@{fa-css-prefix}-car:before { content: @fa-var-car; } +.@{fa-css-prefix}-cab:before, +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } +.@{fa-css-prefix}-database:before { content: @fa-var-database; } +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } +.@{fa-css-prefix}-file-photo-o:before, +.@{fa-css-prefix}-file-picture-o:before, +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } +.@{fa-css-prefix}-file-zip-o:before, +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } +.@{fa-css-prefix}-file-sound-o:before, +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } +.@{fa-css-prefix}-file-movie-o:before, +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } +.@{fa-css-prefix}-life-bouy:before, +.@{fa-css-prefix}-life-buoy:before, +.@{fa-css-prefix}-life-saver:before, +.@{fa-css-prefix}-support:before, +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } +.@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } +.@{fa-css-prefix}-ge:before, +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } +.@{fa-css-prefix}-git:before { content: @fa-var-git; } +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } +.@{fa-css-prefix}-wechat:before, +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } +.@{fa-css-prefix}-send:before, +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } +.@{fa-css-prefix}-send-o:before, +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } +.@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } +.@{fa-css-prefix}-header:before { content: @fa-var-header; } +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } +.@{fa-css-prefix}-soccer-ball-o:before, +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } +.@{fa-css-prefix}-at:before { content: @fa-var-at; } +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } +.@{fa-css-prefix}-shekel:before, +.@{fa-css-prefix}-sheqel:before, +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } diff --git a/bower_components/font-awesome/less/larger.less b/bower_components/font-awesome/less/larger.less new file mode 100644 index 0000000..c9d6467 --- /dev/null +++ b/bower_components/font-awesome/less/larger.less @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.@{fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.@{fa-css-prefix}-2x { font-size: 2em; } +.@{fa-css-prefix}-3x { font-size: 3em; } +.@{fa-css-prefix}-4x { font-size: 4em; } +.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/bower_components/font-awesome/less/list.less b/bower_components/font-awesome/less/list.less new file mode 100644 index 0000000..0b44038 --- /dev/null +++ b/bower_components/font-awesome/less/list.less @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.@{fa-css-prefix}-ul { + padding-left: 0; + margin-left: @fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.@{fa-css-prefix}-li { + position: absolute; + left: -@fa-li-width; + width: @fa-li-width; + top: (2em / 14); + text-align: center; + &.@{fa-css-prefix}-lg { + left: (-@fa-li-width + (4em / 14)); + } +} diff --git a/bower_components/font-awesome/less/mixins.less b/bower_components/font-awesome/less/mixins.less new file mode 100644 index 0000000..b7bfadc --- /dev/null +++ b/bower_components/font-awesome/less/mixins.less @@ -0,0 +1,25 @@ +// Mixins +// -------------------------- + +.fa-icon() { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.fa-icon-rotate(@degrees, @rotation) { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + transform: rotate(@degrees); +} + +.fa-icon-flip(@horiz, @vert, @rotation) { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); + -webkit-transform: scale(@horiz, @vert); + -ms-transform: scale(@horiz, @vert); + transform: scale(@horiz, @vert); +} diff --git a/bower_components/font-awesome/less/path.less b/bower_components/font-awesome/less/path.less new file mode 100644 index 0000000..c5a6912 --- /dev/null +++ b/bower_components/font-awesome/less/path.less @@ -0,0 +1,14 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); +// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/bower_components/font-awesome/less/rotated-flipped.less b/bower_components/font-awesome/less/rotated-flipped.less new file mode 100644 index 0000000..f6ba814 --- /dev/null +++ b/bower_components/font-awesome/less/rotated-flipped.less @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } + +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } +.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .@{fa-css-prefix}-rotate-90, +:root .@{fa-css-prefix}-rotate-180, +:root .@{fa-css-prefix}-rotate-270, +:root .@{fa-css-prefix}-flip-horizontal, +:root .@{fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/bower_components/font-awesome/less/spinning.less b/bower_components/font-awesome/less/spinning.less new file mode 100644 index 0000000..6e1564e --- /dev/null +++ b/bower_components/font-awesome/less/spinning.less @@ -0,0 +1,29 @@ +// Spinning Icons +// -------------------------- + +.@{fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +@-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); + } +} diff --git a/bower_components/font-awesome/less/stacked.less b/bower_components/font-awesome/less/stacked.less new file mode 100644 index 0000000..fc53fb0 --- /dev/null +++ b/bower_components/font-awesome/less/stacked.less @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.@{fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.@{fa-css-prefix}-stack-1x { line-height: inherit; } +.@{fa-css-prefix}-stack-2x { font-size: 2em; } +.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/bower_components/font-awesome/less/variables.less b/bower_components/font-awesome/less/variables.less new file mode 100644 index 0000000..ccf939d --- /dev/null +++ b/bower_components/font-awesome/less/variables.less @@ -0,0 +1,561 @@ +// Variables +// -------------------------- + +@fa-font-path: "../fonts"; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts"; // for referencing Bootstrap CDN font files directly +@fa-css-prefix: fa; +@fa-version: "4.2.0"; +@fa-border-color: #eee; +@fa-inverse: #fff; +@fa-li-width: (30em / 14); + +@fa-var-adjust: "\f042"; +@fa-var-adn: "\f170"; +@fa-var-align-center: "\f037"; +@fa-var-align-justify: "\f039"; +@fa-var-align-left: "\f036"; +@fa-var-align-right: "\f038"; +@fa-var-ambulance: "\f0f9"; +@fa-var-anchor: "\f13d"; +@fa-var-android: "\f17b"; +@fa-var-angellist: "\f209"; +@fa-var-angle-double-down: "\f103"; +@fa-var-angle-double-left: "\f100"; +@fa-var-angle-double-right: "\f101"; +@fa-var-angle-double-up: "\f102"; +@fa-var-angle-down: "\f107"; +@fa-var-angle-left: "\f104"; +@fa-var-angle-right: "\f105"; +@fa-var-angle-up: "\f106"; +@fa-var-apple: "\f179"; +@fa-var-archive: "\f187"; +@fa-var-area-chart: "\f1fe"; +@fa-var-arrow-circle-down: "\f0ab"; +@fa-var-arrow-circle-left: "\f0a8"; +@fa-var-arrow-circle-o-down: "\f01a"; +@fa-var-arrow-circle-o-left: "\f190"; +@fa-var-arrow-circle-o-right: "\f18e"; +@fa-var-arrow-circle-o-up: "\f01b"; +@fa-var-arrow-circle-right: "\f0a9"; +@fa-var-arrow-circle-up: "\f0aa"; +@fa-var-arrow-down: "\f063"; +@fa-var-arrow-left: "\f060"; +@fa-var-arrow-right: "\f061"; +@fa-var-arrow-up: "\f062"; +@fa-var-arrows: "\f047"; +@fa-var-arrows-alt: "\f0b2"; +@fa-var-arrows-h: "\f07e"; +@fa-var-arrows-v: "\f07d"; +@fa-var-asterisk: "\f069"; +@fa-var-at: "\f1fa"; +@fa-var-automobile: "\f1b9"; +@fa-var-backward: "\f04a"; +@fa-var-ban: "\f05e"; +@fa-var-bank: "\f19c"; +@fa-var-bar-chart: "\f080"; +@fa-var-bar-chart-o: "\f080"; +@fa-var-barcode: "\f02a"; +@fa-var-bars: "\f0c9"; +@fa-var-beer: "\f0fc"; +@fa-var-behance: "\f1b4"; +@fa-var-behance-square: "\f1b5"; +@fa-var-bell: "\f0f3"; +@fa-var-bell-o: "\f0a2"; +@fa-var-bell-slash: "\f1f6"; +@fa-var-bell-slash-o: "\f1f7"; +@fa-var-bicycle: "\f206"; +@fa-var-binoculars: "\f1e5"; +@fa-var-birthday-cake: "\f1fd"; +@fa-var-bitbucket: "\f171"; +@fa-var-bitbucket-square: "\f172"; +@fa-var-bitcoin: "\f15a"; +@fa-var-bold: "\f032"; +@fa-var-bolt: "\f0e7"; +@fa-var-bomb: "\f1e2"; +@fa-var-book: "\f02d"; +@fa-var-bookmark: "\f02e"; +@fa-var-bookmark-o: "\f097"; +@fa-var-briefcase: "\f0b1"; +@fa-var-btc: "\f15a"; +@fa-var-bug: "\f188"; +@fa-var-building: "\f1ad"; +@fa-var-building-o: "\f0f7"; +@fa-var-bullhorn: "\f0a1"; +@fa-var-bullseye: "\f140"; +@fa-var-bus: "\f207"; +@fa-var-cab: "\f1ba"; +@fa-var-calculator: "\f1ec"; +@fa-var-calendar: "\f073"; +@fa-var-calendar-o: "\f133"; +@fa-var-camera: "\f030"; +@fa-var-camera-retro: "\f083"; +@fa-var-car: "\f1b9"; +@fa-var-caret-down: "\f0d7"; +@fa-var-caret-left: "\f0d9"; +@fa-var-caret-right: "\f0da"; +@fa-var-caret-square-o-down: "\f150"; +@fa-var-caret-square-o-left: "\f191"; +@fa-var-caret-square-o-right: "\f152"; +@fa-var-caret-square-o-up: "\f151"; +@fa-var-caret-up: "\f0d8"; +@fa-var-cc: "\f20a"; +@fa-var-cc-amex: "\f1f3"; +@fa-var-cc-discover: "\f1f2"; +@fa-var-cc-mastercard: "\f1f1"; +@fa-var-cc-paypal: "\f1f4"; +@fa-var-cc-stripe: "\f1f5"; +@fa-var-cc-visa: "\f1f0"; +@fa-var-certificate: "\f0a3"; +@fa-var-chain: "\f0c1"; +@fa-var-chain-broken: "\f127"; +@fa-var-check: "\f00c"; +@fa-var-check-circle: "\f058"; +@fa-var-check-circle-o: "\f05d"; +@fa-var-check-square: "\f14a"; +@fa-var-check-square-o: "\f046"; +@fa-var-chevron-circle-down: "\f13a"; +@fa-var-chevron-circle-left: "\f137"; +@fa-var-chevron-circle-right: "\f138"; +@fa-var-chevron-circle-up: "\f139"; +@fa-var-chevron-down: "\f078"; +@fa-var-chevron-left: "\f053"; +@fa-var-chevron-right: "\f054"; +@fa-var-chevron-up: "\f077"; +@fa-var-child: "\f1ae"; +@fa-var-circle: "\f111"; +@fa-var-circle-o: "\f10c"; +@fa-var-circle-o-notch: "\f1ce"; +@fa-var-circle-thin: "\f1db"; +@fa-var-clipboard: "\f0ea"; +@fa-var-clock-o: "\f017"; +@fa-var-close: "\f00d"; +@fa-var-cloud: "\f0c2"; +@fa-var-cloud-download: "\f0ed"; +@fa-var-cloud-upload: "\f0ee"; +@fa-var-cny: "\f157"; +@fa-var-code: "\f121"; +@fa-var-code-fork: "\f126"; +@fa-var-codepen: "\f1cb"; +@fa-var-coffee: "\f0f4"; +@fa-var-cog: "\f013"; +@fa-var-cogs: "\f085"; +@fa-var-columns: "\f0db"; +@fa-var-comment: "\f075"; +@fa-var-comment-o: "\f0e5"; +@fa-var-comments: "\f086"; +@fa-var-comments-o: "\f0e6"; +@fa-var-compass: "\f14e"; +@fa-var-compress: "\f066"; +@fa-var-copy: "\f0c5"; +@fa-var-copyright: "\f1f9"; +@fa-var-credit-card: "\f09d"; +@fa-var-crop: "\f125"; +@fa-var-crosshairs: "\f05b"; +@fa-var-css3: "\f13c"; +@fa-var-cube: "\f1b2"; +@fa-var-cubes: "\f1b3"; +@fa-var-cut: "\f0c4"; +@fa-var-cutlery: "\f0f5"; +@fa-var-dashboard: "\f0e4"; +@fa-var-database: "\f1c0"; +@fa-var-dedent: "\f03b"; +@fa-var-delicious: "\f1a5"; +@fa-var-desktop: "\f108"; +@fa-var-deviantart: "\f1bd"; +@fa-var-digg: "\f1a6"; +@fa-var-dollar: "\f155"; +@fa-var-dot-circle-o: "\f192"; +@fa-var-download: "\f019"; +@fa-var-dribbble: "\f17d"; +@fa-var-dropbox: "\f16b"; +@fa-var-drupal: "\f1a9"; +@fa-var-edit: "\f044"; +@fa-var-eject: "\f052"; +@fa-var-ellipsis-h: "\f141"; +@fa-var-ellipsis-v: "\f142"; +@fa-var-empire: "\f1d1"; +@fa-var-envelope: "\f0e0"; +@fa-var-envelope-o: "\f003"; +@fa-var-envelope-square: "\f199"; +@fa-var-eraser: "\f12d"; +@fa-var-eur: "\f153"; +@fa-var-euro: "\f153"; +@fa-var-exchange: "\f0ec"; +@fa-var-exclamation: "\f12a"; +@fa-var-exclamation-circle: "\f06a"; +@fa-var-exclamation-triangle: "\f071"; +@fa-var-expand: "\f065"; +@fa-var-external-link: "\f08e"; +@fa-var-external-link-square: "\f14c"; +@fa-var-eye: "\f06e"; +@fa-var-eye-slash: "\f070"; +@fa-var-eyedropper: "\f1fb"; +@fa-var-facebook: "\f09a"; +@fa-var-facebook-square: "\f082"; +@fa-var-fast-backward: "\f049"; +@fa-var-fast-forward: "\f050"; +@fa-var-fax: "\f1ac"; +@fa-var-female: "\f182"; +@fa-var-fighter-jet: "\f0fb"; +@fa-var-file: "\f15b"; +@fa-var-file-archive-o: "\f1c6"; +@fa-var-file-audio-o: "\f1c7"; +@fa-var-file-code-o: "\f1c9"; +@fa-var-file-excel-o: "\f1c3"; +@fa-var-file-image-o: "\f1c5"; +@fa-var-file-movie-o: "\f1c8"; +@fa-var-file-o: "\f016"; +@fa-var-file-pdf-o: "\f1c1"; +@fa-var-file-photo-o: "\f1c5"; +@fa-var-file-picture-o: "\f1c5"; +@fa-var-file-powerpoint-o: "\f1c4"; +@fa-var-file-sound-o: "\f1c7"; +@fa-var-file-text: "\f15c"; +@fa-var-file-text-o: "\f0f6"; +@fa-var-file-video-o: "\f1c8"; +@fa-var-file-word-o: "\f1c2"; +@fa-var-file-zip-o: "\f1c6"; +@fa-var-files-o: "\f0c5"; +@fa-var-film: "\f008"; +@fa-var-filter: "\f0b0"; +@fa-var-fire: "\f06d"; +@fa-var-fire-extinguisher: "\f134"; +@fa-var-flag: "\f024"; +@fa-var-flag-checkered: "\f11e"; +@fa-var-flag-o: "\f11d"; +@fa-var-flash: "\f0e7"; +@fa-var-flask: "\f0c3"; +@fa-var-flickr: "\f16e"; +@fa-var-floppy-o: "\f0c7"; +@fa-var-folder: "\f07b"; +@fa-var-folder-o: "\f114"; +@fa-var-folder-open: "\f07c"; +@fa-var-folder-open-o: "\f115"; +@fa-var-font: "\f031"; +@fa-var-forward: "\f04e"; +@fa-var-foursquare: "\f180"; +@fa-var-frown-o: "\f119"; +@fa-var-futbol-o: "\f1e3"; +@fa-var-gamepad: "\f11b"; +@fa-var-gavel: "\f0e3"; +@fa-var-gbp: "\f154"; +@fa-var-ge: "\f1d1"; +@fa-var-gear: "\f013"; +@fa-var-gears: "\f085"; +@fa-var-gift: "\f06b"; +@fa-var-git: "\f1d3"; +@fa-var-git-square: "\f1d2"; +@fa-var-github: "\f09b"; +@fa-var-github-alt: "\f113"; +@fa-var-github-square: "\f092"; +@fa-var-gittip: "\f184"; +@fa-var-glass: "\f000"; +@fa-var-globe: "\f0ac"; +@fa-var-google: "\f1a0"; +@fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-square: "\f0d4"; +@fa-var-google-wallet: "\f1ee"; +@fa-var-graduation-cap: "\f19d"; +@fa-var-group: "\f0c0"; +@fa-var-h-square: "\f0fd"; +@fa-var-hacker-news: "\f1d4"; +@fa-var-hand-o-down: "\f0a7"; +@fa-var-hand-o-left: "\f0a5"; +@fa-var-hand-o-right: "\f0a4"; +@fa-var-hand-o-up: "\f0a6"; +@fa-var-hdd-o: "\f0a0"; +@fa-var-header: "\f1dc"; +@fa-var-headphones: "\f025"; +@fa-var-heart: "\f004"; +@fa-var-heart-o: "\f08a"; +@fa-var-history: "\f1da"; +@fa-var-home: "\f015"; +@fa-var-hospital-o: "\f0f8"; +@fa-var-html5: "\f13b"; +@fa-var-ils: "\f20b"; +@fa-var-image: "\f03e"; +@fa-var-inbox: "\f01c"; +@fa-var-indent: "\f03c"; +@fa-var-info: "\f129"; +@fa-var-info-circle: "\f05a"; +@fa-var-inr: "\f156"; +@fa-var-instagram: "\f16d"; +@fa-var-institution: "\f19c"; +@fa-var-ioxhost: "\f208"; +@fa-var-italic: "\f033"; +@fa-var-joomla: "\f1aa"; +@fa-var-jpy: "\f157"; +@fa-var-jsfiddle: "\f1cc"; +@fa-var-key: "\f084"; +@fa-var-keyboard-o: "\f11c"; +@fa-var-krw: "\f159"; +@fa-var-language: "\f1ab"; +@fa-var-laptop: "\f109"; +@fa-var-lastfm: "\f202"; +@fa-var-lastfm-square: "\f203"; +@fa-var-leaf: "\f06c"; +@fa-var-legal: "\f0e3"; +@fa-var-lemon-o: "\f094"; +@fa-var-level-down: "\f149"; +@fa-var-level-up: "\f148"; +@fa-var-life-bouy: "\f1cd"; +@fa-var-life-buoy: "\f1cd"; +@fa-var-life-ring: "\f1cd"; +@fa-var-life-saver: "\f1cd"; +@fa-var-lightbulb-o: "\f0eb"; +@fa-var-line-chart: "\f201"; +@fa-var-link: "\f0c1"; +@fa-var-linkedin: "\f0e1"; +@fa-var-linkedin-square: "\f08c"; +@fa-var-linux: "\f17c"; +@fa-var-list: "\f03a"; +@fa-var-list-alt: "\f022"; +@fa-var-list-ol: "\f0cb"; +@fa-var-list-ul: "\f0ca"; +@fa-var-location-arrow: "\f124"; +@fa-var-lock: "\f023"; +@fa-var-long-arrow-down: "\f175"; +@fa-var-long-arrow-left: "\f177"; +@fa-var-long-arrow-right: "\f178"; +@fa-var-long-arrow-up: "\f176"; +@fa-var-magic: "\f0d0"; +@fa-var-magnet: "\f076"; +@fa-var-mail-forward: "\f064"; +@fa-var-mail-reply: "\f112"; +@fa-var-mail-reply-all: "\f122"; +@fa-var-male: "\f183"; +@fa-var-map-marker: "\f041"; +@fa-var-maxcdn: "\f136"; +@fa-var-meanpath: "\f20c"; +@fa-var-medkit: "\f0fa"; +@fa-var-meh-o: "\f11a"; +@fa-var-microphone: "\f130"; +@fa-var-microphone-slash: "\f131"; +@fa-var-minus: "\f068"; +@fa-var-minus-circle: "\f056"; +@fa-var-minus-square: "\f146"; +@fa-var-minus-square-o: "\f147"; +@fa-var-mobile: "\f10b"; +@fa-var-mobile-phone: "\f10b"; +@fa-var-money: "\f0d6"; +@fa-var-moon-o: "\f186"; +@fa-var-mortar-board: "\f19d"; +@fa-var-music: "\f001"; +@fa-var-navicon: "\f0c9"; +@fa-var-newspaper-o: "\f1ea"; +@fa-var-openid: "\f19b"; +@fa-var-outdent: "\f03b"; +@fa-var-pagelines: "\f18c"; +@fa-var-paint-brush: "\f1fc"; +@fa-var-paper-plane: "\f1d8"; +@fa-var-paper-plane-o: "\f1d9"; +@fa-var-paperclip: "\f0c6"; +@fa-var-paragraph: "\f1dd"; +@fa-var-paste: "\f0ea"; +@fa-var-pause: "\f04c"; +@fa-var-paw: "\f1b0"; +@fa-var-paypal: "\f1ed"; +@fa-var-pencil: "\f040"; +@fa-var-pencil-square: "\f14b"; +@fa-var-pencil-square-o: "\f044"; +@fa-var-phone: "\f095"; +@fa-var-phone-square: "\f098"; +@fa-var-photo: "\f03e"; +@fa-var-picture-o: "\f03e"; +@fa-var-pie-chart: "\f200"; +@fa-var-pied-piper: "\f1a7"; +@fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-square: "\f0d3"; +@fa-var-plane: "\f072"; +@fa-var-play: "\f04b"; +@fa-var-play-circle: "\f144"; +@fa-var-play-circle-o: "\f01d"; +@fa-var-plug: "\f1e6"; +@fa-var-plus: "\f067"; +@fa-var-plus-circle: "\f055"; +@fa-var-plus-square: "\f0fe"; +@fa-var-plus-square-o: "\f196"; +@fa-var-power-off: "\f011"; +@fa-var-print: "\f02f"; +@fa-var-puzzle-piece: "\f12e"; +@fa-var-qq: "\f1d6"; +@fa-var-qrcode: "\f029"; +@fa-var-question: "\f128"; +@fa-var-question-circle: "\f059"; +@fa-var-quote-left: "\f10d"; +@fa-var-quote-right: "\f10e"; +@fa-var-ra: "\f1d0"; +@fa-var-random: "\f074"; +@fa-var-rebel: "\f1d0"; +@fa-var-recycle: "\f1b8"; +@fa-var-reddit: "\f1a1"; +@fa-var-reddit-square: "\f1a2"; +@fa-var-refresh: "\f021"; +@fa-var-remove: "\f00d"; +@fa-var-renren: "\f18b"; +@fa-var-reorder: "\f0c9"; +@fa-var-repeat: "\f01e"; +@fa-var-reply: "\f112"; +@fa-var-reply-all: "\f122"; +@fa-var-retweet: "\f079"; +@fa-var-rmb: "\f157"; +@fa-var-road: "\f018"; +@fa-var-rocket: "\f135"; +@fa-var-rotate-left: "\f0e2"; +@fa-var-rotate-right: "\f01e"; +@fa-var-rouble: "\f158"; +@fa-var-rss: "\f09e"; +@fa-var-rss-square: "\f143"; +@fa-var-rub: "\f158"; +@fa-var-ruble: "\f158"; +@fa-var-rupee: "\f156"; +@fa-var-save: "\f0c7"; +@fa-var-scissors: "\f0c4"; +@fa-var-search: "\f002"; +@fa-var-search-minus: "\f010"; +@fa-var-search-plus: "\f00e"; +@fa-var-send: "\f1d8"; +@fa-var-send-o: "\f1d9"; +@fa-var-share: "\f064"; +@fa-var-share-alt: "\f1e0"; +@fa-var-share-alt-square: "\f1e1"; +@fa-var-share-square: "\f14d"; +@fa-var-share-square-o: "\f045"; +@fa-var-shekel: "\f20b"; +@fa-var-sheqel: "\f20b"; +@fa-var-shield: "\f132"; +@fa-var-shopping-cart: "\f07a"; +@fa-var-sign-in: "\f090"; +@fa-var-sign-out: "\f08b"; +@fa-var-signal: "\f012"; +@fa-var-sitemap: "\f0e8"; +@fa-var-skype: "\f17e"; +@fa-var-slack: "\f198"; +@fa-var-sliders: "\f1de"; +@fa-var-slideshare: "\f1e7"; +@fa-var-smile-o: "\f118"; +@fa-var-soccer-ball-o: "\f1e3"; +@fa-var-sort: "\f0dc"; +@fa-var-sort-alpha-asc: "\f15d"; +@fa-var-sort-alpha-desc: "\f15e"; +@fa-var-sort-amount-asc: "\f160"; +@fa-var-sort-amount-desc: "\f161"; +@fa-var-sort-asc: "\f0de"; +@fa-var-sort-desc: "\f0dd"; +@fa-var-sort-down: "\f0dd"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; +@fa-var-sort-up: "\f0de"; +@fa-var-soundcloud: "\f1be"; +@fa-var-space-shuttle: "\f197"; +@fa-var-spinner: "\f110"; +@fa-var-spoon: "\f1b1"; +@fa-var-spotify: "\f1bc"; +@fa-var-square: "\f0c8"; +@fa-var-square-o: "\f096"; +@fa-var-stack-exchange: "\f18d"; +@fa-var-stack-overflow: "\f16c"; +@fa-var-star: "\f005"; +@fa-var-star-half: "\f089"; +@fa-var-star-half-empty: "\f123"; +@fa-var-star-half-full: "\f123"; +@fa-var-star-half-o: "\f123"; +@fa-var-star-o: "\f006"; +@fa-var-steam: "\f1b6"; +@fa-var-steam-square: "\f1b7"; +@fa-var-step-backward: "\f048"; +@fa-var-step-forward: "\f051"; +@fa-var-stethoscope: "\f0f1"; +@fa-var-stop: "\f04d"; +@fa-var-strikethrough: "\f0cc"; +@fa-var-stumbleupon: "\f1a4"; +@fa-var-stumbleupon-circle: "\f1a3"; +@fa-var-subscript: "\f12c"; +@fa-var-suitcase: "\f0f2"; +@fa-var-sun-o: "\f185"; +@fa-var-superscript: "\f12b"; +@fa-var-support: "\f1cd"; +@fa-var-table: "\f0ce"; +@fa-var-tablet: "\f10a"; +@fa-var-tachometer: "\f0e4"; +@fa-var-tag: "\f02b"; +@fa-var-tags: "\f02c"; +@fa-var-tasks: "\f0ae"; +@fa-var-taxi: "\f1ba"; +@fa-var-tencent-weibo: "\f1d5"; +@fa-var-terminal: "\f120"; +@fa-var-text-height: "\f034"; +@fa-var-text-width: "\f035"; +@fa-var-th: "\f00a"; +@fa-var-th-large: "\f009"; +@fa-var-th-list: "\f00b"; +@fa-var-thumb-tack: "\f08d"; +@fa-var-thumbs-down: "\f165"; +@fa-var-thumbs-o-down: "\f088"; +@fa-var-thumbs-o-up: "\f087"; +@fa-var-thumbs-up: "\f164"; +@fa-var-ticket: "\f145"; +@fa-var-times: "\f00d"; +@fa-var-times-circle: "\f057"; +@fa-var-times-circle-o: "\f05c"; +@fa-var-tint: "\f043"; +@fa-var-toggle-down: "\f150"; +@fa-var-toggle-left: "\f191"; +@fa-var-toggle-off: "\f204"; +@fa-var-toggle-on: "\f205"; +@fa-var-toggle-right: "\f152"; +@fa-var-toggle-up: "\f151"; +@fa-var-trash: "\f1f8"; +@fa-var-trash-o: "\f014"; +@fa-var-tree: "\f1bb"; +@fa-var-trello: "\f181"; +@fa-var-trophy: "\f091"; +@fa-var-truck: "\f0d1"; +@fa-var-try: "\f195"; +@fa-var-tty: "\f1e4"; +@fa-var-tumblr: "\f173"; +@fa-var-tumblr-square: "\f174"; +@fa-var-turkish-lira: "\f195"; +@fa-var-twitch: "\f1e8"; +@fa-var-twitter: "\f099"; +@fa-var-twitter-square: "\f081"; +@fa-var-umbrella: "\f0e9"; +@fa-var-underline: "\f0cd"; +@fa-var-undo: "\f0e2"; +@fa-var-university: "\f19c"; +@fa-var-unlink: "\f127"; +@fa-var-unlock: "\f09c"; +@fa-var-unlock-alt: "\f13e"; +@fa-var-unsorted: "\f0dc"; +@fa-var-upload: "\f093"; +@fa-var-usd: "\f155"; +@fa-var-user: "\f007"; +@fa-var-user-md: "\f0f0"; +@fa-var-users: "\f0c0"; +@fa-var-video-camera: "\f03d"; +@fa-var-vimeo-square: "\f194"; +@fa-var-vine: "\f1ca"; +@fa-var-vk: "\f189"; +@fa-var-volume-down: "\f027"; +@fa-var-volume-off: "\f026"; +@fa-var-volume-up: "\f028"; +@fa-var-warning: "\f071"; +@fa-var-wechat: "\f1d7"; +@fa-var-weibo: "\f18a"; +@fa-var-weixin: "\f1d7"; +@fa-var-wheelchair: "\f193"; +@fa-var-wifi: "\f1eb"; +@fa-var-windows: "\f17a"; +@fa-var-won: "\f159"; +@fa-var-wordpress: "\f19a"; +@fa-var-wrench: "\f0ad"; +@fa-var-xing: "\f168"; +@fa-var-xing-square: "\f169"; +@fa-var-yahoo: "\f19e"; +@fa-var-yelp: "\f1e9"; +@fa-var-yen: "\f157"; +@fa-var-youtube: "\f167"; +@fa-var-youtube-play: "\f16a"; +@fa-var-youtube-square: "\f166"; + diff --git a/bower_components/font-awesome/scss/_bordered-pulled.scss b/bower_components/font-awesome/scss/_bordered-pulled.scss new file mode 100644 index 0000000..9d3fdf3 --- /dev/null +++ b/bower_components/font-awesome/scss/_bordered-pulled.scss @@ -0,0 +1,16 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/bower_components/font-awesome/scss/_core.scss b/bower_components/font-awesome/scss/_core.scss new file mode 100644 index 0000000..ca46d37 --- /dev/null +++ b/bower_components/font-awesome/scss/_core.scss @@ -0,0 +1,11 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/bower_components/font-awesome/scss/_extras.scss b/bower_components/font-awesome/scss/_extras.scss new file mode 100644 index 0000000..93139c5 --- /dev/null +++ b/bower_components/font-awesome/scss/_extras.scss @@ -0,0 +1,44 @@ +/* EXTRAS + * -------------------------- */ + +/* Stacked and layered icon */ + +/* Animated rotating icon */ +.#{$fa-css-prefix}-spin { + -webkit-animation: spin 2s infinite linear; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} + +@-moz-keyframes spin { + 0% { -moz-transform: rotate(0deg); } + 100% { -moz-transform: rotate(359deg); } +} +@-webkit-keyframes spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@-o-keyframes spin { + 0% { -o-transform: rotate(0deg); } + 100% { -o-transform: rotate(359deg); } +} +@-ms-keyframes spin { + 0% { -ms-transform: rotate(0deg); } + 100% { -ms-transform: rotate(359deg); } +} +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} + + +// Icon rotations & flipping +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } diff --git a/bower_components/font-awesome/scss/_fixed-width.scss b/bower_components/font-awesome/scss/_fixed-width.scss new file mode 100644 index 0000000..b221c98 --- /dev/null +++ b/bower_components/font-awesome/scss/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/bower_components/font-awesome/scss/_icons.scss b/bower_components/font-awesome/scss/_icons.scss new file mode 100644 index 0000000..8dc2939 --- /dev/null +++ b/bower_components/font-awesome/scss/_icons.scss @@ -0,0 +1,552 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before { content: $fa-var-gittip; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } diff --git a/bower_components/font-awesome/scss/_larger.scss b/bower_components/font-awesome/scss/_larger.scss new file mode 100644 index 0000000..41e9a81 --- /dev/null +++ b/bower_components/font-awesome/scss/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/bower_components/font-awesome/scss/_list.scss b/bower_components/font-awesome/scss/_list.scss new file mode 100644 index 0000000..7d1e4d5 --- /dev/null +++ b/bower_components/font-awesome/scss/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/bower_components/font-awesome/scss/_mixins.scss b/bower_components/font-awesome/scss/_mixins.scss new file mode 100644 index 0000000..a139dfb --- /dev/null +++ b/bower_components/font-awesome/scss/_mixins.scss @@ -0,0 +1,25 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +@mixin fa-icon-rotate($degrees, $rotation) { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} diff --git a/bower_components/font-awesome/scss/_path.scss b/bower_components/font-awesome/scss/_path.scss new file mode 100644 index 0000000..fd21c35 --- /dev/null +++ b/bower_components/font-awesome/scss/_path.scss @@ -0,0 +1,14 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); + //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/bower_components/font-awesome/scss/_rotated-flipped.scss b/bower_components/font-awesome/scss/_rotated-flipped.scss new file mode 100644 index 0000000..a3558fd --- /dev/null +++ b/bower_components/font-awesome/scss/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/bower_components/font-awesome/scss/_spinning.scss b/bower_components/font-awesome/scss/_spinning.scss new file mode 100644 index 0000000..002c5d5 --- /dev/null +++ b/bower_components/font-awesome/scss/_spinning.scss @@ -0,0 +1,29 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +@-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); + } +} diff --git a/bower_components/font-awesome/scss/_stacked.scss b/bower_components/font-awesome/scss/_stacked.scss new file mode 100644 index 0000000..aef7403 --- /dev/null +++ b/bower_components/font-awesome/scss/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/bower_components/font-awesome/scss/_variables.scss b/bower_components/font-awesome/scss/_variables.scss new file mode 100644 index 0000000..669c307 --- /dev/null +++ b/bower_components/font-awesome/scss/_variables.scss @@ -0,0 +1,561 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.2.0" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-ambulance: "\f0f9"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-ban: "\f05e"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-o: "\f133"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-credit-card: "\f09d"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-database: "\f1c0"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edit: "\f044"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-square: "\f199"; +$fa-var-eraser: "\f12d"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-html5: "\f13b"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map-marker: "\f041"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medkit: "\f0fa"; +$fa-var-meh-o: "\f11a"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-openid: "\f19b"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f1a7"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-stop: "\f04d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-md: "\f0f0"; +$fa-var-users: "\f0c0"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-wheelchair: "\f193"; +$fa-var-wifi: "\f1eb"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-yahoo: "\f19e"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/bower_components/font-awesome/scss/font-awesome.scss b/bower_components/font-awesome/scss/font-awesome.scss new file mode 100644 index 0000000..f300c09 --- /dev/null +++ b/bower_components/font-awesome/scss/font-awesome.scss @@ -0,0 +1,17 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "spinning"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; diff --git a/bower_components/generate-PDF/html2canvas.min.js b/bower_components/generate-PDF/html2canvas.min.js new file mode 100644 index 0000000..2ea032d --- /dev/null +++ b/bower_components/generate-PDF/html2canvas.min.js @@ -0,0 +1,8 @@ +/* + html2canvas 0.4.1 + Copyright (c) 2013 Niklas von Hertzen + + Released under MIT License +*/ +(function(t,e,n){"use strict";function r(t,e,n){var r,a=t.runtimeStyle&&t.runtimeStyle[e],o=t.style;return!/^-?[0-9]+\.?[0-9]*(?:px)?$/i.test(n)&&/^-?\d/.test(n)&&(r=o.left,a&&(t.runtimeStyle.left=t.currentStyle.left),o.left="fontSize"===e?"1em":n||0,n=o.pixelLeft+"px",o.left=r,a&&(t.runtimeStyle.left=a)),/^(thin|medium|thick)$/i.test(n)?n:Math.round(parseFloat(n))+"px"}function a(t){return parseInt(t,10)}function o(t,e,a,o){if(t=(t||"").split(","),t=t[o||0]||t[0]||"auto",t=u.Util.trimText(t).split(" "),"backgroundSize"!==a||t[0]&&!t[0].match(/cover|contain|auto/)){if(t[0]=-1===t[0].indexOf("%")?r(e,a+"X",t[0]):t[0],t[1]===n){if("backgroundSize"===a)return t[1]="auto",t;t[1]=t[0]}t[1]=-1===t[1].indexOf("%")?r(e,a+"Y",t[1]):t[1]}else;return t}function i(t,e,n,r,a,o){var i,l,s,c,d=u.Util.getCSS(e,t,a);if(1===d.length&&(c=d[0],d=[],d[0]=c,d[1]=c),-1!==(""+d[0]).indexOf("%"))s=parseFloat(d[0])/100,l=n.width*s,"backgroundSize"!==t&&(l-=(o||r).width*s);else if("backgroundSize"===t)if("auto"===d[0])l=r.width;else if(/contain|cover/.test(d[0])){var h=u.Util.resizeBounds(r.width,r.height,n.width,n.height,d[0]);l=h.width,i=h.height}else l=parseInt(d[0],10);else l=parseInt(d[0],10);return"auto"===d[1]?i=l/r.width*r.height:-1!==(""+d[1]).indexOf("%")?(s=parseFloat(d[1])/100,i=n.height*s,"backgroundSize"!==t&&(i-=(o||r).height*s)):i=parseInt(d[1],10),[l,i]}function l(t,e){var n=[];return{storage:n,width:t,height:e,clip:function(){n.push({type:"function",name:"clip",arguments:arguments})},translate:function(){n.push({type:"function",name:"translate",arguments:arguments})},fill:function(){n.push({type:"function",name:"fill",arguments:arguments})},save:function(){n.push({type:"function",name:"save",arguments:arguments})},restore:function(){n.push({type:"function",name:"restore",arguments:arguments})},fillRect:function(){n.push({type:"function",name:"fillRect",arguments:arguments})},createPattern:function(){n.push({type:"function",name:"createPattern",arguments:arguments})},drawShape:function(){var t=[];return n.push({type:"function",name:"drawShape",arguments:t}),{moveTo:function(){t.push({name:"moveTo",arguments:arguments})},lineTo:function(){t.push({name:"lineTo",arguments:arguments})},arcTo:function(){t.push({name:"arcTo",arguments:arguments})},bezierCurveTo:function(){t.push({name:"bezierCurveTo",arguments:arguments})},quadraticCurveTo:function(){t.push({name:"quadraticCurveTo",arguments:arguments})}}},drawImage:function(){n.push({type:"function",name:"drawImage",arguments:arguments})},fillText:function(){n.push({type:"function",name:"fillText",arguments:arguments})},setVariable:function(t,e){return n.push({type:"variable",name:t,arguments:e}),e}}}function s(t){return{zindex:t,children:[]}}var c,d,u={};u.Util={},u.Util.log=function(e){u.logging&&t.console&&t.console.log&&t.console.log(e)},u.Util.trimText=function(t){return function(e){return t?t.apply(e):((e||"")+"").replace(/^\s+|\s+$/g,"")}}(String.prototype.trim),u.Util.asFloat=function(t){return parseFloat(t)},function(){var t=/((rgba|rgb)\([^\)]+\)(\s-?\d+px){0,})/g,e=/(-?\d+px)|(#.+)|(rgb\(.+\))|(rgba\(.+\))/g;u.Util.parseTextShadows=function(n){if(!n||"none"===n)return[];for(var r=n.match(t),a=[],o=0;r&&r.length>o;o++){var i=r[o].match(e);a.push({color:i[0],offsetX:i[1]?i[1].replace("px",""):0,offsetY:i[2]?i[2].replace("px",""):0,blur:i[3]?i[3].replace("px",""):0})}return a}}(),u.Util.parseBackgroundImage=function(t){var e,n,r,a,o,i,l,s,c=" \r\n ",d=[],u=0,h=0,f=function(){e&&('"'===n.substr(0,1)&&(n=n.substr(1,n.length-2)),n&&s.push(n),"-"===e.substr(0,1)&&(a=e.indexOf("-",1)+1)>0&&(r=e.substr(0,a),e=e.substr(a)),d.push({prefix:r,method:e.toLowerCase(),value:o,args:s})),s=[],e=r=n=o=""};f();for(var p=0,g=t.length;g>p;p++)if(i=t[p],!(0===u&&c.indexOf(i)>-1)){switch(i){case'"':l?l===i&&(l=null):l=i;break;case"(":if(l)break;if(0===u){u=1,o+=i;continue}h++;break;case")":if(l)break;if(1===u){if(0===h){u=0,o+=i,f();continue}h--}break;case",":if(l)break;if(0===u){f();continue}if(1===u&&0===h&&!e.match(/^url$/i)){s.push(n),n="",o+=i;continue}}o+=i,0===u?e+=i:n+=i}return f(),d},u.Util.Bounds=function(t){var e,n={};return t.getBoundingClientRect&&(e=t.getBoundingClientRect(),n.top=e.top,n.bottom=e.bottom||e.top+e.height,n.left=e.left,n.width=t.offsetWidth,n.height=t.offsetHeight),n},u.Util.OffsetBounds=function(t){var e=t.offsetParent?u.Util.OffsetBounds(t.offsetParent):{top:0,left:0};return{top:t.offsetTop+e.top,bottom:t.offsetTop+t.offsetHeight+e.top,left:t.offsetLeft+e.left,width:t.offsetWidth,height:t.offsetHeight}},u.Util.getCSS=function(t,n,r){c!==t&&(d=e.defaultView.getComputedStyle(t,null));var i=d[n];if(/^background(Size|Position)$/.test(n))return o(i,t,n,r);if(/border(Top|Bottom)(Left|Right)Radius/.test(n)){var l=i.split(" ");return 1>=l.length&&(l[1]=l[0]),l.map(a)}return i},u.Util.resizeBounds=function(t,e,n,r,a){var o,i,l=n/r,s=t/e;return a&&"auto"!==a?s>l^"contain"===a?(i=r,o=r*s):(o=n,i=n/s):(o=n,i=r),{width:o,height:i}},u.Util.BackgroundPosition=function(t,e,n,r,a){var o=i("backgroundPosition",t,e,n,r,a);return{left:o[0],top:o[1]}},u.Util.BackgroundSize=function(t,e,n,r){var a=i("backgroundSize",t,e,n,r);return{width:a[0],height:a[1]}},u.Util.Extend=function(t,e){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e},u.Util.Children=function(t){var e;try{e=t.nodeName&&"IFRAME"===t.nodeName.toUpperCase()?t.contentDocument||t.contentWindow.document:function(t){var e=[];return null!==t&&function(t,e){var r=t.length,a=0;if("number"==typeof e.length)for(var o=e.length;o>a;a++)t[r++]=e[a];else for(;e[a]!==n;)t[r++]=e[a++];return t.length=r,t}(e,t),e}(t.childNodes)}catch(r){u.Util.log("html2canvas.Util.Children failed with exception: "+r.message),e=[]}return e},u.Util.isTransparent=function(t){return"transparent"===t||"rgba(0, 0, 0, 0)"===t},u.Util.Font=function(){var t={};return function(e,r,a){if(t[e+"-"+r]!==n)return t[e+"-"+r];var o,i,l,s=a.createElement("div"),c=a.createElement("img"),d=a.createElement("span"),u="Hidden Text";return s.style.visibility="hidden",s.style.fontFamily=e,s.style.fontSize=r,s.style.margin=0,s.style.padding=0,a.body.appendChild(s),c.src="data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACwAAAAAAQABAAACAkQBADs=",c.width=1,c.height=1,c.style.margin=0,c.style.padding=0,c.style.verticalAlign="baseline",d.style.fontFamily=e,d.style.fontSize=r,d.style.margin=0,d.style.padding=0,d.appendChild(a.createTextNode(u)),s.appendChild(d),s.appendChild(c),o=c.offsetTop-d.offsetTop+1,s.removeChild(d),s.appendChild(a.createTextNode(u)),s.style.lineHeight="normal",c.style.verticalAlign="super",i=c.offsetTop-s.offsetTop+1,l={baseline:o,lineWidth:1,middle:i},t[e+"-"+r]=l,a.body.removeChild(s),l}}(),function(){function t(t){return function(e){try{t.addColorStop(e.stop,e.color)}catch(r){n.log(["failed to add color stop: ",r,"; tried to add: ",e])}}}var n=u.Util,r={};u.Generate=r;var a=[/^(-webkit-linear-gradient)\(([a-z\s]+)([\w\d\.\s,%\(\)]+)\)$/,/^(-o-linear-gradient)\(([a-z\s]+)([\w\d\.\s,%\(\)]+)\)$/,/^(-webkit-gradient)\((linear|radial),\s((?:\d{1,3}%?)\s(?:\d{1,3}%?),\s(?:\d{1,3}%?)\s(?:\d{1,3}%?))([\w\d\.\s,%\(\)\-]+)\)$/,/^(-moz-linear-gradient)\(((?:\d{1,3}%?)\s(?:\d{1,3}%?))([\w\d\.\s,%\(\)]+)\)$/,/^(-webkit-radial-gradient)\(((?:\d{1,3}%?)\s(?:\d{1,3}%?)),\s(\w+)\s([a-z\-]+)([\w\d\.\s,%\(\)]+)\)$/,/^(-moz-radial-gradient)\(((?:\d{1,3}%?)\s(?:\d{1,3}%?)),\s(\w+)\s?([a-z\-]*)([\w\d\.\s,%\(\)]+)\)$/,/^(-o-radial-gradient)\(((?:\d{1,3}%?)\s(?:\d{1,3}%?)),\s(\w+)\s([a-z\-]+)([\w\d\.\s,%\(\)]+)\)$/];r.parseGradient=function(t,e){var n,r,o,i,l,s,c,d,u,h,f,p,g=a.length;for(r=0;g>r&&!(o=t.match(a[r]));r+=1);if(o)switch(o[1]){case"-webkit-linear-gradient":case"-o-linear-gradient":if(n={type:"linear",x0:null,y0:null,x1:null,y1:null,colorStops:[]},l=o[2].match(/\w+/g))for(s=l.length,r=0;s>r;r+=1)switch(l[r]){case"top":n.y0=0,n.y1=e.height;break;case"right":n.x0=e.width,n.x1=0;break;case"bottom":n.y0=e.height,n.y1=0;break;case"left":n.x0=0,n.x1=e.width}if(null===n.x0&&null===n.x1&&(n.x0=n.x1=e.width/2),null===n.y0&&null===n.y1&&(n.y0=n.y1=e.height/2),l=o[3].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\)(?:\s\d{1,3}(?:%|px))?)+/g))for(s=l.length,c=1/Math.max(s-1,1),r=0;s>r;r+=1)d=l[r].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\))\s*(\d{1,3})?(%|px)?/),d[2]?(i=parseFloat(d[2]),i/="%"===d[3]?100:e.width):i=r*c,n.colorStops.push({color:d[1],stop:i});break;case"-webkit-gradient":if(n={type:"radial"===o[2]?"circle":o[2],x0:0,y0:0,x1:0,y1:0,colorStops:[]},l=o[3].match(/(\d{1,3})%?\s(\d{1,3})%?,\s(\d{1,3})%?\s(\d{1,3})%?/),l&&(n.x0=l[1]*e.width/100,n.y0=l[2]*e.height/100,n.x1=l[3]*e.width/100,n.y1=l[4]*e.height/100),l=o[4].match(/((?:from|to|color-stop)\((?:[0-9\.]+,\s)?(?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\)\))+/g))for(s=l.length,r=0;s>r;r+=1)d=l[r].match(/(from|to|color-stop)\(([0-9\.]+)?(?:,\s)?((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\))\)/),i=parseFloat(d[2]),"from"===d[1]&&(i=0),"to"===d[1]&&(i=1),n.colorStops.push({color:d[3],stop:i});break;case"-moz-linear-gradient":if(n={type:"linear",x0:0,y0:0,x1:0,y1:0,colorStops:[]},l=o[2].match(/(\d{1,3})%?\s(\d{1,3})%?/),l&&(n.x0=l[1]*e.width/100,n.y0=l[2]*e.height/100,n.x1=e.width-n.x0,n.y1=e.height-n.y0),l=o[3].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\)(?:\s\d{1,3}%)?)+/g))for(s=l.length,c=1/Math.max(s-1,1),r=0;s>r;r+=1)d=l[r].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\))\s*(\d{1,3})?(%)?/),d[2]?(i=parseFloat(d[2]),d[3]&&(i/=100)):i=r*c,n.colorStops.push({color:d[1],stop:i});break;case"-webkit-radial-gradient":case"-moz-radial-gradient":case"-o-radial-gradient":if(n={type:"circle",x0:0,y0:0,x1:e.width,y1:e.height,cx:0,cy:0,rx:0,ry:0,colorStops:[]},l=o[2].match(/(\d{1,3})%?\s(\d{1,3})%?/),l&&(n.cx=l[1]*e.width/100,n.cy=l[2]*e.height/100),l=o[3].match(/\w+/),d=o[4].match(/[a-z\-]*/),l&&d)switch(d[0]){case"farthest-corner":case"cover":case"":u=Math.sqrt(Math.pow(n.cx,2)+Math.pow(n.cy,2)),h=Math.sqrt(Math.pow(n.cx,2)+Math.pow(n.y1-n.cy,2)),f=Math.sqrt(Math.pow(n.x1-n.cx,2)+Math.pow(n.y1-n.cy,2)),p=Math.sqrt(Math.pow(n.x1-n.cx,2)+Math.pow(n.cy,2)),n.rx=n.ry=Math.max(u,h,f,p);break;case"closest-corner":u=Math.sqrt(Math.pow(n.cx,2)+Math.pow(n.cy,2)),h=Math.sqrt(Math.pow(n.cx,2)+Math.pow(n.y1-n.cy,2)),f=Math.sqrt(Math.pow(n.x1-n.cx,2)+Math.pow(n.y1-n.cy,2)),p=Math.sqrt(Math.pow(n.x1-n.cx,2)+Math.pow(n.cy,2)),n.rx=n.ry=Math.min(u,h,f,p);break;case"farthest-side":"circle"===l[0]?n.rx=n.ry=Math.max(n.cx,n.cy,n.x1-n.cx,n.y1-n.cy):(n.type=l[0],n.rx=Math.max(n.cx,n.x1-n.cx),n.ry=Math.max(n.cy,n.y1-n.cy));break;case"closest-side":case"contain":"circle"===l[0]?n.rx=n.ry=Math.min(n.cx,n.cy,n.x1-n.cx,n.y1-n.cy):(n.type=l[0],n.rx=Math.min(n.cx,n.x1-n.cx),n.ry=Math.min(n.cy,n.y1-n.cy))}if(l=o[5].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\)(?:\s\d{1,3}(?:%|px))?)+/g))for(s=l.length,c=1/Math.max(s-1,1),r=0;s>r;r+=1)d=l[r].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\))\s*(\d{1,3})?(%|px)?/),d[2]?(i=parseFloat(d[2]),i/="%"===d[3]?100:e.width):i=r*c,n.colorStops.push({color:d[1],stop:i})}return n},r.Gradient=function(n,r){if(0!==r.width&&0!==r.height){var a,o,i=e.createElement("canvas"),l=i.getContext("2d");if(i.width=r.width,i.height=r.height,a=u.Generate.parseGradient(n,r))switch(a.type){case"linear":o=l.createLinearGradient(a.x0,a.y0,a.x1,a.y1),a.colorStops.forEach(t(o)),l.fillStyle=o,l.fillRect(0,0,r.width,r.height);break;case"circle":o=l.createRadialGradient(a.cx,a.cy,0,a.cx,a.cy,a.rx),a.colorStops.forEach(t(o)),l.fillStyle=o,l.fillRect(0,0,r.width,r.height);break;case"ellipse":var s=e.createElement("canvas"),c=s.getContext("2d"),d=Math.max(a.rx,a.ry),h=2*d;s.width=s.height=h,o=c.createRadialGradient(a.rx,a.ry,0,a.rx,a.ry,d),a.colorStops.forEach(t(o)),c.fillStyle=o,c.fillRect(0,0,h,h),l.fillStyle=a.colorStops[a.colorStops.length-1].color,l.fillRect(0,0,i.width,i.height),l.drawImage(s,a.cx-a.rx,a.cy-a.ry,2*a.rx,2*a.ry)}return i}},r.ListAlpha=function(t){var e,n="";do e=t%26,n=String.fromCharCode(e+64)+n,t/=26;while(26*t>26);return n},r.ListRoman=function(t){var e,n=["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"],r=[1e3,900,500,400,100,90,50,40,10,9,5,4,1],a="",o=n.length;if(0>=t||t>=4e3)return t;for(e=0;o>e;e+=1)for(;t>=r[e];)t-=r[e],a+=n[e];return a}}(),u.Parse=function(r,a){function o(){return Math.max(Math.max(de.body.scrollWidth,de.documentElement.scrollWidth),Math.max(de.body.offsetWidth,de.documentElement.offsetWidth),Math.max(de.body.clientWidth,de.documentElement.clientWidth))}function i(){return Math.max(Math.max(de.body.scrollHeight,de.documentElement.scrollHeight),Math.max(de.body.offsetHeight,de.documentElement.offsetHeight),Math.max(de.body.clientHeight,de.documentElement.clientHeight))}function c(t,e){var n=parseInt(ge(t,e),10);return isNaN(n)?0:n}function d(t,e,n,r,a,o){"transparent"!==o&&(t.setVariable("fillStyle",o),t.fillRect(e,n,r,a),ce+=1)}function h(t,e,r){return t.length>0?e+r.toUpperCase():n}function f(t,e){switch(e){case"lowercase":return t.toLowerCase();case"capitalize":return t.replace(/(^|\s|:|-|\(|\))([a-z])/g,h);case"uppercase":return t.toUpperCase();default:return t}}function p(t){return/^(normal|none|0px)$/.test(t)}function g(t,e,n,r){null!==t&&ue.trimText(t).length>0&&(r.fillText(t,e,n),ce+=1)}function m(t,e,r,a){var o=!1,i=ge(e,"fontWeight"),l=ge(e,"fontFamily"),s=ge(e,"fontSize"),c=ue.parseTextShadows(ge(e,"textShadow"));switch(parseInt(i,10)){case 401:i="bold";break;case 400:i="normal"}return t.setVariable("fillStyle",a),t.setVariable("font",[ge(e,"fontStyle"),ge(e,"fontVariant"),i,s,l].join(" ")),t.setVariable("textAlign",o?"right":"left"),c.length&&(t.setVariable("shadowColor",c[0].color),t.setVariable("shadowOffsetX",c[0].offsetX),t.setVariable("shadowOffsetY",c[0].offsetY),t.setVariable("shadowBlur",c[0].blur)),"none"!==r?ue.Font(l,s,de):n}function y(t,e,n,r,a){switch(e){case"underline":d(t,n.left,Math.round(n.top+r.baseline+r.lineWidth),n.width,1,a);break;case"overline":d(t,n.left,Math.round(n.top),n.width,1,a);break;case"line-through":d(t,n.left,Math.ceil(n.top+r.middle+r.lineWidth),n.width,1,a)}}function b(t,e,n,r,a){var o;if(he.rangeBounds&&!a)("none"!==n||0!==ue.trimText(e).length)&&(o=w(e,t.node,t.textOffset)),t.textOffset+=e.length;else if(t.node&&"string"==typeof t.node.nodeValue){var i=r?t.node.splitText(e.length):null;o=x(t.node,a),t.node=i}return o}function w(t,e,n){var r=de.createRange();return r.setStart(e,n),r.setEnd(e,n+t.length),r.getBoundingClientRect()}function x(t,e){var n=t.parentNode,r=de.createElement("wrapper"),a=t.cloneNode(!0);r.appendChild(t.cloneNode(!0)),n.replaceChild(r,t);var o=e?ue.OffsetBounds(r):ue.Bounds(r);return n.replaceChild(a,r),o}function v(t,e,n){var r,o,i=n.ctx,l=ge(t,"color"),s=ge(t,"textDecoration"),c=ge(t,"textAlign"),d={node:e,textOffset:0};ue.trimText(e.nodeValue).length>0&&(e.nodeValue=f(e.nodeValue,ge(t,"textTransform")),c=c.replace(["-webkit-auto"],["auto"]),o=!a.letterRendering&&/^(left|right|justify|auto)$/.test(c)&&p(ge(t,"letterSpacing"))?e.nodeValue.split(/(\b| )/):e.nodeValue.split(""),r=m(i,t,s,l),a.chinese&&o.forEach(function(t,e){/.*[\u4E00-\u9FA5].*$/.test(t)&&(t=t.split(""),t.unshift(e,1),o.splice.apply(o,t))}),o.forEach(function(t,e){var a=b(d,t,s,o.length-1>e,n.transform.matrix);a&&(g(t,a.left,a.bottom,i),y(i,s,a,r,l))}))}function k(t,e){var n,r,a=de.createElement("boundelement");return a.style.display="inline",n=t.style.listStyleType,t.style.listStyleType="none",a.appendChild(de.createTextNode(e)),t.insertBefore(a,t.firstChild),r=ue.Bounds(a),t.removeChild(a),t.style.listStyleType=n,r}function C(t){var e=-1,n=1,r=t.parentNode.childNodes;if(t.parentNode){for(;r[++e]!==t;)1===r[e].nodeType&&n++;return n}return-1}function T(t,e){var n,r=C(t);switch(e){case"decimal":n=r;break;case"decimal-leading-zero":n=1===(""+r).length?r="0"+(""+r):""+r;break;case"upper-roman":n=u.Generate.ListRoman(r);break;case"lower-roman":n=u.Generate.ListRoman(r).toLowerCase();break;case"lower-alpha":n=u.Generate.ListAlpha(r).toLowerCase();break;case"upper-alpha":n=u.Generate.ListAlpha(r)}return n+". "}function S(t,e,n){var r,a,o,i=e.ctx,l=ge(t,"listStyleType");if(/^(decimal|decimal-leading-zero|upper-alpha|upper-latin|upper-roman|lower-alpha|lower-greek|lower-latin|lower-roman)$/i.test(l)){if(a=T(t,l),o=k(t,a),m(i,t,"none",ge(t,"color")),"inside"!==ge(t,"listStylePosition"))return;i.setVariable("textAlign","left"),r=n.left,g(a,r,o.bottom,i)}}function M(t){var e=r[t];return e&&e.succeeded===!0?e.img:!1}function R(t,e){var n=Math.max(t.left,e.left),r=Math.max(t.top,e.top),a=Math.min(t.left+t.width,e.left+e.width),o=Math.min(t.top+t.height,e.top+e.height);return{left:n,top:r,width:a-n,height:o-r}}function E(t,e,n){var r,a="static"!==e.cssPosition,o=a?ge(t,"zIndex"):"auto",i=ge(t,"opacity"),l="none"!==ge(t,"cssFloat");e.zIndex=r=s(o),r.isPositioned=a,r.isFloated=l,r.opacity=i,r.ownStacking="auto"!==o||1>i,n&&n.zIndex.children.push(e)}function I(t,e,n,r,a){var o=c(e,"paddingLeft"),i=c(e,"paddingTop"),l=c(e,"paddingRight"),s=c(e,"paddingBottom");$(t,n,0,0,n.width,n.height,r.left+o+a[3].width,r.top+i+a[0].width,r.width-(a[1].width+a[3].width+o+l),r.height-(a[0].width+a[2].width+i+s))}function L(t){return["Top","Right","Bottom","Left"].map(function(e){return{width:c(t,"border"+e+"Width"),color:ge(t,"border"+e+"Color")}})}function O(t){return["TopLeft","TopRight","BottomRight","BottomLeft"].map(function(e){return ge(t,"border"+e+"Radius")})}function z(t,e,n,r){var a=function(t,e,n){return{x:t.x+(e.x-t.x)*n,y:t.y+(e.y-t.y)*n}};return{start:t,startControl:e,endControl:n,end:r,subdivide:function(o){var i=a(t,e,o),l=a(e,n,o),s=a(n,r,o),c=a(i,l,o),d=a(l,s,o),u=a(c,d,o);return[z(t,i,c,u),z(u,d,s,r)]},curveTo:function(t){t.push(["bezierCurve",e.x,e.y,n.x,n.y,r.x,r.y])},curveToReversed:function(r){r.push(["bezierCurve",n.x,n.y,e.x,e.y,t.x,t.y])}}}function A(t,e,n,r,a,o,i){e[0]>0||e[1]>0?(t.push(["line",r[0].start.x,r[0].start.y]),r[0].curveTo(t),r[1].curveTo(t)):t.push(["line",o,i]),(n[0]>0||n[1]>0)&&t.push(["line",a[0].start.x,a[0].start.y])}function B(t,e,n,r,a,o,i){var l=[];return e[0]>0||e[1]>0?(l.push(["line",r[1].start.x,r[1].start.y]),r[1].curveTo(l)):l.push(["line",t.c1[0],t.c1[1]]),n[0]>0||n[1]>0?(l.push(["line",o[0].start.x,o[0].start.y]),o[0].curveTo(l),l.push(["line",i[0].end.x,i[0].end.y]),i[0].curveToReversed(l)):(l.push(["line",t.c2[0],t.c2[1]]),l.push(["line",t.c3[0],t.c3[1]])),e[0]>0||e[1]>0?(l.push(["line",a[1].end.x,a[1].end.y]),a[1].curveToReversed(l)):l.push(["line",t.c4[0],t.c4[1]]),l}function U(t,e,n){var r=t.left,a=t.top,o=t.width,i=t.height,l=e[0][0],s=e[0][1],c=e[1][0],d=e[1][1],u=e[2][0],h=e[2][1],f=e[3][0],p=e[3][1],g=o-c,m=i-h,y=o-u,b=i-p;return{topLeftOuter:be(r,a,l,s).topLeft.subdivide(.5),topLeftInner:be(r+n[3].width,a+n[0].width,Math.max(0,l-n[3].width),Math.max(0,s-n[0].width)).topLeft.subdivide(.5),topRightOuter:be(r+g,a,c,d).topRight.subdivide(.5),topRightInner:be(r+Math.min(g,o+n[3].width),a+n[0].width,g>o+n[3].width?0:c-n[3].width,d-n[0].width).topRight.subdivide(.5),bottomRightOuter:be(r+y,a+m,u,h).bottomRight.subdivide(.5),bottomRightInner:be(r+Math.min(y,o+n[3].width),a+Math.min(m,i+n[0].width),Math.max(0,u-n[1].width),Math.max(0,h-n[2].width)).bottomRight.subdivide(.5),bottomLeftOuter:be(r,a+b,f,p).bottomLeft.subdivide(.5),bottomLeftInner:be(r+n[3].width,a+b,Math.max(0,f-n[3].width),Math.max(0,p-n[2].width)).bottomLeft.subdivide(.5)}}function N(t,e,n,r,a){var o=ge(t,"backgroundClip"),i=[];switch(o){case"content-box":case"padding-box":A(i,r[0],r[1],e.topLeftInner,e.topRightInner,a.left+n[3].width,a.top+n[0].width),A(i,r[1],r[2],e.topRightInner,e.bottomRightInner,a.left+a.width-n[1].width,a.top+n[0].width),A(i,r[2],r[3],e.bottomRightInner,e.bottomLeftInner,a.left+a.width-n[1].width,a.top+a.height-n[2].width),A(i,r[3],r[0],e.bottomLeftInner,e.topLeftInner,a.left+n[3].width,a.top+a.height-n[2].width);break;default:A(i,r[0],r[1],e.topLeftOuter,e.topRightOuter,a.left,a.top),A(i,r[1],r[2],e.topRightOuter,e.bottomRightOuter,a.left+a.width,a.top),A(i,r[2],r[3],e.bottomRightOuter,e.bottomLeftOuter,a.left+a.width,a.top+a.height),A(i,r[3],r[0],e.bottomLeftOuter,e.topLeftOuter,a.left,a.top+a.height)}return i}function P(t,e,n){var r,a,o,i,l,s,c=e.left,d=e.top,u=e.width,h=e.height,f=O(t),p=U(e,f,n),g={clip:N(t,p,n,f,e),borders:[]};for(r=0;4>r;r++)if(n[r].width>0){switch(a=c,o=d,i=u,l=h-n[2].width,r){case 0:l=n[0].width,s=B({c1:[a,o],c2:[a+i,o],c3:[a+i-n[1].width,o+l],c4:[a+n[3].width,o+l]},f[0],f[1],p.topLeftOuter,p.topLeftInner,p.topRightOuter,p.topRightInner);break;case 1:a=c+u-n[1].width,i=n[1].width,s=B({c1:[a+i,o],c2:[a+i,o+l+n[2].width],c3:[a,o+l],c4:[a,o+n[0].width]},f[1],f[2],p.topRightOuter,p.topRightInner,p.bottomRightOuter,p.bottomRightInner);break;case 2:o=o+h-n[2].width,l=n[2].width,s=B({c1:[a+i,o+l],c2:[a,o+l],c3:[a+n[3].width,o],c4:[a+i-n[3].width,o]},f[2],f[3],p.bottomRightOuter,p.bottomRightInner,p.bottomLeftOuter,p.bottomLeftInner);break;case 3:i=n[3].width,s=B({c1:[a,o+l+n[2].width],c2:[a,o],c3:[a+i,o+n[0].width],c4:[a+i,o+l]},f[3],f[0],p.bottomLeftOuter,p.bottomLeftInner,p.topLeftOuter,p.topLeftInner)}g.borders.push({args:s,color:n[r].color})}return g}function F(t,e){var n=t.drawShape();return e.forEach(function(t,e){n[0===e?"moveTo":t[0]+"To"].apply(null,t.slice(1))}),n}function V(t,e,n){"transparent"!==n&&(t.setVariable("fillStyle",n),F(t,e),t.fill(),ce+=1)}function D(t,e,n){var r,a,o=de.createElement("valuewrap"),i=["lineHeight","textAlign","fontFamily","color","fontSize","paddingLeft","paddingTop","width","height","border","borderLeftWidth","borderTopWidth"];i.forEach(function(e){try{o.style[e]=ge(t,e)}catch(n){ue.log("html2canvas: Parse: Exception caught in renderFormValue: "+n.message)}}),o.style.borderColor="black",o.style.borderStyle="solid",o.style.display="block",o.style.position="absolute",(/^(submit|reset|button|text|password)$/.test(t.type)||"SELECT"===t.nodeName)&&(o.style.lineHeight=ge(t,"height")),o.style.top=e.top+"px",o.style.left=e.left+"px",r="SELECT"===t.nodeName?(t.options[t.selectedIndex]||0).text:t.value,r||(r=t.placeholder),a=de.createTextNode(r),o.appendChild(a),pe.appendChild(o),v(t,a,n),pe.removeChild(o)}function $(t){t.drawImage.apply(t,Array.prototype.slice.call(arguments,1)),ce+=1}function G(n,r){var a=t.getComputedStyle(n,r);if(a&&a.content&&"none"!==a.content&&"-moz-alt-content"!==a.content&&"none"!==a.display){var o=a.content+"",i=o.substr(0,1);i===o.substr(o.length-1)&&i.match(/'|"/)&&(o=o.substr(1,o.length-2));var l="url"===o.substr(0,3),s=e.createElement(l?"img":"span");return s.className=me+"-before "+me+"-after",Object.keys(a).filter(W).forEach(function(t){try{s.style[t]=a[t]}catch(e){ue.log(["Tried to assign readonly property ",t,"Error:",e])}}),l?s.src=ue.parseBackgroundImage(o)[0].args[0]:s.innerHTML=o,s}}function W(e){return isNaN(t.parseInt(e,10))}function H(t,e){var n=G(t,":before"),r=G(t,":after");(n||r)&&(n&&(t.className+=" "+me+"-before",t.parentNode.insertBefore(n,t),oe(n,e,!0),t.parentNode.removeChild(n),t.className=t.className.replace(me+"-before","").trim()),r&&(t.className+=" "+me+"-after",t.appendChild(r),oe(r,e,!0),t.removeChild(r),t.className=t.className.replace(me+"-after","").trim()))}function j(t,e,n,r){var a=Math.round(r.left+n.left),o=Math.round(r.top+n.top);t.createPattern(e),t.translate(a,o),t.fill(),t.translate(-a,-o)}function q(t,e,n,r,a,o,i,l){var s=[];s.push(["line",Math.round(a),Math.round(o)]),s.push(["line",Math.round(a+i),Math.round(o)]),s.push(["line",Math.round(a+i),Math.round(l+o)]),s.push(["line",Math.round(a),Math.round(l+o)]),F(t,s),t.save(),t.clip(),j(t,e,n,r),t.restore()}function X(t,e,n){d(t,e.left,e.top,e.width,e.height,n)}function _(t,e,n,r,a){var o=ue.BackgroundSize(t,e,r,a),i=ue.BackgroundPosition(t,e,r,a,o),l=ge(t,"backgroundRepeat").split(",").map(ue.trimText);switch(r=Q(r,o),l=l[a]||l[0]){case"repeat-x":q(n,r,i,e,e.left,e.top+i.top,99999,r.height);break;case"repeat-y":q(n,r,i,e,e.left+i.left,e.top,r.width,99999);break;case"no-repeat":q(n,r,i,e,e.left+i.left,e.top+i.top,r.width,r.height);break;default:j(n,r,i,{top:e.top,left:e.left,width:r.width,height:r.height})}}function Y(t,e,n){for(var r,a=ge(t,"backgroundImage"),o=ue.parseBackgroundImage(a),i=o.length;i--;)if(a=o[i],a.args&&0!==a.args.length){var l="url"===a.method?a.args[0]:a.value;r=M(l),r?_(t,e,n,r,i):ue.log("html2canvas: Error loading background:",a)}}function Q(t,e){if(t.width===e.width&&t.height===e.height)return t;var n,r=de.createElement("canvas");return r.width=e.width,r.height=e.height,n=r.getContext("2d"),$(n,t,0,0,t.width,t.height,0,0,e.width,e.height),r}function J(t,e,n){return t.setVariable("globalAlpha",ge(e,"opacity")*(n?n.opacity:1))}function K(t){return t.replace("px","")}function Z(t){var e=ge(t,"transform")||ge(t,"-webkit-transform")||ge(t,"-moz-transform")||ge(t,"-ms-transform")||ge(t,"-o-transform"),n=ge(t,"transform-origin")||ge(t,"-webkit-transform-origin")||ge(t,"-moz-transform-origin")||ge(t,"-ms-transform-origin")||ge(t,"-o-transform-origin")||"0px 0px";n=n.split(" ").map(K).map(ue.asFloat);var r;if(e&&"none"!==e){var a=e.match(we);if(a)switch(a[1]){case"matrix":r=a[2].split(",").map(ue.trimText).map(ue.asFloat)}}return{origin:n,matrix:r}}function te(t,e,n,r){var s=l(e?n.width:o(),e?n.height:i()),c={ctx:s,opacity:J(s,t,e),cssPosition:ge(t,"position"),borders:L(t),transform:r,clip:e&&e.clip?ue.Extend({},e.clip):null};return E(t,c,e),a.useOverflow===!0&&/(hidden|scroll|auto)/.test(ge(t,"overflow"))===!0&&/(BODY)/i.test(t.nodeName)===!1&&(c.clip=c.clip?R(c.clip,n):n),c}function ee(t,e,n){var r={left:e.left+t[3].width,top:e.top+t[0].width,width:e.width-(t[1].width+t[3].width),height:e.height-(t[0].width+t[2].width)};return n&&(r=R(r,n)),r}function ne(t,e){var n=e.matrix?ue.OffsetBounds(t):ue.Bounds(t);return e.origin[0]+=n.left,e.origin[1]+=n.top,n}function re(t,e,n,r){var a,o=Z(t,e),i=ne(t,o),l=te(t,e,i,o),s=l.borders,c=l.ctx,d=ee(s,i,l.clip),u=P(t,i,s),h=fe.test(t.nodeName)?"#efefef":ge(t,"backgroundColor");switch(F(c,u.clip),c.save(),c.clip(),d.height>0&&d.width>0&&!r?(X(c,i,h),Y(t,d,c)):r&&(l.backgroundColor=h),c.restore(),u.borders.forEach(function(t){V(c,t.args,t.color)}),n||H(t,l),t.nodeName){case"IMG":(a=M(t.getAttribute("src")))?I(c,t,a,i,s):ue.log("html2canvas: Error loading :"+t.getAttribute("src"));break;case"INPUT":/^(text|url|email|submit|button|reset)$/.test(t.type)&&(t.value||t.placeholder||"").length>0&&D(t,i,l);break;case"TEXTAREA":(t.value||t.placeholder||"").length>0&&D(t,i,l);break;case"SELECT":(t.options||t.placeholder||"").length>0&&D(t,i,l);break;case"LI":S(t,l,d);break;case"CANVAS":I(c,t,t,i,s)}return l}function ae(t){return"none"!==ge(t,"display")&&"hidden"!==ge(t,"visibility")&&!t.hasAttribute("data-html2canvas-ignore")}function oe(t,e,n){ae(t)&&(e=re(t,e,n,!1)||e,fe.test(t.nodeName)||ie(t,e,n))}function ie(t,e,n){ue.Children(t).forEach(function(r){r.nodeType===r.ELEMENT_NODE?oe(r,e,n):r.nodeType===r.TEXT_NODE&&v(t,r,e)})}function le(){var t=ge(e.documentElement,"backgroundColor"),n=ue.isTransparent(t)&&se===e.body,r=re(se,null,!1,n);return ie(se,r),n&&(t=r.backgroundColor),pe.removeChild(ye),{backgroundColor:t,stack:r}}t.scroll(0,0);var se=a.elements===n?e.body:a.elements[0],ce=0,de=se.ownerDocument,ue=u.Util,he=ue.Support(a,de),fe=RegExp("("+a.ignoreElements+")"),pe=de.body,ge=ue.getCSS,me="___html2canvas___pseudoelement",ye=de.createElement("style");ye.innerHTML="."+me+'-before:before { content: "" !important; display: none !important; }'+"."+me+'-after:after { content: "" !important; display: none !important; }',pe.appendChild(ye),r=r||{};var be=function(t){return function(e,n,r,a){var o=r*t,i=a*t,l=e+r,s=n+a;return{topLeft:z({x:e,y:s},{x:e,y:s-i},{x:l-o,y:n},{x:l,y:n}),topRight:z({x:e,y:n},{x:e+o,y:n},{x:l,y:s-i},{x:l,y:s}),bottomRight:z({x:l,y:n},{x:l,y:n+i},{x:e+o,y:s},{x:e,y:s}),bottomLeft:z({x:l,y:s},{x:l-o,y:s},{x:e,y:n+i},{x:e,y:n})}}}(4*((Math.sqrt(2)-1)/3)),we=/(matrix)\((.+)\)/;return le()},u.Preload=function(r){function a(t){M.href=t,M.href=M.href;var e=M.protocol+M.host;return e===g}function o(){x.log("html2canvas: start: images: "+w.numLoaded+" / "+w.numTotal+" (failed: "+w.numFailed+")"),!w.firstRun&&w.numLoaded>=w.numTotal&&(x.log("Finished loading images: # "+w.numTotal+" (failed: "+w.numFailed+")"),"function"==typeof r.complete&&r.complete(w))}function i(e,a,i){var l,s,c=r.proxy;M.href=e,e=M.href,l="html2canvas_"+v++,i.callbackname=l,c+=c.indexOf("?")>-1?"&":"?",c+="url="+encodeURIComponent(e)+"&callback="+l,s=C.createElement("script"),t[l]=function(e){"error:"===e.substring(0,6)?(i.succeeded=!1,w.numLoaded++,w.numFailed++,o()):(p(a,i),a.src=e),t[l]=n;try{delete t[l]}catch(r){}s.parentNode.removeChild(s),s=null,delete i.script,delete i.callbackname},s.setAttribute("type","text/javascript"),s.setAttribute("src",c),i.script=s,t.document.body.appendChild(s)}function l(e,n){var r=t.getComputedStyle(e,n),a=r.content;"url"===a.substr(0,3)&&m.loadImage(u.Util.parseBackgroundImage(a)[0].args[0]),h(r.backgroundImage,e)}function s(t){l(t,":before"),l(t,":after")}function c(t,e){var r=u.Generate.Gradient(t,e);r!==n&&(w[t]={img:r,succeeded:!0},w.numTotal++,w.numLoaded++,o())}function d(t){return t&&t.method&&t.args&&t.args.length>0}function h(t,e){var r;u.Util.parseBackgroundImage(t).filter(d).forEach(function(t){"url"===t.method?m.loadImage(t.args[0]):t.method.match(/\-?gradient$/)&&(r===n&&(r=u.Util.Bounds(e)),c(t.value,r))})}function f(t){var e=!1;try{x.Children(t).forEach(f)}catch(r){}try{e=t.nodeType}catch(a){e=!1,x.log("html2canvas: failed to access some element's nodeType - Exception: "+a.message)}if(1===e||e===n){s(t);try{h(x.getCSS(t,"backgroundImage"),t)}catch(r){x.log("html2canvas: failed to get background-image - Exception: "+r.message)}h(t)}}function p(e,a){e.onload=function(){a.timer!==n&&t.clearTimeout(a.timer),w.numLoaded++,a.succeeded=!0,e.onerror=e.onload=null,o()},e.onerror=function(){if("anonymous"===e.crossOrigin&&(t.clearTimeout(a.timer),r.proxy)){var l=e.src;return e=new Image,a.img=e,e.src=l,i(e.src,e,a),n}w.numLoaded++,w.numFailed++,a.succeeded=!1,e.onerror=e.onload=null,o()}}var g,m,y,b,w={numLoaded:0,numFailed:0,numTotal:0,cleanupDone:!1},x=u.Util,v=0,k=r.elements[0]||e.body,C=k.ownerDocument,T=k.getElementsByTagName("img"),S=T.length,M=C.createElement("a"),R=function(t){return t.crossOrigin!==n}(new Image);for(M.href=t.location.href,g=M.protocol+M.host,m={loadImage:function(t){var e,o;t&&w[t]===n&&(e=new Image,t.match(/data:image\/.*;base64,/i)?(e.src=t.replace(/url\(['"]{0,}|['"]{0,}\)$/gi,""),o=w[t]={img:e},w.numTotal++,p(e,o)):a(t)||r.allowTaint===!0?(o=w[t]={img:e},w.numTotal++,p(e,o),e.src=t):R&&!r.allowTaint&&r.useCORS?(e.crossOrigin="anonymous",o=w[t]={img:e},w.numTotal++,p(e,o),e.src=t):r.proxy&&(o=w[t]={img:e},w.numTotal++,i(t,e,o)))},cleanupDOM:function(a){var i,l;if(!w.cleanupDone){a&&"string"==typeof a?x.log("html2canvas: Cleanup because: "+a):x.log("html2canvas: Cleanup after timeout: "+r.timeout+" ms.");for(l in w)if(w.hasOwnProperty(l)&&(i=w[l],"object"==typeof i&&i.callbackname&&i.succeeded===n)){t[i.callbackname]=n;try{delete t[i.callbackname]}catch(s){}i.script&&i.script.parentNode&&(i.script.setAttribute("src","about:blank"),i.script.parentNode.removeChild(i.script)),w.numLoaded++,w.numFailed++,x.log("html2canvas: Cleaned up failed img: '"+l+"' Steps: "+w.numLoaded+" / "+w.numTotal)}t.stop!==n?t.stop():e.execCommand!==n&&e.execCommand("Stop",!1),e.close!==n&&e.close(),w.cleanupDone=!0,a&&"string"==typeof a||o()}},renderingDone:function(){b&&t.clearTimeout(b)}},r.timeout>0&&(b=t.setTimeout(m.cleanupDOM,r.timeout)),x.log("html2canvas: Preload starts: finding background-images"),w.firstRun=!0,f(k),x.log("html2canvas: Preload: Finding images"),y=0;S>y;y+=1)m.loadImage(T[y].getAttribute("src"));return w.firstRun=!1,x.log("html2canvas: Preload: Done."),w.numTotal===w.numLoaded&&o(),m},u.Renderer=function(t,r){function a(t){function e(t){Object.keys(t).sort().forEach(function(n){var r=[],o=[],i=[],l=[]; +t[n].forEach(function(t){t.node.zIndex.isPositioned||1>t.node.zIndex.opacity?i.push(t):t.node.zIndex.isFloated?o.push(t):r.push(t)}),function s(t){t.forEach(function(t){l.push(t),t.children&&s(t.children)})}(r.concat(o,i)),l.forEach(function(t){t.context?e(t.context):a.push(t.node)})})}var r,a=[];return r=function(t){function e(t,r,a){var o="auto"===r.zIndex.zindex?0:Number(r.zIndex.zindex),i=t,l=r.zIndex.isPositioned,s=r.zIndex.isFloated,c={node:r},d=a;r.zIndex.ownStacking?(i=c.context={"!":[{node:r,children:[]}]},d=n):(l||s)&&(d=c.children=[]),0===o&&a?a.push(c):(t[o]||(t[o]=[]),t[o].push(c)),r.zIndex.children.forEach(function(t){e(i,t,d)})}var r={};return e(r,t),r}(t),e(r),a}function o(t){var e;if("string"==typeof r.renderer&&u.Renderer[t]!==n)e=u.Renderer[t](r);else{if("function"!=typeof t)throw Error("Unknown renderer");e=t(r)}if("function"!=typeof e)throw Error("Invalid renderer defined");return e}return o(r.renderer)(t,r,e,a(t.stack),u)},u.Util.Support=function(t,e){function r(){var t=new Image,r=e.createElement("canvas"),a=r.getContext===n?!1:r.getContext("2d");if(a===!1)return!1;r.width=r.height=10,t.src=["data:image/svg+xml,","","","
        ","sup","
        ","
        ","
        "].join("");try{a.drawImage(t,0,0),r.toDataURL()}catch(o){return!1}return u.Util.log("html2canvas: Parse: SVG powered rendering available"),!0}function a(){var t,n,r,a,o=!1;return e.createRange&&(t=e.createRange(),t.getBoundingClientRect&&(n=e.createElement("boundtest"),n.style.height="123px",n.style.display="block",e.body.appendChild(n),t.selectNode(n),r=t.getBoundingClientRect(),a=r.height,123===a&&(o=!0),e.body.removeChild(n))),o}return{rangeBounds:a(),svgRendering:t.svgRendering&&r()}},t.html2canvas=function(e,n){e=e.length?e:[e];var r,a,o={logging:!1,elements:e,background:"#fff",proxy:null,timeout:0,useCORS:!1,allowTaint:!1,svgRendering:!1,ignoreElements:"IFRAME|OBJECT|PARAM",useOverflow:!0,letterRendering:!1,chinese:!1,width:null,height:null,taintTest:!0,renderer:"Canvas"};return o=u.Util.Extend(n,o),u.logging=o.logging,o.complete=function(t){("function"!=typeof o.onpreloaded||o.onpreloaded(t)!==!1)&&(r=u.Parse(t,o),("function"!=typeof o.onparsed||o.onparsed(r)!==!1)&&(a=u.Renderer(r,o),"function"==typeof o.onrendered&&o.onrendered(a)))},t.setTimeout(function(){u.Preload(o)},0),{render:function(t,e){return u.Renderer(t,u.Util.Extend(e,o))},parse:function(t,e){return u.Parse(t,u.Util.Extend(e,o))},preload:function(t){return u.Preload(u.Util.Extend(t,o))},log:u.Util.log}},t.html2canvas.log=u.Util.log,t.html2canvas.Renderer={Canvas:n},u.Renderer.Canvas=function(t){function r(t,e){t.beginPath(),e.forEach(function(e){t[e.name].apply(t,e.arguments)}),t.closePath()}function a(t){if(-1===l.indexOf(t.arguments[0].src)){c.drawImage(t.arguments[0],0,0);try{c.getImageData(0,0,1,1)}catch(e){return s=i.createElement("canvas"),c=s.getContext("2d"),!1}l.push(t.arguments[0].src)}return!0}function o(e,n){switch(n.type){case"variable":e[n.name]=n.arguments;break;case"function":switch(n.name){case"createPattern":if(n.arguments[0].width>0&&n.arguments[0].height>0)try{e.fillStyle=e.createPattern(n.arguments[0],"repeat")}catch(o){d.log("html2canvas: Renderer: Error creating pattern",o.message)}break;case"drawShape":r(e,n.arguments);break;case"drawImage":n.arguments[8]>0&&n.arguments[7]>0&&(!t.taintTest||t.taintTest&&a(n))&&e.drawImage.apply(e,n.arguments);break;default:e[n.name].apply(e,n.arguments)}}}t=t||{};var i=e,l=[],s=e.createElement("canvas"),c=s.getContext("2d"),d=u.Util,h=t.canvas||i.createElement("canvas");return function(t,e,r,a,i){var l,s,c,u=h.getContext("2d"),f=t.stack;return h.width=h.style.width=e.width||f.ctx.width,h.height=h.style.height=e.height||f.ctx.height,c=u.fillStyle,u.fillStyle=d.isTransparent(f.backgroundColor)&&e.background!==n?e.background:t.backgroundColor,u.fillRect(0,0,h.width,h.height),u.fillStyle=c,a.forEach(function(t){u.textBaseline="bottom",u.save(),t.transform.matrix&&(u.translate(t.transform.origin[0],t.transform.origin[1]),u.transform.apply(u,t.transform.matrix),u.translate(-t.transform.origin[0],-t.transform.origin[1])),t.clip&&(u.beginPath(),u.rect(t.clip.left,t.clip.top,t.clip.width,t.clip.height),u.clip()),t.ctx.storage&&t.ctx.storage.forEach(function(t){o(u,t)}),u.restore()}),d.log("html2canvas: Renderer: Canvas renderer done - returning canvas obj"),1===e.elements.length&&"object"==typeof e.elements[0]&&"BODY"!==e.elements[0].nodeName?(s=i.Util.Bounds(e.elements[0]),l=r.createElement("canvas"),l.width=Math.ceil(s.width),l.height=Math.ceil(s.height),u=l.getContext("2d"),u.drawImage(h,s.left,s.top,s.width,s.height,0,0,s.width,s.height),h=null,l):h}}})(window,document); \ No newline at end of file diff --git a/bower_components/generate-PDF/kendo.all.min.js b/bower_components/generate-PDF/kendo.all.min.js new file mode 100644 index 0000000..bdce011 --- /dev/null +++ b/bower_components/generate-PDF/kendo.all.min.js @@ -0,0 +1,115 @@ +/** + * Kendo UI v2016.3.914 (http://www.telerik.com/kendo-ui) + * Copyright 2016 Telerik AD. All rights reserved. + * + * Kendo UI commercial licenses may be obtained at + * http://www.telerik.com/purchase/license-agreement/kendo-ui-complete + * If you do not own a commercial license, this file shall be governed by the trial license terms. + + + + + + + + + + + + + + + + +*/ +!function(e,define){define("kendo.core.min",["jquery"],e)}(function(){return function(e,t,n){function i(){}function o(e,t){if(t)return"'"+e.split("'").join("\\'").split('\\"').join('\\\\\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")+"'";var n=e.charAt(0),i=e.substring(1);return"="===n?"+("+i+")+":":"===n?"+$kendoHtmlEncode("+i+")+":";"+e+";$kendoOutput+="}function r(e,t,n){return e+="",t=t||2,n=t-e.length,n?W[t].substring(0,n)+e:e}function a(e){var t=e.css(ve.support.transitions.css+"box-shadow")||e.css("box-shadow"),n=t?t.match(Ae)||[0,0,0,0,0]:[0,0,0,0,0],i=xe.max(+n[3],+(n[4]||0));return{left:-n[1]+i,right:+n[1]+i,bottom:+n[2]+i}}function s(t,n){var i,o,r,s,l,c,d,u,h=Se.browser,f="rtl"==t.css("direction");return t.parent().hasClass("k-animation-container")?(d=t.parent(".k-animation-container"),u=d[0].style,d.is(":hidden")&&d.show(),i=Te.test(u.width)||Te.test(u.height),i||d.css({width:t.outerWidth(),height:t.outerHeight(),boxSizing:"content-box",mozBoxSizing:"content-box",webkitBoxSizing:"content-box"})):(o=a(t),r=t[0].style.width,s=t[0].style.height,l=Te.test(r),c=Te.test(s),h.opera&&(o.left=o.right=o.bottom=5),i=l||c,!l&&(!n||n&&r)&&(r=t.outerWidth()),!c&&(!n||n&&s)&&(s=t.outerHeight()),t.wrap(e("
        ").addClass("k-animation-container").css({width:r,height:s,marginLeft:o.left*(f?1:-1),paddingLeft:o.left,paddingRight:o.right,paddingBottom:o.bottom})),i&&t.css({width:"100%",height:"100%",boxSizing:"border-box",mozBoxSizing:"border-box",webkitBoxSizing:"border-box"})),h.msie&&xe.floor(h.version)<=7&&(t.css({zoom:1}),t.children(".k-menu").width(t.width())),t.parent()}function l(e){var t=1,n=arguments.length;for(t=1;n>t;t++)c(e,arguments[t]);return e}function c(e,t){var n,i,o,r,a,s=ve.data.ObservableArray,l=ve.data.LazyObservableArray,d=ve.data.DataSource,u=ve.data.HierarchicalDataSource;for(n in t)i=t[n],o=typeof i,r=o===Fe&&null!==i?i.constructor:null,r&&r!==Array&&r!==s&&r!==l&&r!==d&&r!==u?i instanceof Date?e[n]=new Date(i.getTime()):M(i.clone)?e[n]=i.clone():(a=e[n],e[n]=typeof a===Fe?a||{}:{},c(e[n],i)):o!==Be&&(e[n]=i);return e}function d(e,t,i){for(var o in t)if(t.hasOwnProperty(o)&&t[o].test(e))return o;return i!==n?i:e}function u(e){return e.replace(/([a-z][A-Z])/g,function(e){return e.charAt(0)+"-"+e.charAt(1).toLowerCase()})}function h(e){return e.replace(/\-(\w)/g,function(e,t){return t.toUpperCase()})}function f(t,n){var i,o={};return document.defaultView&&document.defaultView.getComputedStyle?(i=document.defaultView.getComputedStyle(t,""),n&&e.each(n,function(e,t){o[t]=i.getPropertyValue(t)})):(i=t.currentStyle,n&&e.each(n,function(e,t){o[t]=i[h(t)]})),ve.size(o)||(o=i),o}function p(e){if(e&&e.className&&"string"==typeof e.className&&e.className.indexOf("k-auto-scrollable")>-1)return!0;var t=f(e,["overflow"]).overflow;return"auto"==t||"scroll"==t}function m(t,i){var o,r=Se.browser.webkit,a=Se.browser.mozilla,s=t instanceof e?t[0]:t;if(t)return o=Se.isRtl(t),i===n?o&&r?s.scrollWidth-s.clientWidth-s.scrollLeft:Math.abs(s.scrollLeft):(s.scrollLeft=o&&r?s.scrollWidth-s.clientWidth-i:o&&a?-i:i,n)}function g(e){var t,n=0;for(t in e)e.hasOwnProperty(t)&&"toJSON"!=t&&n++;return n}function v(e,n,i){var o,r;return n||(n="offset"),o=e[n](),Se.mobileOS.android&&(o.top-=t.scrollY,o.left-=t.scrollX),Se.browser.msie&&(Se.pointers||Se.msPointers)&&!i&&(r=Se.isRtl(e)?1:-1,o.top-=t.pageYOffset+r*document.documentElement.scrollTop,o.left-=t.pageXOffset+r*document.documentElement.scrollLeft),o}function _(e){var t={};return be("string"==typeof e?e.split(" "):e,function(e){t[e]=this}),t}function b(e){return new ve.effects.Element(e)}function w(e,t,n,i){return typeof e===Re&&(M(t)&&(i=t,t=400,n=!1),M(n)&&(i=n,n=!1),typeof t===Pe&&(n=t,t=400),e={effects:e,duration:t,reverse:n,complete:i}),_e({effects:{},duration:400,reverse:!1,init:ke,teardown:ke,hide:!1},e,{completeCallback:e.complete,complete:ke})}function y(t,n,i,o,r){for(var a,s=0,l=t.length;l>s;s++)a=e(t[s]),a.queue(function(){j.promise(a,w(n,i,o,r))});return t}function k(e,t,n,i){return t&&(t=t.split(" "),be(t,function(t,n){e.toggleClass(n,i)})),e}function x(e){return(""+e).replace(q,"&").replace(G,"<").replace(K,">").replace($,""").replace(Y,"'")}function C(e,t){var i;return 0===t.indexOf("data")&&(t=t.substring(4),t=t.charAt(0).toLowerCase()+t.substring(1)),t=t.replace(oe,"-$1"),i=e.getAttribute("data-"+ve.ns+t),null===i?i=n:"null"===i?i=null:"true"===i?i=!0:"false"===i?i=!1:Ee.test(i)?i=parseFloat(i):ne.test(i)&&!ie.test(i)&&(i=Function("return ("+i+")")()),i}function S(t,i){var o,r,a={};for(o in i)r=C(t,o),r!==n&&(te.test(o)&&(r=ve.template(e("#"+r).html())),a[o]=r);return a}function T(t,n){return e.contains(t,n)?-1:1}function D(){var t=e(this);return e.inArray(t.attr("data-"+ve.ns+"role"),["slider","rangeslider"])>-1||t.is(":visible")}function A(e,t){var n=e.nodeName.toLowerCase();return(/input|select|textarea|button|object/.test(n)?!e.disabled:"a"===n?e.href||t:t)&&E(e)}function E(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function I(e,t){return new I.fn.init(e,t)}var R,M,F,z,P,B,L,H,N,O,V,W,U,j,q,G,$,Y,K,Q,X,J,Z,ee,te,ne,ie,oe,re,ae,se,le,ce,de,ue,he,fe,pe,me,ge,ve=t.kendo=t.kendo||{cultures:{}},_e=e.extend,be=e.each,we=e.isArray,ye=e.proxy,ke=e.noop,xe=Math,Ce=t.JSON||{},Se={},Te=/%/,De=/\{(\d+)(:[^\}]+)?\}/g,Ae=/(\d+(?:\.?)\d*)px\s*(\d+(?:\.?)\d*)px\s*(\d+(?:\.?)\d*)px\s*(\d+)?/i,Ee=/^(\+|-?)\d+(\.?)\d*$/,Ie="function",Re="string",Me="number",Fe="object",ze="null",Pe="boolean",Be="undefined",Le={},He={},Ne=[].slice;ve.version="2016.3.914".replace(/^\s+|\s+$/g,""),i.extend=function(e){var t,n,i=function(){},o=this,r=e&&e.init?e.init:function(){o.apply(this,arguments)};i.prototype=o.prototype,n=r.fn=r.prototype=new i;for(t in e)n[t]=null!=e[t]&&e[t].constructor===Object?_e(!0,{},i.prototype[t],e[t]):e[t];return n.constructor=r,r.extend=o.extend,r},i.prototype._initOptions=function(e){this.options=l({},this.options,e)},M=ve.isFunction=function(e){return"function"==typeof e},F=function(){this._defaultPrevented=!0},z=function(){return this._defaultPrevented===!0},P=i.extend({init:function(){this._events={}},bind:function(e,t,i){var o,r,a,s,l,c=this,d=typeof e===Re?[e]:e,u=typeof t===Ie;if(t===n){for(o in e)c.bind(o,e[o]);return c}for(o=0,r=d.length;r>o;o++)e=d[o],s=u?t:t[e],s&&(i&&(a=s,s=function(){c.unbind(e,s),a.apply(c,arguments)},s.original=a),l=c._events[e]=c._events[e]||[],l.push(s));return c},one:function(e,t){return this.bind(e,t,!0)},first:function(e,t){var n,i,o,r,a=this,s=typeof e===Re?[e]:e,l=typeof t===Ie;for(n=0,i=s.length;i>n;n++)e=s[n],o=l?t:t[e],o&&(r=a._events[e]=a._events[e]||[],r.unshift(o));return a},trigger:function(e,t){var n,i,o=this,r=o._events[e];if(r){for(t=t||{},t.sender=o,t._defaultPrevented=!1,t.preventDefault=F,t.isDefaultPrevented=z,r=r.slice(),n=0,i=r.length;i>n;n++)r[n].call(o,t);return t._defaultPrevented===!0}return!1},unbind:function(e,t){var i,o=this,r=o._events[e];if(e===n)o._events={};else if(r)if(t)for(i=r.length-1;i>=0;i--)r[i]!==t&&r[i].original!==t||r.splice(i,1);else o._events[e]=[];return o}}),B=/^\w+/,L=/\$\{([^}]*)\}/g,H=/\\\}/g,N=/__CURLY__/g,O=/\\#/g,V=/__SHARP__/g,W=["","0","00","000","0000"],R={paramName:"data",useWithBlock:!0,render:function(e,t){var n,i,o="";for(n=0,i=t.length;i>n;n++)o+=e(t[n]);return o},compile:function(e,t){var n,i,r,a=_e({},this,t),s=a.paramName,l=s.match(B)[0],c=a.useWithBlock,d="var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;";if(M(e))return e;for(d+=c?"with("+s+"){":"",d+="$kendoOutput=",i=e.replace(H,"__CURLY__").replace(L,"#=$kendoHtmlEncode($1)#").replace(N,"}").replace(O,"__SHARP__").split("#"),r=0;i.length>r;r++)d+=o(i[r],r%2===0);d+=c?";}":";",d+="return $kendoOutput;",d=d.replace(V,"#");try{return n=Function(l,d),n._slotCount=Math.floor(i.length/2),n}catch(u){throw Error(ve.format("Invalid template:'{0}' Generated code:'{1}'",e,d))}}},function(){function e(e){return a.lastIndex=0,a.test(e)?'"'+e.replace(a,function(e){var t=s[e];return typeof t===Re?t:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+e+'"'}function t(r,a){var s,c,d,u,h,f,p=n,m=a[r];if(m&&typeof m===Fe&&typeof m.toJSON===Ie&&(m=m.toJSON(r)),typeof o===Ie&&(m=o.call(a,r,m)),f=typeof m,f===Re)return e(m);if(f===Me)return isFinite(m)?m+"":ze;if(f===Pe||f===ze)return m+"";if(f===Fe){if(!m)return ze;if(n+=i,h=[],"[object Array]"===l.apply(m)){for(u=m.length,s=0;u>s;s++)h[s]=t(s,m)||ze;return d=0===h.length?"[]":n?"[\n"+n+h.join(",\n"+n)+"\n"+p+"]":"["+h.join(",")+"]",n=p,d}if(o&&typeof o===Fe)for(u=o.length,s=0;u>s;s++)typeof o[s]===Re&&(c=o[s],d=t(c,m),d&&h.push(e(c)+(n?": ":":")+d));else for(c in m)Object.hasOwnProperty.call(m,c)&&(d=t(c,m),d&&h.push(e(c)+(n?": ":":")+d));return d=0===h.length?"{}":n?"{\n"+n+h.join(",\n"+n)+"\n"+p+"}":"{"+h.join(",")+"}",n=p,d}}var n,i,o,a=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,s={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},l={}.toString;typeof Date.prototype.toJSON!==Ie&&(Date.prototype.toJSON=function(){var e=this;return isFinite(e.valueOf())?r(e.getUTCFullYear(),4)+"-"+r(e.getUTCMonth()+1)+"-"+r(e.getUTCDate())+"T"+r(e.getUTCHours())+":"+r(e.getUTCMinutes())+":"+r(e.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()}),typeof Ce.stringify!==Ie&&(Ce.stringify=function(e,r,a){var s;if(n="",i="",typeof a===Me)for(s=0;a>s;s+=1)i+=" ";else typeof a===Re&&(i=a);if(o=r,r&&typeof r!==Ie&&(typeof r!==Fe||typeof r.length!==Me))throw Error("JSON.stringify");return t("",{"":e})})}(),function(){function e(e){if(e){if(e.numberFormat)return e;if(typeof e===Re){var t=ve.cultures;return t[e]||t[e.split("-")[0]]||null}return null}return null}function t(t){return t&&(t=e(t)),t||ve.cultures.current}function i(e,i,o){o=t(o);var a=o.calendars.standard,s=a.days,l=a.months;return i=a.patterns[i]||i,i.replace(c,function(t){var i,o,c;return"d"===t?o=e.getDate():"dd"===t?o=r(e.getDate()):"ddd"===t?o=s.namesAbbr[e.getDay()]:"dddd"===t?o=s.names[e.getDay()]:"M"===t?o=e.getMonth()+1:"MM"===t?o=r(e.getMonth()+1):"MMM"===t?o=l.namesAbbr[e.getMonth()]:"MMMM"===t?o=l.names[e.getMonth()]:"yy"===t?o=r(e.getFullYear()%100):"yyyy"===t?o=r(e.getFullYear(),4):"h"===t?o=e.getHours()%12||12:"hh"===t?o=r(e.getHours()%12||12):"H"===t?o=e.getHours():"HH"===t?o=r(e.getHours()):"m"===t?o=e.getMinutes():"mm"===t?o=r(e.getMinutes()):"s"===t?o=e.getSeconds():"ss"===t?o=r(e.getSeconds()):"f"===t?o=xe.floor(e.getMilliseconds()/100):"ff"===t?(o=e.getMilliseconds(),o>99&&(o=xe.floor(o/10)),o=r(o)):"fff"===t?o=r(e.getMilliseconds(),3):"tt"===t?o=e.getHours()<12?a.AM[0]:a.PM[0]:"zzz"===t?(i=e.getTimezoneOffset(),c=0>i,o=(""+xe.abs(i/60)).split(".")[0],i=xe.abs(i)-60*o,o=(c?"+":"-")+r(o),o+=":"+r(i)):"zz"!==t&&"z"!==t||(o=e.getTimezoneOffset()/60,c=0>o,o=(""+xe.abs(o)).split(".")[0],o=(c?"+":"-")+("zz"===t?r(o):o)),o!==n?o:t.slice(1,t.length-1)})}function o(e,i,o){o=t(o);var r,l,c,b,w,y,k,x,C,S,T,D,A,E,I,R,M,F,z,P,B,L,H,N=o.numberFormat,O=N[p],V=N.decimals,W=N.pattern[0],U=[],j=0>e,q=f,G=f,$=-1;if(e===n)return f;if(!isFinite(e))return e;if(!i)return o.name.length?e.toLocaleString():""+e;if(w=d.exec(i)){if(i=w[1].toLowerCase(),l="c"===i,c="p"===i,(l||c)&&(N=l?N.currency:N.percent,O=N[p],V=N.decimals,r=N.symbol,W=N.pattern[j?0:1]),b=w[2],b&&(V=+b),"e"===i)return b?e.toExponential(V):e.toExponential();if(c&&(e*=100),e=s(e,V),j=0>e,e=e.split(p),y=e[0],k=e[1],j&&(y=y.substring(1)),G=a(y,0,y.length,N),k&&(G+=O+k),"n"===i&&!j)return G;for(e=f,S=0,T=W.length;T>S;S++)D=W.charAt(S),e+="n"===D?G:"$"===D||"%"===D?r:D;return e}if(j&&(e=-e),(i.indexOf("'")>-1||i.indexOf('"')>-1||i.indexOf("\\")>-1)&&(i=i.replace(u,function(e){var t=e.charAt(0).replace("\\",""),n=e.slice(1).replace(t,"");return U.push(n),_})),i=i.split(";"),j&&i[1])i=i[1],E=!0;else if(0===e){if(i=i[2]||i[0],-1==i.indexOf(g)&&-1==i.indexOf(v))return i}else i=i[0];if(P=i.indexOf("%"),B=i.indexOf("$"),c=-1!=P,l=-1!=B,c&&(e*=100),l&&"\\"===i[B-1]&&(i=i.split("\\").join(""),l=!1),(l||c)&&(N=l?N.currency:N.percent,O=N[p],V=N.decimals,r=N.symbol),A=i.indexOf(m)>-1,A&&(i=i.replace(h,f)),I=i.indexOf(p),T=i.length,-1!=I?(k=(""+e).split("e"),k=k[1]?s(e,Math.abs(k[1])):k[0],k=k.split(p)[1]||f,M=i.lastIndexOf(v)-I,R=i.lastIndexOf(g)-I,F=M>-1,z=R>-1,S=k.length,F||z||(i=i.substring(0,I)+i.substring(I+1),T=i.length,I=-1,S=0),F&&M>R?S=M:R>M&&(z&&S>R?S=R:F&&M>S&&(S=M)),S>-1&&(e=s(e,S))):e=s(e),R=i.indexOf(g),L=M=i.indexOf(v),$=-1==R&&-1!=M?M:-1!=R&&-1==M?R:R>M?M:R,R=i.lastIndexOf(g),M=i.lastIndexOf(v),H=-1==R&&-1!=M?M:-1!=R&&-1==M?R:R>M?R:M,$==T&&(H=$),-1!=$){for(G=(""+e).split(p),y=G[0],k=G[1]||f,x=y.length,C=k.length,j&&-1*e>=0&&(j=!1),e=i.substring(0,$),j&&!E&&(e+="-"),S=$;T>S;S++){if(D=i.charAt(S),-1==I){if(x>H-S){e+=y;break}}else if(-1!=M&&S>M&&(q=f),x>=I-S&&I-S>-1&&(e+=y,S=I),I===S){e+=(k?O:f)+k,S+=H-I+1;continue}D===v?(e+=D,q=D):D===g&&(e+=q)}if(A&&(e=a(e,$+(j?1:0),Math.max(H,x+$),N)),H>=$&&(e+=i.substring(H+1)),l||c){for(G=f,S=0,T=e.length;T>S;S++)D=e.charAt(S),G+="$"===D||"%"===D?r:D;e=G}if(T=U.length)for(S=0;T>S;S++)e=e.replace(_,U[S])}return e}var a,s,l,c=/dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|"[^"]*"|'[^']*'/g,d=/^(n|c|p|e)(\d*)$/i,u=/(\\.)|(['][^']*[']?)|(["][^"]*["]?)/g,h=/\,/g,f="",p=".",m=",",g="#",v="0",_="??",b="en-US",w={}.toString;ve.cultures["en-US"]={name:b,numberFormat:{pattern:["-n"],decimals:2,",":",",".":".",groupSize:[3],percent:{pattern:["-n %","n %"],decimals:2,",":",",".":".",groupSize:[3],symbol:"%"},currency:{name:"US Dollar",abbr:"USD",pattern:["($n)","$n"],decimals:2,",":",",".":".",groupSize:[3],symbol:"$"}},calendars:{standard:{days:{names:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],namesAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],namesShort:["Su","Mo","Tu","We","Th","Fr","Sa"]},months:{names:["January","February","March","April","May","June","July","August","September","October","November","December"],namesAbbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},AM:["AM","am","AM"],PM:["PM","pm","PM"],patterns:{d:"M/d/yyyy",D:"dddd, MMMM dd, yyyy",F:"dddd, MMMM dd, yyyy h:mm:ss tt",g:"M/d/yyyy h:mm tt",G:"M/d/yyyy h:mm:ss tt",m:"MMMM dd",M:"MMMM dd",s:"yyyy'-'MM'-'ddTHH':'mm':'ss",t:"h:mm tt",T:"h:mm:ss tt",u:"yyyy'-'MM'-'dd HH':'mm':'ss'Z'",y:"MMMM, yyyy",Y:"MMMM, yyyy"},"/":"/",":":":",firstDay:0,twoDigitYearMax:2029}}},ve.culture=function(t){var i,o=ve.cultures;return t===n?o.current:(i=e(t)||o[b],i.calendar=i.calendars.standard,o.current=i,n)},ve.findCulture=e,ve.getCulture=t,ve.culture(b),a=function(e,t,i,o){var r,a,s,l,c,d,u=e.indexOf(o[p]),h=o.groupSize.slice(),f=h.shift();if(i=-1!==u?u:i+1,r=e.substring(t,i),a=r.length,a>=f){for(s=a,l=[];s>-1;)if(c=r.substring(s-f,s),c&&l.push(c),s-=f,d=h.shift(),f=d!==n?d:f,0===f){l.push(r.substring(0,s));break}r=l.reverse().join(o[m]),e=e.substring(0,t)+r+e.substring(i)}return e},s=function(e,t){return t=t||0,e=(""+e).split("e"),e=Math.round(+(e[0]+"e"+(e[1]?+e[1]+t:t))),e=(""+e).split("e"),e=+(e[0]+"e"+(e[1]?+e[1]-t:-t)),e.toFixed(Math.min(t,20))},l=function(e,t,r){if(t){if("[object Date]"===w.call(e))return i(e,t,r);if(typeof e===Me)return o(e,t,r)}return e!==n?e:""},ve.format=function(e){var t=arguments;return e.replace(De,function(e,n,i){var o=t[parseInt(n,10)+1];return l(o,i?i.substring(1):"")})},ve._extractFormat=function(e){return"{0:"===e.slice(0,3)&&(e=e.slice(3,e.length-1)),e},ve._activeElement=function(){try{return document.activeElement}catch(e){return document.documentElement.activeElement}},ve._round=s,ve.toString=l}(),function(){function t(e,t,n){return!(e>=t&&n>=e)}function i(e){return e.charAt(0)}function o(t){return e.map(t,i)}function r(e,t){t||23!==e.getHours()||e.setHours(e.getHours()+2)}function a(e){for(var t=0,n=e.length,i=[];n>t;t++)i[t]=(e[t]+"").toLowerCase();return i}function s(e){var t,n={};for(t in e)n[t]=a(e[t]);return n}function l(e,i,a){if(!e)return null;var l,c,d,u,h,m,g,v,_,w,y,k,x,C=function(e){for(var t=0;i[B]===e;)t++,B++;return t>0&&(B-=1),t},S=function(t){var n=b[t]||RegExp("^\\d{1,"+t+"}"),i=e.substr(L,t).match(n);return i?(i=i[0],L+=i.length,parseInt(i,10)):null},T=function(t,n){for(var i,o,r,a=0,s=t.length,l=0,c=0;s>a;a++)i=t[a],o=i.length,r=e.substr(L,o),n&&(r=r.toLowerCase()),r==i&&o>l&&(l=o,c=a);return l?(L+=l,c+1):null},D=function(){var t=!1;return e.charAt(L)===i[B]&&(L++,t=!0),t},A=a.calendars.standard,E=null,I=null,R=null,M=null,F=null,z=null,P=null,B=0,L=0,H=!1,N=new Date,O=A.twoDigitYearMax||2029,V=N.getFullYear();for(i||(i="d"),u=A.patterns[i],u&&(i=u),i=i.split(""),d=i.length;d>B;B++)if(l=i[B],H)"'"===l?H=!1:D();else if("d"===l){if(c=C("d"),A._lowerDays||(A._lowerDays=s(A.days)),null!==R&&c>2)continue;if(R=3>c?S(2):T(A._lowerDays[3==c?"namesAbbr":"names"],!0),null===R||t(R,1,31))return null}else if("M"===l){if(c=C("M"),A._lowerMonths||(A._lowerMonths=s(A.months)),I=3>c?S(2):T(A._lowerMonths[3==c?"namesAbbr":"names"],!0),null===I||t(I,1,12))return null;I-=1}else if("y"===l){if(c=C("y"),E=S(c),null===E)return null;2==c&&("string"==typeof O&&(O=V+parseInt(O,10)),E=V-V%100+E,E>O&&(E-=100))}else if("h"===l){if(C("h"),M=S(2),12==M&&(M=0),null===M||t(M,0,11))return null}else if("H"===l){if(C("H"),M=S(2),null===M||t(M,0,23))return null}else if("m"===l){if(C("m"),F=S(2),null===F||t(F,0,59))return null}else if("s"===l){if(C("s"),z=S(2),null===z||t(z,0,59))return null}else if("f"===l){if(c=C("f"),x=e.substr(L,c).match(b[3]),P=S(c),null!==P&&(P=parseFloat("0."+x[0],10),P=ve._round(P,3),P*=1e3),null===P||t(P,0,999))return null}else if("t"===l){if(c=C("t"),v=A.AM,_=A.PM,1===c&&(v=o(v),_=o(_)),h=T(_),!h&&!T(v))return null}else if("z"===l){if(m=!0,c=C("z"),"Z"===e.substr(L,1)){D();continue}if(g=e.substr(L,6).match(c>2?p:f),!g)return null;if(g=g[0].split(":"),w=g[0],y=g[1],!y&&w.length>3&&(L=w.length-2,y=w.substring(L),w=w.substring(0,L)),w=parseInt(w,10),t(w,-12,13))return null;if(c>2&&(y=parseInt(y,10),isNaN(y)||t(y,0,59)))return null}else if("'"===l)H=!0,D();else if(!D())return null;return k=null!==M||null!==F||z||null,null===E&&null===I&&null===R&&k?(E=V,I=N.getMonth(),R=N.getDate()):(null===E&&(E=V),null===R&&(R=1)),h&&12>M&&(M+=12),m?(w&&(M+=-w),y&&(F+=-y),e=new Date(Date.UTC(E,I,R,M,F,z,P))):(e=new Date(E,I,R,M,F,z,P),r(e,M)),100>E&&e.setFullYear(E),e.getDate()!==R&&m===n?null:e}function c(e){var t="-"===e.substr(0,1)?-1:1;return e=e.substring(1),e=60*parseInt(e.substr(0,2),10)+parseInt(e.substring(2),10),t*e}function d(e){var t,n,i,o=xe.max(v.length,_.length),r=e.calendar.patterns,a=[];for(i=0;o>i;i++){for(t=v[i],n=0;t.length>n;n++)a.push(r[t[n]]);a=a.concat(_[i])}return a}var u=/\u00A0/g,h=/[eE][\-+]?[0-9]+/,f=/[+|\-]\d{1,2}/,p=/[+|\-]\d{1,2}:?\d{2}/,m=/^\/Date\((.*?)\)\/$/,g=/[+-]\d*/,v=[[],["G","g","F"],["D","d","y","m","T","t"]],_=[["yyyy-MM-ddTHH:mm:ss.fffffffzzz","yyyy-MM-ddTHH:mm:ss.fffffff","yyyy-MM-ddTHH:mm:ss.fffzzz","yyyy-MM-ddTHH:mm:ss.fff","ddd MMM dd yyyy HH:mm:ss","yyyy-MM-ddTHH:mm:sszzz","yyyy-MM-ddTHH:mmzzz","yyyy-MM-ddTHH:mmzz","yyyy-MM-ddTHH:mm:ss","yyyy-MM-dd HH:mm:ss","yyyy/MM/dd HH:mm:ss"],["yyyy-MM-ddTHH:mm","yyyy-MM-dd HH:mm","yyyy/MM/dd HH:mm"],["yyyy/MM/dd","yyyy-MM-dd","HH:mm:ss","HH:mm"]],b={2:/^\d{1,2}/,3:/^\d{1,3}/,4:/^\d{4}/},w={}.toString;ve.parseDate=function(e,t,n){var i,o,r,a;if("[object Date]"===w.call(e))return e;if(i=0,o=null,e&&0===e.indexOf("/D")&&(o=m.exec(e)))return o=o[1],a=g.exec(o.substring(1)),o=new Date(parseInt(o,10)),a&&(a=c(a[0]),o=ve.timezone.apply(o,0),o=ve.timezone.convert(o,0,-1*a)),o;for(n=ve.getCulture(n),t||(t=d(n)),t=we(t)?t:[t],r=t.length;r>i;i++)if(o=l(e,t[i],n))return o;return o},ve.parseInt=function(e,t){var n=ve.parseFloat(e,t);return n&&(n=0|n),n},ve.parseFloat=function(e,t,n){if(!e&&0!==e)return null;if(typeof e===Me)return e;e=""+e,t=ve.getCulture(t);var i,o,r=t.numberFormat,a=r.percent,s=r.currency,l=s.symbol,c=a.symbol,d=e.indexOf("-");return h.test(e)?(e=parseFloat(e.replace(r["."],".")),isNaN(e)&&(e=null),e):d>0?null:(d=d>-1,e.indexOf(l)>-1||n&&n.toLowerCase().indexOf("c")>-1?(r=s,i=r.pattern[0].replace("$",l).split("n"),e.indexOf(i[0])>-1&&e.indexOf(i[1])>-1&&(e=e.replace(i[0],"").replace(i[1],""),d=!0)):e.indexOf(c)>-1&&(o=!0,r=a,l=c),e=e.replace("-","").replace(l,"").replace(u," ").split(r[","].replace(u," ")).join("").replace(r["."],"."),e=parseFloat(e),isNaN(e)?e=null:d&&(e*=-1),e&&o&&(e/=100),e)}}(),function(){var i,o,r,a,s,l,c;Se._scrollbar=n,Se.scrollbar=function(e){if(isNaN(Se._scrollbar)||e){var t,n=document.createElement("div");return n.style.cssText="overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block",n.innerHTML=" ",document.body.appendChild(n),Se._scrollbar=t=n.offsetWidth-n.scrollWidth,document.body.removeChild(n),t}return Se._scrollbar},Se.isRtl=function(t){return e(t).closest(".k-rtl").length>0},i=document.createElement("table");try{i.innerHTML="",Se.tbodyInnerHtml=!0}catch(u){Se.tbodyInnerHtml=!1}Se.touch="ontouchstart"in t,Se.msPointers=t.MSPointerEvent,Se.pointers=t.PointerEvent,o=Se.transitions=!1,r=Se.transforms=!1,a="HTMLElement"in t?HTMLElement.prototype:[],Se.hasHW3D="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix||"MozPerspective"in document.documentElement.style||"msPerspective"in document.documentElement.style,be(["Moz","webkit","O","ms"],function(){var e,t=""+this,a=typeof i.style[t+"Transition"]===Re;return a||typeof i.style[t+"Transform"]===Re?(e=t.toLowerCase(),r={css:"ms"!=e?"-"+e+"-":"",prefix:t,event:"o"===e||"webkit"===e?e:""},a&&(o=r,o.event=o.event?o.event+"TransitionEnd":"transitionend"),!1):n}),i=null,Se.transforms=r,Se.transitions=o,Se.devicePixelRatio=t.devicePixelRatio===n?1:t.devicePixelRatio;try{Se.screenWidth=t.outerWidth||t.screen?t.screen.availWidth:t.innerWidth,Se.screenHeight=t.outerHeight||t.screen?t.screen.availHeight:t.innerHeight}catch(u){Se.screenWidth=t.screen.availWidth,Se.screenHeight=t.screen.availHeight}Se.detectOS=function(e){var n,i,o=!1,r=[],a=!/mobile safari/i.test(e),s={wp:/(Windows Phone(?: OS)?)\s(\d+)\.(\d+(\.\d+)?)/,fire:/(Silk)\/(\d+)\.(\d+(\.\d+)?)/,android:/(Android|Android.*(?:Opera|Firefox).*?\/)\s*(\d+)\.(\d+(\.\d+)?)/,iphone:/(iPhone|iPod).*OS\s+(\d+)[\._]([\d\._]+)/,ipad:/(iPad).*OS\s+(\d+)[\._]([\d_]+)/,meego:/(MeeGo).+NokiaBrowser\/(\d+)\.([\d\._]+)/,webos:/(webOS)\/(\d+)\.(\d+(\.\d+)?)/,blackberry:/(BlackBerry|BB10).*?Version\/(\d+)\.(\d+(\.\d+)?)/,playbook:/(PlayBook).*?Tablet\s*OS\s*(\d+)\.(\d+(\.\d+)?)/,windows:/(MSIE)\s+(\d+)\.(\d+(\.\d+)?)/,tizen:/(tizen).*?Version\/(\d+)\.(\d+(\.\d+)?)/i,sailfish:/(sailfish).*rv:(\d+)\.(\d+(\.\d+)?).*firefox/i,ffos:/(Mobile).*rv:(\d+)\.(\d+(\.\d+)?).*Firefox/},l={ios:/^i(phone|pad|pod)$/i,android:/^android|fire$/i,blackberry:/^blackberry|playbook/i,windows:/windows/,wp:/wp/,flat:/sailfish|ffos|tizen/i,meego:/meego/},c={tablet:/playbook|ipad|fire/i},u={omini:/Opera\sMini/i,omobile:/Opera\sMobi/i,firefox:/Firefox|Fennec/i,mobilesafari:/version\/.*safari/i,ie:/MSIE|Windows\sPhone/i,chrome:/chrome|crios/i,webkit:/webkit/i};for(i in s)if(s.hasOwnProperty(i)&&(r=e.match(s[i]))){if("windows"==i&&"plugins"in navigator)return!1;o={},o.device=i,o.tablet=d(i,c,!1),o.browser=d(e,u,"default"),o.name=d(i,l),o[o.name]=!0,o.majorVersion=r[2],o.minorVersion=r[3].replace("_","."),n=o.minorVersion.replace(".","").substr(0,2),o.flatVersion=o.majorVersion+n+Array(3-(3>n.length?n.length:2)).join("0"),o.cordova=typeof t.PhoneGap!==Be||typeof t.cordova!==Be,o.appMode=t.navigator.standalone||/file|local|wmapp/.test(t.location.protocol)||o.cordova,o.android&&(1.5>Se.devicePixelRatio&&400>o.flatVersion||a)&&(Se.screenWidth>800||Se.screenHeight>800)&&(o.tablet=i);break}return o},s=Se.mobileOS=Se.detectOS(navigator.userAgent),Se.wpDevicePixelRatio=s.wp?screen.width/320:0,Se.kineticScrollNeeded=s&&(Se.touch||Se.msPointers||Se.pointers),Se.hasNativeScrolling=!1,(s.ios||s.android&&s.majorVersion>2||s.wp)&&(Se.hasNativeScrolling=s),Se.delayedClick=function(){if(Se.touch){if(s.ios)return!0;if(s.android)return Se.browser.chrome?32>Se.browser.version?!1:!(e("meta[name=viewport]").attr("content")||"").match(/user-scalable=no/i):!0}return!1},Se.mouseAndTouchPresent=Se.touch&&!(Se.mobileOS.ios||Se.mobileOS.android),Se.detectBrowser=function(e){var t,n=!1,i=[],o={edge:/(edge)[ \/]([\w.]+)/i,webkit:/(chrome)[ \/]([\w.]+)/i,safari:/(webkit)[ \/]([\w.]+)/i,opera:/(opera)(?:.*version|)[ \/]([\w.]+)/i,msie:/(msie\s|trident.*? rv:)([\w.]+)/i,mozilla:/(mozilla)(?:.*? rv:([\w.]+)|)/i};for(t in o)if(o.hasOwnProperty(t)&&(i=e.match(o[t]))){n={},n[t]=!0,n[i[1].toLowerCase().split(" ")[0].split("/")[0]]=!0,n.version=parseInt(document.documentMode||i[2],10);break}return n},Se.browser=Se.detectBrowser(navigator.userAgent),Se.detectClipboardAccess=function(){var e={copy:document.queryCommandSupported?document.queryCommandSupported("copy"):!1,cut:document.queryCommandSupported?document.queryCommandSupported("cut"):!1,paste:document.queryCommandSupported?document.queryCommandSupported("paste"):!1};return Se.browser.chrome&&(e.paste=!1,Se.browser.version>=43&&(e.copy=!0,e.cut=!0)),e},Se.clipboard=Se.detectClipboardAccess(),Se.zoomLevel=function(){var e,n,i;try{return e=Se.browser,n=0,i=document.documentElement,e.msie&&11==e.version&&i.scrollHeight>i.clientHeight&&!Se.touch&&(n=Se.scrollbar()),Se.touch?i.clientWidth/t.innerWidth:e.msie&&e.version>=10?((top||t).document.documentElement.offsetWidth+n)/(top||t).innerWidth:1}catch(o){return 1}},Se.cssBorderSpacing=n!==document.documentElement.style.borderSpacing&&!(Se.browser.msie&&8>Se.browser.version),function(t){var n="",i=e(document.documentElement),o=parseInt(t.version,10);t.msie?n="ie":t.mozilla?n="ff":t.safari?n="safari":t.webkit?n="webkit":t.opera?n="opera":t.edge&&(n="edge"),n&&(n="k-"+n+" k-"+n+o),Se.mobileOS&&(n+=" k-mobile"),i.addClass(n)}(Se.browser),Se.eventCapture=document.documentElement.addEventListener,l=document.createElement("input"),Se.placeholder="placeholder"in l,Se.propertyChangeEvent="onpropertychange"in l,Se.input=function(){for(var e,t=["number","date","time","month","week","datetime","datetime-local"],n=t.length,i="test",o={},r=0;n>r;r++)e=t[r],l.setAttribute("type",e),l.value=i,o[e.replace("-","")]="text"!==l.type&&l.value!==i;return o}(),l.style.cssText="float:left;",Se.cssFloat=!!l.style.cssFloat,l=null,Se.stableSort=function(){var e,t=513,n=[{index:0,field:"b"}];for(e=1;t>e;e++)n.push({index:e,field:"a"});return n.sort(function(e,t){return e.field>t.field?1:t.field>e.field?-1:0}),1===n[0].index}(),Se.matchesSelector=a.webkitMatchesSelector||a.mozMatchesSelector||a.msMatchesSelector||a.oMatchesSelector||a.matchesSelector||a.matches||function(t){for(var n=document.querySelectorAll?(this.parentNode||document).querySelectorAll(t)||[]:e(t),i=n.length;i--;)if(n[i]==this)return!0;return!1},Se.pushState=t.history&&t.history.pushState,c=document.documentMode,Se.hashChange="onhashchange"in t&&!(Se.browser.msie&&(!c||8>=c)),Se.customElements="registerElement"in t.document}(),U={left:{reverse:"right"},right:{reverse:"left"},down:{reverse:"up"},up:{reverse:"down"},top:{reverse:"bottom"},bottom:{reverse:"top"},"in":{reverse:"out"},out:{reverse:"in"}},j={},e.extend(j,{enabled:!0,Element:function(t){this.element=e(t)},promise:function(e,t){e.is(":visible")||e.css({display:e.data("olddisplay")||"block"}).css("display"),t.hide&&e.data("olddisplay",e.css("display")).hide(),t.init&&t.init(),t.completeCallback&&t.completeCallback(e),e.dequeue()},disable:function(){this.enabled=!1,this.promise=this.promiseShim},enable:function(){this.enabled=!0,this.promise=this.animatedPromise}}),j.promiseShim=j.promise,"kendoAnimate"in e.fn||_e(e.fn,{kendoStop:function(e,t){return this.stop(e,t)},kendoAnimate:function(e,t,n,i){return y(this,e,t,n,i)},kendoAddClass:function(e,t){return ve.toggleClass(this,e,t,!0)},kendoRemoveClass:function(e,t){return ve.toggleClass(this,e,t,!1)},kendoToggleClass:function(e,t,n){return ve.toggleClass(this,e,t,n)}}),q=/&/g,G=//g,Q=function(e){return e.target},Se.touch&&(Q=function(e){var t="originalEvent"in e?e.originalEvent.changedTouches:"changedTouches"in e?e.changedTouches:null;return t?document.elementFromPoint(t[0].clientX,t[0].clientY):e.target},be(["swipe","swipeLeft","swipeRight","swipeUp","swipeDown","doubleTap","tap"],function(t,n){e.fn[n]=function(e){return this.bind(n,e)}})),Se.touch?Se.mobileOS?(Se.mousedown="touchstart",Se.mouseup="touchend",Se.mousemove="touchmove",Se.mousecancel="touchcancel",Se.click="touchend",Se.resize="orientationchange"):(Se.mousedown="mousedown touchstart",Se.mouseup="mouseup touchend",Se.mousemove="mousemove touchmove",Se.mousecancel="mouseleave touchcancel",Se.click="click",Se.resize="resize"):Se.pointers?(Se.mousemove="pointermove",Se.mousedown="pointerdown",Se.mouseup="pointerup",Se.mousecancel="pointercancel",Se.click="pointerup",Se.resize="orientationchange resize"):Se.msPointers?(Se.mousemove="MSPointerMove",Se.mousedown="MSPointerDown",Se.mouseup="MSPointerUp",Se.mousecancel="MSPointerCancel",Se.click="MSPointerUp",Se.resize="orientationchange resize"):(Se.mousemove="mousemove",Se.mousedown="mousedown",Se.mouseup="mouseup",Se.mousecancel="mouseleave",Se.click="click",Se.resize="resize"),X=function(e,t){var n,i,o,r,a=t||"d",s=1;for(i=0,o=e.length;o>i;i++)r=e[i],""!==r&&(n=r.indexOf("["),0!==n&&(-1==n?r="."+r:(s++,r="."+r.substring(0,n)+" || {})"+r.substring(n))),s++,a+=r+(o-1>i?" || {})":")"));return Array(s).join("(")+a},J=/^([a-z]+:)?\/\//i,_e(ve,{widgets:[],_widgetRegisteredCallbacks:[],ui:ve.ui||{},fx:ve.fx||b,effects:ve.effects||j,mobile:ve.mobile||{},data:ve.data||{},dataviz:ve.dataviz||{},drawing:ve.drawing||{},spreadsheet:{messages:{}},keys:{INSERT:45,DELETE:46,BACKSPACE:8,TAB:9,ENTER:13,ESC:27,LEFT:37,UP:38,RIGHT:39,DOWN:40,END:35,HOME:36,SPACEBAR:32,PAGEUP:33,PAGEDOWN:34,F2:113,F10:121,F12:123,NUMPAD_PLUS:107,NUMPAD_MINUS:109,NUMPAD_DOT:110},support:ve.support||Se,animate:ve.animate||y,ns:"",attr:function(e){return"data-"+ve.ns+e},getShadows:a,wrap:s,deepExtend:l,getComputedStyles:f,webComponents:ve.webComponents||[],isScrollable:p,scrollLeft:m,size:g,toCamelCase:h,toHyphens:u,getOffset:ve.getOffset||v,parseEffects:ve.parseEffects||_,toggleClass:ve.toggleClass||k,directions:ve.directions||U,Observable:P,Class:i,Template:R,template:ye(R.compile,R),render:ye(R.render,R),stringify:ye(Ce.stringify,Ce),eventTarget:Q,htmlEncode:x,isLocalUrl:function(e){return e&&!J.test(e)},expr:function(e,t,n){return e=e||"",typeof t==Re&&(n=t,t=!1),n=n||"d",e&&"["!==e.charAt(0)&&(e="."+e),t?(e=e.replace(/"([^.]*)\.([^"]*)"/g,'"$1_$DOT$_$2"'),e=e.replace(/'([^.]*)\.([^']*)'/g,"'$1_$DOT$_$2'"),e=X(e.split("."),n),e=e.replace(/_\$DOT\$_/g,".")):e=n+e,e},getter:function(e,t){var n=e+t;return Le[n]=Le[n]||Function("d","return "+ve.expr(e,t))},setter:function(e){return He[e]=He[e]||Function("d,value",ve.expr(e)+"=value")},accessor:function(e){return{get:ve.getter(e),set:ve.setter(e)}},guid:function(){var e,t,n="";for(e=0;32>e;e++)t=16*xe.random()|0,8!=e&&12!=e&&16!=e&&20!=e||(n+="-"),n+=(12==e?4:16==e?3&t|8:t).toString(16);return n},roleSelector:function(e){return e.replace(/(\S+)/g,"["+ve.attr("role")+"=$1],").slice(0,-1)},directiveSelector:function(e){var t,n=e.split(" ");if(n)for(t=0;n.length>t;t++)"view"!=n[t]&&(n[t]=n[t].replace(/(\w*)(view|bar|strip|over)$/,"$1-$2"));return n.join(" ").replace(/(\S+)/g,"kendo-mobile-$1,").slice(0,-1)},triggeredByInput:function(e){return/^(label|input|textarea|select)$/i.test(e.target.tagName)},onWidgetRegistered:function(e){for(var t=0,n=ve.widgets.length;n>t;t++)e(ve.widgets[t]);ve._widgetRegisteredCallbacks.push(e)},logToConsole:function(e,i){var o=t.console;!ve.suppressLog&&n!==o&&o.log&&o[i||"log"](e)}}),Z=P.extend({init:function(e,t){var n,i=this;i.element=ve.jQuery(e).handler(i),i.angular("init",t),P.fn.init.call(i),n=t?t.dataSource:null,n&&(t=_e({},t,{dataSource:{}})),t=i.options=_e(!0,{},i.options,t), +n&&(t.dataSource=n),i.element.attr(ve.attr("role"))||i.element.attr(ve.attr("role"),(t.name||"").toLowerCase()),i.element.data("kendo"+t.prefix+t.name,i),i.bind(i.events,t)},events:[],options:{prefix:""},_hasBindingTarget:function(){return!!this.element[0].kendoBindingTarget},_tabindex:function(e){e=e||this.wrapper;var t=this.element,n="tabindex",i=e.attr(n)||t.attr(n);t.removeAttr(n),e.attr(n,isNaN(i)?0:i)},setOptions:function(t){this._setEvents(t),e.extend(this.options,t)},_setEvents:function(e){for(var t,n=this,i=0,o=n.events.length;o>i;i++)t=n.events[i],n.options[t]&&e[t]&&n.unbind(t,n.options[t]);n.bind(n.events,e)},resize:function(e){var t=this.getSize(),n=this._size;(e||(t.width>0||t.height>0)&&(!n||t.width!==n.width||t.height!==n.height))&&(this._size=t,this._resize(t,e),this.trigger("resize",t))},getSize:function(){return ve.dimensions(this.element)},size:function(e){return e?(this.setSize(e),n):this.getSize()},setSize:e.noop,_resize:e.noop,destroy:function(){var e=this;e.element.removeData("kendo"+e.options.prefix+e.options.name),e.element.removeData("handler"),e.unbind()},_destroy:function(){this.destroy()},angular:function(){},_muteAngularRebind:function(e){this._muteRebind=!0,e.call(this),this._muteRebind=!1}}),ee=Z.extend({dataItems:function(){return this.dataSource.flatView()},_angularItems:function(t){var n=this;n.angular(t,function(){return{elements:n.items(),data:e.map(n.dataItems(),function(e){return{dataItem:e}})}})}}),ve.dimensions=function(e,t){var n=e[0];return t&&e.css(t),{width:n.offsetWidth,height:n.offsetHeight}},ve.notify=ke,te=/template$/i,ne=/^\s*(?:\{(?:.|\r\n|\n)*\}|\[(?:.|\r\n|\n)*\])\s*$/,ie=/^\{(\d+)(:[^\}]+)?\}|^\[[A-Za-z_]*\]$/,oe=/([A-Z])/g,ve.initWidget=function(i,o,r){var a,s,l,c,d,u,h,f,p,m,g,v,_;if(r?r.roles&&(r=r.roles):r=ve.ui.roles,i=i.nodeType?i:i[0],u=i.getAttribute("data-"+ve.ns+"role")){p=-1===u.indexOf("."),l=p?r[u]:ve.getter(u)(t),g=e(i).data(),v=l?"kendo"+l.fn.options.prefix+l.fn.options.name:"",m=p?RegExp("^kendo.*"+u+"$","i"):RegExp("^"+v+"$","i");for(_ in g)if(_.match(m)){if(_!==v)return g[_];a=g[_]}if(l){for(f=C(i,"dataSource"),o=e.extend({},S(i,l.fn.options),o),f&&(o.dataSource=typeof f===Re?ve.getter(f)(t):f),c=0,d=l.fn.events.length;d>c;c++)s=l.fn.events[c],h=C(i,s),h!==n&&(o[s]=ve.getter(h)(t));return a?e.isEmptyObject(o)||a.setOptions(o):a=new l(i,o),a}}},ve.rolesFromNamespaces=function(e){var t,n,i=[];for(e[0]||(e=[ve.ui,ve.dataviz.ui]),t=0,n=e.length;n>t;t++)i[t]=e[t].roles;return _e.apply(null,[{}].concat(i.reverse()))},ve.init=function(t){var n=ve.rolesFromNamespaces(Ne.call(arguments,1));e(t).find("[data-"+ve.ns+"role]").addBack().each(function(){ve.initWidget(this,{},n)})},ve.destroy=function(t){e(t).find("[data-"+ve.ns+"role]").addBack().each(function(){var t,n=e(this).data();for(t in n)0===t.indexOf("kendo")&&typeof n[t].destroy===Ie&&n[t].destroy()})},ve.resize=function(t,n){var i,o=e(t).find("[data-"+ve.ns+"role]").addBack().filter(D);o.length&&(i=e.makeArray(o),i.sort(T),e.each(i,function(){var t=ve.widgetInstance(e(this));t&&t.resize(n)}))},ve.parseOptions=S,_e(ve.ui,{Widget:Z,DataBoundWidget:ee,roles:{},progress:function(t,n){var i,o,r,a,s=t.find(".k-loading-mask"),l=ve.support,c=l.browser;n?s.length||(i=l.isRtl(t),o=i?"right":"left",a=t.scrollLeft(),r=c.webkit&&i?t[0].scrollWidth-t.width()-2*a:0,s=e("
        "+ve.ui.progress.messages.loading+"
        ").width("100%").height("100%").css("top",t.scrollTop()).css(o,Math.abs(a)+r).prependTo(t)):s&&s.remove()},plugin:function(t,i,o){var r,a,s,l,c=t.fn.options.name;for(i=i||ve.ui,o=o||"",i[c]=t,i.roles[c.toLowerCase()]=t,r="getKendo"+o+c,c="kendo"+o+c,a={name:c,widget:t,prefix:o||""},ve.widgets.push(a),s=0,l=ve._widgetRegisteredCallbacks.length;l>s;s++)ve._widgetRegisteredCallbacks[s](a);e.fn[c]=function(i){var o,r=this;return typeof i===Re?(o=Ne.call(arguments,1),this.each(function(){var t,a,s=e.data(this,c);if(!s)throw Error(ve.format("Cannot call method '{0}' of {1} before it is initialized",i,c));if(t=s[i],typeof t!==Ie)throw Error(ve.format("Cannot find method '{0}' of {1}",i,c));return a=t.apply(s,o),a!==n?(r=a,!1):n})):this.each(function(){return new t(this,i)}),r},e.fn[c].widget=t,e.fn[r]=function(){return this.data(c)}}}),ve.ui.progress.messages={loading:"Loading..."},re={bind:function(){return this},nullObject:!0,options:{}},ae=Z.extend({init:function(e,t){Z.fn.init.call(this,e,t),this.element.autoApplyNS(),this.wrapper=this.element,this.element.addClass("km-widget")},destroy:function(){Z.fn.destroy.call(this),this.element.kendoDestroy()},options:{prefix:"Mobile"},events:[],view:function(){var e=this.element.closest(ve.roleSelector("view splitview modalview drawer"));return ve.widgetInstance(e,ve.mobile.ui)||re},viewHasNativeScrolling:function(){var e=this.view();return e&&e.options.useNativeScrolling},container:function(){var e=this.element.closest(ve.roleSelector("view layout modalview drawer splitview"));return ve.widgetInstance(e.eq(0),ve.mobile.ui)||re}}),_e(ve.mobile,{init:function(e){ve.init(e,ve.mobile.ui,ve.ui,ve.dataviz.ui)},appLevelNativeScrolling:function(){return ve.mobile.application&&ve.mobile.application.options&&ve.mobile.application.options.useNativeScrolling},roles:{},ui:{Widget:ae,DataBoundWidget:ee.extend(ae.prototype),roles:{},plugin:function(e){ve.ui.plugin(e,ve.mobile.ui,"Mobile")}}}),l(ve.dataviz,{init:function(e){ve.init(e,ve.dataviz.ui)},ui:{roles:{},themes:{},views:[],plugin:function(e){ve.ui.plugin(e,ve.dataviz.ui)}},roles:{}}),ve.touchScroller=function(t,n){return n||(n={}),n.useNative=!0,e(t).map(function(t,i){return i=e(i),Se.kineticScrollNeeded&&ve.mobile.ui.Scroller&&!i.data("kendoMobileScroller")?(i.kendoMobileScroller(n),i.data("kendoMobileScroller")):!1})[0]},ve.preventDefault=function(e){e.preventDefault()},ve.widgetInstance=function(e,n){var i,o,r,a,s=e.data(ve.ns+"role"),l=[];if(s){if("content"===s&&(s="scroller"),n)if(n[0])for(i=0,o=n.length;o>i;i++)l.push(n[i].roles[s]);else l.push(n.roles[s]);else l=[ve.ui.roles[s],ve.dataviz.ui.roles[s],ve.mobile.ui.roles[s]];for(s.indexOf(".")>=0&&(l=[ve.getter(s)(t)]),i=0,o=l.length;o>i;i++)if(r=l[i],r&&(a=e.data("kendo"+r.fn.options.prefix+r.fn.options.name)))return a}},ve.onResize=function(n){var i=n;return Se.mobileOS.android&&(i=function(){setTimeout(n,600)}),e(t).on(Se.resize,i),i},ve.unbindResize=function(n){e(t).off(Se.resize,n)},ve.attrValue=function(e,t){return e.data(ve.ns+t)},ve.days={Sunday:0,Monday:1,Tuesday:2,Wednesday:3,Thursday:4,Friday:5,Saturday:6},e.extend(e.expr[":"],{kendoFocusable:function(t){var n=e.attr(t,"tabindex");return A(t,!isNaN(n)&&n>-1)}}),se=["mousedown","mousemove","mouseenter","mouseleave","mouseover","mouseout","mouseup","click"],le="label, input, [data-rel=external]",ce={setupMouseMute:function(){var t,n=0,i=se.length,o=document.documentElement;if(!ce.mouseTrap&&Se.eventCapture)for(ce.mouseTrap=!0,ce.bustClick=!1,ce.captureMouse=!1,t=function(t){ce.captureMouse&&("click"===t.type?ce.bustClick&&!e(t.target).is(le)&&(t.preventDefault(),t.stopPropagation()):t.stopPropagation())};i>n;n++)o.addEventListener(se[n],t,!0)},muteMouse:function(e){ce.captureMouse=!0,e.data.bustClick&&(ce.bustClick=!0),clearTimeout(ce.mouseTrapTimeoutID)},unMuteMouse:function(){clearTimeout(ce.mouseTrapTimeoutID),ce.mouseTrapTimeoutID=setTimeout(function(){ce.captureMouse=!1,ce.bustClick=!1},400)}},de={down:"touchstart mousedown",move:"mousemove touchmove",up:"mouseup touchend touchcancel",cancel:"mouseleave touchcancel"},Se.touch&&(Se.mobileOS.ios||Se.mobileOS.android)?de={down:"touchstart",move:"touchmove",up:"touchend touchcancel",cancel:"touchcancel"}:Se.pointers?de={down:"pointerdown",move:"pointermove",up:"pointerup",cancel:"pointercancel pointerleave"}:Se.msPointers&&(de={down:"MSPointerDown",move:"MSPointerMove",up:"MSPointerUp",cancel:"MSPointerCancel MSPointerLeave"}),!Se.msPointers||"onmspointerenter"in t||e.each({MSPointerEnter:"MSPointerOver",MSPointerLeave:"MSPointerOut"},function(t,n){e.event.special[t]={delegateType:n,bindType:n,handle:function(t){var i,o=this,r=t.relatedTarget,a=t.handleObj;return r&&(r===o||e.contains(o,r))||(t.type=a.origType,i=a.handler.apply(this,arguments),t.type=n),i}}}),ue=function(e){return de[e]||e},he=/([^ ]+)/g,ve.applyEventMap=function(e,t){return e=e.replace(he,ue),t&&(e=e.replace(he,"$1."+t)),e},fe=e.fn.on,_e(!0,I,e),I.fn=I.prototype=new e,I.fn.constructor=I,I.fn.init=function(t,n){return n&&n instanceof e&&!(n instanceof I)&&(n=I(n)),e.fn.init.call(this,t,n,pe)},I.fn.init.prototype=I.fn,pe=I(document),_e(I.fn,{handler:function(e){return this.data("handler",e),this},autoApplyNS:function(e){return this.data("kendoNS",e||ve.guid()),this},on:function(){var e,t,n,i,o,r,a=this,s=a.data("kendoNS");return 1===arguments.length?fe.call(a,arguments[0]):(e=a,t=Ne.call(arguments),typeof t[t.length-1]===Be&&t.pop(),n=t[t.length-1],i=ve.applyEventMap(t[0],s),Se.mouseAndTouchPresent&&i.search(/mouse|click/)>-1&&this[0]!==document.documentElement&&(ce.setupMouseMute(),o=2===t.length?null:t[1],r=i.indexOf("click")>-1&&i.indexOf("touchend")>-1,fe.call(this,{touchstart:ce.muteMouse,touchend:ce.unMuteMouse},o,{bustClick:r})),typeof n===Re&&(e=a.data("handler"),n=e[n],t[t.length-1]=function(t){n.call(e,t)}),t[0]=i,fe.apply(a,t),a)},kendoDestroy:function(e){return e=e||this.data("kendoNS"),e&&this.off("."+e),this}}),ve.jQuery=I,ve.eventMap=de,ve.timezone=function(){function e(e,t){var n,i,o,r=t[3],a=t[4],s=t[5],l=t[8];return l||(t[8]=l={}),l[e]?l[e]:(isNaN(a)?0===a.indexOf("last")?(n=new Date(Date.UTC(e,d[r]+1,1,s[0]-24,s[1],s[2],0)),i=u[a.substr(4,3)],o=n.getUTCDay(),n.setUTCDate(n.getUTCDate()+i-o-(i>o?7:0))):a.indexOf(">=")>=0&&(n=new Date(Date.UTC(e,d[r],a.substr(5),s[0],s[1],s[2],0)),i=u[a.substr(0,3)],o=n.getUTCDay(),n.setUTCDate(n.getUTCDate()+i-o+(o>i?7:0))):n=new Date(Date.UTC(e,d[r],a,s[0],s[1],s[2],0)),l[e]=n)}function t(t,n,i){var o,r,a,s;return(n=n[i])?(a=new Date(t).getUTCFullYear(),n=jQuery.grep(n,function(e){var t=e[0],n=e[1];return a>=t&&(n>=a||t==a&&"only"==n||"max"==n)}),n.push(t),n.sort(function(t,n){return"number"!=typeof t&&(t=+e(a,t)),"number"!=typeof n&&(n=+e(a,n)),t-n}),s=n[jQuery.inArray(t,n)-1]||n[n.length-1],isNaN(s)?s:null):(o=i.split(":"),r=0,o.length>1&&(r=60*o[0]+ +o[1]),[-1e6,"max","-","Jan",1,[0,0,0],r,"-"])}function n(e,t,n){var i,o,r,a=t[n];if("string"==typeof a&&(a=t[a]),!a)throw Error('Timezone "'+n+'" is either incorrect, or kendo.timezones.min.js is not included.');for(i=a.length-1;i>=0&&(o=a[i][3],!(o&&e>o));i--);if(r=a[i+1],!r)throw Error('Timezone "'+n+'" not found on '+e+".");return r}function i(e,i,o,r){typeof e!=Me&&(e=Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()));var a=n(e,i,r);return{zone:a,rule:t(e,o,a[1])}}function o(e,t){var n,o,r;return"Etc/UTC"==t||"Etc/GMT"==t?0:(n=i(e,this.zones,this.rules,t),o=n.zone,r=n.rule,ve.parseFloat(r?o[0]-r[6]:o[0]))}function r(e,t){var n=i(e,this.zones,this.rules,t),o=n.zone,r=n.rule,a=o[2];return a.indexOf("/")>=0?a.split("/")[r&&+r[6]?1:0]:a.indexOf("%s")>=0?a.replace("%s",r&&"-"!=r[7]?r[7]:""):a}function a(e,t,n){var i,o;return typeof t==Re&&(t=this.offset(e,t)),typeof n==Re&&(n=this.offset(e,n)),i=e.getTimezoneOffset(),e=new Date(e.getTime()+6e4*(t-n)),o=e.getTimezoneOffset(),new Date(e.getTime()+6e4*(o-i))}function s(e,t){return this.convert(e,e.getTimezoneOffset(),t)}function l(e,t){return this.convert(e,t,e.getTimezoneOffset())}function c(e){return this.apply(new Date(e),"Etc/UTC")}var d={Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11},u={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};return{zones:{},rules:{},offset:o,convert:a,apply:s,remove:l,abbr:r,toLocalDate:c}}(),ve.date=function(){function e(e,t){return 0===t&&23===e.getHours()?(e.setHours(e.getHours()+2),!0):!1}function t(t,n,i){var o=t.getHours();i=i||1,n=(n-t.getDay()+7*i)%7,t.setDate(t.getDate()+n),e(t,o)}function n(e,n,i){return e=new Date(e),t(e,n,i),e}function i(e){return new Date(e.getFullYear(),e.getMonth(),1)}function o(e){var t=new Date(e.getFullYear(),e.getMonth()+1,0),n=i(e),o=Math.abs(t.getTimezoneOffset()-n.getTimezoneOffset());return o&&t.setHours(n.getHours()+o/60),t}function r(t){return t=new Date(t.getFullYear(),t.getMonth(),t.getDate(),0,0,0),e(t,0),t}function a(e){return Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds())}function s(e){return e.getTime()-r(e)}function l(e,t,n){var i,o=s(t),r=s(n);return e&&o!=r?(t>=n&&(n+=v),i=s(e),o>i&&(i+=v),o>r&&(r+=v),i>=o&&r>=i):!0}function c(e,t,n){var i,o=t.getTime(),r=n.getTime();return o>=r&&(r+=v),i=e.getTime(),i>=o&&r>=i}function d(t,n){var i=t.getHours();return t=new Date(t),u(t,n*v),e(t,i),t}function u(e,t,n){var i,o=e.getTimezoneOffset();e.setTime(e.getTime()+t),n||(i=e.getTimezoneOffset()-o,e.setTime(e.getTime()+i*g))}function h(t,n){return t=new Date(ve.date.getDate(t).getTime()+ve.date.getMilliseconds(n)),e(t,n.getHours()),t}function f(){return r(new Date)}function p(e){return r(e).getTime()==f().getTime()}function m(e){var t=new Date(1980,1,1,0,0,0);return e&&t.setHours(e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()),t}var g=6e4,v=864e5;return{adjustDST:e,dayOfWeek:n,setDayOfWeek:t,getDate:r,isInDateRange:c,isInTimeRange:l,isToday:p,nextDay:function(e){return d(e,1)},previousDay:function(e){return d(e,-1)},toUtcTime:a,MS_PER_DAY:v,MS_PER_HOUR:60*g,MS_PER_MINUTE:g,setTime:u,setHours:h,addDays:d,today:f,toInvariantTime:m,firstDayOfMonth:i,lastDayOfMonth:o,getMilliseconds:s}}(),ve.stripWhitespace=function(e){var t,n,i;if(document.createNodeIterator)for(t=document.createNodeIterator(e,NodeFilter.SHOW_TEXT,function(t){return t.parentNode==e?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT},!1);t.nextNode();)t.referenceNode&&!t.referenceNode.textContent.trim()&&t.referenceNode.parentNode.removeChild(t.referenceNode);else for(n=0;e.childNodes.length>n;n++)i=e.childNodes[n],3!=i.nodeType||/\S/.test(i.nodeValue)||(e.removeChild(i),n--),1==i.nodeType&&ve.stripWhitespace(i)},me=t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||t.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)},ve.animationFrame=function(e){me.call(t,e)},ge=[],ve.queueAnimation=function(e){ge[ge.length]=e,1===ge.length&&ve.runNextAnimation()},ve.runNextAnimation=function(){ve.animationFrame(function(){ge[0]&&(ge.shift()(),ge[0]&&ve.runNextAnimation())})},ve.parseQueryStringParams=function(e){for(var t=e.split("?")[1]||"",n={},i=t.split(/&|=/),o=i.length,r=0;o>r;r+=2)""!==i[r]&&(n[decodeURIComponent(i[r])]=decodeURIComponent(i[r+1]));return n},ve.elementUnderCursor=function(e){return n!==e.x.client?document.elementFromPoint(e.x.client,e.y.client):n},ve.wheelDeltaY=function(e){var t,i=e.originalEvent,o=i.wheelDeltaY;return i.wheelDelta?(o===n||o)&&(t=i.wheelDelta):i.detail&&i.axis===i.VERTICAL_AXIS&&(t=10*-i.detail),t},ve.throttle=function(e,t){var i,o,r=0;return!t||0>=t?e:(o=function(){function o(){e.apply(a,l),r=+new Date}var a=this,s=+new Date-r,l=arguments;return r?(i&&clearTimeout(i),s>t?o():i=setTimeout(o,t-s),n):o()},o.cancel=function(){clearTimeout(i)},o)},ve.caret=function(t,i,o){var r,a,s,l,c=i!==n;if(o===n&&(o=i),t[0]&&(t=t[0]),!c||!t.disabled){try{t.selectionStart!==n?c?(t.focus(),t.setSelectionRange(i,o)):i=[t.selectionStart,t.selectionEnd]:document.selection&&(e(t).is(":visible")&&t.focus(),r=t.createTextRange(),c?(r.collapse(!0),r.moveStart("character",i),r.moveEnd("character",o-i),r.select()):(a=r.duplicate(),r.moveToBookmark(document.selection.createRange().getBookmark()),a.setEndPoint("EndToStart",r),s=a.text.length,l=s+r.text.length,i=[s,l]))}catch(d){i=[]}return i}},ve.compileMobileDirective=function(e,n){var i=t.angular;return e.attr("data-"+ve.ns+"role",e[0].tagName.toLowerCase().replace("kendo-mobile-","").replace("-","")),i.element(e).injector().invoke(["$compile",function(t){t(e)(n),/^\$(digest|apply)$/.test(n.$$phase)||n.$digest()}]),ve.widgetInstance(e,ve.mobile.ui)},ve.antiForgeryTokens=function(){var t={},i=e("meta[name=csrf-token],meta[name=_csrf]").attr("content"),o=e("meta[name=csrf-param],meta[name=_csrf_header]").attr("content");return e("input[name^='__RequestVerificationToken']").each(function(){t[this.name]=this.value}),o!==n&&i!==n&&(t[o]=i),t},ve.cycleForm=function(e){function t(e){var t=ve.widgetInstance(e);t&&t.focus?t.focus():e.focus()}var n=e.find("input, .k-widget").first(),i=e.find("button, .k-button").last();i.on("keydown",function(e){e.keyCode!=ve.keys.TAB||e.shiftKey||(e.preventDefault(),t(n))}),n.on("keydown",function(e){e.keyCode==ve.keys.TAB&&e.shiftKey&&(e.preventDefault(),t(i))})},function(){function n(t,n,i,o){var r,a,s=e("
        ").attr({action:i,method:"POST",target:o}),l=ve.antiForgeryTokens();l.fileName=n,r=t.split(";base64,"),l.contentType=r[0].replace("data:",""),l.base64=r[1];for(a in l)l.hasOwnProperty(a)&&e("").attr({value:l[a],name:a,type:"hidden"}).appendTo(s);s.appendTo("body").submit().remove()}function i(e,t){var n,i,o,r,a,s=e;if("string"==typeof e){for(n=e.split(";base64,"),i=n[0],o=atob(n[1]),r=new Uint8Array(o.length),a=0;o.length>a;a++)r[a]=o.charCodeAt(a);s=new Blob([r.buffer],{type:i})}navigator.msSaveBlob(s,t)}function o(e,n){t.Blob&&e instanceof Blob&&(e=URL.createObjectURL(e)),r.download=n,r.href=e;var i=document.createEvent("MouseEvents");i.initMouseEvent("click",!0,!1,t,0,0,0,0,0,!1,!1,!1,!1,0,null),r.dispatchEvent(i),setTimeout(function(){URL.revokeObjectURL(e)})}var r=document.createElement("a"),a="download"in r&&!ve.support.browser.edge;ve.saveAs=function(e){var t=n;e.forceProxy||(a?t=o:navigator.msSaveBlob&&(t=i)),t(e.dataURI,e.fileName,e.proxyURL,e.proxyTarget)}}(),ve.proxyModelSetters=function(e){var t={};return Object.keys(e||{}).forEach(function(n){Object.defineProperty(t,n,{get:function(){return e[n]},set:function(t){e[n]=t,e.dirty=!0}})}),t}}(jQuery,window),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.router.min",["kendo.core.min"],e)}(function(){return function(e,t){function n(e,t){if(!t)return e;e+"/"===t&&(e=t);var n=RegExp("^"+t,"i");return n.test(e)||(e=t+"/"+e),f.protocol+"//"+(f.host+"/"+e).replace(/\/\/+/g,"/")}function i(e){return e?"#!":"#"}function o(e){var t=f.href;return"#!"===e&&t.indexOf("#")>-1&&t.indexOf("#!")<0?null:t.split(e)[1]||""}function r(e,t){return 0===t.indexOf(e)?t.substr(e.length).replace(/\/\//g,"/"):t}function a(e){return e.replace(/^(#)?/,"#")}function s(e){return e.replace(/^(#(!)?)?/,"#!")}var l=window.kendo,c="change",d="back",u="same",h=l.support,f=window.location,p=window.history,m=50,g=l.support.browser.msie,v=/^#*/,_=window.document,b=l.Class.extend({back:function(){g?setTimeout(function(){p.back()}):p.back()},forward:function(){g?setTimeout(function(){p.forward()}):p.forward()},length:function(){return p.length},replaceLocation:function(e){f.replace(e)}}),w=b.extend({init:function(e){this.root=e},navigate:function(e){p.pushState({},_.title,n(e,this.root))},replace:function(e){p.replaceState({},_.title,n(e,this.root))},normalize:function(e){return r(this.root,e)},current:function(){var e=f.pathname;return f.search&&(e+=f.search),r(this.root,e)},change:function(t){e(window).bind("popstate.kendo",t)},stop:function(){e(window).unbind("popstate.kendo")},normalizeCurrent:function(e){var t,r=e.root,a=f.pathname,s=o(i(e.hashBang));r===a+"/"&&(t=r),r===a&&s&&(t=n(s.replace(v,""),r)),t&&p.pushState({},_.title,t)}}),y=b.extend({init:function(e){this._id=l.guid(),this.prefix=i(e),this.fix=e?s:a},navigate:function(e){f.hash=this.fix(e)},replace:function(e){this.replaceLocation(this.fix(e))},normalize:function(e){return e.indexOf(this.prefix)<0?e:e.split(this.prefix)[1]},change:function(t){h.hashChange?e(window).on("hashchange."+this._id,t):this._interval=setInterval(t,m)},stop:function(){e(window).off("hashchange."+this._id),clearInterval(this._interval)},current:function(){return o(this.prefix)},normalizeCurrent:function(e){var t=f.pathname,n=e.root;return e.pushState&&n!==t?(this.replaceLocation(n+this.prefix+r(n,t)),!0):!1}}),k=l.Observable.extend({start:function(t){if(t=t||{},this.bind([c,d,u],t),!this._started){this._started=!0,t.root=t.root||"/";var n,i=this.createAdapter(t);i.normalizeCurrent(t)||(n=i.current(),e.extend(this,{adapter:i,root:t.root,historyLength:i.length(),current:n,locations:[n]}),i.change(e.proxy(this,"_checkUrl")))}},createAdapter:function(e){return h.pushState&&e.pushState?new w(e.root):new y(e.hashBang)},stop:function(){this._started&&(this.adapter.stop(),this.unbind(c),this._started=!1)},change:function(e){this.bind(c,e)},replace:function(e,t){this._navigate(e,t,function(t){t.replace(e),this.locations[this.locations.length-1]=this.current})},navigate:function(e,n){return"#:back"===e?(this.backCalled=!0,this.adapter.back(),t):(this._navigate(e,n,function(t){t.navigate(e),this.locations.push(this.current)}),t)},_navigate:function(e,n,i){var o=this.adapter;return e=o.normalize(e),this.current===e||this.current===decodeURIComponent(e)?(this.trigger(u),t):(!n&&this.trigger(c,{url:e,decode:!1})||(this.current=e,i.call(this,o),this.historyLength=o.length()),t)},_checkUrl:function(){var e=this.adapter,n=e.current(),i=e.length(),o=this.historyLength===i,r=n===this.locations[this.locations.length-2]&&o,a=this.backCalled,s=this.current;return null===n||this.current===n||this.current===decodeURIComponent(n)?!0:(this.historyLength=i,this.backCalled=!1,this.current=n,r&&this.trigger("back",{url:s,to:n})?(e.forward(),this.current=s,t):this.trigger(c,{url:n,backButtonPressed:!a})?(r?e.forward():(e.back(),this.historyLength--),this.current=s,t):(r?this.locations.pop():this.locations.push(n),t))}});l.History=k,l.History.HistoryAdapter=b,l.History.HashAdapter=y,l.History.PushStateAdapter=w,l.absoluteURL=n,l.history=new k}(window.kendo.jQuery),function(){function e(e,t){return t?e:"([^/]+)"}function t(t,n){return RegExp("^"+t.replace(p,"\\$&").replace(u,"(?:$1)?").replace(h,e).replace(f,"(.*?)")+"$",n?"i":"")}function n(e){return e.replace(/(\?.*)|(#.*)/g,"")}var i=window.kendo,o=i.history,r=i.Observable,a="init",s="routeMissing",l="change",c="back",d="same",u=/\((.*?)\)/g,h=/(\(\?)?:\w+/g,f=/\*\w+/g,p=/[\-{}\[\]+?.,\\\^$|#\s]/g,m=i.Class.extend({init:function(e,n,i){e instanceof RegExp||(e=t(e,i)),this.route=e,this._callback=n},callback:function(e,t,o){var r,a,s=0,l=i.parseQueryStringParams(e);if(l._back=t,e=n(e),r=this.route.exec(e).slice(1),a=r.length,o)for(;a>s;s++)void 0!==r[s]&&(r[s]=decodeURIComponent(r[s]));r.push(l),this._callback.apply(null,r)},worksWith:function(e,t,i){return this.route.test(n(e))?(this.callback(e,t,i),!0):!1}}),g=r.extend({init:function(e){e||(e={}),r.fn.init.call(this),this.routes=[],this.pushState=e.pushState,this.hashBang=e.hashBang,this.root=e.root,this.ignoreCase=e.ignoreCase!==!1,this.bind([a,s,l,d],e)},destroy:function(){o.unbind(l,this._urlChangedProxy),o.unbind(d,this._sameProxy),o.unbind(c,this._backProxy),this.unbind()},start:function(){var e,t=this,n=function(){t._same()},i=function(e){t._back(e)},r=function(e){t._urlChanged(e)};o.start({same:n,change:r,back:i,pushState:t.pushState,hashBang:t.hashBang,root:t.root}),e={url:o.current||"/",preventDefault:$.noop},t.trigger(a,e)||t._urlChanged(e),this._urlChangedProxy=r,this._backProxy=i},route:function(e,t){this.routes.push(new m(e,t,this.ignoreCase))},navigate:function(e,t){i.history.navigate(e,t)},replace:function(e,t){i.history.replace(e,t)},_back:function(e){this.trigger(c,{url:e.url,to:e.to})&&e.preventDefault()},_same:function(){this.trigger(d)},_urlChanged:function(e){var t,n,o,r,a=e.url,c=void 0===e.decode,d=e.backButtonPressed;if(a||(a="/"),this.trigger(l,{url:e.url,params:i.parseQueryStringParams(e.url),backButtonPressed:d}))return void e.preventDefault();for(t=0,n=this.routes,r=n.length;r>t;t++)if(o=n[t],o.worksWith(a,d,c))return;this.trigger(s,{url:a,params:i.parseQueryStringParams(a),backButtonPressed:d})&&e.preventDefault()}});i.Router=g}(),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.data.odata.min",["kendo.core.min"],e)}(function(){return function(e,t){function n(i,r){var l,c,d,u,h,f,p,m,g=[],v=i.logic||"and",_=i.filters;for(l=0,c=_.length;c>l;l++)i=_[l],d=i.field,p=i.value,f=i.operator,i.filters?i=n(i,r):(m=i.ignoreCase,d=d.replace(/\./g,"/"),i=a[f],r&&(i=s[f]),"isnull"===f||"isnotnull"===f?i=o.format("{0} {1} null",d,i):"isempty"===f||"isnotempty"===f?i=o.format("{0} {1} ''",d,i):i&&p!==t&&(u=e.type(p),"string"===u?(h="'{1}'",p=p.replace(/'/g,"''"),m===!0&&(d="tolower("+d+")")):"date"===u?r?(h="{1:yyyy-MM-ddTHH:mm:ss+00:00}",p=o.timezone.apply(p,"Etc/UTC")):h="datetime'{1:yyyy-MM-ddTHH:mm:ss}'":h="{1}",i.length>3?"substringof"!==i?h="{0}({2},"+h+")":(h="{0}("+h+",{2})","doesnotcontain"===f&&(r?(h="{0}({2},'{1}') eq -1",i="indexof"):h+=" eq false")):h="{2} {0} "+h,i=o.format(h,i,p,d))),g.push(i);return i=g.join(" "+v+" "),g.length>1&&(i="("+i+")"),i}function i(e){for(var t in e)0===t.indexOf("@odata")&&delete e[t]}var o=window.kendo,r=e.extend,a={eq:"eq",neq:"ne",gt:"gt",gte:"ge",lt:"lt",lte:"le",contains:"substringof",doesnotcontain:"substringof",endswith:"endswith",startswith:"startswith",isnull:"eq",isnotnull:"ne",isempty:"eq",isnotempty:"ne"},s=r({},a,{contains:"contains"}),l={pageSize:e.noop,page:e.noop,filter:function(e,t,i){t&&(t=n(t,i),t&&(e.$filter=t))},sort:function(t,n){var i=e.map(n,function(e){var t=e.field.replace(/\./g,"/");return"desc"===e.dir&&(t+=" desc"),t}).join(",");i&&(t.$orderby=i)},skip:function(e,t){t&&(e.$skip=t)},take:function(e,t){t&&(e.$top=t)}},c={read:{dataType:"jsonp"}};r(!0,o.data,{schemas:{odata:{type:"json",data:function(e){return e.d.results||[e.d]},total:"d.__count"}},transports:{odata:{read:{cache:!0,dataType:"jsonp",jsonp:"$callback"},update:{cache:!0,dataType:"json",contentType:"application/json",type:"PUT"},create:{cache:!0,dataType:"json",contentType:"application/json",type:"POST"},destroy:{cache:!0,dataType:"json",type:"DELETE"},parameterMap:function(e,t,n){var i,r,a,s;if(e=e||{},t=t||"read",s=(this.options||c)[t],s=s?s.dataType:"json","read"===t){i={$inlinecount:"allpages"},"json"!=s&&(i.$format="json");for(a in e)l[a]?l[a](i,e[a],n):i[a]=e[a]}else{if("json"!==s)throw Error("Only json dataType can be used for "+t+" operation.");if("destroy"!==t){for(a in e)r=e[a],"number"==typeof r&&(e[a]=r+"");i=o.stringify(e)}}return i}}}}),r(!0,o.data,{schemas:{"odata-v4":{type:"json",data:function(t){return t=e.extend({},t),i(t),t.value?t.value:[t]},total:function(e){return e["@odata.count"]}}},transports:{"odata-v4":{read:{cache:!0,dataType:"json"},update:{cache:!0,dataType:"json",contentType:"application/json;IEEE754Compatible=true",type:"PUT"},create:{cache:!0,dataType:"json",contentType:"application/json;IEEE754Compatible=true",type:"POST"},destroy:{cache:!0,dataType:"json",type:"DELETE"},parameterMap:function(e,t){var n=o.data.transports.odata.parameterMap(e,t,!0);return"read"==t&&(n.$count=!0,delete n.$inlinecount),n}}}})}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.data.xml.min",["kendo.core.min"],e)}(function(){return function(e,t){var n=window.kendo,i=e.isArray,o=e.isPlainObject,r=e.map,a=e.each,s=e.extend,l=n.getter,c=n.Class,d=c.extend({init:function(t){var l,c,d,u,h=this,f=t.total,p=t.model,m=t.parse,g=t.errors,v=t.serialize,_=t.data;p&&(o(p)&&(l=t.modelBase||n.data.Model,p.fields&&a(p.fields,function(t,n){o(n)&&n.field?e.isFunction(n.field)||(n=s(n,{field:h.getter(n.field)})):n={field:h.getter(n)},p.fields[t]=n}),c=p.id,c&&(d={},d[h.xpathToMember(c,!0)]={field:h.getter(c)},p.fields=s(d,p.fields),p.id=h.xpathToMember(c)),p=l.define(p)),h.model=p),f&&("string"==typeof f?(f=h.getter(f),h.total=function(e){return parseInt(f(e),10)}):"function"==typeof f&&(h.total=f)),g&&("string"==typeof g?(g=h.getter(g),h.errors=function(e){return g(e)||null}):"function"==typeof g&&(h.errors=g)),_&&("string"==typeof _?(_=h.xpathToMember(_),h.data=function(e){var t,n=h.evaluate(e,_);return n=i(n)?n:[n],h.model&&p.fields?(t=new h.model,r(n,function(e){if(e){var n,i={};for(n in p.fields)i[n]=t._parse(n,p.fields[n].field(e));return i}})):n}):"function"==typeof _&&(h.data=_)),"function"==typeof m&&(u=h.parse,h.parse=function(e){var t=m.call(h,e);return u.call(h,t)}),"function"==typeof v&&(h.serialize=v)},total:function(e){return this.data(e).length},errors:function(e){return e?e.errors:null},serialize:function(e){return e},parseDOM:function(e){var n,o,r,a,s,l,c,d={},u=e.attributes,h=u.length;for(c=0;h>c;c++)l=u[c],d["@"+l.nodeName]=l.nodeValue;for(o=e.firstChild;o;o=o.nextSibling)r=o.nodeType,3===r||4===r?d["#text"]=o.nodeValue:1===r&&(n=this.parseDOM(o),a=o.nodeName,s=d[a],i(s)?s.push(n):s=s!==t?[s,n]:n,d[a]=s);return d},evaluate:function(e,t){for(var n,o,r,a,s,l=t.split(".");n=l.shift();)if(e=e[n],i(e)){for(o=[],t=l.join("."),s=0,r=e.length;r>s;s++)a=this.evaluate(e[s],t),a=i(a)?a:[a],o.push.apply(o,a);return o}return e},parse:function(t){var n,i,o={};return n=t.documentElement||e.parseXML(t).documentElement,i=this.parseDOM(n),o[n.nodeName]=i,o},xpathToMember:function(e,t){return e?(e=e.replace(/^\//,"").replace(/\//g,"."),e.indexOf("@")>=0?e.replace(/\.?(@.*)/,t?"$1":'["$1"]'):e.indexOf("text()")>=0?e.replace(/(\.?text\(\))/,t?"#text":'["#text"]'):e):""},getter:function(e){return l(this.xpathToMember(e),!0)}});e.extend(!0,n.data,{XmlDataReader:d,readers:{xml:d}})}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.data.min",["kendo.core.min","kendo.data.odata.min","kendo.data.xml.min"],e)}(function(){return function(e,t){function n(e,t,n,i){return function(o){var r,a={};for(r in o)a[r]=o[r];a.field=i?n+"."+o.field:n,t==Ae&&e._notifyChange&&e._notifyChange(a),e.trigger(t,a)}}function i(t,n){if(t===n)return!0;var o,r=e.type(t),a=e.type(n);if(r!==a)return!1;if("date"===r)return t.getTime()===n.getTime();if("object"!==r&&"array"!==r)return!1;for(o in t)if(!i(t[o],n[o]))return!1;return!0}function o(e,t){var n,i;for(i in e){if(n=e[i],ue(n)&&n.field&&n.field===t)return n;if(n===t)return n}return null}function r(e){this.data=e||[]}function a(e,n){if(e){var i=typeof e===ke?{field:e,dir:n}:e,o=fe(i)?i:i!==t?[i]:[];return pe(o,function(e){return!!e.dir})}}function s(e){var t,n,i,o,r=e.filters;if(r)for(t=0,n=r.length;n>t;t++)i=r[t],o=i.operator,o&&typeof o===ke&&(i.operator=X[o.toLowerCase()]||o),s(i)}function l(e){return e&&!he(e)?(!fe(e)&&e.filters||(e={logic:"and",filters:fe(e)?e:[e]}),s(e),e):t}function c(e,t){return e.logic||t.logic?!1:e.field===t.field&&e.value===t.value&&e.operator===t.operator}function d(e){return e=e||{},he(e)?{logic:"and",filters:[]}:l(e)}function u(e,t){return t.logic||e.field>t.field?1:t.field>e.field?-1:0}function h(e,t){var n,i,o,r,a;if(e=d(e),t=d(t),e.logic!==t.logic)return!1;if(o=(e.filters||[]).slice(),r=(t.filters||[]).slice(),o.length!==r.length)return!1;for(o=o.sort(u),r=r.sort(u),a=0;o.length>a;a++)if(n=o[a],i=r[a],n.logic&&i.logic){if(!h(n,i))return!1}else if(!c(n,i))return!1;return!0}function f(e){return fe(e)?e:[e]}function p(e,n){var i=typeof e===ke?{field:e,dir:n}:e,o=fe(i)?i:i!==t?[i]:[];return W(o,function(e){return{field:e.field,dir:e.dir||"asc",aggregates:e.aggregates}})}function m(e,t){return e&&e.getTime&&t&&t.getTime?e.getTime()===t.getTime():e===t}function g(e,t,n,i,o,r){var a,s,l,c,d;for(t=t||[],c=t.length,a=0;c>a;a++)s=t[a],l=s.aggregate,d=s.field,e[d]=e[d]||{},r[d]=r[d]||{},r[d][l]=r[d][l]||{},e[d][l]=J[l.toLowerCase()](e[d][l],n,_e.accessor(d),i,o,r[d][l])}function v(e){return"number"==typeof e&&!isNaN(e)}function _(e){return e&&e.getTime}function b(e){var t,n=e.length,i=Array(n);for(t=0;n>t;t++)i[t]=e[t].toJSON();return i}function w(e,t,n,i,o){ +var r,a,s,l,c,d={};for(l=0,c=e.length;c>l;l++){r=e[l];for(a in t)s=o[a],s&&s!==a&&(d[s]||(d[s]=_e.setter(s)),d[s](r,t[a](r)),delete r[a])}}function y(e,t,n,i,o){var r,a,s,l,c;for(l=0,c=e.length;c>l;l++){r=e[l];for(a in t)r[a]=n._parse(a,t[a](r)),s=o[a],s&&s!==a&&delete r[s]}}function k(e,t,n,i,o){var r,a,s,l;for(a=0,l=e.length;l>a;a++)r=e[a],s=i[r.field],s&&s!=r.field&&(r.field=s),r.value=n._parse(r.field,r.value),r.hasSubgroups?k(r.items,t,n,i,o):y(r.items,t,n,i,o)}function x(e,t,n,i,o,r){return function(a){return a=e(a),a&&!he(i)&&("[object Array]"===$e.call(a)||a instanceof Je||(a=[a]),n(a,i,new t,o,r)),a||[]}}function C(e,t,n,i){for(var o,r,a,s=0;t.length&&i&&(o=t[s],r=o.items,a=r.length,e&&e.field===o.field&&e.value===o.value?(e.hasSubgroups&&e.items.length?C(e.items[e.items.length-1],o.items,n,i):(r=r.slice(n,n+i),e.items=e.items.concat(r)),t.splice(s--,1)):o.hasSubgroups&&r.length?(C(o,r,n,i),o.items.length||t.splice(s--,1)):(r=r.slice(n,n+i),o.items=r,o.items.length||t.splice(s--,1)),0===r.length?n-=a:(n=0,i-=r.length),!(++s>=t.length)););t.length>s&&t.splice(s,t.length-s)}function S(e){var t,n,i,o,r,a=[];for(t=0,n=e.length;n>t;t++)if(r=e.at(t),r.hasSubgroups)a=a.concat(S(r.items));else for(i=r.items,o=0;i.length>o;o++)a.push(i.at(o));return a}function T(e,t){var n,i,o;if(t)for(n=0,i=e.length;i>n;n++)o=e.at(n),o.hasSubgroups?T(o.items,t):o.items=new U(o.items,t)}function D(e,t){for(var n=0,i=e.length;i>n;n++)if(e[n].hasSubgroups){if(D(e[n].items,t))return!0}else if(t(e[n].items,e[n]))return!0}function A(e,t,n,i){for(var o=0;e.length>o&&e[o].data!==t&&!E(e[o].data,n,i);o++);}function E(e,t,n){for(var i=0,o=e.length;o>i;i++){if(e[i]&&e[i].hasSubgroups)return E(e[i].items,t,n);if(e[i]===t||e[i]===n)return e[i]=n,!0}}function I(e,n,i,o,r){var a,s,l,c;for(a=0,s=e.length;s>a;a++)if(l=e[a],l&&!(l instanceof o))if(l.hasSubgroups===t||r){for(c=0;n.length>c;c++)if(n[c]===l){e[a]=n.at(c),A(i,n,l,e[a]);break}}else I(l.items,n,i,o,r)}function R(e,t){var n,i,o;for(n=0,i=e.length;i>n;n++)if(o=e.at(n),o.uid==t.uid)return e.splice(n,1),o}function M(e,t){return t?z(e,function(e){return e.uid&&e.uid==t.uid||e[t.idField]===t.id&&t.id!==t._defaultId}):-1}function F(e,t){return t?z(e,function(e){return e.uid==t.uid}):-1}function z(e,t){var n,i;for(n=0,i=e.length;i>n;n++)if(t(e[n]))return n;return-1}function P(e,t){var n,i;return e&&!he(e)?(n=e[t],i=ue(n)?n.from||n.field||t:e[t]||t,be(i)?t:i):t}function B(e,t){var n,i,o,r={};for(o in e)"filters"!==o&&(r[o]=e[o]);if(e.filters)for(r.filters=[],n=0,i=e.filters.length;i>n;n++)r.filters[n]=B(e.filters[n],t);else r.field=P(t.fields,r.field);return r}function L(e,t){var n,i,o,r,a,s=[];for(n=0,i=e.length;i>n;n++){o={},r=e[n];for(a in r)o[a]=r[a];o.field=P(t.fields,o.field),o.aggregates&&fe(o.aggregates)&&(o.aggregates=L(o.aggregates,t)),s.push(o)}return s}function H(t,n){var i,o,r,a,s,l,c,d,u,h;for(t=e(t)[0],i=t.options,o=n[0],r=n[1],a=[],s=0,l=i.length;l>s;s++)u={},d=i[s],c=d.parentNode,c===t&&(c=null),d.disabled||c&&c.disabled||(c&&(u.optgroup=c.label),u[o.field]=d.text,h=d.attributes.value,h=h&&h.specified?d.value:d.text,u[r.field]=h,a.push(u));return a}function N(t,n){var i,o,r,a,s,l,c,d=e(t)[0].tBodies[0],u=d?d.rows:[],h=n.length,f=[];for(i=0,o=u.length;o>i;i++){for(s={},c=!0,a=u[i].cells,r=0;h>r;r++)l=a[r],"th"!==l.nodeName.toLowerCase()&&(c=!1,s[n[r].field]=l.innerHTML);c||f.push(s)}return f}function O(e){return function(){var t=this._data,n=ie.fn[e].apply(this,qe.call(arguments));return this._data!=t&&this._attachBubbleHandlers(),n}}function V(t,n){function i(e,t){return e.filter(t).add(e.find(t))}var o,r,a,s,l,c,d,u,h=e(t).children(),f=[],p=n[0].field,m=n[1]&&n[1].field,g=n[2]&&n[2].field,v=n[3]&&n[3].field;for(o=0,r=h.length;r>o;o++)a={_loaded:!0},s=h.eq(o),c=s[0].firstChild,u=s.children(),t=u.filter("ul"),u=u.filter(":not(ul)"),l=s.attr("data-id"),l&&(a.id=l),c&&(a[p]=3==c.nodeType?c.nodeValue:u.text()),m&&(a[m]=i(u,"a").attr("href")),v&&(a[v]=i(u,"img").attr("src")),g&&(d=i(u,".k-sprite").prop("className"),a[g]=d&&e.trim(d.replace("k-sprite",""))),t.length&&(a.items=V(t.eq(0),n)),"true"==s.attr("data-hasChildren")&&(a.hasChildren=!0),f.push(a);return f}var W,U,j,q,G,$,Y,K,Q,X,J,Z,ee,te,ne,ie,oe,re,ae,se,le,ce=e.extend,de=e.proxy,ue=e.isPlainObject,he=e.isEmptyObject,fe=e.isArray,pe=e.grep,me=e.ajax,ge=e.each,ve=e.noop,_e=window.kendo,be=_e.isFunction,we=_e.Observable,ye=_e.Class,ke="string",xe="function",Ce="create",Se="read",Te="update",De="destroy",Ae="change",Ee="sync",Ie="get",Re="error",Me="requestStart",Fe="progress",ze="requestEnd",Pe=[Ce,Se,Te,De],Be=function(e){return e},Le=_e.getter,He=_e.stringify,Ne=Math,Oe=[].push,Ve=[].join,We=[].pop,Ue=[].splice,je=[].shift,qe=[].slice,Ge=[].unshift,$e={}.toString,Ye=_e.support.stableSort,Ke=/^\/Date\((.*?)\)\/$/,Qe=/(\r+|\n+)/g,Xe=/(?=['\\])/g,Je=we.extend({init:function(e,t){var n=this;n.type=t||j,we.fn.init.call(n),n.length=e.length,n.wrapAll(e,n)},at:function(e){return this[e]},toJSON:function(){var e,t,n=this.length,i=Array(n);for(e=0;n>e;e++)t=this[e],t instanceof j&&(t=t.toJSON()),i[e]=t;return i},parent:ve,wrapAll:function(e,t){var n,i,o=this,r=function(){return o};for(t=t||[],n=0,i=e.length;i>n;n++)t[n]=o.wrap(e[n],r);return t},wrap:function(e,t){var n,i=this;return null!==e&&"[object Object]"===$e.call(e)&&(n=e instanceof i.type||e instanceof $,n||(e=e instanceof j?e.toJSON():e,e=new i.type(e)),e.parent=t,e.bind(Ae,function(e){i.trigger(Ae,{field:e.field,node:e.node,index:e.index,items:e.items||[this],action:e.node?e.action||"itemloaded":"itemchange"})})),e},push:function(){var e,t=this.length,n=this.wrapAll(arguments);return e=Oe.apply(this,n),this.trigger(Ae,{action:"add",index:t,items:n}),e},slice:qe,sort:[].sort,join:Ve,pop:function(){var e=this.length,t=We.apply(this);return e&&this.trigger(Ae,{action:"remove",index:e-1,items:[t]}),t},splice:function(e,t,n){var i,o,r,a=this.wrapAll(qe.call(arguments,2));if(i=Ue.apply(this,[e,t].concat(a)),i.length)for(this.trigger(Ae,{action:"remove",index:e,items:i}),o=0,r=i.length;r>o;o++)i[o]&&i[o].children&&i[o].unbind(Ae);return n&&this.trigger(Ae,{action:"add",index:e,items:a}),i},shift:function(){var e=this.length,t=je.apply(this);return e&&this.trigger(Ae,{action:"remove",index:0,items:[t]}),t},unshift:function(){var e,t=this.wrapAll(arguments);return e=Ge.apply(this,t),this.trigger(Ae,{action:"add",index:0,items:t}),e},indexOf:function(e){var t,n,i=this;for(t=0,n=i.length;n>t;t++)if(i[t]===e)return t;return-1},forEach:function(e){for(var t=0,n=this.length;n>t;t++)e(this[t],t,this)},map:function(e){for(var t=0,n=[],i=this.length;i>t;t++)n[t]=e(this[t],t,this);return n},reduce:function(e){var t,n=0,i=this.length;for(2==arguments.length?t=arguments[1]:i>n&&(t=this[n++]);i>n;n++)t=e(t,this[n],n,this);return t},reduceRight:function(e){var t,n=this.length-1;for(2==arguments.length?t=arguments[1]:n>0&&(t=this[n--]);n>=0;n--)t=e(t,this[n],n,this);return t},filter:function(e){for(var t,n=0,i=[],o=this.length;o>n;n++)t=this[n],e(t,n,this)&&(i[i.length]=t);return i},find:function(e){for(var t,n=0,i=this.length;i>n;n++)if(t=this[n],e(t,n,this))return t},every:function(e){for(var t,n=0,i=this.length;i>n;n++)if(t=this[n],!e(t,n,this))return!1;return!0},some:function(e){for(var t,n=0,i=this.length;i>n;n++)if(t=this[n],e(t,n,this))return!0;return!1},remove:function(e){var t=this.indexOf(e);-1!==t&&this.splice(t,1)},empty:function(){this.splice(0,this.length)}});"undefined"!=typeof Symbol&&Symbol.iterator&&!Je.prototype[Symbol.iterator]&&(Je.prototype[Symbol.iterator]=[][Symbol.iterator]),U=Je.extend({init:function(e,t){we.fn.init.call(this),this.type=t||j;for(var n=0;e.length>n;n++)this[n]=e[n];this.length=n,this._parent=de(function(){return this},this)},at:function(e){var t=this[e];return t instanceof this.type?t.parent=this._parent:t=this[e]=this.wrap(t,this._parent),t}}),j=we.extend({init:function(e){var t,n,i=this,o=function(){return i};we.fn.init.call(this),this._handlers={};for(n in e)t=e[n],"object"==typeof t&&t&&!t.getTime&&"_"!=n.charAt(0)&&(t=i.wrap(t,n,o)),i[n]=t;i.uid=_e.guid()},shouldSerialize:function(e){return this.hasOwnProperty(e)&&"_handlers"!==e&&"_events"!==e&&typeof this[e]!==xe&&"uid"!==e},forEach:function(e){for(var t in this)this.shouldSerialize(t)&&e(this[t],t)},toJSON:function(){var e,t,n={};for(t in this)this.shouldSerialize(t)&&(e=this[t],(e instanceof j||e instanceof Je)&&(e=e.toJSON()),n[t]=e);return n},get:function(e){var t,n=this;return n.trigger(Ie,{field:e}),t="this"===e?n:_e.getter(e,!0)(n)},_set:function(e,t){var n,i,o,r=this,a=e.indexOf(".")>=0;if(a)for(n=e.split("."),i="";n.length>1;){if(i+=n.shift(),o=_e.getter(i,!0)(r),o instanceof j)return o.set(n.join("."),t),a;i+="."}return _e.setter(e)(r,t),a},set:function(e,t){var n=this,i=!1,o=e.indexOf(".")>=0,r=_e.getter(e,!0)(n);return r!==t&&(r instanceof we&&this._handlers[e]&&(this._handlers[e].get&&r.unbind(Ie,this._handlers[e].get),r.unbind(Ae,this._handlers[e].change)),i=n.trigger("set",{field:e,value:t}),i||(o||(t=n.wrap(t,e,function(){return n})),(!n._set(e,t)||e.indexOf("(")>=0||e.indexOf("[")>=0)&&n.trigger(Ae,{field:e}))),i},parent:ve,wrap:function(e,t,i){var o,r,a,s,l=this,c=$e.call(e);return null==e||"[object Object]"!==c&&"[object Array]"!==c||(a=e instanceof Je,s=e instanceof ie,"[object Object]"!==c||s||a?("[object Array]"===c||a||s)&&(a||s||(e=new Je(e)),r=n(l,Ae,t,!1),e.bind(Ae,r),l._handlers[t]={change:r}):(e instanceof j||(e=new j(e)),o=n(l,Ie,t,!0),e.bind(Ie,o),r=n(l,Ae,t,!0),e.bind(Ae,r),l._handlers[t]={get:o,change:r}),e.parent=i),e}}),q={number:function(e){return _e.parseFloat(e)},date:function(e){return _e.parseDate(e)},"boolean":function(e){return typeof e===ke?"true"===e.toLowerCase():null!=e?!!e:e},string:function(e){return null!=e?e+"":e},"default":function(e){return e}},G={string:"",number:0,date:new Date,"boolean":!1,"default":""},$=j.extend({init:function(n){var i,o,r=this;if((!n||e.isEmptyObject(n))&&(n=e.extend({},r.defaults,n),r._initializers))for(i=0;r._initializers.length>i;i++)o=r._initializers[i],n[o]=r.defaults[o]();j.fn.init.call(r,n),r.dirty=!1,r.idField&&(r.id=r.get(r.idField),r.id===t&&(r.id=r._defaultId))},shouldSerialize:function(e){return j.fn.shouldSerialize.call(this,e)&&"uid"!==e&&!("id"!==this.idField&&"id"===e)&&"dirty"!==e&&"_accessors"!==e},_parse:function(e,t){var n,i=this,r=e,a=i.fields||{};return e=a[e],e||(e=o(a,r)),e&&(n=e.parse,!n&&e.type&&(n=q[e.type.toLowerCase()])),n?n(t):t},_notifyChange:function(e){var t=e.action;"add"!=t&&"remove"!=t||(this.dirty=!0)},editable:function(e){return e=(this.fields||{})[e],e?e.editable!==!1:!0},set:function(e,t,n){var o=this,r=o.dirty;o.editable(e)&&(t=o._parse(e,t),i(t,o.get(e))||(o.dirty=!0,j.fn.set.call(o,e,t,n)&&!r&&(o.dirty=r)))},accept:function(e){var t,n,i=this,o=function(){return i};for(t in e)n=e[t],"_"!=t.charAt(0)&&(n=i.wrap(e[t],t,o)),i._set(t,n);i.idField&&(i.id=i.get(i.idField)),i.dirty=!1},isNew:function(){return this.id===this._defaultId}}),$.define=function(e,n){n===t&&(n=e,e=$);var i,o,r,a,s,l,c,d,u=ce({defaults:{}},n),h={},f=u.id,p=[];if(f&&(u.idField=f),u.id&&delete u.id,f&&(u.defaults[f]=u._defaultId=""),"[object Array]"===$e.call(u.fields)){for(l=0,c=u.fields.length;c>l;l++)r=u.fields[l],typeof r===ke?h[r]={}:r.field&&(h[r.field]=r);u.fields=h}for(o in u.fields)r=u.fields[o],a=r.type||"default",s=null,d=o,o=typeof r.field===ke?r.field:o,r.nullable||(s=u.defaults[d!==o?d:o]=r.defaultValue!==t?r.defaultValue:G[a.toLowerCase()],"function"==typeof s&&p.push(o)),n.id===o&&(u._defaultId=s),u.defaults[d!==o?d:o]=s,r.parse=r.parse||q[a];return p.length>0&&(u._initializers=p),i=e.extend(u),i.define=function(e){return $.define(i,e)},u.fields&&(i.fields=u.fields,i.idField=u.idField),i},Y={selector:function(e){return be(e)?e:Le(e)},compare:function(e){var t=this.selector(e);return function(e,n){return e=t(e),n=t(n),null==e&&null==n?0:null==e?-1:null==n?1:e.localeCompare?e.localeCompare(n):e>n?1:n>e?-1:0}},create:function(e){var t=e.compare||this.compare(e.field);return"desc"==e.dir?function(e,n){return t(n,e,!0)}:t},combine:function(e){return function(t,n){var i,o,r=e[0](t,n);for(i=1,o=e.length;o>i;i++)r=r||e[i](t,n);return r}}},K=ce({},Y,{asc:function(e){var t=this.selector(e);return function(e,n){var i=t(e),o=t(n);return i&&i.getTime&&o&&o.getTime&&(i=i.getTime(),o=o.getTime()),i===o?e.__position-n.__position:null==i?-1:null==o?1:i.localeCompare?i.localeCompare(o):i>o?1:-1}},desc:function(e){var t=this.selector(e);return function(e,n){var i=t(e),o=t(n);return i&&i.getTime&&o&&o.getTime&&(i=i.getTime(),o=o.getTime()),i===o?e.__position-n.__position:null==i?1:null==o?-1:o.localeCompare?o.localeCompare(i):o>i?1:-1}},create:function(e){return this[e.dir](e.field)}}),W=function(e,t){var n,i=e.length,o=Array(i);for(n=0;i>n;n++)o[n]=t(e[n],n,e);return o},Q=function(){function e(e){return e.replace(Xe,"\\").replace(Qe,"")}function t(t,n,i,o){var r;return null!=i&&(typeof i===ke&&(i=e(i),r=Ke.exec(i),r?i=new Date(+r[1]):o?(i="'"+i.toLowerCase()+"'",n="(("+n+" || '')+'').toLowerCase()"):i="'"+i+"'"),i.getTime&&(n="("+n+"&&"+n+".getTime?"+n+".getTime():"+n+")",i=i.getTime())),n+" "+t+" "+i}return{quote:function(t){return t&&t.getTime?"new Date("+t.getTime()+")":"string"==typeof t?"'"+e(t)+"'":""+t},eq:function(e,n,i){return t("==",e,n,i)},neq:function(e,n,i){return t("!=",e,n,i)},gt:function(e,n,i){return t(">",e,n,i)},gte:function(e,n,i){return t(">=",e,n,i)},lt:function(e,n,i){return t("<",e,n,i)},lte:function(e,n,i){return t("<=",e,n,i)},startswith:function(t,n,i){return i&&(t="("+t+" || '').toLowerCase()",n&&(n=n.toLowerCase())),n&&(n=e(n)),t+".lastIndexOf('"+n+"', 0) == 0"},doesnotstartwith:function(t,n,i){return i&&(t="("+t+" || '').toLowerCase()",n&&(n=n.toLowerCase())),n&&(n=e(n)),t+".lastIndexOf('"+n+"', 0) == -1"},endswith:function(t,n,i){return i&&(t="("+t+" || '').toLowerCase()",n&&(n=n.toLowerCase())),n&&(n=e(n)),t+".indexOf('"+n+"', "+t+".length - "+(n||"").length+") >= 0"},doesnotendwith:function(t,n,i){return i&&(t="("+t+" || '').toLowerCase()",n&&(n=n.toLowerCase())),n&&(n=e(n)),t+".indexOf('"+n+"', "+t+".length - "+(n||"").length+") < 0"},contains:function(t,n,i){return i&&(t="("+t+" || '').toLowerCase()",n&&(n=n.toLowerCase())),n&&(n=e(n)),t+".indexOf('"+n+"') >= 0"},doesnotcontain:function(t,n,i){return i&&(t="("+t+" || '').toLowerCase()",n&&(n=n.toLowerCase())),n&&(n=e(n)),t+".indexOf('"+n+"') == -1"},isempty:function(e){return e+" === ''"},isnotempty:function(e){return e+" !== ''"},isnull:function(e){return"("+e+" === null || "+e+" === undefined)"},isnotnull:function(e){return"("+e+" !== null && "+e+" !== undefined)"}}}(),r.filterExpr=function(e){var n,i,o,a,s,l,c=[],d={and:" && ",or:" || "},u=[],h=[],f=e.filters;for(n=0,i=f.length;i>n;n++)o=f[n],s=o.field,l=o.operator,o.filters?(a=r.filterExpr(o),o=a.expression.replace(/__o\[(\d+)\]/g,function(e,t){return t=+t,"__o["+(h.length+t)+"]"}).replace(/__f\[(\d+)\]/g,function(e,t){return t=+t,"__f["+(u.length+t)+"]"}),h.push.apply(h,a.operators),u.push.apply(u,a.fields)):(typeof s===xe?(a="__f["+u.length+"](d)",u.push(s)):a=_e.expr(s),typeof l===xe?(o="__o["+h.length+"]("+a+", "+Q.quote(o.value)+")",h.push(l)):o=Q[(l||"eq").toLowerCase()](a,o.value,o.ignoreCase!==t?o.ignoreCase:!0)),c.push(o);return{expression:"("+c.join(d[e.logic])+")",fields:u,operators:h}},X={"==":"eq",equals:"eq",isequalto:"eq",equalto:"eq",equal:"eq","!=":"neq",ne:"neq",notequals:"neq",isnotequalto:"neq",notequalto:"neq",notequal:"neq","<":"lt",islessthan:"lt",lessthan:"lt",less:"lt","<=":"lte",le:"lte",islessthanorequalto:"lte",lessthanequal:"lte",">":"gt",isgreaterthan:"gt",greaterthan:"gt",greater:"gt",">=":"gte",isgreaterthanorequalto:"gte",greaterthanequal:"gte",ge:"gte",notsubstringof:"doesnotcontain",isnull:"isnull",isempty:"isempty",isnotempty:"isnotempty"},r.normalizeFilter=l,r.compareFilters=h,r.prototype={toArray:function(){return this.data},range:function(e,t){return new r(this.data.slice(e,e+t))},skip:function(e){return new r(this.data.slice(e))},take:function(e){return new r(this.data.slice(0,e))},select:function(e){return new r(W(this.data,e))},order:function(e,t){var n={dir:t};return e&&(e.compare?n.compare=e.compare:n.field=e),new r(this.data.slice(0).sort(Y.create(n)))},orderBy:function(e){return this.order(e,"asc")},orderByDescending:function(e){return this.order(e,"desc")},sort:function(e,t,n){var i,o,r=a(e,t),s=[];if(n=n||Y,r.length){for(i=0,o=r.length;o>i;i++)s.push(n.create(r[i]));return this.orderBy({compare:n.combine(s)})}return this},filter:function(e){var t,n,i,o,a,s,c,d,u=this.data,h=[];if(e=l(e),!e||0===e.filters.length)return this;for(o=r.filterExpr(e),s=o.fields,c=o.operators,a=d=Function("d, __f, __o","return "+o.expression),(s.length||c.length)&&(d=function(e){return a(e,s,c)}),t=0,i=u.length;i>t;t++)n=u[t],d(n)&&h.push(n);return new r(h)},group:function(e,t){e=p(e||[]),t=t||this.data;var n,i=this,o=new r(i.data);return e.length>0&&(n=e[0],o=o.groupBy(n).select(function(i){var o=new r(t).filter([{field:i.field,operator:"eq",value:i.value,ignoreCase:!1}]);return{field:i.field,value:i.value,items:e.length>1?new r(i.items).group(e.slice(1),o.toArray()).toArray():i.items,hasSubgroups:e.length>1,aggregates:o.aggregate(n.aggregates)}})),o},groupBy:function(e){if(he(e)||!this.data.length)return new r([]);var t,n,i,o,a=e.field,s=this._sortForGrouping(a,e.dir||"asc"),l=_e.accessor(a),c=l.get(s[0],a),d={field:a,value:c,items:[]},u=[d];for(i=0,o=s.length;o>i;i++)t=s[i],n=l.get(t,a),m(c,n)||(c=n,d={field:a,value:c,items:[]},u.push(d)),d.items.push(t);return new r(u)},_sortForGrouping:function(e,t){var n,i,o=this.data;if(!Ye){for(n=0,i=o.length;i>n;n++)o[n].__position=n;for(o=new r(o).sort(e,t,K).toArray(),n=0,i=o.length;i>n;n++)delete o[n].__position;return o}return this.sort(e,t).toArray()},aggregate:function(e){var t,n,i={},o={};if(e&&e.length)for(t=0,n=this.data.length;n>t;t++)g(i,e,this.data[t],t,n,o);return i}},J={sum:function(e,t,n){var i=n.get(t);return v(e)?v(i)&&(e+=i):e=i,e},count:function(e){return(e||0)+1},average:function(e,n,i,o,r,a){var s=i.get(n);return a.count===t&&(a.count=0),v(e)?v(s)&&(e+=s):e=s,v(s)&&a.count++,o==r-1&&v(e)&&(e/=a.count),e},max:function(e,t,n){var i=n.get(t);return v(e)||_(e)||(e=i),i>e&&(v(i)||_(i))&&(e=i),e},min:function(e,t,n){var i=n.get(t);return v(e)||_(e)||(e=i),e>i&&(v(i)||_(i))&&(e=i),e}},r.process=function(e,n){n=n||{};var i,o=new r(e),s=n.group,l=p(s||[]).concat(a(n.sort||[])),c=n.filterCallback,d=n.filter,u=n.skip,h=n.take;return d&&(o=o.filter(d),c&&(o=c(o)),i=o.toArray().length),l&&(o=o.sort(l),s&&(e=o.toArray())),u!==t&&h!==t&&(o=o.range(u,h)),s&&(o=o.group(s,e)),{total:i,data:o.toArray()}},Z=ye.extend({init:function(e){this.data=e.data},read:function(e){e.success(this.data)},update:function(e){e.success(e.data)},create:function(e){e.success(e.data)},destroy:function(e){e.success(e.data)}}),ee=ye.extend({init:function(e){var t,n=this;e=n.options=ce({},n.options,e),ge(Pe,function(t,n){typeof e[n]===ke&&(e[n]={url:e[n]})}),n.cache=e.cache?te.create(e.cache):{find:ve,add:ve},t=e.parameterMap,be(e.push)&&(n.push=e.push),n.push||(n.push=Be),n.parameterMap=be(t)?t:function(e){var n={};return ge(e,function(e,i){e in t&&(e=t[e],ue(e)&&(i=e.value(i),e=e.key)),n[e]=i}),n}},options:{parameterMap:Be},create:function(e){return me(this.setup(e,Ce))},read:function(n){var i,o,r,a=this,s=a.cache;n=a.setup(n,Se),i=n.success||ve,o=n.error||ve,r=s.find(n.data),r!==t?i(r):(n.success=function(e){s.add(n.data,e),i(e)},e.ajax(n))},update:function(e){return me(this.setup(e,Te))},destroy:function(e){return me(this.setup(e,De))},setup:function(e,t){e=e||{};var n,i=this,o=i.options[t],r=be(o.data)?o.data(e.data):o.data;return e=ce(!0,{},o,e),n=ce(!0,{},r,e.data),e.data=i.parameterMap(n,t),be(e.url)&&(e.url=e.url(n)),e}}),te=ye.extend({init:function(){this._store={}},add:function(e,n){e!==t&&(this._store[He(e)]=n)},find:function(e){return this._store[He(e)]},clear:function(){this._store={}},remove:function(e){delete this._store[He(e)]}}),te.create=function(e){var t={inmemory:function(){return new te}};return ue(e)&&be(e.find)?e:e===!0?new te:t[e]()},ne=ye.extend({init:function(e){var t,n,i,o,r,a,s,l,c,d,u,h,f,p=this;e=e||{};for(t in e)n=e[t],p[t]=typeof n===ke?Le(n):n;o=e.modelBase||$,ue(p.model)&&(p.model=i=o.define(p.model)),r=de(p.data,p),p._dataAccessFunction=r,p.model&&(a=de(p.groups,p),s=de(p.serialize,p),l={},c={},d={},u={},h=!1,i=p.model,i.fields&&(ge(i.fields,function(e,t){var n;f=e,ue(t)&&t.field?f=t.field:typeof t===ke&&(f=t),ue(t)&&t.from&&(n=t.from),h=h||n&&n!==e||f!==e,c[e]=Le(n||f),d[e]=Le(e),l[n||f]=e,u[e]=n||f}),!e.serialize&&h&&(p.serialize=x(s,i,w,d,l,u))),p._dataAccessFunction=r,p.data=x(r,i,y,c,l,u),p.groups=x(a,i,k,c,l,u))},errors:function(e){return e?e.errors:null},parse:Be,data:Be,total:function(e){return e.length},groups:Be,aggregates:function(){return{}},serialize:function(e){return e}}),ie=we.extend({init:function(e){var n,i,o,r=this;e&&(i=e.data),e=r.options=ce({},r.options,e),r._map={},r._prefetch={},r._data=[],r._pristineData=[],r._ranges=[],r._view=[],r._pristineTotal=0,r._destroyed=[],r._pageSize=e.pageSize,r._page=e.page||(e.pageSize?1:t),r._sort=a(e.sort),r._filter=l(e.filter),r._group=p(e.group),r._aggregate=e.aggregate,r._total=e.total,r._shouldDetachObservableParents=!0,we.fn.init.call(r),r.transport=oe.create(e,i,r),be(r.transport.push)&&r.transport.push({pushCreate:de(r._pushCreate,r),pushUpdate:de(r._pushUpdate,r),pushDestroy:de(r._pushDestroy,r)}),null!=e.offlineStorage&&("string"==typeof e.offlineStorage?(o=e.offlineStorage,r._storage={getItem:function(){return JSON.parse(localStorage.getItem(o))},setItem:function(e){localStorage.setItem(o,He(r.reader.serialize(e)))}}):r._storage=e.offlineStorage),r.reader=new _e.data.readers[e.schema.type||"json"](e.schema),n=r.reader.model||{},r._detachObservableParents(),r._data=r._observe(r._data),r._online=!0,r.bind(["push",Re,Ae,Me,Ee,ze,Fe],e)},options:{data:null,schema:{modelBase:$},offlineStorage:null,serverSorting:!1,serverPaging:!1,serverFiltering:!1,serverGrouping:!1,serverAggregates:!1,batch:!1},clone:function(){return this},online:function(n){return n!==t?this._online!=n&&(this._online=n,n)?this.sync():e.Deferred().resolve().promise():this._online},offlineData:function(e){return null==this.options.offlineStorage?null:e!==t?this._storage.setItem(e):this._storage.getItem()||[]},_isServerGrouped:function(){var e=this.group()||[];return this.options.serverGrouping&&e.length},_pushCreate:function(e){this._push(e,"pushCreate")},_pushUpdate:function(e){this._push(e,"pushUpdate")},_pushDestroy:function(e){this._push(e,"pushDestroy")},_push:function(e,t){var n=this._readData(e);n||(n=e),this[t](n)},_flatData:function(e,t){if(e){if(this._isServerGrouped())return S(e);if(!t)for(var n=0;e.length>n;n++)e.at(n)}return e},parent:ve,get:function(e){var t,n,i=this._flatData(this._data);for(t=0,n=i.length;n>t;t++)if(i[t].id==e)return i[t]},getByUid:function(e){var t,n,i=this._flatData(this._data);if(i)for(t=0,n=i.length;n>t;t++)if(i[t].uid==e)return i[t]},indexOf:function(e){return F(this._data,e)},at:function(e){return this._data.at(e)},data:function(e){var n,i=this;if(e===t){if(i._data)for(n=0;i._data.length>n;n++)i._data.at(n);return i._data}i._detachObservableParents(),i._data=this._observe(e),i._pristineData=e.slice(0),i._storeData(),i._ranges=[],i.trigger("reset"),i._addRange(i._data),i._total=i._data.length,i._pristineTotal=i._total,i._process(i._data)},view:function(e){return e===t?this._view:(this._view=this._observeView(e),t)},_observeView:function(e){var t,n=this;return I(e,n._data,n._ranges,n.reader.model||j,n._isServerGrouped()),t=new U(e,n.reader.model),t.parent=function(){return n.parent()},t},flatView:function(){var e=this.group()||[];return e.length?S(this._view):this._view},add:function(e){return this.insert(this._data.length,e)},_createNewModel:function(e){return this.reader.model?new this.reader.model(e):e instanceof j?e:new j(e)},insert:function(e,t){return t||(t=e,e=0),t instanceof $||(t=this._createNewModel(t)),this._isServerGrouped()?this._data.splice(e,0,this._wrapInEmptyGroup(t)):this._data.splice(e,0,t),t},pushCreate:function(e){var t,n,i,o,r,a;fe(e)||(e=[e]),t=[],n=this.options.autoSync,this.options.autoSync=!1;try{for(i=0;e.length>i;i++)o=e[i],r=this.add(o),t.push(r),a=r.toJSON(),this._isServerGrouped()&&(a=this._wrapInEmptyGroup(a)),this._pristineData.push(a)}finally{this.options.autoSync=n}t.length&&this.trigger("push",{type:"create",items:t})},pushUpdate:function(e){var t,n,i,o,r;for(fe(e)||(e=[e]),t=[],n=0;e.length>n;n++)i=e[n],o=this._createNewModel(i),r=this.get(o.id),r?(t.push(r),r.accept(i),r.trigger(Ae),this._updatePristineForModel(r,i)):this.pushCreate(i);t.length&&this.trigger("push",{type:"update",items:t})},pushDestroy:function(e){var t=this._removeItems(e);t.length&&this.trigger("push",{type:"destroy",items:t})},_removeItems:function(e){var t,n,i,o,r,a;fe(e)||(e=[e]),t=[],n=this.options.autoSync,this.options.autoSync=!1;try{for(i=0;e.length>i;i++)o=e[i],r=this._createNewModel(o),a=!1,this._eachItem(this._data,function(e){var n,i;for(n=0;e.length>n;n++)if(i=e.at(n),i.id===r.id){t.push(i),e.splice(n,1),a=!0;break}}),a&&(this._removePristineForModel(r),this._destroyed.pop())}finally{this.options.autoSync=n}return t},remove:function(e){var n,i=this,o=i._isServerGrouped();return this._eachItem(i._data,function(r){return n=R(r,e),n&&o?(n.isNew&&n.isNew()||i._destroyed.push(n),!0):t}),this._removeModelFromRanges(e),this._updateRangesLength(),e},destroyed:function(){return this._destroyed},created:function(){var e,t,n=[],i=this._flatData(this._data);for(e=0,t=i.length;t>e;e++)i[e].isNew&&i[e].isNew()&&n.push(i[e]);return n},updated:function(){var e,t,n=[],i=this._flatData(this._data);for(e=0,t=i.length;t>e;e++)i[e].isNew&&!i[e].isNew()&&i[e].dirty&&n.push(i[e]);return n},sync:function(){var t,n=this,i=[],o=[],r=n._destroyed,a=e.Deferred().resolve().promise();if(n.online()){if(!n.reader.model)return a;i=n.created(),o=n.updated(),t=[],n.options.batch&&n.transport.submit?t=n._sendSubmit(i,o,r):(t.push.apply(t,n._send("create",i)),t.push.apply(t,n._send("update",o)),t.push.apply(t,n._send("destroy",r))),a=e.when.apply(null,t).then(function(){var e,t;for(e=0,t=arguments.length;t>e;e++)n._accept(arguments[e]);n._storeData(!0),n._change({action:"sync"}),n.trigger(Ee)})}else n._storeData(!0),n._change({action:"sync"});return a},cancelChanges:function(e){var t=this;e instanceof _e.data.Model?t._cancelModel(e):(t._destroyed=[],t._detachObservableParents(),t._data=t._observe(t._pristineData),t.options.serverPaging&&(t._total=t._pristineTotal),t._ranges=[],t._addRange(t._data),t._change(),t._markOfflineUpdatesAsDirty())},_markOfflineUpdatesAsDirty:function(){var e=this;null!=e.options.offlineStorage&&e._eachItem(e._data,function(e){var t,n;for(t=0;e.length>t;t++)n=e.at(t),"update"!=n.__state__&&"create"!=n.__state__||(n.dirty=!0)})},hasChanges:function(){var e,t,n=this._flatData(this._data);if(this._destroyed.length)return!0;for(e=0,t=n.length;t>e;e++)if(n[e].isNew&&n[e].isNew()||n[e].dirty)return!0;return!1},_accept:function(t){var n,i=this,o=t.models,r=t.response,a=0,s=i._isServerGrouped(),l=i._pristineData,c=t.type;if(i.trigger(ze,{response:r,type:c}),r&&!he(r)){if(r=i.reader.parse(r),i._handleCustomErrors(r))return;r=i.reader.data(r),fe(r)||(r=[r])}else r=e.map(o,function(e){return e.toJSON()});for("destroy"===c&&(i._destroyed=[]),a=0,n=o.length;n>a;a++)"destroy"!==c?(o[a].accept(r[a]),"create"===c?l.push(s?i._wrapInEmptyGroup(o[a]):r[a]):"update"===c&&i._updatePristineForModel(o[a],r[a])):i._removePristineForModel(o[a])},_updatePristineForModel:function(e,t){this._executeOnPristineForModel(e,function(e,n){_e.deepExtend(n[e],t)})},_executeOnPristineForModel:function(e,n){this._eachPristineItem(function(i){var o=M(i,e);return o>-1?(n(o,i),!0):t})},_removePristineForModel:function(e){this._executeOnPristineForModel(e,function(e,t){t.splice(e,1)})},_readData:function(e){var t=this._isServerGrouped()?this.reader.groups:this.reader.data;return t.call(this.reader,e)},_eachPristineItem:function(e){this._eachItem(this._pristineData,e)},_eachItem:function(e,t){e&&e.length&&(this._isServerGrouped()?D(e,t):t(e))},_pristineForModel:function(e){var n,i,o=function(o){return i=M(o,e),i>-1?(n=o[i],!0):t};return this._eachPristineItem(o),n},_cancelModel:function(e){var t=this._pristineForModel(e);this._eachItem(this._data,function(n){var i=F(n,e);i>=0&&(!t||e.isNew()&&!t.__state__?n.splice(i,1):(n[i].accept(t),"update"==t.__state__&&(n[i].dirty=!0)))})},_submit:function(t,n){var i=this;i.trigger(Me,{type:"submit"}),i.transport.submit(ce({success:function(n,i){var o=e.grep(t,function(e){return e.type==i})[0];o&&o.resolve({response:n,models:o.models,type:i})},error:function(e,n,o){for(var r=0;t.length>r;r++)t[r].reject(e);i.error(e,n,o)}},n))},_sendSubmit:function(t,n,i){var o=this,r=[];return o.options.batch&&(t.length&&r.push(e.Deferred(function(e){e.type="create",e.models=t})),n.length&&r.push(e.Deferred(function(e){e.type="update",e.models=n})),i.length&&r.push(e.Deferred(function(e){e.type="destroy",e.models=i})),o._submit(r,{data:{created:o.reader.serialize(b(t)),updated:o.reader.serialize(b(n)),destroyed:o.reader.serialize(b(i))}})),r},_promise:function(t,n,i){var o=this;return e.Deferred(function(e){o.trigger(Me,{type:i}),o.transport[i].call(o.transport,ce({success:function(t){e.resolve({response:t,models:n,type:i})},error:function(t,n,i){e.reject(t),o.error(t,n,i)}},t))}).promise()},_send:function(e,t){var n,i,o=this,r=[],a=o.reader.serialize(b(t));if(o.options.batch)t.length&&r.push(o._promise({data:{models:a}},t,e));else for(n=0,i=t.length;i>n;n++)r.push(o._promise({data:a[n]},[t[n]],e));return r},read:function(t){var n=this,i=n._params(t),o=e.Deferred();return n._queueRequest(i,function(){var e=n.trigger(Me,{type:"read"});e?(n._dequeueRequest(),o.resolve(e)):(n.trigger(Fe),n._ranges=[],n.trigger("reset"),n.online()?n.transport.read({data:i,success:function(e){n._ranges=[],n.success(e,i),o.resolve()},error:function(){var e=qe.call(arguments);n.error.apply(n,e),o.reject.apply(o,e)}}):null!=n.options.offlineStorage&&(n.success(n.offlineData(),i),o.resolve()))}),o.promise()},_readAggregates:function(e){return this.reader.aggregates(e)},success:function(e){var n,i,o,r,a,s,l,c,d=this,u=d.options;if(d.trigger(ze,{response:e,type:"read"}),d.online()){if(e=d.reader.parse(e),d._handleCustomErrors(e))return d._dequeueRequest(),t;d._total=d.reader.total(e),d._aggregate&&u.serverAggregates&&(d._aggregateResult=d._readAggregates(e)),e=d._readData(e),d._destroyed=[]}else{for(e=d._readData(e),n=[],i={},o=d.reader.model,r=o?o.idField:"id",a=0;this._destroyed.length>a;a++)s=this._destroyed[a][r],i[s]=s;for(a=0;e.length>a;a++)l=e[a],c=l.__state__,"destroy"==c?i[l[r]]||this._destroyed.push(this._createNewModel(l)):n.push(l);e=n,d._total=e.length}d._pristineTotal=d._total,d._pristineData=e.slice(0),d._detachObservableParents(),d._data=d._observe(e),d._markOfflineUpdatesAsDirty(),d._storeData(),d._addRange(d._data),d._process(d._data),d._dequeueRequest()},_detachObservableParents:function(){if(this._data&&this._shouldDetachObservableParents)for(var e=0;this._data.length>e;e++)this._data[e].parent&&(this._data[e].parent=ve)},_storeData:function(e){function t(e){var n,i,o,r=[];for(n=0;e.length>n;n++)i=e.at(n),o=i.toJSON(),a&&i.items?o.items=t(i.items):(o.uid=i.uid,s&&(i.isNew()?o.__state__="create":i.dirty&&(o.__state__="update"))),r.push(o);return r}var n,i,o,r,a=this._isServerGrouped(),s=this.reader.model;if(null!=this.options.offlineStorage){for(n=t(this._data),i=[],o=0;this._destroyed.length>o;o++)r=this._destroyed[o].toJSON(),r.__state__="destroy",i.push(r);this.offlineData(n.concat(i)),e&&(this._pristineData=this._readData(n))}},_addRange:function(e){var t=this,n=t._skip||0,i=n+t._flatData(e,!0).length;t._ranges.push({start:n,end:i,data:e,timestamp:(new Date).getTime()}),t._ranges.sort(function(e,t){return e.start-t.start}); +},error:function(e,t,n){this._dequeueRequest(),this.trigger(ze,{}),this.trigger(Re,{xhr:e,status:t,errorThrown:n})},_params:function(e){var t=this,n=ce({take:t.take(),skip:t.skip(),page:t.page(),pageSize:t.pageSize(),sort:t._sort,filter:t._filter,group:t._group,aggregate:t._aggregate},e);return t.options.serverPaging||(delete n.take,delete n.skip,delete n.page,delete n.pageSize),t.options.serverGrouping?t.reader.model&&n.group&&(n.group=L(n.group,t.reader.model)):delete n.group,t.options.serverFiltering?t.reader.model&&n.filter&&(n.filter=B(n.filter,t.reader.model)):delete n.filter,t.options.serverSorting?t.reader.model&&n.sort&&(n.sort=L(n.sort,t.reader.model)):delete n.sort,t.options.serverAggregates?t.reader.model&&n.aggregate&&(n.aggregate=L(n.aggregate,t.reader.model)):delete n.aggregate,n},_queueRequest:function(e,n){var i=this;i._requestInProgress?i._pending={callback:de(n,i),options:e}:(i._requestInProgress=!0,i._pending=t,n())},_dequeueRequest:function(){var e=this;e._requestInProgress=!1,e._pending&&e._queueRequest(e._pending.options,e._pending.callback)},_handleCustomErrors:function(e){if(this.reader.errors){var t=this.reader.errors(e);if(t)return this.trigger(Re,{xhr:null,status:"customerror",errorThrown:"custom error",errors:t}),!0}return!1},_shouldWrap:function(e){var t=this.reader.model;return t&&e.length?!(e[0]instanceof t):!1},_observe:function(e){var t,n=this,i=n.reader.model;return n._shouldDetachObservableParents=!0,e instanceof Je?(n._shouldDetachObservableParents=!1,n._shouldWrap(e)&&(e.type=n.reader.model,e.wrapAll(e,e))):(t=n.pageSize()&&!n.options.serverPaging?U:Je,e=new t(e,n.reader.model),e.parent=function(){return n.parent()}),n._isServerGrouped()&&T(e,i),n._changeHandler&&n._data&&n._data instanceof Je?n._data.unbind(Ae,n._changeHandler):n._changeHandler=de(n._change,n),e.bind(Ae,n._changeHandler)},_updateTotalForAction:function(e,t){var n=this,i=parseInt(n._total,10);v(n._total)||(i=parseInt(n._pristineTotal,10)),"add"===e?i+=t.length:"remove"===e?i-=t.length:"itemchange"===e||"sync"===e||n.options.serverPaging?"sync"===e&&(i=n._pristineTotal=parseInt(n._total,10)):i=n._pristineTotal,n._total=i},_change:function(e){var t,n,i,o=this,r=e?e.action:"";if("remove"===r)for(t=0,n=e.items.length;n>t;t++)e.items[t].isNew&&e.items[t].isNew()||o._destroyed.push(e.items[t]);!o.options.autoSync||"add"!==r&&"remove"!==r&&"itemchange"!==r?(o._updateTotalForAction(r,e?e.items:[]),o._process(o._data,e)):(i=function(t){"sync"===t.action&&(o.unbind("change",i),o._updateTotalForAction(r,e.items))},o.first("change",i),o.sync())},_calculateAggregates:function(e,t){t=t||{};var n=new r(e),i=t.aggregate,o=t.filter;return o&&(n=n.filter(o)),n.aggregate(i)},_process:function(e,n){var i,o=this,r={};o.options.serverPaging!==!0&&(r.skip=o._skip,r.take=o._take||o._pageSize,r.skip===t&&o._page!==t&&o._pageSize!==t&&(r.skip=(o._page-1)*o._pageSize)),o.options.serverSorting!==!0&&(r.sort=o._sort),o.options.serverFiltering!==!0&&(r.filter=o._filter),o.options.serverGrouping!==!0&&(r.group=o._group),o.options.serverAggregates!==!0&&(r.aggregate=o._aggregate,o._aggregateResult=o._calculateAggregates(e,r)),i=o._queryProcess(e,r),o.view(i.data),i.total===t||o.options.serverFiltering||(o._total=i.total),n=n||{},n.items=n.items||o._view,o.trigger(Ae,n)},_queryProcess:function(e,t){return r.process(e,t)},_mergeState:function(e){var n=this;return e!==t&&(n._pageSize=e.pageSize,n._page=e.page,n._sort=e.sort,n._filter=e.filter,n._group=e.group,n._aggregate=e.aggregate,n._skip=n._currentRangeStart=e.skip,n._take=e.take,n._skip===t&&(n._skip=n._currentRangeStart=n.skip(),e.skip=n.skip()),n._take===t&&n._pageSize!==t&&(n._take=n._pageSize,e.take=n._take),e.sort&&(n._sort=e.sort=a(e.sort)),e.filter&&(n._filter=e.filter=l(e.filter)),e.group&&(n._group=e.group=p(e.group)),e.aggregate&&(n._aggregate=e.aggregate=f(e.aggregate))),e},query:function(n){var i,o,r=this.options.serverSorting||this.options.serverPaging||this.options.serverFiltering||this.options.serverGrouping||this.options.serverAggregates;return r||(this._data===t||0===this._data.length)&&!this._destroyed.length?this.read(this._mergeState(n)):(o=this.trigger(Me,{type:"read"}),o||(this.trigger(Fe),i=this._queryProcess(this._data,this._mergeState(n)),this.options.serverFiltering||(this._total=i.total!==t?i.total:this._data.length),this._aggregateResult=this._calculateAggregates(this._data,n),this.view(i.data),this.trigger(ze,{type:"read"}),this.trigger(Ae,{items:i.data})),e.Deferred().resolve(o).promise())},fetch:function(e){var t=this,n=function(n){n!==!0&&be(e)&&e.call(t)};return this._query().then(n)},_query:function(e){var t=this;return t.query(ce({},{page:t.page(),pageSize:t.pageSize(),sort:t.sort(),filter:t.filter(),group:t.group(),aggregate:t.aggregate()},e))},next:function(e){var n=this,i=n.page(),o=n.total();return e=e||{},!i||o&&i+1>n.totalPages()?t:(n._skip=n._currentRangeStart=i*n.take(),i+=1,e.page=i,n._query(e),i)},prev:function(e){var n=this,i=n.page();return e=e||{},i&&1!==i?(n._skip=n._currentRangeStart=n._skip-n.take(),i-=1,e.page=i,n._query(e),i):t},page:function(e){var n,i=this;return e!==t?(e=Ne.max(Ne.min(Ne.max(e,1),i.totalPages()),1),i._query({page:e}),t):(n=i.skip(),n!==t?Ne.round((n||0)/(i.take()||1))+1:t)},pageSize:function(e){var n=this;return e!==t?(n._query({pageSize:e,page:1}),t):n.take()},sort:function(e){var n=this;return e!==t?(n._query({sort:e}),t):n._sort},filter:function(e){var n=this;return e===t?n._filter:(n.trigger("reset"),n._query({filter:e,page:1}),t)},group:function(e){var n=this;return e!==t?(n._query({group:e}),t):n._group},total:function(){return parseInt(this._total||0,10)},aggregate:function(e){var n=this;return e!==t?(n._query({aggregate:e}),t):n._aggregate},aggregates:function(){var e=this._aggregateResult;return he(e)&&(e=this._emptyAggregates(this.aggregate())),e},_emptyAggregates:function(e){var t,n,i={};if(!he(e))for(t={},fe(e)||(e=[e]),n=0;e.length>n;n++)t[e[n].aggregate]=0,i[e[n].field]=t;return i},_wrapInEmptyGroup:function(e){var t,n,i,o,r=this.group();for(i=r.length-1,o=0;i>=o;i--)n=r[i],t={value:e.get(n.field),field:n.field,items:t?[t]:[e],hasSubgroups:!!t,aggregates:this._emptyAggregates(n.aggregates)};return t},totalPages:function(){var e=this,t=e.pageSize()||e.total();return Ne.ceil((e.total()||0)/t)},inRange:function(e,t){var n=this,i=Ne.min(e+t,n.total());return!n.options.serverPaging&&n._data.length>0?!0:n._findRange(e,i).length>0},lastRange:function(){var e=this._ranges;return e[e.length-1]||{start:0,end:0,data:[]}},firstItemUid:function(){var e=this._ranges;return e.length&&e[0].data.length&&e[0].data[0].uid},enableRequestsInProgress:function(){this._skipRequestsInProgress=!1},_timeStamp:function(){return(new Date).getTime()},range:function(e,n){var i,o,r,a,s,l,c,d;if(this._currentRequestTimeStamp=this._timeStamp(),this._skipRequestsInProgress=!0,e=Ne.min(e||0,this.total()),i=this,o=Ne.max(Ne.floor(e/n),0)*n,r=Ne.min(o+n,i.total()),a=i._findRange(e,Ne.min(e+n,i.total())),a.length){i._pending=t,i._skip=e>i.skip()?Ne.min(r,(i.totalPages()-1)*i.take()):o,i._currentRangeStart=e,i._take=n,s=i.options.serverPaging,l=i.options.serverSorting,c=i.options.serverFiltering,d=i.options.serverAggregates;try{i.options.serverPaging=!0,i._isServerGrouped()||i.group()&&i.group().length||(i.options.serverSorting=!0),i.options.serverFiltering=!0,i.options.serverPaging=!0,i.options.serverAggregates=!0,s&&(i._detachObservableParents(),i._data=a=i._observe(a)),i._process(a)}finally{i.options.serverPaging=s,i.options.serverSorting=l,i.options.serverFiltering=c,i.options.serverAggregates=d}}else n!==t&&(i._rangeExists(o,r)?e>o&&i.prefetch(r,n,function(){i.range(e,n)}):i.prefetch(o,n,function(){e>o&&ro;o++)if(i=_[o],e>=i.start&&i.end>=e){for(f=0,r=o;m>r;r++)if(i=_[r],h=v._flatData(i.data,!0),h.length&&e+f>=i.start&&(c=i.data,d=i.end,y||(g=p(v.group()||[]).concat(a(v.sort()||[])),u=v._queryProcess(i.data,{sort:g,filter:v.filter()}),h=c=u.data,u.total!==t&&(d=u.total)),s=0,e+f>i.start&&(s=e+f-i.start),l=h.length,d>n&&(l-=d-n),f+=l-s,b=v._mergeGroups(b,c,s,l),i.end>=n&&f==n-e))return b;break}return[]},_mergeGroups:function(e,t,n,i){if(this._isServerGrouped()){var o,r=t.toJSON();return e.length&&(o=e[e.length-1]),C(o,r,n,i),e.concat(r)}return e.concat(t.slice(n,i))},skip:function(){var e=this;return e._skip===t?e._page!==t?(e._page-1)*(e.take()||1):t:e._skip},currentRangeStart:function(){return this._currentRangeStart||0},take:function(){return this._take||this._pageSize},_prefetchSuccessHandler:function(e,t,n,i){var o=this,r=o._timeStamp();return function(a){var s,l,c,d=!1,u={start:e,end:t,data:[],timestamp:o._timeStamp()};if(o._dequeueRequest(),o.trigger(ze,{response:a,type:"read"}),a=o.reader.parse(a),c=o._readData(a),c.length){for(s=0,l=o._ranges.length;l>s;s++)if(o._ranges[s].start===e){d=!0,u=o._ranges[s];break}d||o._ranges.push(u)}u.data=o._observe(c),u.end=u.start+o._flatData(u.data,!0).length,o._ranges.sort(function(e,t){return e.start-t.start}),o._total=o.reader.total(a),(i||r>=o._currentRequestTimeStamp||!o._skipRequestsInProgress)&&(n&&c.length?n():o.trigger(Ae,{}))}},prefetch:function(e,t,n){var i=this,o=Ne.min(e+t,i.total()),r={take:t,skip:e,page:e/t+1,pageSize:t,sort:i._sort,filter:i._filter,group:i._group,aggregate:i._aggregate};i._rangeExists(e,o)?n&&n():(clearTimeout(i._timeout),i._timeout=setTimeout(function(){i._queueRequest(r,function(){i.trigger(Me,{type:"read"})?i._dequeueRequest():i.transport.read({data:i._params(r),success:i._prefetchSuccessHandler(e,o,n),error:function(){var e=qe.call(arguments);i.error.apply(i,e)}})})},100))},_multiplePrefetch:function(e,t,n){var i=this,o=Ne.min(e+t,i.total()),r={take:t,skip:e,page:e/t+1,pageSize:t,sort:i._sort,filter:i._filter,group:i._group,aggregate:i._aggregate};i._rangeExists(e,o)?n&&n():i.trigger(Me,{type:"read"})||i.transport.read({data:i._params(r),success:i._prefetchSuccessHandler(e,o,n,!0)})},_rangeExists:function(e,t){var n,i,o=this,r=o._ranges;for(n=0,i=r.length;i>n;n++)if(e>=r[n].start&&r[n].end>=t)return!0;return!1},_removeModelFromRanges:function(e){var t,n,i,o,r;for(o=0,r=this._ranges.length;r>o&&(i=this._ranges[o],this._eachItem(i.data,function(i){t=R(i,e),t&&(n=!0)}),!n);o++);},_updateRangesLength:function(){var e,t,n,i,o=0;for(n=0,i=this._ranges.length;i>n;n++)e=this._ranges[n],e.start=e.start-o,t=this._flatData(e.data,!0).length,o=e.end-t,e.end=e.start+t}}),oe={},oe.create=function(t,n,i){var o,r=t.transport?e.extend({},t.transport):null;return r?(r.read=typeof r.read===ke?{url:r.read}:r.read,"jsdo"===t.type&&(r.dataSource=i),t.type&&(_e.data.transports=_e.data.transports||{},_e.data.schemas=_e.data.schemas||{},_e.data.transports[t.type]?ue(_e.data.transports[t.type])?r=ce(!0,{},_e.data.transports[t.type],r):o=new _e.data.transports[t.type](ce(r,{data:n})):_e.logToConsole("Unknown DataSource transport type '"+t.type+"'.\nVerify that registration scripts for this type are included after Kendo UI on the page.","warn"),t.schema=ce(!0,{},_e.data.schemas[t.type],t.schema)),o||(o=be(r.read)?r:new ee(r))):o=new Z({data:t.data||[]}),o},ie.create=function(e){(fe(e)||e instanceof Je)&&(e={data:e});var n,i,o,r=e||{},a=r.data,s=r.fields,l=r.table,c=r.select,d={};if(a||!s||r.transport||(l?a=N(l,s):c&&(a=H(c,s),r.group===t&&a[0]&&a[0].optgroup!==t&&(r.group="optgroup"))),_e.data.Model&&s&&(!r.schema||!r.schema.model)){for(n=0,i=s.length;i>n;n++)o=s[n],o.type&&(d[o.field]=o);he(d)||(r.schema=ce(!0,r.schema,{model:{fields:d}}))}return r.data=a,c=null,r.select=null,l=null,r.table=null,r instanceof ie?r:new ie(r)},re=$.define({idField:"id",init:function(e){var t=this,n=t.hasChildren||e&&e.hasChildren,i="items",o={};_e.data.Model.fn.init.call(t,e),typeof t.children===ke&&(i=t.children),o={schema:{data:i,model:{hasChildren:n,id:t.idField,fields:t.fields}}},typeof t.children!==ke&&ce(o,t.children),o.data=e,n||(n=o.schema.data),typeof n===ke&&(n=_e.getter(n)),be(n)&&(t.hasChildren=!!n.call(t,t)),t._childrenOptions=o,t.hasChildren&&t._initChildren(),t._loaded=!(!e||!e._loaded)},_initChildren:function(){var e,t,n,i=this;i.children instanceof ae||(e=i.children=new ae(i._childrenOptions),t=e.transport,n=t.parameterMap,t.parameterMap=function(e,t){return e[i.idField||"id"]=i.id,n&&(e=n(e,t)),e},e.parent=function(){return i},e.bind(Ae,function(e){e.node=e.node||i,i.trigger(Ae,e)}),e.bind(Re,function(e){var t=i.parent();t&&(e.node=e.node||i,t.trigger(Re,e))}),i._updateChildrenField())},append:function(e){this._initChildren(),this.loaded(!0),this.children.add(e)},hasChildren:!1,level:function(){for(var e=this.parentNode(),t=0;e&&e.parentNode;)t++,e=e.parentNode?e.parentNode():null;return t},_updateChildrenField:function(){var e=this._childrenOptions.schema.data;this[e||"items"]=this.children.data()},_childrenLoaded:function(){this._loaded=!0,this._updateChildrenField()},load:function(){var n,i,o={},r="_query";return this.hasChildren?(this._initChildren(),n=this.children,o[this.idField||"id"]=this.id,this._loaded||(n._data=t,r="read"),n.one(Ae,de(this._childrenLoaded,this)),i=n[r](o)):this.loaded(!0),i||e.Deferred().resolve().promise()},parentNode:function(){var e=this.parent();return e.parent()},loaded:function(e){return e===t?this._loaded:(this._loaded=e,t)},shouldSerialize:function(e){return $.fn.shouldSerialize.call(this,e)&&"children"!==e&&"_loaded"!==e&&"hasChildren"!==e&&"_childrenOptions"!==e}}),ae=ie.extend({init:function(e){var t=re.define({children:e});ie.fn.init.call(this,ce(!0,{},{schema:{modelBase:t,model:t}},e)),this._attachBubbleHandlers()},_attachBubbleHandlers:function(){var e=this;e._data.bind(Re,function(t){e.trigger(Re,t)})},remove:function(e){var t,n=e.parentNode(),i=this;return n&&n._initChildren&&(i=n.children),t=ie.fn.remove.call(i,e),n&&!i.data().length&&(n.hasChildren=!1),t},success:O("success"),data:O("data"),insert:function(e,t){var n=this.parent();return n&&n._initChildren&&(n.hasChildren=!0,n._initChildren()),ie.fn.insert.call(this,e,t)},_find:function(e,t){var n,i,o,r,a=this._data;if(a){if(o=ie.fn[e].call(this,t))return o;for(a=this._flatData(this._data),n=0,i=a.length;i>n;n++)if(r=a[n].children,r instanceof ae&&(o=r[e](t)))return o}},get:function(e){return this._find("get",e)},getByUid:function(e){return this._find("getByUid",e)}}),ae.create=function(e){e=e&&e.push?{data:e}:e;var t=e||{},n=t.data,i=t.fields,o=t.list;return n&&n._dataSource?n._dataSource:(n||!i||t.transport||o&&(n=V(o,i)),t.data=n,t instanceof ae?t:new ae(t))},se=_e.Observable.extend({init:function(e,t,n){_e.Observable.fn.init.call(this),this._prefetching=!1,this.dataSource=e,this.prefetch=!n;var i=this;e.bind("change",function(){i._change()}),e.bind("reset",function(){i._reset()}),this._syncWithDataSource(),this.setViewSize(t)},setViewSize:function(e){this.viewSize=e,this._recalculate()},at:function(e){var n=this.pageSize,i=!0;return e>=this.total()?(this.trigger("endreached",{index:e}),null):this.useRanges?this.useRanges?((this.dataOffset>e||e>=this.skip+n)&&(i=this.range(Math.floor(e/n)*n)),e===this.prefetchThreshold&&this._prefetch(),e===this.midPageThreshold?this.range(this.nextMidRange,!0):e===this.nextPageThreshold?this.range(this.nextFullRange):e===this.pullBackThreshold&&this.range(this.offset===this.skip?this.previousMidRange:this.previousFullRange),i?this.dataSource.at(e-this.dataOffset):(this.trigger("endreached",{index:e}),null)):t:this.dataSource.view()[e]},indexOf:function(e){return this.dataSource.data().indexOf(e)+this.dataOffset},total:function(){return parseInt(this.dataSource.total(),10)},next:function(){var e=this,t=e.pageSize,n=e.skip-e.viewSize+t,i=Ne.max(Ne.floor(n/t),0)*t;this.offset=n,this.dataSource.prefetch(i,t,function(){e._goToRange(n,!0)})},range:function(e,t){if(this.offset===e)return!0;var n=this,i=this.pageSize,o=Ne.max(Ne.floor(e/i),0)*i,r=this.dataSource;return t&&(o+=i),r.inRange(e,i)?(this.offset=e,this._recalculate(),this._goToRange(e),!0):this.prefetch?(r.prefetch(o,i,function(){n.offset=e,n._recalculate(),n._goToRange(e,!0)}),!1):!0},syncDataSource:function(){var e=this.offset;this.offset=null,this.range(e)},destroy:function(){this.unbind()},_prefetch:function(){var e=this,t=this.pageSize,n=this.skip+t,i=this.dataSource;i.inRange(n,t)||this._prefetching||!this.prefetch||(this._prefetching=!0,this.trigger("prefetching",{skip:n,take:t}),i.prefetch(n,t,function(){e._prefetching=!1,e.trigger("prefetched",{skip:n,take:t})}))},_goToRange:function(e,t){this.offset===e&&(this.dataOffset=e,this._expanding=t,this.dataSource.range(e,this.pageSize),this.dataSource.enableRequestsInProgress())},_reset:function(){this._syncPending=!0},_change:function(){var e=this.dataSource;this.length=this.useRanges?e.lastRange().end:e.view().length,this._syncPending&&(this._syncWithDataSource(),this._recalculate(),this._syncPending=!1,this.trigger("reset",{offset:this.offset})),this.trigger("resize"),this._expanding&&this.trigger("expand"),delete this._expanding},_syncWithDataSource:function(){var e=this.dataSource;this._firstItemUid=e.firstItemUid(),this.dataOffset=this.offset=e.skip()||0,this.pageSize=e.pageSize(),this.useRanges=e.options.serverPaging},_recalculate:function(){var e=this.pageSize,t=this.offset,n=this.viewSize,i=Math.ceil(t/e)*e;this.skip=i,this.midPageThreshold=i+e-1,this.nextPageThreshold=i+n-1,this.prefetchThreshold=i+Math.floor(e/3*2),this.pullBackThreshold=this.offset-1,this.nextMidRange=i+e-n,this.nextFullRange=i,this.previousMidRange=t-n,this.previousFullRange=i-e}}),le=_e.Observable.extend({init:function(e,t){var n=this;_e.Observable.fn.init.call(n),this.dataSource=e,this.batchSize=t,this._total=0,this.buffer=new se(e,3*t),this.buffer.bind({endreached:function(e){n.trigger("endreached",{index:e.index})},prefetching:function(e){n.trigger("prefetching",{skip:e.skip,take:e.take})},prefetched:function(e){n.trigger("prefetched",{skip:e.skip,take:e.take})},reset:function(){n._total=0,n.trigger("reset")},resize:function(){n._total=Math.ceil(this.length/n.batchSize),n.trigger("resize",{total:n.total(),offset:this.offset})}})},syncDataSource:function(){this.buffer.syncDataSource()},at:function(e){var t,n,i=this.buffer,o=e*this.batchSize,r=this.batchSize,a=[];for(i.offset>o&&i.at(i.offset-1),n=0;r>n&&(t=i.at(o+n),null!==t);n++)a.push(t);return a},total:function(){return this._total},destroy:function(){this.buffer.destroy(),this.unbind()}}),ce(!0,_e.data,{readers:{json:ne},Query:r,DataSource:ie,HierarchicalDataSource:ae,Node:re,ObservableObject:j,ObservableArray:Je,LazyObservableArray:U,LocalTransport:Z,RemoteTransport:ee,Cache:te,DataReader:ne,Model:$,Buffer:se,BatchBuffer:le})}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.binder.min",["kendo.core.min","kendo.data.min"],e)}(function(){return function(e,t){function n(t,n,i){return v.extend({init:function(e,t,n){var i=this;v.fn.init.call(i,e.element[0],t,n),i.widget=e,i._dataBinding=R(i.dataBinding,i),i._dataBound=R(i.dataBound,i),i._itemChange=R(i.itemChange,i)},itemChange:function(e){a(e.item[0],e.data,this._ns(e.ns),[e.data].concat(this.bindings[t]._parents()))},dataBinding:function(e){var t,n,i=this.widget,o=e.removedItems||i.items();for(t=0,n=o.length;n>t;t++)c(o[t],!1)},_ns:function(t){t=t||C.ui;var n=[C.ui,C.dataviz.ui,C.mobile.ui];return n.splice(e.inArray(t,n),1),n.unshift(t),C.rolesFromNamespaces(n)},dataBound:function(e){var i,o,r,s,l=this.widget,c=e.addedItems||l.items(),d=l[n],u=C.data.HierarchicalDataSource;if(!(u&&d instanceof u)&&c.length)for(r=e.addedDataItems||d.flatView(),s=this.bindings[t]._parents(),i=0,o=r.length;o>i;i++)a(c[i],r[i],this._ns(e.ns),[r[i]].concat(s))},refresh:function(e){var o,r,a,s=this,l=s.widget;e=e||{},e.action||(s.destroy(),l.bind("dataBinding",s._dataBinding),l.bind("dataBound",s._dataBound),l.bind("itemChange",s._itemChange),o=s.bindings[t].get(),l[n]instanceof C.data.DataSource&&l[n]!=o&&(o instanceof C.data.DataSource?l[i](o):o&&o._dataSource?l[i](o._dataSource):(l[n].data(o),r=C.ui.Select&&l instanceof C.ui.Select,a=C.ui.MultiSelect&&l instanceof C.ui.MultiSelect,s.bindings.value&&(r||a)&&l.value(f(s.bindings.value.get(),l.options.dataValueField)))))},destroy:function(){var e=this.widget;e.unbind("dataBinding",this._dataBinding),e.unbind("dataBound",this._dataBound),e.unbind("itemChange",this._itemChange)}})}function i(e,n){var i=C.initWidget(e,{},n);return i?new y(i):t}function o(e){var t,n,i,r,a,s,l,c={};for(l=e.match(k),t=0,n=l.length;n>t;t++)i=l[t],r=i.indexOf(":"),a=i.substring(0,r),s=i.substring(r+1),"{"==s.charAt(0)&&(s=o(s)),c[a]=s;return c}function r(e,t,n){var i,o={};for(i in e)o[i]=new n(t,e[i]);return o}function a(e,t,n,s){var c,d,u,h,f=e.getAttribute("data-"+C.ns+"role"),v=e.getAttribute("data-"+C.ns+"bind"),_=[],b=!0,y={};if(s=s||[t],(f||v)&&l(e,!1),f&&(u=i(e,n)),v&&(v=o(v.replace(x,"")),u||(y=C.parseOptions(e,{textField:"",valueField:"",template:"",valueUpdate:N,valuePrimitive:!1,autoBind:!0}),y.roles=n,u=new w(e,y)),u.source=t,d=r(v,s,p),y.template&&(d.template=new g(s,"",y.template)),d.click&&(v.events=v.events||{},v.events.click=v.click,d.click.destroy(),delete d.click),d.source&&(b=!1),v.attr&&(d.attr=r(v.attr,s,p)),v.style&&(d.style=r(v.style,s,p)),v.events&&(d.events=r(v.events,s,m)),v.css&&(d.css=r(v.css,s,p)),u.bind(d)),u&&(e.kendoBindingTarget=u),h=e.children,b&&h){for(c=0;h.length>c;c++)_[c]=h[c];for(c=0;_.length>c;c++)a(_[c],t,n,s)}}function s(t,n){var i,o,r,s=C.rolesFromNamespaces([].slice.call(arguments,2));for(n=C.observable(n),t=e(t),i=0,o=t.length;o>i;i++)r=t[i],1===r.nodeType&&a(r,n,s)}function l(t,n){var i,o=t.kendoBindingTarget;o&&(o.destroy(),L?delete t.kendoBindingTarget:t.removeAttribute?t.removeAttribute("kendoBindingTarget"):t.kendoBindingTarget=null),n&&(i=C.widgetInstance(e(t)),i&&typeof i.destroy===H&&i.destroy())}function c(e,t){l(e,t),d(e,t)}function d(e,t){var n,i,o=e.children;if(o)for(n=0,i=o.length;i>n;n++)c(o[n],t)}function u(t){var n,i;for(t=e(t),n=0,i=t.length;i>n;n++)c(t[n],!1)}function h(e,t){var n=e.element,i=n[0].kendoBindingTarget;i&&s(n,i.source,t)}function f(e,t){var n,i,o=[],r=0;if(!t)return e;if(e instanceof D){for(n=e.length;n>r;r++)i=e[r],o[r]=i.get?i.get(t):i[t];e=o}else e instanceof T&&(e=e.get(t));return e}var p,m,g,v,_,b,w,y,k,x,C=window.kendo,S=C.Observable,T=C.data.ObservableObject,D=C.data.ObservableArray,A={}.toString,E={},I=C.Class,R=e.proxy,M="value",F="source",z="events",P="checked",B="css",L=!0,H="function",N="change";!function(){var e=document.createElement("a");try{delete e.test}catch(t){L=!1}}(),p=S.extend({init:function(e,t){var n=this;S.fn.init.call(n),n.source=e[0],n.parents=e,n.path=t,n.dependencies={},n.dependencies[t]=!0,n.observable=n.source instanceof S,n._access=function(e){n.dependencies[e.field]=!0},n.observable&&(n._change=function(e){n.change(e)},n.source.bind(N,n._change))},_parents:function(){var t,n=this.parents,i=this.get();return i&&"function"==typeof i.parent&&(t=i.parent(),e.inArray(t,n)<0&&(n=[t].concat(n))),n},change:function(e){var t,n,i=e.field,o=this;if("this"===o.path)o.trigger(N,e);else for(t in o.dependencies)if(0===t.indexOf(i)&&(n=t.charAt(i.length),!n||"."===n||"["===n)){o.trigger(N,e);break}},start:function(e){e.bind("get",this._access)},stop:function(e){e.unbind("get",this._access)},get:function(){var e=this,n=e.source,i=0,o=e.path,r=n;if(!e.observable)return r;for(e.start(e.source),r=n.get(o);r===t&&n;)n=e.parents[++i],n instanceof T&&(r=n.get(o));if(r===t)for(n=e.source;r===t&&n;)n=n.parent(),n instanceof T&&(r=n.get(o));return"function"==typeof r&&(i=o.lastIndexOf("."),i>0&&(n=n.get(o.substring(0,i))),e.start(n),r=n!==e.source?r.call(n,e.source):r.call(n),e.stop(n)),n&&n!==e.source&&(e.currentSource=n,n.unbind(N,e._change).bind(N,e._change)),e.stop(e.source),r},set:function(e){var t=this.currentSource||this.source,n=C.getter(this.path)(t);"function"==typeof n?t!==this.source?n.call(t,this.source,e):n.call(t,e):t.set(this.path,e)},destroy:function(){this.observable&&(this.source.unbind(N,this._change),this.currentSource&&this.currentSource.unbind(N,this._change)),this.unbind()}}),m=p.extend({get:function(){var e,t=this.source,n=this.path,i=0;for(e=t.get(n);!e&&t;)t=this.parents[++i],t instanceof T&&(e=t.get(n));return R(e,t)}}),g=p.extend({init:function(e,t,n){var i=this;p.fn.init.call(i,e,t),i.template=n},render:function(e){var t;return this.start(this.source),t=C.render(this.template,e),this.stop(this.source),t}}),v=I.extend({init:function(e,t,n){this.element=e,this.bindings=t,this.options=n},bind:function(e,t){var n=this;e=t?e[t]:e,e.bind(N,function(e){n.refresh(t||e)}),n.refresh(t)},destroy:function(){}}),_=v.extend({dataType:function(){var e=this.element.getAttribute("data-type")||this.element.type||"text";return e.toLowerCase()},parsedValue:function(){return this._parseValue(this.element.value,this.dataType())},_parseValue:function(e,t){return"date"==t?e=C.parseDate(e,"yyyy-MM-dd"):"datetime-local"==t?e=C.parseDate(e,["yyyy-MM-ddTHH:mm:ss","yyyy-MM-ddTHH:mm"]):"number"==t?e=C.parseFloat(e):"boolean"==t&&(e=e.toLowerCase(),e=null!==C.parseFloat(e)?!!C.parseFloat(e):"true"===e.toLowerCase()),e}}),E.attr=v.extend({refresh:function(e){this.element.setAttribute(e,this.bindings.attr[e].get())}}),E.css=v.extend({init:function(e,t,n){v.fn.init.call(this,e,t,n),this.classes={}},refresh:function(t){var n=e(this.element),i=this.bindings.css[t],o=this.classes[t]=i.get();o?n.addClass(t):n.removeClass(t)}}),E.style=v.extend({refresh:function(e){this.element.style[e]=this.bindings.style[e].get()||""}}),E.enabled=v.extend({refresh:function(){this.bindings.enabled.get()?this.element.removeAttribute("disabled"):this.element.setAttribute("disabled","disabled")}}),E.readonly=v.extend({refresh:function(){this.bindings.readonly.get()?this.element.setAttribute("readonly","readonly"):this.element.removeAttribute("readonly")}}),E.disabled=v.extend({refresh:function(){this.bindings.disabled.get()?this.element.setAttribute("disabled","disabled"):this.element.removeAttribute("disabled")}}),E.events=v.extend({init:function(e,t,n){v.fn.init.call(this,e,t,n),this.handlers={}},refresh:function(t){var n=e(this.element),i=this.bindings.events[t],o=this.handlers[t];o&&n.off(t,o),o=this.handlers[t]=i.get(),n.on(t,i.source,o)},destroy:function(){var t,n=e(this.element);for(t in this.handlers)n.off(t,this.handlers[t])}}),E.text=v.extend({refresh:function(){var t=this.bindings.text.get(),n=this.element.getAttribute("data-format")||"";null==t&&(t=""),e(this.element).text(C.toString(t,n))}}),E.visible=v.extend({refresh:function(){this.element.style.display=this.bindings.visible.get()?"":"none"}}),E.invisible=v.extend({refresh:function(){this.element.style.display=this.bindings.invisible.get()?"none":""}}),E.html=v.extend({refresh:function(){this.element.innerHTML=this.bindings.html.get()}}),E.value=_.extend({init:function(t,n,i){_.fn.init.call(this,t,n,i),this._change=R(this.change,this),this.eventName=i.valueUpdate||N,e(this.element).on(this.eventName,this._change),this._initChange=!1},change:function(){this._initChange=this.eventName!=N,this.bindings[M].set(this.parsedValue()),this._initChange=!1},refresh:function(){var e,t;this._initChange||(e=this.bindings[M].get(),null==e&&(e=""),t=this.dataType(),"date"==t?e=C.toString(e,"yyyy-MM-dd"):"datetime-local"==t&&(e=C.toString(e,"yyyy-MM-ddTHH:mm:ss")),this.element.value=e),this._initChange=!1},destroy:function(){e(this.element).off(this.eventName,this._change)}}),E.source=v.extend({init:function(e,t,n){v.fn.init.call(this,e,t,n);var i=this.bindings.source.get();i instanceof C.data.DataSource&&n.autoBind!==!1&&i.fetch()},refresh:function(e){var t=this,n=t.bindings.source.get();n instanceof D||n instanceof C.data.DataSource?(e=e||{},"add"==e.action?t.add(e.index,e.items):"remove"==e.action?t.remove(e.index,e.items):"itemchange"!=e.action&&t.render()):t.render()},container:function(){var e=this.element;return"table"==e.nodeName.toLowerCase()&&(e.tBodies[0]||e.appendChild(document.createElement("tbody")),e=e.tBodies[0]),e},template:function(){var e=this.options,t=e.template,n=this.container().nodeName.toLowerCase();return t||(t="select"==n?e.valueField||e.textField?C.format('',e.valueField||e.textField,e.textField||e.valueField):"":"tbody"==n?"#:data#":"ul"==n||"ol"==n?"
      • #:data#
      • ":"#:data#",t=C.template(t)),t},add:function(t,n){var i,o,r,s,l=this.container(),c=l.cloneNode(!1),d=l.children[t];if(e(c).html(C.render(this.template(),n)),c.children.length)for(i=this.bindings.source._parents(),o=0,r=n.length;r>o;o++)s=c.children[0],l.insertBefore(s,d||null),a(s,n[o],this.options.roles,[n[o]].concat(i))},remove:function(e,t){var n,i,o=this.container();for(n=0;t.length>n;n++)i=o.children[e],c(i,!0),i.parentNode==o&&o.removeChild(i)},render:function(){var t,n,i,o=this.bindings.source.get(),r=this.container(),s=this.template();if(null!=o)if(o instanceof C.data.DataSource&&(o=o.view()),o instanceof D||"[object Array]"===A.call(o)||(o=[o]),this.bindings.template){if(d(r,!0),e(r).html(this.bindings.template.render(o)),r.children.length)for(t=this.bindings.source._parents(),n=0,i=o.length;i>n;n++)a(r.children[n],o[n],this.options.roles,[o[n]].concat(t))}else e(r).html(C.render(s,o))}}),E.input={checked:_.extend({init:function(t,n,i){_.fn.init.call(this,t,n,i),this._change=R(this.change,this),e(this.element).change(this._change)},change:function(){var e,t,n,i=this.element,o=this.value();if("radio"==i.type)o=this.parsedValue(),this.bindings[P].set(o);else if("checkbox"==i.type)if(e=this.bindings[P].get(),e instanceof D){if(o=this.parsedValue(),o instanceof Date){for(n=0;e.length>n;n++)if(e[n]instanceof Date&&+e[n]===+o){t=n;break}}else t=e.indexOf(o);t>-1?e.splice(t,1):e.push(o)}else this.bindings[P].set(o)},refresh:function(){var e,t,n=this.bindings[P].get(),i=n,o=this.dataType(),r=this.element;if("checkbox"==r.type)if(i instanceof D){if(e=-1,n=this.parsedValue(),n instanceof Date){for(t=0;i.length>t;t++)if(i[t]instanceof Date&&+i[t]===+n){e=t;break}}else e=i.indexOf(n);r.checked=e>=0}else r.checked=i;else"radio"==r.type&&null!=n&&("date"==o?n=C.toString(n,"yyyy-MM-dd"):"datetime-local"==o&&(n=C.toString(n,"yyyy-MM-ddTHH:mm:ss")),r.checked=r.value===""+n)},value:function(){var e=this.element,t=e.value;return"checkbox"==e.type&&(t=e.checked),t},destroy:function(){e(this.element).off(N,this._change)}})},E.select={source:E.source.extend({refresh:function(n){var i,o=this,r=o.bindings.source.get();r instanceof D||r instanceof C.data.DataSource?(n=n||{},"add"==n.action?o.add(n.index,n.items):"remove"==n.action?o.remove(n.index,n.items):"itemchange"!=n.action&&n.action!==t||(o.render(),o.bindings.value&&o.bindings.value&&(i=f(o.bindings.value.get(),e(o.element).data("valueField")),null===i?o.element.selectedIndex=-1:o.element.value=i))):o.render()}}),value:_.extend({init:function(t,n,i){_.fn.init.call(this,t,n,i),this._change=R(this.change,this),e(this.element).change(this._change)},parsedValue:function(){var e,t,n,i,o=this.dataType(),r=[];for(n=0,i=this.element.options.length;i>n;n++)t=this.element.options[n],t.selected&&(e=t.attributes.value,e=e&&e.specified?t.value:t.text,r.push(this._parseValue(e,o)));return r},change:function(){var e,n,i,o,r,a,s,l,c=[],d=this.element,u=this.options.valueField||this.options.textField,h=this.options.valuePrimitive;for(r=0,a=d.options.length;a>r;r++)n=d.options[r],n.selected&&(o=n.attributes.value,o=o&&o.specified?n.value:n.text,c.push(u?o:this._parseValue(o,this.dataType())));if(u)for(e=this.bindings.source.get(),e instanceof C.data.DataSource&&(e=e.view()),i=0;c.length>i;i++)for(r=0,a=e.length;a>r;r++)if(s=e[r].get(u),l=s+""===c[i]){ +c[i]=e[r];break}o=this.bindings[M].get(),o instanceof D?o.splice.apply(o,[0,o.length].concat(c)):this.bindings[M].set(h||!(o instanceof T||null===o||o===t)&&u?c[0].get(u):c[0])},refresh:function(){var e,t,n,i=this.element,o=i.options,r=this.bindings[M].get(),a=r,s=this.options.valueField||this.options.textField,l=!1,c=this.dataType();for(a instanceof D||(a=new D([r])),i.selectedIndex=-1,n=0;a.length>n;n++)for(r=a[n],s&&r instanceof T&&(r=r.get(s)),"date"==c?r=C.toString(a[n],"yyyy-MM-dd"):"datetime-local"==c&&(r=C.toString(a[n],"yyyy-MM-ddTHH:mm:ss")),e=0;o.length>e;e++)t=o[e].value,""===t&&""!==r&&(t=o[e].text),null!=r&&t==""+r&&(o[e].selected=!0,l=!0)},destroy:function(){e(this.element).off(N,this._change)}})},E.widget={events:v.extend({init:function(e,t,n){v.fn.init.call(this,e.element[0],t,n),this.widget=e,this.handlers={}},refresh:function(e){var t=this.bindings.events[e],n=this.handlers[e];n&&this.widget.unbind(e,n),n=t.get(),this.handlers[e]=function(e){e.data=t.source,n(e),e.data===t.source&&delete e.data},this.widget.bind(e,this.handlers[e])},destroy:function(){var e;for(e in this.handlers)this.widget.unbind(e,this.handlers[e])}}),checked:v.extend({init:function(e,t,n){v.fn.init.call(this,e.element[0],t,n),this.widget=e,this._change=R(this.change,this),this.widget.bind(N,this._change)},change:function(){this.bindings[P].set(this.value())},refresh:function(){this.widget.check(this.bindings[P].get()===!0)},value:function(){var e=this.element,t=e.value;return"on"!=t&&"off"!=t||(t=e.checked),t},destroy:function(){this.widget.unbind(N,this._change)}}),visible:v.extend({init:function(e,t,n){v.fn.init.call(this,e.element[0],t,n),this.widget=e},refresh:function(){var e=this.bindings.visible.get();this.widget.wrapper[0].style.display=e?"":"none"}}),invisible:v.extend({init:function(e,t,n){v.fn.init.call(this,e.element[0],t,n),this.widget=e},refresh:function(){var e=this.bindings.invisible.get();this.widget.wrapper[0].style.display=e?"none":""}}),enabled:v.extend({init:function(e,t,n){v.fn.init.call(this,e.element[0],t,n),this.widget=e},refresh:function(){this.widget.enable&&this.widget.enable(this.bindings.enabled.get())}}),disabled:v.extend({init:function(e,t,n){v.fn.init.call(this,e.element[0],t,n),this.widget=e},refresh:function(){this.widget.enable&&this.widget.enable(!this.bindings.disabled.get())}}),source:n("source","dataSource","setDataSource"),value:v.extend({init:function(t,n,i){v.fn.init.call(this,t.element[0],n,i),this.widget=t,this._change=e.proxy(this.change,this),this.widget.first(N,this._change);var o=this.bindings.value.get();this._valueIsObservableObject=!i.valuePrimitive&&(null==o||o instanceof T),this._valueIsObservableArray=o instanceof D,this._initChange=!1},_source:function(){var e;return this.widget.dataItem&&(e=this.widget.dataItem(),e&&e instanceof T)?[e]:(this.bindings.source&&(e=this.bindings.source.get()),(!e||e instanceof C.data.DataSource)&&(e=this.widget.dataSource.flatView()),e)},change:function(){var e,t,n,i,o,r,a,s=this.widget.value(),l=this.options.dataValueField||this.options.dataTextField,c="[object Array]"===A.call(s),d=this._valueIsObservableObject,u=[];if(this._initChange=!0,l)if(""===s&&(d||this.options.valuePrimitive))s=null;else{for(a=this._source(),c&&(t=s.length,u=s.slice(0)),o=0,r=a.length;r>o;o++)if(n=a[o],i=n.get(l),c){for(e=0;t>e;e++)if(i==u[e]){u[e]=n;break}}else if(i==s){s=d?n:i;break}u[0]&&(s=this._valueIsObservableArray?u:d||!l?u[0]:u[0].get(l))}this.bindings.value.set(s),this._initChange=!1},refresh:function(){var e,n,i,o,r,a,s,l,c;if(!this._initChange){if(e=this.widget,n=e.options,i=n.dataTextField,o=n.dataValueField||i,r=this.bindings.value.get(),a=n.text||"",s=0,c=[],r===t&&(r=null),o)if(r instanceof D){for(l=r.length;l>s;s++)c[s]=r[s].get(o);r=c}else r instanceof T&&(a=r.get(i),r=r.get(o));n.autoBind!==!1||n.cascadeFrom||!e.listView||e.listView.bound()?e.value(r):(i!==o||a||(a=r),a||!r&&0!==r||!n.valuePrimitive?e._preselect(r,a):e.value(r))}this._initChange=!1},destroy:function(){this.widget.unbind(N,this._change)}}),gantt:{dependencies:n("dependencies","dependencies","setDependenciesDataSource")},multiselect:{value:v.extend({init:function(t,n,i){v.fn.init.call(this,t.element[0],n,i),this.widget=t,this._change=e.proxy(this.change,this),this.widget.first(N,this._change),this._initChange=!1},change:function(){var e,n,i,o,r,a,s,l,c,d=this,u=d.bindings[M].get(),h=d.options.valuePrimitive,f=h?d.widget.value():d.widget.dataItems(),p=this.options.dataValueField||this.options.dataTextField;if(f=f.slice(0),d._initChange=!0,u instanceof D){for(e=[],n=f.length,i=0,o=0,r=u[i],a=!1;r!==t;){for(c=!1,o=0;n>o;o++)if(h?a=f[o]==r:(l=f[o],l=l.get?l.get(p):l,a=l==(r.get?r.get(p):r)),a){f.splice(o,1),n-=1,c=!0;break}c?i+=1:(e.push(r),b(u,i,1),s=i),r=u[i]}b(u,u.length,0,f),e.length&&u.trigger("change",{action:"remove",items:e,index:s}),f.length&&u.trigger("change",{action:"add",items:f,index:u.length-1})}else d.bindings[M].set(f);d._initChange=!1},refresh:function(){if(!this._initChange){var e,n,i=this.options,o=this.widget,r=i.dataValueField||i.dataTextField,a=this.bindings.value.get(),s=a,l=0,c=[];if(a===t&&(a=null),r)if(a instanceof D){for(e=a.length;e>l;l++)n=a[l],c[l]=n.get?n.get(r):n;a=c}else a instanceof T&&(a=a.get(r));i.autoBind!==!1||i.valuePrimitive===!0||o._isBound()?o.value(a):o._preselect(s,a)}},destroy:function(){this.widget.unbind(N,this._change)}})},scheduler:{source:n("source","dataSource","setDataSource").extend({dataBound:function(e){var t,n,i,o,r=this.widget,s=e.addedItems||r.items();if(s.length)for(i=e.addedDataItems||r.dataItems(),o=this.bindings.source._parents(),t=0,n=i.length;n>t;t++)a(s[t],i[t],this._ns(e.ns),[i[t]].concat(o))}})}},b=function(e,t,n,i){var o,r,a,s,l;if(i=i||[],n=n||0,o=i.length,r=e.length,a=[].slice.call(e,t+n),s=a.length,o){for(o=t+o,l=0;o>t;t++)e[t]=i[l],l++;e.length=o}else if(n)for(e.length=t,n+=t;n>t;)delete e[--n];if(s){for(s=t+s,l=0;s>t;t++)e[t]=a[l],l++;e.length=s}for(t=e.length;r>t;)delete e[t],t++},w=I.extend({init:function(e,t){this.target=e,this.options=t,this.toDestroy=[]},bind:function(e){var t,n,i,o,r,a,s=this instanceof y,l=this.binders();for(t in e)t==M?n=!0:t==F?i=!0:t!=z||s?t==P?r=!0:t==B?a=!0:this.applyBinding(t,e,l):o=!0;i&&this.applyBinding(F,e,l),n&&this.applyBinding(M,e,l),r&&this.applyBinding(P,e,l),o&&!s&&this.applyBinding(z,e,l),a&&!s&&this.applyBinding(B,e,l)},binders:function(){return E[this.target.nodeName.toLowerCase()]||{}},applyBinding:function(e,t,n){var i,o=n[e]||E[e],r=this.toDestroy,a=t[e];if(o)if(o=new o(this.target,t,this.options),r.push(o),a instanceof p)o.bind(a),r.push(a);else for(i in a)o.bind(a,i),r.push(a[i]);else if("template"!==e)throw Error("The "+e+" binding is not supported by the "+this.target.nodeName.toLowerCase()+" element")},destroy:function(){var e,t,n=this.toDestroy;for(e=0,t=n.length;t>e;e++)n[e].destroy()}}),y=w.extend({binders:function(){return E.widget[this.target.options.name.toLowerCase()]||{}},applyBinding:function(e,t,n){var i,o=n[e]||E.widget[e],r=this.toDestroy,a=t[e];if(!o)throw Error("The "+e+" binding is not supported by the "+this.target.options.name+" widget");if(o=new o(this.target,t,this.target.options),r.push(o),a instanceof p)o.bind(a),r.push(a);else for(i in a)o.bind(a,i),r.push(a[i])}}),k=/[A-Za-z0-9_\-]+:(\{([^}]*)\}|[^,}]+)/g,x=/\s/g,C.unbind=u,C.bind=s,C.data.binders=E,C.data.Binder=v,C.notify=h,C.observable=function(e){return e instanceof T||(e=new T(e)),e},C.observableHierarchy=function(e){function t(e){var n,i;for(n=0;e.length>n;n++)e[n]._initChildren(),i=e[n].children,i.fetch(),e[n].items=i.data(),t(e[n].items)}var n=C.data.HierarchicalDataSource.create(e);return n.fetch(),t(n.data()),n._data._dataSource=n,n._data}}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.fx.min",["kendo.core.min"],e)}(function(){return function(e,t){function n(e){return parseInt(e,10)}function i(e,t){return n(e.css(t))}function o(e){var t,n=[];for(t in e)n.push(t);return n}function r(e){for(var t in e)-1!=W.indexOf(t)&&-1==U.indexOf(t)&&delete e[t];return e}function a(e,t){var n,i,o,r,a=[],s={};for(i in t)n=i.toLowerCase(),r=R&&-1!=W.indexOf(n),!E.hasHW3D&&r&&-1==U.indexOf(n)?delete t[i]:(o=t[i],r?a.push(i+"("+o+")"):s[i]=o);return a.length&&(s[se]=a.join(" ")),s}function s(e,t){var i,o,r;return R?(i=e.css(se),i==K?"scale"==t?1:0:(o=i.match(RegExp(t+"\\s*\\(([\\d\\w\\.]+)")),r=0,o?r=n(o[1]):(o=i.match(B)||[0,0,0,0,0],t=t.toLowerCase(),H.test(t)?r=parseFloat(o[3]/o[2]):"translatey"==t?r=parseFloat(o[4]/o[2]):"scale"==t?r=parseFloat(o[2]):"rotate"==t&&(r=parseFloat(Math.atan2(o[2],o[1])))),r)):parseFloat(e.css(t))}function l(e){return e.charAt(0).toUpperCase()+e.substring(1)}function c(e,t){var n=p.extend(t),i=n.prototype.directions;S[l(e)]=n,S.Element.prototype[e]=function(e,t,i,o){return new n(this.element,e,t,i,o)},T(i,function(t,i){S.Element.prototype[e+l(i)]=function(e,t,o){return new n(this.element,i,e,t,o)}})}function d(e,n,i,o){c(e,{directions:g,startValue:function(e){return this._startValue=e,this},endValue:function(e){return this._endValue=e,this},shouldHide:function(){return this._shouldHide},prepare:function(e,r){var a,s,l=this,c="out"===this._direction,d=l.element.data(n),u=!(isNaN(d)||d==i);a=u?d:t!==this._startValue?this._startValue:c?i:o,s=t!==this._endValue?this._endValue:c?o:i,this._reverse?(e[n]=s,r[n]=a):(e[n]=a,r[n]=s),l._shouldHide=r[n]===o}})}function u(e,t){var n=C.directions[t].vertical,i=e[n?J:X]()/2+"px";return _[t].replace("$size",i)}var h,f,p,m,g,v,_,b,w,y,k,x,C=window.kendo,S=C.effects,T=e.each,D=e.extend,A=e.proxy,E=C.support,I=E.browser,R=E.transforms,M=E.transitions,F={scale:0,scalex:0,scaley:0,scale3d:0},z={translate:0,translatex:0,translatey:0,translate3d:0},P=t!==document.documentElement.style.zoom&&!R,B=/matrix3?d?\s*\(.*,\s*([\d\.\-]+)\w*?,\s*([\d\.\-]+)\w*?,\s*([\d\.\-]+)\w*?,\s*([\d\.\-]+)\w*?/i,L=/^(-?[\d\.\-]+)?[\w\s]*,?\s*(-?[\d\.\-]+)?[\w\s]*/i,H=/translatex?$/i,N=/(zoom|fade|expand)(\w+)/,O=/(zoom|fade|expand)/,V=/[xy]$/i,W=["perspective","rotate","rotatex","rotatey","rotatez","rotate3d","scale","scalex","scaley","scalez","scale3d","skew","skewx","skewy","translate","translatex","translatey","translatez","translate3d","matrix","matrix3d"],U=["rotate","scale","scalex","scaley","skew","skewx","skewy","translate","translatex","translatey","matrix"],j={rotate:"deg",scale:"",skew:"px",translate:"px"},q=R.css,G=Math.round,$="",Y="px",K="none",Q="auto",X="width",J="height",Z="hidden",ee="origin",te="abortId",ne="overflow",ie="translate",oe="position",re="completeCallback",ae=q+"transition",se=q+"transform",le=q+"backface-visibility",ce=q+"perspective",de="1500px",ue="perspective("+de+")",he={left:{reverse:"right",property:"left",transition:"translatex",vertical:!1,modifier:-1},right:{reverse:"left",property:"left",transition:"translatex",vertical:!1,modifier:1},down:{reverse:"up",property:"top",transition:"translatey",vertical:!0,modifier:1},up:{reverse:"down",property:"top",transition:"translatey",vertical:!0,modifier:-1},top:{reverse:"bottom"},bottom:{reverse:"top"},"in":{reverse:"out",modifier:-1},out:{reverse:"in",modifier:1},vertical:{reverse:"vertical"},horizontal:{reverse:"horizontal"}};C.directions=he,D(e.fn,{kendoStop:function(e,t){return M?S.stopQueue(this,e||!1,t||!1):this.stop(e,t)}}),R&&!M&&(T(U,function(n,i){e.fn[i]=function(n){if(t===n)return s(this,i);var o=e(this)[0],r=i+"("+n+j[i.replace(V,"")]+")";return-1==o.style.cssText.indexOf(se)?e(this).css(se,r):o.style.cssText=o.style.cssText.replace(RegExp(i+"\\(.*?\\)","i"),r),this},e.fx.step[i]=function(t){e(t.elem)[i](t.now)}}),h=e.fx.prototype.cur,e.fx.prototype.cur=function(){return-1!=U.indexOf(this.prop)?parseFloat(e(this.elem)[this.prop]()):h.apply(this,arguments)}),C.toggleClass=function(e,t,n,i){return t&&(t=t.split(" "),M&&(n=D({exclusive:"all",duration:400,ease:"ease-out"},n),e.css(ae,n.exclusive+" "+n.duration+"ms "+n.ease),setTimeout(function(){e.css(ae,"").css(J)},n.duration)),T(t,function(t,n){e.toggleClass(n,i)})),e},C.parseEffects=function(e,t){var n={};return"string"==typeof e?T(e.split(" "),function(e,i){var o=!O.test(i),r=i.replace(N,function(e,t,n){return t+":"+n.toLowerCase()}),a=r.split(":"),s=a[1],l={};a.length>1&&(l.direction=t&&o?he[s].reverse:s),n[a[0]]=l}):T(e,function(e){var i=this.direction;i&&t&&!O.test(e)&&(this.direction=he[i].reverse),n[e]=this}),n},M&&D(S,{transition:function(t,n,i){var r,s,l,c,d=0,u=t.data("keys")||[];i=D({duration:200,ease:"ease-out",complete:null,exclusive:"all"},i),l=!1,c=function(){l||(l=!0,s&&(clearTimeout(s),s=null),t.removeData(te).dequeue().css(ae,"").css(ae),i.complete.call(t))},i.duration=e.fx?e.fx.speeds[i.duration]||i.duration:i.duration,r=a(t,n),e.merge(u,o(r)),t.data("keys",e.unique(u)).height(),t.css(ae,i.exclusive+" "+i.duration+"ms "+i.ease).css(ae),t.css(r).css(se),M.event&&(t.one(M.event,c),0!==i.duration&&(d=500)),s=setTimeout(c,i.duration+d),t.data(te,s),t.data(re,c)},stopQueue:function(e,t,n){var i,o=e.data("keys"),r=!n&&o,a=e.data(re);return r&&(i=C.getComputedStyles(e[0],o)),a&&a(),r&&e.css(i),e.removeData("keys").stop(t)}}),f=C.Class.extend({init:function(e,t){var n=this;n.element=e,n.effects=[],n.options=t,n.restore=[]},run:function(t){var n,i,o,s,l,c,d,u=this,h=t.length,f=u.element,p=u.options,m=e.Deferred(),g={},v={};for(u.effects=t,m.then(e.proxy(u,"complete")),f.data("animating",!0),i=0;h>i;i++)for(n=t[i],n.setReverse(p.reverse),n.setOptions(p),u.addRestoreProperties(n.restore),n.prepare(g,v),l=n.children(),o=0,c=l.length;c>o;o++)l[o].duration(p.duration).run();for(d in p.effects)D(v,p.effects[d].properties);for(f.is(":visible")||D(g,{display:f.data("olddisplay")||"block"}),R&&!p.reset&&(s=f.data("targetTransform"),s&&(g=D(s,g))),g=a(f,g),R&&!M&&(g=r(g)),f.css(g).css(se),i=0;h>i;i++)t[i].setup();return p.init&&p.init(),f.data("targetTransform",v),S.animate(f,v,D({},p,{complete:m.resolve})),m.promise()},stop:function(){e(this.element).kendoStop(!0,!0)},addRestoreProperties:function(e){for(var t,n=this.element,i=0,o=e.length;o>i;i++)t=e[i],this.restore.push(t),n.data(t)||n.data(t,n.css(t))},restoreCallback:function(){var e,t,n,i=this.element;for(e=0,t=this.restore.length;t>e;e++)n=this.restore[e],i.css(n,i.data(n))},complete:function(){var t=this,n=0,i=t.element,o=t.options,r=t.effects,a=r.length;for(i.removeData("animating").dequeue(),o.hide&&i.data("olddisplay",i.css("display")).hide(),this.restoreCallback(),P&&!R&&setTimeout(e.proxy(this,"restoreCallback"),0);a>n;n++)r[n].teardown();o.completeCallback&&o.completeCallback(i)}}),S.promise=function(e,t){var n,i,o,r=[],a=new f(e,t),s=C.parseEffects(t.effects);t.effects=s;for(o in s)n=S[l(o)],n&&(i=new n(e,s[o].direction),r.push(i));r[0]?a.run(r):(e.is(":visible")||e.css({display:e.data("olddisplay")||"block"}).css("display"),t.init&&t.init(),e.dequeue(),a.complete())},D(S,{animate:function(n,o,a){var s=a.transition!==!1;delete a.transition,M&&"transition"in S&&s?S.transition(n,o,a):R?n.animate(r(o),{queue:!1,show:!1,hide:!1,duration:a.duration,complete:a.complete}):n.each(function(){var n=e(this),r={};T(W,function(e,a){var s,l,c,d,u,h,f,p=o?o[a]+" ":null;p&&(l=o,a in F&&o[a]!==t?(s=p.match(L),R&&D(l,{scale:+s[0]})):a in z&&o[a]!==t&&(c=n.css(oe),d="absolute"==c||"fixed"==c,n.data(ie)||(d?n.data(ie,{top:i(n,"top")||0,left:i(n,"left")||0,bottom:i(n,"bottom"),right:i(n,"right")}):n.data(ie,{top:i(n,"marginTop")||0,left:i(n,"marginLeft")||0})),u=n.data(ie),s=p.match(L),s&&(h=a==ie+"y"?0:+s[1],f=a==ie+"y"?+s[1]:+s[2],d?(isNaN(u.right)?isNaN(h)||D(l,{left:u.left+h}):isNaN(h)||D(l,{right:u.right-h}),isNaN(u.bottom)?isNaN(f)||D(l,{top:u.top+f}):isNaN(f)||D(l,{bottom:u.bottom-f})):(isNaN(h)||D(l,{marginLeft:u.left+h}),isNaN(f)||D(l,{marginTop:u.top+f})))),!R&&"scale"!=a&&a in l&&delete l[a],l&&D(r,l))}),I.msie&&delete r.scale,n.animate(r,{queue:!1,show:!1,hide:!1,duration:a.duration,complete:a.complete})})}}),S.animatedPromise=S.promise,p=C.Class.extend({init:function(e,t){var n=this;n.element=e,n._direction=t,n.options={},n._additionalEffects=[],n.restore||(n.restore=[])},reverse:function(){return this._reverse=!0,this.run()},play:function(){return this._reverse=!1,this.run()},add:function(e){return this._additionalEffects.push(e),this},direction:function(e){return this._direction=e,this},duration:function(e){return this._duration=e,this},compositeRun:function(){var e=this,t=new f(e.element,{reverse:e._reverse,duration:e._duration}),n=e._additionalEffects.concat([e]);return t.run(n)},run:function(){if(this._additionalEffects&&this._additionalEffects[0])return this.compositeRun();var t,n,i=this,o=i.element,s=0,l=i.restore,c=l.length,d=e.Deferred(),u={},h={},f=i.children(),p=f.length;for(d.then(e.proxy(i,"_complete")),o.data("animating",!0),s=0;c>s;s++)t=l[s],o.data(t)||o.data(t,o.css(t));for(s=0;p>s;s++)f[s].duration(i._duration).run();return i.prepare(u,h),o.is(":visible")||D(u,{display:o.data("olddisplay")||"block"}),R&&(n=o.data("targetTransform"),n&&(u=D(n,u))),u=a(o,u),R&&!M&&(u=r(u)),o.css(u).css(se),i.setup(),o.data("targetTransform",h),S.animate(o,h,{duration:i._duration,complete:d.resolve}),d.promise()},stop:function(){var t=0,n=this.children(),i=n.length;for(t=0;i>t;t++)n[t].stop();return e(this.element).kendoStop(!0,!0),this},restoreCallback:function(){var e,t,n,i=this.element;for(e=0,t=this.restore.length;t>e;e++)n=this.restore[e],i.css(n,i.data(n))},_complete:function(){var t=this,n=t.element;n.removeData("animating").dequeue(),t.restoreCallback(),t.shouldHide()&&n.data("olddisplay",n.css("display")).hide(),P&&!R&&setTimeout(e.proxy(t,"restoreCallback"),0),t.teardown()},setOptions:function(e){D(!0,this.options,e)},children:function(){return[]},shouldHide:e.noop,setup:e.noop,prepare:e.noop,teardown:e.noop,directions:[],setReverse:function(e){return this._reverse=e,this}}),m=["left","right","up","down"],g=["in","out"],c("slideIn",{directions:m,divisor:function(e){return this.options.divisor=e,this},prepare:function(e,t){var n,i=this,o=i.element,r=he[i._direction],a=-r.modifier*(r.vertical?o.outerHeight():o.outerWidth()),s=a/(i.options&&i.options.divisor||1)+Y,l="0px";i._reverse&&(n=e,e=t,t=n),R?(e[r.transition]=s,t[r.transition]=l):(e[r.property]=s,t[r.property]=l)}}),c("tile",{directions:m,init:function(e,t,n){p.prototype.init.call(this,e,t),this.options={previous:n}},previousDivisor:function(e){return this.options.previousDivisor=e,this},children:function(){var e=this,t=e._reverse,n=e.options.previous,i=e.options.previousDivisor||1,o=e._direction,r=[C.fx(e.element).slideIn(o).setReverse(t)];return n&&r.push(C.fx(n).slideIn(he[o].reverse).divisor(i).setReverse(!t)),r}}),d("fade","opacity",1,0),d("zoom","scale",1,.01),c("slideMargin",{prepare:function(e,t){var n,i=this,o=i.element,r=i.options,a=o.data(ee),s=r.offset,l=i._reverse;l||null!==a||o.data(ee,parseFloat(o.css("margin-"+r.axis))),n=o.data(ee)||0,t["margin-"+r.axis]=l?n:n+s}}),c("slideTo",{prepare:function(e,t){var n=this,i=n.element,o=n.options,r=o.offset.split(","),a=n._reverse;R?(t.translatex=a?0:r[0],t.translatey=a?0:r[1]):(t.left=a?0:r[0],t.top=a?0:r[1]),i.css("left")}}),c("expand",{directions:["horizontal","vertical"],restore:[ne],prepare:function(e,n){var i=this,o=i.element,r=i.options,a=i._reverse,s="vertical"===i._direction?J:X,l=o[0].style[s],c=o.data(s),d=parseFloat(c||l),u=G(o.css(s,Q)[s]());e.overflow=Z,d=r&&r.reset?u||d:d||u,n[s]=(a?0:d)+Y,e[s]=(a?d:0)+Y,c===t&&o.data(s,l)},shouldHide:function(){return this._reverse},teardown:function(){var e=this,t=e.element,n="vertical"===e._direction?J:X,i=t.data(n);i!=Q&&i!==$||setTimeout(function(){t.css(n,Q).css(n)},0)}}),v={position:"absolute",marginLeft:0,marginTop:0,scale:1},c("transfer",{init:function(e,t){this.element=e,this.options={target:t},this.restore=[]},setup:function(){this.element.appendTo(document.body)},prepare:function(e,t){var n=this,i=n.element,o=S.box(i),r=S.box(n.options.target),a=s(i,"scale"),l=S.fillScale(r,o),c=S.transformOrigin(r,o);D(e,v),t.scale=1,i.css(se,"scale(1)").css(se),i.css(se,"scale("+a+")"),e.top=o.top,e.left=o.left,e.transformOrigin=c.x+Y+" "+c.y+Y,n._reverse?e.scale=l:t.scale=l}}),_={top:"rect(auto auto $size auto)",bottom:"rect($size auto auto auto)",left:"rect(auto $size auto auto)",right:"rect(auto auto auto $size)"},b={top:{start:"rotatex(0deg)",end:"rotatex(180deg)"},bottom:{start:"rotatex(-180deg)",end:"rotatex(0deg)"},left:{start:"rotatey(0deg)",end:"rotatey(-180deg)"},right:{start:"rotatey(180deg)",end:"rotatey(0deg)"}},c("turningPage",{directions:m,init:function(e,t,n){p.prototype.init.call(this,e,t),this._container=n},prepare:function(e,t){var n=this,i=n._reverse,o=i?he[n._direction].reverse:n._direction,r=b[o];e.zIndex=1,n._clipInHalf&&(e.clip=u(n._container,C.directions[o].reverse)),e[le]=Z,t[se]=ue+(i?r.start:r.end),e[se]=ue+(i?r.end:r.start)},setup:function(){this._container.append(this.element)},face:function(e){return this._face=e,this},shouldHide:function(){var e=this,t=e._reverse,n=e._face;return t&&!n||!t&&n},clipInHalf:function(e){return this._clipInHalf=e,this},temporary:function(){return this.element.addClass("temp-page"),this}}),c("staticPage",{directions:m,init:function(e,t,n){p.prototype.init.call(this,e,t),this._container=n},restore:["clip"],prepare:function(e,t){var n=this,i=n._reverse?he[n._direction].reverse:n._direction;e.clip=u(n._container,i),e.opacity=.999,t.opacity=1},shouldHide:function(){var e=this,t=e._reverse,n=e._face;return t&&!n||!t&&n},face:function(e){return this._face=e,this}}),c("pageturn",{directions:["horizontal","vertical"],init:function(e,t,n,i){p.prototype.init.call(this,e,t),this.options={},this.options.face=n,this.options.back=i},children:function(){var e,t=this,n=t.options,i="horizontal"===t._direction?"left":"top",o=C.directions[i].reverse,r=t._reverse,a=n.face.clone(!0).removeAttr("id"),s=n.back.clone(!0).removeAttr("id"),l=t.element;return r&&(e=i,i=o,o=e),[C.fx(n.face).staticPage(i,l).face(!0).setReverse(r),C.fx(n.back).staticPage(o,l).setReverse(r),C.fx(a).turningPage(i,l).face(!0).clipInHalf(!0).temporary().setReverse(r),C.fx(s).turningPage(o,l).clipInHalf(!0).temporary().setReverse(r)]},prepare:function(e,t){e[ce]=de,e.transformStyle="preserve-3d",e.opacity=.999,t.opacity=1},teardown:function(){this.element.find(".temp-page").remove()}}),c("flip",{directions:["horizontal","vertical"],init:function(e,t,n,i){p.prototype.init.call(this,e,t),this.options={},this.options.face=n,this.options.back=i},children:function(){var e,t=this,n=t.options,i="horizontal"===t._direction?"left":"top",o=C.directions[i].reverse,r=t._reverse,a=t.element;return r&&(e=i,i=o,o=e),[C.fx(n.face).turningPage(i,a).face(!0).setReverse(r),C.fx(n.back).turningPage(o,a).setReverse(r)]},prepare:function(e){e[ce]=de,e.transformStyle="preserve-3d"}}),w=!E.mobileOS.android,y=".km-touch-scrollbar, .km-actionsheet-wrapper",c("replace",{_before:e.noop,_after:e.noop,init:function(t,n,i){p.prototype.init.call(this,t),this._previous=e(n),this._transitionClass=i},duration:function(){throw Error("The replace effect does not support duration setting; the effect duration may be customized through the transition class rule")},beforeTransition:function(e){return this._before=e,this},afterTransition:function(e){return this._after=e,this},_both:function(){return e().add(this._element).add(this._previous)},_containerClass:function(){var e=this._direction,t="k-fx k-fx-start k-fx-"+this._transitionClass;return e&&(t+=" k-fx-"+e),this._reverse&&(t+=" k-fx-reverse"),t},complete:function(t){if(!(!this.deferred||t&&e(t.target).is(y))){var n=this.container;n.removeClass("k-fx-end").removeClass(this._containerClass()).off(M.event,this.completeProxy),this._previous.hide().removeClass("k-fx-current"),this.element.removeClass("k-fx-next"),w&&n.css(ne,""),this.isAbsolute||this._both().css(oe,""),this.deferred.resolve(),delete this.deferred}},run:function(){if(this._additionalEffects&&this._additionalEffects[0])return this.compositeRun();var t,n=this,i=n.element,o=n._previous,r=i.parents().filter(o.parents()).first(),a=n._both(),s=e.Deferred(),l=i.css(oe);return r.length||(r=i.parent()),this.container=r,this.deferred=s,this.isAbsolute="absolute"==l,this.isAbsolute||a.css(oe,"absolute"),w&&(t=r.css(ne),r.css(ne,"hidden")),M?(i.addClass("k-fx-hidden"),r.addClass(this._containerClass()),this.completeProxy=e.proxy(this,"complete"),r.on(M.event,this.completeProxy),C.animationFrame(function(){i.removeClass("k-fx-hidden").addClass("k-fx-next"),o.css("display","").addClass("k-fx-current"),n._before(o,i),C.animationFrame(function(){r.removeClass("k-fx-start").addClass("k-fx-end"),n._after(o,i)})})):this.complete(),s.promise()},stop:function(){this.complete()}}),k=C.Class.extend({init:function(){var e=this;e._tickProxy=A(e._tick,e),e._started=!1},tick:e.noop,done:e.noop,onEnd:e.noop,onCancel:e.noop,start:function(){this.enabled()&&(this.done()?this.onEnd():(this._started=!0,C.animationFrame(this._tickProxy)))},enabled:function(){return!0},cancel:function(){this._started=!1,this.onCancel()},_tick:function(){var e=this;e._started&&(e.tick(),e.done()?(e._started=!1,e.onEnd()):C.animationFrame(e._tickProxy))}}),x=k.extend({init:function(e){var t=this;D(t,e),k.fn.init.call(t)},done:function(){return this.timePassed()>=this.duration},timePassed:function(){return Math.min(this.duration,new Date-this.startDate)},moveTo:function(e){var t=this,n=t.movable;t.initial=n[t.axis],t.delta=e.location-t.initial,t.duration="number"==typeof e.duration?e.duration:300,t.tick=t._easeProxy(e.ease),t.startDate=new Date,t.start()},_easeProxy:function(e){var t=this;return function(){t.movable.moveAxis(t.axis,e(t.timePassed(),t.initial,t.delta,t.duration))}}}),D(x,{easeOutExpo:function(e,t,n,i){return e==i?t+n:n*(-Math.pow(2,-10*e/i)+1)+t},easeOutBack:function(e,t,n,i,o){return o=1.70158,n*((e=e/i-1)*e*((o+1)*e+o)+1)+t}}),S.Animation=k,S.Transition=x,S.createEffect=c,S.box=function(t){t=e(t);var n=t.offset();return n.width=t.outerWidth(),n.height=t.outerHeight(),n},S.transformOrigin=function(e,t){var n=(e.left-t.left)*t.width/(t.width-e.width),i=(e.top-t.top)*t.height/(t.height-e.height);return{x:isNaN(n)?0:n,y:isNaN(i)?0:i}},S.fillScale=function(e,t){return Math.min(e.width/t.width,e.height/t.height)},S.fitScale=function(e,t){return Math.max(e.width/t.width,e.height/t.height)}}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.view.min",["kendo.core.min","kendo.binder.min","kendo.fx.min"],e)}(function(){return function(e,t){function n(e){if(!e)return{};var t=e.match(_)||[];return{type:t[1],direction:t[3],reverse:"reverse"===t[5]}}var i=window.kendo,o=i.Observable,r="SCRIPT",a="init",s="show",l="hide",c="transitionStart",d="transitionEnd",u="attach",h="detach",f=/unrecognized expression/,p=o.extend({init:function(e,t){var n=this;t=t||{},o.fn.init.call(n),n.content=e,n.id=i.guid(),n.tagName=t.tagName||"div",n.model=t.model,n._wrap=t.wrap!==!1,this._evalTemplate=t.evalTemplate||!1,n._fragments={},n.bind([a,s,l,c,d],t)},render:function(t){var n=this,o=!n.element;return o&&(n.element=n._createElement()),t&&e(t).append(n.element),o&&(i.bind(n.element,n.model),n.trigger(a)),t&&(n._eachFragment(u),n.trigger(s)),n.element},clone:function(){return new m(this)},triggerBeforeShow:function(){return!0},triggerBeforeHide:function(){return!0},showStart:function(){this.element.css("display","")},showEnd:function(){},hideEnd:function(){this.hide()},beforeTransition:function(e){this.trigger(c,{type:e})},afterTransition:function(e){this.trigger(d,{type:e})},hide:function(){this._eachFragment(h),this.element.detach(),this.trigger(l)},destroy:function(){var e=this.element;e&&(i.unbind(e),i.destroy(e),e.remove())},fragments:function(t){e.extend(this._fragments,t)},_eachFragment:function(e){for(var t in this._fragments)this._fragments[t][e](this,t)},_createElement:function(){var t,n,o,a=this,s="<"+a.tagName+" />";try{n=e(document.getElementById(a.content)||a.content),n[0].tagName===r&&(n=n.html())}catch(l){f.test(l.message)&&(n=a.content)}return"string"==typeof n?(n=n.replace(/^\s+|\s+$/g,""),a._evalTemplate&&(n=i.template(n)(a.model||{})),t=e(s).append(n),a._wrap||(t=t.contents())):(t=n,a._evalTemplate&&(o=e(i.template(e("
        ").append(t.clone(!0)).html())(a.model||{})),e.contains(document,t[0])&&t.replaceWith(o),t=o),a._wrap&&(t=t.wrapAll(s).parent())),t}}),m=i.Class.extend({init:function(t){e.extend(this,{element:t.element.clone(!0),transition:t.transition,id:t.id}),t.element.parent().append(this.element)},hideEnd:function(){this.element.remove()},beforeTransition:e.noop,afterTransition:e.noop}),g=p.extend({init:function(e,t){p.fn.init.call(this,e,t),this.containers={}},container:function(e){var t=this.containers[e];return t||(t=this._createContainer(e),this.containers[e]=t),t},showIn:function(e,t,n){this.container(e).show(t,n)},_createContainer:function(e){var t,n=this.render(),i=n.find(e);if(!i.length&&n.is(e)){if(!n.is(e))throw Error("can't find a container with the specified "+e+" selector");i=n}return t=new b(i),t.bind("accepted",function(e){e.view.render(i)}),t}}),v=p.extend({attach:function(e,t){e.element.find(t).replaceWith(this.render())},detach:function(){}}),_=/^(\w+)(:(\w+))?( (\w+))?$/,b=o.extend({init:function(e){o.fn.init.call(this),this.container=e,this.history=[],this.view=null,this.running=!1},after:function(){this.running=!1,this.trigger("complete",{view:this.view}),this.trigger("after")},end:function(){this.view.showEnd(),this.previous.hideEnd(),this.after()},show:function(e,t,o){if(!e.triggerBeforeShow()||this.view&&!this.view.triggerBeforeHide())return this.trigger("after"),!1;o=o||e.id;var r=this,a=e===r.view?e.clone():r.view,s=r.history,l=s[s.length-2]||{},c=l.id===o,d=t||(c?s[s.length-1].transition:e.transition),u=n(d);return r.running&&r.effect.stop(),"none"===d&&(d=null),r.trigger("accepted",{view:e}),r.view=e,r.previous=a,r.running=!0,c?s.pop():s.push({id:o,transition:d}),a?(d&&i.effects.enabled?(e.element.addClass("k-fx-hidden"),e.showStart(),c&&!t&&(u.reverse=!u.reverse),r.effect=i.fx(e.element).replace(a.element,u.type).beforeTransition(function(){e.beforeTransition("show"),a.beforeTransition("hide")}).afterTransition(function(){e.afterTransition("show"),a.afterTransition("hide")}).direction(u.direction).setReverse(u.reverse),r.effect.run().then(function(){r.end()})):(e.showStart(),r.end()),!0):(e.showStart(),e.showEnd(),r.after(),!0)}});i.ViewContainer=b,i.Fragment=v,i.Layout=g,i.View=p,i.ViewClone=m}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.dom.min",["kendo.core.min"],e)}(function(){return function(e){function t(){this.node=null}function n(){}function i(e,t,n){this.nodeName=e,this.attr=t||{},this.children=n||[]}function o(e){this.nodeValue=e}function r(e){this.html=e}function a(e,t){for(h.innerHTML=t;h.firstChild;)e.appendChild(h.firstChild)}function s(e){return new r(e)}function l(e,t,n){return new i(e,t,n)}function c(e){return new o(e)}function d(e){this.root=e,this.children=[]}var u,h;t.prototype={remove:function(){this.node.parentNode.removeChild(this.node),this.attr={}},attr:{},text:function(){return""}},n.prototype={nodeName:"#null",attr:{style:{}},children:[],remove:function(){}},u=new n,i.prototype=new t,i.prototype.appendTo=function(e){var t,n=document.createElement(this.nodeName),i=this.children;for(t=0;i.length>t;t++)i[t].render(n,u);return e.appendChild(n),n},i.prototype.render=function(e,t){var n,i,o,r,a,s;if(t.nodeName!==this.nodeName)t.remove(),n=this.appendTo(e);else{if(n=t.node,o=this.children,r=o.length,a=t.children,s=a.length,Math.abs(s-r)>2)return void this.render({appendChild:function(n){e.replaceChild(n,t.node)}},u);for(i=0;r>i;i++)o[i].render(n,a[i]||u);for(i=r;s>i;i++)a[i].remove()}this.node=n,this.syncAttributes(t.attr),this.removeAttributes(t.attr)},i.prototype.syncAttributes=function(e){var t,n,i,o=this.attr;for(t in o)n=o[t], +i=e[t],"style"===t?this.setStyle(n,i):n!==i&&this.setAttribute(t,n,i)},i.prototype.setStyle=function(e,t){var n,i=this.node;if(t)for(n in e)e[n]!==t[n]&&(i.style[n]=e[n]);else for(n in e)i.style[n]=e[n]},i.prototype.removeStyle=function(e){var t,n=this.attr.style||{},i=this.node;for(t in e)void 0===n[t]&&(i.style[t]="")},i.prototype.removeAttributes=function(e){var t,n=this.attr;for(t in e)"style"===t?this.removeStyle(e.style):void 0===n[t]&&this.removeAttribute(t)},i.prototype.removeAttribute=function(e){var t=this.node;"style"===e?t.style.cssText="":"className"===e?t.className="":t.removeAttribute(e)},i.prototype.setAttribute=function(e,t){var n=this.node;void 0!==n[e]?n[e]=t:n.setAttribute(e,t)},i.prototype.text=function(){var e,t="";for(e=0;this.children.length>e;++e)t+=this.children[e].text();return t},o.prototype=new t,o.prototype.nodeName="#text",o.prototype.render=function(e,t){var n;t.nodeName!==this.nodeName?(t.remove(),n=document.createTextNode(this.nodeValue),e.appendChild(n)):(n=t.node,this.nodeValue!==t.nodeValue&&(n.nodeValue=this.nodeValue)),this.node=n},o.prototype.text=function(){return this.nodeValue},r.prototype={nodeName:"#html",attr:{},remove:function(){for(var e=0;this.nodes.length>e;e++)this.nodes[e].parentNode.removeChild(this.nodes[e])},render:function(e,t){var n,i;if(t.nodeName!==this.nodeName||t.html!==this.html)for(t.remove(),n=e.lastChild,a(e,this.html),this.nodes=[],i=n?n.nextSibling:e.firstChild;i;i=i.nextSibling)this.nodes.push(i);else this.nodes=t.nodes.slice(0)}},h=document.createElement("div"),d.prototype={html:s,element:l,text:c,render:function(e){var t,n,i=this.children;for(t=0,n=e.length;n>t;t++)e[t].render(this.root,i[t]||u);for(t=n;i.length>t;t++)i[t].remove();this.children=e}},e.dom={html:s,text:c,element:l,Tree:d,Node:t}}(window.kendo),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.ooxml.min",["kendo.core.min"],e)}(function(){return function(e,t){function n(e){var t=Math.floor(e/26)-1;return(t>=0?n(t):"")+String.fromCharCode(65+e%26)}function i(e,t){return n(t)+(e+1)}function o(e,t){return n(t)+"$"+(e+1)}function r(e){var t=e.frozenRows||(e.freezePane||{}).rowSplit||1;return t-1}function a(e){return(e/7*100+.5)/100}function s(e){return.75*e}function l(e){return(e+"").replace(/[\x00-\x08]/g,"").replace(/\n/g,"\r\n")}function c(e){return 6>e.length&&(e=e.replace(/(\w)/g,function(e,t){return t+t})),e=e.substring(1).toUpperCase(),8>e.length&&(e="FF"+e),e}function d(e){var t="thin";return 2===e?t="medium":3===e&&(t="thick"),t}function u(e,t){var n="";return t&&t.size&&(n+="<"+e+' style="'+d(t.size)+'">',t.color&&(n+=''),n+=""),n}function h(e){return""+u("left",e.left)+u("right",e.right)+u("top",e.top)+u("bottom",e.bottom)+""}function f(e,t){var n,i,o,r=[],a=[];for(p(e,function(e,t){var n={_source:e,index:t,height:e.height,cells:[]};r.push(n),a[t]=n}),n=m(r).slice(0),i={rowData:r,rowsByIndex:a,mergedCells:t},o=0;n.length>o;o++)g(n[o],i),delete n[o]._source;return m(r)}function p(e,t){var n,i,o;for(n=0;e.length>n;n++)i=e[n],i&&(o=i.index,"number"!=typeof o&&(o=n),t(i,o))}function m(e){return e.sort(function(e,t){return e.index-t.index})}function g(e,t){var n,o,r,a,s,l,c,d=e._source,u=e.index,h=d.cells,f=e.cells;if(h)for(n=0;h.length>n;n++)if(o=h[n]||B,r=o.rowSpan||1,a=o.colSpan||1,s=v(f,o),w(f,s,a),(r>1||a>1)&&t.mergedCells.push(i(u,s)+":"+i(u+r-1,s+a-1)),r>1)for(l=u+1;u+r>l;l++)c=t.rowsByIndex[l],c||(c=t.rowsByIndex[l]={index:l,cells:[]},t.rowData.push(c)),w(c.cells,s-1,a+1)}function v(e,t){var n;return"number"==typeof t.index?(n=t.index,_(e,t,t.index)):n=b(e,t),n}function _(e,t,n){e[n]=t}function b(e,t){var n,i=e.length;for(n=0;e.length+1>n;n++)if(!e[n]){e[n]=t,i=n;break}return i}function w(e,t,n){for(var i=1;n>i;i++)_(e,P,t+i)}var y='\r\n',k=t.template('\r\n${creator}${lastModifiedBy}${created}${modified}'),x=t.template('\r\nMicrosoft Excel0falseWorksheets${sheets.length}# for (var idx = 0; idx < sheets.length; idx++) { ## if (sheets[idx].options.title) { #${sheets[idx].options.title}# } else { #Sheet${idx+1}# } ## } #falsefalsefalse14.0300'),C=t.template('\r\n# for (var idx = 1; idx <= count; idx++) { ## } #'),S=t.template('\r\n# for (var idx = 0; idx < sheets.length; idx++) { ## var options = sheets[idx].options; ## var name = options.name || options.title ## if (name) { ## } else { ## } ## } ## if (filterNames.length || userNames.length) { # # for (var di = 0; di < filterNames.length; di++) { #${filterNames[di].name}!$${filterNames[di].from}:$${filterNames[di].to} # } # # for (var i = 0; i < userNames.length; ++i) { #${userNames[i].value} # } ## } #'),T=t.template('\r\n# if (frozenRows || frozenColumns) { ## } ## if (columns && columns.length > 0) { ## for (var ci = 0; ci < columns.length; ci++) { ## var column = columns[ci]; ## var columnIndex = typeof column.index === "number" ? column.index + 1 : (ci + 1); ## if (column.width === 0) { ## } else if (column.width) { ## } ## } ## } ## for (var ri = 0; ri < data.length; ri++) { ## var row = data[ri]; ## var rowIndex = typeof row.index === "number" ? row.index + 1 : (ri + 1); ## for (var ci = 0; ci < row.data.length; ci++) { ## var cell = row.data[ci];## if (cell.formula != null) { #${cell.formula}# } ## if (cell.value != null) { #${cell.value}# } ## } ## } ## if (hyperlinks.length) { ## for (var hi = 0; hi < hyperlinks.length; hi++) { ## } ## } ## if (filter) { ## } ## if (mergeCells.length) { ## for (var ci = 0; ci < mergeCells.length; ci++) { ## } ## } #'),D=t.template('\r\n# for (var idx = 1; idx <= count; idx++) { ## } #'),A=t.template('\r\n# for (var i = 0; i < hyperlinks.length; i++) { ## } #'),E=t.template('\r\n# for (var index in indexes) { #${index.substring(1)}# } #'),I=t.template('# for (var fi = 0; fi < formats.length; fi++) { ## var format = formats[fi]; ## } ## for (var fi = 0; fi < fonts.length; fi++) { ## var font = fonts[fi]; ## if (font.fontSize) { ## } else { ## } ## if (font.bold) { ## } ## if (font.italic) { ## } ## if (font.underline) { ## } ## if (font.color) { ## } else { ## } ## if (font.fontFamily) { ## } else { ## } ## } ## for (var fi = 0; fi < fills.length; fi++) { ## var fill = fills[fi]; ## if (fill.background) { ## } ## } ## for (var bi = 0; bi < borders.length; bi++) { ##= kendo.ooxml.borderTemplate(borders[bi]) ## } ## for (var si = 0; si < styles.length; si++) { ## var style = styles[si]; ## if (style.textAlign || style.verticalAlign || style.wrap) { ## } ## } #'),R=new Date(1900,0,0),M=t.Class.extend({init:function(e,t,n,i){this.options=e,this._strings=t,this._styles=n,this._borders=i},relsToXML:function(){var e=this.options.hyperlinks||[];return e.length?A({hyperlinks:e}):""},toXML:function(e){var t,n,o=this.options.mergedCells||[],a=this.options.rows||[],s=f(a,o);return this._readCells(s),t=this.options.filter,t&&"number"==typeof t.from&&"number"==typeof t.to&&(t={from:i(r(this.options),t.from),to:i(r(this.options),t.to)}),n=this.options.freezePane||{},T({frozenColumns:this.options.frozenColumns||n.colSplit,frozenRows:this.options.frozenRows||n.rowSplit,columns:this.options.columns,defaults:this.options.defaults||{},data:s,index:e,mergeCells:o,filter:t,showGridLines:this.options.showGridLines,hyperlinks:this.options.hyperlinks||[]})},_lookupString:function(e){var t="$"+e,n=this._strings.indexes[t];return void 0!==n?e=n:(e=this._strings.indexes[t]=this._strings.uniqueCount,this._strings.uniqueCount++),this._strings.count++,e},_lookupStyle:function(n){var i,o=t.stringify(n);return"{}"==o?0:(i=e.inArray(o,this._styles),0>i&&(i=this._styles.push(o)-1),i+1)},_lookupBorder:function(n){var i,o=t.stringify(n);if("{}"!=o)return i=e.inArray(o,this._borders),0>i&&(i=this._borders.push(o)-1),i+1},_readCells:function(e){var t,n,i,o,r;for(t=0;e.length>t;t++)for(n=e[t],i=n.cells,n.data=[],o=0;i.length>o;o++)r=this._cell(i[o],n.index,o),r&&n.data.push(r)},_cell:function(e,n,o){var r,a,s,c,d,u,h,f;return e&&e!==B?(r=e.value,a={},e.borderLeft&&(a.left=e.borderLeft),e.borderRight&&(a.right=e.borderRight),e.borderTop&&(a.top=e.borderTop),e.borderBottom&&(a.bottom=e.borderBottom),a=this._lookupBorder(a),s={bold:e.bold,color:e.color,background:e.background,italic:e.italic,underline:e.underline,fontFamily:e.fontFamily||e.fontName,fontSize:e.fontSize,format:e.format,textAlign:e.textAlign||e.hAlign,verticalAlign:e.verticalAlign||e.vAlign,wrap:e.wrap,borderId:a},c=this.options.columns||[],d=c[o],u=typeof r,d&&d.autoWidth&&(h=r,"number"===u&&(h=t.toString(r,e.format)),d.width=Math.max(d.width||0,(h+"").length)),"string"===u?(r=l(r),r=this._lookupString(r),u="s"):"number"===u?u="n":"boolean"===u?(u="b",r=+r):r&&r.getTime?(u=null,f=(r.getTimezoneOffset()-R.getTimezoneOffset())*t.date.MS_PER_MINUTE,r=(r-R-f)/t.date.MS_PER_DAY+1,s.format||(s.format="mm-dd-yy")):(u=null,r=null),s=this._lookupStyle(s),{value:r,formula:e.formula,type:u,style:s,ref:i(n,o)}):null}}),F={General:0,0:1,"0.00":2,"#,##0":3,"#,##0.00":4,"0%":9,"0.00%":10,"0.00E+00":11,"# ?/?":12,"# ??/??":13,"mm-dd-yy":14,"d-mmm-yy":15,"d-mmm":16,"mmm-yy":17,"h:mm AM/PM":18,"h:mm:ss AM/PM":19,"h:mm":20,"h:mm:ss":21,"m/d/yy h:mm":22,"#,##0 ;(#,##0)":37,"#,##0 ;[Red](#,##0)":38,"#,##0.00;(#,##0.00)":39,"#,##0.00;[Red](#,##0.00)":40,"mm:ss":45,"[h]:mm:ss":46,"mmss.0":47,"##0.0E+0":48,"@":49,"[$-404]e/m/d":27,"m/d/yy":30,t0:59,"t0.00":60,"t#,##0":61,"t#,##0.00":62,"t0%":67,"t0.00%":68,"t# ?/?":69,"t# ??/??":70},z=t.Class.extend({init:function(t){this.options=t||{},this._strings={indexes:{},count:0,uniqueCount:0},this._styles=[],this._borders=[],this._sheets=e.map(this.options.sheets||[],e.proxy(function(e){return e.defaults=this.options,new M(e,this._strings,this._styles,this._borders)},this))},toDataURL:function(){var n,i,a,s,l,d,u,h,f,p,m,g,v,_,b,w,T,A,R;if("undefined"==typeof JSZip)throw Error("JSZip not found. Check http://docs.telerik.com/kendo-ui/framework/excel/introduction#requirements for more details.");for(n=new JSZip,i=n.folder("docProps"),i.file("core.xml",k({creator:this.options.creator||"Kendo UI",lastModifiedBy:this.options.creator||"Kendo UI",created:this.options.date||(new Date).toJSON(),modified:this.options.date||(new Date).toJSON()})),a=this._sheets.length,i.file("app.xml",x({sheets:this._sheets})),s=n.folder("_rels"),s.file(".rels",y),l=n.folder("xl"),d=l.folder("_rels"),d.file("workbook.xml.rels",D({count:a})),u={},l.file("workbook.xml",S({sheets:this._sheets,filterNames:e.map(this._sheets,function(e,t){var n,i=e.options,a=i.name||i.title||"Sheet"+(t+1);return u[a.toLowerCase()]=t,n=i.filter,n&&void 0!==n.from&&void 0!==n.to?{localSheetId:t,name:a,from:o(r(i),n.from),to:o(r(i),n.to)}:void 0}),userNames:e.map(this.options.names,function(e){return{name:e.localName,localSheetId:e.sheet?u[e.sheet.toLowerCase()]:null,value:e.value,hidden:e.hidden}})})),h=l.folder("worksheets"),f=h.folder("_rels"),p=0;a>p;p++)m=this._sheets[p],g=t.format("sheet{0}.xml",p+1),v=m.relsToXML(),v&&f.file(g+".rels",v),h.file(g,m.toXML(p));return _=e.map(this._borders,e.parseJSON),b=e.map(this._styles,e.parseJSON),w=function(e){return e.underline||e.bold||e.italic||e.color||e.fontFamily||e.fontSize},T=e.map(b,function(e){return e.color&&(e.color=c(e.color)),w(e)?e:void 0}),A=e.map(b,function(e){return e.format&&void 0===F[e.format]?e:void 0}),R=e.map(b,function(e){return e.background?(e.background=c(e.background),e):void 0}),l.file("styles.xml",I({fonts:T,fills:R,formats:A,borders:_,styles:e.map(b,function(t){var n={};return w(t)&&(n.fontId=e.inArray(t,T)+1),t.background&&(n.fillId=e.inArray(t,R)+2),n.textAlign=t.textAlign,n.verticalAlign=t.verticalAlign,n.wrap=t.wrap,n.borderId=t.borderId,t.format&&(n.numFmtId=void 0!==F[t.format]?F[t.format]:165+e.inArray(t,A)),n})})),l.file("sharedStrings.xml",E(this._strings)),n.file("[Content_Types].xml",C({count:a})),"data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,"+n.generate({compression:"DEFLATE"})}}),P={},B={};t.ooxml={Workbook:z,Worksheet:M,toWidth:a,toHeight:s,borderTemplate:h}}(kendo.jQuery,kendo),kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.excel.min",["kendo.core.min","kendo.data.min","kendo.ooxml.min"],e)}(function(){return function(e,t){t.ExcelExporter=t.Class.extend({init:function(n){var i,o,r;n.columns=this._trimColumns(n.columns||[]),this.allColumns=e.map(this._leafColumns(n.columns||[]),this._prepareColumn),this.columns=e.grep(this.allColumns,function(e){return!e.hidden}),this.options=n,i=n.dataSource,i instanceof t.data.DataSource?(this.dataSource=new i.constructor(e.extend({},i.options,{page:n.allPages?0:i.page(),filter:i.filter(),pageSize:n.allPages?i.total():i.pageSize(),sort:i.sort(),group:i.group(),aggregate:i.aggregate()})),o=i.data(),o.length>0&&(this.dataSource._data=o,r=this.dataSource.transport,i._isServerGrouped()&&r.options&&r.options.data&&(r.options.data=null))):this.dataSource=t.data.DataSource.create(i)},_trimColumns:function(t){var n=this;return e.grep(t,function(e){var t=!!e.field;return!t&&e.columns&&(t=n._trimColumns(e.columns).length>0),t})},_leafColumns:function(e){var t,n=[];for(t=0;e.length>t;t++)e[t].columns?n=n.concat(this._leafColumns(e[t].columns)):n.push(e[t]);return n},workbook:function(){return e.Deferred(e.proxy(function(t){this.dataSource.fetch().then(e.proxy(function(){var e={sheets:[{columns:this._columns(),rows:this._rows(),freezePane:this._freezePane(),filter:this._filter()}]};t.resolve(e,this.dataSource.view())},this))},this)).promise()},_prepareColumn:function(n){var i,o;if(n.field)return i=function(e){return e.get(n.field)},o=null,n.values&&(o={},e.each(n.values,function(){o[this.value]=this.text}),i=function(e){return o[e.get(n.field)]}),e.extend({},n,{value:i,values:o,groupHeaderTemplate:t.template(n.groupHeaderTemplate||"#= title #: #= value #"),groupFooterTemplate:n.groupFooterTemplate?t.template(n.groupFooterTemplate):null,footerTemplate:n.footerTemplate?t.template(n.footerTemplate):null})},_filter:function(){if(!this.options.filterable)return null;var e=this._depth();return{from:e,to:e+this.columns.length-1}},_dataRow:function(t,n,i){var o,r,a,s,l,c,d,u,h,f;for(this._hierarchical()&&(n=this.dataSource.level(t)+1),o=[],r=0;n>r;r++)o[r]={background:"#dfdfdf",color:"#333"};if(i&&t.items)return a=e.grep(this.allColumns,function(e){return e.field==t.field})[0],s=a&&a.title?a.title:t.field,l=a?a.groupHeaderTemplate:null,c=s+": "+t.value,d=e.extend({title:s,field:t.field,value:a&&a.values?a.values[t.value]:t.value,aggregates:t.aggregates},t.aggregates[t.field]),l&&(c=l(d)),o.push({value:c,background:"#dfdfdf",color:"#333",colSpan:this.columns.length+i-n}),u=this._dataRows(t.items,n+1),u.unshift({type:"group-header",cells:o}),u.concat(this._footer(t));for(h=[],f=0;this.columns.length>f;f++)h[f]=this._cell(t,this.columns[f]);return this._hierarchical()&&(h[0].colSpan=i-n+1),[{type:"data",cells:o.concat(h)}]},_dataRows:function(e,t){var n,i=this._depth(),o=[];for(n=0;e.length>n;n++)o.push.apply(o,this._dataRow(e[n],t,i));return o},_footer:function(t){var n=[],i=!1,o=e.map(this.columns,e.proxy(function(n){return n.groupFooterTemplate?(i=!0,{background:"#dfdfdf",color:"#333",value:n.groupFooterTemplate(e.extend({},this.dataSource.aggregates(),t.aggregates,t.aggregates[n.field]))}):{background:"#dfdfdf",color:"#333"}},this));return i&&n.push({type:"group-footer",cells:e.map(Array(this.dataSource.group().length),function(){return{background:"#dfdfdf",color:"#333"}}).concat(o)}),n},_isColumnVisible:function(e){return this._visibleColumns([e]).length>0&&(e.field||e.columns)},_visibleColumns:function(t){var n=this;return e.grep(t,function(e){var t=!e.hidden;return t&&e.columns&&(t=n._visibleColumns(e.columns).length>0),t})},_headerRow:function(t,n){var i=e.map(t.cells,function(e){return{background:"#7a7a7a",color:"#fff",value:e.title,colSpan:e.colSpan>1?e.colSpan:1,rowSpan:t.rowSpan>1&&!e.colSpan?t.rowSpan:1}});return this._hierarchical()&&(i[0].colSpan=this._depth()+1),{type:"header",cells:e.map(Array(n.length),function(){return{background:"#7a7a7a",color:"#fff"}}).concat(i)}},_prependHeaderRows:function(e){var t,n=this.dataSource.group(),i=[{rowSpan:1,cells:[],index:0}];for(this._prepareHeaderRows(i,this.options.columns),t=i.length-1;t>=0;t--)e.unshift(this._headerRow(i[t],n))},_prepareHeaderRows:function(e,t,n,i){var o,r,a,s=i||e[e.length-1],l=e[s.index+1],c=0;for(a=0;t.length>a;a++)o=t[a],this._isColumnVisible(o)&&(r={title:o.title||o.field,colSpan:0},s.cells.push(r),o.columns&&o.columns.length&&(l||(l={rowSpan:0,cells:[],index:e.length},e.push(l)),r.colSpan=this._trimColumns(this._visibleColumns(o.columns)).length,this._prepareHeaderRows(e,o.columns,r,l),c+=r.colSpan-1,s.rowSpan=e.length-s.index));n&&(n.colSpan+=c)},_rows:function(){var t,n,i=this.dataSource.group(),o=this._dataRows(this.dataSource.view(),0);return this.columns.length&&(this._prependHeaderRows(o),t=!1,n=e.map(this.columns,e.proxy(function(n){if(n.footerTemplate){t=!0;var i=this.dataSource.aggregates();return{background:"#dfdfdf",color:"#333",value:n.footerTemplate(e.extend({},i,i[n.field]))}}return{background:"#dfdfdf",color:"#333"}},this)),t&&o.push({type:"footer",cells:e.map(Array(i.length),function(){return{background:"#dfdfdf",color:"#333"}}).concat(n)})),o},_headerDepth:function(e){var t,n,i=1,o=0;for(t=0;e.length>t;t++)e[t].columns&&(n=this._headerDepth(e[t].columns),n>o&&(o=n));return i+o},_freezePane:function(){var t=this._visibleColumns(this.options.columns||[]),n=this._visibleColumns(this._trimColumns(this._leafColumns(e.grep(t,function(e){return e.locked})))).length;return{rowSplit:this._headerDepth(t),colSplit:n?n+this.dataSource.group().length:0}},_cell:function(e,t){return{value:t.value(e)}},_hierarchical:function(){return this.options.hierarchy&&this.dataSource.level},_depth:function(){var e,t,n,i=this.dataSource,o=0;if(this._hierarchical()){for(e=i.view(),t=0;e.length>t;t++)n=i.level(e[t]),n>o&&(o=n);o++}else o=i.group().length;return o},_columns:function(){var t=this._depth(),n=e.map(Array(t),function(){return{width:20}});return n.concat(e.map(this.columns,function(e){return{width:parseInt(e.width,10),autoWidth:!e.width}}))}}),t.ExcelMixin={extend:function(t){t.events.push("excelExport"),t.options.excel=e.extend(t.options.excel,this.options),t.saveAsExcel=this.saveAsExcel},options:{proxyURL:"",allPages:!1,filterable:!1,fileName:"Export.xlsx"},saveAsExcel:function(){var n=this.options.excel||{},i=new t.ExcelExporter({columns:this.columns,dataSource:this.dataSource,allPages:n.allPages,filterable:n.filterable,hierarchy:n.hierarchy});i.workbook().then(e.proxy(function(e,i){if(!this.trigger("excelExport",{workbook:e,data:i})){var o=new t.ooxml.Workbook(e);t.saveAs({dataURI:o.toDataURL(),fileName:e.fileName||n.fileName,proxyURL:n.proxyURL,forceProxy:n.forceProxy})}},this))}}}(kendo.jQuery,kendo),kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.data.signalr.min",["kendo.data.min"],e)}(function(){return function(e){var t=kendo.data.RemoteTransport.extend({init:function(e){var t,n=e&&e.signalr?e.signalr:{},i=n.promise;if(!i)throw Error('The "promise" option must be set.');if("function"!=typeof i.done||"function"!=typeof i.fail)throw Error('The "promise" option must be a Promise.');if(this.promise=i,t=n.hub,!t)throw Error('The "hub" option must be set.');if("function"!=typeof t.on||"function"!=typeof t.invoke)throw Error('The "hub" option is not a valid SignalR hub proxy.');this.hub=t,kendo.data.RemoteTransport.fn.init.call(this,e)},push:function(e){var t=this.options.signalr.client||{};t.create&&this.hub.on(t.create,e.pushCreate),t.update&&this.hub.on(t.update,e.pushUpdate),t.destroy&&this.hub.on(t.destroy,e.pushDestroy)},_crud:function(t,n){var i,o,r=this.hub,a=this.options.signalr.server;if(!a||!a[n])throw Error(kendo.format('The "server.{0}" option must be set.',n));i=[a[n]],o=this.parameterMap(t.data,n),e.isEmptyObject(o)||i.push(o),this.promise.done(function(){r.invoke.apply(r,i).done(t.success).fail(t.error)})},read:function(e){this._crud(e,"read")},create:function(e){this._crud(e,"create")},update:function(e){this._crud(e,"update")},destroy:function(e){this._crud(e,"destroy")}});e.extend(!0,kendo.data,{transports:{signalr:t}})}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.color.min",["kendo.core.min"],e)}(function(){!function(e,t,n){function i(e,o){var r,s;if(null==e||"none"==e)return null;if(e instanceof l)return e;if(e=e.toLowerCase(),r=a.exec(e))return e="transparent"==r[1]?new c(1,1,1,0):i(f.namedColors[r[1]],o),e.match=[r[1]],e;if((r=/^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\b/i.exec(e))?s=new d(n(r[1],16),n(r[2],16),n(r[3],16),1):(r=/^#?([0-9a-f])([0-9a-f])([0-9a-f])\b/i.exec(e))?s=new d(n(r[1]+r[1],16),n(r[2]+r[2],16),n(r[3]+r[3],16),1):(r=/^rgb\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/.exec(e))?s=new d(n(r[1],10),n(r[2],10),n(r[3],10),1):(r=/^rgba\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9.]+)\s*\)/.exec(e))?s=new d(n(r[1],10),n(r[2],10),n(r[3],10),t(r[4])):(r=/^rgb\(\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9]*\.?[0-9]+)%\s*\)/.exec(e))?s=new c(t(r[1])/100,t(r[2])/100,t(r[3])/100,1):(r=/^rgba\(\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9.]+)\s*\)/.exec(e))&&(s=new c(t(r[1])/100,t(r[2])/100,t(r[3])/100,t(r[4]))),s)s.match=r;else if(!o)throw Error("Cannot parse color: "+e);return s}function o(e,t,n){for(n||(n="0"),e=e.toString(16);t>e.length;)e="0"+e;return e}function r(e,t,n){return 0>n&&(n+=1),n>1&&(n-=1),1/6>n?e+6*(t-e)*n:.5>n?t:2/3>n?e+(t-e)*(2/3-n)*6:e}var a,s,l,c,d,u,h,f=function(e){var t,n,i,o,r,a=this,s=f.formats;if(1===arguments.length)for(e=a.resolveColor(e),o=0;s.length>o;o++)t=s[o].re,n=s[o].process,i=t.exec(e),i&&(r=n(i),a.r=r[0],a.g=r[1],a.b=r[2]);else a.r=arguments[0],a.g=arguments[1],a.b=arguments[2];a.r=a.normalizeByte(a.r),a.g=a.normalizeByte(a.g),a.b=a.normalizeByte(a.b)};f.prototype={toHex:function(){var e=this,t=e.padDigit,n=e.r.toString(16),i=e.g.toString(16),o=e.b.toString(16);return"#"+t(n)+t(i)+t(o)},resolveColor:function(e){return e=e||"black","#"==e.charAt(0)&&(e=e.substr(1,6)),e=e.replace(/ /g,""),e=e.toLowerCase(),e=f.namedColors[e]||e},normalizeByte:function(e){return 0>e||isNaN(e)?0:e>255?255:e},padDigit:function(e){return 1===e.length?"0"+e:e},brightness:function(e){var t=this,n=Math.round;return t.r=n(t.normalizeByte(t.r*e)),t.g=n(t.normalizeByte(t.g*e)),t.b=n(t.normalizeByte(t.b*e)),t},percBrightness:function(){var e=this;return Math.sqrt(.241*e.r*e.r+.691*e.g*e.g+.068*e.b*e.b)}},f.formats=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,process:function(e){return[n(e[1],10),n(e[2],10),n(e[3],10)]}},{re:/^(\w{2})(\w{2})(\w{2})$/,process:function(e){return[n(e[1],16),n(e[2],16),n(e[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,process:function(e){return[n(e[1]+e[1],16),n(e[2]+e[2],16),n(e[3]+e[3],16)]; +}}],f.namedColors={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",darkgrey:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",grey:"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",lightgray:"d3d3d3",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"778899",lightslategrey:"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",slategrey:"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"},a=["transparent"];for(s in f.namedColors)f.namedColors.hasOwnProperty(s)&&a.push(s);a=RegExp("^("+a.join("|")+")(\\W|$)","i"),l=kendo.Class.extend({toHSV:function(){return this},toRGB:function(){return this},toHex:function(){return this.toBytes().toHex()},toBytes:function(){return this},toCss:function(){return"#"+this.toHex()},toCssRgba:function(){var e=this.toBytes();return"rgba("+e.r+", "+e.g+", "+e.b+", "+t((+this.a).toFixed(3))+")"},toDisplay:function(){return kendo.support.browser.msie&&kendo.support.browser.version<9?this.toCss():this.toCssRgba()},equals:function(e){return e===this||null!==e&&this.toCssRgba()==i(e).toCssRgba()},diff:function(e){if(null==e)return NaN;var t=this.toBytes();return e=e.toBytes(),Math.sqrt(Math.pow(.3*(t.r-e.r),2)+Math.pow(.59*(t.g-e.g),2)+Math.pow(.11*(t.b-e.b),2))},clone:function(){var e=this.toBytes();return e===this&&(e=new d(e.r,e.g,e.b,e.a)),e}}),c=l.extend({init:function(e,t,n,i){this.r=e,this.g=t,this.b=n,this.a=i},toHSV:function(){var e,t,n=this.r,i=this.g,o=this.b,r=Math.min(n,i,o),a=Math.max(n,i,o),s=a,l=a-r;return 0===l?new u(0,0,s,this.a):(0!==a?(t=l/a,e=n==a?(i-o)/l:i==a?2+(o-n)/l:4+(n-i)/l,e*=60,0>e&&(e+=360)):(t=0,e=-1),new u(e,t,s,this.a))},toHSL:function(){var e,t,n,i=this.r,o=this.g,r=this.b,a=Math.max(i,o,r),s=Math.min(i,o,r),l=(a+s)/2;if(a==s)e=t=0;else{switch(n=a-s,t=l>.5?n/(2-a-s):n/(a+s),a){case i:e=(o-r)/n+(r>o?6:0);break;case o:e=(r-i)/n+2;break;case r:e=(i-o)/n+4}e*=60,t*=100,l*=100}return new h(e,t,l,this.a)},toBytes:function(){return new d(255*this.r,255*this.g,255*this.b,this.a)}}),d=c.extend({init:function(e,t,n,i){this.r=Math.round(e),this.g=Math.round(t),this.b=Math.round(n),this.a=i},toRGB:function(){return new c(this.r/255,this.g/255,this.b/255,this.a)},toHSV:function(){return this.toRGB().toHSV()},toHSL:function(){return this.toRGB().toHSL()},toHex:function(){return o(this.r,2)+o(this.g,2)+o(this.b,2)},toBytes:function(){return this}}),u=l.extend({init:function(e,t,n,i){this.h=e,this.s=t,this.v=n,this.a=i},toRGB:function(){var e,t,n,i,o,r,a,s,l=this.h,d=this.s,u=this.v;if(0===d)t=n=i=u;else switch(l/=60,e=Math.floor(l),o=l-e,r=u*(1-d),a=u*(1-d*o),s=u*(1-d*(1-o)),e){case 0:t=u,n=s,i=r;break;case 1:t=a,n=u,i=r;break;case 2:t=r,n=u,i=s;break;case 3:t=r,n=a,i=u;break;case 4:t=s,n=r,i=u;break;default:t=u,n=r,i=a}return new c(t,n,i,this.a)},toHSL:function(){return this.toRGB().toHSL()},toBytes:function(){return this.toRGB().toBytes()}}),h=l.extend({init:function(e,t,n,i){this.h=e,this.s=t,this.l=n,this.a=i},toRGB:function(){var e,t,n,i,o,a=this.h,s=this.s,l=this.l;return 0===s?e=t=n=l:(a/=360,s/=100,l/=100,i=.5>l?l*(1+s):l+s-l*s,o=2*l-i,e=r(o,i,a+1/3),t=r(o,i,a),n=r(o,i,a-1/3)),new c(e,t,n,this.a)},toHSV:function(){return this.toRGB().toHSV()},toBytes:function(){return this.toRGB().toBytes()}}),f.fromBytes=function(e,t,n,i){return new d(e,t,n,null!=i?i:1)},f.fromRGB=function(e,t,n,i){return new c(e,t,n,null!=i?i:1)},f.fromHSV=function(e,t,n,i){return new u(e,t,n,null!=i?i:1)},f.fromHSL=function(e,t,n,i){return new h(e,t,n,null!=i?i:1)},kendo.Color=f,kendo.parseColor=i}(window.kendo.jQuery,parseFloat,parseInt)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("util/main.min",["kendo.core.min"],e)}(function(){return function(){function e(e){return typeof e!==N}function t(e,t){var i=n(t);return F.round(e*i)/i}function n(e){return e?F.pow(10,e):1}function i(e,t,n){return F.max(F.min(e,n),t)}function o(e){return e*B}function r(e){return e/B}function a(e){return"number"==typeof e&&!isNaN(e)}function s(t,n){return e(t)?t:n}function l(e){return e*e}function c(e){var t,n=[];for(t in e)n.push(t+e[t]);return n.sort().join("")}function d(e){var t,n=2166136261;for(t=0;e.length>t;++t)n+=(n<<1)+(n<<4)+(n<<7)+(n<<8)+(n<<24),n^=e.charCodeAt(t);return n>>>0}function u(e){return d(c(e))}function h(e){var t,n=e.length,i=L,o=H;for(t=0;n>t;t++)o=F.max(o,e[t]),i=F.min(i,e[t]);return{min:i,max:o}}function f(e){return h(e).min}function p(e){return h(e).max}function m(e){return v(e).min}function g(e){return v(e).max}function v(e){var t,n,i,o=L,r=H;for(t=0,n=e.length;n>t;t++)i=e[t],null!==i&&isFinite(i)&&(o=F.min(o,i),r=F.max(r,i));return{min:o===L?void 0:o,max:r===H?void 0:r}}function _(e){return e?e[e.length-1]:void 0}function b(e,t){return e.push.apply(e,t),e}function w(e){return z.template(e,{useWithBlock:!1,paramName:"d"})}function y(t,n){return e(n)&&null!==n?" "+t+"='"+n+"' ":""}function k(e){var t,n="";for(t=0;e.length>t;t++)n+=y(e[t][0],e[t][1]);return n}function x(t){var n,i,o="";for(n=0;t.length>n;n++)i=t[n][1],e(i)&&(o+=t[n][0]+":"+i+";");return""!==o?o:void 0}function C(e){return"string"!=typeof e&&(e+="px"),e}function S(e){var t,n,i=[];if(e)for(t=z.toHyphens(e).split("-"),n=0;t.length>n;n++)i.push("k-pos-"+t[n]);return i.join(" ")}function T(t){return""===t||null===t||"none"===t||"transparent"===t||!e(t)}function D(e){for(var t={1:"i",10:"x",100:"c",2:"ii",20:"xx",200:"cc",3:"iii",30:"xxx",300:"ccc",4:"iv",40:"xl",400:"cd",5:"v",50:"l",500:"d",6:"vi",60:"lx",600:"dc",7:"vii",70:"lxx",700:"dcc",8:"viii",80:"lxxx",800:"dccc",9:"ix",90:"xc",900:"cm",1e3:"m"},n=[1e3,900,800,700,600,500,400,300,200,100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1],i="";e>0;)n[0]>e?n.shift():(i+=t[n[0]],e-=n[0]);return i}function A(e){var t,n,i,o,r;for(e=e.toLowerCase(),t={i:1,v:5,x:10,l:50,c:100,d:500,m:1e3},n=0,i=0,o=0;e.length>o;++o){if(r=t[e.charAt(o)],!r)return null;n+=r,r>i&&(n-=2*i),i=r}return n}function E(e){var t=Object.create(null);return function(){var n,i="";for(n=arguments.length;--n>=0;)i+=":"+arguments[n];return i in t?t[i]:e.apply(this,arguments)}}function I(e){for(var t,n,i=[],o=0,r=e.length;r>o;)t=e.charCodeAt(o++),t>=55296&&56319>=t&&r>o?(n=e.charCodeAt(o++),56320==(64512&n)?i.push(((1023&t)<<10)+(1023&n)+65536):(i.push(t),o--)):i.push(t);return i}function R(e){return e.map(function(e){var t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+=String.fromCharCode(e)}).join("")}function M(e,t){function n(e,n){for(var i=[],o=0,r=0,a=0;e.length>o&&n.length>r;)t(e[o],n[r])<=0?i[a++]=e[o++]:i[a++]=n[r++];return e.length>o&&i.push.apply(i,e.slice(o)),n.length>r&&i.push.apply(i,n.slice(r)),i}return 2>e.length?e.slice():function i(e){var t,o,r;return 1>=e.length?e:(t=Math.floor(e.length/2),o=e.slice(0,t),r=e.slice(t),o=i(o),r=i(r),n(o,r))}(e)}var F=Math,z=window.kendo,P=z.deepExtend,B=F.PI/180,L=Number.MAX_VALUE,H=-Number.MAX_VALUE,N="undefined",O=Date.now;O||(O=function(){return(new Date).getTime()}),P(z,{util:{MAX_NUM:L,MIN_NUM:H,append:b,arrayLimits:h,arrayMin:f,arrayMax:p,defined:e,deg:r,hashKey:d,hashObject:u,isNumber:a,isTransparent:T,last:_,limitValue:i,now:O,objectKey:c,round:t,rad:o,renderAttr:y,renderAllAttr:k,renderPos:S,renderSize:C,renderStyle:x,renderTemplate:w,sparseArrayLimits:v,sparseArrayMin:m,sparseArrayMax:g,sqr:l,valueOrDefault:s,romanToArabic:A,arabicToRoman:D,memoize:E,ucs2encode:R,ucs2decode:I,mergeSort:M}}),z.drawing.util=z.util,z.dataviz.util=z.util}(),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("util/text-metrics.min",["kendo.core.min","util/main.min"],e)}(function(){!function(e){function t(){return{width:0,height:0,baseline:0}}function n(e,t,n){return u.current.measure(e,t,n)}function i(e,t){var n=[];if(e.length>0&&document.fonts){try{n=e.map(function(e){return document.fonts.load(e)})}catch(i){r.logToConsole(i)}Promise.all(n).then(t,t)}else t()}var o=document,r=window.kendo,a=r.Class,s=r.util,l=s.defined,c=a.extend({init:function(e){this._size=e,this._length=0,this._map={}},put:function(e,t){var n=this,i=n._map,o={key:e,value:t};i[e]=o,n._head?(n._tail.newer=o,o.older=n._tail,n._tail=o):n._head=n._tail=o,n._length>=n._size?(i[n._head.key]=null,n._head=n._head.newer,n._head.older=null):n._length++},get:function(e){var t=this,n=t._map[e];return n?(n===t._head&&n!==t._tail&&(t._head=n.newer,t._head.older=null),n!==t._tail&&(n.older&&(n.older.newer=n.newer,n.newer.older=n.older),n.older=t._tail,n.newer=null,t._tail.newer=n,t._tail=n),n.value):void 0}}),d=e("
        ")[0],u=a.extend({init:function(e){this._cache=new c(1e3),this._initOptions(e)},options:{baselineMarkerSize:1},measure:function(n,i,r){var a,c,u,h,f,p,m,g;if(!n)return t();if(a=s.objectKey(i),c=s.hashKey(n+a),u=this._cache.get(c),u)return u;h=t(),f=r?r:d,p=this._baselineMarker().cloneNode(!1);for(m in i)g=i[m],l(g)&&(f.style[m]=g);return e(f).text(n),f.appendChild(p),o.body.appendChild(f),(n+"").length&&(h.width=f.offsetWidth-this.options.baselineMarkerSize,h.height=f.offsetHeight,h.baseline=p.offsetTop+this.options.baselineMarkerSize),h.width>0&&h.height>0&&this._cache.put(c,h),f.parentNode.removeChild(f),h},_baselineMarker:function(){return e("
        ")[0]}});u.current=new u,r.util.TextMetrics=u,r.util.LRUCache=c,r.util.loadFonts=i,r.util.measureText=n}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("util/base64.min",["util/main.min"],e)}(function(){return function(){function e(e){var n,i,o,a,s,l,c,d="",u=0;for(e=t(e);e.length>u;)n=e.charCodeAt(u++),i=e.charCodeAt(u++),o=e.charCodeAt(u++),a=n>>2,s=(3&n)<<4|i>>4,l=(15&i)<<2|o>>6,c=63&o,isNaN(i)?l=c=64:isNaN(o)&&(c=64),d=d+r.charAt(a)+r.charAt(s)+r.charAt(l)+r.charAt(c);return d}function t(e){var t,n,i="";for(t=0;e.length>t;t++)n=e.charCodeAt(t),128>n?i+=o(n):2048>n?(i+=o(192|n>>>6),i+=o(128|63&n)):65536>n&&(i+=o(224|n>>>12),i+=o(128|n>>>6&63),i+=o(128|63&n));return i}var n=window.kendo,i=n.deepExtend,o=String.fromCharCode,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";i(n.util,{encodeBase64:e,encodeUTF8:t})}(),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("mixins/observers.min",["kendo.core.min"],e)}(function(){return function(e){var t=Math,n=window.kendo,i=n.deepExtend,o=e.inArray,r={observers:function(){return this._observers=this._observers||[]},addObserver:function(e){return this._observers?this._observers.push(e):this._observers=[e],this},removeObserver:function(e){var t=this.observers(),n=o(e,t);return-1!=n&&t.splice(n,1),this},trigger:function(e,t){var n,i,o=this._observers;if(o&&!this._suspended)for(i=0;o.length>i;i++)n=o[i],n[e]&&n[e](t);return this},optionsChange:function(e){e=e||{},e.element=this,this.trigger("optionsChange",e)},geometryChange:function(){this.trigger("geometryChange",{element:this})},suspend:function(){return this._suspended=(this._suspended||0)+1,this},resume:function(){return this._suspended=t.max((this._suspended||0)-1,0),this},_observerField:function(e,t){this[e]&&this[e].removeObserver(this),this[e]=t,t.addObserver(this)}};i(n,{mixins:{ObserversMixin:r}})}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("drawing/geometry.min",["util/main.min","mixins/observers.min"],e)}(function(){return function(){function e(e){return null===e?null:e instanceof D?e:new D(e)}function t(e){return e&&R.isFunction(e.matrix)?e.matrix():e}function n(e,t,n,i){var o=0,r=0;return i&&(o=E.atan2(i.c*n,i.a*t),0!==i.b&&(r=E.atan2(i.d*n,i.b*t))),{x:o,y:r}}function i(e,t){for(;t>e;)e+=90;return e}function o(e,t){var n,i,o;for(n=0;t.length>n;n++)i=t[n],o=i.charAt(0).toUpperCase()+i.substring(1,i.length),e["set"+o]=r(i),e["get"+o]=a(i)}function r(e){return function(t){return this[e]!==t&&(this[e]=t,this.geometryChange()),this}}function a(e){return function(){return this[e]}}function s(e,t,n){e>t&&(t+=360);var i=E.abs(t-e);return n||(i=360-i),i}function l(e,t,n,i,o,r){var a=N((o-e)/n,3),s=N((r-t)/i,3);return N(H(E.atan2(s,a)))}function c(e,t,n,i,o,r,a,c){var d,u,h,f,p,m,g,v,_,b,w,y,k,x,C,S,T,D;if(t!==i)_=n-e,b=i-t,w=I(o,2),y=I(r,2),k=(y*_*(e+n)+w*b*(t+i))/(2*w*b),x=k-i,C=-(_*y)/(w*b),p=1/w+I(C,2)/y,m=2*(C*x/y-n/w),g=I(n,2)/w+I(x,2)/y-1,v=E.sqrt(I(m,2)-4*p*g),d=(-m-v)/(2*p),u=k+C*d,h=(-m+v)/(2*p),f=k+C*h;else{if(e===n)return!1;m=-2*i,g=I((n-e)*r/(2*o),2)+I(i,2)-I(r,2),v=E.sqrt(I(m,2)-4*g),d=h=(e+n)/2,u=(-m-v)/2,f=(-m+v)/2}return S=l(d,u,o,r,e,t),T=l(d,u,o,r,n,i),D=s(S,T,c),(a&&180>=D||!a&&D>180)&&(d=h,u=f,S=l(d,u,o,r,e,t),T=l(d,u,o,r,n,i)),{center:new j(d,u),startAngle:S,endAngle:T}}function d(e,t,n,i){if(0===e)return y(t,n,i);var o,r,a,s,l,c,d,u=(3*e*n-E.pow(t,2))/(3*E.pow(e,2)),h=(2*E.pow(t,3)-9*e*t*n+27*E.pow(e,2)*i)/(27*E.pow(e,3)),f=E.pow(u/3,3)+E.pow(h/2,2),p=new A(0,1),m=-t/(3*e),g=[];return 0>f?(o=new A(-h/2,E.sqrt(-f)).nthRoot(3),r=new A(-h/2,-E.sqrt(-f)).nthRoot(3)):(o=-h/2+E.sqrt(f),o=new A(_(o)*E.pow(E.abs(o),1/3)),r=-h/2-E.sqrt(f),r=new A(_(r)*E.pow(E.abs(r),1/3))),a=o.add(r),c=o.add(r).multiplyConstant(-0.5),d=o.add(r.negate()).multiplyConstant(E.sqrt(3)/2),s=c.add(p.multiply(d)),l=c.add(p.negate().multiply(d)),a.isReal()&&g.push(N(a.real+m,U)),s.isReal()&&g.push(N(s.real+m,U)),l.isReal()&&g.push(N(l.real+m,U)),g}function u(e,t){return[-e[0][t]+3*e[1][t]-3*e[2][t]+e[3][t],3*(e[0][t]-2*e[1][t]+e[2][t]),3*(-e[0][t]+e[1][t]),e[0][t]]}function h(e,t,n){var i=1-e;return E.pow(i,3)*n[0][t]+3*E.pow(i,2)*e*n[1][t]+3*E.pow(e,2)*i*n[2][t]+E.pow(e,3)*n[3][t]}function f(e,t,n){var i,o,r,a=u(e,"x"),s=d(a[0],a[1],a[2],a[3]-t.x),l=0;for(r=0;s.length>r;r++)i=h(s[r],"y",e),o=g(i,t.y)||i>t.y,o&&((0===s[r]||1===s[r])&&n.bottomRight().x>t.x||s[r]>0&&1>s[r])&&l++;return l}function p(e,t,n){var i,o,r,a,s,l;return e.x!=t.x&&(o=E.min(e.x,t.x),r=E.max(e.x,t.x),a=E.min(e.y,t.y),s=E.max(e.y,t.y),l=n.x>=o&&r>n.x,i=a==s?a>=n.y&&l:l&&(s-a)*((e.x-t.x)*(e.y-t.y)>0?n.x-o:r-n.x)/(r-o)+a-n.y>=0),i?1:0}function m(e,t,n,i){var o=t.x-e.x,r=i.x-n.x,a=t.y-e.y,s=i.y-n.y,l=e.x-n.x,c=e.y-n.y,d=o*s-r*a,u=(o*c-a*l)/d,h=(r*c-s*l)/d;return u>=0&&1>=u&&h>=0&&1>=h?new j(e.x+h*o,e.y+h*a):void 0}function g(e,t,n){return 0===N(E.abs(e-t),n||U)}function v(e,t,n){return t>e||g(e,t,n)}function _(e){return 0>e?-1:1}function b(t,n,i){var o=P.deg(E.atan2(n.y-t.y,n.x-t.x)),r=i.transformCopy(e().rotate(-o,t));return t.x>r.x}function w(e,t,n,i,o){var r,a,s=u(e,i),l=d(s[0],s[1],s[2],s[3]-t[i]);for(a=0;l.length>a;a++)if(l[a]>=0&&1>=l[a]&&(r=h(l[a],n,e),E.abs(r-t[n])<=o))return!0}function y(e,t,n){var i=E.sqrt(E.pow(t,2)-4*e*n);return[(-t+i)/(2*e),(-t-i)/(2*e)]}var k,x,C,S,T,D,A,E=Math,I=E.pow,R=window.kendo,M=R.Class,F=R.deepExtend,z=R.mixins.ObserversMixin,P=R.util,B=P.defined,L=P.rad,H=P.deg,N=P.round,O=E.PI/2,V=P.MIN_NUM,W=P.MAX_NUM,U=10,j=M.extend({init:function(e,t){this.x=e||0,this.y=t||0},equals:function(e){return e&&e.x===this.x&&e.y===this.y},clone:function(){return new j(this.x,this.y)},rotate:function(t,n){return this.transform(e().rotate(t,n))},translate:function(e,t){return this.x+=e,this.y+=t,this.geometryChange(),this},translateWith:function(e){return this.translate(e.x,e.y)},move:function(e,t){return this.x=this.y=0,this.translate(e,t)},scale:function(e,t){return B(t)||(t=e),this.x*=e,this.y*=t,this.geometryChange(),this},scaleCopy:function(e,t){return this.clone().scale(e,t)},transform:function(e){var n=t(e),i=this.x,o=this.y;return this.x=n.a*i+n.c*o+n.e,this.y=n.b*i+n.d*o+n.f,this.geometryChange(),this},transformCopy:function(e){var t=this.clone();return e&&t.transform(e),t},distanceTo:function(e){var t=this.x-e.x,n=this.y-e.y;return E.sqrt(t*t+n*n)},round:function(e){return this.x=N(this.x,e),this.y=N(this.y,e),this.geometryChange(),this},toArray:function(e){var t=B(e),n=t?N(this.x,e):this.x,i=t?N(this.y,e):this.y;return[n,i]}});o(j.fn,["x","y"]),F(j.fn,z),j.fn.toString=function(e,t){var n=this.x,i=this.y;return B(e)&&(n=N(n,e),i=N(i,e)),t=t||" ",n+t+i},j.create=function(e,t){return B(e)?e instanceof j?e:1===arguments.length&&2===e.length?new j(e[0],e[1]):new j(e,t):void 0},j.min=function(){var e,t,n=P.MAX_NUM,i=P.MAX_NUM;for(e=0;arguments.length>e;e++)t=arguments[e],n=E.min(t.x,n),i=E.min(t.y,i);return new j(n,i)},j.max=function(){var e,t,n=P.MIN_NUM,i=P.MIN_NUM;for(e=0;arguments.length>e;e++)t=arguments[e],n=E.max(t.x,n),i=E.max(t.y,i);return new j(n,i)},j.minPoint=function(){return new j(V,V)},j.maxPoint=function(){return new j(W,W)},j.ZERO=new j(0,0),k=M.extend({init:function(e,t){this.width=e||0,this.height=t||0},equals:function(e){return e&&e.width===this.width&&e.height===this.height},clone:function(){return new k(this.width,this.height)},toArray:function(e){var t=B(e),n=t?N(this.width,e):this.width,i=t?N(this.height,e):this.height;return[n,i]}}),o(k.fn,["width","height"]),F(k.fn,z),k.create=function(e,t){return B(e)?e instanceof k?e:1===arguments.length&&2===e.length?new k(e[0],e[1]):new k(e,t):void 0},k.ZERO=new k(0,0),x=M.extend({init:function(e,t){this.setOrigin(e||new j),this.setSize(t||new k)},clone:function(){return new x(this.origin.clone(),this.size.clone())},equals:function(e){return e&&e.origin.equals(this.origin)&&e.size.equals(this.size)},setOrigin:function(e){return this._observerField("origin",j.create(e)),this.geometryChange(),this},getOrigin:function(){return this.origin},setSize:function(e){return this._observerField("size",k.create(e)),this.geometryChange(),this},getSize:function(){return this.size},width:function(){return this.size.width},height:function(){return this.size.height},topLeft:function(){return this.origin.clone()},bottomRight:function(){return this.origin.clone().translate(this.width(),this.height())},topRight:function(){return this.origin.clone().translate(this.width(),0)},bottomLeft:function(){return this.origin.clone().translate(0,this.height())},center:function(){return this.origin.clone().translate(this.width()/2,this.height()/2)},bbox:function(e){var t=this.topLeft().transformCopy(e),n=this.topRight().transformCopy(e),i=this.bottomRight().transformCopy(e),o=this.bottomLeft().transformCopy(e);return x.fromPoints(t,n,i,o)},transformCopy:function(e){return x.fromPoints(this.topLeft().transform(e),this.bottomRight().transform(e))},expand:function(e,t){return B(t)||(t=e),this.size.width+=2*e,this.size.height+=2*t,this.origin.translate(-e,-t),this},expandCopy:function(e,t){return this.clone().expand(e,t)},containsPoint:function(e){var t=this.origin,n=this.bottomRight();return!(t.x>e.x||t.y>e.y||e.x>n.x||e.y>n.y)},_isOnPath:function(e,t){var n=this.expandCopy(t,t),i=this.expandCopy(-t,-t);return n.containsPoint(e)&&!i.containsPoint(e)}}),F(x.fn,z),x.fromPoints=function(){var e=j.min.apply(this,arguments),t=j.max.apply(this,arguments),n=new k(t.x-e.x,t.y-e.y);return new x(e,n)},x.union=function(e,t){return x.fromPoints(j.min(e.topLeft(),t.topLeft()),j.max(e.bottomRight(),t.bottomRight()))},x.intersect=function(e,t){return e={left:e.topLeft().x,top:e.topLeft().y,right:e.bottomRight().x,bottom:e.bottomRight().y},t={left:t.topLeft().x,top:t.topLeft().y,right:t.bottomRight().x,bottom:t.bottomRight().y},t.right>=e.left&&e.right>=t.left&&t.bottom>=e.top&&e.bottom>=t.top?x.fromPoints(new j(E.max(e.left,t.left),E.max(e.top,t.top)),new j(E.min(e.right,t.right),E.min(e.bottom,t.bottom))):void 0},C=M.extend({init:function(e,t){this.setCenter(e||new j),this.setRadius(t||0)},setCenter:function(e){return this._observerField("center",j.create(e)),this.geometryChange(),this},getCenter:function(){return this.center},equals:function(e){return e&&e.center.equals(this.center)&&e.radius===this.radius},clone:function(){return new C(this.center.clone(),this.radius)},pointAt:function(e){return this._pointAt(L(e))},bbox:function(e){var t,i,o,r,a=j.maxPoint(),s=j.minPoint(),l=n(this.center,this.radius,this.radius,e);for(t=0;4>t;t++)i=this._pointAt(l.x+t*O).transformCopy(e),o=this._pointAt(l.y+t*O).transformCopy(e),r=new j(i.x,o.y),a=j.min(a,r),s=j.max(s,r);return x.fromPoints(a,s)},_pointAt:function(e){var t=this.center,n=this.radius;return new j(t.x-n*E.cos(e),t.y-n*E.sin(e))},containsPoint:function(e){var t=this.center,n=E.pow(e.x-t.x,2)+E.pow(e.y-t.y,2)<=E.pow(this.radius,2);return n},_isOnPath:function(e,t){var n=this.center,i=this.radius,o=n.distanceTo(e);return o>=i-t&&i+t>=o}}),o(C.fn,["radius"]),F(C.fn,z),S=M.extend({init:function(e,t){this.setCenter(e||new j),t=t||{},this.radiusX=t.radiusX,this.radiusY=t.radiusY||t.radiusX,this.startAngle=t.startAngle,this.endAngle=t.endAngle,this.anticlockwise=t.anticlockwise||!1},clone:function(){return new S(this.center,{radiusX:this.radiusX,radiusY:this.radiusY,startAngle:this.startAngle,endAngle:this.endAngle,anticlockwise:this.anticlockwise})},setCenter:function(e){return this._observerField("center",j.create(e)),this.geometryChange(),this},getCenter:function(){return this.center},MAX_INTERVAL:45,pointAt:function(e){var t=this.center,n=L(e);return new j(t.x+this.radiusX*E.cos(n),t.y+this.radiusY*E.sin(n))},curvePoints:function(){var e,t,n,i=this.startAngle,o=this.anticlockwise?-1:1,r=[this.pointAt(i)],a=i,s=this._arcInterval(),l=s.endAngle-s.startAngle,c=E.ceil(l/this.MAX_INTERVAL),d=l/c;for(e=1;c>=e;e++)t=a+o*d,n=this._intervalCurvePoints(a,t),r.push(n.cp1,n.cp2,n.p2),a=t;return r},bbox:function(e){for(var t,o,r=this,a=r._arcInterval(),s=a.startAngle,l=a.endAngle,c=n(this.center,this.radiusX,this.radiusY,e),d=H(c.x),u=H(c.y),h=r.pointAt(s).transformCopy(e),f=r.pointAt(l).transformCopy(e),p=j.min(h,f),m=j.max(h,f),g=i(d,s),v=i(u,s);l>g||l>v;)l>g&&(t=r.pointAt(g).transformCopy(e),g+=90),l>v&&(o=r.pointAt(v).transformCopy(e),v+=90),h=new j(t.x,o.y),p=j.min(p,h),m=j.max(m,h);return x.fromPoints(p,m)},_arcInterval:function(){var e,t=this.startAngle,n=this.endAngle,i=this.anticlockwise;return i&&(e=t,t=n,n=e),(t>n||i&&t===n)&&(n+=360),{startAngle:t,endAngle:n}},_intervalCurvePoints:function(e,t){var n=this,i=n.pointAt(e),o=n.pointAt(t),r=n._derivativeAt(e),a=n._derivativeAt(t),s=(L(t)-L(e))/3,l=new j(i.x+s*r.x,i.y+s*r.y),c=new j(o.x-s*a.x,o.y-s*a.y);return{p1:i,cp1:l,cp2:c,p2:o}},_derivativeAt:function(e){var t=this,n=L(e);return new j(-t.radiusX*E.sin(n),t.radiusY*E.cos(n))},containsPoint:function(e){var t,n,i,o=this._arcInterval(),r=o.endAngle-o.startAngle,a=this.center,s=a.distanceTo(e),c=E.atan2(e.y-a.y,e.x-a.x),d=this.radiusX*this.radiusY/E.sqrt(E.pow(this.radiusX,2)*E.pow(E.sin(c),2)+E.pow(this.radiusY,2)*E.pow(E.cos(c),2)),u=this.pointAt(this.startAngle).round(U),h=this.pointAt(this.endAngle).round(U),f=m(a,e.round(U),u,h);return 180>r?t=f&&v(a.distanceTo(f),s)&&v(s,d):(n=l(a.x,a.y,this.radiusX,this.radiusY,e.x,e.y),360!=n&&(n=(360+n)%360),i=n>=o.startAngle&&o.endAngle>=n,t=i&&v(s,d)||!i&&(!f||f.equals(e))),t},_isOnPath:function(e,t){var n,i=this._arcInterval(),o=this.center,r=l(o.x,o.y,this.radiusX,this.radiusY,e.x,e.y);return 360!=r&&(r=(360+r)%360),n=r>=i.startAngle&&i.endAngle>=r,n&&this.pointAt(r).distanceTo(e)<=t}}),o(S.fn,["radiusX","radiusY","startAngle","endAngle","anticlockwise"]),F(S.fn,z),S.fromPoints=function(e,t,n,i,o,r){var a=c(e.x,e.y,t.x,t.y,n,i,o,r);return new S(a.center,{startAngle:a.startAngle,endAngle:a.endAngle,radiusX:n,radiusY:i,anticlockwise:0===r})},T=M.extend({init:function(e,t,n,i,o,r){this.a=e||0,this.b=t||0,this.c=n||0,this.d=i||0,this.e=o||0,this.f=r||0},multiplyCopy:function(e){return new T(this.a*e.a+this.c*e.b,this.b*e.a+this.d*e.b,this.a*e.c+this.c*e.d,this.b*e.c+this.d*e.d,this.a*e.e+this.c*e.f+this.e,this.b*e.e+this.d*e.f+this.f)},invert:function(){var e=this.a,t=this.b,n=this.c,i=this.d,o=this.e,r=this.f,a=e*i-t*n;return 0===a?null:new T(i/a,-t/a,-n/a,e/a,(n*r-i*o)/a,(t*o-e*r)/a)},clone:function(){return new T(this.a,this.b,this.c,this.d,this.e,this.f)},equals:function(e){return e?this.a===e.a&&this.b===e.b&&this.c===e.c&&this.d===e.d&&this.e===e.e&&this.f===e.f:!1},round:function(e){return this.a=N(this.a,e),this.b=N(this.b,e),this.c=N(this.c,e),this.d=N(this.d,e),this.e=N(this.e,e),this.f=N(this.f,e),this},toArray:function(e){var t,n=[this.a,this.b,this.c,this.d,this.e,this.f];if(B(e))for(t=0;n.length>t;t++)n[t]=N(n[t],e);return n}}),T.fn.toString=function(e,t){return this.toArray(e).join(t||",")},T.translate=function(e,t){return new T(1,0,0,1,e,t)},T.unit=function(){return new T(1,0,0,1,0,0)},T.rotate=function(e,t,n){var i=new T;return i.a=E.cos(L(e)),i.b=E.sin(L(e)),i.c=-i.b,i.d=i.a,i.e=t-t*i.a+n*i.b||0,i.f=n-n*i.a-t*i.b||0,i},T.scale=function(e,t){return new T(e,0,0,t,0,0)},T.IDENTITY=T.unit(),D=M.extend({init:function(e){this._matrix=e||T.unit()},clone:function(){return new D(this._matrix.clone())},equals:function(e){return e&&e._matrix.equals(this._matrix)},_optionsChange:function(){this.optionsChange({field:"transform",value:this})},translate:function(e,t){return this._matrix=this._matrix.multiplyCopy(T.translate(e,t)),this._optionsChange(),this},scale:function(e,t,n){return B(t)||(t=e),n&&(n=j.create(n),this._matrix=this._matrix.multiplyCopy(T.translate(n.x,n.y))),this._matrix=this._matrix.multiplyCopy(T.scale(e,t)),n&&(this._matrix=this._matrix.multiplyCopy(T.translate(-n.x,-n.y))),this._optionsChange(),this},rotate:function(e,t){return t=j.create(t)||j.ZERO,this._matrix=this._matrix.multiplyCopy(T.rotate(e,t.x,t.y)),this._optionsChange(),this},multiply:function(e){var n=t(e);return this._matrix=this._matrix.multiplyCopy(n),this._optionsChange(),this},matrix:function(e){return e?(this._matrix=e,this._optionsChange(),this):this._matrix}}),F(D.fn,z),A=function(e,t){this.real=e||0,this.img=t||0},A.fn=A.prototype={add:function(e){return new A(N(this.real+e.real,U),N(this.img+e.img,U))},addConstant:function(e){return new A(this.real+e,this.img)},negate:function(){return new A(-this.real,-this.img)},multiply:function(e){return new A(this.real*e.real-this.img*e.img,this.real*e.img+this.img*e.real)},multiplyConstant:function(e){return new A(this.real*e,this.img*e)},nthRoot:function(e){var t=E.atan2(this.img,this.real),n=E.sqrt(E.pow(this.img,2)+E.pow(this.real,2)),i=E.pow(n,1/e);return new A(i*E.cos(t/e),i*E.sin(t/e))},equals:function(e){return this.real===e.real&&this.img===e.img},isReal:function(){return 0===this.img}},F(R,{geometry:{Arc:S,Circle:C,curveIntersectionsCount:f,lineIntersectionsCount:p,Matrix:T,Point:j,Rect:x,Size:k,Transformation:D,transform:e,toMatrix:t,isOutOfEndPoint:b,hasRootsInRange:w}}),R.dataviz.geometry=R.geometry}(),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.popup.min",["kendo.core.min"],e)}(function(){return function(e,t){function n(t,n){return t&&n?t===n||e.contains(t,n):!1}var i=window.kendo,o=i.ui,r=o.Widget,a=i.support,s=i.getOffset,l="open",c="close",d="deactivate",u="activate",h="center",f="left",p="right",m="top",g="bottom",v="absolute",_="hidden",b="body",w="location",y="position",k="visible",x="effects",C="k-state-active",S="k-state-border",T=/k-state-border-(\w+)/,D=".k-picker-wrap, .k-dropdown-wrap, .k-link",A="down",E=e(document.documentElement),I=e(window),R="scroll",M=a.transitions.css,F=M+"transform",z=e.extend,P=".kendoPopup",B=["font-size","font-family","font-stretch","font-style","font-weight","line-height"],L=r.extend({init:function(t,n){var o,s=this;n=n||{},n.isRtl&&(n.origin=n.origin||g+" "+p,n.position=n.position||m+" "+p),r.fn.init.call(s,t,n),t=s.element,n=s.options,s.collisions=n.collision?n.collision.split(" "):[],s.downEvent=i.applyEventMap(A,i.guid()),1===s.collisions.length&&s.collisions.push(s.collisions[0]),o=e(s.options.anchor).closest(".k-popup,.k-group").filter(":not([class^=km-])"),n.appendTo=e(e(n.appendTo)[0]||o[0]||b),s.element.hide().addClass("k-popup k-group k-reset").toggleClass("k-rtl",!!n.isRtl).css({position:v}).appendTo(n.appendTo).on("mouseenter"+P,function(){s._hovered=!0}).on("mouseleave"+P,function(){s._hovered=!1}),s.wrapper=e(),n.animation===!1&&(n.animation={open:{effects:{}},close:{hide:!0,effects:{}}}),z(n.animation.open,{complete:function(){s.wrapper.css({overflow:k}),s._activated=!0,s._trigger(u)}}),z(n.animation.close,{complete:function(){s._animationClose()}}),s._mousedownProxy=function(e){s._mousedown(e)},s._resizeProxy=a.mobileOS.android?function(e){setTimeout(function(){s._resize(e)},600)}:function(e){s._resize(e)},n.toggleTarget&&e(n.toggleTarget).on(n.toggleEvent+P,e.proxy(s.toggle,s))},events:[l,u,c,d],options:{name:"Popup",toggleEvent:"click",origin:g+" "+f,position:m+" "+f,anchor:b,appendTo:null,collision:"flip fit",viewport:window,copyAnchorStyles:!0,autosize:!1,modal:!1,adjustSize:{width:0,height:0},animation:{open:{effects:"slideIn:down",transition:!0,duration:200},close:{duration:100,hide:!0}}},_animationClose:function(){var e=this,t=e.wrapper.data(w);e.wrapper.hide(),t&&e.wrapper.css(t),e.options.anchor!=b&&e._hideDirClass(),e._closing=!1,e._trigger(d)},destroy:function(){var t,n=this,o=n.options,a=n.element.off(P);r.fn.destroy.call(n),o.toggleTarget&&e(o.toggleTarget).off(P),o.modal||(E.unbind(n.downEvent,n._mousedownProxy),n._toggleResize(!1)),i.destroy(n.element.children()),a.removeData(),o.appendTo[0]===document.body&&(t=a.parent(".k-animation-container"),t[0]?t.remove():a.remove())},open:function(t,n){var o,r,s=this,c={isFixed:!isNaN(parseInt(n,10)), +x:t,y:n},d=s.element,u=s.options,h=e(u.anchor),f=d[0]&&d.hasClass("km-widget");if(!s.visible()){if(u.copyAnchorStyles&&(f&&"font-size"==B[0]&&B.shift(),d.css(i.getComputedStyles(h[0],B))),d.data("animating")||s._trigger(l))return;s._activated=!1,u.modal||(E.unbind(s.downEvent,s._mousedownProxy).bind(s.downEvent,s._mousedownProxy),s._toggleResize(!1),s._toggleResize(!0)),s.wrapper=r=i.wrap(d,u.autosize).css({overflow:_,display:"block",position:v}),a.mobileOS.android&&r.css(F,"translatez(0)"),r.css(y),e(u.appendTo)[0]==document.body&&r.css(m,"-10000px"),s.flipped=s._position(c),o=s._openAnimation(),u.anchor!=b&&s._showDirClass(o),d.data(x,o.effects).kendoStop(!0).kendoAnimate(o)}},_openAnimation:function(){var e=z(!0,{},this.options.animation.open);return e.effects=i.parseEffects(e.effects,this.flipped),e},_hideDirClass:function(){var t=e(this.options.anchor),n=((t.attr("class")||"").match(T)||["","down"])[1],o=S+"-"+n;t.removeClass(o).children(D).removeClass(C).removeClass(o),this.element.removeClass(S+"-"+i.directions[n].reverse)},_showDirClass:function(t){var n=t.effects.slideIn?t.effects.slideIn.direction:"down",o=S+"-"+n;e(this.options.anchor).addClass(o).children(D).addClass(C).addClass(o),this.element.addClass(S+"-"+i.directions[n].reverse)},position:function(){this.visible()&&(this.flipped=this._position())},toggle:function(){var e=this;e[e.visible()?c:l]()},visible:function(){return this.element.is(":"+k)},close:function(n){var o,r,a,s,l=this,d=l.options;if(l.visible()){if(o=l.wrapper[0]?l.wrapper:i.wrap(l.element).hide(),l._toggleResize(!1),l._closing||l._trigger(c))return l._toggleResize(!0),t;l.element.find(".k-popup").each(function(){var t=e(this),i=t.data("kendoPopup");i&&i.close(n)}),E.unbind(l.downEvent,l._mousedownProxy),n?r={hide:!0,effects:{}}:(r=z(!0,{},d.animation.close),a=l.element.data(x),s=r.effects,!s&&!i.size(s)&&a&&i.size(a)&&(r.effects=a,r.reverse=!0),l._closing=!0),l.element.kendoStop(!0),o.css({overflow:_}),l.element.kendoAnimate(r),n&&l._animationClose()}},_trigger:function(e){return this.trigger(e,{type:e})},_resize:function(e){var t=this;-1!==a.resize.indexOf(e.type)?(clearTimeout(t._resizeTimeout),t._resizeTimeout=setTimeout(function(){t._position(),t._resizeTimeout=null},50)):(!t._hovered||t._activated&&t.element.hasClass("k-list-container"))&&t.close()},_toggleResize:function(e){var t=e?"on":"off",n=a.resize;a.mobileOS.ios||a.mobileOS.android||(n+=" "+R),this._scrollableParents()[t](R,this._resizeProxy),I[t](n,this._resizeProxy)},_mousedown:function(t){var o=this,r=o.element[0],a=o.options,s=e(a.anchor)[0],l=a.toggleTarget,c=i.eventTarget(t),d=e(c).closest(".k-popup"),u=d.parent().parent(".km-shim").length;d=d[0],!u&&d&&d!==o.element[0]||"popover"!==e(t.target).closest("a").data("rel")&&(n(r,c)||n(s,c)||l&&n(e(l)[0],c)||o.close())},_fit:function(e,t,n){var i=0;return e+t>n&&(i=n-(e+t)),0>e&&(i=-e),i},_flip:function(e,t,n,i,o,r,a){var s=0;return a=a||t,r!==o&&r!==h&&o!==h&&(e+a>i&&(s+=-(n+t)),0>e+s&&(s+=n+t)),s},_scrollableParents:function(){return e(this.options.anchor).parentsUntil("body").filter(function(e,t){return i.isScrollable(t)})},_position:function(t){var n,o,r,l,c,d,u,h,f,p,m,g,_,b,k,x,C=this,S=C.element,T=C.wrapper,D=C.options,A=e(D.viewport),E=a.zoomLevel(),I=!!(A[0]==window&&window.innerWidth&&1.02>=E),R=e(D.anchor),M=D.origin.toLowerCase().split(" "),F=D.position.toLowerCase().split(" "),P=C.collisions,B=10002,L=0,H=document.documentElement;if(c=D.viewport===window?{top:window.pageYOffset||document.documentElement.scrollTop||0,left:window.pageXOffset||document.documentElement.scrollLeft||0}:A.offset(),I?(d=window.innerWidth,u=window.innerHeight):(d=A.width(),u=A.height()),I&&H.scrollHeight-H.clientHeight>0&&(d-=i.support.scrollbar()),n=R.parents().filter(T.siblings()),n[0])if(r=Math.max(+n.css("zIndex"),0))B=r+10;else for(o=R.parentsUntil(n),l=o.length;l>L;L++)r=+e(o[L]).css("zIndex"),r&&r>B&&(B=r+10);return T.css("zIndex",B),T.css(t&&t.isFixed?{left:t.x,top:t.y}:C._align(M,F)),h=s(T,y,R[0]===T.offsetParent()[0]),f=s(T),p=R.offsetParent().parent(".k-animation-container,.k-popup,.k-group"),p.length&&(h=s(T,y,!0),f=s(T)),f.top-=c.top,f.left-=c.left,C.wrapper.data(w)||T.data(w,z({},h)),m=z({},f),g=z({},h),_=D.adjustSize,"fit"===P[0]&&(g.top+=C._fit(m.top,T.outerHeight()+_.height,u/E)),"fit"===P[1]&&(g.left+=C._fit(m.left,T.outerWidth()+_.width,d/E)),b=z({},g),k=S.outerHeight(),x=T.outerHeight(),!T.height()&&k&&(x+=k),"flip"===P[0]&&(g.top+=C._flip(m.top,k,R.outerHeight(),u/E,M[0],F[0],x)),"flip"===P[1]&&(g.left+=C._flip(m.left,S.outerWidth(),R.outerWidth(),d/E,M[1],F[1],T.outerWidth())),S.css(y,v),T.css(g),g.left!=b.left||g.top!=b.top},_align:function(t,n){var i,o=this,r=o.wrapper,a=e(o.options.anchor),l=t[0],c=t[1],d=n[0],u=n[1],f=s(a),m=e(o.options.appendTo),v=r.outerWidth(),_=r.outerHeight(),b=a.outerWidth(),w=a.outerHeight(),y=f.top,k=f.left,x=Math.round;return m[0]!=document.body&&(i=s(m),y-=i.top,k-=i.left),l===g&&(y+=w),l===h&&(y+=x(w/2)),d===g&&(y-=_),d===h&&(y-=x(_/2)),c===p&&(k+=b),c===h&&(k+=x(b/2)),u===p&&(k-=v),u===h&&(k-=x(v/2)),{top:y,left:k}}});o.plugin(L)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("drawing/core.min",["drawing/geometry.min","kendo.popup.min"],e)}(function(){!function(e){function t(e){var t,n;return e.touch?(t=e.x.location,n=e.y.location):(t=e.pageX||e.clientX||0,n=e.pageY||e.clientY||0),{x:t,y:n}}var n,i,o,r,a=e.noop,s=Object.prototype.toString,l=window.kendo,c=l.Class,d=l.ui.Widget,u=l.deepExtend,h=l.util,f=h.defined,p=h.limitValue,m=l.geometry,g=e.proxy,v=".kendo",_='
        ',b='
        close
        ',w=d.extend({init:function(e,t){this.options=u({},this.options,t),d.fn.init.call(this,e,this.options),this._click=this._handler("click"),this._mouseenter=this._handler("mouseenter"),this._mouseleave=this._handler("mouseleave"),this._mousemove=this._handler("mousemove"),this._visual=new l.drawing.Group,this.options.width&&this.element.css("width",this.options.width),this.options.height&&this.element.css("height",this.options.height),this._enableTracking()},options:{name:"Surface",tooltip:{}},events:["click","mouseenter","mouseleave","mousemove","resize","tooltipOpen","tooltipClose"],draw:function(e){this._visual.children.push(e)},clear:function(){this._visual.children=[],this.hideTooltip()},destroy:function(){this._visual=null,this._tooltip&&(this._tooltip.destroy(),delete this._tooltip),d.fn.destroy.call(this)},exportVisual:function(){return this._visual},getSize:function(){return{width:this.element.width(),height:this.element.height()}},setSize:function(e){this.element.css({width:e.width,height:e.height}),this._size=e,this._resize()},eventTarget:function(t){for(var n,i=e(t.touch?t.touch.initialTouch:t.target);!n&&i.length>0&&(n=i[0]._kendoNode,!i.is(this.element)&&0!==i.length);)i=i.parent();return n?n.srcElement:void 0},showTooltip:function(e,t){this._tooltip&&this._tooltip.show(e,t)},hideTooltip:function(){this._tooltip&&this._tooltip.hide()},suspendTracking:function(){this._suspendedTracking=!0,this.hideTooltip()},resumeTracking:function(){this._suspendedTracking=!1},_resize:a,_handler:function(e){var t=this;return function(n){var i=t.eventTarget(n);i&&!t._suspendedTracking&&t.trigger(e,{element:i,originalEvent:n,type:e})}},_enableTracking:function(){l.ui.Popup&&(this._tooltip=new r(this,this.options.tooltip||{}))},_elementOffset:function(){var e=this.element,t=e.offset(),n=parseInt(e.css("paddingLeft"),10),i=parseInt(e.css("paddingTop"),10);return{left:t.left+n,top:t.top+i}},_surfacePoint:function(e){var n=this._elementOffset(),i=t(e),o=i.x-n.left,r=i.y-n.top;return new m.Point(o,r)}});l.ui.plugin(w),w.create=function(e,t){return o.current.create(e,t)},n=c.extend({init:function(e){this.childNodes=[],this.parent=null,e&&(this.srcElement=e,this.observe())},destroy:function(){var e,t;for(this.srcElement&&this.srcElement.removeObserver(this),e=this.childNodes,t=0;e.length>t;t++)this.childNodes[t].destroy();this.parent=null},load:a,observe:function(){this.srcElement&&this.srcElement.addObserver(this)},append:function(e){this.childNodes.push(e),e.parent=this},insertAt:function(e,t){this.childNodes.splice(t,0,e),e.parent=this},remove:function(e,t){var n,i=e+t;for(n=e;i>n;n++)this.childNodes[n].removeSelf();this.childNodes.splice(e,t)},removeSelf:function(){this.clear(),this.destroy()},clear:function(){this.remove(0,this.childNodes.length)},invalidate:function(){this.parent&&this.parent.invalidate()},geometryChange:function(){this.invalidate()},optionsChange:function(){this.invalidate()},childrenChange:function(e){"add"===e.action?this.load(e.items,e.index):"remove"===e.action&&this.remove(e.index,e.items.length),this.invalidate()}}),i=c.extend({init:function(e,t){var n,i;this.prefix=t||"";for(n in e)i=e[n],i=this._wrap(i,n),this[n]=i},get:function(e){return l.getter(e,!0)(this)},set:function(e,t){var n,i=l.getter(e,!0)(this);i!==t&&(n=this._set(e,this._wrap(t,e)),n||this.optionsChange({field:this.prefix+e,value:t}))},_set:function(e,t){var n,o,r,a=e.indexOf(".")>=0;if(a)for(n=e.split("."),o="";n.length>1;){if(o+=n.shift(),r=l.getter(o,!0)(this),r||(r=new i({},o+"."),r.addObserver(this),this[o]=r),r instanceof i)return r.set(n.join("."),t),a;o+="."}return this._clear(e),l.setter(e)(this,t),a},_clear:function(e){var t=l.getter(e,!0)(this);t&&t.removeObserver&&t.removeObserver(this)},_wrap:function(e,t){var n=s.call(e);return null!==e&&f(e)&&"[object Object]"===n&&(e instanceof i||e instanceof c||(e=new i(e,this.prefix+t+".")),e.addObserver(this)),e}}),u(i.fn,l.mixins.ObserversMixin),o=function(){this._items=[]},o.prototype={register:function(e,t,n){var i=this._items,o=i[0],r={name:e,type:t,order:n};!o||o.order>n?i.unshift(r):i.push(r)},create:function(e,t){var n,i,o=this._items,r=o[0];if(t&&t.type)for(n=t.type.toLowerCase(),i=0;o.length>i;i++)if(o[i].name===n){r=o[i];break}return r?new r.type(e,t):void l.logToConsole("Warning: Unable to create Kendo UI Drawing Surface. Possible causes:\n- The browser does not support SVG, VML and Canvas. User agent: "+navigator.userAgent+"\n- The Kendo UI scripts are not fully loaded")}},o.current=new o,r=c.extend({init:function(t,n){this.element=e(_),this.content=this.element.children(".k-tooltip-content"),n=n||{},this.options=u({},this.options,this._tooltipOptions(n)),this.popup=new l.ui.Popup(this.element,{appendTo:n.appendTo,animation:n.animation,copyAnchorStyles:!1,collision:"fit fit"}),this._openPopupHandler=e.proxy(this._openPopup,this),this.surface=t,this._bindEvents()},options:{position:"top",showOn:"mouseenter",offset:7,autoHide:!0,hideDelay:0,showAfter:100},_bindEvents:function(){this._showHandler=g(this._showEvent,this),this._surfaceLeaveHandler=g(this._surfaceLeave,this),this._mouseleaveHandler=g(this._mouseleave,this),this._mousemoveHandler=g(this._mousemove,this),this.surface.bind("click",this._showHandler),this.surface.bind("mouseenter",this._showHandler),this.surface.bind("mouseleave",this._mouseleaveHandler),this.surface.bind("mousemove",this._mousemoveHandler),this.surface.element.on("mouseleave"+v,this._surfaceLeaveHandler),this.element.on("click"+v,".k-tooltip-button",g(this._hideClick,this))},destroy:function(){var e=this.popup;this.surface.unbind("click",this._showHandler),this.surface.unbind("mouseenter",this._showHandler),this.surface.unbind("mouseleave",this._mouseleaveHandler),this.surface.unbind("mousemove",this._mousemoveHandler),this.surface.element.off("mouseleave"+v,this._surfaceLeaveHandler),this.element.off("click"+v),e&&(e.destroy(),delete this.popup),clearTimeout(this._timeout),delete this.popup,delete this.element,delete this.content,delete this.surface},_tooltipOptions:function(e){return e=e||{},{position:e.position,showOn:e.showOn,offset:e.offset,autoHide:e.autoHide,width:e.width,height:e.height,content:e.content,shared:e.shared,hideDelay:e.hideDelay,showAfter:e.showAfter}},_tooltipShape:function(e){for(;e&&!e.options.tooltip;)e=e.parent;return e},_updateContent:function(e,t,n){var i=n.content;return l.isFunction(i)&&(i=i({element:t,target:e})),i?(this.content.html(i),!0):void 0},_position:function(e,n,i,o){var r,a=n.position,s=n.offset||0,l=this.surface,c=l._elementOffset(),d=l.getSize(),u=l._offset,h=e.bbox(),f=i.width,m=i.height,g=0,v=0;return h.origin.translate(c.left,c.top),u&&h.origin.translate(-u.x,-u.y),"cursor"==a&&o?(r=t(o),g=r.x-f/2,v=r.y-m-s):"left"==a?(g=h.origin.x-f-s,v=h.center().y-m/2):"right"==a?(g=h.bottomRight().x+s,v=h.center().y-m/2):"bottom"==a?(g=h.center().x-f/2,v=h.bottomRight().y+s):(g=h.center().x-f/2,v=h.origin.y-m-s),{left:p(g,c.left,c.left+d.width),top:p(v,c.top,c.top+d.height)}},show:function(e,t){this._show(e,e,u({},this.options,this._tooltipOptions(e.options.tooltip),t))},hide:function(){var e=this._current;delete this._current,clearTimeout(this._showTimeout),this.popup.visible()&&e&&!this.surface.trigger("tooltipClose",{element:e.shape,target:e.target,popup:this.popup})&&this.popup.close()},_hideClick:function(e){e.preventDefault(),this.hide()},_show:function(e,t,n,i,o){var r,a,s=this._current;clearTimeout(this._timeout),s&&(s.shape===t&&n.shared||s.target===e)||(clearTimeout(this._showTimeout),!this.surface.trigger("tooltipOpen",{element:t,target:e,popup:this.popup})&&this._updateContent(e,t,n)&&(this._autoHide(n),r=this._measure(n),a=this.popup,a.visible()&&a.close(!0),this._current={options:n,elementSize:r,shape:t,target:e,position:this._position(n.shared?t:e,n,r,i)},o?this._showTimeout=setTimeout(this._openPopupHandler,n.showAfter||0):this._openPopup()))},_openPopup:function(){var e=this._current,t=e.position;this.popup.open(t.left,t.top)},_autoHide:function(t){t.autoHide&&this._closeButton&&(this.element.removeClass("k-tooltip-closable"),this._closeButton.remove(),delete this._closeButton),t.autoHide||this._closeButton||(this.element.addClass("k-tooltip-closable"),this._closeButton=e(b).prependTo(this.element))},_showEvent:function(e){var t,n=this._tooltipShape(e.element);n&&(t=u({},this.options,this._tooltipOptions(n.options.tooltip)),t&&t.showOn==e.type&&this._show(e.element,n,t,e.originalEvent,!0))},_measure:function(e){var t,n,i;return this.element.css({width:"auto",height:"auto"}),i=this.popup.visible(),i||this.popup.wrapper.show(),this.element.css({width:f(e.width)?e.width:"auto",height:f(e.height)?e.height:"auto"}),t=this.element.outerWidth(),n=this.element.outerHeight(),i||this.popup.wrapper.hide(),{width:t,height:n}},_mouseleave:function(e){var t,n;this._popupRelatedTarget(e.originalEvent)||(t=this,n=t._current,n&&n.options.autoHide&&(t._timeout=setTimeout(function(){clearTimeout(t._showTimeout),t.hide()},n.options.hideDelay||0)))},_mousemove:function(e){var t,n,i=this._current;i&&e.element&&(t=i.options,"cursor"==t.position&&(n=this._position(e.element,t,i.elementSize,e.originalEvent),i.position=n,this.popup.wrapper.css({left:n.left,top:n.top})))},_surfaceLeave:function(e){this._popupRelatedTarget(e)||(clearTimeout(this._showTimeout),this.hide())},_popupRelatedTarget:function(t){return t.relatedTarget&&e(t.relatedTarget).closest(this.popup.wrapper).length}}),u(l,{drawing:{DASH_ARRAYS:{dot:[1.5,3.5],dash:[4,3.5],longdash:[8,3.5],dashdot:[3.5,3.5,1.5,3.5],longdashdot:[8,3.5,1.5,3.5],longdashdotdot:[8,3.5,1.5,3.5,1.5,3.5]},Color:l.Color,BaseNode:n,OptionsStore:i,Surface:w,SurfaceFactory:o,SurfaceTooltip:r}}),l.dataviz.drawing=l.drawing}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("drawing/mixins.min",["drawing/core.min"],e)}(function(){!function(){var e=window.kendo,t=e.deepExtend,n=e.util.defined,i=e.geometry,o="gradient",r=""+i.Matrix.IDENTITY,a={extend:function(e){e.fill=this.fill,e.stroke=this.stroke},fill:function(e,t){var i,r=this.options;return n(e)?(e&&e.nodeType!=o?(i={color:e},n(t)&&(i.opacity=t),r.set("fill",i)):r.set("fill",e),this):r.get("fill")},stroke:function(e,t,i){return n(e)?(this.options.set("stroke.color",e),n(t)&&this.options.set("stroke.width",t),n(i)&&this.options.set("stroke.opacity",i),this):this.options.get("stroke")}},s={extend:function(e,t){e.traverse=function(e){var n,i,o=this[t];for(n=0;o.length>n;n++)i=o[n],i.traverse?i.traverse(e):e(i);return this}}},l={extend:function(e){e.bbox=this.bbox,e.geometryChange=this.geometryChange},bbox:function(e){var t,n,o=i.toMatrix(this.currentTransform(e)),a=o?""+o:r;return this._bboxCache&&this._matrixHash==a?t=this._bboxCache.clone():(t=this._bbox(o),this._bboxCache=t?t.clone():null,this._matrixHash=a),n=this.options.get("stroke.width"),n&&t&&t.expand(n/2),t},geometryChange:function(){delete this._bboxCache,this.trigger("geometryChange",{element:this})}};t(e.drawing,{mixins:{Paintable:a,Traversable:s,Measurable:l}})}()},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("drawing/shapes.min",["drawing/core.min","drawing/mixins.min","util/text-metrics.min","mixins/observers.min"],e)}(function(){!function(e){function t(e,t,n){var i,o,r,a;for(o=0;e.length>o;o++)r=e[o],r.visible()&&(a=t?r.bbox(n):r.rawBBox(),a&&(i=i?q.Rect.union(i,a):a));return i}function n(e,t){var n,i,o,r;for(i=0;e.length>i;i++)o=e[i],o.visible()&&(r=o.clippedBBox(t),r&&(n=n?q.Rect.union(n,r):r));return n}function i(e,t){for(var n=0;t.length>n;n++)e[t[n]]=o(t[n])}function o(e){var t="_"+e;return function(e){return ie(e)?(this._observerField(t,e),this.geometryChange(),this):this[t]}}function r(e,t){for(var n=0;t.length>n;n++)e[t[n]]=a(t[n])}function a(e){var t="_"+e;return function(e){return ie(e)?(this._observerField(t,G.create(e)),this.geometryChange(),this):this[t]}}function s(e,t){for(var n=0;t.length>n;n++)e[t[n]]=l(t[n])}function l(e){return function(t){return ie(t)?(this.options.set(e,t),this):this.options.get(e)}}function c(){return"kdef"+pe++}function d(e,t,n){y(e,t,n,"x","width")}function u(e,t,n){y(e,t,n,"y","height")}function h(e){w(b(e),"x","y","width")}function f(e){w(b(e),"y","x","height")}function p(e,t){return g(e,t,"x","y","width")}function m(e,t){return g(e,t,"y","x","height")}function g(e,t,n,i,o){var r,a,s,l,c=[],d=_(e,t,o),u=t.origin.clone();for(l=0;d.length>l;l++)for(s=d[l],r=s[0],u[i]=r.bbox.origin[i],C(u,r.bbox,r.element),r.bbox.origin[n]=u[n],w(s,n,i,o),c.push([]),a=0;s.length>a;a++)c[l].push(s[a].element);return c}function v(e,t){var n,i,o=e.clippedBBox(),r=o.size,a=t.size;(r.width>a.width||r.height>a.height)&&(n=J.min(a.width/r.width,a.height/r.height),i=e.transform()||q.transform(),i.scale(n,n),e.transform(i))}function _(e,t,n){var i,o,r,a,s=t.size[n],l=0,c=[],d=[],u=function(){d.push({element:i,bbox:r})};for(a=0;e.length>a;a++)i=e[a],r=i.clippedBBox(),r&&(o=r.size[n],l+o>s?d.length?(c.push(d),d=[],u(),l=o):(u(),c.push(d),d=[],l=0):(u(),l+=o));return d.length&&c.push(d),c}function b(e){var t,n,i,o=[];for(i=0;e.length>i;i++)t=e[i],n=t.clippedBBox(),n&&o.push({element:t,bbox:n});return o}function w(e,t,n,i){var o,r,a,s,l;if(e.length>1)for(o=e[0].bbox,r=new G,l=1;e.length>l;l++)a=e[l].element,s=e[l].bbox,r[t]=o.origin[t]+o.size[i],r[n]=s.origin[n],C(r,s,a),s.origin[t]=r[t],o=s}function y(e,t,n,i,o){var r,a,s;for(n=n||"start",s=0;e.length>s;s++)r=e[s].clippedBBox(),r&&(a=r.origin.clone(),a[i]=k(r.size[o],t,n,i,o),C(a,r,e[s]))}function k(e,t,n,i,o){var r;return r=n==me?t.origin[i]:n==ge?t.origin[i]+t.size[o]-e:t.origin[i]+(t.size[o]-e)/2}function x(e,t,n){var i=n.transform()||q.transform(),o=i.matrix();o.e+=e,o.f+=t,i.matrix(o),n.transform(i)}function C(e,t,n){x(e.x-t.origin.x,e.y-t.origin.y,n)}var S,T,D,A,E,I,R,M,F,z,P,B,L,H,N,O,V,W=window.kendo,U=W.Class,j=W.deepExtend,q=W.geometry,G=q.Point,$=q.Size,Y=q.Matrix,K=q.toMatrix,Q=W.drawing,X=Q.OptionsStore,J=Math,Z=J.pow,ee=W.util,te=ee.append,ne=ee.arrayLimits,ie=ee.defined,oe=ee.last,re=ee.valueOrDefault,ae=W.mixins.ObserversMixin,se=e.inArray,le=[].push,ce=[].pop,de=[].splice,ue=[].shift,he=[].slice,fe=[].unshift,pe=1,me="start",ge="end",ve="horizontal",_e=U.extend({nodeType:"Element",init:function(e){this._initOptions(e)},_initOptions:function(e){var t,n;e=e||{},t=e.transform,n=e.clip,t&&(e.transform=q.transform(t)),n&&!n.id&&(n.id=c()),this.options=new X(e),this.options.addObserver(this)},transform:function(e){return ie(e)?void this.options.set("transform",q.transform(e)):this.options.get("transform")},parentTransform:function(){for(var e,t,n=this;n.parent;)n=n.parent,e=n.transform(),e&&(t=e.matrix().multiplyCopy(t||Y.unit()));return t?q.transform(t):void 0},currentTransform:function(e){var t,n,i=this.transform(),o=K(i);return ie(e)||(e=this.parentTransform()),t=K(e),n=o&&t?t.multiplyCopy(o):o||t,n?q.transform(n):void 0},visible:function(e){return ie(e)?(this.options.set("visible",e),this):this.options.get("visible")!==!1},clip:function(e){var t=this.options;return ie(e)?(e&&!e.id&&(e.id=c()),t.set("clip",e),this):t.get("clip")},opacity:function(e){return ie(e)?(this.options.set("opacity",e),this):re(this.options.get("opacity"),1)},clippedBBox:function(e){var t,n=this._clippedBBox(e);return n?(t=this.clip(),t?q.Rect.intersect(n,t.bbox(e)):n):void 0},containsPoint:function(e,t){if(this.visible()){var n=this.currentTransform(t);return n&&(e=e.transformCopy(n.matrix().invert())),this._hasFill()&&this._containsPoint(e)||this._isOnPath&&this._hasStroke()&&this._isOnPath(e)}return!1},_hasFill:function(){var e=this.options.fill;return e&&!ee.isTransparent(e.color)},_hasStroke:function(){var e=this.options.stroke;return e&&e.width>0&&!ee.isTransparent(e.color)},_clippedBBox:function(e){return this.bbox(e)}});j(_e.fn,ae),S=U.extend({init:function(e){e=e||[],this.length=0,this._splice(0,e.length,e)},elements:function(e){return e?(this._splice(0,this.length,e),this._change(),this):this.slice(0)},push:function(){var e=arguments,t=le.apply(this,e);return this._add(e),t},slice:he,pop:function(){var e=this.length,t=ce.apply(this);return e&&this._remove([t]),t},splice:function(e,t){var n=he.call(arguments,2),i=this._splice(e,t,n);return this._change(),i},shift:function(){var e=this.length,t=ue.apply(this);return e&&this._remove([t]),t},unshift:function(){var e=arguments,t=fe.apply(this,e);return this._add(e),t},indexOf:function(e){var t,n,i=this;for(t=0,n=i.length;n>t;t++)if(i[t]===e)return t;return-1},_splice:function(e,t,n){var i=de.apply(this,[e,t].concat(n));return this._clearObserver(i),this._setObserver(n),i},_add:function(e){this._setObserver(e),this._change()},_remove:function(e){this._clearObserver(e),this._change()},_setObserver:function(e){for(var t=0;e.length>t;t++)e[t].addObserver(this)},_clearObserver:function(e){for(var t=0;e.length>t;t++)e[t].removeObserver(this)},_change:function(){}}),j(S.fn,ae),T=_e.extend({nodeType:"Group",init:function(e){_e.fn.init.call(this,e),this.children=[]},childrenChange:function(e,t,n){this.trigger("childrenChange",{action:e,items:t,index:n})},append:function(){return te(this.children,arguments),this._reparent(arguments,this),this.childrenChange("add",arguments),this},insert:function(e,t){return this.children.splice(e,0,t),t.parent=this,this.childrenChange("add",[t],e),this},insertAt:function(e,t){return this.insert(t,e)},remove:function(e){var t=se(e,this.children);return t>=0&&(this.children.splice(t,1),e.parent=null,this.childrenChange("remove",[e],t)),this},removeAt:function(e){if(e>=0&&this.children.length>e){var t=this.children[e];this.children.splice(e,1),t.parent=null,this.childrenChange("remove",[t],e)}return this},clear:function(){var e=this.children;return this.children=[],this._reparent(e,null),this.childrenChange("remove",e,0),this},bbox:function(e){return t(this.children,!0,this.currentTransform(e))},rawBBox:function(){return t(this.children,!1)},_clippedBBox:function(e){return n(this.children,this.currentTransform(e))},currentTransform:function(e){return _e.fn.currentTransform.call(this,e)||null},containsPoint:function(e,t){var n,i,o;if(this.visible())for(n=this.children,i=this.currentTransform(t),o=0;n.length>o;o++)if(n[o].containsPoint(e,i))return!0;return!1},_reparent:function(e,t){var n,i,o;for(n=0;e.length>n;n++)i=e[n],o=i.parent,o&&o!=this&&o.remove&&o.remove(i),i.parent=t}}),Q.mixins.Traversable.extend(T.fn,"children"),D=_e.extend({nodeType:"Text",init:function(e,t,n){_e.fn.init.call(this,n),this.content(e),this.position(t||new q.Point),this.options.font||(this.options.font="12px sans-serif"),ie(this.options.fill)||this.fill("#000")},content:function(e){return ie(e)?(this.options.set("content",e),this):this.options.get("content")},measure:function(){var e=ee.measureText(this.content(),{font:this.options.get("font")});return e},rect:function(){var e=this.measure(),t=this.position().clone();return new q.Rect(t,[e.width,e.height])},bbox:function(e){var t=K(this.currentTransform(e));return this.rect().bbox(t)},rawBBox:function(){return this.rect().bbox()},_containsPoint:function(e){return this.rect().containsPoint(e)}}),Q.mixins.Paintable.extend(D.fn),r(D.fn,["position"]),A=_e.extend({nodeType:"Circle",init:function(e,t){_e.fn.init.call(this,t),this.geometry(e||new q.Circle),ie(this.options.stroke)||this.stroke("#000")},_bbox:function(e){return this._geometry.bbox(e)},rawBBox:function(){return this._geometry.bbox()},_containsPoint:function(e){return this.geometry().containsPoint(e)},_isOnPath:function(e){return this.geometry()._isOnPath(e,this.options.stroke.width/2)}}),Q.mixins.Paintable.extend(A.fn),Q.mixins.Measurable.extend(A.fn),i(A.fn,["geometry"]),E=_e.extend({nodeType:"Arc",init:function(e,t){_e.fn.init.call(this,t),this.geometry(e||new q.Arc),ie(this.options.stroke)||this.stroke("#000")},_bbox:function(e){return this._geometry.bbox(e)},rawBBox:function(){return this.geometry().bbox()},toPath:function(){var e,t=new M,n=this.geometry().curvePoints();if(n.length>0)for(t.moveTo(n[0].x,n[0].y),e=1;n.length>e;e+=3)t.curveTo(n[e],n[e+1],n[e+2]);return t},_containsPoint:function(e){return this.geometry().containsPoint(e)},_isOnPath:function(e){return this.geometry()._isOnPath(e,this.options.stroke.width/2)}}),Q.mixins.Paintable.extend(E.fn),Q.mixins.Measurable.extend(E.fn),i(E.fn,["geometry"]),I=S.extend({_change:function(){this.geometryChange()}}),R=U.extend({init:function(e,t,n){this.anchor(e||new G),this.controlIn(t),this.controlOut(n)},bboxTo:function(e,t){var n,i=this.anchor().transformCopy(t),o=e.anchor().transformCopy(t);return n=this.controlOut()&&e.controlIn()?this._curveBoundingBox(i,this.controlOut().transformCopy(t),e.controlIn().transformCopy(t),o):this._lineBoundingBox(i,o)},_lineBoundingBox:function(e,t){return q.Rect.fromPoints(e,t)},_curveBoundingBox:function(e,t,n,i){var o=[e,t,n,i],r=this._curveExtremesFor(o,"x"),a=this._curveExtremesFor(o,"y"),s=ne([r.min,r.max,e.x,i.x]),l=ne([a.min,a.max,e.y,i.y]);return q.Rect.fromPoints(new G(s.min,l.min),new G(s.max,l.max))},_curveExtremesFor:function(e,t){var n=this._curveExtremes(e[0][t],e[1][t],e[2][t],e[3][t]);return{min:this._calculateCurveAt(n.min,t,e),max:this._calculateCurveAt(n.max,t,e)}},_calculateCurveAt:function(e,t,n){var i=1-e;return Z(i,3)*n[0][t]+3*Z(i,2)*e*n[1][t]+3*Z(e,2)*i*n[2][t]+Z(e,3)*n[3][t]},_curveExtremes:function(e,t,n,i){var o,r,a=e-3*t+3*n-i,s=-2*(e-2*t+n),l=e-t,c=J.sqrt(s*s-4*a*l),d=0,u=1;return 0===a?0!==s&&(d=u=-l/s):isNaN(c)||(d=(-s+c)/(2*a),u=(-s-c)/(2*a)),o=J.max(J.min(d,u),0),(0>o||o>1)&&(o=0),r=J.min(J.max(d,u),1),(r>1||0>r)&&(r=1),{min:o,max:r}},_intersectionsTo:function(e,t){var n;return n=this.controlOut()&&e.controlIn()?q.curveIntersectionsCount([this.anchor(),this.controlOut(),e.controlIn(),e.anchor()],t,this.bboxTo(e)):q.lineIntersectionsCount(this.anchor(),e.anchor(),t)},_isOnCurveTo:function(e,t,n,i){var o,r,a,s,l,c,d,u,h=this.bboxTo(e).expand(n,n);return h.containsPoint(t)?(o=this.anchor(),r=this.controlOut(),a=e.controlIn(),s=e.anchor(),"start"==i&&o.distanceTo(t)<=n?!q.isOutOfEndPoint(o,r,t):"end"==i&&s.distanceTo(t)<=n?!q.isOutOfEndPoint(s,a,t):(l=q.hasRootsInRange,c=[o,r,a,s],l(c,t,"x","y",n)||l(c,t,"y","x",n)?!0:(d=q.transform().rotate(45,t),u=[o.transformCopy(d),r.transformCopy(d),a.transformCopy(d),s.transformCopy(d)],l(u,t,"x","y",n)||l(u,t,"y","x",n)))):void 0},_isOnLineTo:function(e,t,n){var i=this.anchor(),o=e.anchor(),r=ee.deg(J.atan2(o.y-i.y,o.x-i.x)),a=new q.Rect([i.x,i.y-n/2],[i.distanceTo(o),n]);return a.containsPoint(t.transformCopy(q.transform().rotate(-r,i)))},_isOnPathTo:function(e,t,n,i){var o;return o=this.controlOut()&&e.controlIn()?this._isOnCurveTo(e,t,n/2,i):this._isOnLineTo(e,t,n)}}),r(R.fn,["anchor","controlIn","controlOut"]),j(R.fn,ae),M=_e.extend({nodeType:"Path",init:function(e){_e.fn.init.call(this,e),this.segments=new I,this.segments.addObserver(this),ie(this.options.stroke)||(this.stroke("#000"),ie(this.options.stroke.lineJoin)||this.options.set("stroke.lineJoin","miter"))},moveTo:function(e,t){return this.suspend(),this.segments.elements([]),this.resume(),this.lineTo(e,t),this},lineTo:function(e,t){var n=ie(t)?new G(e,t):e,i=new R(n);return this.segments.push(i),this},curveTo:function(e,t,n){var i,o;return this.segments.length>0&&(i=oe(this.segments),o=new R(n,t),this.suspend(),i.controlOut(e),this.resume(),this.segments.push(o)),this},arc:function(e,t,n,i,o){var r,a,s,l,c;return this.segments.length>0&&(r=oe(this.segments),a=r.anchor(),s=ee.rad(e),l=new G(a.x-n*J.cos(s),a.y-i*J.sin(s)),c=new q.Arc(l,{startAngle:e,endAngle:t,radiusX:n,radiusY:i,anticlockwise:o}),this._addArcSegments(c)),this},arcTo:function(e,t,n,i,o){var r,a,s;return this.segments.length>0&&(r=oe(this.segments),a=r.anchor(),s=q.Arc.fromPoints(a,e,t,n,i,o),this._addArcSegments(s)),this},_addArcSegments:function(e){var t,n;for(this.suspend(),t=e.curvePoints(),n=1;t.length>n;n+=3)this.curveTo(t[n],t[n+1],t[n+2]);this.resume(),this.geometryChange()},close:function(){return this.options.closed=!0,this.geometryChange(),this},rawBBox:function(){return this._bbox()},_containsPoint:function(e){var t,n,i,o=this.segments,r=o.length,a=0;for(i=1;r>i;i++)t=o[i-1],n=o[i],a+=t._intersectionsTo(n,e);return!this.options.closed&&o[0].anchor().equals(o[r-1].anchor())||(a+=q.lineIntersectionsCount(o[0].anchor(),o[r-1].anchor(),e)),a%2!==0},_isOnPath:function(e,t){var n,i=this.segments,o=i.length;if(t=t||this.options.stroke.width,o>1){if(i[0]._isOnPathTo(i[1],e,t,"start"))return!0;for(n=2;o-2>=n;n++)if(i[n-1]._isOnPathTo(i[n],e,t))return!0;if(i[o-2]._isOnPathTo(i[o-1],e,t,"end"))return!0}return!1},_bbox:function(e){var t,n,i,o,r=this.segments,a=r.length;if(1===a)n=r[0].anchor().transformCopy(e),t=new q.Rect(n,$.ZERO);else if(a>0)for(i=1;a>i;i++)o=r[i-1].bboxTo(r[i],e),t=t?q.Rect.union(t,o):o;return t}}),Q.mixins.Paintable.extend(M.fn),Q.mixins.Measurable.extend(M.fn),M.fromRect=function(e,t){return new M(t).moveTo(e.topLeft()).lineTo(e.topRight()).lineTo(e.bottomRight()).lineTo(e.bottomLeft()).close()},M.fromPoints=function(e,t){var n,i,o;if(e){for(n=new M(t),i=0;e.length>i;i++)o=G.create(e[i]),o&&(0===i?n.moveTo(o):n.lineTo(o));return n}},M.fromArc=function(e,t){var n=new M(t),i=e.startAngle,o=e.pointAt(i);return n.moveTo(o.x,o.y),n.arc(i,e.endAngle,e.radiusX,e.radiusY,e.anticlockwise),n},F=_e.extend({nodeType:"MultiPath",init:function(e){_e.fn.init.call(this,e),this.paths=new I,this.paths.addObserver(this),ie(this.options.stroke)||this.stroke("#000")},moveTo:function(e,t){var n=new M;return n.moveTo(e,t),this.paths.push(n),this},lineTo:function(e,t){return this.paths.length>0&&oe(this.paths).lineTo(e,t),this},curveTo:function(e,t,n){return this.paths.length>0&&oe(this.paths).curveTo(e,t,n),this},arc:function(e,t,n,i,o){return this.paths.length>0&&oe(this.paths).arc(e,t,n,i,o),this},arcTo:function(e,t,n,i,o){return this.paths.length>0&&oe(this.paths).arcTo(e,t,n,i,o),this},close:function(){return this.paths.length>0&&oe(this.paths).close(),this},_bbox:function(e){return t(this.paths,!0,e)},rawBBox:function(){return t(this.paths,!1)},_containsPoint:function(e){var t,n=this.paths;for(t=0;n.length>t;t++)if(n[t]._containsPoint(e))return!0;return!1},_isOnPath:function(e){ +var t,n=this.paths,i=this.options.stroke.width;for(t=0;n.length>t;t++)if(n[t]._isOnPath(e,i))return!0;return!1},_clippedBBox:function(e){return n(this.paths,this.currentTransform(e))}}),Q.mixins.Paintable.extend(F.fn),Q.mixins.Measurable.extend(F.fn),z=_e.extend({nodeType:"Image",init:function(e,t,n){_e.fn.init.call(this,n),this.src(e),this.rect(t||new q.Rect)},src:function(e){return ie(e)?(this.options.set("src",e),this):this.options.get("src")},bbox:function(e){var t=K(this.currentTransform(e));return this._rect.bbox(t)},rawBBox:function(){return this._rect.bbox()},_containsPoint:function(e){return this._rect.containsPoint(e)},_hasFill:function(){return this.src()}}),i(z.fn,["rect"]),P=U.extend({init:function(e,t,n){this.options=new X({offset:e,color:t,opacity:ie(n)?n:1}),this.options.addObserver(this)}}),s(P.fn,["offset","color","opacity"]),j(P.fn,ae),P.create=function(e){if(ie(e)){var t;return t=e instanceof P?e:e.length>1?new P(e[0],e[1],e[2]):new P(e.offset,e.color,e.opacity)}},B=S.extend({_change:function(){this.optionsChange({field:"stops"})}}),L=U.extend({nodeType:"gradient",init:function(e){this.stops=new B(this._createStops(e.stops)),this.stops.addObserver(this),this._userSpace=e.userSpace,this.id=c()},userSpace:function(e){return ie(e)?(this._userSpace=e,this.optionsChange(),this):this._userSpace},_createStops:function(e){var t,n=[];for(e=e||[],t=0;e.length>t;t++)n.push(P.create(e[t]));return n},addStop:function(e,t,n){this.stops.push(new P(e,t,n))},removeStop:function(e){var t=this.stops.indexOf(e);t>=0&&this.stops.splice(t,1)}}),j(L.fn,ae,{optionsChange:function(e){this.trigger("optionsChange",{field:"gradient"+(e?"."+e.field:""),value:this})},geometryChange:function(){this.optionsChange()}}),H=L.extend({init:function(e){e=e||{},L.fn.init.call(this,e),this.start(e.start||new G),this.end(e.end||new G(1,0))}}),r(H.fn,["start","end"]),N=L.extend({init:function(e){e=e||{},L.fn.init.call(this,e),this.center(e.center||new G),this._radius=ie(e.radius)?e.radius:1,this._fallbackFill=e.fallbackFill},radius:function(e){return ie(e)?(this._radius=e,this.geometryChange(),this):this._radius},fallbackFill:function(e){return ie(e)?(this._fallbackFill=e,this.optionsChange(),this):this._fallbackFill}}),r(N.fn,["center"]),O=_e.extend({nodeType:"Rect",init:function(e,t){_e.fn.init.call(this,t),this.geometry(e||new q.Rect),ie(this.options.stroke)||this.stroke("#000")},_bbox:function(e){return this._geometry.bbox(e)},rawBBox:function(){return this._geometry.bbox()},_containsPoint:function(e){return this._geometry.containsPoint(e)},_isOnPath:function(e){return this.geometry()._isOnPath(e,this.options.stroke.width/2)}}),Q.mixins.Paintable.extend(O.fn),Q.mixins.Measurable.extend(O.fn),i(O.fn,["geometry"]),V=T.extend({init:function(e,t){T.fn.init.call(this,W.deepExtend({},this._defaults,t)),this._rect=e,this._fieldMap={}},_defaults:{alignContent:me,justifyContent:me,alignItems:me,spacing:0,orientation:ve,lineSpacing:0,wrap:!0},rect:function(e){return e?(this._rect=e,this):this._rect},_initMap:function(){var e=this.options,t=this._fieldMap;e.orientation==ve?(t.sizeField="width",t.groupsSizeField="height",t.groupAxis="x",t.groupsAxis="y"):(t.sizeField="height",t.groupsSizeField="width",t.groupAxis="y",t.groupsAxis="x")},reflow:function(){var e,t,n,i,o,r,a,s,l,c,d,u,h,f,p,m,g,v,_,b,w,y,x,S,T,D;if(this._rect&&0!==this.children.length){for(this._initMap(),this.options.transform&&this.transform(null),e=this.options,t=this._fieldMap,n=this._rect,i=this._initGroups(),o=i.groups,r=i.groupsSize,a=t.sizeField,s=t.groupsSizeField,l=t.groupAxis,c=t.groupsAxis,d=k(r,n,e.alignContent,c,s),u=new G,h=new G,f=new q.Size,b=0;o.length>b;b++){for(v=o[b],u[l]=p=k(v.size,n,e.justifyContent,l,a),u[c]=d,f[a]=v.size,f[s]=v.lineSize,_=new q.Rect(u,f),w=0;v.bboxes.length>w;w++)g=v.elements[w],m=v.bboxes[w],h[l]=p,h[c]=k(m.size[s],_,e.alignItems,c,s),C(h,m,g),p+=m.size[a]+e.spacing;d+=v.lineSize+e.lineSpacing}!e.wrap&&v.size>n.size[a]&&(y=n.size[a]/_.size[a],x=_.topLeft().scale(y,y),S=_.size[s]*y,T=k(S,n,e.alignContent,c,s),D=q.transform(),"x"===l?D.translate(n.origin.x-x.x,T-x.y):D.translate(T-x.x,n.origin.y-x.y),D.scale(y,y),this.transform(D))}},_initGroups:function(){var e,t,n,i=this.options,o=this.children,r=i.lineSpacing,a=this._fieldMap.sizeField,s=-r,l=[],c=this._newGroup(),d=function(){l.push(c),s+=c.lineSize+r};for(n=0;o.length>n;n++)t=o[n],e=o[n].clippedBBox(),t.visible()&&e&&(i.wrap&&c.size+e.size[a]+i.spacing>this._rect.size[a]?0===c.bboxes.length?(this._addToGroup(c,e,t),d(),c=this._newGroup()):(d(),c=this._newGroup(),this._addToGroup(c,e,t)):this._addToGroup(c,e,t));return c.bboxes.length&&d(),{groups:l,groupsSize:s}},_addToGroup:function(e,t,n){e.size+=t.size[this._fieldMap.sizeField]+this.options.spacing,e.lineSize=Math.max(t.size[this._fieldMap.groupsSizeField],e.lineSize),e.bboxes.push(t),e.elements.push(n)},_newGroup:function(){return{lineSize:0,size:-this.options.spacing,bboxes:[],elements:[]}}}),j(Q,{align:d,Arc:E,Circle:A,Element:_e,ElementsArray:S,fit:v,Gradient:L,GradientStop:P,Group:T,Image:z,Layout:V,LinearGradient:H,MultiPath:F,Path:M,RadialGradient:N,Rect:O,Segment:R,stack:h,Text:D,vAlign:u,vStack:f,vWrap:m,wrap:p})}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("drawing/parser.min",["drawing/shapes.min"],e)}(function(){!function(e){function t(e){var t=[];return e.replace(m,function(e,n){t.push(parseFloat(n))}),t}function n(e,t,n){var i,o=t?0:1;for(i=0;e.length>i;i+=2)e.splice(i+o,0,n)}function i(e,t){return e&&t?t.scaleCopy(2).translate(-e.x,-e.y):void 0}function o(e,t,n){var i=1/3;return t=t.clone().scale(2/3),{controlOut:t.clone().translateWith(e.scaleCopy(i)),controlIn:t.translateWith(n.scaleCopy(i))}}var r=window.kendo,a=r.drawing,s=r.geometry,l=r.Class,c=s.Point,d=r.deepExtend,u=e.trim,h=r.util,f=h.last,p=/([a-df-z]{1})([^a-df-z]*)(z)?/gi,m=/[,\s]?([+\-]?(?:\d*\.\d+|\d+)(?:[eE][+\-]?\d+)?)/g,g="m",v="z",_=l.extend({parse:function(e,n){var i,o=new a.MultiPath(n),r=new c;return e.replace(p,function(e,n,a,s){var l=n.toLowerCase(),c=l===n,d=t(u(a));if(l===g&&(c?(r.x+=d[0],r.y+=d[1]):(r.x=d[0],r.y=d[1]),o.moveTo(r.x,r.y),d.length>2&&(l="l",d.splice(0,2))),b[l])b[l](o,{parameters:d,position:r,isRelative:c,previousCommand:i}),s&&s.toLowerCase()===v&&o.close();else if(l!==g)throw Error("Error while parsing SVG path. Unsupported command: "+l);i=l}),o}}),b={l:function(e,t){var n,i,o=t.parameters,r=t.position;for(n=0;o.length>n;n+=2)i=new c(o[n],o[n+1]),t.isRelative&&i.translateWith(r),e.lineTo(i.x,i.y),r.x=i.x,r.y=i.y},c:function(e,t){var n,i,o,r,a=t.parameters,s=t.position;for(r=0;a.length>r;r+=6)n=new c(a[r],a[r+1]),i=new c(a[r+2],a[r+3]),o=new c(a[r+4],a[r+5]),t.isRelative&&(i.translateWith(s),n.translateWith(s),o.translateWith(s)),e.curveTo(n,i,o),s.x=o.x,s.y=o.y},v:function(e,t){var i=t.isRelative?0:t.position.x;n(t.parameters,!0,i),this.l(e,t)},h:function(e,t){var i=t.isRelative?0:t.position.y;n(t.parameters,!1,i),this.l(e,t)},a:function(e,t){var n,i,o,r,a,s,l=t.parameters,d=t.position;for(n=0;l.length>n;n+=7)i=l[n],o=l[n+1],r=l[n+3],a=l[n+4],s=new c(l[n+5],l[n+6]),t.isRelative&&s.translateWith(d),e.arcTo(s,i,o,r,a),d.x=s.x,d.y=s.y},s:function(e,t){var n,o,r,a,s,l=t.parameters,d=t.position,u=t.previousCommand;for("s"!=u&&"c"!=u||(a=f(f(e.paths).segments).controlIn()),s=0;l.length>s;s+=4)r=new c(l[s],l[s+1]),o=new c(l[s+2],l[s+3]),t.isRelative&&(r.translateWith(d),o.translateWith(d)),n=a?i(a,d):d.clone(),a=r,e.curveTo(n,r,o),d.x=o.x,d.y=o.y},q:function(e,t){var n,i,r,a,s=t.parameters,l=t.position;for(a=0;s.length>a;a+=4)r=new c(s[a],s[a+1]),i=new c(s[a+2],s[a+3]),t.isRelative&&(r.translateWith(l),i.translateWith(l)),n=o(l,r,i),e.curveTo(n.controlOut,n.controlIn,i),l.x=i.x,l.y=i.y},t:function(e,t){var n,r,a,s,l,d=t.parameters,u=t.position,h=t.previousCommand;for("q"!=h&&"t"!=h||(s=f(f(e.paths).segments),r=s.controlIn().clone().translateWith(u.scaleCopy(-1/3)).scale(1.5)),l=0;d.length>l;l+=2)a=new c(d[l],d[l+1]),t.isRelative&&a.translateWith(u),r=r?i(r,u):u.clone(),n=o(u,r,a),e.curveTo(n.controlOut,n.controlIn,a),u.x=a.x,u.y=a.y}};_.current=new _,a.Path.parse=function(e,t){return _.current.parse(e,t)},d(a,{PathParser:_})}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("drawing/search.min",["drawing/shapes.min"],e)}(function(){!function(e){function t(e,t){return t._zIndex>e._zIndex?1:e._zIndex>t._zIndex?-1:0}var n=window.kendo,i=n.drawing,o=n.geometry,r=n.Class,a=o.Rect,s=n.deepExtend,l=e.isArray,c=e.inArray,d=Math,u=1e4,h=75,f=r.extend({init:function(){this.shapes=[]},_add:function(e,t){this.shapes.push({bbox:t,shape:e}),e._quadNode=this},pointShapes:function(e){var t,n=this.shapes,i=n.length,o=[];for(t=0;i>t;t++)n[t].bbox.containsPoint(e)&&o.push(n[t].shape);return o},insert:function(e,t){this._add(e,t)},remove:function(e){var t,n=this.shapes,i=n.length;for(t=0;i>t;t++)if(n[t].shape===e){n.splice(t,1);break}}}),p=f.extend({init:function(e){f.fn.init.call(this),this.children=[],this.rect=e},inBounds:function(e){var t=this.rect,n=t.bottomRight(),i=e.bottomRight(),o=e.origin.x>=t.origin.x&&e.origin.y>=t.origin.y&&n.x>=i.x&&n.y>=i.y;return o},pointShapes:function(e){var t,n=this.children,i=n.length,o=f.fn.pointShapes.call(this,e);for(t=0;i>t;t++)o=o.concat(n[t].pointShapes(e));return o},insert:function(e,t){var n,i=!1,o=this.children;if(this.inBounds(t)){if(4>this.shapes.length)this._add(e,t);else{for(o.length||this._initChildren(),n=0;o.length>n;n++)if(o[n].insert(e,t)){i=!0;break}i||this._add(e,t)}i=!0}return i},_initChildren:function(){var e=this.rect,t=this.children,n=e.center(),i=e.width()/2,o=e.height()/2;t.push(new p(new a([e.origin.x,e.origin.y],[i,o])),new p(new a([n.x,e.origin.y],[i,o])),new p(new a([e.origin.x,n.y],[i,o])),new p(new a([n.x,n.y],[i,o])))}}),m=r.extend({ROOT_SIZE:1e3,init:function(){this.initRoots()},initRoots:function(){this.rootMap={},this.root=new f,this.rootElements=[]},clear:function(){var e,t=this,n=t.rootElements;for(e=0;n.length>e;e++)this.remove(n[e]);this.initRoots()},pointShape:function(e){var n,i=this.ROOT_SIZE,o=this.root.pointShapes(e),r=(this.rootMap[d.floor(e.x/i)]||{})[d.floor(e.y/i)];for(r&&(o=o.concat(r.pointShapes(e))),this.assignZindex(o),o.sort(t),n=0;o.length>n;n++)if(o[n].containsPoint(e))return o[n]},assignZindex:function(e){var t,n,i,o,r;for(r=0;e.length>r;r++){for(t=e[r],i=0,n=d.pow(u,h),o=[];t;)o.push(t),t=t.parent;for(;o.length;)t=o.pop(),i+=(c(t,t.parent?t.parent.children:this.rootElements)+1)*n,n/=u;e[r]._zIndex=i}},optionsChange:function(e){"transform"!=e.field&&"stroke.width"!=e.field||this.bboxChange(e.element)},geometryChange:function(e){this.bboxChange(e.element)},bboxChange:function(e){if("Group"===e.nodeType)for(var t=0;e.children.length>t;t++)this.bboxChange(e.children[t]);else e._quadNode&&e._quadNode.remove(e),this._insertShape(e)},add:function(e){var t=l(e)?e.slice(0):[e];this.rootElements.push.apply(this.rootElements,t),this._insert(t)},childrenChange:function(e){if("remove"==e.action)for(var t=0;e.items.length>t;t++)this.remove(e.items[t]);else this._insert(Array.prototype.slice.call(e.items,0))},_insert:function(e){for(var t;e.length>0;)t=e.pop(),t.addObserver(this),"Group"==t.nodeType?e.push.apply(e,t.children):this._insertShape(t)},_insertShape:function(e){var t,n,i,o,r=e.bbox();r&&(t=this.ROOT_SIZE,n=this.getSectors(r),i=n[0][0],o=n[1][0],this.inRoot(n)?this.root.insert(e,r):(this.rootMap[i]||(this.rootMap[i]={}),this.rootMap[i][o]||(this.rootMap[i][o]=new p(new a([i*t,o*t],[t,t]))),this.rootMap[i][o].insert(e,r)))},remove:function(e){var t,n;if(e.removeObserver(this),"Group"==e.nodeType)for(t=e.children,n=0;t.length>n;n++)this.remove(t[n]);else e._quadNode&&(e._quadNode.remove(e),delete e._quadNode)},inRoot:function(e){return e[0].length>1||e[1].length>1},getSectors:function(e){var t,n,i=this.ROOT_SIZE,o=e.bottomRight(),r=d.floor(o.x/i),a=d.floor(o.y/i),s=[[],[]];for(t=d.floor(e.origin.x/i);r>=t;t++)s[0].push(t);for(n=d.floor(e.origin.y/i);a>=n;n++)s[1].push(n);return s}});s(i,{ShapesQuadTree:m,QuadNode:p})}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("drawing/svg.min",["drawing/shapes.min","util/main.min"],e)}(function(){!function(e){function t(e){var t,n,i,o;try{t=e.getScreenCTM?e.getScreenCTM():null}catch(r){}t&&(n=-t.e%1,i=-t.f%1,o=e.style,0===n&&0===i||(o.left=n+"px",o.top=i+"px"))}function n(){var e=document.getElementsByTagName("base")[0],t="",n=document.location.href,i=n.indexOf("#");return e&&!d.support.browser.msie&&(-1!==i&&(n=n.substring(0,i)),t=n),t}function i(e){return"url("+n()+"#"+e+")"}function o(e){var t,n,i,o=new z,r=e.clippedBBox();return r&&(t=r.getOrigin(),n=new f.Group,n.transform(h.transform().translate(-t.x,-t.y)),n.children.push(e),e=n),o.load([e]),i=""+o.render()+"",o.destroy(),i}function r(t,n){var i=o(t);return n&&n.raw||(i="data:image/svg+xml;base64,"+m.encodeBase64(i)),e.Deferred().resolve(i).promise()}function a(e,t){return"clip"==e||"fill"==e&&(!t||t.nodeType==C)}function s(e){if(!e||!e.indexOf||e.indexOf("&")<0)return e;var t=s._element;return t.innerHTML=e,t.textContent||t.innerText}var l,c=document,d=window.kendo,u=d.deepExtend,h=d.geometry,f=d.drawing,p=f.BaseNode,m=d.util,g=m.defined,v=m.isTransparent,_=m.renderAttr,b=m.renderAllAttr,w=m.renderTemplate,y=e.inArray,k="butt",x=f.DASH_ARRAYS,C="gradient",S="none",T=".kendo",D="solid",A=" ",E="http://www.w3.org/2000/svg",I="transform",R="undefined",M=f.Surface.extend({init:function(e,n){f.Surface.fn.init.call(this,e,n),this._root=new z(this.options),Q(this.element[0],this._template(this)),this._rootElement=this.element[0].firstElementChild,t(this._rootElement),this._root.attachTo(this._rootElement),this.element.on("click"+T,this._click),this.element.on("mouseover"+T,this._mouseenter),this.element.on("mouseout"+T,this._mouseleave),this.element.on("mousemove"+T,this._mousemove),this.resize()},type:"svg",destroy:function(){this._root&&(this._root.destroy(),this._root=null,this._rootElement=null,this.element.off(T)),f.Surface.fn.destroy.call(this)},translate:function(e){var t=d.format("{0} {1} {2} {3}",Math.round(e.x),Math.round(e.y),this._size.width,this._size.height);this._offset=e,this._rootElement.setAttribute("viewBox",t)},draw:function(e){f.Surface.fn.draw.call(this,e),this._root.load([e])},clear:function(){f.Surface.fn.clear.call(this),this._root.clear()},svg:function(){return""+this._template(this)},exportVisual:function(){var e,t=this._visual,n=this._offset;return n&&(e=new f.Group,e.children.push(t),e.transform(h.transform().translate(-n.x,-n.y)),t=e),t},_resize:function(){this._offset&&this.translate(this._offset)},_template:w("#= d._root.render() #")}),F=p.extend({init:function(e){p.fn.init.call(this,e),this.definitions={}},destroy:function(){this.element&&(this.element._kendoNode=null,this.element=null),this.clearDefinitions(),p.fn.destroy.call(this)},load:function(e,t){var n,i,o,r,a=this,s=a.element;for(r=0;e.length>r;r++)i=e[r],o=i.children,n=new K[i.nodeType](i),g(t)?a.insertAt(n,t):a.append(n),n.createDefinitions(),o&&o.length>0&&n.load(o),s&&n.attachTo(s,t)},root:function(){for(var e=this;e.parent;)e=e.parent;return e},attachTo:function(e,t){var n,i=c.createElement("div");Q(i,""+this.render()+""),n=i.firstChild.firstChild,n&&(g(t)?e.insertBefore(n,e.childNodes[t]||null):e.appendChild(n),this.setElement(n))},setElement:function(e){var t,n,i=this.childNodes;for(this.element&&(this.element._kendoNode=null),this.element=e,this.element._kendoNode=this,n=0;i.length>n;n++)t=e.childNodes[n],i[n].setElement(t)},clear:function(){var e,t;for(this.clearDefinitions(),this.element&&(this.element.innerHTML=""),e=this.childNodes,t=0;e.length>t;t++)e[t].destroy();this.childNodes=[]},removeSelf:function(){if(this.element){var e=this.element.parentNode;e&&e.removeChild(this.element),this.element=null}p.fn.removeSelf.call(this)},template:w("#= d.renderChildren() #"),render:function(){return this.template(this)},renderChildren:function(){var e,t=this.childNodes,n="";for(e=0;t.length>e;e++)n+=t[e].render();return n},optionsChange:function(e){var t=e.field,n=e.value;"visible"===t?this.css("display",n?"":S):l[t]&&a(t,n)?this.updateDefinition(t,n):"opacity"===t&&this.attr("opacity",n),p.fn.optionsChange.call(this,e)},attr:function(e,t){this.element&&this.element.setAttribute(e,t)},allAttr:function(e){for(var t=0;e.length>t;t++)this.attr(e[t][0],e[t][1])},css:function(e,t){this.element&&(this.element.style[e]=t)},allCss:function(e){for(var t=0;e.length>t;t++)this.css(e[t][0],e[t][1])},removeAttr:function(e){this.element&&this.element.removeAttribute(e)},mapTransform:function(e){var t=[];return e&&t.push([I,"matrix("+e.matrix().toString(6)+")"]),t},renderTransform:function(){return b(this.mapTransform(this.srcElement.transform()))},transformChange:function(e){e?this.allAttr(this.mapTransform(e)):this.removeAttr(I)},mapStyle:function(){var e=this.srcElement.options,t=[["cursor",e.cursor]];return e.visible===!1&&t.push(["display",S]),t},renderStyle:function(){return _("style",m.renderStyle(this.mapStyle(!0)))},renderOpacity:function(){return _("opacity",this.srcElement.options.opacity)},createDefinitions:function(){var e,t,n,i,o=this.srcElement,r=this.definitions;if(o){n=o.options;for(t in l)e=n.get(t),e&&a(t,e)&&(r[t]=e,i=!0);i&&this.definitionChange({action:"add",definitions:r})}},definitionChange:function(e){this.parent&&this.parent.definitionChange(e)},updateDefinition:function(e,t){var n=this.definitions,o=n[e],r=l[e],a={};o&&(a[e]=o,this.definitionChange({action:"remove",definitions:a}),delete n[e]),t?(a[e]=t,this.definitionChange({action:"add",definitions:a}),n[e]=t,this.attr(r,i(t.id))):o&&this.removeAttr(r)},clearDefinitions:function(){var e,t=this.definitions;for(e in t){this.definitionChange({action:"remove",definitions:t}),this.definitions={};break}},renderDefinitions:function(){return b(this.mapDefinitions())},mapDefinitions:function(){var e,t=this.definitions,n=[];for(e in t)n.push([l[e],i(t[e].id)]);return n}}),z=F.extend({init:function(e){F.fn.init.call(this),this.options=e,this.defs=new P},attachTo:function(e){this.element=e,this.defs.attachTo(e.firstElementChild)},clear:function(){p.fn.clear.call(this)},template:w("#=d.defs.render()##= d.renderChildren() #"),definitionChange:function(e){this.defs.definitionChange(e)}}),P=F.extend({init:function(){F.fn.init.call(this),this.definitionMap={}},attachTo:function(e){this.element=e},template:w("#= d.renderChildren()#"),definitionChange:function(e){var t=e.definitions,n=e.action;"add"==n?this.addDefinitions(t):"remove"==n&&this.removeDefinitions(t)},createDefinition:function(e,t){var n;return"clip"==e?n=B:"fill"==e&&(t instanceof f.LinearGradient?n=G:t instanceof f.RadialGradient&&(n=$)),new n(t)},addDefinitions:function(e){for(var t in e)this.addDefinition(t,e[t])},addDefinition:function(e,t){var n,i=this.definitionMap,o=t.id,r=this.element,a=i[o];a?a.count++:(n=this.createDefinition(e,t),i[o]={element:n,count:1},this.append(n),r&&n.attachTo(this.element))},removeDefinitions:function(e){for(var t in e)this.removeDefinition(e[t])},removeDefinition:function(e){var t=this.definitionMap,n=e.id,i=t[n];i&&(i.count--,0===i.count&&(this.remove(y(i.element,this.childNodes),1),delete t[n]))}}),B=F.extend({init:function(e){F.fn.init.call(this),this.srcElement=e,this.id=e.id,this.load([e])},template:w("#= d.renderChildren()#")}),L=F.extend({template:w("#= d.renderChildren() #"),optionsChange:function(e){e.field==I&&this.transformChange(e.value),F.fn.optionsChange.call(this,e)}}),H=F.extend({geometryChange:function(){this.attr("d",this.renderData()),this.invalidate()},optionsChange:function(e){switch(e.field){case"fill":e.value?this.allAttr(this.mapFill(e.value)):this.removeAttr("fill");break;case"fill.color":this.allAttr(this.mapFill({color:e.value}));break;case"stroke":e.value?this.allAttr(this.mapStroke(e.value)):this.removeAttr("stroke");break;case I:this.transformChange(e.value);break;default:var t=this.attributeMap[e.field];t&&this.attr(t,e.value)}F.fn.optionsChange.call(this,e)},attributeMap:{"fill.opacity":"fill-opacity","stroke.color":"stroke","stroke.width":"stroke-width","stroke.opacity":"stroke-opacity"},content:function(){this.element&&(this.element.textContent=this.srcElement.content())},renderData:function(){return this.printPath(this.srcElement)},printPath:function(e){var t,n,i,o,r,a=e.segments,s=a.length;if(s>0){for(t=[],r=1;s>r;r++)i=this.segmentType(a[r-1],a[r]),i!==o&&(o=i,t.push(i)),t.push("L"===i?this.printPoints(a[r].anchor()):this.printPoints(a[r-1].controlOut(),a[r].controlIn(),a[r].anchor()));return n="M"+this.printPoints(a[0].anchor())+A+t.join(A),e.options.closed&&(n+="Z"),n}},printPoints:function(){var e,t=arguments,n=t.length,i=[];for(e=0;n>e;e++)i.push(t[e].toString(3));return i.join(A)},segmentType:function(e,t){return e.controlOut()&&t.controlIn()?"C":"L"},mapStroke:function(e){var t=[];return e&&!v(e.color)?(t.push(["stroke",e.color]),t.push(["stroke-width",e.width]),t.push(["stroke-linecap",this.renderLinecap(e)]),t.push(["stroke-linejoin",e.lineJoin]),g(e.opacity)&&t.push(["stroke-opacity",e.opacity]),g(e.dashType)&&t.push(["stroke-dasharray",this.renderDashType(e)])):t.push(["stroke",S]),t},renderStroke:function(){return b(this.mapStroke(this.srcElement.options.stroke))},renderDashType:function(e){var t,n,i,o=e.width||1,r=e.dashType;if(r&&r!=D){for(t=x[r.toLowerCase()],n=[],i=0;t.length>i;i++)n.push(t[i]*o);return n.join(" ")}},renderLinecap:function(e){var t=e.dashType,n=e.lineCap;return t&&t!=D?k:n},mapFill:function(e){var t=[];return e&&e.nodeType==C||(e&&!v(e.color)?(t.push(["fill",e.color]),g(e.opacity)&&t.push(["fill-opacity",e.opacity])):t.push(["fill",S])),t},renderFill:function(){return b(this.mapFill(this.srcElement.options.fill))},template:w("")}),N=H.extend({renderData:function(){return this.printPath(this.srcElement.toPath())}}),O=H.extend({renderData:function(){var e,t,n=this.srcElement.paths;if(n.length>0){for(e=[],t=0;n.length>t;t++)e.push(this.printPath(n[t]));return e.join(" ")}}}),V=H.extend({geometryChange:function(){var e=this.center();this.attr("cx",e.x),this.attr("cy",e.y),this.attr("r",this.radius()),this.invalidate()},center:function(){return this.srcElement.geometry().center},radius:function(){return this.srcElement.geometry().radius},template:w("")}),W=H.extend({geometryChange:function(){var e=this.pos();this.attr("x",e.x),this.attr("y",e.y),this.invalidate()},optionsChange:function(e){"font"===e.field?(this.attr("style",m.renderStyle(this.mapStyle())),this.geometryChange()):"content"===e.field&&H.fn.content.call(this,this.srcElement.content()),H.fn.optionsChange.call(this,e)},mapStyle:function(e){var t=H.fn.mapStyle.call(this,e),n=this.srcElement.options.font;return e&&(n=d.htmlEncode(n)),t.push(["font",n]),t},pos:function(){var e=this.srcElement.position(),t=this.srcElement.measure();return e.clone().setY(e.y+t.baseline)},renderContent:function(){var e=this.srcElement.content();return e=s(e),e=d.htmlEncode(e)},template:w("#= d.renderContent() #")}),U=H.extend({geometryChange:function(){this.allAttr(this.mapPosition()),this.invalidate()},optionsChange:function(e){"src"===e.field&&this.allAttr(this.mapSource()),H.fn.optionsChange.call(this,e)},mapPosition:function(){var e=this.srcElement.rect(),t=e.topLeft();return[["x",t.x],["y",t.y],["width",e.width()+"px"],["height",e.height()+"px"]]},renderPosition:function(){return b(this.mapPosition())},mapSource:function(e){var t=this.srcElement.src();return e&&(t=d.htmlEncode(t)),[["xlink:href",t]]},renderSource:function(){return b(this.mapSource(!0))},template:w("")}),j=F.extend({template:w(""),renderOffset:function(){return _("offset",this.srcElement.offset())},mapStyle:function(){var e=this.srcElement;return[["stop-color",e.color()],["stop-opacity",e.opacity()]]},optionsChange:function(e){"offset"==e.field?this.attr(e.field,e.value):"color"!=e.field&&"opacity"!=e.field||this.css("stop-"+e.field,e.value)}}),q=F.extend({init:function(e){F.fn.init.call(this,e),this.id=e.id,this.loadStops()},loadStops:function(){var e,t,n=this.srcElement,i=n.stops,o=this.element;for(t=0;i.length>t;t++)e=new j(i[t]),this.append(e),o&&e.attachTo(o)},optionsChange:function(e){"gradient.stops"==e.field?(p.fn.clear.call(this),this.loadStops()):e.field==C&&this.allAttr(this.mapCoordinates())},renderCoordinates:function(){return b(this.mapCoordinates())},mapSpace:function(){return["gradientUnits",this.srcElement.userSpace()?"userSpaceOnUse":"objectBoundingBox"]}}),G=q.extend({template:w("#= d.renderChildren()#"),mapCoordinates:function(){var e=this.srcElement,t=e.start(),n=e.end(),i=[["x1",t.x],["y1",t.y],["x2",n.x],["y2",n.y],this.mapSpace()];return i}}),$=q.extend({template:w("#= d.renderChildren()#"),mapCoordinates:function(){var e=this.srcElement,t=e.center(),n=e.radius(),i=[["cx",t.x],["cy",t.y],["r",n],this.mapSpace()];return i}}),Y=H.extend({geometryChange:function(){var e=this.srcElement.geometry();this.attr("x",e.origin.x),this.attr("y",e.origin.y),this.attr("width",e.size.width),this.attr("height",e.size.height),this.invalidate()},size:function(){return this.srcElement.geometry().size},origin:function(){return this.srcElement.geometry().origin},template:w("")}),K={Group:L,Text:W,Path:H,MultiPath:O,Circle:V,Arc:N,Image:U,Rect:Y},Q=function(e,t){e.innerHTML=t};!function(){var e="",t=c.createElement("div"),n=typeof DOMParser!=R;t.innerHTML=e,n&&t.firstChild.namespaceURI!=E&&(Q=function(e,t){var n=new DOMParser,i=n.parseFromString(t,"text/xml"),o=c.adoptNode(i.documentElement);e.innerHTML="",e.appendChild(o)})}(),s._element=document.createElement("span"),l={clip:"clip-path",fill:"fill"},d.support.svg=function(){return c.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")}(),d.support.svg&&f.SurfaceFactory.current.register("svg",M,10),u(f,{exportSVG:r,svg:{ArcNode:N,CircleNode:V,ClipNode:B,DefinitionNode:P,GradientStopNode:j,GroupNode:L,ImageNode:U,LinearGradientNode:G,MultiPathNode:O,Node:F,PathNode:H,RadialGradientNode:$,RectNode:Y,RootNode:z,Surface:M,TextNode:W,_exportGroup:o}})}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("drawing/canvas.min",["drawing/search.min","kendo.color.min"],e)}(function(){!function(e){function t(t,n){var i,o,r,a,s,l,c={width:"800px",height:"600px",cors:"Anonymous"},d=t.clippedBBox();return d&&(i=d.getOrigin(),o=new y.Group,o.transform(w.transform().translate(-i.x,-i.y)),o.children.push(t),t=o,r=d.getSize(),c.width=r.width+"px",c.height=r.height+"px"),n=p(c,n),a=e("
        ").css({display:"none",width:n.width,height:n.height}).appendTo(document.body),s=new E(a,n),s.suspendTracking(),s.draw(t),l=s.image(),l.always(function(){s.destroy(),a.remove()}),l}function n(e,t){var n,i,o;for(o=0;t.length>o;o++)i=t[o],n=f.parseColor(i.color()),n.a*=i.opacity(),e.addColorStop(i.offset(),n.toCssRgba())}var i,o,r,a,s,l,c,d,u,h=document,f=window.kendo,p=f.deepExtend,m=f.util,g=m.defined,v=m.isTransparent,_=m.renderTemplate,b=m.valueOrDefault,w=f.geometry,y=f.drawing,k=y.BaseNode,x=e.proxy,C="butt",S=y.DASH_ARRAYS,T=1e3/60,D="solid",A=".kendo",E=y.Surface.extend({init:function(t,n){y.Surface.fn.init.call(this,t,n),this.element[0].innerHTML=this._template(this);var o=this.element[0].firstElementChild;o.width=e(t).width(),o.height=e(t).height(),this._rootElement=o,this._root=new i(o)},destroy:function(){y.Surface.fn.destroy.call(this),this._root&&(this._root.destroy(),this._root=null),this._searchTree&&(this._searchTree.clear(),delete this._searchTree),this.element.off(A)},type:"canvas",draw:function(e){y.Surface.fn.draw.call(this,e),this._root.load([e],void 0,this.options.cors),this._searchTree&&this._searchTree.add([e])},clear:function(){y.Surface.fn.clear.call(this),this._root.clear(),this._searchTree&&this._searchTree.clear()},eventTarget:function(e){var t,n;return this._searchTree?(t=this._surfacePoint(e),n=this._searchTree.pointShape(t)):void 0},image:function(){var t,n=this._root,i=this._rootElement,o=[];return n.traverse(function(e){e.loading&&o.push(e.loading)}),t=e.Deferred(),e.when.apply(e,o).done(function(){n._invalidate();try{var e=i.toDataURL();t.resolve(e)}catch(o){t.reject(o)}}).fail(function(e){t.reject(e)}),t.promise()},suspendTracking:function(){y.Surface.fn.suspendTracking.call(this),this._searchTree&&(this._searchTree.clear(),delete this._searchTree)},resumeTracking:function(){var e,t,n;if(y.Surface.fn.resumeTracking.call(this),!this._searchTree){for(this._searchTree=new y.ShapesQuadTree,e=this._root.childNodes,t=[],n=0;e.length>n;n++)t.push(e[n].srcElement);this._searchTree.add(t)}},_resize:function(){this._rootElement.width=this._size.width,this._rootElement.height=this._size.height,this._root.invalidate()},_template:_(""),_enableTracking:function(){this._searchTree=new y.ShapesQuadTree,this._mouseTrackHandler=x(this._trackMouse,this),this.element.on("click"+A,this._mouseTrackHandler),this.element.on("mousemove"+A,this._mouseTrackHandler),y.Surface.fn._enableTracking.call(this)},_trackMouse:function(e){var t,n;this._suspendedTracking||(t=this.eventTarget(e),"click"!=e.type?(n=this._currentShape,n&&n!==t&&this.trigger("mouseleave",{element:n,originalEvent:e,type:"mouseleave"}),t&&n!==t&&this.trigger("mouseenter",{element:t,originalEvent:e,type:"mouseenter"}),this.trigger("mousemove",{element:t,originalEvent:e,type:"mousemove"}),this._currentShape=t):t&&this.trigger("click",{element:t,originalEvent:e,type:"click"}))}}),I=k.extend({init:function(e){k.fn.init.call(this,e),e&&this.initClip()},initClip:function(){var e=this.srcElement.clip();e&&(this.clip=e,e.addObserver(this))},clear:function(){this.srcElement&&this.srcElement.removeObserver(this),this.clearClip(),k.fn.clear.call(this)},clearClip:function(){this.clip&&(this.clip.removeObserver(this),delete this.clip)},setClip:function(e){this.clip&&(e.beginPath(),o.fn.renderPoints(e,this.clip),e.clip())},optionsChange:function(e){"clip"==e.field&&(this.clearClip(),this.initClip()),k.fn.optionsChange.call(this,e)},setTransform:function(e){if(this.srcElement){var t=this.srcElement.transform();t&&e.transform.apply(e,t.matrix().toArray(6))}},loadElements:function(e,t,n){ +var i,o,r,a,s=this;for(a=0;e.length>a;a++)o=e[a],r=o.children,i=new u[o.nodeType](o,n),r&&r.length>0&&i.load(r,t,n),g(t)?s.insertAt(i,t):s.append(i)},load:function(e,t,n){this.loadElements(e,t,n),this.invalidate()},setOpacity:function(e){if(this.srcElement){var t=this.srcElement.opacity();g(t)&&this.globalAlpha(e,t)}},globalAlpha:function(e,t){t&&e.globalAlpha&&(t*=e.globalAlpha),e.globalAlpha=t},visible:function(){var e=this.srcElement;return!e||e&&e.options.visible!==!1}}),R=I.extend({renderTo:function(e){var t,n,i;if(this.visible()){for(e.save(),this.setTransform(e),this.setClip(e),this.setOpacity(e),t=this.childNodes,n=0;t.length>n;n++)i=t[n],i.visible()&&i.renderTo(e);e.restore()}}});y.mixins.Traversable.extend(R.fn,"childNodes"),i=R.extend({init:function(e){R.fn.init.call(this),this.canvas=e,this.ctx=e.getContext("2d");var t=x(this._invalidate,this);this.invalidate=f.throttle(function(){f.animationFrame(t)},T)},destroy:function(){R.fn.destroy.call(this),this.canvas=null,this.ctx=null},load:function(e,t,n){this.loadElements(e,t,n),this._invalidate()},_invalidate:function(){this.ctx&&(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.renderTo(this.ctx))}}),y.mixins.Traversable.extend(i.fn,"childNodes"),o=I.extend({renderTo:function(e){e.save(),this.setTransform(e),this.setClip(e),this.setOpacity(e),e.beginPath(),this.renderPoints(e,this.srcElement),this.setLineDash(e),this.setLineCap(e),this.setLineJoin(e),this.setFill(e),this.setStroke(e),e.restore()},setFill:function(e){var t=this.srcElement.options.fill,n=!1;return t&&("gradient"==t.nodeType?(this.setGradientFill(e,t),n=!0):v(t.color)||(e.fillStyle=t.color,e.save(),this.globalAlpha(e,t.opacity),e.fill(),e.restore(),n=!0)),n},setGradientFill:function(e,t){var i,o,r,a,s=this.srcElement.rawBBox();t instanceof y.LinearGradient?(o=t.start(),r=t.end(),i=e.createLinearGradient(o.x,o.y,r.x,r.y)):t instanceof y.RadialGradient&&(a=t.center(),i=e.createRadialGradient(a.x,a.y,0,a.x,a.y,t.radius())),n(i,t.stops),e.save(),t.userSpace()||e.transform(s.width(),0,0,s.height(),s.origin.x,s.origin.y),e.fillStyle=i,e.fill(),e.restore()},setStroke:function(e){var t=this.srcElement.options.stroke;return t&&!v(t.color)&&t.width>0?(e.strokeStyle=t.color,e.lineWidth=b(t.width,1),e.save(),this.globalAlpha(e,t.opacity),e.stroke(),e.restore(),!0):void 0},dashType:function(){var e=this.srcElement.options.stroke;return e&&e.dashType?e.dashType.toLowerCase():void 0},setLineDash:function(e){var t,n=this.dashType();n&&n!=D&&(t=S[n],e.setLineDash?e.setLineDash(t):(e.mozDash=t,e.webkitLineDash=t))},setLineCap:function(e){var t=this.dashType(),n=this.srcElement.options.stroke;t&&t!==D?e.lineCap=C:n&&n.lineCap&&(e.lineCap=n.lineCap)},setLineJoin:function(e){var t=this.srcElement.options.stroke;t&&t.lineJoin&&(e.lineJoin=t.lineJoin)},renderPoints:function(e,t){var n,i,o,r,a,s,l=t.segments;if(0!==l.length){for(n=l[0],i=n.anchor(),e.moveTo(i.x,i.y),o=1;l.length>o;o++)n=l[o],i=n.anchor(),r=l[o-1],a=r.controlOut(),s=n.controlIn(),a&&s?e.bezierCurveTo(a.x,a.y,s.x,s.y,i.x,i.y):e.lineTo(i.x,i.y);t.options.closed&&e.closePath()}}}),r=o.extend({renderPoints:function(e){var t,n=this.srcElement.paths;for(t=0;n.length>t;t++)o.fn.renderPoints(e,n[t])}}),a=o.extend({renderPoints:function(e){var t=this.srcElement.geometry(),n=t.center,i=t.radius;e.arc(n.x,n.y,i,0,2*Math.PI)}}),s=o.extend({renderPoints:function(e){var t=this.srcElement.toPath();o.fn.renderPoints.call(this,e,t)}}),l=o.extend({renderTo:function(e){var t=this.srcElement,n=t.position(),i=t.measure();e.save(),this.setTransform(e),this.setClip(e),this.setOpacity(e),e.beginPath(),e.font=t.options.font,this.setFill(e)&&e.fillText(t.content(),n.x,n.y+i.baseline),this.setStroke(e)&&(this.setLineDash(e),e.strokeText(t.content(),n.x,n.y+i.baseline)),e.restore()}}),c=o.extend({init:function(t,n){o.fn.init.call(this,t),this.onLoad=x(this.onLoad,this),this.onError=x(this.onError,this),this.loading=e.Deferred();var i=this.img=new Image;n&&!/^data:/i.test(t.src())&&(i.crossOrigin=n),i.src=t.src(),i.complete?this.onLoad():(i.onload=this.onLoad,i.onerror=this.onError)},renderTo:function(e){"resolved"===this.loading.state()&&(e.save(),this.setTransform(e),this.setClip(e),this.drawImage(e),e.restore())},optionsChange:function(t){"src"===t.field?(this.loading=e.Deferred(),this.img.src=this.srcElement.src()):o.fn.optionsChange.call(this,t)},onLoad:function(){this.loading.resolve(),this.invalidate()},onError:function(){this.loading.reject(Error("Unable to load image '"+this.img.src+"'. Check for connectivity and verify CORS headers."))},drawImage:function(e){var t=this.srcElement.rect(),n=t.topLeft();e.drawImage(this.img,n.x,n.y,t.width(),t.height())}}),d=o.extend({renderPoints:function(e){var t=this.srcElement.geometry(),n=t.origin,i=t.size;e.rect(n.x,n.y,i.width,i.height)}}),u={Group:R,Text:l,Path:o,MultiPath:r,Circle:a,Arc:s,Image:c,Rect:d},f.support.canvas=function(){return!!h.createElement("canvas").getContext}(),f.support.canvas&&y.SurfaceFactory.current.register("canvas",E,20),p(f.drawing,{exportImage:t,canvas:{ArcNode:s,CircleNode:a,GroupNode:R,ImageNode:c,MultiPathNode:r,Node:I,PathNode:o,RectNode:d,RootNode:i,Surface:E,TextNode:l}})}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("drawing/vml.min",["drawing/shapes.min","kendo.color.min"],e)}(function(){!function(e){function t(){if(u.namespaces&&!u.namespaces.kvml){u.namespaces.add("kvml","urn:schemas-microsoft-com:vml");var e=u.styleSheets.length>30?u.styleSheets[0]:u.createStyleSheet();e.addRule(".kvml","behavior:url(#default#VML)")}}function n(e){var t=u.createElement("kvml:"+e);return t.className="kvml",t}function i(e){var t,n=e.length,i=[];for(t=0;n>t;t++)i.push(e[t].scaleCopy(M).toString(0,","));return i.join(" ")}function o(e,t){var n,o,a,s,l,c=e.segments,d=c.length;if(d>0){for(n=[],l=1;d>l;l++)a=r(c[l-1],c[l]),a!==s&&(s=a,n.push(a)),n.push("l"===a?i([c[l].anchor()]):i([c[l-1].controlOut(),c[l].controlIn(),c[l].anchor()]));return o="m "+i([c[0].anchor()])+" "+n.join(" "),e.options.closed&&(o+=" x"),t!==!0&&(o+=" e"),o}}function r(e,t){return e.controlOut()&&t.controlIn()?"c":"l"}function a(e){return 0===e.indexOf("fill")||0===e.indexOf(z)}function s(e,t,n){var i,o=n*E(t.opacity(),1);return i=e?l(e,t.color(),o):l(t.color(),"#fff",1-o)}function l(e,t,n){var i=new x(e),o=new x(t),r=c(i.r,o.r,n),a=c(i.g,o.g,n),s=c(i.b,o.b,n);return new x(r,a,s).toHex()}function c(e,t,n){return h.round(n*t+(1-n)*e)}var d,u=document,h=Math,f=h.atan2,p=h.ceil,m=h.sqrt,g=window.kendo,v=g.deepExtend,_=e.noop,b=g.drawing,w=b.BaseNode,y=g.geometry,k=y.toMatrix,x=g.Color,C=g.util,S=C.isTransparent,T=C.defined,D=C.deg,A=C.round,E=C.valueOrDefault,I="none",R=".kendo",M=100,F=M*M,z="gradient",P=4,B=b.Surface.extend({init:function(e,n){b.Surface.fn.init.call(this,e,n),t(),this.element.empty(),this._root=new H,this._root.attachTo(this.element[0]),this.element.on("click"+R,this._click),this.element.on("mouseover"+R,this._mouseenter),this.element.on("mouseout"+R,this._mouseleave),this.element.on("mousemove"+R,this._mousemove)},type:"vml",destroy:function(){this._root&&(this._root.destroy(),this._root=null,this.element.off(R)),b.Surface.fn.destroy.call(this)},draw:function(e){b.Surface.fn.draw.call(this,e),this._root.load([e],void 0,null)},clear:function(){b.Surface.fn.clear.call(this),this._root.clear()}}),L=w.extend({init:function(e){w.fn.init.call(this,e),this.createElement(),this.attachReference()},observe:_,destroy:function(){this.element&&(this.element._kendoNode=null,this.element=null),w.fn.destroy.call(this)},clear:function(){var e,t;for(this.element&&(this.element.innerHTML=""),e=this.childNodes,t=0;e.length>t;t++)e[t].destroy();this.childNodes=[]},removeSelf:function(){this.element&&(this.element.parentNode.removeChild(this.element),this.element=null),w.fn.removeSelf.call(this)},createElement:function(){this.element=u.createElement("div")},attachReference:function(){this.element._kendoNode=this},load:function(e,t,n,i){var o,r,a,s,l,c;for(i=E(i,1),this.srcElement&&(i*=E(this.srcElement.options.opacity,1)),o=0;e.length>o;o++)r=e[o],a=r.children,s=r.currentTransform(n),l=i*E(r.options.opacity,1),c=new le[r.nodeType](r,s,l),a&&a.length>0&&c.load(a,t,s,i),T(t)?this.insertAt(c,t):this.append(c),c.attachTo(this.element,t)},attachTo:function(e,t){T(t)?e.insertBefore(this.element,e.children[t]||null):e.appendChild(this.element)},optionsChange:function(e){"visible"==e.field&&this.css("display",e.value!==!1?"":I)},setStyle:function(){this.allCss(this.mapStyle())},mapStyle:function(){var e=[];return this.srcElement&&this.srcElement.options.visible===!1&&e.push(["display",I]),e},mapOpacityTo:function(e,t){var n=E(this.opacity,1);n*=E(t,1),e.push(["opacity",n])},attr:function(e,t){this.element&&(this.element[e]=t)},allAttr:function(e){for(var t=0;e.length>t;t++)this.attr(e[t][0],e[t][1])},css:function(e,t){this.element&&(this.element.style[e]=t)},allCss:function(e){for(var t=0;e.length>t;t++)this.css(e[t][0],e[t][1])}}),H=L.extend({createElement:function(){L.fn.createElement.call(this),this.allCss([["width","100%"],["height","100%"],["position","relative"],["visibility","visible"]])},attachReference:_}),N=g.Class.extend({init:function(e,t){this.srcElement=e,this.observer=t,e.addObserver(this)},geometryChange:function(){this.observer.optionsChange({field:"clip",value:this.srcElement})},clear:function(){this.srcElement.removeObserver(this)}}),O=L.extend({init:function(e){L.fn.init.call(this,e),e&&this.initClip()},observe:function(){w.fn.observe.call(this)},mapStyle:function(){var e=L.fn.mapStyle.call(this);return this.srcElement&&this.srcElement.clip()&&e.push(["clip",this.clipRect()]),e},optionsChange:function(e){"clip"==e.field&&(this.clearClip(),this.initClip(),this.setClip()),L.fn.optionsChange.call(this,e)},clear:function(){this.clearClip(),L.fn.clear.call(this)},initClip:function(){this.srcElement.clip()&&(this.clip=new N(this.srcElement.clip(),this),this.clip.observer=this)},clearClip:function(){this.clip&&(this.clip.clear(),this.clip=null,this.css("clip",this.clipRect()))},setClip:function(){this.clip&&this.css("clip",this.clipRect())},clipRect:function(){var e,t,n,i=d,o=this.srcElement.clip();return o&&(e=this.clipBBox(o),t=e.topLeft(),n=e.bottomRight(),i=g.format("rect({0}px {1}px {2}px {3}px)",t.y,n.x,n.y,t.x)),i},clipBBox:function(e){var t=this.srcElement.rawBBox().topLeft(),n=e.rawBBox();return n.origin.translate(-t.x,-t.y),n}}),V=O.extend({createElement:function(){L.fn.createElement.call(this),this.setStyle()},attachTo:function(e,t){this.css("display",I),L.fn.attachTo.call(this,e,t),this.srcElement.options.visible!==!1&&this.css("display","")},_attachTo:function(e){var t=document.createDocumentFragment();t.appendChild(this.element),e.appendChild(t)},mapStyle:function(){var e=O.fn.mapStyle.call(this);return e.push(["position","absolute"]),e.push(["white-space","nowrap"]),e},optionsChange:function(e){"transform"===e.field&&this.refreshTransform(),"opacity"===e.field&&this.refreshOpacity(),O.fn.optionsChange.call(this,e)},refreshTransform:function(e){var t,n=this.srcElement.currentTransform(e),i=this.childNodes,o=i.length;for(this.setClip(),t=0;o>t;t++)i[t].refreshTransform(n)},currentOpacity:function(){var e=E(this.srcElement.options.opacity,1);return this.parent&&this.parent.currentOpacity&&(e*=this.parent.currentOpacity()),e},refreshOpacity:function(){var e,t=this.childNodes,n=t.length,i=this.currentOpacity();for(e=0;n>e;e++)t[e].refreshOpacity(i)},initClip:function(){if(O.fn.initClip.call(this),this.clip){var e=this.clip.srcElement.bbox(this.srcElement.currentTransform());e&&(this.css("width",e.width()+e.origin.x),this.css("height",e.height()+e.origin.y))}},clipBBox:function(e){return e.bbox(this.srcElement.currentTransform())},clearClip:function(){O.fn.clearClip.call(this)}}),W=L.extend({init:function(e,t){this.opacity=t,L.fn.init.call(this,e)},createElement:function(){this.element=n("stroke"),this.setOpacity()},optionsChange:function(e){0===e.field.indexOf("stroke")&&this.setStroke()},refreshOpacity:function(e){this.opacity=e,this.setStroke()},setStroke:function(){this.allAttr(this.mapStroke())},setOpacity:function(){this.setStroke()},mapStroke:function(){var e,t=this.srcElement.options.stroke,n=[];return t&&!S(t.color)&&0!==t.width?(n.push(["on","true"]),n.push(["color",t.color]),n.push(["weight",(t.width||1)+"px"]),this.mapOpacityTo(n,t.opacity),T(t.dashType)&&n.push(["dashstyle",t.dashType]),T(t.lineJoin)&&n.push(["joinstyle",t.lineJoin]),T(t.lineCap)&&(e=t.lineCap.toLowerCase(),"butt"===e&&(e="butt"===e?"flat":e),n.push(["endcap",e]))):n.push(["on","false"]),n}}),U=L.extend({init:function(e,t,n){this.opacity=n,L.fn.init.call(this,e)},createElement:function(){this.element=n("fill"),this.setFill()},optionsChange:function(e){a(e.field)&&this.setFill()},refreshOpacity:function(e){this.opacity=e,this.setOpacity()},setFill:function(){this.allAttr(this.mapFill())},setOpacity:function(){this.setFill()},attr:function(e,t){var n,i=this.element;if(i){for(n=e.split(".");n.length>1;)i=i[n.shift()];i[n[0]]=t}},mapFill:function(){var e=this.srcElement.fill(),t=[["on","false"]];return e&&(e.nodeType==z?t=this.mapGradient(e):S(e.color)||(t=this.mapFillColor(e))),t},mapFillColor:function(e){var t=[["on","true"],["color",e.color]];return this.mapOpacityTo(t,e.opacity),t},mapGradient:function(e){var t,n=this.srcElement.options,i=n.fallbackFill||e.fallbackFill&&e.fallbackFill();return t=e instanceof b.LinearGradient?this.mapLinearGradient(e):e instanceof b.RadialGradient&&e.supportVML?this.mapRadialGradient(e):i?this.mapFillColor(i):[["on","false"]]},mapLinearGradient:function(e){var t=e.start(),n=e.end(),i=C.deg(f(n.y-t.y,n.x-t.x)),o=[["on","true"],["type",z],["focus",0],["method","none"],["angle",270-i]];return this.addColors(o),o},mapRadialGradient:function(e){var t=this.srcElement.rawBBox(),n=e.center(),i=(n.x-t.origin.x)/t.width(),o=(n.y-t.origin.y)/t.height(),r=[["on","true"],["type","gradienttitle"],["focus","100%"],["focusposition",i+" "+o],["method","none"]];return this.addColors(r),r},addColors:function(e){var t,n,i=this.srcElement.options,o=E(this.opacity,1),r=[],a=i.fill.stops,l=i.baseColor,c=this.element.colors?"colors.value":"colors",d=s(l,a[0],o),u=s(l,a[a.length-1],o);for(n=0;a.length>n;n++)t=a[n],r.push(h.round(100*t.offset())+"% "+s(l,t,o));e.push([c,r.join(",")],["color",d],["color2",u])}}),j=L.extend({init:function(e,t){this.transform=t,L.fn.init.call(this,e)},createElement:function(){this.element=n("skew"),this.setTransform()},optionsChange:function(e){"transform"===e.field&&this.refresh(this.srcElement.currentTransform())},refresh:function(e){this.transform=e,this.setTransform()},transformOrigin:function(){return"-0.5,-0.5"},setTransform:function(){this.allAttr(this.mapTransform())},mapTransform:function(){var e=this.transform,t=[],n=k(e);return n?(n.round(P),t.push(["on","true"],["matrix",[n.a,n.c,n.b,n.d,0,0].join(",")],["offset",n.e+"px,"+n.f+"px"],["origin",this.transformOrigin()])):t.push(["on","false"]),t}}),q=O.extend({init:function(e,t,n){this.fill=this.createFillNode(e,t,n),this.stroke=new W(e,n),this.transform=this.createTransformNode(e,t),O.fn.init.call(this,e)},attachTo:function(e,t){this.fill.attachTo(this.element),this.stroke.attachTo(this.element),this.transform.attachTo(this.element),L.fn.attachTo.call(this,e,t)},createFillNode:function(e,t,n){return new U(e,t,n)},createTransformNode:function(e,t){return new j(e,t)},createElement:function(){this.element=n("shape"),this.setCoordsize(),this.setStyle()},optionsChange:function(e){a(e.field)?this.fill.optionsChange(e):0===e.field.indexOf("stroke")?this.stroke.optionsChange(e):"transform"===e.field?this.transform.optionsChange(e):"opacity"===e.field&&(this.fill.setOpacity(),this.stroke.setOpacity()),O.fn.optionsChange.call(this,e)},refreshTransform:function(e){this.transform.refresh(this.srcElement.currentTransform(e))},refreshOpacity:function(e){e*=E(this.srcElement.options.opacity,1),this.fill.refreshOpacity(e),this.stroke.refreshOpacity(e)},mapStyle:function(e,t){var n,i=O.fn.mapStyle.call(this);return e&&t||(e=t=M),i.push(["position","absolute"],["width",e+"px"],["height",t+"px"]),n=this.srcElement.options.cursor,n&&i.push(["cursor",n]),i},setCoordsize:function(){this.allAttr([["coordorigin","0 0"],["coordsize",F+" "+F]])}}),G=L.extend({createElement:function(){this.element=n("path"),this.setPathData()},geometryChange:function(){this.setPathData()},setPathData:function(){this.attr("v",this.renderData())},renderData:function(){return o(this.srcElement)}}),$=q.extend({init:function(e,t,n){this.pathData=this.createDataNode(e),q.fn.init.call(this,e,t,n)},attachTo:function(e,t){this.pathData.attachTo(this.element),q.fn.attachTo.call(this,e,t)},createDataNode:function(e){return new G(e)},geometryChange:function(){this.pathData.geometryChange(),q.fn.geometryChange.call(this)}}),Y=G.extend({renderData:function(){var e,t,n,i=this.srcElement.paths;if(i.length>0){for(e=[],t=0;i.length>t;t++)n=i.length-1>t,e.push(o(i[t],n));return e.join(" ")}}}),K=$.extend({createDataNode:function(e){return new Y(e)}}),Q=j.extend({transformOrigin:function(){var e=this.srcElement.geometry().bbox(),t=e.center(),n=-p(t.x)/p(e.width()),i=-p(t.y)/p(e.height());return n+","+i}}),X=q.extend({createElement:function(){this.element=n("oval"),this.setStyle()},createTransformNode:function(e,t){return new Q(e,t)},geometryChange:function(){q.fn.geometryChange.call(this),this.setStyle(),this.refreshTransform()},mapStyle:function(){var e=this.srcElement.geometry(),t=e.radius,n=e.center,i=p(2*t),o=q.fn.mapStyle.call(this,i,i);return o.push(["left",p(n.x-t)+"px"],["top",p(n.y-t)+"px"]),o}}),J=G.extend({renderData:function(){return o(this.srcElement.toPath())}}),Z=$.extend({createDataNode:function(e){return new J(e)}}),ee=G.extend({createElement:function(){G.fn.createElement.call(this),this.attr("textpathok",!0)},renderData:function(){var e=this.srcElement.rect(),t=e.center();return"m "+i([new y.Point(e.topLeft().x,t.y)])+" l "+i([new y.Point(e.bottomRight().x,t.y)])}}),te=L.extend({createElement:function(){this.element=n("textpath"),this.attr("on",!0),this.attr("fitpath",!1),this.setStyle(),this.setString()},optionsChange:function(e){"content"===e.field?this.setString():this.setStyle(),L.fn.optionsChange.call(this,e)},mapStyle:function(){return[["font",this.srcElement.options.font]]},setString:function(){this.attr("string",this.srcElement.content())}}),ne=$.extend({init:function(e,t,n){this.path=new te(e),$.fn.init.call(this,e,t,n)},createDataNode:function(e){return new ee(e)},attachTo:function(e,t){this.path.attachTo(this.element),$.fn.attachTo.call(this,e,t)},optionsChange:function(e){"font"!==e.field&&"content"!==e.field||(this.path.optionsChange(e),this.pathData.geometryChange(e)),$.fn.optionsChange.call(this,e)}}),ie=G.extend({renderData:function(){var e=this.srcElement.rect(),t=(new b.Path).moveTo(e.topLeft()).lineTo(e.topRight()).lineTo(e.bottomRight()).lineTo(e.bottomLeft()).close();return o(t)}}),oe=j.extend({init:function(e,t,n){this.opacity=n,j.fn.init.call(this,e,t)},createElement:function(){this.element=n("fill"),this.attr("type","frame"),this.attr("rotate",!0),this.setOpacity(),this.setSrc(),this.setTransform()},optionsChange:function(e){"src"===e.field&&this.setSrc(),j.fn.optionsChange.call(this,e)},geometryChange:function(){this.refresh()},refreshOpacity:function(e){this.opacity=e,this.setOpacity()},setOpacity:function(){var e=[];this.mapOpacityTo(e,this.srcElement.options.opacity),this.allAttr(e)},setSrc:function(){this.attr("src",this.srcElement.src())},mapTransform:function(){var e,t,n,i,o,r,a,s,l=this.srcElement,c=l.rawBBox(),d=c.center(),u=M/2,h=M,p=c.width()/h,g=c.height()/h,v=0,_=this.transform;return _?(n=k(_),i=m(n.a*n.a+n.b*n.b),o=m(n.c*n.c+n.d*n.d),p*=i,g*=o,r=D(f(n.b,n.d)),a=D(f(-n.c,n.a)),v=(r+a)/2,0!==v?(s=l.bbox().center(),e=(s.x-u)/h,t=(s.y-u)/h):(e=(d.x*i+n.e-u)/h,t=(d.y*o+n.f-u)/h)):(e=(d.x-u)/h,t=(d.y-u)/h),p=A(p,P),g=A(g,P),e=A(e,P),t=A(t,P),v=A(v,P),[["size",p+","+g],["position",e+","+t],["angle",v]]}}),re=$.extend({createFillNode:function(e,t,n){return new oe(e,t,n)},createDataNode:function(e){return new ie(e)},optionsChange:function(e){"src"!==e.field&&"transform"!==e.field||this.fill.optionsChange(e),$.fn.optionsChange.call(this,e)},geometryChange:function(){this.fill.geometryChange(),$.fn.geometryChange.call(this)},refreshTransform:function(e){$.fn.refreshTransform.call(this,e),this.fill.refresh(this.srcElement.currentTransform(e))}}),ae=G.extend({renderData:function(){var e=this.srcElement.geometry(),t=["m",i([e.topLeft()]),"l",i([e.topRight(),e.bottomRight(),e.bottomLeft()]),"x e"];return t.join(" ")}}),se=$.extend({createDataNode:function(e){return new ae(e)}}),le={Group:V,Text:ne,Path:$,MultiPath:K,Circle:X,Arc:Z,Image:re,Rect:se};g.support.vml=function(){var e=g.support.browser;return e.msie&&9>e.version}(),d="inherit",g.support.browser.msie&&8>g.support.browser.version&&(d="rect(auto auto auto auto)"),g.support.vml&&b.SurfaceFactory.current.register("vml",B,30),v(b,{vml:{ArcDataNode:J,ArcNode:Z,CircleTransformNode:Q,CircleNode:X,FillNode:U,GroupNode:V,ImageNode:re,ImageFillNode:oe,ImagePathDataNode:ie,MultiPathDataNode:Y,MultiPathNode:K,Node:L,PathDataNode:G,PathNode:$,RectDataNode:ae,RectNode:se,RootNode:H,StrokeNode:W,Surface:B,TextNode:ne,TextPathNode:te,TextPathDataNode:ee,TransformNode:j}})}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("drawing/html.min",["kendo.color.min","drawing/shapes.min","util/main.min","util/text-metrics.min"],e)}(function(){!function(e,t,n){"use strict";function i(e){return"number"==typeof e?{x:e,y:e}:Array.isArray(e)?{x:e[0],y:e[1]}:{x:e.x,y:e.y}}function o(n,o){function a(t){var n=new se.Group,i=t.getBoundingClientRect();return M(n,[u.x,0,0,u.y,-i.left*u.x,-i.top*u.y]),me._clipbox=!1,me._matrix=le.Matrix.unit(),me._stackingContext={element:t,group:n},me._avoidLinks=o.avoidLinks===!0?"a":o.avoidLinks,e(t).addClass("k-pdf-export"),te(t,n),e(t).removeClass("k-pdf-export"),n}function s(t){return null!=t?("string"==typeof t&&(t=kendo.template(t.replace(/^\s+|\s+$/g,""))),"function"==typeof t?function(n){var i=t(n);return i?("string"==typeof i&&(i=i.replace(/^\s+|\s+$/g,"")),e(i)[0]):void 0}:function(){return e(t).clone()[0]}):void 0}function l(t){var n,i,o,r,a=t.cloneNode(!1);if(1==t.nodeType){n=e(t),i=e(a),r=n.data();for(o in r)i.data(o,r[o]);if(/^canvas$/i.test(t.tagName))a.getContext("2d").drawImage(t,0,0);else if(/^input$/i.test(t.tagName))t.removeAttribute("name");else for(o=t.firstChild;o;o=o.nextSibling)a.appendChild(l(o))}return a}function c(n,i,o,r,a,c,d){function u(){function e(){f(S,function(){n({pages:S,container:D})})}var t,i;("-"!=o||a)&&m(T),t=_(),T.parentNode.insertBefore(t,T),t.appendChild(T),x?(i=S.length,S.forEach(function(t,n){var o=x({element:t,pageNum:n+1,totalPages:S.length});o&&(t.appendChild(o),p(o,function(){0===--i&&e()}))})):e()}function h(e){return d.keepTogether&&e.is(d.keepTogether)&&e.height()<=a-A?!0:e.data("kendoChart")||/^(?:img|tr|thead|th|tfoot|iframe|svg|object|canvas|input|textarea|select|video|h[1-6])/i.test(e[0].tagName)}function m(n){var i,r,s,l,c=y(n),d=t(k(c,"padding-bottom")),u=t(k(c,"border-bottom-width")),f=A;for(A+=d+u,i=!0,r=n.firstChild;r;r=r.nextSibling)if(1==r.nodeType){if(i=!1,s=e(r),s.is(o)){v(r);continue}if(!a){m(r);continue}if(!/^(?:static|relative)$/.test(k(y(r),"position")))continue;l=b(r),1==l?v(r):l&&h(s)?v(r):m(r)}else 3==r.nodeType&&a&&(w(r,i),i=!1);A=f}function g(e){var t=e.parentNode,n=t.firstChild;if(e===n)return!0;if(e===t.children[0]){if(7==n.nodeType||8==n.nodeType)return!0;if(3==n.nodeType)return!/\S/.test(n.data)}return!1}function v(t){var n,i,o,r,a,s,l;return 1==t.nodeType&&t!==T&&g(t)?v(t.parentNode):(n=e(t).closest("table"),i=n.find("colgroup:first"),d.repeatHeaders&&(o=n.find("thead:first"),r=e(t).closest('.k-grid[data-role="grid"]'),r[0]&&r[0].querySelector(".k-auto-scrollable")&&(a=r.find(".k-grid-header:first"))),s=_(),l=C.createRange(),l.setStartBefore(T),l.setEndBefore(t),s.appendChild(l.extractContents()),T.parentNode.insertBefore(s,T),n[0]&&(n=e(t).closest("table"),d.repeatHeaders&&o[0]&&o.clone().prependTo(n),i[0]&&i.clone().prependTo(n)),void(d.repeatHeaders&&a&&a[0]&&(r=e(t).closest('.k-grid[data-role="grid"]'),a[0]&&a.clone().prependTo(r))))}function _(){var t=C.createElement("KENDO-PDF-PAGE");return e(t).css({display:"block",boxSizing:"content-box",width:r||"auto",padding:c.top+"px "+c.right+"px "+c.bottom+"px "+c.left+"px",position:"relative",height:a||"auto",overflow:a||r?"hidden":"visible",clear:"both"}),d&&d.pageClassName&&(t.className=d.pageClassName),S.push(t),t}function b(e){var t,n,i=e.getBoundingClientRect();return 0===i.width||0===i.height?0:(t=T.getBoundingClientRect().top,n=a-A,i.height>n?3:i.top-t>n?1:i.bottom-t>n?2:0)}function w(e,t){var n,i,o,r,a;/\S/.test(e.data)&&(n=e.data.length,i=C.createRange(),i.selectNodeContents(e),o=b(i),o&&(r=e,1==o?v(t?e.parentNode:e):(!function s(t,n,o){return i.setEnd(e,n),t==n||n==o?n:b(i)?s(t,t+n>>1,n):s(n,n+o>>1,o)}(0,n>>1,n),!/\S/.test(""+i)&&t?v(e.parentNode):(r=e.splitText(i.endOffset),a=_(),i.setStartBefore(T),a.appendChild(i.extractContents()),T.parentNode.insertBefore(a,T))),w(r)))}var x=s(d.template),C=i.ownerDocument,S=[],T=d._destructive?i:l(i),D=C.createElement("KENDO-PDF-DOCUMENT"),A=0;e(T).find("tfoot").each(function(){this.parentNode.appendChild(this)}),e(T).find("ol").each(function(){e(this).children().each(function(e){this.setAttribute("kendo-split-index",e)})}),e(D).css({display:"block",position:"absolute",boxSizing:"content-box",left:"-10000px",top:"-10000px"}),r&&(e(D).css({width:r,paddingLeft:c.left,paddingRight:c.right}),e(T).css({overflow:"hidden"})),i.parentNode.insertBefore(D,i),D.appendChild(T),d.beforePageBreak?setTimeout(function(){d.beforePageBreak(D,u)},15):setTimeout(u,15)}var d,u;if(o||(o={}),d=e.Deferred(),n=e(n)[0],!n)return d.reject("No element to export");if("function"!=typeof window.getComputedStyle)throw Error("window.getComputedStyle is missing. You are using an unsupported browser, or running in IE8 compatibility mode. Drawing HTML is supported in Chrome, Firefox, Safari and IE9+.");return kendo.pdf&&kendo.pdf.defineFont(r(n.ownerDocument)),u=i(o.scale||1),p(n,function(){var e,t=o&&o.forcePageBreak,i=o&&o.paperSize&&"auto"!=o.paperSize,r=kendo.pdf.getPaperOptions(function(e,t){return"paperSize"==e?i?o[e]:"A4":e in o?o[e]:t}),s=i&&r.paperSize[0],l=i&&r.paperSize[1],h=o.margin&&r.margin,f=!!h;t||l?(h||(h={left:0,top:0,right:0,bottom:0}),s&&(s/=u.x),l&&(l/=u.y),h.left/=u.x,h.right/=u.x,h.top/=u.y,h.bottom/=u.y,e=new se.Group({pdf:{multiPage:!0,paperSize:i?r.paperSize:"auto",_ignoreMargin:f}}),c(function(t){if(o.progress){var n=!1,i=0;!function r(){if(t.pages.length>i){var s=a(t.pages[i]);e.append(s),o.progress({page:s,pageNum:++i,totalPages:t.pages.length,cancel:function(){n=!0}}),n?t.container.parentNode.removeChild(t.container):setTimeout(r)}else t.container.parentNode.removeChild(t.container),d.resolve(e)}()}else t.pages.forEach(function(t){e.append(a(t))}),t.container.parentNode.removeChild(t.container),d.resolve(e)},n,t,s?s-h.left-h.right:null,l?l-h.top-h.bottom:null,h,o)):d.resolve(a(n))}),d.promise()}function r(e){function t(e){if(e){var t=null;try{t=e.cssRules}catch(n){}t&&i(e,t)}}function n(e){var t,n=k(e.style,"src");return n?re(n).reduce(function(e,t){var n=ae(t);return n&&e.push(n),e},[]):(t=ae(e.cssText),t?[t]:[])}function i(e,i){var r,a,s,l,c,d,u;for(r=0;i.length>r;++r)switch(a=i[r],a.type){case 3:t(a.styleSheet);break;case 5:s=a.style,l=re(k(s,"font-family")),c=/^([56789]00|bold)$/i.test(k(s,"font-weight")),d="italic"==k(s,"font-style"),u=n(a),u.length>0&&o(e,l,c,d,u[0])}}function o(e,t,n,i,o){/^data:/i.test(o)||/^[^\/:]+:\/\//.test(o)||/^\//.test(o)||(o=(e.href+"").replace(/[^\/]*$/,"")+o),t.forEach(function(e){e=e.replace(/^(['"]?)(.*?)\1$/,"$2"),n&&(e+="|bold"),i&&(e+="|italic"),r[e]=o})}var r,a;for(null==e&&(e=document),r={},a=0;e.styleSheets.length>a;++a)t(e.styleSheets[a]);return r}function a(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function s(e){return e="_counter_"+e,me[e]}function l(e){var t=[],n=me;for(e="_counter_"+e;n;)a(n,e)&&t.push(n[e]),n=Object.getPrototypeOf(n);return t.reverse()}function c(e,t){var n=me;for(e="_counter_"+e;n&&!a(n,e);)n=Object.getPrototypeOf(n);n||(n=me._root),n[e]=(n[e]||0)+(null==t?1:t)}function d(e,t){e="_counter_"+e,me[e]=null==t?0:t}function u(e,n,i){var o,r,a;for(o=0;e.length>o;)r=e[o++],a=t(e[o]),isNaN(a)?n(r,i):(n(r,a),++o)}function h(e,t){var n=kendo.parseColor(e);return n&&(n=n.toRGB(),t?n=n.toCssRgba():0===n.a&&(n=null)),n}function f(e,t){function n(){--i<=0&&t()}var i=0;e.forEach(function(e){var t,o,r=e.querySelectorAll("img");for(t=0;r.length>t;++t)o=r[t],o.complete||(i++,o.onload=o.onerror=n)}),i||n()}function p(e,t){function n(e){pe[e]||(pe[e]=!0,r.push(e))}function i(){--o<=0&&t()}var o,r=[];!function a(e){/^img$/i.test(e.tagName)&&n(e.src),oe(k(y(e),"background-image")).forEach(function(e){"url"==e.type&&n(e.url)}),e.children&&ce.call(e.children).forEach(a)}(e),o=r.length,0===o&&i(),r.forEach(function(e){var t=pe[e]=new Image;/^data:/i.test(e)||(t.crossOrigin="Anonymous"),t.src=e,t.complete?i():(t.onload=i,t.onerror=function(){pe[e]=null,i()})})}function m(e){var t,i="";do t=e%26,i=String.fromCharCode(97+t)+i,e=n.floor(e/26);while(e>0);return i}function g(e,t,n){var i,o;me=Object.create(me),me[e.tagName.toLowerCase()]={element:e,style:t},i=k(t,"text-decoration"),i&&"none"!=i&&(o=k(t,"color"),i.split(/\s+/g).forEach(function(e){me[e]||(me[e]=o)})),w(t)&&(me._stackingContext={element:e,group:n})}function v(){me=Object.getPrototypeOf(me)}function _(e){if(null!=me._clipbox){var t=e.bbox(me._matrix);me._clipbox=me._clipbox?le.Rect.intersect(me._clipbox,t):t}}function b(){var e=me._clipbox;return null==e?!0:e?0===e.width()||0===e.height():void 0}function w(e){function t(t){return k(e,t)}return"none"!=t("transform")||"static"!=t("position")&&"auto"!=t("z-index")||t("opacity")<1?!0:void 0}function y(e,t){return window.getComputedStyle(e,t||null)}function k(e,t){var n=e.getPropertyValue(t);return null!=n&&""!==n||(de.webkit?n=e.getPropertyValue("-webkit-"+t):de.mozilla?n=e.getPropertyValue("-moz-"+t):de.opera?n=e.getPropertyValue("-o-"+t):de.msie&&(n=e.getPropertyValue("-ms-"+t))),n}function x(e,t,n,i){e.setProperty(t,n,i),de.webkit?e.setProperty("-webkit-"+t,n,i):de.mozilla?e.setProperty("-moz-"+t,n,i):de.opera?e.setProperty("-o-"+t,n,i):de.msie&&(e.setProperty("-ms-"+t,n,i),t="ms"+t.replace(/(^|-)([a-z])/g,function(e,t,n){return t+n.toUpperCase()}),e[t]=n)}function C(e,n){return n="border-"+n,{width:t(k(e,n+"-width")),style:k(e,n+"-style"),color:h(k(e,n+"-color"),!0)}}function S(e,t){var n=e.style.cssText,i=t();return e.style.cssText=n,i}function T(e,n){var i=k(e,"border-"+n+"-radius").split(/\s+/g).map(t);return 1==i.length&&i.push(i[0]),P({x:i[0],y:i[1]})}function D(e){var t=e.getBoundingClientRect();return t=A(t,"border-*-width",e),t=A(t,"padding-*",e)}function A(e,n,i){var o,r,a,s,l;return"string"==typeof n?(o=y(i),r=t(k(o,n.replace("*","top"))),a=t(k(o,n.replace("*","right"))),s=t(k(o,n.replace("*","bottom"))),l=t(k(o,n.replace("*","left")))):"number"==typeof n&&(r=a=s=l=n),{top:e.top+r,right:e.right-a,bottom:e.bottom-s,left:e.left+l,width:e.right-e.left-a-l,height:e.bottom-e.top-s-r}}function E(e){var n,i,o=k(e,"transform");return"none"==o?null:(n=/^\s*matrix\(\s*(.*?)\s*\)\s*$/.exec(o),n?(i=k(e,"transform-origin"),n=n[1].split(/\s*,\s*/g).map(t),i=i.split(/\s+/g).map(t),{matrix:n,origin:i}):void 0)}function I(e){return 180*e/n.PI%360}function R(e){var i=t(e);return/grad$/.test(e)?n.PI*i/200:/rad$/.test(e)?i:/turn$/.test(e)?n.PI*i*2:/deg$/.test(e)?n.PI*i/180:void 0}function M(e,t){return t=new le.Matrix(t[0],t[1],t[2],t[3],t[4],t[5]),e.transform(t),t}function F(e,t){e.clip(t)}function z(e,t,n,i){for(var o=new le.Arc([t,n],i).curvePoints(),r=1;o.length>r;)e.curveTo(o[r++],o[r++],o[r++]); +}function P(e){return(0>=e.x||0>=e.y)&&(e.x=e.y=0),e}function B(e,t,i,o,r){var a=n.max(0,t.x),s=n.max(0,t.y),l=n.max(0,i.x),c=n.max(0,i.y),d=n.max(0,o.x),u=n.max(0,o.y),h=n.max(0,r.x),f=n.max(0,r.y),p=n.min(e.width/(a+l),e.height/(c+u),e.width/(d+h),e.height/(f+s));return 1>p&&(a*=p,s*=p,l*=p,c*=p,d*=p,u*=p,h*=p,f*=p),{tl:{x:a,y:s},tr:{x:l,y:c},br:{x:d,y:u},bl:{x:h,y:f}}}function L(e,n,i){var o,r,a,s,l,c,d,u,h=y(e),f=T(h,"top-left"),p=T(h,"top-right"),m=T(h,"bottom-left"),g=T(h,"bottom-right");return"padding"!=i&&"content"!=i||(o=C(h,"top"),r=C(h,"right"),a=C(h,"bottom"),s=C(h,"left"),f.x-=s.width,f.y-=o.width,p.x-=r.width,p.y-=o.width,g.x-=r.width,g.y-=a.width,m.x-=s.width,m.y-=a.width,"content"==i&&(l=t(k(h,"padding-top")),c=t(k(h,"padding-right")),d=t(k(h,"padding-bottom")),u=t(k(h,"padding-left")),f.x-=u,f.y-=l,p.x-=c,p.y-=l,g.x-=c,g.y-=d,m.x-=u,m.y-=d)),"number"==typeof i&&(f.x-=i,f.y-=i,p.x-=i,p.y-=i,g.x-=i,g.y-=i,m.x-=i,m.y-=i),H(n,f,p,g,m)}function H(e,t,n,i,o){var r=B(e,t,n,i,o),a=r.tl,s=r.tr,l=r.br,c=r.bl,d=new se.Path({fill:null,stroke:null});return d.moveTo(e.left,e.top+a.y),a.x&&z(d,e.left+a.x,e.top+a.y,{startAngle:-180,endAngle:-90,radiusX:a.x,radiusY:a.y}),d.lineTo(e.right-s.x,e.top),s.x&&z(d,e.right-s.x,e.top+s.y,{startAngle:-90,endAngle:0,radiusX:s.x,radiusY:s.y}),d.lineTo(e.right,e.bottom-l.y),l.x&&z(d,e.right-l.x,e.bottom-l.y,{startAngle:0,endAngle:90,radiusX:l.x,radiusY:l.y}),d.lineTo(e.left+c.x,e.bottom),c.x&&z(d,e.left+c.x,e.bottom-c.y,{startAngle:90,endAngle:180,radiusX:c.x,radiusY:c.y}),d.close()}function N(e,n){var i=t(e)+"";switch(n){case"decimal-leading-zero":return 2>i.length&&(i="0"+i),i;case"lower-roman":return ue(e).toLowerCase();case"upper-roman":return ue(e).toUpperCase();case"lower-latin":case"lower-alpha":return m(e-1);case"upper-latin":case"upper-alpha":return m(e-1).toUpperCase();default:return i}}function O(e,t){function n(e,t,n){return n?(n=n.replace(/^\s*(["'])(.*)\1\s*$/,"$2"),l(e).map(function(e){return N(e,t)}).join(n)):N(s(e)||0,t)}var i,o=re(t,/^\s+/),r=[];return o.forEach(function(t){var o;(i=/^\s*(["'])(.*)\1\s*$/.exec(t))?r.push(i[2].replace(/\\([0-9a-f]{4})/gi,function(e,t){return String.fromCharCode(parseInt(t,16))})):(i=/^\s*counter\((.*?)\)\s*$/.exec(t))?(o=re(i[1]),r.push(n(o[0],o[1]))):(i=/^\s*counters\((.*?)\)\s*$/.exec(t))?(o=re(i[1]),r.push(n(o[0],o[2],o[1]))):r.push((i=/^\s*attr\((.*?)\)\s*$/.exec(t))?e.getAttribute(i[1])||"":t)}),r.join("")}function V(e){var t,n;if(e.cssText)return e.cssText;for(t=[],n=0;e.length>n;++n)t.push(e[n]+": "+k(e,e[n]));return t.join(";\n")}function W(e,t){function n(t,n){var o,r=y(e,t);r.content&&"normal"!=r.content&&"none"!=r.content&&"0px"!=r.width&&(o=e.ownerDocument.createElement(fe),o.style.cssText=V(r),o.textContent=O(e,r.content),e.insertBefore(o,n),i.push(o))}var i,o;return e.tagName==fe?void U(e,t):(i=[],n(":before",e.firstChild),n(":after",null),o=e.className,e.className+=" kendo-pdf-hide-pseudo-elements",U(e,t),e.className=o,void i.forEach(function(t){e.removeChild(t)}))}function U(i,o){function r(e){var t,n,o,r,a,s;if(/^td$/i.test(i.tagName)&&(t=me.table,t&&"collapse"==k(t.style,"border-collapse"))){if(n=C(t.style,"left").width,o=C(t.style,"top").width,0===n&&0===o)return e;if(r=t.element.getBoundingClientRect(),a=t.element.rows[0].cells[0],s=a.getBoundingClientRect(),s.top==r.top||s.left==r.left)return ce.call(e).map(function(e){return{left:e.left+n,top:e.top+o,right:e.right+n,bottom:e.bottom+o,height:e.height,width:e.width}})}return e}function a(e,t,i,r,a,s,l,c){function d(t,o,r){var a=n.PI/2*t/(t+i),s={x:o.x-t,y:o.y-i},l=new se.Path({fill:{color:e},stroke:null}).moveTo(0,0);M(l,r),z(l,0,o.y,{startAngle:-90,endAngle:-I(a),radiusX:o.x,radiusY:o.y}),s.x>0&&s.y>0?(l.lineTo(s.x*n.cos(a),o.y-s.y*n.sin(a)),z(l,0,o.y,{startAngle:-I(a),endAngle:-90,radiusX:s.x,radiusY:s.y,anticlockwise:!0})):s.x>0?l.lineTo(s.x,i).lineTo(0,i):l.lineTo(s.x,i).lineTo(s.x,0),h.append(l.close())}if(!(0>=i)){var u,h=new se.Group;M(h,c),o.append(h),P(s),P(l),u=new se.Path({fill:{color:e},stroke:null}),h.append(u),u.moveTo(s.x?n.max(s.x,r):0,0).lineTo(t-(l.x?n.max(l.x,a):0),0).lineTo(t-n.max(l.x,a),i).lineTo(n.max(s.x,r),i).close(),s.x&&d(r,s,[-1,0,0,1,s.x,0]),l.x&&d(a,l,[1,0,0,1,t-l.x,0])}}function s(t){var n,r,a=new se.Group;for(F(a,H(t,U,G,K,$)),o.append(a),"A"==i.tagName&&i.href&&!/^#?$/.test(e(i).attr("href"))&&(me._avoidLinks&&e(i).is(me._avoidLinks)||(a._pdfLink={url:i.href,top:t.top,right:t.right,bottom:t.bottom,left:t.left})),X&&(n=new se.Path({fill:{color:X.toCssRgba()},stroke:null}),n.moveTo(t.left,t.top).lineTo(t.right,t.top).lineTo(t.right,t.bottom).lineTo(t.left,t.bottom).close(),a.append(n)),r=u.length;--r>=0;)l(a,t,u[r],f[r%f.length],p[r%p.length],g[r%g.length],v[r%v.length])}function l(e,o,r,a,s,l,c){function d(e,o,r,d,u){function h(){for(;_.origin.x>o.left;)_.origin.x-=r}function f(){for(;_.origin.y>o.top;)_.origin.y-=d}function p(){for(;o.right>_.origin.x;)u(e,_.clone()),_.origin.x+=r}var m,g,v,_,b,w=r/d,y=o;if("content-box"==l?(y=A(y,"border-*-width",i),y=A(y,"padding-*",i)):"padding-box"==l&&(y=A(y,"border-*-width",i)),/^\s*auto(\s+auto)?\s*$/.test(c)||("contain"==c?(m=n.min(y.width/r,y.height/d),r*=m,d*=m):"cover"==c?(m=n.max(y.width/r,y.height/d),r*=m,d*=m):(g=c.split(/\s+/g),r=/%$/.test(g[0])?y.width*t(g[0])/100:t(g[0]),d=1==g.length||"auto"==g[1]?r/w:/%$/.test(g[1])?y.height*t(g[1])/100:t(g[1]))),v=(s+"").split(/\s+/),1==v.length&&(v[1]="50%"),v[0]=/%$/.test(v[0])?t(v[0])/100*(y.width-r):t(v[0]),v[1]=/%$/.test(v[1])?t(v[1])/100*(y.height-d):t(v[1]),_=new le.Rect([y.left+v[0],y.top+v[1]],[r,d]),"no-repeat"==a)u(e,_);else if("repeat-x"==a)h(),p();else if("repeat-y"==a)for(f();o.bottom>_.origin.y;)u(e,_.clone()),_.origin.y+=d;else if("repeat"==a)for(h(),f(),b=_.origin.clone();o.bottom>_.origin.y;)_.origin.x=b.x,p(),_.origin.y+=d}if(r&&"none"!=r)if("url"==r.type){if(/^url\(\"data:image\/svg/i.test(r.url))return;var u=pe[r.url];u&&u.width>0&&u.height>0&&d(e,o,u.width,u.height,function(e,t){e.append(new se.Image(r.url,t))})}else{if("linear"!=r.type)return;d(e,o,o.width,o.height,j(r))}}function c(){function e(e){S(i,function(){i.style.position="relative";var t=i.ownerDocument.createElement(fe);t.style.position="absolute",t.style.boxSizing="border-box","outside"==n?(t.style.width="6em",t.style.left="-6.8em",t.style.textAlign="right"):t.style.left="0px",e(t),i.insertBefore(t,i.firstChild),te(t,o),i.removeChild(t)})}function t(e){var t,n=i.parentNode.children,o=i.getAttribute("kendo-split-index");if(null!=o)return e(0|o,n.length);for(t=0;n.length>t;++t)if(n[t]===i)return e(t,n.length)}var n,r=k(R,"list-style-type");if("none"!=r)switch(n=k(R,"list-style-position"),r){case"circle":case"disc":case"square":e(function(e){e.style.fontSize="60%",e.style.lineHeight="200%",e.style.paddingRight="0.5em",e.style.fontFamily="DejaVu Serif",e.innerHTML={disc:"●",circle:"◯",square:"■"}[r]});break;case"decimal":case"decimal-leading-zero":e(function(e){t(function(t){++t,"decimal-leading-zero"==r&&2>(t+"").length&&(t="0"+t),e.innerHTML=t+"."})});break;case"lower-roman":case"upper-roman":e(function(e){t(function(t){t=ue(t+1),"upper-roman"==r&&(t=t.toUpperCase()),e.innerHTML=t+"."})});break;case"lower-latin":case"lower-alpha":case"upper-latin":case"upper-alpha":e(function(e){t(function(t){t=m(t),/^upper/i.test(r)&&(t=t.toUpperCase()),e.innerHTML=t+"."})})}}function d(e,t,n){function r(e){return{x:e.y,y:e.x}}var l,c,d,u,h,f,p,m;if(0!==e.width&&0!==e.height&&(s(e),l=W.width>0&&(t&&"ltr"==Q||n&&"rtl"==Q),c=O.width>0&&(n&&"ltr"==Q||t&&"rtl"==Q),0!==N.width||0!==W.width||0!==O.width||0!==V.width)){if(N.color==O.color&&N.color==V.color&&N.color==W.color&&N.width==O.width&&N.width==V.width&&N.width==W.width&&l&&c)return e=A(e,N.width/2),d=L(i,e,N.width/2),d.options.stroke={color:N.color,width:N.width},void o.append(d);if(0===U.x&&0===G.x&&0===K.x&&0===$.x&&2>N.width&&2>W.width&&2>O.width&&2>V.width)return N.width>0&&o.append(new se.Path({stroke:{width:N.width,color:N.color}}).moveTo(e.left,e.top+N.width/2).lineTo(e.right,e.top+N.width/2)),V.width>0&&o.append(new se.Path({stroke:{width:V.width,color:V.color}}).moveTo(e.left,e.bottom-V.width/2).lineTo(e.right,e.bottom-V.width/2)),l&&o.append(new se.Path({stroke:{width:W.width,color:W.color}}).moveTo(e.left+W.width/2,e.top).lineTo(e.left+W.width/2,e.bottom)),void(c&&o.append(new se.Path({stroke:{width:O.width,color:O.color}}).moveTo(e.right-O.width/2,e.top).lineTo(e.right-O.width/2,e.bottom)));u=B(e,U,G,K,$),h=u.tl,f=u.tr,p=u.br,m=u.bl,a(N.color,e.width,N.width,W.width,O.width,h,f,[1,0,0,1,e.left,e.top]),a(V.color,e.width,V.width,O.width,W.width,p,m,[-1,0,0,-1,e.right,e.bottom]),a(W.color,e.height,W.width,V.width,N.width,r(m),r(h),[0,-1,1,0,e.left,e.bottom]),a(O.color,e.height,O.width,N.width,V.width,r(f),r(p),[0,1,-1,0,e.right,e.top])}}var u,f,p,g,v,b,w,x,D,E,R=y(i),N=C(R,"top"),O=C(R,"right"),V=C(R,"bottom"),W=C(R,"left"),U=T(R,"top-left"),G=T(R,"top-right"),$=T(R,"bottom-left"),K=T(R,"bottom-right"),Q=k(R,"direction"),X=k(R,"background-color");if(X=h(X),u=oe(k(R,"background-image")),f=re(k(R,"background-repeat")),p=re(k(R,"background-position")),g=re(k(R,"background-origin")),v=re(k(R,"background-size")),de.msie&&10>de.version&&(p=re(i.currentStyle.backgroundPosition)),b=A(i.getBoundingClientRect(),"border-*-width",i),function(){var e,n,i,r,a,s,l,c=k(R,"clip"),d=/^\s*rect\((.*)\)\s*$/.exec(c);d&&(e=d[1].split(/[ ,]+/g),n="auto"==e[0]?b.top:t(e[0])+b.top,i="auto"==e[1]?b.right:t(e[1])+b.left,r="auto"==e[2]?b.bottom:t(e[2])+b.top,a="auto"==e[3]?b.left:t(e[3])+b.left,s=new se.Group,l=(new se.Path).moveTo(a,n).lineTo(i,n).lineTo(i,r).lineTo(a,r).close(),F(s,l),o.append(s),o=s,_(l))}(),E=k(R,"display"),"table-row"==E)for(w=[],x=0,D=i.children;D.length>x;++x)w.push(D[x].getBoundingClientRect());else w=i.getClientRects(),1==w.length&&(w=[i.getBoundingClientRect()]);for(w=r(w),x=0;w.length>x;++x)d(w[x],0===x,x==w.length-1);return w.length>0&&"list-item"==E&&c(w[0]),function(){function e(){var e=L(i,b,"padding"),t=new se.Group;F(t,e),o.append(t),o=t,_(e)}Y(i)?e():/^(hidden|auto|scroll)/.test(k(R,"overflow"))?e():/^(hidden|auto|scroll)/.test(k(R,"overflow-x"))?e():/^(hidden|auto|scroll)/.test(k(R,"overflow-y"))&&e()}(),q(i,o)||J(i,o),o}function j(e){return function(i,o){var r,a,s,l,c,d,u,h,f,p,m,g,v,_=o.width(),b=o.height();switch(e.type){case"linear":switch(r=null!=e.angle?e.angle:n.PI,e.to){case"top":r=0;break;case"left":r=-n.PI/2;break;case"bottom":r=n.PI;break;case"right":r=n.PI/2;break;case"top left":case"left top":r=-n.atan2(b,_);break;case"top right":case"right top":r=n.atan2(b,_);break;case"bottom left":case"left bottom":r=n.PI+n.atan2(b,_);break;case"bottom right":case"right bottom":r=n.PI-n.atan2(b,_)}e.reverse&&(r-=n.PI),r%=2*n.PI,0>r&&(r+=2*n.PI),a=n.abs(_*n.sin(r))+n.abs(b*n.cos(r)),s=n.atan(_*n.tan(r)/b),l=n.sin(s),c=n.cos(s),d=n.abs(l)+n.abs(c),u=d/2*l,h=d/2*c,r>n.PI/2&&3*n.PI/2>=r&&(u=-u,h=-h),f=[],p=0,m=e.stops.map(function(n,i){var o,r=n.percent;return r?r=t(r)/100:n.length?r=t(n.length)/a:0===i?r=0:i==e.stops.length-1&&(r=1),o={color:n.color.toCssRgba(),offset:r},null!=r?(p=r,f.forEach(function(e,t){var n=e.stop;n.offset=e.left+(p-e.left)*(t+1)/(f.length+1)}),f=[]):f.push({left:p,stop:o}),o}),g=[.5-u,.5+h],v=[.5+u,.5-h],i.append(se.Path.fromRect(o).stroke(null).fill(new se.LinearGradient({start:g,end:v,stops:m,userSpace:!1})));break;case"radial":window.console&&window.console.log&&window.console.log("Radial gradients are not yet supported in HTML renderer")}}}function q(t,n){var i,o,r,a;return t.getAttribute(kendo.attr("role"))&&(i=kendo.widgetInstance(e(t)),i&&(i.exportDOMVisual||i.exportVisual))?(o=i.exportDOMVisual?i.exportDOMVisual():i.exportVisual())?(r=new se.Group,r.children.push(o),a=t.getBoundingClientRect(),r.transform(le.transform().translate(a.left,a.top)),n.append(r),!0):!1:void 0}function G(e,t,n){var i=D(e),o=new le.Rect([i.left,i.top],[i.width,i.height]),r=new se.Image(t,o);F(r,L(e,i,"content")),n.append(r)}function $(e,n){var i=y(e),o=y(n),r=t(k(i,"z-index")),a=t(k(o,"z-index")),s=k(i,"position"),l=k(o,"position");return isNaN(r)&&isNaN(a)?/static|absolute/.test(s)&&/static|absolute/.test(l)?0:"static"==s?-1:"static"==l?1:0:isNaN(r)?0===a?0:a>0?-1:1:isNaN(a)?0===r?0:r>0?1:-1:t(r)-t(a)}function Y(e){return/^(?:textarea|select|input)$/i.test(e.tagName)}function K(e){return e.selectedOptions&&e.selectedOptions.length>0?e.selectedOptions[0]:e.options[e.selectedIndex]}function Q(e,t){var i=y(e),o=k(i,"color"),r=e.getBoundingClientRect();"checkbox"==e.type?(t.append(se.Path.fromRect(new le.Rect([r.left+1,r.top+1],[r.width-2,r.height-2])).stroke(o,1)),e.checked&&t.append((new se.Path).stroke(o,1.2).moveTo(r.left+.22*r.width,r.top+.55*r.height).lineTo(r.left+.45*r.width,r.top+.75*r.height).lineTo(r.left+.78*r.width,r.top+.22*r.width))):(t.append(new se.Circle(new le.Circle([(r.left+r.right)/2,(r.top+r.bottom)/2],n.min(r.width-2,r.height-2)/2)).stroke(o,1)),e.checked&&t.append(new se.Circle(new le.Circle([(r.left+r.right)/2,(r.top+r.bottom)/2],n.min(r.width-8,r.height-8)/2)).fill(o).stroke(null)))}function X(e,t){var n,i,o,r,a,s=e.tagName.toLowerCase();if("input"==s&&("checkbox"==e.type||"radio"==e.type))return Q(e,t);if(n=e.parentNode,i=e.ownerDocument,o=i.createElement(fe),o.style.cssText=V(y(e)),"input"==s&&(o.style.whiteSpace="pre"),"select"!=s&&"textarea"!=s||(o.style.overflow="auto"),"select"==s)if(e.multiple)for(a=0;e.options.length>a;++a)r=i.createElement(fe),r.style.cssText=V(y(e.options[a])),r.style.display="block",r.textContent=e.options[a].textContent,o.appendChild(r);else r=K(e),r&&(o.textContent=r.textContent);else o.textContent=e.value;n.insertBefore(o,e),o.scrollLeft=e.scrollLeft,o.scrollTop=e.scrollTop,e.style.display="none",J(o,t),e.style.display="",n.removeChild(o)}function J(e,t){var n,i,o,r,a,s,l,c,d;switch(me._stackingContext.element===e&&(me._stackingContext.group=t),e.tagName.toLowerCase()){case"img":G(e,e.src,t);break;case"canvas":try{G(e,e.toDataURL("image/png"),t)}catch(u){}break;case"textarea":case"input":case"select":X(e,t);break;default:for(n=[],i=[],o=[],r=[],a=e.firstChild;a;a=a.nextSibling)switch(a.nodeType){case 3:/\S/.test(a.data)&&Z(e,a,t);break;case 1:s=y(a),l=k(s,"display"),c=k(s,"float"),d=k(s,"position"),"static"!=d?r.push(a):"inline"!=l?"none"!=c?i.push(a):n.push(a):o.push(a)}he(n,$).forEach(function(e){te(e,t)}),he(i,$).forEach(function(e){te(e,t)}),he(o,$).forEach(function(e){te(e,t)}),he(r,$).forEach(function(e){te(e,t)})}}function Z(e,i,o){function r(e){var t,i,o,r;if(de.msie||de.chrome){for(t=e.getClientRects(),i={top:+(1/0),right:-(1/0),bottom:-(1/0),left:+(1/0)},o=0;t.length>o;++o)r=t[o],1>=r.width||r.bottom===D||(i.left=n.min(r.left,i.left),i.top=n.min(r.top,i.top),i.right=n.max(r.right,i.right),i.bottom=n.max(r.bottom,i.bottom));return i.width=i.right-i.left,i.height=i.bottom-i.top,i}return e.getBoundingClientRect()}function a(){var e,t,o,a,l,c,f,p=u,m=d.substr(u).search(/\S/);if(u+=m,0>m||u>=h)return!0;if(v.setStart(i,u),v.setEnd(i,u+1),e=r(v),t=!1,w&&(m=d.substr(u).search(/\s/),m>=0&&(v.setEnd(i,u+m),o=r(v),o.bottom==e.bottom&&(e=o,t=!0,u+=m))),!t){if(m=function g(t,n,o){v.setEnd(i,n);var a=r(v);return a.bottom!=e.bottom&&n>t?g(t,t+n>>1,n):a.right!=e.right?(e=a,o>n?g(n,n+o>>1,o):n):n}(u,n.min(h,u+T),h),m==u)return!0;if(u=m,m=(""+v).search(/\s+$/),0===m)return;m>0&&(v.setEnd(i,v.startOffset+m),e=r(v))}if(de.msie&&(e=v.getClientRects()[0]),a=""+v,/^(?:pre|pre-wrap)$/i.test(x)){if(/\t/.test(a)){for(l=0,m=p;v.startOffset>m;++m)c=d.charCodeAt(m),9==c?l+=8-l%8:10==c||13==c?l=0:l++;for(;(m=a.search(" "))>=0;)f=" ".substr(0,8-(l+m)%8),a=a.substr(0,m)+f+a.substr(m+1)}}else a=a.replace(/\s+/g," ");t||(D=e.bottom),s(a,e)}function s(e,t){var n,i,r;de.msie&&!isNaN(p)&&(n=kendo.util.measureText(e,{font:m}),i=(t.top+t.bottom-n.height)/2,t={top:i,right:t.right,bottom:i+n.height,left:t.left,height:n.height,width:t.right-t.left}),r=new ie(e,new le.Rect([t.left,t.top],[t.width,t.height]),{font:m,fill:{color:g}}),o.append(r),l(t)}function l(e){function t(t,n){var i,r;t&&(i=f/12,r=new se.Path({stroke:{width:i,color:t}}),n-=i,r.moveTo(e.left,n).lineTo(e.right,n),o.append(r))}t(me.underline,e.bottom),t(me["line-through"],e.bottom-e.height/2.7),t(me.overline,e.top)}var c,d,u,h,f,p,m,g,v,_,w,x,C,S,T,D;if(!b()&&(c=y(e),!(t(k(c,"text-indent"))<-500)&&(d=i.data,u=0,h=d.search(/\S\s*$/)+1,h&&(f=k(c,"font-size"),p=k(c,"line-height"),m=[k(c,"font-style"),k(c,"font-variant"),k(c,"font-weight"),f,k(c,"font-family")].join(" "),f=t(f),p=t(p),0!==f)))){for(g=k(c,"color"),v=e.ownerDocument.createRange(),_=k(c,"text-align"),w="justify"==_,x=k(c,"white-space"),de.msie&&(C=c.textOverflow,"ellipsis"==C&&(S=e.style.textOverflow,e.style.textOverflow="clip")),T=e.getBoundingClientRect().width/f*5,0===T&&(T=500),D=null;!a(););de.msie&&"ellipsis"==C&&(e.style.textOverflow=S)}}function ee(e,n,i){var o,r,a,s,l,c;for("auto"!=i?(o=me._stackingContext.group,i=t(i)):(o=n,i=0),r=o.children,a=0;r.length>a&&!(null!=r[a]._dom_zIndex&&r[a]._dom_zIndex>i);++a);return s=new se.Group,o.insertAt(s,a),s._dom_zIndex=i,o!==n&&me._clipbox&&(l=me._matrix.invert(),c=me._clipbox.transformCopy(l),F(s,se.Path.fromRect(c))),s}function te(e,n){var i,o,r,a,s,l,h,f=y(e),p=k(f,"counter-reset");p&&u(re(p,/^\s+/),d,0),i=k(f,"counter-increment"),i&&u(re(i,/^\s+/),c,1),/^(style|script|link|meta|iframe|svg|col|colgroup)$/i.test(e.tagName)||null!=me._clipbox&&(o=t(k(f,"opacity")),r=k(f,"visibility"),a=k(f,"display"),0!==o&&"hidden"!=r&&"none"!=a&&(s=E(f),h=k(f,"z-index"),(s||1>o)&&"auto"==h&&(h=0),l=ee(e,n,h),1>o&&l.opacity(o*l.opacity()),g(e,f,l),s?S(e,function(){var t,n,i,o;x(e.style,"transform","none","important"),x(e.style,"transition","none","important"),"static"==k(f,"position")&&x(e.style,"position","relative","important"),t=e.getBoundingClientRect(),n=t.left+s.origin[0],i=t.top+s.origin[1],o=[1,0,0,1,-n,-i],o=ne(o,s.matrix),o=ne(o,[1,0,0,1,n,i]),o=M(l,o),me._matrix=me._matrix.multiplyCopy(o),W(e,l)}):W(e,l),v()))}function ne(e,t){var n=e[0],i=e[1],o=e[2],r=e[3],a=e[4],s=e[5],l=t[0],c=t[1],d=t[2],u=t[3],h=t[4],f=t[5];return[n*l+i*d,n*c+i*u,o*l+r*d,o*c+r*u,a*l+s*d+h,a*c+s*u+f]}var ie,oe,re,ae,se=kendo.drawing,le=kendo.geometry,ce=Array.prototype.slice,de=kendo.support.browser,ue=kendo.util.arabicToRoman,he=kendo.util.mergeSort,fe="KENDO-PSEUDO-ELEMENT",pe={},me={};me._root=me,ie=se.Text.extend({nodeType:"Text",init:function(e,t,n){se.Text.fn.init.call(this,e,t.getOrigin(),n),this._pdfRect=t},rect:function(){return this._pdfRect},rawBBox:function(){return this._pdfRect}}),se.drawDOM=o,o.getFontFaces=r,oe=function(){function e(e){function p(){var t=s.exec(e);t&&(e=e.substr(t[1].length))}function m(t){p();var n=t.exec(e);return n?(e=e.substr(n[1].length),n[1]):void 0}function g(){var t,o,r=kendo.parseColor(e,!0);return r?(e=e.substr(r.match[0].length),r=r.toRGB(),(t=m(i))||(o=m(n)),{color:r,length:t,percent:o}):void 0}function v(t){var i,a,s,u,h,f,p=[],v=!1;if(m(l)){for(i=m(r),i?(i=R(i),m(d)):(a=m(o),"to"==a?a=m(o):a&&/^-/.test(t)&&(v=!0),s=m(o),m(d)),/-moz-/.test(t)&&null==i&&null==a&&(u=m(n),h=m(n),v=!0,"0%"==u?a="left":"100%"==u&&(a="right"),"0%"==h?s="top":"100%"==h&&(s="bottom"),m(d));e&&!m(c)&&(f=g());)p.push(f),m(d);return{type:"linear",angle:i,to:a&&s?a+" "+s:a?a:s?s:null,stops:p,reverse:v}}}function _(){if(m(l)){var e=m(h);return e=e.replace(/^['"]+|["']+$/g,""),m(c),{type:"url",url:e}}}var b,w=e;return a(f,w)?f[w]:((b=m(t))?b=v(b):(b=m(u))&&(b=_()),f[w]=b||{type:"none"})}var t=/^((-webkit-|-moz-|-o-|-ms-)?linear-gradient\s*)\(/,n=/^([-0-9.]+%)/,i=/^([-0-9.]+px)/,o=/^(left|right|top|bottom|to|center)\W/,r=/^([-0-9.]+(deg|grad|rad|turn))/,s=/^(\s+)/,l=/^(\()/,c=/^(\))/,d=/^(,)/,u=/^(url)\(/,h=/^(.*?)\)/,f={},p={};return function(t){return a(p,t)?p[t]:p[t]=re(t).map(e)}}(),re=function(){var e={};return function(t,n){function i(e){return h=e.exec(t.substr(c))}function o(e){return e.replace(/^\s+|\s+$/g,"")}var r,s,l,c,d,u,h;if(n||(n=/^\s*,\s*/),r=t+n,a(e,r))return e[r];for(s=[],l=0,c=0,d=0,u=!1;t.length>c;)!u&&i(/^[\(\[\{]/)?(d++,c++):!u&&i(/^[\)\]\}]/)?(d--,c++):!u&&i(/^[\"\']/)?(u=h[0],c++):"'"==u&&i(/^\\\'/)?c+=2:'"'==u&&i(/^\\\"/)?c+=2:"'"==u&&i(/^\'/)?(u=!1,c++):'"'==u&&i(/^\"/)?(u=!1,c++):i(n)?(!u&&!d&&c>l&&(s.push(o(t.substring(l,c))),l=c+h[0].length),c+=h[0].length):c++;return c>l&&s.push(o(t.substring(l,c))),e[r]=s}}(),ae=function(){var e={};return function(t){var n,i=e[t];return i||((n=/url\((['"]?)([^'")]*?)\1\)\s+format\((['"]?)truetype\3\)/.exec(t))?i=e[t]=n[2]:(n=/url\((['"]?)([^'")]*?\.ttf)\1\)/.exec(t))&&(i=e[t]=n[2])),i}}()}(window.kendo.jQuery,parseFloat,Math)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("drawing/animation.min",["drawing/geometry.min","drawing/core.min"],e)}(function(){!function(e){var t=e.noop,n=window.kendo,i=n.Class,o=n.util,r=n.animationFrame,a=n.deepExtend,s=i.extend({init:function(e,t){var n=this;n.options=a({},n.options,t),n.element=e},options:{duration:500,easing:"swing"},setup:t,step:t,play:function(){var t=this,n=t.options,i=e.easing[n.easing],a=n.duration,s=n.delay||0,l=o.now()+s,c=l+a;0===a?(t.step(1),t.abort()):setTimeout(function(){var e=function(){var n,s,d,u;t._stopped||(n=o.now(),s=o.limitValue(n-l,0,a),d=s/a,u=i(d,s,0,1,a),t.step(u),c>n?r(e):t.abort())};e()},s)},abort:function(){this._stopped=!0},destroy:function(){this.abort()}}),l=function(){this._items=[]};l.prototype={register:function(e,t){this._items.push({name:e,type:t})},create:function(e,t){var n,i,o,r=this._items;if(t&&t.type)for(i=t.type.toLowerCase(),o=0;r.length>o;o++)if(r[o].name.toLowerCase()===i){n=r[o];break}return n?new n.type(e,t):void 0}},l.current=new l,s.create=function(e,t,n){return l.current.create(e,t,n)},a(n.drawing,{Animation:s,AnimationFactory:l})}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.drawing.min",["kendo.color.min","util/main.min","util/text-metrics.min","util/base64.min","mixins/observers.min","drawing/geometry.min","drawing/core.min","drawing/mixins.min","drawing/shapes.min","drawing/parser.min","drawing/search.min","drawing/svg.min","drawing/canvas.min","drawing/vml.min","drawing/html.min","drawing/animation.min"],e)}(function(){},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.validator.min",["kendo.core.min"],e)}(function(){return function(e,t){function n(t){var n,i=l.ui.validator.ruleResolvers||{},o={};for(n in i)e.extend(!0,o,i[n].resolve(t));return o}function i(e){return e.replace(/&/g,"&").replace(/"/g,'"').replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function o(e){return e=(e+"").split("."),e.length>1?e[1].length:0}function r(t){return e(e.parseHTML?e.parseHTML(t):t)}function a(t,n){var i,o,r,a,s=e();for(r=0,a=t.length;a>r;r++)i=t[r],h.test(i.className)&&(o=i.getAttribute(l.attr("for")),o===n&&(s=s.add(i)));return s}var s,l=window.kendo,c=l.ui.Widget,d=".kendoValidator",u="k-invalid-msg",h=RegExp(u,"i"),f="k-invalid",p="k-valid",m=/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/i,g=/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,v=":input:not(:button,[type=submit],[type=reset],[disabled],[readonly])",_=":checkbox:not([disabled],[readonly])",b="[type=number],[type=range]",w="blur",y="name",k="form",x="novalidate",C=e.proxy,S=function(e,t){return"string"==typeof t&&(t=RegExp("^(?:"+t+")$")),t.test(e)},T=function(e,t,n){var i=e.val();return e.filter(t).length&&""!==i?S(i,n):!0},D=function(e,t){return e.length?null!=e[0].attributes[t]:!1};l.ui.validator||(l.ui.validator={rules:{},messages:{}}),s=c.extend({init:function(t,i){var o=this,r=n(t),a="["+l.attr("validate")+"!=false]";i=i||{},i.rules=e.extend({},l.ui.validator.rules,r.rules,i.rules),i.messages=e.extend({},l.ui.validator.messages,r.messages,i.messages),c.fn.init.call(o,t,i),o._errorTemplate=l.template(o.options.errorTemplate),o.element.is(k)&&o.element.attr(x,x),o._inputSelector=v+a,o._checkboxSelector=_+a,o._errors={},o._attachEvents(),o._isValidated=!1},events:["validate","change"],options:{name:"Validator",errorTemplate:' #=message#',messages:{required:"{0} is required",pattern:"{0} is not valid",min:"{0} should be greater than or equal to {1}",max:"{0} should be smaller than or equal to {1}",step:"{0} is not valid",email:"{0} is not valid email",url:"{0} is not valid URL",date:"{0} is not valid date",dateCompare:"End date should be greater than or equal to the start date"},rules:{required:function(e){var t=e.filter("[type=checkbox]").length&&!e.is(":checked"),n=e.val();return!(D(e,"required")&&(""===n||!n||t))},pattern:function(e){return e.filter("[type=text],[type=email],[type=url],[type=tel],[type=search],[type=password]").filter("[pattern]").length&&""!==e.val()?S(e.val(),e.attr("pattern")):!0},min:function(e){if(e.filter(b+",["+l.attr("type")+"=number]").filter("[min]").length&&""!==e.val()){var t=parseFloat(e.attr("min"))||0,n=l.parseFloat(e.val());return n>=t}return!0},max:function(e){if(e.filter(b+",["+l.attr("type")+"=number]").filter("[max]").length&&""!==e.val()){var t=parseFloat(e.attr("max"))||0,n=l.parseFloat(e.val());return t>=n}return!0},step:function(e){if(e.filter(b+",["+l.attr("type")+"=number]").filter("[step]").length&&""!==e.val()){var t,n=parseFloat(e.attr("min"))||0,i=parseFloat(e.attr("step"))||1,r=parseFloat(e.val()),a=o(i);return a?(t=Math.pow(10,a),Math.floor((r-n)*t)%(i*t)/Math.pow(100,a)===0):(r-n)%i===0}return!0},email:function(e){return T(e,"[type=email],["+l.attr("type")+"=email]",m)},url:function(e){return T(e,"[type=url],["+l.attr("type")+"=url]",g)},date:function(e){return e.filter("[type^=date],["+l.attr("type")+"=date]").length&&""!==e.val()?null!==l.parseDate(e.val(),e.attr(l.attr("format"))):!0}},validateOnBlur:!0},destroy:function(){c.fn.destroy.call(this),this.element.off(d)},value:function(){return this._isValidated?0===this.errors().length:!1},_submit:function(e){return this.validate()?!0:(e.stopPropagation(),e.stopImmediatePropagation(),e.preventDefault(),!1)},_checkElement:function(e){var t=this.value();this.validateInput(e),this.value()!==t&&this.trigger("change")},_attachEvents:function(){var t=this;t.element.is(k)&&t.element.on("submit"+d,C(t._submit,t)),t.options.validateOnBlur&&(t.element.is(v)?(t.element.on(w+d,function(){t._checkElement(t.element)}),t.element.is(_)&&t.element.on("click"+d,function(){t._checkElement(t.element)})):(t.element.on(w+d,t._inputSelector,function(){t._checkElement(e(this))}),t.element.on("click"+d,t._checkboxSelector,function(){t._checkElement(e(this))})))},validate:function(){var e,t,n,i,o=!1,r=this.value();if(this._errors={},this.element.is(v))o=this.validateInput(this.element);else{for(i=!1,e=this.element.find(this._inputSelector),t=0,n=e.length;n>t;t++)this.validateInput(e.eq(t))||(i=!0);o=!i}return this.trigger("validate",{valid:o}),r!==o&&this.trigger("change"),o},validateInput:function(t){var n,o,a,s,c,d,h,m,g,v;return t=e(t),this._isValidated=!0,n=this,o=n._errorTemplate,a=n._checkValidity(t),s=a.valid,c="."+u,d=t.attr(y)||"",h=n._findMessageContainer(d).add(t.next(c).filter(function(){var t=e(this);return t.filter("["+l.attr("for")+"]").length?t.attr(l.attr("for"))===d:!0})).hide(),t.removeAttr("aria-invalid"),s?delete n._errors[d]:(m=n._extractMessage(t,a.key),n._errors[d]=m,g=r(o({message:i(m)})),v=h.attr("id"),n._decorateMessageContainer(g,d),v&&g.attr("id",v),h.replaceWith(g).length||g.insertAfter(t),g.show(),t.attr("aria-invalid",!0)),t.toggleClass(f,!s),t.toggleClass(p,s),s},hideMessages:function(){var e=this,t="."+u,n=e.element;n.is(v)?n.next(t).hide():n.find(t).hide()},_findMessageContainer:function(t){var n,i,o,r=l.ui.validator.messageLocators,s=e();for(i=0,o=this.element.length;o>i;i++)s=s.add(a(this.element[i].getElementsByTagName("*"),t));for(n in r)s=s.add(r[n].locate(this.element,t));return s},_decorateMessageContainer:function(e,t){var n,i=l.ui.validator.messageLocators;e.addClass(u).attr(l.attr("for"),t||"");for(n in i)i[n].decorate(e,t);e.attr("role","alert")},_extractMessage:function(e,t){var n=this,i=n.options.messages[t],o=e.attr(y);return i=l.isFunction(i)?i(e):i,l.format(e.attr(l.attr(t+"-msg"))||e.attr("validationMessage")||e.attr("title")||i||"",o,e.attr(t)||e.attr(l.attr(t)))},_checkValidity:function(e){var t,n=this.options.rules;for(t in n)if(!n[t].call(this,e))return{valid:!1,key:t};return{valid:!0}},errors:function(){var e,t=[],n=this._errors;for(e in n)t.push(n[e]);return t}}),l.ui.plugin(s)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.userevents.min",["kendo.core.min"],e)}(function(){return function(e,t){function n(e,t){var n=e.x.location,i=e.y.location,o=t.x.location,r=t.y.location,a=n-o,s=i-r;return{center:{x:(n+o)/2,y:(i+r)/2},distance:Math.sqrt(a*a+s*s)}}function i(e){var t,n,i,o=[],r=e.originalEvent,s=e.currentTarget,l=0;if(e.api)o.push({id:2,event:e,target:e.target,currentTarget:e.target,location:e,type:"api"});else if(e.type.match(/touch/))for(n=r?r.changedTouches:[],t=n.length;t>l;l++)i=n[l],o.push({location:i,event:e,target:i.target,currentTarget:s,id:i.identifier,type:"touch"});else o.push(a.pointers||a.msPointers?{location:r,event:e,target:e.target,currentTarget:s,id:r.pointerId,type:"pointer"}:{id:1,event:e,target:e.target,currentTarget:s,location:e,type:"mouse"});return o}function o(e){for(var t=r.eventMap.up.split(" "),n=0,i=t.length;i>n;n++)e(t[n])}var r=window.kendo,a=r.support,s=r.Class,l=r.Observable,c=e.now,d=e.extend,u=a.mobileOS,h=u&&u.android,f=800,p=a.browser.msie?5:0,m="press",g="hold",v="select",_="start",b="move",w="end",y="cancel",k="tap",x="release",C="gesturestart",S="gesturechange",T="gestureend",D="gesturetap",A={api:0,touch:0,mouse:9,pointer:9},E=!a.touch||a.mouseAndTouchPresent,I=s.extend({init:function(e,t){var n=this;n.axis=e,n._updateLocationData(t),n.startLocation=n.location,n.velocity=n.delta=0,n.timeStamp=c()},move:function(e){var t=this,n=e["page"+t.axis],i=c(),o=i-t.timeStamp||1;!n&&h||(t.delta=n-t.location,t._updateLocationData(e),t.initialDelta=n-t.startLocation,t.velocity=t.delta/o,t.timeStamp=i)},_updateLocationData:function(e){var t=this,n=t.axis;t.location=e["page"+n],t.client=e["client"+n],t.screen=e["screen"+n]}}),R=s.extend({init:function(e,t,n){d(this,{x:new I("X",n.location),y:new I("Y",n.location),type:n.type,useClickAsTap:e.useClickAsTap,threshold:e.threshold||A[n.type],userEvents:e,target:t,currentTarget:n.currentTarget,initialTouch:n.target,id:n.id,pressEvent:n,_moved:!1,_finished:!1})},press:function(){this._holdTimeout=setTimeout(e.proxy(this,"_hold"),this.userEvents.minHold),this._trigger(m,this.pressEvent)},_hold:function(){this._trigger(g,this.pressEvent)},move:function(e){ +var t=this;if(!t._finished){if(t.x.move(e.location),t.y.move(e.location),!t._moved){if(t._withinIgnoreThreshold())return;if(M.current&&M.current!==t.userEvents)return t.dispose();t._start(e)}t._finished||t._trigger(b,e)}},end:function(e){this.endTime=c(),this._finished||(this._finished=!0,this._trigger(x,e),this._moved?this._trigger(w,e):this.useClickAsTap||this._trigger(k,e),clearTimeout(this._holdTimeout),this.dispose())},dispose:function(){var t=this.userEvents,n=t.touches;this._finished=!0,this.pressEvent=null,clearTimeout(this._holdTimeout),n.splice(e.inArray(this,n),1)},skip:function(){this.dispose()},cancel:function(){this.dispose()},isMoved:function(){return this._moved},_start:function(e){clearTimeout(this._holdTimeout),this.startTime=c(),this._moved=!0,this._trigger(_,e)},_trigger:function(e,t){var n=this,i=t.event,o={touch:n,x:n.x,y:n.y,target:n.target,event:i};n.userEvents.notify(e,o)&&i.preventDefault()},_withinIgnoreThreshold:function(){var e=this.x.initialDelta,t=this.y.initialDelta;return Math.sqrt(e*e+t*t)<=this.threshold}}),M=l.extend({init:function(t,n){var i,s,c,u=this,h=r.guid();n=n||{},i=u.filter=n.filter,u.threshold=n.threshold||p,u.minHold=n.minHold||f,u.touches=[],u._maxTouches=n.multiTouch?2:1,u.allowSelection=n.allowSelection,u.captureUpIfMoved=n.captureUpIfMoved,u.useClickAsTap=!n.fastTap&&!a.delayedClick(),u.eventNS=h,t=e(t).handler(u),l.fn.init.call(u),d(u,{element:t,surface:e(n.global&&E?t[0].ownerDocument.documentElement:n.surface||t),stopPropagation:n.stopPropagation,pressed:!1}),u.surface.handler(u).on(r.applyEventMap("move",h),"_move").on(r.applyEventMap("up cancel",h),"_end"),t.on(r.applyEventMap("down",h),i,"_start"),u.useClickAsTap&&t.on(r.applyEventMap("click",h),i,"_click"),(a.pointers||a.msPointers)&&(11>a.browser.version?t.css("-ms-touch-action","pinch-zoom double-tap-zoom"):t.css("touch-action",n.touchAction||"none")),n.preventDragEvent&&t.on(r.applyEventMap("dragstart",h),r.preventDefault),t.on(r.applyEventMap("mousedown",h),i,{root:t},"_select"),u.captureUpIfMoved&&a.eventCapture&&(s=u.surface[0],c=e.proxy(u.preventIfMoving,u),o(function(e){s.addEventListener(e,c,!0)})),u.bind([m,g,k,_,b,w,x,y,C,S,T,D,v],n)},preventIfMoving:function(e){this._isMoved()&&e.preventDefault()},destroy:function(){var e,t=this;t._destroyed||(t._destroyed=!0,t.captureUpIfMoved&&a.eventCapture&&(e=t.surface[0],o(function(n){e.removeEventListener(n,t.preventIfMoving)})),t.element.kendoDestroy(t.eventNS),t.surface.kendoDestroy(t.eventNS),t.element.removeData("handler"),t.surface.removeData("handler"),t._disposeAll(),t.unbind(),delete t.surface,delete t.element,delete t.currentTarget)},capture:function(){M.current=this},cancel:function(){this._disposeAll(),this.trigger(y)},notify:function(e,t){var i=this,o=i.touches;if(this._isMultiTouch()){switch(e){case b:e=S;break;case w:e=T;break;case k:e=D}d(t,{touches:o},n(o[0],o[1]))}return this.trigger(e,d(t,{type:e}))},press:function(e,t,n){this._apiCall("_start",e,t,n)},move:function(e,t){this._apiCall("_move",e,t)},end:function(e,t){this._apiCall("_end",e,t)},_isMultiTouch:function(){return this.touches.length>1},_maxTouchesReached:function(){return this.touches.length>=this._maxTouches},_disposeAll:function(){for(var e=this.touches;e.length>0;)e.pop().dispose()},_isMoved:function(){return e.grep(this.touches,function(e){return e.isMoved()}).length},_select:function(e){this.allowSelection&&!this.trigger(v,{event:e})||e.preventDefault()},_start:function(t){var n,o,r=this,a=0,s=r.filter,l=i(t),c=l.length,d=t.which;if(!(d&&d>1||r._maxTouchesReached()))for(M.current=null,r.currentTarget=t.currentTarget,r.stopPropagation&&t.stopPropagation();c>a&&!r._maxTouchesReached();a++)o=l[a],n=s?e(o.currentTarget):r.element,n.length&&(o=new R(r,n,o),r.touches.push(o),o.press(),r._isMultiTouch()&&r.notify("gesturestart",{}))},_move:function(e){this._eachTouch("move",e)},_end:function(e){this._eachTouch("end",e)},_click:function(t){var n={touch:{initialTouch:t.target,target:e(t.currentTarget),endTime:c(),x:{location:t.pageX,client:t.clientX},y:{location:t.pageY,client:t.clientY}},x:t.pageX,y:t.pageY,target:e(t.currentTarget),event:t,type:"tap"};this.trigger("tap",n)&&t.preventDefault()},_eachTouch:function(e,t){var n,o,r,a,s=this,l={},c=i(t),d=s.touches;for(n=0;d.length>n;n++)o=d[n],l[o.id]=o;for(n=0;c.length>n;n++)r=c[n],a=l[r.id],a&&a[e](r)},_apiCall:function(t,n,i,o){this[t]({api:!0,pageX:n,pageY:i,clientX:n,clientY:i,target:e(o||this.element)[0],stopPropagation:e.noop,preventDefault:e.noop})}});M.defaultThreshold=function(e){p=e},M.minHold=function(e){f=e},r.getTouches=i,r.touchDelta=n,r.UserEvents=M}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.draganddrop.min",["kendo.core.min","kendo.userevents.min"],e)}(function(){return function(e,t){function n(t,n){try{return e.contains(t,n)||t==n}catch(i){return!1}}function i(e,t){return parseInt(e.css(t),10)||0}function o(e,t){return Math.min(Math.max(e,t.min),t.max)}function r(e,t){var n=A(e),o=n.left+i(e,"borderLeftWidth")+i(e,"paddingLeft"),r=n.top+i(e,"borderTopWidth")+i(e,"paddingTop"),a=o+e.width()-t.outerWidth(!0),s=r+e.height()-t.outerHeight(!0);return{x:{min:o,max:a},y:{min:r,max:s}}}function a(n,i,o){for(var r,a,s=0,l=i&&i.length,c=o&&o.length;n&&n.parentNode;){for(s=0;l>s;s++)if(r=i[s],r.element[0]===n)return{target:r,targetElement:n};for(s=0;c>s;s++)if(a=o[s],e.contains(a.element[0],n)&&b.matchesSelector.call(n,a.options.filter))return{target:a,targetElement:n};n=n.parentNode}return t}function s(e,t){var n,i=t.options.group,o=e[i];if(x.fn.destroy.call(t),o.length>1){for(n=0;o.length>n;n++)if(o[n]==t){o.splice(n,1);break}}else o.length=0,delete e[i]}function l(e){var t,n,i,o=c()[0];return e[0]===o?(n=o.scrollTop,i=o.scrollLeft,{top:n,left:i,bottom:n+y.height(),right:i+y.width()}):(t=e.offset(),t.bottom=t.top+e.height(),t.right=t.left+e.width(),t)}function c(){return e(_.support.browser.chrome?w.body:w.documentElement)}function d(t){var n,i=c();if(!t||t===w.body||t===w.documentElement)return i;for(n=e(t)[0];n&&!_.isScrollable(n)&&n!==w.body;)n=n.parentNode;return n===w.body?i:e(n)}function u(e,t,n){var i={x:0,y:0},o=50;return o>e-n.left?i.x=-(o-(e-n.left)):o>n.right-e&&(i.x=o-(n.right-e)),o>t-n.top?i.y=-(o-(t-n.top)):o>n.bottom-t&&(i.y=o-(n.bottom-t)),i}var h,f,p,m,g,v,_=window.kendo,b=_.support,w=window.document,y=e(window),k=_.Class,x=_.ui.Widget,C=_.Observable,S=_.UserEvents,T=e.proxy,D=e.extend,A=_.getOffset,E={},I={},R={},M=_.elementUnderCursor,F="keyup",z="change",P="dragstart",B="hold",L="drag",H="dragend",N="dragcancel",O="hintDestroyed",V="dragenter",W="dragleave",U="drop",j=C.extend({init:function(t,n){var i=this,o=t[0];i.capture=!1,o.addEventListener?(e.each(_.eventMap.down.split(" "),function(){o.addEventListener(this,T(i._press,i),!0)}),e.each(_.eventMap.up.split(" "),function(){o.addEventListener(this,T(i._release,i),!0)})):(e.each(_.eventMap.down.split(" "),function(){o.attachEvent(this,T(i._press,i))}),e.each(_.eventMap.up.split(" "),function(){o.attachEvent(this,T(i._release,i))})),C.fn.init.call(i),i.bind(["press","release"],n||{})},captureNext:function(){this.capture=!0},cancelCapture:function(){this.capture=!1},_press:function(e){var t=this;t.trigger("press"),t.capture&&e.preventDefault()},_release:function(e){var t=this;t.trigger("release"),t.capture&&(e.preventDefault(),t.cancelCapture())}}),q=C.extend({init:function(t){var n=this;C.fn.init.call(n),n.forcedEnabled=!1,e.extend(n,t),n.scale=1,n.horizontal?(n.measure="offsetWidth",n.scrollSize="scrollWidth",n.axis="x"):(n.measure="offsetHeight",n.scrollSize="scrollHeight",n.axis="y")},makeVirtual:function(){e.extend(this,{virtual:!0,forcedEnabled:!0,_virtualMin:0,_virtualMax:0})},virtualSize:function(e,t){this._virtualMin===e&&this._virtualMax===t||(this._virtualMin=e,this._virtualMax=t,this.update())},outOfBounds:function(e){return e>this.max||this.min>e},forceEnabled:function(){this.forcedEnabled=!0},getSize:function(){return this.container[0][this.measure]},getTotal:function(){return this.element[0][this.scrollSize]},rescale:function(e){this.scale=e},update:function(e){var t=this,n=t.virtual?t._virtualMax:t.getTotal(),i=n*t.scale,o=t.getSize();(0!==n||t.forcedEnabled)&&(t.max=t.virtual?-t._virtualMin:0,t.size=o,t.total=i,t.min=Math.min(t.max,o-i),t.minScale=o/n,t.centerOffset=(i-o)/2,t.enabled=t.forcedEnabled||i>o,e||t.trigger(z,t))}}),G=C.extend({init:function(e){var t=this;C.fn.init.call(t),t.x=new q(D({horizontal:!0},e)),t.y=new q(D({horizontal:!1},e)),t.container=e.container,t.forcedMinScale=e.minScale,t.maxScale=e.maxScale||100,t.bind(z,e)},rescale:function(e){this.x.rescale(e),this.y.rescale(e),this.refresh()},centerCoordinates:function(){return{x:Math.min(0,-this.x.centerOffset),y:Math.min(0,-this.y.centerOffset)}},refresh:function(){var e=this;e.x.update(),e.y.update(),e.enabled=e.x.enabled||e.y.enabled,e.minScale=e.forcedMinScale||Math.min(e.x.minScale,e.y.minScale),e.fitScale=Math.max(e.x.minScale,e.y.minScale),e.trigger(z)}}),$=C.extend({init:function(e){var t=this;D(t,e),C.fn.init.call(t)},outOfBounds:function(){return this.dimension.outOfBounds(this.movable[this.axis])},dragMove:function(e){var t=this,n=t.dimension,i=t.axis,o=t.movable,r=o[i]+e;n.enabled&&((n.min>r&&0>e||r>n.max&&e>0)&&(e*=t.resistance),o.translateAxis(i,e),t.trigger(z,t))}}),Y=k.extend({init:function(t){var n,i,o,r,a=this;D(a,{elastic:!0},t),o=a.elastic?.5:0,r=a.movable,a.x=n=new $({axis:"x",dimension:a.dimensions.x,resistance:o,movable:r}),a.y=i=new $({axis:"y",dimension:a.dimensions.y,resistance:o,movable:r}),a.userEvents.bind(["press","move","end","gesturestart","gesturechange"],{gesturestart:function(e){a.gesture=e,a.offset=a.dimensions.container.offset()},press:function(t){e(t.event.target).closest("a").is("[data-navigate-on-press=true]")&&t.sender.cancel()},gesturechange:function(e){var t,o,s,l=a.gesture,c=l.center,d=e.center,u=e.distance/l.distance,h=a.dimensions.minScale,f=a.dimensions.maxScale;h>=r.scale&&1>u&&(u+=.8*(1-u)),r.scale*u>=f&&(u=f/r.scale),o=r.x+a.offset.left,s=r.y+a.offset.top,t={x:(o-c.x)*u+d.x-o,y:(s-c.y)*u+d.y-s},r.scaleWith(u),n.dragMove(t.x),i.dragMove(t.y),a.dimensions.rescale(r.scale),a.gesture=e,e.preventDefault()},move:function(e){e.event.target.tagName.match(/textarea|input/i)||(n.dimension.enabled||i.dimension.enabled?(n.dragMove(e.x.delta),i.dragMove(e.y.delta),e.preventDefault()):e.touch.skip())},end:function(e){e.preventDefault()}})}}),K=b.transitions.prefix+"Transform";f=b.hasHW3D?function(e,t,n){return"translate3d("+e+"px,"+t+"px,0) scale("+n+")"}:function(e,t,n){return"translate("+e+"px,"+t+"px) scale("+n+")"},p=C.extend({init:function(t){var n=this;C.fn.init.call(n),n.element=e(t),n.element[0].style.webkitTransformOrigin="left top",n.x=0,n.y=0,n.scale=1,n._saveCoordinates(f(n.x,n.y,n.scale))},translateAxis:function(e,t){this[e]+=t,this.refresh()},scaleTo:function(e){this.scale=e,this.refresh()},scaleWith:function(e){this.scale*=e,this.refresh()},translate:function(e){this.x+=e.x,this.y+=e.y,this.refresh()},moveAxis:function(e,t){this[e]=t,this.refresh()},moveTo:function(e){D(this,e),this.refresh()},refresh:function(){var e,t=this,n=t.x,i=t.y;t.round&&(n=Math.round(n),i=Math.round(i)),e=f(n,i,t.scale),e!=t.coordinates&&(_.support.browser.msie&&10>_.support.browser.version?(t.element[0].style.position="absolute",t.element[0].style.left=t.x+"px",t.element[0].style.top=t.y+"px"):t.element[0].style[K]=e,t._saveCoordinates(e),t.trigger(z))},_saveCoordinates:function(e){this.coordinates=e}}),m=x.extend({init:function(e,t){var n,i=this;x.fn.init.call(i,e,t),n=i.options.group,n in I?I[n].push(i):I[n]=[i]},events:[V,W,U],options:{name:"DropTarget",group:"default"},destroy:function(){s(I,this)},_trigger:function(e,n){var i=this,o=E[i.options.group];return o?i.trigger(e,D({},n.event,{draggable:o,dropTarget:n.dropTarget})):t},_over:function(e){this._trigger(V,e)},_out:function(e){this._trigger(W,e)},_drop:function(e){var t=this,n=E[t.options.group];n&&(n.dropped=!t._trigger(U,e))}}),m.destroyGroup=function(e){var t,n=I[e]||R[e];if(n){for(t=0;n.length>t;t++)x.fn.destroy.call(n[t]);n.length=0,delete I[e],delete R[e]}},m._cache=I,g=m.extend({init:function(e,t){var n,i=this;x.fn.init.call(i,e,t),n=i.options.group,n in R?R[n].push(i):R[n]=[i]},destroy:function(){s(R,this)},options:{name:"DropTargetArea",group:"default",filter:null}}),v=x.extend({init:function(e,t){var n=this;x.fn.init.call(n,e,t),n._activated=!1,n.userEvents=new S(n.element,{global:!0,allowSelection:!0,filter:n.options.filter,threshold:n.options.distance,start:T(n._start,n),hold:T(n._hold,n),move:T(n._drag,n),end:T(n._end,n),cancel:T(n._cancel,n),select:T(n._select,n)}),n._afterEndHandler=T(n._afterEnd,n),n._captureEscape=T(n._captureEscape,n)},events:[B,P,L,H,N,O],options:{name:"Draggable",distance:_.support.touch?0:5,group:"default",cursorOffset:null,axis:null,container:null,filter:null,ignore:null,holdToDrag:!1,autoScroll:!1,dropped:!1},cancelHold:function(){this._activated=!1},_captureEscape:function(e){var t=this;e.keyCode===_.keys.ESC&&(t._trigger(N,{event:e}),t.userEvents.cancel())},_updateHint:function(t){var n,i=this,r=i.options,a=i.boundaries,s=r.axis,l=i.options.cursorOffset;l?n={left:t.x.location+l.left,top:t.y.location+l.top}:(i.hintOffset.left+=t.x.delta,i.hintOffset.top+=t.y.delta,n=e.extend({},i.hintOffset)),a&&(n.top=o(n.top,a.y),n.left=o(n.left,a.x)),"x"===s?delete n.top:"y"===s&&delete n.left,i.hint.css(n)},_shouldIgnoreTarget:function(t){var n=this.options.ignore;return n&&e(t).is(n)},_select:function(e){this._shouldIgnoreTarget(e.event.target)||e.preventDefault()},_start:function(n){var i,o=this,a=o.options,s=a.container,l=a.hint;return this._shouldIgnoreTarget(n.touch.initialTouch)||a.holdToDrag&&!o._activated?(o.userEvents.cancel(),t):(o.currentTarget=n.target,o.currentTargetOffset=A(o.currentTarget),l&&(o.hint&&o.hint.stop(!0,!0).remove(),o.hint=_.isFunction(l)?e(l.call(o,o.currentTarget)):l,i=A(o.currentTarget),o.hintOffset=i,o.hint.css({position:"absolute",zIndex:2e4,left:i.left,top:i.top}).appendTo(w.body),o.angular("compile",function(){o.hint.removeAttr("ng-repeat");for(var t=e(n.target);!t.data("$$kendoScope")&&t.length;)t=t.parent();return{elements:o.hint.get(),scopeFrom:t.data("$$kendoScope")}})),E[a.group]=o,o.dropped=!1,s&&(o.boundaries=r(s,o.hint)),e(w).on(F,o._captureEscape),o._trigger(P,n)&&(o.userEvents.cancel(),o._afterEnd()),o.userEvents.capture(),t)},_hold:function(e){this.currentTarget=e.target,this._trigger(B,e)?this.userEvents.cancel():this._activated=!0},_drag:function(t){var n,i;t.preventDefault(),n=this._elementUnderCursor(t),this.options.autoScroll&&this._cursorElement!==n&&(this._scrollableParent=d(n),this._cursorElement=n),this._lastEvent=t,this._processMovement(t,n),this.options.autoScroll&&this._scrollableParent[0]&&(i=u(t.x.location,t.y.location,l(this._scrollableParent)),this._scrollCompenstation=e.extend({},this.hintOffset),this._scrollVelocity=i,0===i.y&&0===i.x?(clearInterval(this._scrollInterval),this._scrollInterval=null):this._scrollInterval||(this._scrollInterval=setInterval(e.proxy(this,"_autoScroll"),50))),this.hint&&this._updateHint(t)},_processMovement:function(n,i){this._withDropTarget(i,function(i,o){if(!i)return h&&(h._trigger(W,D(n,{dropTarget:e(h.targetElement)})),h=null),t;if(h){if(o===h.targetElement)return;h._trigger(W,D(n,{dropTarget:e(h.targetElement)}))}i._trigger(V,D(n,{dropTarget:e(o)})),h=D(i,{targetElement:o})}),this._trigger(L,D(n,{dropTarget:h,elementUnderCursor:i}))},_autoScroll:function(){var e,t,n,i,o,r,a,s,l=this._scrollableParent[0],d=this._scrollVelocity,u=this._scrollCompenstation;l&&(e=this._elementUnderCursor(this._lastEvent),this._processMovement(this._lastEvent,e),i=l===c()[0],i?(t=w.body.scrollHeight>y.height(),n=w.body.scrollWidth>y.width()):(t=l.scrollHeight>=l.offsetHeight,n=l.scrollWidth>=l.offsetWidth),o=l.scrollTop+d.y,r=t&&o>0&&l.scrollHeight>o,a=l.scrollLeft+d.x,s=n&&a>0&&l.scrollWidth>a,r&&(l.scrollTop+=d.y),s&&(l.scrollLeft+=d.x),i&&(s||r)&&(r&&(u.top+=d.y),s&&(u.left+=d.x),this.hint.css(u)))},_end:function(t){this._withDropTarget(this._elementUnderCursor(t),function(n,i){n&&(n._drop(D({},t,{dropTarget:e(i)})),h=null)}),this._cancel(this._trigger(H,t))},_cancel:function(e){var t=this;t._scrollableParent=null,this._cursorElement=null,clearInterval(this._scrollInterval),t._activated=!1,t.hint&&!t.dropped?setTimeout(function(){t.hint.stop(!0,!0),e?t._afterEndHandler():t.hint.animate(t.currentTargetOffset,"fast",t._afterEndHandler)},0):t._afterEnd()},_trigger:function(e,t){var n=this;return n.trigger(e,D({},t.event,{x:t.x,y:t.y,currentTarget:n.currentTarget,initialTarget:t.touch?t.touch.initialTouch:null,dropTarget:t.dropTarget,elementUnderCursor:t.elementUnderCursor}))},_elementUnderCursor:function(e){var t=M(e),i=this.hint;return i&&n(i[0],t)&&(i.hide(),t=M(e),t||(t=M(e)),i.show()),t},_withDropTarget:function(e,t){var n,i=this.options.group,o=I[i],r=R[i];(o&&o.length||r&&r.length)&&(n=a(e,o,r),n?t(n.target,n.targetElement):t())},destroy:function(){var e=this;x.fn.destroy.call(e),e._afterEnd(),e.userEvents.destroy(),this._scrollableParent=null,this._cursorElement=null,clearInterval(this._scrollInterval),e.currentTarget=null},_afterEnd:function(){var t=this;t.hint&&t.hint.remove(),delete E[t.options.group],t.trigger("destroy"),t.trigger(O),e(w).off(F,t._captureEscape)}}),_.ui.plugin(m),_.ui.plugin(g),_.ui.plugin(v),_.TapCapture=j,_.containerBoundaries=r,D(_.ui,{Pane:Y,PaneDimensions:G,Movable:p}),_.ui.Draggable.utils={autoScrollVelocity:u,scrollableViewPort:l,findScrollableParent:d}}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.mobile.scroller.min",["kendo.fx.min","kendo.draganddrop.min"],e)}(function(){return function(e,t){var n=window.kendo,i=n.mobile,o=n.effects,r=i.ui,a=e.proxy,s=e.extend,l=r.Widget,c=n.Class,d=n.ui.Movable,u=n.ui.Pane,h=n.ui.PaneDimensions,f=o.Transition,p=o.Animation,m=Math.abs,g=500,v=.7,_=.96,b=10,w=55,y=.5,k=5,x="km-scroller-release",C="km-scroller-refresh",S="pull",T="change",D="resize",A="scroll",E=2,I=p.extend({init:function(e){var t=this;p.fn.init.call(t),s(t,e),t.userEvents.bind("gestureend",a(t.start,t)),t.tapCapture.bind("press",a(t.cancel,t))},enabled:function(){return this.dimensions.minScale>this.movable.scale},done:function(){return.01>this.dimensions.minScale-this.movable.scale},tick:function(){var e=this.movable;e.scaleWith(1.1),this.dimensions.rescale(e.scale)},onEnd:function(){var e=this.movable;e.scaleTo(this.dimensions.minScale),this.dimensions.rescale(e.scale)}}),R=p.extend({init:function(e){var t=this;p.fn.init.call(t),s(t,e,{transition:new f({axis:e.axis,movable:e.movable,onEnd:function(){t._end()}})}),t.tapCapture.bind("press",function(){t.cancel()}),t.userEvents.bind("end",a(t.start,t)),t.userEvents.bind("gestureend",a(t.start,t)),t.userEvents.bind("tap",a(t.onEnd,t))},onCancel:function(){this.transition.cancel()},freeze:function(e){var t=this;t.cancel(),t._moveTo(e)},onEnd:function(){var e=this;e.paneAxis.outOfBounds()?e._snapBack():e._end()},done:function(){return m(this.velocity)<1},start:function(e){var t,n=this;n.dimension.enabled&&(n.paneAxis.outOfBounds()?n._snapBack():(t=e.touch.id===E?0:e.touch[n.axis].velocity,n.velocity=Math.max(Math.min(t*n.velocityMultiplier,w),-w),n.tapCapture.captureNext(),p.fn.start.call(n)))},tick:function(){var e=this,t=e.dimension,n=e.paneAxis.outOfBounds()?y:e.friction,i=e.velocity*=n,o=e.movable[e.axis]+i;!e.elastic&&t.outOfBounds(o)&&(o=Math.max(Math.min(o,t.max),t.min),e.velocity=0),e.movable.moveAxis(e.axis,o)},_end:function(){this.tapCapture.cancelCapture(),this.end()},_snapBack:function(){var e=this,t=e.dimension,n=e.movable[e.axis]>t.max?t.max:t.min;e._moveTo(n)},_moveTo:function(e){this.transition.moveTo({location:e,duration:g,ease:f.easeOutExpo})}}),M=p.extend({init:function(e){var t=this;n.effects.Animation.fn.init.call(this),s(t,e,{origin:{},destination:{},offset:{}})},tick:function(){this._updateCoordinates(),this.moveTo(this.origin)},done:function(){return m(this.offset.y)');s(n,t,{element:o,elementSize:0,movable:new d(o),scrollMovable:t.movable,alwaysVisible:t.alwaysVisible,size:i?"width":"height"}),n.scrollMovable.bind(T,a(n.refresh,n)),n.container.append(o),t.alwaysVisible&&n.show()},refresh:function(){var e=this,t=e.axis,n=e.dimension,i=n.size,o=e.scrollMovable,r=i/n.total,a=Math.round(-o[t]*r),s=Math.round(i*r);r>=1?this.element.css("display","none"):this.element.css("display",""),a+s>i?s=i-a:0>a&&(s+=a,a=0),e.elementSize!=s&&(e.element.css(e.size,s+"px"),e.elementSize=s),e.movable.moveAxis(t,a)},show:function(){this.element.css({opacity:v,visibility:"visible"})},hide:function(){this.alwaysVisible||this.element.css({opacity:0})}}),z=l.extend({init:function(i,o){var r,c,f,p,g,v,_,b,w,y=this;return l.fn.init.call(y,i,o),i=y.element,(y._native=y.options.useNative&&n.support.hasNativeScrolling)?(i.addClass("km-native-scroller").prepend('
        '),s(y,{scrollElement:i,fixedContainer:i.children().first()}),t):(i.css("overflow","hidden").addClass("km-scroll-wrapper").wrapInner('
        ').prepend('
        '),r=i.children().eq(1),c=new n.TapCapture(i),f=new d(r),p=new h({element:r,container:i,forcedEnabled:y.options.zoom}),g=this.options.avoidScrolling,v=new n.UserEvents(i,{touchAction:"pan-y",fastTap:!0,allowSelection:!0,preventDragEvent:!0,captureUpIfMoved:!0,multiTouch:y.options.zoom,start:function(t){p.refresh();var n=m(t.x.velocity),i=m(t.y.velocity),o=2*n>=i,r=e.contains(y.fixedContainer[0],t.event.target),a=2*i>=n;!r&&!g(t)&&y.enabled&&(p.x.enabled&&o||p.y.enabled&&a)?v.capture():v.cancel()}}),_=new u({movable:f,dimensions:p,userEvents:v,elastic:y.options.elastic}),b=new I({movable:f,dimensions:p,userEvents:v,tapCapture:c}),w=new M({moveTo:function(e){y.scrollTo(e.x,e.y)}}),f.bind(T,function(){y.scrollTop=-f.y,y.scrollLeft=-f.x,y.trigger(A,{scrollTop:y.scrollTop,scrollLeft:y.scrollLeft})}),y.options.mousewheelScrolling&&i.on("DOMMouseScroll mousewheel",a(this,"_wheelScroll")),s(y,{movable:f,dimensions:p,zoomSnapBack:b,animatedScroller:w,userEvents:v,pane:_,tapCapture:c,pulled:!1,enabled:!0,scrollElement:r,scrollTop:0,scrollLeft:0,fixedContainer:i.children().first()}),y._initAxis("x"),y._initAxis("y"),y._wheelEnd=function(){y._wheel=!1,y.userEvents.end(0,y._wheelY)},p.refresh(),y.options.pullToRefresh&&y._initPullToRefresh(),t)},_wheelScroll:function(e){this._wheel||(this._wheel=!0,this._wheelY=0,this.userEvents.press(0,this._wheelY)),clearTimeout(this._wheelTimeout),this._wheelTimeout=setTimeout(this._wheelEnd,50);var t=n.wheelDeltaY(e);t&&(this._wheelY+=t,this.userEvents.move(0,this._wheelY)),e.preventDefault()},makeVirtual:function(){this.dimensions.y.makeVirtual()},virtualSize:function(e,t){this.dimensions.y.virtualSize(e,t)},height:function(){return this.dimensions.y.size},scrollHeight:function(){return this.scrollElement[0].scrollHeight},scrollWidth:function(){return this.scrollElement[0].scrollWidth},options:{name:"Scroller",zoom:!1,pullOffset:140,visibleScrollHints:!1,elastic:!0,useNative:!1,mousewheelScrolling:!0,avoidScrolling:function(){return!1},pullToRefresh:!1,messages:{pullTemplate:"Pull to refresh",releaseTemplate:"Release to refresh",refreshTemplate:"Refreshing"}},events:[S,A,D],_resize:function(){this._native||this.contentResized()},setOptions:function(e){var t=this;l.fn.setOptions.call(t,e),e.pullToRefresh&&t._initPullToRefresh()},reset:function(){this._native?this.scrollElement.scrollTop(0):(this.movable.moveTo({x:0,y:0}),this._scale(1))},contentResized:function(){this.dimensions.refresh(),this.pane.x.outOfBounds()&&this.movable.moveAxis("x",this.dimensions.x.min),this.pane.y.outOfBounds()&&this.movable.moveAxis("y",this.dimensions.y.min)},zoomOut:function(){var e=this.dimensions;e.refresh(),this._scale(e.fitScale),this.movable.moveTo(e.centerCoordinates())},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},scrollTo:function(e,t){this._native?(this.scrollElement.scrollLeft(m(e)),this.scrollElement.scrollTop(m(t))):(this.dimensions.refresh(),this.movable.moveTo({x:e,y:t}))},animatedScrollTo:function(e,t,n){var i,o;this._native?this.scrollTo(e,t):(i={x:this.movable.x,y:this.movable.y},o={x:e,y:t},this.animatedScroller.setCoordinates(i,o),this.animatedScroller.setCallback(n),this.animatedScroller.start())},pullHandled:function(){var e=this;e.refreshHint.removeClass(C),e.hintContainer.html(e.pullTemplate({})),e.yinertia.onEnd(),e.xinertia.onEnd(),e.userEvents.cancel()},destroy:function(){l.fn.destroy.call(this),this.userEvents&&this.userEvents.destroy()},_scale:function(e){this.dimensions.rescale(e),this.movable.scaleTo(e)},_initPullToRefresh:function(){var e=this;e.dimensions.y.forceEnabled(),e.pullTemplate=n.template(e.options.messages.pullTemplate),e.releaseTemplate=n.template(e.options.messages.releaseTemplate),e.refreshTemplate=n.template(e.options.messages.refreshTemplate),e.scrollElement.prepend(''+e.pullTemplate({})+""),e.refreshHint=e.scrollElement.children().first(),e.hintContainer=e.refreshHint.children(".km-template"),e.pane.y.bind("change",a(e._paneChange,e)),e.userEvents.bind("end",a(e._dragEnd,e))},_dragEnd:function(){var e=this;e.pulled&&(e.pulled=!1,e.refreshHint.removeClass(x).addClass(C),e.hintContainer.html(e.refreshTemplate({})),e.yinertia.freeze(e.options.pullOffset/2),e.trigger("pull"))},_paneChange:function(){var e=this;e.movable.y/y>e.options.pullOffset?e.pulled||(e.pulled=!0,e.refreshHint.removeClass(C).addClass(x),e.hintContainer.html(e.releaseTemplate({}))):e.pulled&&(e.pulled=!1,e.refreshHint.removeClass(x),e.hintContainer.html(e.pullTemplate({})))},_initAxis:function(e){var t=this,n=t.movable,i=t.dimensions[e],o=t.tapCapture,r=t.pane[e],a=new F({axis:e,movable:n,dimension:i,container:t.element,alwaysVisible:t.options.visibleScrollHints});i.bind(T,function(){a.refresh()}),r.bind(T,function(){a.show()}),t[e+"inertia"]=new R({axis:e,paneAxis:r,movable:n,tapCapture:o,userEvents:t.userEvents,dimension:i,elastic:t.options.elastic,friction:t.options.friction||_,velocityMultiplier:t.options.velocityMultiplier||b,end:function(){a.hide(),t.trigger("scrollEnd",{axis:e,scrollTop:t.scrollTop,scrollLeft:t.scrollLeft})}})}});r.plugin(z)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.groupable.min",["kendo.core.min","kendo.draganddrop.min"],e)}(function(){return function(e,t){function n(e){return e.position().top+3}var i=window.kendo,o=i.ui.Widget,r=e.proxy,a=!1,s=".kendoGroupable",l="change",c=i.template('
        (sorted ${(data.dir || "asc") == "asc" ? "ascending": "descending"})${data.title ? data.title: data.field}
        ',{useWithBlock:!1}),d=function(t){var n=t.attr(i.attr("title"));return n&&(n=i.htmlEncode(n)),e('
        ').css({width:t.width(),paddingLeft:t.css("paddingLeft"),paddingRight:t.css("paddingRight"),lineHeight:t.height()+"px",paddingTop:t.css("paddingTop"),paddingBottom:t.css("paddingBottom")}).html(n||t.attr(i.attr("field"))).prepend('')},u=e('
        '),h=o.extend({init:function(c,h){var f,p,m=this,g=i.guid(),v=r(m._intializePositions,m),_=m._dropCuePositions=[];o.fn.init.call(m,c,h),a=i.support.isRtl(c),p=a?"right":"left",m.draggable=f=m.options.draggable||new i.ui.Draggable(m.element,{filter:m.options.draggableElements,hint:d,group:g}),m.groupContainer=e(m.options.groupContainer,m.element).kendoDropTarget({group:f.options.group,dragenter:function(e){m._canDrag(e.draggable.currentTarget)&&(e.draggable.hint.find(".k-drag-status").removeClass("k-i-denied").addClass("k-i-add"),u.css("top",n(m.groupContainer)).css(p,0).appendTo(m.groupContainer))},dragleave:function(e){e.draggable.hint.find(".k-drag-status").removeClass("k-i-add").addClass("k-i-denied"),u.remove()},drop:function(t){var n,o=t.draggable.currentTarget,r=o.attr(i.attr("field")),s=o.attr(i.attr("title")),l=m.indicator(r),c=m._dropCuePositions,d=c[c.length-1];(o.hasClass("k-group-indicator")||m._canDrag(o))&&(d?(n=m._dropCuePosition(i.getOffset(u).left+parseInt(d.element.css("marginLeft"),10)*(a?-1:1)+parseInt(d.element.css("marginRight"),10)),n&&m._canDrop(e(l),n.element,n.left)&&(n.before?n.element.before(l||m.buildIndicator(r,s)):n.element.after(l||m.buildIndicator(r,s)),m._change())):(m.groupContainer.append(m.buildIndicator(r,s)),m._change()))}}).kendoDraggable({filter:"div.k-group-indicator",hint:d,group:f.options.group,dragcancel:r(m._dragCancel,m),dragstart:function(e){var t=e.currentTarget,i=parseInt(t.css("marginLeft"),10),o=t.position(),r=a?o.left-i:o.left+t.outerWidth();v(),u.css({top:n(m.groupContainer),left:r}).appendTo(m.groupContainer),this.hint.find(".k-drag-status").removeClass("k-i-denied").addClass("k-i-add")},dragend:function(){m._dragEnd(this)},drag:r(m._drag,m)}).on("click"+s,".k-button",function(t){t.preventDefault(),m._removeIndicator(e(this).parent())}).on("click"+s,".k-link",function(t){var n=e(this).parent(),o=m.buildIndicator(n.attr(i.attr("field")),n.attr(i.attr("title")),"asc"==n.attr(i.attr("dir"))?"desc":"asc");n.before(o).remove(),m._change(),t.preventDefault()}),f.bind(["dragend","dragcancel","dragstart","drag"],{dragend:function(){m._dragEnd(this)},dragcancel:r(m._dragCancel,m),dragstart:function(e){var n,i,o;return m.options.allowDrag||m._canDrag(e.currentTarget)?(v(),_.length?(n=_[_.length-1].element,i=parseInt(n.css("marginRight"),10),o=n.position().left+n.outerWidth()+i):o=0,t):(e.preventDefault(),t)},drag:r(m._drag,m)}),m.dataSource=m.options.dataSource,m.dataSource&&m._refreshHandler?m.dataSource.unbind(l,m._refreshHandler):m._refreshHandler=r(m.refresh,m),m.dataSource&&(m.dataSource.bind("change",m._refreshHandler),m.refresh())},refresh:function(){var t=this,n=t.dataSource;t.groupContainer&&t.groupContainer.empty().append(e.map(n.group()||[],function(n){var o=n.field,r=i.attr("field"),a=t.element.find(t.options.filter).filter(function(){return e(this).attr(r)===o});return t.buildIndicator(n.field,a.attr(i.attr("title")),n.dir)}).join("")),t._invalidateGroupContainer()},destroy:function(){var e=this;o.fn.destroy.call(e),e.groupContainer.off(s),e.groupContainer.data("kendoDropTarget")&&e.groupContainer.data("kendoDropTarget").destroy(),e.groupContainer.data("kendoDraggable")&&e.groupContainer.data("kendoDraggable").destroy(),e.options.draggable||e.draggable.destroy(),e.dataSource&&e._refreshHandler&&(e.dataSource.unbind("change",e._refreshHandler),e._refreshHandler=null),e.groupContainer=e.element=e.draggable=null},events:["change"],options:{name:"Groupable",filter:"th",draggableElements:"th",messages:{empty:"Drag a column header and drop it here to group by that column" +}},indicator:function(t){var n=e(".k-group-indicator",this.groupContainer);return e.grep(n,function(n){return e(n).attr(i.attr("field"))===t})[0]},buildIndicator:function(e,t,n){return c({field:e.replace(/"/g,"'"),dir:n,title:t,ns:i.ns})},descriptors:function(){var t,n,o,r,a,s=this,l=e(".k-group-indicator",s.groupContainer);return t=s.element.find(s.options.filter).map(function(){var t=e(this),o=t.attr(i.attr("aggregates")),s=t.attr(i.attr("field"));if(o&&""!==o)for(n=o.split(","),o=[],r=0,a=n.length;a>r;r++)o.push({field:s,aggregate:n[r]});return o}).toArray(),e.map(l,function(n){return n=e(n),o=n.attr(i.attr("field")),{field:o,dir:n.attr(i.attr("dir")),aggregates:t||[]}})},_removeIndicator:function(e){var t=this;e.remove(),t._invalidateGroupContainer(),t._change()},_change:function(){var e,n=this;if(n.dataSource){if(e=n.descriptors(),n.trigger("change",{groups:e}))return n.refresh(),t;n.dataSource.group(e)}},_dropCuePosition:function(t){var n,i,o,r,s,l=this._dropCuePositions;if(u.is(":visible")&&0!==l.length)return t=Math.ceil(t),n=l[l.length-1],i=n.left,o=n.right,r=parseInt(n.element.css("marginLeft"),10),s=parseInt(n.element.css("marginRight"),10),t>=o&&!a||i>t&&a?t={left:n.element.position().left+(a?-r:n.element.outerWidth()+s),element:n.element,before:!1}:(t=e.grep(l,function(e){return t>=e.left&&e.right>=t||a&&t>e.right})[0],t&&(t={left:a?t.element.position().left+t.element.outerWidth()+s:t.element.position().left-r,element:t.element,before:!0})),t},_drag:function(e){var t=this._dropCuePosition(e.x.location);t&&u.css({left:t.left,right:"auto"})},_canDrag:function(e){var t=e.attr(i.attr("field"));return"false"!=e.attr(i.attr("groupable"))&&t&&(e.hasClass("k-group-indicator")||!this.indicator(t))},_canDrop:function(e,t,n){var i=e.next(),o=e[0]!==t[0]&&(!i[0]||t[0]!==i[0]||!a&&n>i.position().left||a&&n
        '),t.find(c.options.filter).kendoDropTarget({group:c.options.group,dragenter:function(e){var t,i,r,a;d._draggable&&(t=this.element,r=!d._dropTargetAllowed(t)||d._isLastDraggable(),n(e.draggable.hint,r),r||(i=o(t),a=i.left,l.inSameContainer&&!l.inSameContainer({source:t,target:d._draggable,sourceIndex:d._index(t),targetIndex:d._index(d._draggable)})?d._dropTarget=t:d._index(t)>d._index(d._draggable)&&(a+=t.outerWidth()),d.reorderDropCue.css({height:t.outerHeight(),top:i.top,left:a}).appendTo(document.body)))},dragleave:function(e){n(e.draggable.hint,!0),d.reorderDropCue.remove(),d._dropTarget=null},drop:function(){var e,t;d._dropTarget=null,d._draggable&&(e=this.element,t=d._draggable,d._dropTargetAllowed(e)&&!d._isLastDraggable()&&d.trigger(a,{element:d._draggable,target:e,oldIndex:d._index(t),newIndex:d._index(e),position:o(d.reorderDropCue).left>o(e).left?"after":"before"}))}}),c.bind(["dragcancel","dragend","dragstart","drag"],{dragcancel:function(){d.reorderDropCue.remove(),d._draggable=null,d._elements=null},dragend:function(){d.reorderDropCue.remove(),d._draggable=null,d._elements=null},dragstart:function(e){d._draggable=e.currentTarget,d._elements=d.element.find(d.draggable.options.filter)},drag:function(e){var t,n;d._dropTarget&&!this.hint.find(".k-drag-status").hasClass("k-i-denied")&&(t=o(d._dropTarget).left,n=d._dropTarget.outerWidth(),d.reorderDropCue.css(e.pageX>t+n/2?{left:t+n}:{left:t}))}})},options:{name:"Reorderable",filter:"*"},events:[a],_isLastDraggable:function(){var e,t=this.options.inSameContainer,n=this._draggable[0],i=this._elements.get(),o=!1;if(!t)return!1;for(;!o&&i.length>0;)e=i.pop(),o=n!==e&&t({source:n,target:e,sourceIndex:this._index(n),targetIndex:this._index(e)});return!o},_dropTargetAllowed:function(e){var t=this.options.inSameContainer,n=this.options.dragOverContainers,i=this._draggable;return i[0]===e[0]?!1:t&&n?t({source:i,target:e,sourceIndex:this._index(i),targetIndex:this._index(e)})?!0:n(this._index(i),this._index(e)):!0},_index:function(e){return this._elements.index(e)},destroy:function(){var t=this;r.fn.destroy.call(t),t.element.find(t.draggable.options.filter).each(function(){var t=e(this);t.data("kendoDropTarget")&&t.data("kendoDropTarget").destroy()}),t.draggable&&(t.draggable.destroy(),t.draggable.element=t.draggable=null),t.elements=t.reorderDropCue=t._elements=t._draggable=null}});i.ui.plugin(l)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.resizable.min",["kendo.core.min","kendo.draganddrop.min"],e)}(function(){return function(e,t){var n=window.kendo,i=n.ui,o=i.Widget,r=e.proxy,a=n.isFunction,s=e.extend,l="horizontal",c="vertical",d="start",u="resize",h="resizeend",f=o.extend({init:function(e,t){var n=this;o.fn.init.call(n,e,t),n.orientation=n.options.orientation.toLowerCase()!=c?l:c,n._positionMouse=n.orientation==l?"x":"y",n._position=n.orientation==l?"left":"top",n._sizingDom=n.orientation==l?"outerWidth":"outerHeight",n.draggable=new i.Draggable(t.draggableElement||e,{distance:1,filter:t.handle,drag:r(n._resize,n),dragcancel:r(n._cancel,n),dragstart:r(n._start,n),dragend:r(n._stop,n)}),n.userEvents=n.draggable.userEvents},events:[u,h,d],options:{name:"Resizable",orientation:l},resize:function(){},_max:function(e){var n=this,i=n.hint?n.hint[n._sizingDom]():0,o=n.options.max;return a(o)?o(e):o!==t?n._initialElementPosition+o-i:o},_min:function(e){var n=this,i=n.options.min;return a(i)?i(e):i!==t?n._initialElementPosition+i:i},_start:function(t){var n=this,i=n.options.hint,o=e(t.currentTarget);n._initialElementPosition=o.position()[n._position],n._initialMousePosition=t[n._positionMouse].startLocation,i&&(n.hint=a(i)?e(i(o)):i,n.hint.css({position:"absolute"}).css(n._position,n._initialElementPosition).appendTo(n.element)),n.trigger(d,t),n._maxPosition=n._max(t),n._minPosition=n._min(t),e(document.body).css("cursor",o.css("cursor"))},_resize:function(e){var n,i=this,o=i._maxPosition,r=i._minPosition,a=i._initialElementPosition+(e[i._positionMouse].location-i._initialMousePosition);n=r!==t?Math.max(r,a):a,i.position=n=o!==t?Math.min(o,n):n,i.hint&&i.hint.toggleClass(i.options.invalidClass||"",n==o||n==r).css(i._position,n),i.resizing=!0,i.trigger(u,s(e,{position:n}))},_stop:function(t){var n=this;n.hint&&n.hint.remove(),n.resizing=!1,n.trigger(h,s(t,{position:n.position})),e(document.body).css("cursor","")},_cancel:function(e){var n=this;n.hint&&(n.position=t,n.hint.css(n._position,n._initialElementPosition),n._stop(e))},destroy:function(){var e=this;o.fn.destroy.call(e),e.draggable&&e.draggable.destroy()},press:function(e){if(e){var t=e.position(),n=this;n.userEvents.press(t.left,t.top,e[0]),n.targetPosition=t,n.target=e}},move:function(e){var n=this,i=n._position,o=n.targetPosition,r=n.position;r===t&&(r=o[i]),o[i]=r+e,n.userEvents.move(o.left,o.top)},end:function(){this.userEvents.end(),this.target=this.position=t}});n.ui.plugin(f)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.sortable.min",["kendo.draganddrop.min"],e)}(function(){return function(e,t){function n(t,n){try{return e.contains(t,n)||t==n}catch(i){return!1}}function i(e){return e.clone()}function o(e){return e.clone().removeAttr("id").css("visibility","hidden")}var r=window.kendo,a=r.ui.Widget,s="start",l="beforeMove",c="move",d="end",u="change",h="cancel",f="sort",p="remove",m="receive",g=">*",v=-1,_=a.extend({init:function(e,t){var n=this;a.fn.init.call(n,e,t),n.options.placeholder||(n.options.placeholder=o),n.options.hint||(n.options.hint=i),n.draggable=n._createDraggable()},events:[s,l,c,d,u,h],options:{name:"Sortable",hint:null,placeholder:null,filter:g,holdToDrag:!1,disabled:null,container:null,connectWith:null,handler:null,cursorOffset:null,axis:null,ignore:null,autoScroll:!1,cursor:"auto",moveOnDragEnter:!1},destroy:function(){this.draggable.destroy(),a.fn.destroy.call(this)},_createDraggable:function(){var t=this,n=t.element,i=t.options;return new r.ui.Draggable(n,{filter:i.filter,hint:r.isFunction(i.hint)?i.hint:e(i.hint),holdToDrag:i.holdToDrag,container:i.container?e(i.container):null,cursorOffset:i.cursorOffset,axis:i.axis,ignore:i.ignore,autoScroll:i.autoScroll,dragstart:e.proxy(t._dragstart,t),dragcancel:e.proxy(t._dragcancel,t),drag:e.proxy(t._drag,t),dragend:e.proxy(t._dragend,t)})},_dragstart:function(t){var n=this.draggedElement=t.currentTarget,i=this.options.disabled,o=this.options.handler,a=this.options.placeholder,l=this.placeholder=e(r.isFunction(a)?a.call(this,n):a);i&&n.is(i)?t.preventDefault():o&&!e(t.initialTarget).is(o)?t.preventDefault():this.trigger(s,{item:n,draggableEvent:t})?t.preventDefault():(n.css("display","none"),n.before(l),this._setCursor())},_dragcancel:function(){this._cancel(),this.trigger(h,{item:this.draggedElement}),this._resetCursor()},_drag:function(n){var i,o,r,a,s,l=this.draggedElement,c=this._findTarget(n),d={left:n.x.location,top:n.y.location},u={x:n.x.delta,y:n.y.delta},h=this.options.axis,f=this.options.moveOnDragEnter,p={item:l,list:this,draggableEvent:n};if("x"===h||"y"===h)return this._movementByAxis(h,d,u[h],p),t;if(c){if(i=this._getElementCenter(c.element),o={left:Math.round(d.left-i.left),top:Math.round(d.top-i.top)},e.extend(p,{target:c.element}),c.appendToBottom)return this._movePlaceholder(c,null,p),t;if(c.appendAfterHidden&&this._movePlaceholder(c,"next",p),this._isFloating(c.element)?0>u.x&&(f||0>o.left)?r="prev":u.x>0&&(f||o.left>0)&&(r="next"):0>u.y&&(f||0>o.top)?r="prev":u.y>0&&(f||o.top>0)&&(r="next"),r){for(s="prev"===r?jQuery.fn.prev:jQuery.fn.next,a=s.call(c.element);a.length&&!a.is(":visible");)a=s.call(a);a[0]!=this.placeholder[0]&&this._movePlaceholder(c,r,p)}}},_dragend:function(n){var i,o,r,a,s=this.placeholder,l=this.draggedElement,c=this.indexOf(l),h=this.indexOf(s),g=this.options.connectWith;return this._resetCursor(),r={action:f,item:l,oldIndex:c,newIndex:h,draggableEvent:n},h>=0?o=this.trigger(d,r):(i=s.parents(g).getKendoSortable(),r.action=p,a=e.extend({},r,{action:m,oldIndex:v,newIndex:i.indexOf(s)}),o=!(!this.trigger(d,r)&&!i.trigger(d,a))),o||h===c?(this._cancel(),t):(s.replaceWith(l),l.show(),this.draggable.dropped=!0,r={action:this.indexOf(l)!=v?f:p,item:l,oldIndex:c,newIndex:this.indexOf(l),draggableEvent:n},this.trigger(u,r),i&&(a=e.extend({},r,{action:m,oldIndex:v,newIndex:i.indexOf(l)}),i.trigger(u,a)),t)},_findTarget:function(n){var i,o,r=this._findElementUnderCursor(n),a=this.options.connectWith;return e.contains(this.element[0],r)?(i=this.items(),o=i.filter(r)[0]||i.has(r)[0],o?{element:e(o),sortable:this}:null):this.element[0]==r&&this._isEmpty()?{element:this.element,sortable:this,appendToBottom:!0}:this.element[0]==r&&this._isLastHidden()?(o=this.items().eq(0),{element:o,sortable:this,appendAfterHidden:!0}):a?this._searchConnectedTargets(r,n):t},_findElementUnderCursor:function(e){var t=r.elementUnderCursor(e),i=e.sender;return n(i.hint[0],t)&&(i.hint.hide(),t=r.elementUnderCursor(e),t||(t=r.elementUnderCursor(e)),i.hint.show()),t},_searchConnectedTargets:function(t,n){var i,o,r,a,s=e(this.options.connectWith);for(a=0;s.length>a;a++)if(i=s.eq(a).getKendoSortable(),e.contains(s[a],t)){if(i)return o=i.items(),r=o.filter(t)[0]||o.has(t)[0],r?(i.placeholder=this.placeholder,{element:e(r),sortable:i}):null}else if(s[a]==t){if(i&&i._isEmpty())return{element:s.eq(a),sortable:i,appendToBottom:!0};if(this._isCursorAfterLast(i,n))return r=i.items().last(),{element:r,sortable:i}}},_isCursorAfterLast:function(e,t){var n,i,o=e.items().last(),a={left:t.x.location,top:t.y.location};return n=r.getOffset(o),n.top+=o.outerHeight(),n.left+=o.outerWidth(),i=this._isFloating(o)?n.left-a.left:n.top-a.top,0>i},_movementByAxis:function(t,n,i,o){var r,a="x"===t?n.left:n.top,s=0>i?this.placeholder.prev():this.placeholder.next();s.length&&!s.is(":visible")&&(s=0>i?s.prev():s.next()),e.extend(o,{target:s}),r=this._getElementCenter(s),r&&(r="x"===t?r.left:r.top),s.length&&0>i&&0>a-r?this._movePlaceholder({element:s,sortable:this},"prev",o):s.length&&i>0&&a-r>0&&this._movePlaceholder({element:s,sortable:this},"next",o)},_movePlaceholder:function(e,t,n){var i=this.placeholder;e.sortable.trigger(l,n)||(t?"prev"===t?e.element.before(i):"next"===t&&e.element.after(i):e.element.append(i),e.sortable.trigger(c,n))},_setCursor:function(){var t,n=this.options.cursor;n&&"auto"!==n&&(t=e(document.body),this._originalCursorType=t.css("cursor"),t.css({cursor:n}),this._cursorStylesheet||(this._cursorStylesheet=e("")),this._cursorStylesheet.appendTo(t))},_resetCursor:function(){this._originalCursorType&&(e(document.body).css("cursor",this._originalCursorType),this._originalCursorType=null,this._cursorStylesheet.remove())},_getElementCenter:function(e){var t=e.length?r.getOffset(e):null;return t&&(t.top+=e.outerHeight()/2,t.left+=e.outerWidth()/2),t},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_cancel:function(){this.draggedElement.show(),this.placeholder.remove()},_items:function(){var e,t=this.options.filter;return e=t?this.element.find(t):this.element.children()},indexOf:function(e){var t=this._items(),n=this.placeholder,i=this.draggedElement;return n&&e[0]==n[0]?t.not(i).index(e):t.not(n).index(e)},items:function(){var e=this.placeholder,t=this._items();return e&&(t=t.not(e)),t},_isEmpty:function(){return!this.items().length},_isLastHidden:function(){return 1===this.items().length&&this.items().is(":hidden")}});r.ui.plugin(_)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.selectable.min",["kendo.core.min","kendo.userevents.min"],e)}(function(){return function(e,t){function n(e,t){if(!e.is(":visible"))return!1;var n=o.getOffset(e),i=t.left+t.width,r=t.top+t.height;return n.right=n.left+e.outerWidth(),n.bottom=n.top+e.outerHeight(),!(n.left>i||t.left>n.right||n.top>r||t.top>n.bottom)}var i,o=window.kendo,r=o.ui.Widget,a=e.proxy,s=Math.abs,l="aria-selected",c="k-state-selected",d="k-state-selecting",u="k-selectable",h="change",f=".kendoSelectable",p="k-state-unselecting",m="input,a,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-expand,span.k-icon.k-i-collapse",g=o.support.browser.msie,v=!1;!function(e){!function(){e('
        ').on("click",">*",function(){v=!0}).find("span").click().end().off()}()}(e),i=r.extend({init:function(t,n){var i,s=this;r.fn.init.call(s,t,n),s._marquee=e("
        "),s._lastActive=null,s.element.addClass(u),s.relatedTarget=s.options.relatedTarget,i=s.options.multiple,this.options.aria&&i&&s.element.attr("aria-multiselectable",!0),s.userEvents=new o.UserEvents(s.element,{global:!0,allowSelection:!0,filter:(v?"":"."+u+" ")+s.options.filter,tap:a(s._tap,s)}),i&&s.userEvents.bind("start",a(s._start,s)).bind("move",a(s._move,s)).bind("end",a(s._end,s)).bind("select",a(s._select,s))},events:[h],options:{name:"Selectable",filter:">*",multiple:!1,relatedTarget:e.noop},_isElement:function(e){var t,n=this.element,i=n.length,o=!1;for(e=e[0],t=0;i>t;t++)if(n[t]===e){o=!0;break}return o},_tap:function(t){var n,i=e(t.target),o=this,r=t.event.ctrlKey||t.event.metaKey,a=o.options.multiple,s=a&&t.event.shiftKey,l=t.event.which,d=t.event.button;!o._isElement(i.closest("."+u))||l&&3==l||d&&2==d||this._allowSelection(t.event.target)&&(n=i.hasClass(c),a&&r||o.clear(),i=i.add(o.relatedTarget(i)),s?o.selectRange(o._firstSelectee(),i):(n&&r?(o._unselect(i),o._notify(h)):o.value(i),o._lastActive=o._downTarget=i))},_start:function(n){var i,o=this,r=e(n.target),a=r.hasClass(c),s=n.event.ctrlKey||n.event.metaKey;if(this._allowSelection(n.event.target)){if(o._downTarget=r,!o._isElement(r.closest("."+u)))return o.userEvents.cancel(),t;o.options.useAllItems?o._items=o.element.find(o.options.filter):(i=r.closest(o.element),o._items=i.find(o.options.filter)),n.sender.capture(),o._marquee.appendTo(document.body).css({left:n.x.client+1,top:n.y.client+1,width:0,height:0}),s||o.clear(),r=r.add(o.relatedTarget(r)),a&&(o._selectElement(r,!0),s&&r.addClass(p))}},_move:function(e){var t=this,n={left:e.x.startLocation>e.x.location?e.x.location:e.x.startLocation,top:e.y.startLocation>e.y.location?e.y.location:e.y.startLocation,width:s(e.x.initialDelta),height:s(e.y.initialDelta)};t._marquee.css(n),t._invalidateSelectables(n,e.event.ctrlKey||e.event.metaKey),e.preventDefault()},_end:function(){var e,t=this;t._marquee.remove(),t._unselect(t.element.find(t.options.filter+"."+p)).removeClass(p),e=t.element.find(t.options.filter+"."+d),e=e.add(t.relatedTarget(e)),t.value(e),t._lastActive=t._downTarget,t._items=null},_invalidateSelectables:function(e,t){var i,o,r,a,s=this._downTarget[0],l=this._items;for(i=0,o=l.length;o>i;i++)a=l.eq(i),r=a.add(this.relatedTarget(a)),n(a,e)?a.hasClass(c)?t&&s!==a[0]&&r.removeClass(c).addClass(p):a.hasClass(d)||a.hasClass(p)||r.addClass(d):a.hasClass(d)?r.removeClass(d):t&&a.hasClass(p)&&r.removeClass(p).addClass(c)},value:function(e){var n=this,i=a(n._selectElement,n);return e?(e.each(function(){i(this)}),n._notify(h),t):n.element.find(n.options.filter+"."+c)},_firstSelectee:function(){var e,t=this;return null!==t._lastActive?t._lastActive:(e=t.value(),e.length>0?e[0]:t.element.find(t.options.filter)[0])},_selectElement:function(t,n){var i=e(t),o=!n&&this._notify("select",{element:t});i.removeClass(d),o||(i.addClass(c),this.options.aria&&i.attr(l,!0))},_notify:function(e,t){return t=t||{},this.trigger(e,t)},_unselect:function(e){return e.removeClass(c),this.options.aria&&e.attr(l,!1),e},_select:function(t){this._allowSelection(t.event.target)&&(!g||g&&!e(o._activeElement()).is(m))&&t.preventDefault()},_allowSelection:function(t){return e(t).is(m)?(this.userEvents.cancel(),this._downTarget=null,!1):!0},resetTouchEvents:function(){this.userEvents.cancel()},clear:function(){var e=this.element.find(this.options.filter+"."+c);this._unselect(e)},selectRange:function(t,n){var i,o,r,a=this;for(a.clear(),a.element.length>1&&(r=a.options.continuousItems()),r&&r.length||(r=a.element.find(a.options.filter)),t=e.inArray(e(t)[0],r),n=e.inArray(e(n)[0],r),t>n&&(o=t,t=n,n=o),a.options.useAllItems||(n+=a.element.length-1),i=t;n>=i;i++)a._selectElement(r[i]);a._notify(h)},destroy:function(){var e=this;r.fn.destroy.call(e),e.element.off(f),e.userEvents.destroy(),e._marquee=e._lastActive=e.element=e.userEvents=null}}),i.parseOptions=function(e){var t="string"==typeof e&&e.toLowerCase();return{multiple:t&&t.indexOf("multiple")>-1,cell:t&&t.indexOf("cell")>-1}},o.ui.plugin(i)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.button.min",["kendo.core.min"],e)}(function(){return function(e,t){var n=window.kendo,i=n.ui.Widget,o=e.proxy,r=n.keys,a="click",s="k-button",l="k-button-icon",c="k-button-icontext",d=".kendoButton",u="disabled",h="k-state-disabled",f="k-state-focused",p="k-state-selected",m=i.extend({init:function(e,t){var r=this;i.fn.init.call(r,e,t),e=r.wrapper=r.element,t=r.options,e.addClass(s).attr("role","button"),t.enable=t.enable&&!e.attr(u),r.enable(t.enable),r._tabindex(),r._graphics(),e.on(a+d,o(r._click,r)).on("focus"+d,o(r._focus,r)).on("blur"+d,o(r._blur,r)).on("keydown"+d,o(r._keydown,r)).on("keyup"+d,o(r._keyup,r)),n.notify(r)},destroy:function(){var e=this;e.wrapper.off(d),i.fn.destroy.call(e)},events:[a],options:{name:"Button",icon:"",spriteCssClass:"",imageUrl:"",enable:!0},_isNativeButton:function(){return"button"==this.element.prop("tagName").toLowerCase()},_click:function(e){this.options.enable&&this.trigger(a,{event:e})&&e.preventDefault()},_focus:function(){this.options.enable&&this.element.addClass(f)},_blur:function(){this.element.removeClass(f)},_keydown:function(e){var t=this;t._isNativeButton()||e.keyCode!=r.ENTER&&e.keyCode!=r.SPACEBAR||(e.keyCode==r.SPACEBAR&&(e.preventDefault(),t.options.enable&&t.element.addClass(p)),t._click(e))},_keyup:function(){this.element.removeClass(p)},_graphics:function(){var t,n,i,o=this,r=o.element,a=o.options,s=a.icon,d=a.spriteCssClass,u=a.imageUrl;(d||u||s)&&(i=!0,r.contents().not("span.k-sprite").not("span.k-icon").not("img.k-image").each(function(t,n){(1==n.nodeType||3==n.nodeType&&e.trim(n.nodeValue).length>0)&&(i=!1)}),r.addClass(i?l:c)),s?(t=r.children("span.k-icon").first(),t[0]||(t=e('').prependTo(r)),t.addClass("k-i-"+s)):d?(t=r.children("span.k-sprite").first(),t[0]||(t=e('').prependTo(r)),t.addClass(d)):u&&(n=r.children("img.k-image").first(),n[0]||(n=e('icon').prependTo(r)),n.attr("src",u))},enable:function(e){var n=this,i=n.element;e===t&&(e=!0),e=!!e,n.options.enable=e,i.toggleClass(h,!e).attr("aria-disabled",!e).attr(u,!e);try{i.blur()}catch(o){}}});n.ui.plugin(m)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.pager.min",["kendo.data.min"],e)}(function(){return function(e,t){function n(e,t,n,i,o){return e({idx:t,text:n,ns:c.ns,numeric:i,title:o||""})}function i(e,t,n){return k({className:e.substring(1),text:t,wrapClassName:n||""})}function o(e,t,n,i){e.find(t).parent().attr(c.attr("page"),n).attr("tabindex",-1).toggleClass("k-state-disabled",i)}function r(e,t){o(e,f,1,1>=t)}function a(e,t){o(e,m,Math.max(1,t-1),1>=t)}function s(e,t,n){o(e,g,Math.min(n,t+1),t>=n)}function l(e,t,n){o(e,p,n,t>=n)}var c=window.kendo,d=c.ui,u=d.Widget,h=e.proxy,f=".k-i-seek-w",p=".k-i-seek-e",m=".k-i-arrow-w",g=".k-i-arrow-e",v="change",_=".kendoPager",b="click",w="keydown",y="disabled",k=c.template(''),x=u.extend({init:function(t,n){var o,d,y,k,x=this;u.fn.init.call(x,t,n),n=x.options,x.dataSource=c.data.DataSource.create(n.dataSource),x.linkTemplate=c.template(x.options.linkTemplate),x.selectTemplate=c.template(x.options.selectTemplate),x.currentPageTemplate=c.template(x.options.currentPageTemplate),o=x.page(),d=x.totalPages(),x._refreshHandler=h(x.refresh,x),x.dataSource.bind(v,x._refreshHandler),n.previousNext&&(x.element.find(f).length||(x.element.append(i(f,n.messages.first,"k-pager-first")),r(x.element,o,d)),x.element.find(m).length||(x.element.append(i(m,n.messages.previous)),a(x.element,o,d))),n.numeric&&(x.list=x.element.find(".k-pager-numbers"),x.list.length||(x.list=e('
          ').appendTo(x.element))),n.input&&(x.element.find(".k-pager-input").length||x.element.append(''+n.messages.page+''+c.format(n.messages.of,d)+""),x.element.on(w+_,".k-pager-input input",h(x._keydown,x))),n.previousNext&&(x.element.find(g).length||(x.element.append(i(g,n.messages.next)),s(x.element,o,d)),x.element.find(p).length||(x.element.append(i(p,n.messages.last,"k-pager-last")),l(x.element,o,d))),n.pageSizes&&(x.element.find(".k-pager-sizes").length||(y=n.pageSizes.length?n.pageSizes:["all",5,10,20],k=e.map(y,function(e){return e.toLowerCase&&"all"===e.toLowerCase()?"":""}),e(''+c.format(v.messages.of,w)).find("input").val(m).attr(y,1>b).toggleClass("k-state-disabled",1>b),v.previousNext&&(r(f.element,m,w),a(f.element,m,w),s(f.element,m,w),l(f.element,m,w)),v.pageSizes&&(d=f.element.find(".k-pager-sizes option[value='all']").length>0,u=d&&_===this.dataSource.total(),h=_,u&&(_="all",h=v.messages.allPages),f.element.find(".k-pager-sizes select").val(_).filter("["+c.attr("role")+"=dropdownlist]").kendoDropDownList("value",_).kendoDropDownList("text",h))}},_keydown:function(e){if(e.keyCode===c.keys.ENTER){var t=this.element.find(".k-pager-input").find("input"),n=parseInt(t.val(),10);(isNaN(n)||1>n||n>this.totalPages())&&(n=this.page()),t.val(n),this.page(n)}},_refreshClick:function(e){e.preventDefault(),this.dataSource.read()},_change:function(e){var t=e.currentTarget.value,n=parseInt(t,10),i=this.dataSource;isNaN(n)?"all"==(t+"").toLowerCase()&&i.pageSize(i.total()):i.pageSize(n)},_toggleActive:function(){this.list.toggleClass("k-state-expanded")},_click:function(t){var n=e(t.currentTarget);t.preventDefault(),n.is(".k-state-disabled")||this.page(n.attr(c.attr("page")))},totalPages:function(){return Math.ceil((this.dataSource.total()||0)/(this.pageSize()||1))},pageSize:function(){return this.dataSource.pageSize()||this.dataSource.total()},page:function(e){return e===t?this.dataSource.total()>0?this.dataSource.page():0:(this.trigger("pageChange",{index:e})||(this.dataSource.page(e),this.trigger(v,{index:e})),t)}});d.plugin(x)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.notification.min",["kendo.core.min","kendo.popup.min"],e)}(function(){return function(e,t){var n=window.kendo,i=n.ui.Widget,o=e.proxy,r=e.extend,a=window.setTimeout,s="click",l="show",c="hide",d="k-notification",u=".k-notification-wrap .k-i-close",h="k-hiding",f="info",p="success",m="warning",g="error",v="top",_="left",b="bottom",w="right",y="up",k=".kendoNotification",x='
          ',C='
          #=typeIcon##=content#Hide
          ',S=C.replace("#=content#","#:content#"),T=i.extend({init:function(t,o){var r=this;i.fn.init.call(r,t,o),o=r.options,o.appendTo&&e(o.appendTo).is(t)||r.element.hide(),r._compileTemplates(o.templates),r._guid="_"+n.guid(),r._isRtl=n.support.isRtl(t),r._compileStacking(o.stacking,o.position.top,o.position.left),n.notify(r)},events:[l,c],options:{name:"Notification",position:{pinned:!0,top:null,left:null,bottom:20,right:20},stacking:"default",hideOnClick:!0,button:!1,allowHideAfter:0,autoHideAfter:5e3,appendTo:null,width:null,height:null,templates:[],animation:{open:{effects:"fade:in",duration:300},close:{effects:"fade:out",duration:600,hide:!0}}},_compileTemplates:function(t){var i=this,o=n.template;i._compiled={},e.each(t,function(t,n){i._compiled[n.type]=o(n.template||e("#"+n.templateId).html())}),i._defaultCompiled=o(C),i._safeCompiled=o(S)},_getCompiled:function(e,t){var n=t?this._safeCompiled:this._defaultCompiled;return e?this._compiled[e]||n:n},_compileStacking:function(e,t,n){var i,o,r=this,a={paddingTop:0,paddingRight:0,paddingBottom:0,paddingLeft:0},s=null!==n?_:w;switch(e){case"down":i=b+" "+s,o=v+" "+s,delete a.paddingBottom;break;case w:i=v+" "+w,o=v+" "+_,delete a.paddingRight;break;case _:i=v+" "+_,o=v+" "+w,delete a.paddingLeft;break;case y:i=v+" "+s,o=b+" "+s,delete a.paddingTop;break;default:null!==t?(i=b+" "+s,o=v+" "+s,delete a.paddingBottom):(i=v+" "+s,o=b+" "+s,delete a.paddingTop)}r._popupOrigin=i,r._popupPosition=o,r._popupPaddings=a},_attachPopupEvents:function(e,t){function i(e){e.on(s+k,function(){r._hidePopup(t)})}var o,r=this,l=e.allowHideAfter,c=!isNaN(l)&&l>0;t.options.anchor!==document.body&&t.options.origin.indexOf(w)>0&&t.bind("open",function(){var e=n.getShadows(t.element);a(function(){t.wrapper.css("left",parseFloat(t.wrapper.css("left"))+e.left+e.right)})}),e.hideOnClick?t.bind("activate",function(){c?a(function(){i(t.element)},l):i(t.element)}):e.button&&(o=t.element.find(u),c?a(function(){i(o)},l):i(o))},_showPopup:function(t,i){var o,s,l=this,c=i.autoHideAfter,d=i.position.left,f=i.position.top;s=e("."+l._guid+":not(."+h+")").last(),o=new n.ui.Popup(t,{anchor:s[0]?s:document.body,origin:l._popupOrigin,position:l._popupPosition,animation:i.animation,modal:!0,collision:"",isRtl:l._isRtl,close:function(){l._triggerHide(this.element)},deactivate:function(e){e.sender.element.off(k), +e.sender.element.find(u).off(k),e.sender.destroy()}}),l._attachPopupEvents(i,o),s[0]?o.open():(null===d&&(d=e(window).width()-t.width()-i.position.right),null===f&&(f=e(window).height()-t.height()-i.position.bottom),o.open(d,f)),o.wrapper.addClass(l._guid).css(r({margin:0},l._popupPaddings)),i.position.pinned?(o.wrapper.css("position","fixed"),s[0]&&l._togglePin(o.wrapper,!0)):s[0]||l._togglePin(o.wrapper,!1),c>0&&a(function(){l._hidePopup(o)},c)},_hidePopup:function(e){e.wrapper.addClass(h),e.close()},_togglePin:function(t,n){var i=e(window),o=n?-1:1;t.css({top:parseInt(t.css(v),10)+o*i.scrollTop(),left:parseInt(t.css(_),10)+o*i.scrollLeft()})},_attachStaticEvents:function(e,t){function n(e){e.on(s+k,o(i._hideStatic,i,t))}var i=this,r=e.allowHideAfter,l=!isNaN(r)&&r>0;e.hideOnClick?l?a(function(){n(t)},r):n(t):e.button&&(l?a(function(){n(t.find(u))},r):n(t.find(u)))},_showStatic:function(e,t){var n=this,i=t.autoHideAfter,o=t.animation,r=t.stacking==y||t.stacking==_?"prependTo":"appendTo";e.addClass(n._guid)[r](t.appendTo).hide().kendoAnimate(o.open||!1),n._attachStaticEvents(t,e),i>0&&a(function(){n._hideStatic(e)},i)},_hideStatic:function(e){e.kendoAnimate(r(this.options.animation.close||!1,{complete:function(){e.off(k).find(u).off(k),e.remove()}})),this._triggerHide(e)},_triggerHide:function(e){this.trigger(c,{element:e}),this.angular("cleanup",function(){return{elements:e}})},show:function(i,o,a){var s,c,u=this,h=u.options,p=e(x);return o||(o=f),null!==i&&i!==t&&""!==i&&(n.isFunction(i)&&(i=i()),c={typeIcon:o,content:""},s=e.isPlainObject(i)?r(c,i):r(c,{content:i}),p.addClass(d+"-"+o).toggleClass(d+"-button",h.button).attr("data-role","alert").css({width:h.width,height:h.height}).append(u._getCompiled(o,a)(s)),u.angular("compile",function(){return{elements:p,data:[{dataItem:s}]}}),e(h.appendTo)[0]?u._showStatic(p,h):u._showPopup(p,h),u.trigger(l,{element:p})),u},showText:function(e,t){this.show(e,t,!0)},info:function(e){return this.show(e,f)},success:function(e){return this.show(e,p)},warning:function(e){return this.show(e,m)},error:function(e){return this.show(e,g)},hide:function(){var t=this,n=t.getNotifications();return n.each(t.options.appendTo?function(n,i){t._hideStatic(e(i))}:function(n,i){var o=e(i).data("kendoPopup");o&&t._hidePopup(o)}),t},getNotifications:function(){var t=this,n=e("."+t._guid+":not(."+h+")");return t.options.appendTo?n:n.children("."+d)},setOptions:function(e){var n,o=this;i.fn.setOptions.call(o,e),n=o.options,e.templates!==t&&o._compileTemplates(n.templates),e.stacking===t&&e.position===t||o._compileStacking(n.stacking,n.position.top,n.position.left)},destroy:function(){i.fn.destroy.call(this),this.getNotifications().off(k).find(u).off(k)}});n.ui.plugin(T)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.tooltip.min",["kendo.core.min","kendo.popup.min"],e)}(function(){return function(e,t){function n(e){for(;e.length;)i(e),e=e.parent()}function i(e){var t=e.data(a.ns+"title");t&&(e.attr("title",t),e.removeData(a.ns+"title"))}function o(e){var t=e.attr("title");t&&(e.data(a.ns+"title",t),e.attr("title",""))}function r(e){for(;e.length&&!e.is("body");)o(e),e=e.parent()}var a=window.kendo,s=a.ui.Widget,l=a.ui.Popup,c=a.isFunction,d=e.isPlainObject,u=e.extend,h=e.proxy,f=e(document),p=a.isLocalUrl,m="_tt_active",g="aria-describedby",v="show",_="hide",b="error",w="contentLoad",y="requestStart",k="k-content-frame",x='
          #if (!autoHide) {#
          close
          #}#
          #if (callout){ #
          #}#
          ',C=a.template(""),S=".kendoTooltip",T={bottom:{origin:"bottom center",position:"top center"},top:{origin:"top center",position:"bottom center"},left:{origin:"center left",position:"center right",collision:"fit flip"},right:{origin:"center right",position:"center left",collision:"fit flip"},center:{position:"center center",origin:"center center"}},D={top:"bottom",bottom:"top",left:"right",right:"left",center:"center"},A={bottom:"n",top:"s",left:"e",right:"w",center:"n"},E={horizontal:{offset:"top",size:"outerHeight"},vertical:{offset:"left",size:"outerWidth"}},I=function(e){return e.target.data(a.ns+"title")},R=s.extend({init:function(e,t){var n,i=this;s.fn.init.call(i,e,t),n=i.options.position.match(/left|right/)?"horizontal":"vertical",i.dimensions=E[n],i._documentKeyDownHandler=h(i._documentKeyDown,i),i.element.on(i.options.showOn+S,i.options.filter,h(i._showOn,i)).on("mouseenter"+S,i.options.filter,h(i._mouseenter,i)),this.options.autoHide&&i.element.on("mouseleave"+S,i.options.filter,h(i._mouseleave,i))},options:{name:"Tooltip",filter:"",content:I,showAfter:100,callout:!0,position:"bottom",showOn:"mouseenter",autoHide:!0,width:null,height:null,animation:{open:{effects:"fade:in",duration:0},close:{effects:"fade:out",duration:40,hide:!0}}},events:[v,_,w,b,y],_mouseenter:function(t){r(e(t.currentTarget))},_showOn:function(t){var n=this,i=e(t.currentTarget);n.options.showOn&&n.options.showOn.match(/click|focus/)?n._show(i):(clearTimeout(n.timeout),n.timeout=setTimeout(function(){n._show(i)},n.options.showAfter))},_appendContent:function(e){var t,n=this,i=n.options.content,o=n.content,r=n.options.iframe;d(i)&&i.url?("iframe"in n.options||(r=!p(i.url)),n.trigger(y,{options:i,target:e}),r?(o.hide(),t=o.find("."+k)[0],t?t.src=i.url||t.src:o.html(C({content:i})),o.find("."+k).off("load"+S).on("load"+S,function(){n.trigger(w),o.show()})):(o.empty(),a.ui.progress(o,!0),n._ajaxRequest(i))):i&&c(i)?(i=i({sender:this,target:e}),o.html(i||"")):o.html(i),n.angular("compile",function(){return{elements:o}})},_ajaxRequest:function(e){var t=this;jQuery.ajax(u({type:"GET",dataType:"html",cache:!1,error:function(e,n){a.ui.progress(t.content,!1),t.trigger(b,{status:n,xhr:e})},success:h(function(e){a.ui.progress(t.content,!1),t.content.html(e),t.trigger(w)},t)},e))},_documentKeyDown:function(e){e.keyCode===a.keys.ESC&&this.hide()},refresh:function(){var e=this,t=e.popup;t&&t.options.anchor&&e._appendContent(t.options.anchor)},hide:function(){this.popup&&this.popup.close()},show:function(e){e=e||this.element,r(e),this._show(e)},_show:function(e){var t=this,i=t.target();t.popup||t._initPopup(),i&&i[0]!=e[0]&&(t.popup.close(),t.popup.element.kendoStop(!0,!0)),i&&i[0]==e[0]||(t._appendContent(e),t.popup.options.anchor=e),t.popup.one("deactivate",function(){n(e),e.removeAttr(g),this.element.removeAttr("id").attr("aria-hidden",!0),f.off("keydown"+S,t._documentKeyDownHandler)}),t.popup.open()},_initPopup:function(){var t=this,n=t.options,i=e(a.template(x)({callout:n.callout&&"center"!==n.position,dir:A[n.position],autoHide:n.autoHide}));t.popup=new l(i,u({activate:function(){var e=this.options.anchor,i=e[0].id||t.element[0].id;i&&(e.attr(g,i+m),this.element.attr("id",i+m)),n.callout&&t._positionCallout(),this.element.removeAttr("aria-hidden"),f.on("keydown"+S,t._documentKeyDownHandler),t.trigger(v)},close:function(){t.trigger(_)},copyAnchorStyles:!1,animation:n.animation},T[n.position])),i.css({width:n.width,height:n.height}),t.content=i.find(".k-tooltip-content"),t.arrow=i.find(".k-callout"),n.autoHide?i.on("mouseleave"+S,h(t._mouseleave,t)):i.on("click"+S,".k-tooltip-button",h(t._closeButtonClick,t))},_closeButtonClick:function(e){e.preventDefault(),this.hide()},_mouseleave:function(t){if(this.popup){var i=e(t.currentTarget),o=i.offset(),r=t.pageX,a=t.pageY;if(o.right=o.left+i.outerWidth(),o.bottom=o.top+i.outerHeight(),r>o.left&&o.right>r&&a>o.top&&o.bottom>a)return;this.popup.close()}else n(e(t.currentTarget));clearTimeout(this.timeout)},_positionCallout:function(){var t=this,n=t.options.position,i=t.dimensions,o=i.offset,r=t.popup,a=r.options.anchor,s=e(a).offset(),l=parseInt(t.arrow.css("border-top-width"),10),c=e(r.element).offset(),d=A[r.flipped?D[n]:n],u=s[o]-c[o]+e(a)[i.size]()/2-l;t.arrow.removeClass("k-callout-n k-callout-s k-callout-w k-callout-e").addClass("k-callout-"+d).css(o,u)},target:function(){return this.popup?this.popup.options.anchor:null},destroy:function(){var e=this.popup;e&&(e.element.off(S),e.destroy()),clearTimeout(this.timeout),this.element.off(S),f.off("keydown"+S,this._documentKeyDownHandler),s.fn.destroy.call(this)}});a.ui.plugin(R)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.list.min",["kendo.data.min","kendo.popup.min"],e)}(function(){return function(e,t){function n(e,n){return e!==t&&""!==e&&null!==e&&("boolean"===n?e=!!e:"number"===n?e=+e:"string"===n&&(e=""+e)),e}function i(e){var t=e.selectedIndex;return t>-1?e.options[t]:{}}function o(e,t){var n,i,o,r,a=t.length,s=e.length,l=[],c=[];if(s)for(o=0;s>o;o++){for(n=e[o],i=!1,r=0;a>r;r++)if(n===t[r]){i=!0,l.push({index:o,item:n});break}i||c.push(n)}return{changed:l,unchanged:c}}function r(t,n){var i,o=!1;return t.filters&&(i=e.grep(t.filters,function(e){return o=r(e,n),e.filters?e.filters.length:e.field!=n}),o||t.filters.length===i.length||(o=!0),t.filters=i),o}var a,s,l=window.kendo,c=l.ui,d=c.Widget,u=l.keys,h=l.support,f=l.htmlEncode,p=l._activeElement,m=l.data.ObservableArray,g="id",v="change",_="k-state-focused",b="k-state-hover",w="k-i-loading",y="k-loading-hidden",k="open",x="close",C="cascade",S="select",T="selected",D="requestStart",A="requestEnd",E="width",I=e.extend,R=e.proxy,M=e.isArray,F=h.browser,z=F.msie&&9>F.version,P=/"/g,B={ComboBox:"DropDownList",DropDownList:"ComboBox"},L=l.ui.DataBoundWidget.extend({init:function(t,n){var i,o=this,r=o.ns;d.fn.init.call(o,t,n),t=o.element,n=o.options,o._isSelect=t.is(S),o._isSelect&&o.element[0].length&&(n.dataSource||(n.dataTextField=n.dataTextField||"text",n.dataValueField=n.dataValueField||"value")),o.ul=e('
            ').attr({tabIndex:-1,"aria-hidden":!0}),o.list=e("
            ").append(o.ul).on("mousedown"+r,R(o._listMousedown,o)),i=t.attr(g),i&&(o.list.attr(g,i+"-list"),o.ul.attr(g,i+"_listbox")),o._header(),o._noData(),o._footer(),o._accessors(),o._initValue()},options:{valuePrimitive:!1,footerTemplate:"",headerTemplate:"",noDataTemplate:"No data found."},setOptions:function(e){d.fn.setOptions.call(this,e),e&&e.enable!==t&&(e.enabled=e.enable),this._header(),this._noData(),this._footer(),this._renderFooter(),this._renderNoData()},focus:function(){this._focused.focus()},readonly:function(e){this._editable({readonly:e===t?!0:e,disable:!1})},enable:function(e){this._editable({readonly:!1,disable:!(e=e===t?!0:e)})},_listOptions:function(t){var n=this,i=n.options,o=i.virtual,r=R(n._listBound,n);return o="object"==typeof o?o:{},t=e.extend({autoBind:!1,selectable:!0,dataSource:n.dataSource,click:R(n._click,n),change:R(n._listChange,n),activate:R(n._activateItem,n),deactivate:R(n._deactivateItem,n),dataBinding:function(){n.trigger("dataBinding")},dataBound:r,height:i.height,dataValueField:i.dataValueField,dataTextField:i.dataTextField,groupTemplate:i.groupTemplate,fixedGroupTemplate:i.fixedGroupTemplate,template:i.template},t,o),t.template||(t.template="#:"+l.expr(t.dataTextField,"data")+"#"),i.$angular&&(t.$angular=i.$angular),t},_initList:function(){var e=this,t=e._listOptions({selectedItemChange:R(e._listChange,e)});e.listView=e.options.virtual?new l.ui.VirtualList(e.ul,t):new l.ui.StaticList(e.ul,t),e.listView.bind("listBound",R(e._listBound,e)),e._setListValue()},_setListValue:function(e){e=e||this.options.value,e!==t&&this.listView.value(e).done(R(this._updateSelectionState,this))},_updateSelectionState:e.noop,_listMousedown:function(e){this.filterInput&&this.filterInput[0]===e.target||e.preventDefault()},_isFilterEnabled:function(){var e=this.options.filter;return e&&"none"!==e},_hideClear:function(){var e=this;e._clear&&this._clear.addClass(y)},_showClear:function(){var e=this;e._clear&&this._clear.removeClass(y)},_clearValue:function(){this.listView.value([]),this._clearText(),this._accessor(""),this._isFilterEnabled()&&this._filter({word:"",open:!1}),this._change()},_clearText:function(){this.text("")},_clearFilter:function(){this.options.virtual||this.listView.bound(!1),this._filterSource()},_filterSource:function(e,t){var n=this,i=n.options,o=n.dataSource,a=I({},o.filter()||{}),s=r(a,i.dataTextField);(e||s)&&n.trigger("filtering",{filter:e})||(a={filters:a.filters||[],logic:"and"},e&&a.filters.push(e),n._cascading&&this.listView.setDSFilter(a),t?o.read(o._mergeState({filter:a})):o.filter(a))},_angularElement:function(e,t){e&&this.angular(t,function(){return{elements:e}})},_noData:function(){var n=e(this.noData),i=this.options.noDataTemplate;return this.angular("cleanup",function(){return{elements:n}}),l.destroy(n),n.remove(),i?(this.noData=e('
            ').appendTo(this.list),this.noDataTemplate="function"!=typeof i?l.template(i):i,t):(this.noData=null,t)},_renderNoData:function(){var e=this.noData;e&&(this._angularElement(e,"cleanup"),e.children(":first").html(this.noDataTemplate({instance:this})),this._angularElement(e,"compile"))},_toggleNoData:function(t){e(this.noData).toggle(t)},_footer:function(){var n=e(this.footer),i=this.options.footerTemplate;return this._angularElement(n,"cleanup"),l.destroy(n),n.remove(),i?(this.footer=e('
            ').appendTo(this.list),this.footerTemplate="function"!=typeof i?l.template(i):i,t):(this.footer=null,t)},_renderFooter:function(){var e=this.footer;e&&(this._angularElement(e,"cleanup"),e.html(this.footerTemplate({instance:this})),this._angularElement(e,"compile"))},_header:function(){var n,i=e(this.header),o=this.options.headerTemplate;return this._angularElement(i,"cleanup"),l.destroy(i),i.remove(),o?(n="function"!=typeof o?l.template(o):o,i=e(n({})),this.header=i[0]?i:null,this.list.prepend(i),this._angularElement(this.header,"compile"),t):(this.header=null,t)},_allowOpening:function(){return this.options.noDataTemplate||this.dataSource.flatView().length},_initValue:function(){var e=this,t=e.options.value;null!==t?e.element.val(t):(t=e._accessor(),e.options.value=t),e._old=t},_ignoreCase:function(){var e,t=this,n=t.dataSource.reader.model;n&&n.fields&&(e=n.fields[t.options.dataTextField],e&&e.type&&"string"!==e.type&&(t.options.ignoreCase=!1))},_focus:function(e){return this.listView.focus(e)},_filter:function(e){var t=this,n=t.options,i=n.ignoreCase,o=n.dataTextField,r={value:i?e.word.toLowerCase():e.word,field:o,operator:n.filter,ignoreCase:i};t._open=e.open,t._filterSource(r)},search:function(e){var t=this.options;e="string"==typeof e?e:this._inputValue(),clearTimeout(this._typingTimeout),(!t.enforceMinLength&&!e.length||e.length>=t.minLength)&&(this._state="filter",this._isFilterEnabled()?this._filter({word:e,open:!0}):this._searchByWord(e))},current:function(e){return this._focus(e)},items:function(){return this.ul[0].children},destroy:function(){var e=this,t=e.ns;d.fn.destroy.call(e),e._unbindDataSource(),e.listView.destroy(),e.list.off(t),e.popup.destroy(),e._form&&e._form.off("reset",e._resetHandler)},dataItem:function(n){var i=this;if(n===t)return i.listView.selectedDataItems()[0];if("number"!=typeof n){if(i.options.virtual)return i.dataSource.getByUid(e(n).data("uid"));n=e(i.items()).index(n)}return i.dataSource.flatView()[n]},_activateItem:function(){var e=this.listView.focus();e&&this._focused.add(this.filterInput).attr("aria-activedescendant",e.attr("id"))},_deactivateItem:function(){this._focused.add(this.filterInput).removeAttr("aria-activedescendant")},_accessors:function(){var e=this,t=e.element,n=e.options,i=l.getter,o=t.attr(l.attr("text-field")),r=t.attr(l.attr("value-field"));!n.dataTextField&&o&&(n.dataTextField=o),!n.dataValueField&&r&&(n.dataValueField=r),e._text=i(n.dataTextField),e._value=i(n.dataValueField)},_aria:function(e){var n=this,i=n.options,o=n._focused.add(n.filterInput);i.suggest!==t&&o.attr("aria-autocomplete",i.suggest?"both":"list"),e=e?e+" "+n.ul[0].id:n.ul[0].id,o.attr("aria-owns",e),n.ul.attr("aria-live",n._isFilterEnabled()?"polite":"off")},_blur:function(){var e=this;e._change(),e.close()},_change:function(){var e,i=this,o=i.selectedIndex,r=i.options.value,a=i.value();i._isSelect&&!i.listView.bound()&&r&&(a=r),a!==n(i._old,typeof a)?e=!0:o!==t&&o!==i._oldIndex&&(e=!0),e&&(i._old=a,i._oldIndex=o,i._typing||i.element.trigger(v),i.trigger(v)),i.typing=!1},_data:function(){return this.dataSource.view()},_enable:function(){var e=this,n=e.options,i=e.element.is("[disabled]");n.enable!==t&&(n.enabled=n.enable),!n.enabled||i?e.enable(!1):e.readonly(e.element.is("[readonly]"))},_dataValue:function(e){var n=this._value(e);return n===t&&(n=this._text(e)),n},_offsetHeight:function(){var t=0,n=this.listView.content.prevAll(":visible");return n.each(function(){var n=e(this);t+=n.hasClass("k-list-filter")?n.children().outerHeight():n.outerHeight()}),t},_height:function(n){var i,o,r,a=this,s=a.list,l=a.options.height,c=a.popup.visible();if(n||a.options.noDataTemplate){if(o=s.add(s.parent(".k-animation-container")).show(),!s.is(":visible"))return o.hide(),t;l=a.listView.content[0].scrollHeight>l?l:"auto",o.height(l),"auto"!==l&&(i=a._offsetHeight(),r=e(a.footer).outerHeight()||0,l=l-i-r),a.listView.content.height(l),c||o.hide()}return l},_adjustListWidth:function(){var e,t,n=this.list,i=n[0].style.width,o=this.wrapper;if(n.data(E)||!i)return e=window.getComputedStyle?window.getComputedStyle(o[0],null):0,t=parseFloat(e&&e.width)||o.outerWidth(),e&&F.msie&&(t+=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight)+parseFloat(e.borderLeftWidth)+parseFloat(e.borderRightWidth)),i="border-box"!==n.css("box-sizing")?t-(n.outerWidth()-n.width()):t,n.css({fontFamily:o.css("font-family"),width:this.options.autoWidth?"auto":i,minWidth:i}).data(E,i),!0},_openHandler:function(e){this._adjustListWidth(),this.trigger(k)?e.preventDefault():(this._focused.attr("aria-expanded",!0),this.ul.attr("aria-hidden",!1))},_closeHandler:function(e){this.trigger(x)?e.preventDefault():(this._focused.attr("aria-expanded",!1),this.ul.attr("aria-hidden",!0))},_focusItem:function(){var e=this.listView,n=e.focus(),i=e.select();i=i[i.length-1],i===t&&this.options.highlightFirst&&!n&&(i=0),i!==t?e.focus(i):e.scrollToIndex(0)},_calculateGroupPadding:function(e){var t=this.ul.children(".k-first:first"),n=this.listView.content.prev(".k-group-header"),i=0;n[0]&&"none"!==n[0].style.display&&("auto"!==e&&(i=l.support.scrollbar()),i+=parseFloat(t.css("border-right-width"),10)+parseFloat(t.children(".k-group").css("padding-right"),10),n.css("padding-right",i))},_calculatePopupHeight:function(e){var t=this._height(this.dataSource.flatView().length||e);this._calculateGroupPadding(t)},_resizePopup:function(e){this.options.virtual||(this.popup.element.is(":visible")?this._calculatePopupHeight(e):this.popup.one("open",function(e){return R(function(){this._calculatePopupHeight(e)},this)}.call(this,e)))},_popup:function(){var e=this;e.popup=new c.Popup(e.list,I({},e.options.popup,{anchor:e.wrapper,open:R(e._openHandler,e),close:R(e._closeHandler,e),animation:e.options.animation,isRtl:h.isRtl(e.wrapper)}))},_makeUnselectable:function(){z&&this.list.find("*").not(".k-textbox").attr("unselectable","on")},_toggleHover:function(t){e(t.currentTarget).toggleClass(b,"mouseenter"===t.type)},_toggle:function(e,n){var i=this,o=h.mobileOS&&(h.touch||h.MSPointers||h.pointers);e=e!==t?e:!i.popup.visible(),n||o||i._focused[0]===p()||(i._prevent=!0,i._focused.focus(),i._prevent=!1),i[e?k:x]()},_triggerCascade:function(){var e=this;e._cascadeTriggered&&e._old===e.value()&&e._oldIndex===e.selectedIndex||(e._cascadeTriggered=!0,e.trigger(C,{userTriggered:e._userTriggered}))},_triggerChange:function(){this._valueBeforeCascade!==this.value()&&this.trigger(v)},_unbindDataSource:function(){var e=this;e.dataSource.unbind(D,e._requestStartHandler).unbind(A,e._requestEndHandler).unbind("error",e._errorHandler)},requireValueMapper:function(e,t){var n=(e.value instanceof Array?e.value.length:e.value)||(t instanceof Array?t.length:t);if(n&&e.virtual&&"function"!=typeof e.virtual.valueMapper)throw Error("ValueMapper is not provided while the value is being set. See http://docs.telerik.com/kendo-ui/controls/editors/combobox/virtualization#the-valuemapper-function")}});I(L,{inArray:function(e,t){var n,i,o=t.children;if(!e||e.parentNode!==t)return-1;for(n=0,i=o.length;i>n;n++)if(e===o[n])return n;return-1},unifyType:n}),l.ui.List=L,c.Select=L.extend({init:function(e,t){L.fn.init.call(this,e,t),this._initial=this.element.val()},setDataSource:function(e){var t,n=this;n.options.dataSource=e,n._dataSource(),n.listView.bound()&&(n._initialIndex=null),n.listView.setDataSource(n.dataSource),n.options.autoBind&&n.dataSource.fetch(),t=n._parentWidget(),t&&n._cascadeSelect(t)},close:function(){this.popup.close()},select:function(e){var n=this;return e===t?n.selectedIndex:(n._select(e),n._old=n._accessor(),n._oldIndex=n.selectedIndex,t)},_accessor:function(e,t){return this[this._isSelect?"_accessorSelect":"_accessorInput"](e,t)},_accessorInput:function(e){var n=this.element[0];return e===t?n.value:(null===e&&(e=""),n.value=e,t)},_accessorSelect:function(e,n){var o,r=this.element[0];return e===t?i(r).value||"":(i(r).selected=!1,n===t&&(n=-1),o=null!==e&&""!==e,o&&-1==n?this._custom(e):e?r.value=e:r.selectedIndex=n,t)},_custom:function(t){var n=this,i=n.element,o=n._customOption;o||(o=e("
        ',R=k.extend({init:function(t,n){var i,o;k.fn.init.call(this,t,n),n=this.options,this.element=e(t),i=this.field=this.options.field||this.element.attr(c.attr("field")),o=n.checkSource,this._foreignKeyValues()?(this.checkSource=E.create(n.values),this.checkSource.fetch()):n.forceUnique?(o=n.dataSource.options,delete o.pageSize,this.checkSource=E.create(o),this.checkSource.reader.data=l(this.checkSource.reader.data,this.field)):this.checkSource=E.create(o),this.dataSource=n.dataSource,this.model=this.dataSource.reader.model,this._parse=function(e){return e+""},this.model&&this.model.fields&&(i=this.model.fields[this.field],i&&("number"==i.type?this._parse=parseFloat:i.parse&&(this._parse=u(i.parse,i)),this.type=i.type||"string")),n.appendToElement?this._init():this._createLink(),this._refreshHandler=u(this.refresh,this),this.dataSource.bind(m,this._refreshHandler)},_createLink:function(){var e=this.element,t=e.addClass("k-with-icon k-filterable").find(".k-grid-filter");t[0]||(t=e.prepend('').find(".k-grid-filter")),this._link=t.attr("tabindex",-1).on("click"+g,u(this._click,this))},_init:function(){var e=this,t=this.options.forceUnique,n=this.options;this.pane=n.pane,this.pane&&(this._isMobile=!0),this._createForm(),this._foreignKeyValues()?this.refresh():t&&!this.checkSource.options.serverPaging&&this.dataSource.data().length?(this.checkSource.data(s(this.dataSource.data(),this.field)),this.refresh()):(this._attachProgress(),this.checkSource.fetch(function(){e.refresh.call(e)})),this.options.forceUnique||(this.checkChangeHandler=function(){e.container.empty(),e.refresh()},this.checkSource.bind(m,this.checkChangeHandler)),this.form.on("keydown"+A,u(this._keydown,this)).on("submit"+A,u(this._filter,this)).on("reset"+A,u(this._reset,this)),this.trigger(f,{field:this.field,container:this.form})},_attachProgress:function(){var e=this;this._progressHandler=function(){d.progress(e.container,!0)},this._progressHideHandler=function(){d.progress(e.container,!1)},this.checkSource.bind("progress",this._progressHandler).bind("change",this._progressHideHandler)},_input:function(){var e=this;e._clearTypingTimeout(),e._typingTimeout=setTimeout(function(){e.search()},100)},_clearTypingTimeout:function(){this._typingTimeout&&(clearTimeout(this._typingTimeout),this._typingTimeout=null)},search:function(){var e,t,n,i=this.options.ignoreCase,o=this.searchTextBox[0].value,r=this.container.find("label");for(i&&(o=o.toLowerCase()),e=0,this.options.checkAll&&r.length&&(r[0].parentNode.style.display=o?"none":"",e++);r.length>e;)t=r[e],n=t.textContent||t.innerText,i&&(n=n.toLowerCase()),t.parentNode.style.display=n.indexOf(o)>=0?"":"none",e++},_activate:function(){this.form.find(":kendoFocusable:first").focus()},_createForm:function(){var t,n,i=this.options,o="";this._isMobile||(i.search&&(o+="
        "),o+="
          ",i.messages.selectedItemsFormat&&(o+="
          "+c.format(i.messages.selectedItemsFormat,0)+"
          "),o+="",o+="",this.form=e('
          ').html(o),this.container=this.form.find(".k-multicheck-wrap")),this._isMobile?(t=this,t.form=e("
          ").html(c.template(I)({field:t.field,title:i.title||t.field,ns:c.ns,messages:i.messages,search:i.search})),t.view=t.pane.append(t.form.html()),t.form=t.view.element.find("form"),n=this.view.element,this.container=n.find(".k-multicheck-wrap"),n.on("click",".k-submit",function(e){t.form.submit(),e.preventDefault()}).on("click",".k-cancel",function(e){t._closeForm(),e.preventDefault()})):i.appendToElement?(this.popup=this.element.closest(".k-popup").data(h),this.element.append(this.form)):this.popup=this.form.kendoPopup({anchor:this._link,activate:u(this._activate,this)}).data(h),i.search&&(this.searchTextBox=this.form.find(".k-textbox > input"),this.searchTextBox.on("input",u(this._input,this)))},createCheckAllItem:function(){var t=this.options,n=c.template(t.itemTemplate({field:"all",mobile:this._isMobile})),i=e(n({all:t.messages.checkAll}));this.container.prepend(i),this.checkBoxAll=i.find(":checkbox").eq(0).addClass("k-check-all"),this.checkAllHandler=u(this.checkAll,this),this.checkBoxAll.on(m+A,this.checkAllHandler)},updateCheckAllState:function(){if(this.options.messages.selectedItemsFormat&&this.form.find(".k-filter-selected-items").text(c.format(this.options.messages.selectedItemsFormat,this.container.find(":checked:not(.k-check-all)").length)),this.checkBoxAll){var e=this.container.find(":checkbox:not(.k-check-all)").length==this.container.find(":checked:not(.k-check-all)").length;this.checkBoxAll.prop("checked",e)}},refresh:function(e){var t=this.options.forceUnique,n=this.dataSource,i=this.getFilterArray();this._link&&this._link.toggleClass("k-state-active",0!==i.length),this.form&&(e&&t&&e.sender===n&&!n.options.serverPaging&&("itemchange"==e.action||"add"==e.action||"remove"==e.action||n.options.autoSync&&"sync"===e.action)&&!this._foreignKeyValues()&&(this.checkSource.data(s(this.dataSource.data(),this.field)),this.container.empty()),this.container.is(":empty")&&this.createCheckBoxes(),this.checkValues(i),this.trigger(p))},getFilterArray:function(){var t,n=e.extend(!0,{},{filters:[],logic:"and"},this.dataSource.filter());return r(n,this.field),t=a(n)},createCheckBoxes:function(){var e,t,n,i=this.options,o={field:this.field,format:i.format,mobile:this._isMobile,type:this.type};this.options.forceUnique?this._foreignKeyValues()?(e=this.checkSource.data(),o.valueField="value",o.field="text"):e=this.checkSource.data():e=this.checkSource.view(),t=c.template(i.itemTemplate(o)),n=c.render(t,e),i.checkAll&&this.createCheckAllItem(),this.container.on(m+A,":checkbox",u(this.updateCheckAllState,this)),this.container.append(n)},checkAll:function(){var e=this.checkBoxAll.is(":checked");this.container.find(":checkbox").prop("checked",e)},checkValues:function(t){var n=this;e(e.grep(this.container.find(":checkbox").prop("checked",!1),function(i){var o,r,a=!1;if(!e(i).is(".k-check-all"))for(o=n._parse(e(i).val()),r=0;t.length>r;r++)if(a="date"==n.type?t[r].getTime()==o.getTime():t[r]==o)return a})).prop("checked",!0),this.updateCheckAllState()},_filter:function(t){var n,i;t.preventDefault(),t.stopPropagation(),n={logic:"or"},i=this,n.filters=e.map(this.form.find(":checkbox:checked:not(.k-check-all)"),function(t){return{value:e(t).val(),operator:"eq",field:i.field}}),n.filters.length&&this.trigger("change",{filter:n,field:i.field})||(n=this._merge(n),n.filters.length&&this.dataSource.filter(n),this._closeForm())},_stripFilters:function(t){return e.grep(t,function(e){return null!=e.value})},_foreignKeyValues:function(){var e=this.options;return e.values&&!e.checkSource},destroy:function(){var e=this;k.fn.destroy.call(e),e.form&&(c.unbind(e.form),c.destroy(e.form),e.form.unbind(A),e.popup&&(e.popup.destroy(),e.popup=null),e.form=null,e.container&&(e.container.unbind(A),e.container=null),e.checkBoxAll&&e.checkBoxAll.unbind(A)),e.view&&(e.view.purge(),e.view=null),e._link&&e._link.unbind(g),e._refreshHandler&&(e.dataSource.unbind(m,e._refreshHandler),e.dataSource=null),e.checkChangeHandler&&e.checkSource.unbind(m,e.checkChangeHandler),e._progressHandler&&e.checkSource.unbind("progress",e._progressHandler),e._progressHideHandler&&e.checkSource.unbind("change",e._progressHideHandler),this._clearTypingTimeout(),this.searchTextBox=null,e.element=e.checkSource=e.container=e.checkBoxAll=e._link=e._refreshHandler=e.checkAllHandler=null},options:{name:"FilterMultiCheck",itemTemplate:function(e){var n=e.field,i=e.format,o=e.valueField,r=e.mobile,a="";return o===t&&(o=n),"date"==e.type&&(a=":yyyy-MM-ddTHH:mm:sszzz"),"
        • "},checkAll:!0,search:!1,ignoreCase:!0,appendToElement:!1,messages:{checkAll:"Select All",clear:"Clear",filter:"Filter",search:"Search",cancel:"Cancel",selectedItemsFormat:"{0} items selected"},forceUnique:!0,animations:{left:"slide",right:"slide:right"}},events:[f,p,"change"]});e.extend(R.fn,{_click:D.fn._click,_keydown:D.fn._keydown,_reset:D.fn._reset,_closeForm:D.fn._closeForm,clear:D.fn.clear,_merge:D.fn._merge}),d.plugin(D),d.plugin(R)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.menu.min",["kendo.popup.min"],e)}(function(){return function(e,t){function n(e,t){return e=e.split(" ")[!t+0]||e,e.replace("top","up").replace("bottom","down")}function i(e,t,n){e=e.split(" ")[!t+0]||e;var i={origin:["bottom",n?"right":"left"],position:["top",n?"right":"left"]},o=/left|right/.test(e);return o?(i.origin=["top",e],i.position[1]=c.directions[e].reverse):(i.origin[0]=e,i.position[0]=c.directions[e].reverse),i.origin=i.origin.join(" "),i.position=i.position.join(" "),i}function o(t,n){try{return e.contains(t,n)}catch(i){return!1}}function r(t){t=e(t),t.addClass("k-item").children(x).addClass(R),t.children("a").addClass(T).children(x).addClass(R),t.filter(":not([disabled])").addClass(q),t.filter(".k-separator").empty().append(" "),t.filter("li[disabled]").addClass(Y).removeAttr("disabled").attr("aria-disabled",!0),t.filter("[role]").length||t.attr("role","menuitem"),t.children("."+T).length||t.contents().filter(function(){return!(this.nodeName.match(y)||3==this.nodeType&&!e.trim(this.nodeValue))}).wrapAll(""),a(t),s(t)}function a(t){t=e(t),t.find("> .k-link > [class*=k-i-arrow]:not(.k-sprite)").remove(),t.filter(":has(.k-menu-group)").children(".k-link:not(:has([class*=k-i-arrow]:not(.k-sprite)))").each(function(){var t=e(this),n=t.parent().parent();t.append("")})}function s(t){t=e(t),t.filter(".k-first:not(:first-child)").removeClass(I),t.filter(".k-last:not(:last-child)").removeClass(D),t.filter(":first-child").addClass(I),t.filter(":last-child").addClass(D)}var l,c=window.kendo,d=c.ui,u=c._activeElement,h=c.support.touch&&c.support.mobileOS,f="mousedown",p="click",m=e.extend,g=e.proxy,v=e.each,_=c.template,b=c.keys,w=d.Widget,y=/^(ul|a|div)$/i,k=".kendoMenu",x="img",C="open",S="k-menu",T="k-link",D="k-last",A="close",E="timer",I="k-first",R="k-image",M="select",F="zIndex",z="activate",P="deactivate",B="touchstart"+k+" MSPointerDown"+k+" pointerdown"+k,L=c.support.pointers,H=c.support.msPointers,N=H||L,O=L?"pointerover":H?"MSPointerOver":"mouseenter",V=L?"pointerout":H?"MSPointerOut":"mouseleave",W=h||N,U=e(document.documentElement),j="kendoPopup",q="k-state-default",G="k-state-hover",$="k-state-focused",Y="k-state-disabled",K="k-state-selected",Q=".k-menu",X=".k-menu-group",J=X+",.k-animation-container",Z=":not(.k-list) > .k-item",ee=".k-item.k-state-disabled",te=".k-item:not(.k-state-disabled)",ne=".k-item:not(.k-state-disabled) > .k-link",ie=":not(.k-item.k-separator)",oe=ie+":eq(0)",re=ie+":last",ae="> div:not(.k-animation-container,.k-list-container)",se={2:1,touch:1},le={content:_("
          #= content(item) #
          "),group:_("
            #= renderItems(data) #
          "),itemWrapper:_("<#= tag(item) # class='#= textClass(item) #'#= textAttributes(item) #>#= image(data) ##= sprite(item) ##= text(item) ##= arrow(data) #"),item:_("
        • #= itemWrapper(data) ## if (item.items) { ##= subGroup({ items: item.items, menu: menu, group: { expanded: item.expanded } }) ## } else if (item.content || item.contentUrl) { ##= renderContent(data) ## } #
        • "),image:_(""),arrow:_(""),sprite:_(""),empty:_("")},ce={wrapperCssClass:function(e,t){var n="k-item",i=t.index;return n+=t.enabled===!1?" k-state-disabled":" k-state-default",e.firstLevel&&0===i&&(n+=" k-first"),i==e.length-1&&(n+=" k-last"),t.cssClass&&(n+=" "+t.cssClass),t.attr&&t.attr.hasOwnProperty("class")&&(n+=" "+t.attr["class"]),t.selected&&(n+=" "+K),n},itemCssAttributes:function(e){var t,n="",i=e.attr||{};for(t in i)i.hasOwnProperty(t)&&"class"!==t&&(n+=t+'="'+i[t]+'" ');return n},imageCssAttributes:function(e){var t,n="",i=e.imageAttr||{};i["class"]?i["class"]+=" "+R:i["class"]=R;for(t in i)i.hasOwnProperty(t)&&(n+=t+'="'+i[t]+'" ');return n},contentCssAttributes:function(e){var t,n="",i=e.contentAttr||{},o="k-content k-group k-menu-group";i["class"]?i["class"]+=" "+o:i["class"]=o;for(t in i)i.hasOwnProperty(t)&&(n+=t+'="'+i[t]+'" ');return n},textClass:function(){return T},textAttributes:function(e){return e.url?" href='"+e.url+"'":""},arrowClass:function(e,t){var n="k-icon";return n+=t.horizontal?" k-i-arrow-s":" k-i-arrow-e"},text:function(e){return e.encoded===!1?e.text:c.htmlEncode(e.text)},tag:function(e){return e.url?"a":"span"},groupAttributes:function(e){return e.expanded!==!0?" style='display:none'":""},groupCssClass:function(){return"k-group k-menu-group"},content:function(e){return e.content?e.content:" "}},de=w.extend({init:function(t,n){var i=this;w.fn.init.call(i,t,n),t=i.wrapper=i.element,n=i.options,i._initData(n),i._updateClasses(),i._animations(n),i.nextItemZIndex=100,i._tabindex(),i._focusProxy=g(i._focusHandler,i),t.on(B,te,i._focusProxy).on(p+k,ee,!1).on(p+k,te,g(i._click,i)).on("keydown"+k,g(i._keydown,i)).on("focus"+k,g(i._focus,i)).on("focus"+k,".k-content",g(i._focus,i)).on(B+" "+f+k,".k-content",g(i._preventClose,i)).on("blur"+k,g(i._removeHoverItem,i)).on("blur"+k,"[tabindex]",g(i._checkActiveElement,i)).on(O+k,te,g(i._mouseenter,i)).on(V+k,te,g(i._mouseleave,i)).on(O+k+" "+V+k+" "+f+k+" "+p+k,ne,g(i._toggleHover,i)),n.openOnClick&&(i.clicked=!1,i._documentClickHandler=g(i._documentClick,i),e(document).click(i._documentClickHandler)),t.attr("role","menubar"),t[0].id&&(i._ariaId=c.format("{0}_mn_active",t[0].id)),c.notify(i)},events:[C,A,z,P,M],options:{name:"Menu",animation:{open:{duration:200},close:{duration:100}},orientation:"horizontal",direction:"default", +openOnClick:!1,closeOnClick:!0,hoverDelay:100,popupCollision:t},_initData:function(e){var t=this;e.dataSource&&(t.angular("cleanup",function(){return{elements:t.element.children()}}),t.element.empty(),t.append(e.dataSource,t.element),t.angular("compile",function(){return{elements:t.element.children()}}))},setOptions:function(e){var t=this.options.animation;this._animations(e),e.animation=m(!0,t,e.animation),"dataSource"in e&&this._initData(e),this._updateClasses(),w.fn.setOptions.call(this,e)},destroy:function(){var t=this;w.fn.destroy.call(t),t.element.off(k),t._documentClickHandler&&e(document).unbind("click",t._documentClickHandler),c.destroy(t.element)},enable:function(e,t){return this._toggleDisabled(e,t!==!1),this},disable:function(e){return this._toggleDisabled(e,!1),this},append:function(e,t){t=this.element.find(t);var n=this._insert(e,t,t.length?t.find("> .k-menu-group, > .k-animation-container > .k-menu-group"):null);return v(n.items,function(){n.group.append(this),a(this)}),a(t),s(n.group.find(".k-first, .k-last").add(n.items)),this},insertBefore:function(e,t){t=this.element.find(t);var n=this._insert(e,t,t.parent());return v(n.items,function(){t.before(this),a(this),s(this)}),s(t),this},insertAfter:function(e,t){t=this.element.find(t);var n=this._insert(e,t,t.parent());return v(n.items,function(){t.after(this),a(this),s(this)}),s(t),this},_insert:function(t,n,i){var o,a,s,l,c=this;return n&&n.length||(i=c.element),s=e.isPlainObject(t),l={firstLevel:i.hasClass(S),horizontal:i.hasClass(S+"-horizontal"),expanded:!0,length:i.children().length},n&&!i.length&&(i=e(de.renderGroup({group:l})).appendTo(n)),s||e.isArray(t)?o=e(e.map(s?[t]:t,function(t,n){return"string"==typeof t?e(t).get():e(de.renderItem({group:l,item:m(t,{index:n})})).get()})):(o="string"==typeof t&&"<"!=t.charAt(0)?c.element.find(t):e(t),a=o.find("> ul").addClass("k-menu-group").attr("role","menu"),o=o.filter("li"),o.add(a.find("> li")).each(function(){r(this)})),{items:o,group:i}},remove:function(e){var t,n,i,o;return e=this.element.find(e),t=this,n=e.parentsUntil(t.element,Z),i=e.parent("ul:not(.k-menu)"),e.remove(),i&&!i.children(Z).length&&(o=i.parent(".k-animation-container"),o.length?o.remove():i.remove()),n.length&&(n=n.eq(0),a(n),s(n)),t},open:function(o){var r=this,a=r.options,s="horizontal"==a.orientation,l=a.direction,d=c.support.isRtl(r.wrapper);return o=r.element.find(o),/^(top|bottom|default)$/.test(l)&&(l=d?s?(l+" left").replace("default","bottom"):"left":s?(l+" right").replace("default","bottom"):"right"),o.siblings().find(">.k-popup:visible,>.k-animation-container>.k-popup:visible").each(function(){var t=e(this).data("kendoPopup");t&&t.close()}),o.each(function(){var o=e(this);clearTimeout(o.data(E)),o.data(E,setTimeout(function(){var u,f,p,g,v,_,b,w,y=o.find(".k-menu-group:first:hidden");y[0]&&r._triggerEvent({item:o[0],type:C})===!1&&(!y.find(".k-menu-group")[0]&&y.children(".k-item").length>1?(f=e(window).height(),p=function(){y.css({maxHeight:f-(y.outerHeight()-y.height())-c.getShadows(y).bottom,overflow:"auto"})},c.support.browser.msie&&7>=c.support.browser.version?setTimeout(p,0):p()):y.css({maxHeight:"",overflow:""}),o.data(F,o.css(F)),o.css(F,r.nextItemZIndex++),u=y.data(j),g=o.parent().hasClass(S),v=g&&s,_=i(l,g,d),b=a.animation.open.effects,w=b!==t?b:"slideIn:"+n(l,g),u?(u=y.data(j),u.options.origin=_.origin,u.options.position=_.position,u.options.animation.open.effects=w):u=y.kendoPopup({activate:function(){r._triggerEvent({item:this.wrapper.parent(),type:z})},deactivate:function(e){e.sender.element.removeData("targetTransform").css({opacity:""}),r._triggerEvent({item:this.wrapper.parent(),type:P})},origin:_.origin,position:_.position,collision:a.popupCollision!==t?a.popupCollision:v?"fit":"fit flip",anchor:o,appendTo:o,animation:{open:m(!0,{effects:w},a.animation.open),close:a.animation.close},close:function(e){var t=e.sender.wrapper.parent();r._triggerEvent({item:t[0],type:A})?e.preventDefault():(t.css(F,t.data(F)),t.removeData(F),h&&(t.removeClass(G),r._removeHoverItem()))}}).data(j),y.removeAttr("aria-hidden"),u.open())},r.options.hoverDelay))}),r},close:function(t,n){var i=this,o=i.element;return t=o.find(t),t.length||(t=o.find(">.k-item")),t.each(function(){var t=e(this);!n&&i._isRootItem(t)&&(i.clicked=!1),clearTimeout(t.data(E)),t.data(E,setTimeout(function(){var e=t.find(".k-menu-group:not(.k-list-container):not(.k-calendar-container):first:visible").data(j);e&&(e.close(),e.element.attr("aria-hidden",!0))},i.options.hoverDelay))}),i},_toggleDisabled:function(t,n){this.element.find(t).each(function(){e(this).toggleClass(q,n).toggleClass(Y,!n).attr("aria-disabled",!n)})},_toggleHover:function(t){var n=e(c.eventTarget(t)||t.target).closest(Z),i=t.type==O||-1!==f.indexOf(t.type);n.parents("li."+Y).length||n.toggleClass(G,i||"mousedown"==t.type||"click"==t.type),this._removeHoverItem()},_preventClose:function(){this.options.closeOnClick||(this._closurePrevented=!0)},_checkActiveElement:function(t){var n=this,i=e(t?t.currentTarget:this._hoverItem()),r=n._findRootParent(i)[0];this._closurePrevented||setTimeout(function(){document.hasFocus()&&(o(r,c._activeElement())||!t||o(r,t.currentTarget))||n.close(r)},0),this._closurePrevented=!1},_removeHoverItem:function(){var e=this._hoverItem();e&&e.hasClass($)&&(e.removeClass($),this._oldHoverItem=null)},_updateClasses:function(){var e,t=this.element,n=".k-menu-init div ul";t.removeClass("k-menu-horizontal k-menu-vertical"),t.addClass("k-widget k-reset k-header k-menu-init "+S).addClass(S+"-"+this.options.orientation),t.find("li > ul").filter(function(){return!c.support.matchesSelector.call(this,n)}).addClass("k-group k-menu-group").attr("role","menu").attr("aria-hidden",t.is(":visible")).end().find("li > div").addClass("k-content").attr("tabindex","-1"),e=t.find("> li,.k-menu-group > li"),t.removeClass("k-menu-init"),e.each(function(){r(this)})},_mouseenter:function(t){var n=this,i=e(t.currentTarget),r=i.children(".k-animation-container").length||i.children(X).length;t.delegateTarget==i.parents(Q)[0]&&(n.options.openOnClick&&!n.clicked||h||(L||H)&&t.originalEvent.pointerType in se&&n._isRootItem(i.closest(Z))||!o(t.currentTarget,t.relatedTarget)&&r&&n.open(i),(n.options.openOnClick&&n.clicked||W)&&i.siblings().each(g(function(e,t){n.close(t,!0)},n)))},_mouseleave:function(n){var i=this,r=e(n.currentTarget),a=r.children(".k-animation-container").length||r.children(X).length;return r.parentsUntil(".k-animation-container",".k-list-container,.k-calendar-container")[0]?(n.stopImmediatePropagation(),t):(i.options.openOnClick||h||(L||H)&&n.originalEvent.pointerType in se||o(n.currentTarget,n.relatedTarget||n.target)||!a||o(n.currentTarget,c._activeElement())||i.close(r),t)},_click:function(n){var i,o,r,a=this,s=a.options,l=e(c.eventTarget(n)),d=l[0]?l[0].nodeName.toUpperCase():"",u="INPUT"==d||"SELECT"==d||"BUTTON"==d||"LABEL"==d,h=l.closest("."+T),f=l.closest(Z),p=h.attr("href"),m=l.attr("href"),g=e("").attr("href"),v=!!p&&p!==g,_=v&&!!p.match(/^#/),b=!!m&&m!==g,w=s.openOnClick&&r&&a._isRootItem(f);if(!l.closest(ae,f[0]).length){if(f.hasClass(Y))return n.preventDefault(),t;if(n.handled||!a._triggerEvent({item:f[0],type:M})||u||n.preventDefault(),n.handled=!0,o=f.children(J),r=o.is(":visible"),s.closeOnClick&&(!v||_)&&(!o.length||w))return f.removeClass(G).css("height"),a._oldHoverItem=a._findRootParent(f),a.close(h.parentsUntil(a.element,Z)),a.clicked=!1,-1!="MSPointerUp".indexOf(n.type)&&n.preventDefault(),t;v&&n.enterKey&&h[0].click(),(a._isRootItem(f)&&s.openOnClick||c.support.touch||(L||H)&&a._isRootItem(f.closest(Z)))&&(v||u||b||n.preventDefault(),a.clicked=!0,i=o.is(":visible")?A:C,(s.closeOnClick||i!=A)&&a[i](f))}},_documentClick:function(e){o(this.element[0],e.target)||(this.clicked=!1)},_focus:function(n){var i=this,o=n.target,r=i._hoverItem(),a=u();return o==i.wrapper[0]||e(o).is(":kendoFocusable")?(a===n.currentTarget&&(r.length?i._moveHover([],r):i._oldHoverItem||i._moveHover([],i.wrapper.children().first())),t):(n.stopPropagation(),e(o).closest(".k-content").closest(".k-menu-group").closest(".k-item").addClass($),i.wrapper.focus(),t)},_keydown:function(e){var n,i,o,r=this,a=e.keyCode,s=r._oldHoverItem,l=c.support.isRtl(r.wrapper);if(e.target==e.currentTarget||a==b.ESC){if(s||(s=r._oldHoverItem=r._hoverItem()),i=r._itemBelongsToVertival(s),o=r._itemHasChildren(s),a==b.RIGHT)n=r[l?"_itemLeft":"_itemRight"](s,i,o);else if(a==b.LEFT)n=r[l?"_itemRight":"_itemLeft"](s,i,o);else if(a==b.DOWN)n=r._itemDown(s,i,o);else if(a==b.UP)n=r._itemUp(s,i,o);else if(a==b.ESC)n=r._itemEsc(s,i);else if(a==b.ENTER||a==b.SPACEBAR)n=s.children(".k-link"),n.length>0&&(r._click({target:n[0],preventDefault:function(){},enterKey:!0}),r._moveHover(s,r._findRootParent(s)));else if(a==b.TAB)return n=r._findRootParent(s),r._moveHover(s,n),r._checkActiveElement(),t;n&&n[0]&&(e.preventDefault(),e.stopPropagation())}},_hoverItem:function(){return this.wrapper.find(".k-item.k-state-hover,.k-item.k-state-focused").filter(":visible")},_itemBelongsToVertival:function(e){var t=this.wrapper.hasClass("k-menu-vertical");return e.length?e.parent().hasClass("k-menu-group")||t:t},_itemHasChildren:function(e){return e.length?e.children("ul.k-menu-group, div.k-animation-container").length>0:!1},_moveHover:function(t,n){var i=this,o=i._ariaId;t.length&&n.length&&t.removeClass($),n.length&&(n[0].id&&(o=n[0].id),n.addClass($),i._oldHoverItem=n,o&&(i.element.removeAttr("aria-activedescendant"),e("#"+o).removeAttr("id"),n.attr("id",o),i.element.attr("aria-activedescendant",o)))},_findRootParent:function(e){return this._isRootItem(e)?e:e.parentsUntil(Q,"li.k-item").last()},_isRootItem:function(e){return e.parent().hasClass(S)},_itemRight:function(e,t,n){var i,o,r=this;if(!e.hasClass(Y))return t?n?(r.open(e),i=e.find(".k-menu-group").children().first()):"horizontal"==r.options.orientation&&(o=r._findRootParent(e),r.close(o),i=o.nextAll(oe)):(i=e.nextAll(oe),i.length||(i=e.prevAll(re))),i&&!i.length?i=r.wrapper.children(".k-item").first():i||(i=[]),r._moveHover(e,i),i},_itemLeft:function(e,t){var n,i=this;return t?(n=e.parent().closest(".k-item"),i.close(n),i._isRootItem(n)&&"horizontal"==i.options.orientation&&(n=n.prevAll(oe))):(n=e.prevAll(oe),n.length||(n=e.nextAll(re))),n.length||(n=i.wrapper.children(".k-item").last()),i._moveHover(e,n),n},_itemDown:function(e,t,n){var i,o=this;if(t)i=e.nextAll(oe);else{if(!n||e.hasClass(Y))return;o.open(e),i=e.find(".k-menu-group").children().first()}return!i.length&&e.length?i=e.parent().children().first():e.length||(i=o.wrapper.children(".k-item").first()),o._moveHover(e,i),i},_itemUp:function(e,t){var n,i=this;if(t)return n=e.prevAll(oe),!n.length&&e.length?n=e.parent().children().last():e.length||(n=i.wrapper.children(".k-item").last()),i._moveHover(e,n),n},_itemEsc:function(e,t){var n,i=this;return t?(n=e.parent().closest(".k-item"),i.close(n),i._moveHover(e,n),n):e},_triggerEvent:function(e){var t=this;return t.trigger(e.type,{type:e.type,item:e.item})},_focusHandler:function(t){var n=this,i=e(c.eventTarget(t)).closest(Z);setTimeout(function(){n._moveHover([],i),i.children(".k-content")[0]&&i.parent().closest(".k-item").removeClass($)},200)},_animations:function(e){e&&"animation"in e&&!e.animation&&(e.animation={open:{effects:{}},close:{hide:!0,effects:{}}})}});m(de,{renderItem:function(e){e=m({menu:{},group:{}},e);var t=le.empty,n=e.item;return le.item(m(e,{image:n.imageUrl?le.image:t,sprite:n.spriteCssClass?le.sprite:t,itemWrapper:le.itemWrapper,renderContent:de.renderContent,arrow:n.items||n.content?le.arrow:t,subGroup:de.renderGroup},ce))},renderGroup:function(e){return le.group(m({renderItems:function(e){for(var t="",n=0,i=e.items,o=i?i.length:0,r=m({length:o},e.group);o>n;n++)t+=de.renderItem(m(e,{group:r,item:m({index:n},i[n])}));return t}},e,ce))},renderContent:function(e){return le.content(m(e,ce))}}),l=de.extend({init:function(t,n){var i=this;de.fn.init.call(i,t,n),i._marker=c.guid().substring(0,8),i.target=e(i.options.target),i._popup(),i._wire()},options:{name:"ContextMenu",filter:null,showOn:"contextmenu",orientation:"vertical",alignToAnchor:!1,target:"body"},events:[C,A,z,P,M],setOptions:function(t){var n=this;de.fn.setOptions.call(n,t),n.target.off(n.showOn+k+n._marker,n._showProxy),n.userEvents&&n.userEvents.destroy(),n.target=e(n.options.target),t.orientation&&n.popup.wrapper[0]&&n.popup.element.unwrap(),n._wire(),de.fn.setOptions.call(this,t)},destroy:function(){var e=this;e.target.off(e.options.showOn+k+e._marker),U.off(c.support.mousedown+k+e._marker,e._closeProxy),e.userEvents&&e.userEvents.destroy(),de.fn.destroy.call(e)},open:function(n,i){var r=this;return n=e(n)[0],o(r.element[0],e(n)[0])?de.fn.open.call(r,n):r._triggerEvent({item:r.element,type:C})===!1&&(r.popup.visible()&&r.options.filter&&(r.popup.close(!0),r.popup.element.kendoStop(!0)),i!==t?(r.popup.wrapper.hide(),r.popup.open(n,i)):(r.popup.options.anchor=(n?n:r.popup.anchor)||r.target,r.popup.element.kendoStop(!0),r.popup.open()),U.off(r.popup.downEvent,r.popup._mousedownProxy),U.on(c.support.mousedown+k+r._marker,r._closeProxy)),r},close:function(){var t=this;o(t.element[0],e(arguments[0])[0])?de.fn.close.call(t,arguments[0]):t.popup.visible()&&t._triggerEvent({item:t.element,type:A})===!1&&(t.popup.close(),U.off(c.support.mousedown+k,t._closeProxy),t.unbind(M,t._closeTimeoutProxy))},_showHandler:function(e){var t,n=e,i=this,r=i.options;e.event&&(n=e.event,n.pageX=e.x.location,n.pageY=e.y.location),o(i.element[0],e.relatedTarget||e.target)||(i._eventOrigin=n,n.preventDefault(),n.stopImmediatePropagation(),i.element.find("."+$).removeClass($),(r.filter&&c.support.matchesSelector.call(n.currentTarget,r.filter)||!r.filter)&&(r.alignToAnchor?(i.popup.options.anchor=n.currentTarget,i.open(n.currentTarget)):(i.popup.options.anchor=n.currentTarget,i._targetChild?(t=i.target.offset(),i.open(n.pageX-t.left,n.pageY-t.top)):i.open(n.pageX,n.pageY))))},_closeHandler:function(t){var n,i=this,r=e(t.relatedTarget||t.target),a=r.closest(i.target.selector)[0]==i.target[0],s=r.closest(te).children(J),l=o(i.element[0],r[0]);i._eventOrigin=t,n=3!==t.which,i.popup.visible()&&(n&&a||!a)&&(i.options.closeOnClick&&!s[0]&&l||!l)&&(l?(this.unbind(M,this._closeTimeoutProxy),i.bind(M,i._closeTimeoutProxy)):i.close())},_wire:function(){var e=this,t=e.options,n=e.target;e._showProxy=g(e._showHandler,e),e._closeProxy=g(e._closeHandler,e),e._closeTimeoutProxy=g(e.close,e),n[0]&&(c.support.mobileOS&&"contextmenu"==t.showOn?(e.userEvents=new c.UserEvents(n,{filter:t.filter,allowSelection:!1}),n.on(t.showOn+k+e._marker,!1),e.userEvents.bind("hold",e._showProxy)):t.filter?n.on(t.showOn+k+e._marker,t.filter,e._showProxy):n.on(t.showOn+k+e._marker,e._showProxy))},_triggerEvent:function(n){var i=this,o=e(i.popup.options.anchor)[0],r=i._eventOrigin;return i._eventOrigin=t,i.trigger(n.type,m({type:n.type,item:n.item||this.element[0],target:o},r?{event:r}:{}))},_popup:function(){var e=this;e._triggerProxy=g(e._triggerEvent,e),e.popup=e.element.addClass("k-context-menu").kendoPopup({anchor:e.target||"body",copyAnchorStyles:e.options.copyAnchorStyles,collision:e.options.popupCollision||"fit",animation:e.options.animation,activate:e._triggerProxy,deactivate:e._triggerProxy}).data("kendoPopup"),e._targetChild=o(e.target[0],e.popup.element[0])}}),d.plugin(de),d.plugin(l)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.columnmenu.min",["kendo.popup.min","kendo.filtermenu.min","kendo.menu.min"],e)}(function(){return function(e,t){function n(t){return e.trim(t).replace(/ /gi,"")}function i(e,t){var n,i,o,r={};for(n=0,i=e.length;i>n;n++)o=e[n],r[o[t]]=o;return r}function o(e){var t,n=[];for(t=0;e.length>t;t++)e[t].columns?n=n.concat(o(e[t].columns)):n.push(e[t]);return n}var r=window.kendo,a=r.ui,s=e.proxy,l=e.extend,c=e.grep,d=e.map,u=e.inArray,h="k-state-selected",f="asc",p="desc",m="change",g="init",v="select",_="kendoPopup",b="kendoFilterMenu",w="kendoMenu",y=".kendoColumnMenu",k=a.Widget,x=k.extend({init:function(t,n){var i,o=this;k.fn.init.call(o,t,n),t=o.element,n=o.options,o.owner=n.owner,o.dataSource=n.dataSource,o.field=t.attr(r.attr("field")),o.title=t.attr(r.attr("title")),i=t.find(".k-header-column-menu"),i[0]||(i=t.addClass("k-with-icon").prepend(''+n.messages.settings+"").find(".k-header-column-menu")),o.link=i.attr("tabindex",-1).on("click"+y,s(o._click,o)),o.wrapper=e('
          '),o._refreshHandler=s(o.refresh,o),o.dataSource.bind(m,o._refreshHandler)},_init:function(){var e=this;e.pane=e.options.pane,e.pane&&(e._isMobile=!0),e._isMobile?e._createMobileMenu():e._createMenu(),e.owner._muteAngularRebind(function(){e._angularItems("compile")}),e._sort(),e._columns(),e._filter(),e._lockColumns(),e.trigger(g,{field:e.field,container:e.wrapper})},events:[g,"sort","filtering"],options:{name:"ColumnMenu",messages:{sortAscending:"Sort Ascending",sortDescending:"Sort Descending",filter:"Filter",columns:"Columns",done:"Done",settings:"Column Settings",lock:"Lock",unlock:"Unlock"},filter:"",columns:!0,sortable:!0,filterable:!0,animations:{left:"slide"}},_createMenu:function(){var e=this,t=e.options;e.wrapper.html(r.template(C)({ns:r.ns,messages:t.messages,sortable:t.sortable,filterable:t.filterable,columns:e._ownerColumns(),showColumns:t.columns,lockedColumns:t.lockedColumns})),e.popup=e.wrapper[_]({anchor:e.link,open:s(e._open,e),activate:s(e._activate,e),close:function(){e.options.closeCallback&&e.options.closeCallback(e.element)}}).data(_),e.menu=e.wrapper.children()[w]({orientation:"vertical",closeOnClick:!1}).data(w)},_createMobileMenu:function(){var e=this,t=e.options,n=r.template(S)({ns:r.ns,field:e.field,title:e.title||e.field,messages:t.messages,sortable:t.sortable,filterable:t.filterable,columns:e._ownerColumns(),showColumns:t.columns,lockedColumns:t.lockedColumns});e.view=e.pane.append(n),e.wrapper=e.view.element.find(".k-column-menu"),e.menu=new T(e.wrapper.children(),{pane:e.pane}),e.view.element.on("click",".k-done",function(t){e.close(),t.preventDefault()}),e.options.lockedColumns&&e.view.bind("show",function(){e._updateLockedColumns()})},_angularItems:function(t){var n=this;n.angular(t,function(){var t=n.wrapper.find(".k-columns-item input["+r.attr("field")+"]").map(function(){return e(this).closest("li")}),i=d(n._ownerColumns(),function(e){return{column:e._originalObject}});return{elements:t,data:i}})},destroy:function(){var e=this;e._angularItems("cleanup"),k.fn.destroy.call(e),e.filterMenu&&e.filterMenu.destroy(),e._refreshHandler&&e.dataSource.unbind(m,e._refreshHandler),e.options.columns&&e.owner&&(e._updateColumnsMenuHandler&&(e.owner.unbind("columnShow",e._updateColumnsMenuHandler),e.owner.unbind("columnHide",e._updateColumnsMenuHandler)),e._updateColumnsLockedStateHandler&&(e.owner.unbind("columnLock",e._updateColumnsLockedStateHandler),e.owner.unbind("columnUnlock",e._updateColumnsLockedStateHandler))),e.menu&&(e.menu.element.off(y),e.menu.destroy()),e.wrapper.off(y),e.popup&&e.popup.destroy(),e.view&&e.view.purge(),e.link.off(y),e.owner=null,e.wrapper=null,e.element=null},close:function(){this.menu.close(),this.popup&&(this.popup.close(),this.popup.element.off("keydown"+y))},_click:function(e){e.preventDefault(),e.stopPropagation();var t=this.options;t.filter&&this.element.is(!t.filter)||(this.popup||this.pane||this._init(),this._isMobile?this.pane.navigate(this.view,this.options.animations.left):this.popup.toggle())},_open:function(){var t=this;e(".k-column-menu").not(t.wrapper).each(function(){e(this).data(_).close()}),t.popup.element.on("keydown"+y,function(e){e.keyCode==r.keys.ESC&&t.close()}),t.options.lockedColumns&&t._updateLockedColumns()},_activate:function(){this.menu.element.focus()},_ownerColumns:function(){var e=o(this.owner.columns),t=c(e,function(e){var t=!0,i=n(e.title||"");return e.menu!==!1&&(e.field||i.length)||(t=!1),t});return d(t,function(t){return{originalField:t.field,field:t.field||t.title,title:t.title||t.field,hidden:t.hidden,index:u(t,e),locked:!!t.locked,_originalObject:t}})},_sort:function(){var t=this;t.options.sortable&&(t.refresh(),t.menu.bind(v,function(n){var i,o=e(n.item);o.hasClass("k-sort-asc")?i=f:o.hasClass("k-sort-desc")&&(i=p),i&&(o.parent().find(".k-sort-"+(i==f?p:f)).removeClass(h),t._sortDataSource(o,i),t.close())}))},_sortDataSource:function(e,n){var i,o,r=this,a=r.options.sortable,s=null===a.compare?t:a.compare,l=r.dataSource,c=l.sort()||[],d=e.hasClass(h)&&a&&a.allowUnsort!==!1;if(n=d?t:n,!r.trigger("sort",{sort:{field:r.field,dir:n,compare:s}})){if(d?e.removeClass(h):e.addClass(h),"multiple"===a.mode){for(i=0,o=c.length;o>i;i++)if(c[i].field===r.field){c.splice(i,1);break}c.push({field:r.field,dir:n,compare:s})}else c=[{field:r.field,dir:n,compare:s}];l.sort(c)}},_columns:function(){var t=this;t.options.columns&&(t._updateColumnsMenu(),t._updateColumnsMenuHandler=s(t._updateColumnsMenu,t),t.owner.bind(["columnHide","columnShow"],t._updateColumnsMenuHandler),t._updateColumnsLockedStateHandler=s(t._updateColumnsLockedState,t),t.owner.bind(["columnUnlock","columnLock"],t._updateColumnsLockedStateHandler),t.menu.bind(v,function(n){var i,a,s,l=e(n.item),d=o(t.owner.columns);t._isMobile&&n.preventDefault(),l.parent().closest("li.k-columns-item")[0]&&(i=l.find(":checkbox"),i.attr("disabled")||(s=i.attr(r.attr("field")),a=c(d,function(e){return e.field==s||e.title==s})[0],a.hidden===!0?t.owner.showColumn(a):t.owner.hideColumn(a)))}))},_updateColumnsMenu:function(){var e,t,n,i,o,a,s=r.attr("field"),l=r.attr("locked"),h=c(this._ownerColumns(),function(e){return!e.hidden}),f=c(h,function(e){return e.originalField}),p=c(f,function(e){return e.locked===!0}).length,m=c(f,function(e){return e.locked!==!0}).length;for(h=d(h,function(e){return e.field}),a=this.wrapper.find(".k-columns-item input["+s+"]").prop("disabled",!1).prop("checked",!1),e=0,t=a.length;t>e;e++)n=a.eq(e),o="true"===n.attr(l),i=!1,u(n.attr(s),h)>-1&&(i=!0,n.prop("checked",i)),i&&(1==p&&o&&n.prop("disabled",!0),1!=m||o||n.prop("disabled",!0))},_updateColumnsLockedState:function(){var e,t,n,o,a=r.attr("field"),s=r.attr("locked"),l=i(this._ownerColumns(),"field"),c=this.wrapper.find(".k-columns-item input[type=checkbox]");for(e=0,t=c.length;t>e;e++)n=c.eq(e),o=l[n.attr(a)],o&&n.attr(s,o.locked);this._updateColumnsMenu()},_filter:function(){var t=this,n=b,i=t.options;i.filterable!==!1&&(i.filterable.multi&&(n="kendoFilterMultiCheck",i.filterable.dataSource&&(i.filterable.checkSource=i.filterable.dataSource,delete i.filterable.dataSource)),t.filterMenu=t.wrapper.find(".k-filterable")[n](l(!0,{},{appendToElement:!0,dataSource:i.dataSource,values:i.values,field:t.field,title:t.title,change:function(e){t.trigger("filtering",{filter:e.filter,field:e.field})&&e.preventDefault()}},i.filterable)).data(n),t._isMobile&&t.menu.bind(v,function(n){var i=e(n.item);i.hasClass("k-filter-item")&&t.pane.navigate(t.filterMenu.view,t.options.animations.left)}))},_lockColumns:function(){var t=this;t.menu.bind(v,function(n){var i=e(n.item);i.hasClass("k-lock")?(t.owner.lockColumn(t.field),t.close()):i.hasClass("k-unlock")&&(t.owner.unlockColumn(t.field),t.close())})},_updateLockedColumns:function(){var e,t,n,i,o=this.field,r=this.owner.columns,a=c(r,function(e){return e.field==o||e.title==o})[0];a&&(e=a.locked===!0,t=c(r,function(t){return!t.hidden&&(t.locked&&e||!t.locked&&!e)}).length,n=this.wrapper.find(".k-lock").removeClass("k-state-disabled"),i=this.wrapper.find(".k-unlock").removeClass("k-state-disabled"),(e||1==t)&&n.addClass("k-state-disabled"),e&&1!=t||i.addClass("k-state-disabled"),this._updateColumnsLockedState())},refresh:function(){var e,t,n,i=this,o=i.options.dataSource.sort()||[],r=i.field;for(i.wrapper.find(".k-sort-asc, .k-sort-desc").removeClass(h),t=0,n=o.length;n>t;t++)e=o[t],r==e.field&&i.wrapper.find(".k-sort-"+e.dir).addClass(h);i.link[i._filterExist(i.dataSource.filter())?"addClass":"removeClass"]("k-state-active")},_filterExist:function(e){var t,n,i,o=!1;if(e){for(e=e.filters,n=0,i=e.length;i>n;n++)t=e[n],t.field==this.field?o=!0:t.filters&&(o=o||this._filterExist(t));return o}}}),C='
            #if(sortable){#
          • ${messages.sortAscending}
          • ${messages.sortDescending}
          • #if(showColumns || filterable){#
          • #}##}##if(showColumns){#
          • ${messages.columns}
              #for (var idx = 0; idx < columns.length; idx++) {#
            • #=columns[idx].title#
            • #}#
          • #if(filterable || lockedColumns){#
          • #}##}##if(filterable){#
          • ${messages.filter}
          • #if(lockedColumns){#
          • #}##}##if(lockedColumns){#
          • ${messages.lock}
          • ${messages.unlock}
          • #}#
          ',S='
          ${messages.settings}
          • ${title}
              #if(sortable){#
            • ${messages.sortAscending}
            • ${messages.sortDescending}
            • #}##if(lockedColumns){#
            • ${messages.lock}
            • ${messages.unlock}
            • #}##if(filterable){#
            • ${messages.filter}
            • #}#
          • #if(showColumns){#
          • ${messages.columns}
              #for (var idx = 0; idx < columns.length; idx++) {#
            • #}#
          • #}#
          ',T=k.extend({init:function(e,t){k.fn.init.call(this,e,t),this.element.on("click"+y,"li.k-item:not(.k-separator):not(.k-state-disabled)","_click")},events:[v],_click:function(t){e(t.target).is("[type=checkbox]")||t.preventDefault(),this.trigger(v,{item:t.currentTarget})},close:function(){this.options.pane.navigate("")},destroy:function(){k.fn.destroy.call(this),this.element.off(y)}});a.plugin(x)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.columnsorter.min",["kendo.core.min"],e)}(function(){return function(e,t){var n=window.kendo,i=n.ui,o=i.Widget,r="dir",a="asc",s="single",l="field",c="desc",d=".kendoColumnSorter",u=".k-link",h="aria-sort",f=e.proxy,p=o.extend({init:function(e,t){var n,i=this;o.fn.init.call(i,e,t),i._refreshHandler=f(i.refresh,i),i.dataSource=i.options.dataSource.bind("change",i._refreshHandler),n=i.element.find(u),n[0]||(n=i.element.wrapInner('').find(u)),i.link=n,i.element.on("click"+d,f(i._click,i))},options:{name:"ColumnSorter",mode:s,allowUnsort:!0,compare:null,filter:""},events:["change"],destroy:function(){var e=this;o.fn.destroy.call(e),e.element.off(d),e.dataSource.unbind("change",e._refreshHandler),e._refreshHandler=e.element=e.link=e.dataSource=null},refresh:function(){var t,i,o,s,d=this,u=d.dataSource.sort()||[],f=d.element,p=f.attr(n.attr(l));for(f.removeAttr(n.attr(r)),f.removeAttr(h),t=0,i=u.length;i>t;t++)o=u[t],p==o.field&&f.attr(n.attr(r),o.dir);s=f.attr(n.attr(r)),f.find(".k-i-arrow-n,.k-i-arrow-s").remove(),s===a?(e('').appendTo(d.link),f.attr(h,"ascending")):s===c&&(e('').appendTo(d.link),f.attr(h,"descending"))},_click:function(e){var i,o,d=this,u=d.element,h=u.attr(n.attr(l)),f=u.attr(n.attr(r)),p=d.options,m=null===d.options.compare?t:d.options.compare,g=d.dataSource.sort()||[];if(e.preventDefault(),(!p.filter||u.is(p.filter))&&(f=f===a?c:f===c&&p.allowUnsort?t:a,!this.trigger("change",{sort:{field:h,dir:f,compare:m}}))){if(p.mode===s)g=[{field:h,dir:f,compare:m}];else if("multiple"===p.mode){for(i=0,o=g.length;o>i;i++)if(g[i].field===h){g.splice(i,1);break}g.push({field:h,dir:f,compare:m})}this.dataSource.sort(g)}}});i.plugin(p)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.editable.min",["kendo.datepicker.min","kendo.numerictextbox.min","kendo.validator.min","kendo.binder.min"],e)}(function(){return function(e,t){function n(t){return t=null!=t?t:"",t.type||e.type(t)||"string"}function i(t){t.find(":input:not(:button, ["+s.attr("role")+"=upload], ["+s.attr("skip")+"], [type=file]), select").each(function(){var t=s.attr("bind"),n=this.getAttribute(t)||"",i="checkbox"===this.type||"radio"===this.type?"checked:":"value:",o=this.name;-1===n.indexOf(i)&&o&&(n+=(n.length?",":"")+i+o,e(this).attr(t,n))})}function o(e){var t,i,o=(e.model.fields||e.model)[e.field],r=n(o),a=o?o.validation:{},l=s.attr("type"),c=s.attr("bind"),d={name:e.field};for(t in a)i=a[t],p(t,_)>=0?d[l]=t:h(i)||(d[t]=f(i)?i.value||t:i),d[s.attr(t+"-msg")]=i.message;return p(r,_)>=0&&(d[l]=r),d[c]=("boolean"===r?"checked:":"value:")+e.field,d}function r(e){var t,n,i,o,r,a;if(e&&e.length)for(a=[],t=0,n=e.length;n>t;t++)i=e[t],r=i.text||i.value||i,o=null==i.value?i.text||i:i.value,a[t]={text:r,value:o};return a}function a(e,t){var n,i,o=e?e.validation||{}:{};for(n in o)i=o[n],f(i)&&i.value&&(i=i.value),h(i)&&(t[n]=i)}var s=window.kendo,l=s.ui,c=l.Widget,d=e.extend,u=s.support.browser.msie&&9>s.support.browser.version,h=s.isFunction,f=e.isPlainObject,p=e.inArray,m=/("|\%|'|\[|\]|\$|\.|\,|\:|\;|\+|\*|\&|\!|\#|\(|\)|<|>|\=|\?|\@|\^|\{|\}|\~|\/|\||`)/g,g='
          #=message#
          ',v="change",_=["url","email","number","date","boolean"],b={number:function(t,n){var i=o(n);e('').attr(i).appendTo(t).kendoNumericTextBox({format:n.format}),e("').hide().appendTo(t)},date:function(t,n){var i=o(n),r=n.format;r&&(r=s._extractFormat(r)),i[s.attr("format")]=r,e('').attr(i).appendTo(t).kendoDatePicker({format:n.format}),e("').hide().appendTo(t)},string:function(t,n){var i=o(n);e('').attr(i).appendTo(t)},"boolean":function(t,n){var i=o(n);e('').attr(i).appendTo(t)},values:function(t,n){var i=o(n),a=s.stringify(r(n.values));e("
          ",indent:function(e){return e.replace(/<\/(p|li|ul|ol|h[1-6]|table|tr|td|th)>/gi,"\n").replace(/<(ul|ol)([^>]*)>
        • \n/gi,"
          \n").replace(/\n$/,"")}}),n.ui.editor.ViewHtmlCommand=c,o.EditorUtils.registerTool("viewHtml",new s({command:c,template:new l({template:r.buttonTemplate,title:"View HTML"})}))}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("editor/formatting.min",["editor/viewhtml.min"],e)}(function(){!function(e){function t(e){var t,o,r=l.closestEditableOfType(e,["li"]);r&&(t=new i.ListFormatter(l.name(r.parentNode)),o=n.ui.editor.W3CRange.fromNode(e),o.selectNode(r),t.toggle(o))}var n=window.kendo,i=n.ui.editor,o=i.Tool,r=i.ToolTemplate,a=i.DelayedExecutionTool,s=i.Command,l=i.Dom,c=i.EditorUtils,d=i.RangeUtils,u=c.registerTool,h=a.extend({init:function(e){var t=this;o.fn.init.call(t,n.deepExtend({},t.options,e)),t.type="kendoSelectBox",t.finder={getFormat:function(){return""}}},options:{items:[{text:"Paragraph",value:"p"},{text:"Quotation",value:"blockquote"},{text:"Heading 1",value:"h1"},{text:"Heading 2",value:"h2"},{text:"Heading 3",value:"h3"},{text:"Heading 4",value:"h4"},{text:"Heading 5",value:"h5"},{text:"Heading 6",value:"h6"}],width:110},toFormattingItem:function(e){var t,n=e.value;return n?e.tag||e.className?e:(t=n.indexOf("."),0===t?e.className=n.substring(1):-1==t?e.tag=n:(e.tag=n.substring(0,t),e.className=n.substring(t+1)),e):e},command:function(t){var n=this,o=t.value;return o=this.toFormattingItem(o),new i.FormatCommand({range:t.range,formatter:function(){var t,r=(o.tag||o.context||"span").split(","),a=[{tags:r,attr:{className:o.className||""}}];return t=e.inArray(r[0],l.inlineElements)>=0?new i.GreedyInlineFormatter(a):new i.GreedyBlockFormatter(a),t.editor=n.editor,t}})},initialize:function(e,t){var i=t.editor,r=this.options,a=r.name,s=this;s.editor=i,e.width(r.width),e.kendoSelectBox({dataTextField:"text",dataValueField:"value",dataSource:r.items||i.options[a],title:i.options.messages[a],autoSize:!0,change:function(){var e=this.dataItem();e&&o.exec(i,a,e.toJSON())},dataBound:function(){var e,t=this.dataSource.data();for(e=0;t.length>e;e++)t[e]=s.toFormattingItem(t[e])},highlightFirst:!1,template:n.template('#:data.text#')}),e.addClass("k-decorated").closest(".k-widget").removeClass("k-"+a).find("*").addBack().attr("unselectable","on")},getFormattingValue:function(t,n){var i,o,r,a,s,l,c;for(i=0;t.length>i;i++)if(o=t[i],r=o.tag||o.context||"",a=o.className?"."+o.className:"",s=r+a,l=e(n[0]).closest(s)[0]){if(1==n.length)return o.value;for(c=1;n.length>c&&e(n[c]).closest(s)[0];c++)if(c==n.length-1)return o.value}return""},update:function(t,n){var i,o,r,s,c,d=e(t).data(this.type);if(d&&(i=d.dataSource,o=i.data(),c=l.commonAncestor.apply(null,n),c==l.closestEditable(c)||this._ancestor!=c)){for(this._ancestor=c,r=0;o.length>r;r++)s=o[r].context,o[r].visible=!s||!!e(c).closest(s).length;i.filter([{field:"visible",operator:"eq",value:!0}]),a.fn.update.call(this,t,n),d.value(this.getFormattingValue(i.view(),n)),d.wrapper.toggleClass("k-state-disabled",!i.view().length)}},destroy:function(){this._ancestor=null}}),f=s.extend({exec:function(){var e,t,n,i=this.lockRange(!0);for(this.tagsToClean=this.options.remove||"strong,em,span,sup,sub,del,b,i,u,font".split(","),d.wrapSelectedElements(i),e=d.mapAll(i,function(e){return e}),t=e.length-1;t>=0;t--)n=e[t],this.immutableParent(n)||this.clean(n);this.releaseRange(i)},clean:function(n){var o,r,a,s,c;if(n&&!l.isMarker(n)){if(o=l.name(n),"ul"==o||"ol"==o)for(r=new i.ListFormatter(o),a=n.previousSibling,s=n.nextSibling,r.unwrap(n);a&&a!=s;a=a.nextSibling)this.clean(a);else if("blockquote"==o)l.changeTag(n,"p");else if(1!=n.nodeType||l.insignificant(n))t(n);else{for(c=n.childNodes.length-1;c>=0;c--)this.clean(n.childNodes[c]);n.removeAttribute("style"),n.removeAttribute("class")}e.inArray(o,this.tagsToClean)>-1&&l.unwrap(n)}},immutableParent:function(e){return this.immutables()&&i.Immutables.immutableParent(e)}});e.extend(i,{FormattingTool:h,CleanFormatCommand:f}),u("formatting",new h({template:new r({template:c.dropDownListTemplate,title:"Format"})})),u("cleanFormatting",new o({command:f,template:new r({template:c.buttonTemplate,title:"Clean formatting"})}))}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("editor/toolbar.min",["editor/formatting.min"],e)}(function(){!function(e,t){var n,i=window.kendo,o=i.ui,r=o.editor,a=o.Widget,s=e.extend,l=e.proxy,c=i.keys,d=".kendoEditor",u=i.ui.editor.EditorUtils,h=i.ui.editor.ToolTemplate,f=i.ui.editor.Tool,p="overflowAnchor",m=".k-tool-group:visible a.k-tool:not(.k-state-disabled),.k-tool.k-overflow-anchor,.k-tool-group:visible .k-widget.k-colorpicker,.k-tool-group:visible .k-selectbox,.k-tool-group:visible .k-dropdown,.k-tool-group:visible .k-combobox .k-input",g=f.extend({initialize:function(t,n){t.attr({unselectable:"on"});var i=n.editor.toolbar;t.on("click",e.proxy(function(){this.overflowPopup.toggle()},i))},options:{name:p},command:e.noop,update:e.noop,destroy:e.noop});u.registerTool(p,new g({key:"",ctrl:!0,template:new h({template:u.overflowAnchorTemplate})})),n=a.extend({init:function(e,t){var n=this;t=s({},t,{name:"EditorToolbar"}),a.fn.init.call(n,e,t),t.popup&&n._initPopup(),t.resizable&&t.resizable.toolbar&&(n._resizeHandler=i.onResize(function(){n.resize()}),n.element.addClass("k-toolbar-resizable"))},events:["execute"],groups:{basic:["bold","italic","underline","strikethrough"],scripts:["subscript","superscript"],alignment:["justifyLeft","justifyCenter","justifyRight","justifyFull"],links:["insertImage","insertFile","createLink","unlink"],lists:["insertUnorderedList","insertOrderedList","indent","outdent"],tables:["createTable","addColumnLeft","addColumnRight","addRowAbove","addRowBelow","deleteRow","deleteColumn"],advanced:["viewHtml","cleanFormatting","print","pdf"],fonts:["fontName","fontSize"],colors:["foreColor","backColor"]},overflowFlaseTools:["formatting","fontName","fontSize","foreColor","backColor","insertHtml"],_initPopup:function(){this.window=e(this.element).wrap("
          ").parent().prepend("").kendoWindow({ +title:!1,resizable:!1,draggable:{dragHandle:".k-editortoolbar-dragHandle"},animation:{open:{effects:"fade:in"},close:{effects:"fade:out"}},minHeight:42,visible:!1,autoFocus:!1,actions:[],dragend:function(){this._moved=!0}}).on("mousedown",function(t){e(t.target).is(".k-icon")||t.preventDefault()}).data("kendoWindow")},_toggleOverflowStyles:function(e,t){e.find("li").toggleClass("k-item k-state-default",t).find(".k-tool:not(.k-state-disabled),.k-overflow-button").toggleClass("k-overflow-button k-button",t)},_initOverflowPopup:function(t){var n=this,i="
            ";n.overflowPopup=e(i).appendTo("body").kendoPopup({anchor:t,origin:"bottom right",position:"top right",copyAnchorStyles:!1,open:function(e){this.element.is(":empty")&&e.preventDefault(),n._toggleOverflowStyles(this.element,!0)},activate:l(n.focusOverflowPopup,n)}).data("kendoPopup")},items:function(){var e,t,n=this.options.resizable&&this.options.resizable.toolbar;return t=this.element.children().find("> *, select"),n&&(e=this.overflowPopup,t=t.add(e.element.children().find("> *"))),t},focused:function(){return this.element.find(".k-state-focused").length>0},toolById:function(e){var t,n=this.tools;for(t in n)if(t.toLowerCase()==e)return n[t]},toolGroupFor:function(t){var n,i=this.groups;if(this.isCustomTool(t))return"custom";for(n in i)if(e.inArray(t,i[n])>=0)return n},bindTo:function(t){var n=this,i=n.window;n._editor&&n._editor.unbind("select",l(n.resize,n)),n._editor=t,n.options.resizable&&n.options.resizable.toolbar&&t.options.tools.push(p),n.tools=n.expandTools(t.options.tools),n.render(),n.element.find(".k-combobox .k-input").keydown(function(t){var n=e(this).closest(".k-combobox").data("kendoComboBox"),i=t.keyCode;i==c.RIGHT||i==c.LEFT?n.close():i==c.DOWN&&(n.dropDown.isOpened()||(t.stopImmediatePropagation(),n.open()))}),n._attachEvents(),n.items().each(function(){var i,o=n._toolName(this),r="more"!==o?n.tools[o]:n.tools.overflowAnchor,a=r&&r.options,s=t.options.messages,l=a&&a.tooltip||s[o],c=e(this);r&&r.initialize&&("fontSize"!=o&&"fontName"!=o||(i=s[o+"Inherit"],c.find("input").val(i).end().find("span.k-input").text(i).end()),r.initialize(c,{title:n._appendShortcutSequence(l,r),editor:n._editor}),c.closest(".k-widget",n.element).addClass("k-editor-widget"),c.closest(".k-colorpicker",n.element).next(".k-colorpicker").addClass("k-editor-widget"))}),t.bind("select",l(n.resize,n)),n.update(),i&&i.wrapper.css({top:"",left:"",width:""})},show:function(){var e,t,n,i=this,o=i.window,r=i.options.editor;o&&(e=o.wrapper,t=r.element,e.is(":visible")&&i.window.options.visible||(e[0].style.width||e.width(t.outerWidth()-parseInt(e.css("border-left-width"),10)-parseInt(e.css("border-right-width"),10)),o._moved||(n=t.offset(),e.css({top:Math.max(0,parseInt(n.top,10)-e.outerHeight()-parseInt(i.window.element.css("padding-bottom"),10)),left:Math.max(0,parseInt(n.left,10))})),o.open()))},hide:function(){this.window&&this.window.close()},focus:function(){var e="tabIndex",t=this.element,n=this._editor.element.attr(e);t.attr(e,n||0).focus().find(m).first().focus(),n||0===n||t.removeAttr(e)},focusOverflowPopup:function(){var e="tabIndex",t=this.overflowPopup.element,n=this._editor.element.attr(e);t.closest(".k-animation-container").addClass("k-overflow-wrapper"),t.attr(e,n||0).find(m).first().focus(),n||0===n||t.removeAttr(e)},_appendShortcutSequence:function(e,t){if(!t.key)return e;var n=e+" (";return t.ctrl&&(n+="Ctrl + "),t.shift&&(n+="Shift + "),t.alt&&(n+="Alt + "),n+=t.key+")"},_nativeTools:["insertLineBreak","insertParagraph","redo","undo","autoLink"],tools:{},isCustomTool:function(e){return!(e in i.ui.Editor.defaultTools)},expandTools:function(t){var n,o,a,l,c=this._nativeTools,d=i.deepExtend({},i.ui.Editor.defaultTools),u={};for(o=0;t.length>o;o++)n=t[o],l=n.name,e.isPlainObject(n)?l&&d[l]?(u[l]=s({},d[l]),s(u[l].options,n)):(a=s({cssClass:"k-i-custom",type:"button",title:""},n),a.name||(a.name="custom"),a.cssClass="k-"+a.name,a.template||"button"!=a.type||(a.template=r.EditorUtils.buttonTemplate,a.title=a.title||a.tooltip),u[l]={options:a}):d[n]&&(u[n]=d[n]);for(o=0;c.length>o;o++)u[c[o]]||(u[c[o]]=d[c[o]]);return u},render:function(){function t(t){var n;return t.getHtml?n=t.getHtml():(e.isFunction(t)||(t=i.template(t)),n=t(r)),e.trim(n)}function n(){h.children().length&&(k&&(h.data("position",y),y++),h.appendTo(_))}function o(t){t!==p?(h=e("
          • "),h.data("overflow",-1===e.inArray(t,x))):h=e("
          • ")}var r,a,s,c,d,u,h,f,m=this,g=m.tools,v=m._editor.element,_=m.element.empty(),b=m._editor.options.tools,w=i.support.browser,y=0,k=m.options.resizable&&m.options.resizable.toolbar,x=this.overflowFlaseTools;for(_.empty(),b.length&&(c=b[0].name||b[0]),o(c,x),f=0;b.length>f;f++)c=b[f].name||b[f],r=g[c]&&g[c].options,!r&&e.isPlainObject(c)&&(r=c),a=r&&r.template,"break"==c&&(n(),e("
          • ").appendTo(m.element),o(c,x)),a&&(u=m.toolGroupFor(c),d==u&&c!=p||(n(),o(c,x),d=u),a=t(a),s=e(a).appendTo(h),"custom"==u&&(n(),o(c,x)),r.exec&&s.hasClass("k-tool")&&s.click(l(r.exec,v[0])));n(),e(m.element).children(":has(> .k-tool)").addClass("k-button-group"),m.options.popup&&w.msie&&9>w.version&&m.window.wrapper.find("*").attr("unselectable","on"),m.updateGroups(),k&&m._initOverflowPopup(m.element.find(".k-overflow-anchor")),m.angular("compile",function(){return{elements:m.element}})},updateGroups:function(){e(this.element).children().each(function(){e(this).children().filter(function(){return!e(this).hasClass("k-state-disabled")}).removeClass("k-group-end").first().addClass("k-group-start").end().last().addClass("k-group-end").end()})},decorateFrom:function(t){this.items().filter(".k-decorated").each(function(){var n=e(this).data("kendoSelectBox");n&&n.decorate(t)})},destroy:function(){a.fn.destroy.call(this);var e,t=this.tools;for(e in t)t[e].destroy&&t[e].destroy();this.window&&this.window.destroy(),this._resizeHandler&&i.unbindResize(this._resizeHandler),this.overflowPopup&&this.overflowPopup.destroy()},_attachEvents:function(){var t=this,n=t.overflowPopup?t.overflowPopup.element:e([]);t.attachToolsEvents(t.element.add(n))},attachToolsEvents:function(t){var n=this,i="[role=button].k-tool",o=i+":not(.k-state-disabled)",r=i+".k-state-disabled";t.off(d).on("mouseenter"+d,o,function(){e(this).addClass("k-state-hover")}).on("mouseleave"+d,o,function(){e(this).removeClass("k-state-hover")}).on("mousedown"+d,i,function(e){e.preventDefault()}).on("keydown"+d,m,function(t){function i(e,t,n){var i=t.find(m),o=i.index(a)+e;return n&&(o=Math.max(0,Math.min(i.length-1,o))),i[o]}var o,r,a=this,s=n.options.resizable&&n.options.resizable.toolbar,l=t.keyCode;l==c.RIGHT||l==c.LEFT?e(a).hasClass(".k-dropdown")||(o=i(l==c.RIGHT?1:-1,n.element,!0)):!s||l!=c.UP&&l!=c.DOWN?l==c.ESC?(n.overflowPopup&&n.overflowPopup.visible()&&n.overflowPopup.close(),o=n._editor):l!=c.TAB||t.ctrlKey||t.altKey||(r=s&&e(a.parentElement).hasClass("k-overflow-tool-group")?n.overflowPopup.element:n.element,t.shiftKey?o=i(-1,r):(o=i(1,r),o||(o=n._editor))):o=i(l==c.DOWN?1:-1,n.overflowPopup.element,!0),o&&(t.preventDefault(),o.focus())}).on("click"+d,o,function(t){var i=e(this);t.preventDefault(),t.stopPropagation(),i.removeClass("k-state-hover"),i.is("[data-popup]")||n._editor.exec(n._toolName(this))}).on("click"+d,r,function(e){e.preventDefault()})},_toolName:function(t){var n,o,r;if(t)return n=t.className,/k-tool\b/i.test(n)&&(n=t.firstChild.className),o=e.grep(n.split(" "),function(e){return!/^k-(widget|tool|tool-icon|icon|state-hover|header|combobox|dropdown|selectbox|colorpicker)$/i.test(e)}),o[0]?(r=o[0],r.indexOf("k-i-")>=0?i.toCamelCase(r.substring(r.indexOf("k-i-")+4)):r.substring(r.lastIndexOf("-")+1)):"custom"},refreshTools:function(){var t=this,n=i.ui.editor,o=t._editor,r=o.getRange(),a=n.RangeUtils.textNodes(r),s=o.options.immutables,l=t._immutablesContext(r);a=n.Dom.filterBy(a,n.Dom.htmlIndentSpace,!0),a.length||(a=[r.startContainer]),t.items().each(function(){var n,i=t.tools[t._toolName(this)];i&&(n=e(this),i.update&&i.update(n,a),s&&t._updateImmutablesState(i,n,l))}),this.update()},_immutablesContext:function(e){if(this._editor.options.immutables){var t=i.ui.editor;return e.collapsed?t.Immutables.immutablesContext(e):0===t.RangeUtils.editableTextNodes(e).length}},_updateImmutablesState:function(n,i,o){var a,s,l,c,d,u=n.name,h=i,f=n.options.trackImmutables;if(f===t&&(f=e.inArray(u,r.Immutables.toolsToBeUpdated)>-1),f){if(a=o?"none":"",!i.is(".k-tool")){s=i.data();for(l in s)if(l.match(/^kendo[A-Z][a-zA-Z]*/)){c=s[l],h=c.wrapper;break}}h.css("display",a),d=h.closest("li"),0===d.children(":visible").length&&d.css("display",a)}},update:function(){this.updateGroups()},_resize:function(e){var t=e.width,n=this.options.resizable&&this.options.resizable.toolbar,i=this.overflowPopup;this.refreshTools(),n&&(i.visible()&&i.close(!0),this._refreshWidths(),this._shrink(t),this._stretch(t),this._toggleOverflowStyles(this.element,!1),this._toggleOverflowStyles(this.overflowPopup.element,!0),this.element.children("li.k-overflow-tools").css("visibility",i.element.is(":empty")?"hidden":"visible"))},_refreshWidths:function(){this.element.children("li").each(function(t,n){var i=e(n);i.data("outerWidth",i.outerWidth(!0))})},_shrink:function(e){var t,n,i;if(e=0&&(t=n.eq(i),!(e>this._groupsWidth()));i--)this._hideGroup(t)},_stretch:function(e){var t,n,i;if(e>this._groupsWidth())for(n=this._hiddenGroups(),i=0;n.length>i&&(t=n.eq(i),!(ee(n).data("position")?1:-1}),n},_visibleGroups:function(){return this.element.children("li.k-tool-group, li.k-overflow-tools").filter(":visible")},_groupsWidth:function(){var t=0;return this._visibleGroups().each(function(){t+=e(this).data("outerWidth")}),Math.ceil(t)},_hideGroup:function(e){if(e.data("overflow")){var t=this.overflowPopup;e.detach().prependTo(t.element).addClass("k-overflow-tool-group")}else e.hide()},_showGroup:function(t,n){var i,o;return t.length&&n>this._groupsWidth()+t.data("outerWidth")?(t.hasClass("k-overflow-tool-group")?(i=t.data("position"),0===i?t.detach().prependTo(this.element):(o=this.element.children().filter(function(t,n){return e(n).data("position")===i-1}),t.detach().insertAfter(o)),t.removeClass("k-overflow-tool-group")):t.show(),!0):!1}}),e.extend(r,{Toolbar:n})}(window.jQuery||window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("editor/tables.min",["editor/toolbar.min"],e)}(function(){!function(e,t){var n=window.kendo,i=e.extend,o=e.proxy,r=n.ui.editor,a=r.Dom,s=r.EditorUtils,l=r.RangeUtils,c=r.Command,d="kendoEditor",u="k-state-active",h="k-state-selected",f=r.Tool,p=r.ToolTemplate,m=r.InsertHtmlCommand,g=r.BlockFormatFinder,v=r.EditorUtils.registerTool,_=n.getTouches,b=n.template,w="#=content#",y=new g([{tags:["table"]}]),k=m.extend({init:function(t){var n=e.extend({postProcess:this.postProcess,skipCleaners:!0},t||{});m.fn.init.call(this,n)},_tableHtml:function(e,t){var n,i;return e=e||1,t=t||1,n=b(w)({width:100/t,content:r.emptyTableCellContent}),i=100/e,""+Array(e+1).join(""+Array(t+1).join(n)+"")+"
            "},postProcess:function(t,n){var i=e("table[data-last]",t.document).removeAttr("data-last");n.setStart(i.find("td")[0],0),n.collapse(!0),t.selectRange(n)},exec:function(){var e=this.options;e.html=this._tableHtml(e.rows,e.columns),m.fn.exec.call(this)}}),x=f.extend({initialize:function(t,n){var i,a,l,c;f.fn.initialize.call(this,t,n),i=e(this.options.popupTemplate).appendTo("body").kendoPopup({anchor:t,copyAnchorStyles:!1,open:o(this._open,this),activate:o(this._activate,this),close:o(this._close,this)}).data("kendoPopup"),t.click(o(this._toggle,this)).keydown(o(this._keydown,this)),a=this._editor=n.editor,this._popup=i,l=new r.TableWizardTool({command:r.TableWizardCommand,insertNewTable:!0,template:new p({template:s.buttonTemplate,title:"Table Wizard"})}),v("tableWizardInsert",l),c=e("
            "+l.options.template.getHtml()+"
            "),c.appendTo(i.element),a.toolbar&&a.toolbar.attachToolsEvents(c)},popup:function(){return this._popup},_activate:e.noop,_open:function(){this._popup.options.anchor.addClass(u)},_close:function(){this._popup.options.anchor.removeClass(u)},_keydown:function(e){var t=n.keys,i=e.keyCode;i==t.DOWN&&e.altKey?this._popup.open():i==t.ESC&&this._popup.close()},_toggle:function(t){var n=e(t.target).closest(".k-tool");n.hasClass("k-state-disabled")||this.popup().toggle()},update:function(e){var t=this.popup();t.wrapper&&"block"==t.wrapper.css("display")&&t.close(),e.removeClass("k-state-hover")},destroy:function(){this._popup.destroy()}}),C=x.extend({init:function(t){this.cols=8,this.rows=6,x.fn.init.call(this,e.extend(t,{command:k,popupTemplate:"
            "+Array(this.cols*this.rows+1).join("")+"
            "}))},_activate:function(){function t(t){var n=e(window);return{row:Math.floor((t.clientY+n.scrollTop()-u.top)/o)+1,col:Math.floor((t.clientX+n.scrollLeft()-u.left)/i)+1}}var i,o,r=this,a=r._popup.element,s=a.find(".k-ct-cell"),l=s.eq(0),c=s.eq(s.length-1),u=n.getOffset(l),h=n.getOffset(c),f=r.cols,p=r.rows;a.find("*").addBack().attr("unselectable","on"),h.left+=c[0].offsetWidth,h.top+=c[0].offsetHeight,i=(h.left-u.left)/f,o=(h.top-u.top)/p,a.autoApplyNS(d).on("mousemove",function(e){r._setTableSize(t(e))}).on("mouseleave",function(){r._setTableSize()}).on("down",function(e){e.preventDefault();var n=_(e)[0];r._exec(t(n.location))})},_valid:function(e){return e&&e.row>0&&e.col>0&&this.rows>=e.row&&this.cols>=e.col},_exec:function(e){this._valid(e)&&(this._editor.exec("createTable",{rows:e.row,columns:e.col}),this._popup.close())},_setTableSize:function(t){var i=this._popup.element,o=i.find(".k-status"),r=i.find(".k-ct-cell"),a=this.cols,s=this._editor.options.messages;this._valid(t)?(o.text(n.format(s.createTableHint,t.row,t.col)),r.each(function(n){e(this).toggleClass(h,t.col>n%a&&t.row>n/a)})):(o.text(s.dialogCancel),r.removeClass(h))},_keydown:function(e){var t,i,o,r,a,s,l,c;x.fn._keydown.call(this,e),this._popup.visible()&&(t=n.keys,i=e.keyCode,o=this._popup.element.find(".k-ct-cell"),r=Math.max(o.filter(".k-state-selected").last().index(),0),a=Math.floor(r/this.cols),s=r%this.cols,l=!1,i!=t.DOWN||e.altKey?i==t.UP?(l=!0,a--):i==t.RIGHT?(l=!0,s++):i==t.LEFT&&(l=!0,s--):(l=!0,a++),c={row:Math.max(1,Math.min(this.rows,a+1)),col:Math.max(1,Math.min(this.cols,s+1))},i==t.ENTER?this._exec(c):this._setTableSize(c),l&&(e.preventDefault(),e.stopImmediatePropagation()))},_open:function(){var e=this._editor.options.messages;x.fn._open.call(this),this.popup().element.find(".k-status").text(e.dialogCancel).end().find(".k-ct-cell").removeClass(h)},_close:function(){x.fn._close.call(this),this.popup().element.off("."+d)}}),S=c.extend({exec:function(){for(var e,t,n,i,o=this.lockRange(!0),s=o.endContainer;"td"!=a.name(s);)s=s.parentNode;if(!this.immutables()||!r.Immutables.immutableParent(s)){for(t=s.parentNode,e=t.children.length,n=t.cloneNode(!0),i=0;t.cells.length>i;i++)n.cells[i].innerHTML=r.emptyTableCellContent;"before"==this.options.position?a.insertBefore(n,t):a.insertAfter(n,t),this.releaseRange(o)}}}),T=c.extend({exec:function(){var e,t,n,i,o=this.lockRange(!0),s=a.closest(o.endContainer,"td"),l=a.closest(s,"table"),c=l.rows,d=this.options.position;if(!this.immutables()||!r.Immutables.immutableParent(s)){for(e=a.findNodeIndex(s,!0),t=0;c.length>t;t++)n=c[t].cells[e],i=n.cloneNode(),i.innerHTML=r.emptyTableCellContent,"before"==d?a.insertBefore(i,n):a.insertAfter(i,n);this.releaseRange(o)}}}),D=c.extend({exec:function(){var t,n,i,o=this.lockRange(),s=l.mapAll(o,function(t){return e(t).closest("tr")[0]}),c=s[0];if(!this.immutables()||!r.Immutables.immutableParent(c)){if(t=a.closest(c,"table"),s.length>=t.rows.length)n=a.next(t),n&&!a.insignificant(n)||(n=a.prev(t)),a.remove(t);else for(i=0;s.length>i;i++)c=s[i],a.removeTextSiblings(c),n=a.next(c)||a.prev(c),n=n.cells[0],a.remove(c);n&&(o.setStart(n,0),o.collapse(!0),this.editor.selectRange(o))}}}),A=c.extend({exec:function(){var e,t,n=this.lockRange(),i=a.closest(n.endContainer,"td"),o=a.closest(i,"table"),s=o.rows,l=a.findNodeIndex(i,!0),c=s[0].cells.length;if(!this.immutables()||!r.Immutables.immutableParent(i)){if(1==c)e=a.next(o),e&&!a.insignificant(e)||(e=a.prev(o)),a.remove(o);else for(a.removeTextSiblings(i),e=a.next(i)||a.prev(i),t=0;s.length>t;t++)a.remove(s[t].cells[l]);e&&(n.setStart(e,0),n.collapse(!0),this.editor.selectRange(n))}}}),E=f.extend({command:function(e){return e=i(e,this.options),"delete"==e.action?"row"==e.type?new D(e):new A(e):"row"==e.type?new S(e):new T(e)},initialize:function(e,t){f.fn.initialize.call(this,e,t),e.addClass("k-state-disabled")},update:function(e,t){var n=!y.isFormatted(t);e.toggleClass("k-state-disabled",n)}});i(n.ui.editor,{PopupTool:x,TableCommand:k,InsertTableTool:C,TableModificationTool:E,InsertRowCommand:S,InsertColumnCommand:T,DeleteRowCommand:D,DeleteColumnCommand:A}),v("createTable",new C({template:new p({template:s.buttonTemplate,popup:!0,title:"Create table"})})),v("addColumnLeft",new E({type:"column",position:"before",template:new p({template:s.buttonTemplate,title:"Add column on the left"})})),v("addColumnRight",new E({type:"column",template:new p({template:s.buttonTemplate,title:"Add column on the right"})})),v("addRowAbove",new E({type:"row",position:"before",template:new p({template:s.buttonTemplate,title:"Add row above"})})),v("addRowBelow",new E({type:"row",template:new p({template:s.buttonTemplate,title:"Add row below"})})),v("deleteRow",new E({type:"row",action:"delete",template:new p({template:s.buttonTemplate,title:"Delete row"})})),v("deleteColumn",new E({type:"column",action:"delete",template:new p({template:s.buttonTemplate,title:"Delete column"})}))}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("editor/resizing/resizing-utils.min",["editor/main.min"],e)}(function(){!function(e,t){function n(e){var t=e.value,n=e.min,i=e.max;return f(h(p(t),p(i)),p(n))}function i(t){return!m(t).is("body")&&t.scrollHeight>t.clientHeight?e.support.scrollbar():0}function o(e,t){return r(e)?p(e):p(e)/t*100}function r(e){return typeof e===x&&y.test(e)}function a(e){return typeof e===x&&k.test(e)}function s(e){return p(e)+b}function l(e){return p(e)+w}function c(e,t){var n=m(e);n&&typeof n.attr(_)!==C&&n.attr(_,t)}var d=window,u=d.Math,h=u.min,f=u.max,p=d.parseFloat,m=e.jQuery,g=m.extend,v=e.ui.editor,_="contenteditable",b="%",w="px",y=/(\d+)(\.?)(\d*)%/,k=/(\d+)(\.?)(\d*)px/,x="string",C="undefined",S={constrain:n,getScrollBarWidth:i,calculatePercentageRatio:o,inPercentages:r,inPixels:a,setContentEditable:c,toPercentages:s,toPixels:l};g(v,{ResizingUtils:S})}(window.kendo)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("editor/resizing/table-element-resizing.min",["editor/main.min","kendo.resizable.min","editor/resizing/resizing-utils.min"],e)}(function(){!function(e,t){var n=e.jQuery,i=n.extend,o=n.noop,r=n.proxy,a=e.ui.editor,s=e.Class,l=a.ResizingUtils,c=l.setContentEditable,d="mousedown",u="mouseenter",h="mouseleave",f="mousemove",p="mouseup",m=",",g=".",v=":last-child",_="table",b="true",w="false",y=s.extend({init:function(e,t){var o=this;o.options=i({},o.options,t),o.options.tags=n.isArray(o.options.tags)?o.options.tags:[o.options.tags],n(e).is(_)&&(o.element=e,n(e).on(f+o.options.eventNamespace,o.options.tags.join(m),r(o.detectElementBorderHovering,o)))},destroy:function(){var e=this;e.element&&(n(e.element).off(e.options.eventNamespace),e.element=null),e._destroyResizeHandle()},options:{tags:[],min:0,rootElement:null,eventNamespace:"",rtl:!1,handle:{dataAttribute:"",height:0,width:0,classNames:{},template:""}},resizingInProgress:function(){var e=this,t=e._resizable;return t?!!t.resizing:!1},resize:o,detectElementBorderHovering:function(e){var t=this,i=t.options,o=i.handle,r=n(e.currentTarget),a=t.resizeHandle,s=i.rootElement,l=o.dataAttribute;t.resizingInProgress()||(!r.is(v)&&t.elementBorderHovered(r,e)?a?a.data(l)&&a.data(l)!==r[0]&&t.showResizeHandle(r,e):t.showResizeHandle(r,e):a&&(c(s,b),t._destroyResizeHandle()))},elementBorderHovered:o,showResizeHandle:function(e,t){var n=this;0===t.buttons&&(c(n.options.rootElement,w),n._initResizeHandle(),n.setResizeHandlePosition(e),n.setResizeHandleDimensions(),n.setResizeHandleDataAttributes(e[0]),n.attachResizeHandleEventHandlers(),n._initResizable(e),n._hideResizeMarker(),n.resizeHandle.show())},_initResizeHandle:function(){var e=this,t=e.options;e._destroyResizeHandle(),e.resizeHandle=n(t.handle.template).appendTo(t.rootElement)},setResizeHandlePosition:o,setResizeHandleDimensions:o,setResizeHandleDataAttributes:function(e){var t=this;t.resizeHandle.data(t.options.handle.dataAttribute,e)},attachResizeHandleEventHandlers:function(){var e=this,t=e.options,n=t.eventNamespace,i=t.handle.classNames.marker,o=e.resizeHandle;e.resizeHandle.on(d+n,function(){o.find(g+i).show()}).on(p+n,function(){o.find(g+i).hide()})},_hideResizeMarker:function(){var e=this;e.resizeHandle.find(g+e.options.handle.classNames.marker).hide()},_destroyResizeHandle:function(){var e=this;e.resizeHandle&&(e._destroyResizable(),e.resizeHandle.off(e.options.eventNamespace).remove(),e.resizeHandle=null)},_initResizable:function(t){var n=this;n.resizeHandle&&(n._destroyResizable(),n._resizable=new e.ui.Resizable(t,{draggableElement:n.resizeHandle[0],resize:r(n.onResize,n),resizeend:r(n.onResizeEnd,n)}))},_destroyResizable:function(){var e=this;e._resizable&&(e._resizable.destroy(),e._resizable=null)},onResize:function(e){this.setResizeHandleDragPosition(e)},setResizeHandleDragPosition:o,onResizeEnd:function(e){var t=this;t.resize(e),t._destroyResizeHandle(),c(t.options.rootElement,b)},_forceResize:function(e){var t=this._resizable;t&&t.userEvents&&t.userEvents._end(e)}}),k=s.extend({create:function(e,t){var i=this,o=t.name,r=t.eventNamespace;n(e.body).on(u+r,_,function(n){var r=n.currentTarget,a=e[o];n.stopPropagation(),a?a.element===r||a.resizingInProgress()||(i._destroyResizing(e,t),i._initResizing(e,r,t)):i._initResizing(e,r,t)}).on(h+r,_,function(r){var a,s=e[o];r.stopPropagation(),!s||s.resizingInProgress()||s.resizeHandle||(a=n(s.element).parents(_)[0],a&&(i._destroyResizing(e,t),i._initResizing(e,a,t)))}).on(h+r,function(){var n=e[o];n&&!n.resizingInProgress()&&i._destroyResizing(e,t)}).on(p+r,function(r){var a,s=e[o];s&&s.resizingInProgress()&&(a=n(r.target).parents(_)[0],a&&(s._forceResize(r),i._destroyResizing(e,t),i._initResizing(e,a,t)))})},_initResizing:function(t,n,i){var o=i.name,r=i.type;t[o]=new r(n,{rtl:e.support.isRtl(t.element),rootElement:t.body})},_destroyResizing:function(e,t){var n=t.name;e[n]&&(e[n].destroy(),e[n]=null)}});k.current=new k,y.create=function(e,t){k.current.create(e,t)},i(a,{TableElementResizing:y})}(window.kendo)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("editor/resizing/column-resizing.min",["editor/main.min","editor/resizing/resizing-utils.min","editor/resizing/table-element-resizing.min"],e)}(function(){!function(e,t){var n=window,i=n.Math,o=i.abs,r=e.jQuery,a=r.extend,s=e.ui.editor,l=s.TableElementResizing,c=s.ResizingUtils,d=c.constrain,u=c.calculatePercentageRatio,h=c.getScrollBarWidth,f=c.inPercentages,p=c.toPercentages,m=c.toPixels,g=".kendoEditorColumnResizing",v="k-column-resize-handle",_="k-column-resize-marker",b="body",w="tbody",y="td",k="th",x="tr",C=",",S="width",T=l.extend({options:{tags:[y,k],min:20,rootElement:null,eventNamespace:g,rtl:!1,handle:{dataAttribute:"column",width:10,height:0,classNames:{handle:v,marker:_},template:'
            '}},elementBorderHovered:function(e,t){var n=this,i=n.options,o=i.handle.width,a=e.offset().left+(i.rtl?0:e.outerWidth()),s=t.clientX+r(e[0].ownerDocument).scrollLeft();return s>a-o&&a+o>s},setResizeHandlePosition:function(e){var t=this,n=r(t.element).children(w),i=t.options,o=i.rtl,a=i.handle.width,s=r(i.rootElement),l=s.is(b)?0:s.scrollTop(),c=s.is(b)?0:s.scrollLeft(),d=o?0:e.outerWidth(),u=o?h(s[0]):0;t.resizeHandle.css({top:n.position().top+l,left:e.position().left+d+(c-u)-a/2,position:"absolute"})},setResizeHandleDimensions:function(){var e=this,t=r(e.element).children(w);e.resizeHandle.css({width:e.options.handle.width,height:t.height()})},setResizeHandleDragPosition:function(e){var t=this,n=r(r(e.currentTarget).data(t.options.handle.dataAttribute)),i=t.options,o=i.handle?i.handle.width:0,a=i.min,s=i.rtl,l=n.outerWidth(),c=n.position().left,u=n.next().outerWidth()||0,f=r(t.resizeHandle),p=r(i.rootElement),m=p.is(b)?0:p.scrollLeft(),g=s?h(p[0]):0,v=d({value:f.position().left+(m-g)+e.x.delta,min:c+(m-g)-(s?u:0)+a,max:c+l+(m-g)+(s?0:u)-o-a});f.css({left:v})},resize:function(e){var t,n,i,o=this,a=r(r(e.currentTarget).data(o.options.handle.dataAttribute)),s=o.options,l=s.rtl?-1:1,c=s.min,u=l*e.x.initialDelta;o._setTableComputedWidth(),o._setColumnsComputedWidth(),i=a.outerWidth(),n=a.next().outerWidth()||0,t=d({value:i+u,min:c,max:i+n-c}),o._resizeColumn(a[0],t),o._resizeTopAndBottomColumns(a[0],t),o._resizeAdjacentColumns(a.index(),n,i,i-t)},_setTableComputedWidth:function(){var e=this.element;""===e.style[S]&&(e.style[S]=m(r(e).outerWidth()))},_setColumnsComputedWidth:function(){var e,t=this,n=r(t.element).children(w),i=n.outerWidth(),o=n.children(x).children(y),a=o.length,s=o.map(function(){return r(this).outerWidth()});for(e=0;a>e;e++)o[e].style[S]=f(o[e].style[S])?p(u(s[e],i)):m(s[e])},_resizeTopAndBottomColumns:function(e,t){var n,i=this,o=r(e).index(),a=r(i.element).children(w).children(x).children(i.options.tags.join(C)).filter(function(){var t=this;return r(t).index()===o&&t!==e}),s=a.length;for(n=0;s>n;n++)i._resizeColumn(a[n],t)},_resizeColumn:function(e,t){e.style[S]=f(e.style[S])?p(u(t,r(this.element).children(w).outerWidth())):m(t)},_resizeAdjacentColumns:function(e,t,n,i){var o,a=this,s=r(a.element).children(w).children(x).children(a.options.tags.join(C)).filter(function(){return r(this).index()===e+1}),l=s.length;for(o=0;l>o;o++)a._resizeAdjacentColumn(s[o],t,n,i)},_resizeAdjacentColumn:function(e,t,n,i){var r=this,a=r.options.min,s=d({value:t+i,min:a,max:o(n+t-a)});r._resizeColumn(e,s)}});T.create=function(e){l.create(e,{name:"columnResizing",type:T,eventNamespace:g})},a(s,{ColumnResizing:T})}(window.kendo)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("editor/resizing/row-resizing.min",["editor/main.min","editor/resizing/resizing-utils.min","editor/resizing/table-element-resizing.min"],e)}(function(){!function(e,t){var n=window.Math,i=n.abs,o=e.jQuery,r=o.extend,a=e.ui.editor,s=a.TableElementResizing,l=a.ResizingUtils,c=l.getScrollBarWidth,d=l.constrain,u=l.calculatePercentageRatio,h=l.inPercentages,f=l.toPercentages,p=l.toPixels,m=".kendoEditorRowResizing",g="k-row-resize-handle",v="k-row-resize-marker-wrapper",_="k-row-resize-marker",b="body",w="tr",y="tbody",k="height",x=s.extend({options:{tags:[w],min:20,rootElement:null,eventNamespace:m,rtl:!1,handle:{dataAttribute:"row",width:0,height:10,classNames:{handle:g,marker:_},template:'
            '}},elementBorderHovered:function(e,t){var n=this,i=n.options.handle[k],r=e.offset().top+e.outerHeight(),a=t.clientY+o(e[0].ownerDocument).scrollTop();return a>r-i&&r+i>a},setResizeHandlePosition:function(e){var t=this,n=t.options,i=n.handle[k],r=e.position(),a=o(n.rootElement),s=a.is(b)?0:a.scrollTop(),l=a.is(b)?0:a.scrollLeft(),d=n.rtl?c(a[0]):0;t.resizeHandle.css({top:r.top+e.outerHeight()+s-i/2,left:r.left+(l-d),position:"absolute"})},setResizeHandleDimensions:function(){var e=this;e.resizeHandle.css({width:o(e.element).children(y).width(),height:e.options.handle[k]})},setResizeHandleDragPosition:function(e){var t=this,n=t.options,i=n.min,r=o(t.element).children(y),a=r.position().top,s=o(t.resizeHandle),l=o(e.currentTarget).data(n.handle.dataAttribute),c=o(n.rootElement),u=c.is(b)?0:c.scrollTop(),h=d({value:s.position().top+u+e.y.delta,min:o(l).position().top+u+i,max:a+r.outerHeight()+u-n.handle[k]-i});s.css({top:h})},resize:function(e){var t=this,n=t.options,r=o(e.currentTarget).data(n.handle.dataAttribute),a=o(r).outerHeight(),s=o(t.element),l=s.outerHeight(),c=s.children(y),u=c.height(),f=r.style[k],m=d({value:a+e.y.initialDelta,min:n.min,max:i(u-n.min)});t._setRowsHeightInPixels(),r.style[k]=p(m),t._setTableHeight(l+(m-a)),h(f)&&t._setRowsHeightInPercentages()},_setRowsHeightInPixels:function(){var e,t=this,n=o(t.element).children(y).children(w),i=n.length,r=n.map(function(){return o(this).outerHeight()});for(e=0;i>e;e++)n[e].style[k]=p(r[e])},_setRowsHeightInPercentages:function(){var e,t=this,n=o(t.element).children(y),i=n.height(),r=n.children(w),a=r.length,s=r.map(function(){return o(this).outerHeight()});for(e=0;a>e;e++)r[e].style[k]=f(u(s[e],i))},_setTableHeight:function(e){var t=this.element;t.style[k]=h(t.style[k])?f(u(e,o(t).parent().height())):p(e)}});x.create=function(e){s.create(e,{name:"rowResizing",type:x,eventNamespace:m})},r(a,{RowResizing:x})}(window.kendo)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("editor/resizing/table-resize-handle.min",["editor/main.min","kendo.draganddrop.min","editor/resizing/resizing-utils.min"],e)}(function(){!function(e,t){var n,i,o,r,a,s,l,c,d,u,h,f,p,m,g,v,_,b,w,y,k,x,C=e.jQuery,S=C.extend,T=C.noop,D=C.proxy,A=e.ui.editor,E=e.Class,I=e.ui.Draggable,R=e.Observable,M=A.ResizingUtils.getScrollBarWidth,F=".kendoEditorTableResizeHandle",z="dragStart",P="drag",B="dragEnd",L="halfInside",H="mouseover",N="mouseout",O="body",V="table",W="east",U="north",j="northeast",q="northwest",G="south",$="southeast",Y="southwest",K="west",Q=R.extend({init:function(e){var t=this;R.fn.init.call(t),t.options=S({},t.options,e),t.element=C(t.options.template).appendTo(t.options.appendTo)[0],t._attachEventHandlers(),t._addStyles(),t._initDraggable(),t._initPositioningStrategy(),t._initDraggingStrategy(),C(t.element).data(V,t.options.resizableElement)},destroy:function(){var e=this;C(e.element).off(F).remove(),e.element=null,e._destroyDraggable(),e.unbind()},options:{appendTo:null,direction:$,resizableElement:null,rtl:!1,template:"
            "},events:[z,P,B,H,N],show:function(){this._setPosition()},_setPosition:function(){var e=this,t=e._positioningStrategy.getPosition();C(e.element).css({top:t.top,left:t.left,position:"absolute"})},_attachEventHandlers:function(){var e=this;C(e.element).on(H+F,D(e._onMouseOver,e)).on(N+F,D(e._onMouseOut,e))},_onMouseOver:function(){this.trigger(H)},_onMouseOut:function(){this.trigger(N)},_addStyles:function(){function e(e){return{east:"k-resize-east",north:"k-resize-north",northeast:"k-resize-northeast",northwest:"k-resize-northwest",south:"k-resize-south",southeast:"k-resize-southeast",southwest:"k-resize-southwest",west:"k-resize-west"}[e]}var t=this;C(t.element).addClass(e(t.options.direction))},_initPositioningStrategy:function(){var e=this,t=e.options;e._positioningStrategy=n.create({name:t.direction,handle:e.element,resizableElement:t.resizableElement,rootElement:t.rootElement,rtl:t.rtl})},_initDraggable:function(){var e=this,t=e.element;!e._draggable&&t&&(e._draggable=new I(t,{ +dragstart:D(e._onDragStart,e),drag:D(e._onDrag,e),dragend:D(e._onDragEnd,e)}))},_onDragStart:function(){this.trigger(z)},_onDrag:function(e){var t=this;t.trigger(P,t._draggingStrategy.adjustDragDelta({deltaX:e.x.delta,deltaY:e.y.delta,initialDeltaX:e.x.initialDelta,initialDeltaY:e.y.initialDelta}))},_onDragEnd:function(){this.trigger(B)},_destroyDraggable:function(){var e=this;e._draggable&&(e._draggable.destroy(),e._draggable=null)},_initDraggingStrategy:function(){var e=this;e._draggingStrategy=h.create({name:e.options.direction})}}),X=E.extend({init:function(){this._items=[]},register:function(e,t){this._items.push({name:e,type:t})},create:function(e){var n,i,o,r=this._items,a=r.length,s=e.name?e.name.toLowerCase():"";for(o=0;a>o;o++)if(i=r[o],i.name.toLowerCase()===s){n=i;break}return n?new n.type(e):t}}),J=X.extend({});J.current=new J,n=E.extend({init:function(e){var t=this;t.options=S({},t.options,e)},options:{handle:null,offset:L,resizableElement:null,rootElement:null,rtl:!1},getPosition:function(){var e=this,t=e.calculatePosition(),n=e.applyHandleOffset(t),i=e.applyScrollOffset(n);return i},calculatePosition:T,applyHandleOffset:function(e){var t=this.options,n=C(t.handle);return t.offset===L?{top:e.top-n.outerHeight()/2,left:e.left-n.outerWidth()/2}:e},applyScrollOffset:function(e){var t=this.options,n=C(t.rootElement),i=t.rtl?M(n[0]):0;return n.is(O)?e:{top:e.top+n.scrollTop(),left:e.left+n.scrollLeft()-i}}}),n.create=function(e){return J.current.create(e)},i=n.extend({calculatePosition:function(){var e=C(this.options.resizableElement),t=e.position();return{top:t.top+e.outerHeight()/2,left:t.left+e.outerWidth()}}}),J.current.register(W,i),o=n.extend({calculatePosition:function(){var e=C(this.options.resizableElement),t=e.position();return{top:t.top,left:t.left+e.outerWidth()/2}}}),J.current.register(U,o),r=n.extend({calculatePosition:function(){var e=C(this.options.resizableElement),t=e.position();return{top:t.top,left:t.left+e.outerWidth()}}}),J.current.register(j,r),a=n.extend({calculatePosition:function(){var e=C(this.options.resizableElement),t=e.position();return{top:t.top,left:t.left}}}),J.current.register(q,a),s=n.extend({calculatePosition:function(){var e=C(this.options.resizableElement),t=e.position();return{top:t.top+e.outerHeight(),left:t.left+e.outerWidth()/2}}}),J.current.register(G,s),l=n.extend({calculatePosition:function(){var e=C(this.options.resizableElement),t=e.position();return{top:t.top+e.outerHeight(),left:t.left+e.outerWidth()}}}),J.current.register($,l),c=n.extend({calculatePosition:function(){var e=C(this.options.resizableElement),t=e.position();return{top:t.top+e.outerHeight(),left:t.left}}}),J.current.register(Y,c),d=n.extend({calculatePosition:function(){var e=C(this.options.resizableElement),t=e.position();return{top:t.top+e.outerHeight()/2,left:t.left}}}),J.current.register(K,d),u=X.extend({}),u.current=new u,h=E.extend({init:function(e){var t=this;t.options=S({},t.options,e)},options:{deltaX:{adjustment:null,modifier:null},deltaY:{adjustment:null,modifier:null}},adjustDragDelta:function(e){var t=this.options,n=t.deltaX.adjustment*t.deltaX.modifier,i=t.deltaY.adjustment*t.deltaY.modifier;return{deltaX:e.deltaX*n,deltaY:e.deltaY*i,initialDeltaX:e.initialDeltaX*n,initialDeltaY:e.initialDeltaY*i}}}),h.create=function(e){return u.current.create(e)},f=h.extend({options:{deltaX:{adjustment:1,modifier:1},deltaY:{adjustment:0,modifier:0}}}),p=f.extend({options:{deltaX:{modifier:1}}}),u.current.register(W,p),m=f.extend({options:{deltaX:{modifier:-1}}}),u.current.register(K,m),g=h.extend({options:{deltaX:{adjustment:0,modifier:0},deltaY:{adjustment:1,modifier:1}}}),v=g.extend({options:{deltaY:{modifier:-1}}}),u.current.register(U,v),_=g.extend({options:{deltaY:{modifier:1}}}),u.current.register(G,_),b=h.extend({options:{deltaX:{adjustment:1,modifier:1},deltaY:{adjustment:1,modifier:1}}}),w=b.extend({options:{deltaX:{modifier:1},deltaY:{modifier:-1}}}),u.current.register(j,w),y=b.extend({options:{deltaX:{modifier:-1},deltaY:{modifier:-1}}}),u.current.register(q,y),k=b.extend({options:{deltaX:{modifier:1},deltaY:{modifier:1}}}),u.current.register($,k),x=b.extend({options:{deltaX:{modifier:-1},deltaY:{modifier:1}}}),u.current.register(Y,x),S(A,{TableResizeHandle:Q})}(window.kendo)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("editor/resizing/table-resizing.min",["editor/main.min","editor/resizing/table-resize-handle.min","editor/resizing/resizing-utils.min"],e)}(function(){!function(e,t){function n(e){return t===e}var i=window,o=i.Math,r=o.min,a=o.max,s=e.jQuery,l=s.contains,c=s.extend,d=s.proxy,u=e.support.browser,h=e.ui.editor,f=e.Class,p=h.TableResizeHandle,m=h.ResizingUtils,g=m.calculatePercentageRatio,v=m.constrain,_=m.inPercentages,b=m.inPixels,w=m.toPercentages,y=m.toPixels,k=m.setContentEditable,x=".kendoEditorTableResizing",C="k-table",S="k-table-resizing",T="dragStart",D="drag",A="dragEnd",E="mousedown",I="mouseover",R="mouseout",M="td",F="tr",z="tbody",P="table",B="width",L="height",H="east",N="north",O="northeast",V="northwest",W="south",U="southeast",j="southwest",q="west",G="true",$="false",Y=f.extend({init:function(e,t){var n=this;n.options=c({},n.options,t),n.handles=[],s(e).is(P)&&(n.element=e)},destroy:function(){var e=this;s(e.element).off(x),e.element=null,e._destroyResizeHandles()},options:{appendHandlesTo:null,rtl:!1,rootElement:null,minWidth:10,minHeight:10,handles:[{direction:V},{direction:N},{direction:O},{direction:H},{direction:U},{direction:W},{direction:j},{direction:q}]},resize:function(e){var t=this,n=c({},{deltaX:0,deltaY:0,initialDeltaX:0,initialDeltaY:0},e);t._resizeWidth(n.deltaX,n.initialDeltaX),t._resizeHeight(n.deltaY,n.initialDeltaY),t.showResizeHandles()},_resizeWidth:function(e,t){var i,o,l,c,d=this,u=s(d.element),h=u[0].style[B],f=u.outerWidth(),p=u.parent().width(),m=d._getMaxDimensionValue(B);0!==e&&(n(d._initialElementWidth)&&(d._initialElementWidth=f),c=v({value:d._initialElementWidth+t,min:d.options.minWidth,max:m}),_(h)?(f+e>p?(o=a(c,p),l=r(c,p)):(o=r(c,p),l=a(c,p)),i=w(g(o,l))):i=y(c),d._setColumnsWidth(),u[0].style[B]=i)},_resizeHeight:function(e,t){var i,o,l,c,d=this,u=s(d.element),h=u[0].style[L],f=u.outerHeight(),p=u.parent(),m=p.height(),b=d._getMaxDimensionValue(L),k=d.options.minHeight,x=d._hasRowsInPixels();0!==e&&(n(d._initialElementHeight)&&(d._initialElementHeight=f),c=v({value:d._initialElementHeight+t,min:k,max:b}),x&&0>e&&d._setRowsHeightInPercentages(),_(h)?(f+e>m?(o=a(c,m),l=r(c,m)):(o=r(c,m),l=a(c,m)),i=w(g(o,l))):i=y(c),u[0].style[L]=i,x&&0>e&&d._setRowsHeightInPixels())},_getMaxDimensionValue:function(e){var t=this,n=s(t.element),i=e.toLowerCase(),o=t.options.rtl?-1:1,r=s(t.element).parent(),a=r[0],l=r[i](),c=o*(e===B?r.scrollLeft():r.scrollTop());return a===n.closest(M)[0]?""!==a.style[i]||_(t.element.style[i])?l+c:1/0:l+c},_setColumnsWidth:function(){function e(e){var t=e.style.width;return""!==t?!!_(t):!!s(e).hasClass(C)}var t,n=this,i=s(n.element),o=i.parent()[0],r=i.closest(M),a=r.closest(F).children(),l=a.length;if(e(i[0])&&o===r[0]&&""===o.style[B])for(t=0;l>t;t++)a[t].style[B]=y(s(a[t]).width())},_hasRowsInPixels:function(){var e,t=this,n=s(t.element).children(z).children(F);for(e=0;n.length>e;e++)if(""===n[e].style.height||b(n[e].style.height))return!0;return!1},_setRowsHeightInPercentages:function(){var e,t=this,n=s(t.element).children(z),i=n.height(),o=n.children(F),r=o.length,a=o.map(function(){return s(this).outerHeight()});for(e=0;r>e;e++)o[e].style[L]=w(g(a[e],i))},_setRowsHeightInPixels:function(){var e,t=this,n=s(t.element).children(z).children(F),i=n.length,o=n.map(function(){return s(this).outerHeight()});for(e=0;i>e;e++)n[e].style[L]=y(o[e])},showResizeHandles:function(){var e=this;e._initResizeHandles(),e._showResizeHandles()},_initResizeHandles:function(){var e,t=this,n=t.handles,i=t.options,o=t.options.handles,r=o.length;if(!(n&&n.length>0)){for(e=0;r>e;e++)t.handles.push(new p(c({appendTo:i.appendHandlesTo,resizableElement:t.element,rootElement:i.rootElement,rtl:i.rtl},o[e])));t._bindToResizeHandlesEvents()}},_destroyResizeHandles:function(){var e,t=this,n=t.handles?t.handles.length:0;for(e=0;n>e;e++)t.handles[e].destroy()},_showResizeHandles:function(){var e,t=this,n=t.handles||[],i=n.length;for(e=0;i>e;e++)t.handles[e].show()},_bindToResizeHandlesEvents:function(){var e,t,n=this,i=n.handles||[],o=i.length;for(e=0;o>e;e++)t=i[e],t.bind(T,d(n._onResizeHandleDragStart,n)),t.bind(D,d(n._onResizeHandleDrag,n)),t.bind(A,d(n._onResizeHandleDragEnd,n)),t.bind(I,d(n._onResizeHandleMouseOver,n)),t.bind(R,d(n._onResizeHandleMouseOut,n))},_onResizeHandleMouseOver:function(){k(this.options.rootElement,$)},_onResizeHandleMouseOut:function(){k(this.options.rootElement,G)},_onResizeHandleDragStart:function(){var e=this,t=s(e.element);t.addClass(S),e._initialElementHeight=t.outerHeight(),e._initialElementWidth=t.outerWidth()},_onResizeHandleDrag:function(e){this.resize(e)},_onResizeHandleDragEnd:function(){s(this.element).removeClass(S)}}),K=f.extend({create:function(e){var t=this;s(e.body).on(E+x,P,function(n){var i=n.target,o=n.currentTarget,r=e.tableResizing,a=r?r.element:null;if(r){if(a&&o!==a){if(l(o,a)&&a!==i&&l(a,i))return;a!==i&&(e._destroyTableResizing(),t._initResizing(e,o))}}else t._initResizing(e,o);e._showTableResizeHandles()}).on(E+x,function(t){var i=e.tableResizing,o=i?i.element:null,r=t.target,a=s(r).data(P),c=n(a)||!n(a)&&a!==o;i&&c&&o!==r&&!l(o,r)&&e._destroyTableResizing()})},_initResizing:function(t,n){u.msie||u.mozilla||(t.tableResizing=new Y(n,{appendHandlesTo:t.body,rtl:e.support.isRtl(t.element),rootElement:t.body}))}});K.current=new K,Y.create=function(e){K.current.create(e)},c(h,{TableResizing:Y})}(window.kendo)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("editor/immutables.min",["editor/tables.min"],e)}(function(){!function(e,t){var n=window.kendo,i=n.Class,o=n.ui.editor,r=o.Dom,a=n.template,s=o.RangeUtils,l=["ul","ol","tbody","thead","table"],c=["bold","italic","underline","strikethrough","superscript","subscript","forecolor","backcolor","fontname","fontsize","createlink","unlink","autolink","addcolumnleft","addcolumnright","addrowabove","addrowbelow","deleterow","deletecolumn","mergecells","formatting","cleanformatting"],d="k-immutable",u="["+d+"]",h="[contenteditable='false']",f=function(t){return e(t).is("body,.k-editor")},p=function(e){return e.getAttribute&&"false"==e.getAttribute("contenteditable")},m=function(e){return r.closestBy(e,p,f)},g=function(e){var t=m(e.startContainer),n=m(e.endContainer);(t||n)&&(t&&e.setStartBefore(t),n&&e.setEndAfter(n))},v=function(e){if(m(e.commonAncestorContainer))return!0;if(m(e.startContainer)||m(e.endContainer)){var t=s.editableTextNodes(e);if(0===t.length)return!0}return!1},_=function(e){var t,n="",i="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";for(t=e||10;t>0;--t)n+=i.charAt(Math.round(Math.random()*(i.length-1)));return n},b=function(t){var n,i,o,a={empty:!0};return e(t).find(h).each(function(t,s){n=r.name(s),i=_(),o="<"+n+" "+d+"='"+i+"'>",a[i]={node:s,style:e(s).attr("style")},a.empty=!1,e(s).replaceWith(o)}),a},w=function(t,n){var i,o;e(t).find(u).each(function(t,r){i=r.getAttribute(d),o=n[i],e(r).replaceWith(o.node),o.style!=e(o.node).attr("style")&&e(o.node).removeAttr("style").attr("style",o.style)})},y=function(e){var t=n.keys;return e===t.BACKSPACE||e==t.DELETE},k=function(e){var n=e?e.options:t;n&&n.finder&&n.finder._initOptions({immutables:!0})},x=i.extend({init:function(t){this.editor=t,this.serializedImmutables={},this.options=e.extend({},t&&t.options&&t.options.immutables);var n=t.toolbar.tools;k(n.justifyLeft),k(n.justifyCenter),k(n.justifyRight),k(n.justifyFull)},serialize:function(e){var t,n=this._toHtml(e);return-1===n.indexOf(d)?(t=this.randomId(),n=n.replace(/>/," "+d+'="'+t+'">')):t=n.match(/k-immutable\s*=\s*['"](.*)['"]/)[1],this.serializedImmutables[t]=e,n},_toHtml:function(e){var t,n=this.options.serialization,i=typeof n;switch(i){case"string":return a(n)(e);case"function":return n(e);default:return t=r.name(e),"<"+t+">"}},deserialize:function(t){var i=this,o=this.options.deserialization;e(u,t).each(function(){var t=this.getAttribute(d),r=i.serializedImmutables[t];n.isFunction(o)&&o(this,r),e(this).replaceWith(r)}),i.serializedImmutables={}},randomId:function(e){return _(e)},keydown:function(e,n){var i=y(e.keyCode),o=i&&this._cancelDeleting(e,n)||!i&&this._cancelTyping(e,n);return o?(e.preventDefault(),!0):t},_cancelTyping:function(e,t){var n=this.editor,i=n.keyboard;return t.collapsed&&!i.typingInProgress&&i.isTypingKey(e)&&v(t)},_cancelDeleting:function(e,t){var i,o,a,s,c=n.keys,d=e.keyCode===c.BACKSPACE,u=e.keyCode==c.DELETE;if(!d&&!u)return!1;if(i=!1,t.collapsed){if(v(t))return!0;if(o=this.nextImmutable(t,u),o&&d&&(a=r.closest(t.commonAncestorContainer,"li"),a&&(s=r.closest(o,"li"),s&&s!==a)))return i;if(o&&!r.tableCell(o)){if(r.parentOfType(o,l)===r.parentOfType(t.commonAncestorContainer,l)){for(;o&&1==o.parentNode.childNodes.length;)o=o.parentNode;if(r.tableCell(o))return i;this._removeImmutable(o,t)}i=!0}}return i},nextImmutable:function(e,t){var n,i=e.commonAncestorContainer;if(r.isBom(i)||t&&s.isEndOf(e,i)||!t&&s.isStartOf(e,i)){if(n=this._nextNode(i,t),n&&r.isBlock(n)&&!m(n))for(;n&&n.children&&n.children[t?0:n.children.length-1];)n=n.children[t?0:n.children.length-1];return m(n)}},_removeImmutable:function(e,t){var n=this.editor,i=new o.RestorePoint(t,n.body);r.remove(e),o._finishUpdate(n,i)},_nextNode:function(e,t){for(var n,i=t?"nextSibling":"previousSibling",o=e;o&&!n;)n=o[i],n&&r.isDataNode(n)&&/^\s|[\ufeff]$/.test(n.nodeValue)&&(o=n,n=o[i]),n||(o=o.parentNode);return n}});x.immutable=p,x.immutableParent=m,x.expandImmutablesIn=g,x.immutablesContext=v,x.toolsToBeUpdated=c,x.removeImmutables=b,x.restoreImmutables=w,o.Immutables=x}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("editor/table-wizard/table-wizard-command.min",["editor/tables.min"],e)}(function(){!function(e,t){var n=window.kendo,i=n.ui.editor,o=i.EditorUtils,r=i.RangeUtils,a=i.Dom,s=o.registerTool,l=i.ToolTemplate,c=i.Command,d=new i.BlockFormatFinder([{tags:["table"]}]),u=new i.BlockFormatFinder([{tags:["td","th"]}]),h=/([a-z]+|%)$/i,f=c.extend({exec:function(){var o=this,r=o.editor,a=o.range=o.lockRange(),s=o._sourceTable=o.options.insertNewTable?t:o._selectedTable(a),l=o._selectedTableCells=s?o._selectedCells(a):t,c={visible:!1,messages:r.options.messages,closeCallback:e.proxy(o.onDialogClose,o),table:o.parseTable(s,l),dialogOptions:r.options.dialogOptions,isRtl:n.support.isRtl(r.wrapper)},d=new i.TableWizardDialog(c);d.open()},onDialogClose:function(e){var t=this;t.releaseRange(t.range),e&&(t.options.insertNewTable?t.insertTable(t.createNewTable(e)):t.updateTable(e,t._sourceTable,t._selectedTableCells))},releaseRange:function(e){var t=this,n=t.editor.document;a.windowFromDocument(n).focus(),c.fn.releaseRange.call(t,e)},insertTable:function(e){this.range.insertNode(e)},updateTable:function(t,n,i){for(var o,r,a,s,l,c,d,u,h=this,f=e(n.rows).toArray(),p=t.tableProperties,m=p.rows,g=p.columns,v=function(e){return e[e.length-1]};i.length>1;)i.pop();if(o=i.length?v(i).parentNode:v(f),h._deleteTableRows(f,f.length-m),m>f.length)for(s=e(o).index(),l=o.cells.length,c=m-f.length,a=o.parentNode;c;)r=a.insertRow(s+1),h._insertCells(l-r.cells.length,r),c--;f[0].cells.length>g&&e(f).each(function(e,t){for(;t.cells.length>g;)t.deleteCell(-1)}),g>f[0].cells.length&&(d=e(v(i)||v(o.cells)).index(),e(f).each(function(e,t){h._insertCells(g-t.cells.length,t,d+1)})),h._updateTableProperties(n,p),u=t.cellProperties,(u.selectAllCells?e(f).children():e(i)).each(function(e,t){h._updateCellProperties(t,u)}),h._updateCaption(n,p),p.cellsWithHeaders=p.cellsWithHeaders||!1,h.cellsWithHeadersAssociated(n)!=p.cellsWithHeaders&&h.associateCellsWithHeader(n,p.cellsWithHeaders)},_isHeadingRow:function(e){return a.is(e.parentNode,"thead")||a.is(e.cells[0],"th")},associateCellsWithHeader:function(t,n){var i,o,r,a=(new Date).getTime(),s=[],l=t.rows[0].cells.length,c=function(){for(var e=0;l>e;e++)s[e]="table"+ ++a},d=function(t,i){e(i)[n?"attr":"removeAttr"]("id",s[t])},u=function(t,i){e(i)[n?"attr":"removeAttr"]("headers",s[t])},h=this._isHeadingRow;e(t.rows).each(function(n,a){if(h(a))for(i=n,o=t.rows[++i],r=o&&!h(o),r&&(c(),e(a.cells).each(d));r;)e(o.cells).each(u),o=t.rows[++i],r=o&&!h(o)})},cellsWithHeadersAssociated:function(t){var n,i=e(t.rows).children(),o=this._isHeadingRow,r=[];return i.each(function(e,t){t.id&&o(t.parentNode)&&r.push(t.id)}),n=i.filter(function(t,n){var i=n.getAttribute("headers");return i&&!o(n.parentNode)&&e.inArray(i,r)>-1}),!!n.length},_insertCells:function(e,t,n){n=isNaN(n)?-1:n;for(var i,o=0;e>o;o++)i=t.insertCell(n),i.innerHTML=" "},_deleteTableRows:function(e,t){for(var n,i,o=0;t>o;o++)n=e.pop(),i=n.parentNode,i.removeChild(n),i.rows.length||a.remove(i)},createNewTable:function(e){var t,n,i,o,r,s=this,l=s.editor.document,c=e.tableProperties,d=e.cellProperties,u=d.selectAllCells,h=a.create(l,"table");for(s._updateTableProperties(h,c),s._updateCaption(h,c),t=h.createTBody(),n=0;c.rows>n;n++)for(i=t.insertRow(),o=0;c.columns>o;o++)r=i.insertCell(),r.innerHTML=" ",s._updateCellProperties(r,u||0===n&&0===o?d:{});return c.cellsWithHeaders&&s.associateCellsWithHeader(h,c.cellsWithHeaders),h},_updateTableProperties:function(t,n){var i=this._getStylesData(n);a.attr(t,{cellSpacing:n.cellSpacing||null,cellPadding:n.cellPadding||null,className:n.className||null,id:n.id||null,summary:n.summary||null,style:i||null}),e(t).addClass("k-table")},_updateCellProperties:function(e,t){var n=this._getStylesData(t);a.attr(e,{style:n||null,cellMargin:t.cellMargin||null,cellPadding:t.cellPadding||null,className:t.className||null,id:t.id||null})},_updateCaption:function(e,t){var n,i;e.caption&&!t.captionContent?e.deleteCaption():t.captionContent&&(n=e.createCaption(),n.innerHTML=t.captionContent,i=this._getAlignmentData(t.captionAlignment),a.attr(n,{style:{textAlign:i.textAlign,verticalAlign:i.verticalAlign}}))},_getStylesData:function(e){var t=this._getAlignmentData(e.alignment),n="wrapText"in e?e.wrapText?"":"nowrap":null;return{width:e.width?e.width+e.widthUnit:null,height:e.height?e.height+e.heightUnit:null,textAlign:t.textAlign,verticalAlign:t.verticalAlign,backgroundColor:e.bgColor||null,borderWidth:e.borderWidth,borderStyle:e.borderStyle,borderColor:e.borderColor,borderCollapse:e.collapseBorders?"collapse":null,whiteSpace:n}},_getAlignmentData:function(e){var t,n="",i=n;return e&&(-1!=e.indexOf(" ")?(t=e.split(" "),n=t[0],i=t[1]):n=e),{textAlign:n,verticalAlign:i}},parseTable:function(n,i){var o,r,a,s,l,c,d,u,h,f;return n?(o=this,r=n.style,a=n.rows,s=n.caption,l=e(s?s.cloneNode(!0):t),l.find(".k-marker").remove(),c=n.className,c=c.replace(/^k-table\s|\sk-table$/,""),c=c.replace(/\sk-table\s/," "),c=c.replace(/^k-table$/,""),d=o._getAlignment(n,!0),u=s?o._getAlignment(s):t,h=o.cellsWithHeadersAssociated(n),f={tableProperties:{width:r.width||n.width?parseFloat(r.width||n.width):null,height:r.height||n.height?parseFloat(r.height||n.height):null,columns:a[0]?a[0].children.length:0,rows:a.length,widthUnit:o._getUnit(r.width),heightUnit:o._getUnit(r.height),cellSpacing:n.cellSpacing,cellPadding:n.cellPadding,alignment:d.textAlign,bgColor:r.backgroundColor||n.bgColor,className:c,id:n.id,borderWidth:r.borderWidth||n.border,borderColor:r.borderColor,borderStyle:r.borderStyle||"",collapseBorders:!!r.borderCollapse,summary:n.summary,captionContent:s?l.html():"",captionAlignment:s&&u.textAlign?u.textAlign+" "+u.verticalAlign:"",cellsWithHeaders:h},selectedCells:[]},f.rows=o.parseTableRows(a,i,f),f):{tableProperties:{},selectedCells:[]}},parseTableRows:function(t,n,i){var o,r,a,s,l,c,d,u=this,h=[];for(c=0;t.length>c;c++)for(o=t[c],r={cells:[]},a=o.cells,h.push(r),d=0;a.length>d;d++)s=a[d],l=u.parseCell(s),-1!=e.inArray(s,n)&&i.selectedCells.push(l),r.cells.push(l);return h},parseCell:function(e){var t,n=this,i=e.style,o=n._getAlignment(e);return o=o.textAlign?o.textAlign+" "+o.verticalAlign:"",t={width:i.width||e.width?parseFloat(i.width||e.width):null,height:i.height||e.height?parseFloat(i.height||e.height):null,widthUnit:n._getUnit(i.width),heightUnit:n._getUnit(i.height),cellMargin:i.margin||e.cellMargin,cellPadding:i.padding||e.cellPadding,alignment:o,bgColor:i.backgroundColor||e.bgColor,className:e.className,id:e.id,borderWidth:i.borderWidth||e.border,borderColor:i.borderColor,borderStyle:i.borderStyle,wrapText:"nowrap"!=i.whiteSpace}},_getAlignment:function(e,t){var n,i=e.style,o=i.textAlign||e.align||"";return t?{textAlign:o}:(n=i.verticalAlign||e.vAlign||"",o&&n?{textAlign:o,verticalAlign:n}:!o&&n?{textAlign:"left",verticalAlign:n}:o&&!n?{textAlign:o,verticalAlign:"top"}:{textAlign:"",verticalAlign:""})},_getUnit:function(e){var t=(e||"").match(h);return t?t[0]:"px"},_selectedTable:function(e){var t=a.filterBy(r.nodes(e),a.htmlIndentSpace,!0);return d.findSuitable(t)[0]},_selectedCells:function(e){var t=a.filterBy(r.nodes(e),a.htmlIndentSpace,!0);return u.findSuitable(t)}}),p=i.Tool.extend({command:function(e){return e.insertNewTable=this.options.insertNewTable,new f(e)}}),m=p.extend({update:function(e,t){var n=!d.isFormatted(t);e.toggleClass("k-state-disabled",n)}});n.ui.editor.TableWizardTool=p,n.ui.editor.TableWizardCommand=f,s("tableWizard",new m({command:f,insertNewTable:!1,template:new l({template:o.buttonTemplate,title:"Table Wizard"})}))}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("editor/table-wizard/table-wizard-dialog.min",["editor/table-wizard/table-wizard-command.min"],e)}(function(){!function(e,t){var n=window.kendo,i={format:"0",min:0},o=["px","em"],r=["solid","dotted","dashed","double","groove","ridge","inset","outset","initial","inherit","none","hidden"],a={dataSource:[{className:"k-font-icon k-i-table-align-middle-left",value:"left"},{className:"k-font-icon k-i-table-align-middle-center",value:"center"},{className:"k-font-icon k-i-table-align-middle-right",value:"right"},{className:"k-font-icon k-i-justify-clear",value:""}],dataTextField:"className",dataValueField:"value",template:"",valueTemplate:""},s={dataSource:[{className:"k-font-icon k-i-table-align-top-left",value:"left top"},{className:"k-font-icon k-i-table-align-top-center",value:"center top"},{className:"k-font-icon k-i-table-align-top-right",value:"right top"},{className:"k-font-icon k-i-table-align-middle-left",value:"left middle"},{className:"k-font-icon k-i-table-align-middle-center",value:"center middle"},{className:"k-font-icon k-i-table-align-middle-right",value:"right middle"},{className:"k-font-icon k-i-table-align-bottom-left",value:"left bottom"},{className:"k-font-icon k-i-table-align-bottom-center",value:"center bottom"},{className:"k-font-icon k-i-table-align-bottom-right",value:"right bottom"},{className:"k-font-icon k-i-justify-clear",value:""}],dataTextField:"className",dataValueField:"value",template:"",valueTemplate:""},l={dataSource:[{className:"k-font-icon k-i-table-align-top-left",value:"left top"},{className:"k-font-icon k-i-table-align-top-center",value:"center top"},{className:"k-font-icon k-i-table-align-top-right",value:"right top"},{className:"k-font-icon k-i-table-align-bottom-left",value:"left bottom"},{className:"k-font-icon k-i-table-align-bottom-center",value:"center bottom"},{className:"k-font-icon k-i-table-align-bottom-right",value:"right bottom"},{className:"k-font-icon k-i-justify-clear",value:""}],dataTextField:"className",dataValueField:"value",template:"",valueTemplate:""},c='
            • #= messages.tableTab #
            • #= messages.cellTab #
            • #= messages.accessibilityTab #
             
             
             
            ',d=n.Class.extend({init:function(e){this.options=e},open:function(){function t(e){e.preventDefault(),a.destroy(),o.destroy()}function n(e){a.collectDialogValues(c),t(e),a.change&&a.change(),s.closeCallback(c)}function i(e){t(e),s.closeCallback()}var o,r,a=this,s=a.options,l=s.dialogOptions,c=s.table,d=s.messages;l.close=i,l.title=d.tableWizard,l.visible=s.visible,l.maxHeight=720,o=e(a._dialogTemplate(d)).appendTo(document.body).kendoWindow(l).closest(".k-window").toggleClass("k-rtl",s.isRtl).end().find(".k-dialog-ok").click(n).end().find(".k-dialog-close").click(i).end().data("kendoWindow").center().open(),r=o.element,a._initTabStripComponent(r),a._initTableViewComponents(r,c),a._initCellViewComponents(r,c),a._initAccessibilityViewComponents(r,c),o.center()},_initTabStripComponent:function(e){var t=this.components={};t.tabStrip=e.find("#k-table-wizard-tabs").kendoTabStrip({animation:!1}).data("kendoTabStrip")},collectDialogValues:function(){var e=this,t=e.options.table;e._collectTableViewValues(t),e._collectCellViewValues(t),e._collectAccessibilityViewValues(t)},_collectTableViewValues:function(e){var t=this.components.tableView,n=e.tableProperties;n.width=t.width.value(),n.widthUnit=t.widthUnit.value(),n.height=t.height.value(),n.columns=t.columns.value(),n.rows=t.rows.value(),n.heightUnit=t.heightUnit.value(),n.cellSpacing=t.cellSpacing.value(),n.cellPadding=t.cellPadding.value(),n.alignment=t.alignment.value(), +n.bgColor=t.bgColor.value(),n.className=t.className.value,n.id=t.id.value,n.borderWidth=t.borderWidth.value(),n.borderColor=t.borderColor.value(),n.borderStyle=t.borderStyle.value(),n.collapseBorders=t.collapseBorders.checked},_collectCellViewValues:function(e){var t=e.cellProperties={},n=this.components.cellView;t.selectAllCells=n.selectAllCells.checked,t.width=n.width.value(),t.widthUnit=n.widthUnit.value(),t.height=n.height.value(),t.heightUnit=n.heightUnit.value(),t.cellMargin=n.cellMargin.value(),t.cellPadding=n.cellPadding.value(),t.alignment=n.alignment.value(),t.bgColor=n.bgColor.value(),t.className=n.className.value,t.id=n.id.value,t.borderWidth=n.borderWidth.value(),t.borderColor=n.borderColor.value(),t.borderStyle=n.borderStyle.value(),t.wrapText=n.wrapText.checked},_collectAccessibilityViewValues:function(e){var t=e.tableProperties,n=this.components.accessibilityView;t.captionContent=n.captionContent.value,t.captionAlignment=n.captionAlignment.value(),t.summary=n.summary.value,t.cellsWithHeaders=n.cellsWithHeaders.checked},_addUnit:function(t,n){n&&-1==e.inArray(n,t)&&t.push(n)},_initTableViewComponents:function(e,t){var n=this.components,i=n.tableView={},a=t.tableProperties=t.tableProperties||{};a.borderStyle=a.borderStyle||"",this._addUnit(o,a.widthUnit),this._addUnit(o,a.heightUnit),this._initNumericTextbox(e.find("#k-editor-table-width"),"width",a,i),this._initNumericTextbox(e.find("#k-editor-table-height"),"height",a,i),this._initNumericTextbox(e.find("#k-editor-table-columns"),"columns",a,i,{min:1,value:4}),this._initNumericTextbox(e.find("#k-editor-table-rows"),"rows",a,i,{min:1,value:4}),this._initDropDownList(e.find("#k-editor-table-width-type"),"widthUnit",a,i,o),this._initDropDownList(e.find("#k-editor-table-height-type"),"heightUnit",a,i,o),this._initNumericTextbox(e.find("#k-editor-table-cell-spacing"),"cellSpacing",a,i),this._initNumericTextbox(e.find("#k-editor-table-cell-padding"),"cellPadding",a,i),this._initTableAlignmentDropDown(e.find("#k-editor-table-alignment"),a),this._initColorPicker(e.find("#k-editor-table-bg"),"bgColor",a,i),this._initInput(e.find("#k-editor-css-class"),"className",a,i),this._initInput(e.find("#k-editor-id"),"id",a,i),this._initNumericTextbox(e.find("#k-editor-border-width"),"borderWidth",a,i),this._initColorPicker(e.find("#k-editor-border-color"),"borderColor",a,i),this._initDropDownList(e.find("#k-editor-border-style"),"borderStyle",a,i,r),this._initCheckbox(e.find("#k-editor-collapse-borders"),"collapseBorders",a,i)},_initCellViewComponents:function(e,t){var n,i=this.components,a=i.cellView={};t.selectedCells=t.selectedCells=t.selectedCells||[],n=t.selectedCells[0]||{borderStyle:"",wrapText:!0},this._addUnit(o,n.widthUnit),this._addUnit(o,n.heightUnit),this._initCheckbox(e.find("#k-editor-selectAllCells"),"selectAllCells",t.tableProperties,a),this._initNumericTextbox(e.find("#k-editor-cell-width"),"width",n,a),this._initNumericTextbox(e.find("#k-editor-cell-height"),"height",n,a),this._initDropDownList(e.find("#k-editor-cell-width-type"),"widthUnit",n,a,o),this._initDropDownList(e.find("#k-editor-cell-height-type"),"heightUnit",n,a,o),this._initNumericTextbox(e.find("#k-editor-table-cell-margin"),"cellMargin",n,a),this._initNumericTextbox(e.find("#k-editor-table-cells-padding"),"cellPadding",n,a),this._initCellAlignmentDropDown(e.find("#k-editor-cell-alignment"),n),this._initColorPicker(e.find("#k-editor-cell-bg"),"bgColor",n,a),this._initInput(e.find("#k-editor-cell-css-class"),"className",n,a),this._initInput(e.find("#k-editor-cell-id"),"id",n,a),this._initNumericTextbox(e.find("#k-editor-cell-border-width"),"borderWidth",n,a),this._initColorPicker(e.find("#k-editor-cell-border-color"),"borderColor",n,a),this._initDropDownList(e.find("#k-editor-cell-border-style"),"borderStyle",n,a,r),this._initCheckbox(e.find("#k-editor-wrap-text"),"wrapText",n,a)},_initAccessibilityViewComponents:function(e,t){var n=this.components,i=n.accessibilityView={},o=t.tableProperties;this._initInput(e.find("#k-editor-table-caption"),"captionContent",o,i),this._initAccessibilityAlignmentDropDown(e.find("#k-editor-accessibility-alignment"),o),this._initInput(e.find("#k-editor-accessibility-summary"),"summary",o,i),this._initCheckbox(e.find("#k-editor-cells-headers"),"cellsWithHeaders",o,i)},_initNumericTextbox:function(t,n,o,r,a){var s=r[n]=t.kendoNumericTextBox(a?e.extend({},i,a):i).data("kendoNumericTextBox");n in o&&s.value(parseInt(o[n],10))},_initDropDownList:function(e,t,n,i,o){var r=i[t]=e.kendoDropDownList({dataSource:o}).data("kendoDropDownList");this._setComponentValue(r,n,t)},_initTableAlignmentDropDown:function(e,t){var n=this.options.messages,i=this.components.tableView,o=a.dataSource;o[0].tooltip=n.alignLeft,o[1].tooltip=n.alignCenter,o[2].tooltip=n.alignRight,o[3].tooltip=n.alignRemove,this._initAlignmentDropDown(e,a,"alignment",t,i)},_initCellAlignmentDropDown:function(e,t){var n=this.options.messages,i=this.components.cellView,o=s.dataSource;o[0].tooltip=n.alignLeftTop,o[1].tooltip=n.alignCenterTop,o[2].tooltip=n.alignRightTop,o[3].tooltip=n.alignLeftMiddle,o[4].tooltip=n.alignCenterMiddle,o[5].tooltip=n.alignRightMiddle,o[6].tooltip=n.alignLeftBottom,o[7].tooltip=n.alignCenterBottom,o[8].tooltip=n.alignRightBottom,o[9].tooltip=n.alignRemove,this._initAlignmentDropDown(e,s,"alignment",t,i)},_initAccessibilityAlignmentDropDown:function(e,t){var n=this.options.messages,i=this.components.accessibilityView,o=l.dataSource;o[0].tooltip=n.alignLeftTop,o[1].tooltip=n.alignCenterTop,o[2].tooltip=n.alignRightTop,o[3].tooltip=n.alignLeftBottom,o[4].tooltip=n.alignCenterBottom,o[5].tooltip=n.alignRightBottom,o[6].tooltip=n.alignRemove,this._initAlignmentDropDown(e,l,"captionAlignment",t,i)},_initAlignmentDropDown:function(e,t,n,i,o){var r=o[n]=e.kendoDropDownList(t).data("kendoDropDownList");r.list.addClass("k-align").css("width","110px"),this._setComponentValue(r,i,n)},_setComponentValue:function(e,t,n){n in t&&e.value(t[n])},_initColorPicker:function(e,t,n,i){var o=i[t]=e.kendoColorPicker().data("kendoColorPicker");n[t]&&o.value(n[t])},_initInput:function(e,t,n,i){var o=i[t]=e.get(0);t in n&&(o.value=n[t])},_initCheckbox:function(e,t,n,i){var o=i[t]=e.get(0);t in n&&(o.checked=n[t])},destroy:function(){this._destroyComponents(this.components.tableView),this._destroyComponents(this.components.cellView),this._destroyComponents(this.components.accessibilityView),this._destroyComponents(this.components),delete this.components},_destroyComponents:function(e){for(var t in e)e[t].destroy&&e[t].destroy(),delete e[t]},_dialogTemplate:function(e){return n.template(c)({messages:e})}});n.ui.editor.TableWizardDialog=d}(window.kendo.jQuery)},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.editor.min",["kendo.combobox.min","kendo.dropdownlist.min","kendo.resizable.min","kendo.window.min","kendo.colorpicker.min","kendo.imagebrowser.min","util/undoredostack.min","editor/main.min","editor/dom.min","editor/serializer.min","editor/range.min","editor/system.min","editor/inlineformat.min","editor/formatblock.min","editor/linebreak.min","editor/lists.min","editor/link.min","editor/file.min","editor/image.min","editor/components.min","editor/indent.min","editor/viewhtml.min","editor/formatting.min","editor/toolbar.min","editor/tables.min","editor/resizing/column-resizing.min","editor/resizing/row-resizing.min","editor/resizing/table-resizing.min","editor/resizing/table-resize-handle.min","editor/immutables.min","editor/table-wizard/table-wizard-command.min","editor/table-wizard/table-wizard-dialog.min"],e)}(function(){},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.maskedtextbox.min",["kendo.core.min"],e)}(function(){return function(e,t){var n=window.kendo,i=n.caret,o=n.keys,r=n.ui,a=r.Widget,s=".kendoMaskedTextBox",l=e.proxy,c=(n.support.propertyChangeEvent?"propertychange":"input")+s,d="k-state-disabled",u="disabled",h="readonly",f="change",p=a.extend({init:function(t,o){var r,l,c=this;a.fn.init.call(c,t,o),c._rules=e.extend({},c.rules,c.options.rules),t=c.element,r=t[0],c.wrapper=t,c._tokenize(),c._form(),c.element.addClass("k-textbox").attr("autocomplete","off").on("focus"+s,function(){var e=r.value;e?c._togglePrompt(!0):r.value=c._old=c._emptyMask,c._oldValue=e,c._timeoutId=setTimeout(function(){i(t,0,e?c._maskLength:0)})}).on("focusout"+s,function(){var e=t.val();clearTimeout(c._timeoutId),r.value=c._old="",e!==c._emptyMask&&(r.value=c._old=e),c._change(),c._togglePrompt()}),l=t.is("[disabled]")||e(c.element).parents("fieldset").is(":disabled"),l?c.enable(!1):c.readonly(t.is("[readonly]")),c.value(c.options.value||t.val()),n.notify(c)},options:{name:"MaskedTextBox",clearPromptChar:!1,unmaskOnPost:!1,promptChar:"_",culture:"",rules:{},value:"",mask:""},events:[f],rules:{0:/\d/,9:/\d|\s/,"#":/\d|\s|\+|\-/,L:/[a-zA-Z]/,"?":/[a-zA-Z]|\s/,"&":/\S/,C:/./,A:/[a-zA-Z0-9]/,a:/[a-zA-Z0-9]|\s/},setOptions:function(t){var n=this;a.fn.setOptions.call(n,t),n._rules=e.extend({},n.rules,n.options.rules),n._tokenize(),this._unbindInput(),this._bindInput(),n.value(n.element.val())},destroy:function(){var e=this;e.element.off(s),e._formElement&&(e._formElement.off("reset",e._resetHandler),e._formElement.off("submit",e._submitHandler)),a.fn.destroy.call(e)},raw:function(){var e=this._unmask(this.element.val(),0);return e.replace(RegExp(this.options.promptChar,"g"),"")},value:function(e){var i=this.element,o=this._emptyMask;return e===t?this.element.val():(null===e&&(e=""),o?(e=this._unmask(e+""),i.val(e?o:""),this._mask(0,this._maskLength,e),e=i.val(),this._oldValue=e,n._activeElement()!==i&&(e===o?i.val(""):this._togglePrompt()),t):(i.val(e),t))},_togglePrompt:function(e){var t=this.element[0],n=t.value;this.options.clearPromptChar&&(n=e?this._oldValue:n.replace(RegExp(this.options.promptChar,"g")," "),t.value=this._old=n)},readonly:function(e){this._editable({readonly:e===t?!0:e,disable:!1})},enable:function(e){this._editable({readonly:!1,disable:!(e=e===t?!0:e)})},_bindInput:function(){var e=this;e._maskLength&&e.element.on("keydown"+s,l(e._keydown,e)).on("keypress"+s,l(e._keypress,e)).on("paste"+s,l(e._paste,e)).on(c,l(e._propertyChange,e))},_unbindInput:function(){this.element.off("keydown"+s).off("keypress"+s).off("paste"+s).off(c)},_editable:function(e){var t=this,n=t.element,i=e.disable,o=e.readonly;t._unbindInput(),o||i?n.attr(u,i).attr(h,o).toggleClass(d,i):(n.removeAttr(u).removeAttr(h).removeClass(d),t._bindInput())},_change:function(){var e=this,t=e.value();t!==e._oldValue&&(e._oldValue=t,e.trigger(f),e.element.trigger(f))},_propertyChange:function(){var e,t,o=this,r=o.element[0],a=r.value;n._activeElement()===r&&(a===o._old||o._pasting||(t=i(r)[0],e=o._unmask(a.substring(t),t),r.value=o._old=a.substring(0,t)+o._emptyMask.substring(t),o._mask(t,t,e),i(r,t)))},_paste:function(e){var t=this,n=e.target,o=i(n),r=o[0],a=o[1],s=t._unmask(n.value.substring(a),a);t._pasting=!0,setTimeout(function(){var e=n.value,o=e.substring(r,i(n)[0]);n.value=t._old=e.substring(0,r)+t._emptyMask.substring(r),t._mask(r,r,o),r=i(n)[0],t._mask(r,r,s),i(n,r),t._pasting=!1})},_form:function(){var t=this,n=t.element,i=n.attr("form"),o=i?e("#"+i):n.closest("form");o[0]&&(t._resetHandler=function(){setTimeout(function(){t.value(n[0].value)})},t._submitHandler=function(){t.element[0].value=t._old=t.raw()},t.options.unmaskOnPost&&o.on("submit",t._submitHandler),t._formElement=o.on("reset",t._resetHandler))},_keydown:function(e){var n,r=e.keyCode,a=this.element[0],s=i(a),l=s[0],c=s[1],d=r===o.BACKSPACE;d||r===o.DELETE?(l===c&&(d?l-=1:c+=1,n=this._find(l,d)),n!==t&&n!==l?(d&&(n+=1),i(a,n)):l>-1&&this._mask(l,c,"",d),e.preventDefault()):r===o.ENTER&&this._change()},_keypress:function(e){var t,n;0===e.which||e.metaKey||e.ctrlKey||e.keyCode===o.ENTER||(t=String.fromCharCode(e.which),n=i(this.element),this._mask(n[0],n[1],t),(e.keyCode===o.BACKSPACE||t)&&e.preventDefault())},_find:function(e,t){var n=this.element.val()||this._emptyMask,i=1;for(t===!0&&(i=-1);e>-1||this._maskLength>=e;){if(n.charAt(e)!==this.tokens[e])return e;e+=i}return-1},_mask:function(e,o,r,a){var s,l,c,d,u=this.element[0],h=u.value||this._emptyMask,f=this.options.promptChar,p=0;for(e=this._find(e,a),e>o&&(o=e),l=this._unmask(h.substring(o),o),r=this._unmask(r,e),s=r.length,r&&(l=l.replace(RegExp("^_{0,"+s+"}"),"")),r+=l,h=h.split(""),c=r.charAt(p);this._maskLength>e;)h[e]=c||f,c=r.charAt(++p),d===t&&p>s&&(d=e),e=this._find(e+1);u.value=this._old=h.join(""),n._activeElement()===u&&(d===t&&(d=this._maskLength),i(u,d))},_unmask:function(t,n){var i,o,r,a,s,l,c,d;if(!t)return"";for(t=(t+"").split(""),r=0,a=n||0,s=this.options.promptChar,l=t.length,c=this.tokens.length,d="";c>a&&(i=t[r],o=this.tokens[a],i===o||i===s?(d+=i===s?s:"",r+=1,a+=1):"string"!=typeof o?((o.test&&o.test(i)||e.isFunction(o)&&o(i))&&(d+=i,a+=1),r+=1):a+=1,!(r>=l)););return d},_tokenize:function(){for(var e,t,i,o,r=[],a=0,s=this.options.mask||"",l=s.split(""),c=l.length,d=0,u="",h=this.options.promptChar,f=n.getCulture(this.options.culture).numberFormat,p=this._rules;c>d;d++)if(e=l[d],t=p[e])r[a]=t,u+=h,a+=1;else for("."===e||","===e?e=f[e]:"$"===e?e=f.currency.symbol:"\\"===e&&(d+=1,e=l[d]),e=e.split(""),i=0,o=e.length;o>i;i++)r[a]=e[i],u+=e[i],a+=1;this.tokens=r,this._emptyMask=u,this._maskLength=u.length}});r.plugin(p)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.toolbar.min",["kendo.core.min","kendo.userevents.min","kendo.popup.min"],e)}(function(){return function(e,t){function n(){var e,t=this.options.anchor,n=t.outerWidth();x.wrap(this.element).addClass("k-split-wrapper"),e="border-box"!==this.element.css("box-sizing")?n-(this.element.outerWidth()-this.element.width()):n,this.element.css({fontFamily:t.css("font-family"),"min-width":e})}function i(e){e.target.is(".k-toggle-button")||e.target.toggleClass(H,"press"==e.type)}function o(t){return t=e(t),t.hasClass("km-actionsheet")?t.closest(".km-popup-wrapper"):t.addClass("km-widget km-actionsheet").wrap('
            ').parent().wrap('
            ').parent()}function r(e){e.preventDefault()}function a(t,n){var i="next"===n?e.fn.next:e.fn.prev,o="next"===n?e.fn.first:e.fn.last,r=i.call(t);return r.is(":kendoFocusable")||!r.length?r:r.find(":kendoFocusable").length?o.call(r.find(":kendoFocusable")):a(r,n)}var s,l,c,d,u,h,f,p,m,g,v,_,b,w,y,k,x=window.kendo,C=x.Class,S=x.ui.Widget,T=e.proxy,D=x.isFunction,A=x.keys,E="k-toolbar",I="k-button",R="k-overflow-button",M="k-toggle-button",F="k-button-group",z="k-split-button",P="k-separator",B="k-popup",L="k-toolbar-resizable",H="k-state-active",N="k-state-disabled",O="k-state-hidden",V="k-group-start",W="k-group-end",U="k-primary",j="k-icon",q="k-i-",G="k-button-icon",$="k-button-icontext",Y="k-list-container k-split-container",K="k-split-button-arrow",Q="k-overflow-anchor",X="k-overflow-container",J="k-toolbar-first-visible",Z="k-toolbar-last-visible",ee="click",te="toggle",ne="open",ie="close",oe="overflowOpen",re="overflowClose",ae="never",se="auto",le="always",ce="k-overflow-hidden",de=x.attr("uid");x.toolbar={},s={overflowAnchor:'
            ',overflowContainer:'
              '},x.toolbar.registerComponent=function(e,t,n){s[e]={toolbar:t,overflow:n}},l=x.Class.extend({addOverflowAttr:function(){this.element.attr(x.attr("overflow"),this.options.overflow||se)},addUidAttr:function(){this.element.attr(de,this.options.uid)},addIdAttr:function(){this.options.id&&this.element.attr("id",this.options.id)},addOverflowIdAttr:function(){this.options.id&&this.element.attr("id",this.options.id+"_overflow")},attributes:function(){this.options.attributes&&this.element.attr(this.options.attributes)},show:function(){this.element.removeClass(O).show(),this.options.hidden=!1},hide:function(){this.element.addClass(O).hide(),this.options.hidden=!0},remove:function(){this.element.remove()},enable:function(e){e===t&&(e=!0),this.element.toggleClass(N,!e),this.options.enable=e},twin:function(){var e=this.element.attr(de);return this.overflow?this.toolbar.element.find("["+de+"='"+e+"']").data(this.options.type):this.toolbar.options.resizable?this.toolbar.popup.element.find("["+de+"='"+e+"']").data(this.options.type):t}}),x.toolbar.Item=l,c=l.extend({init:function(n,i){var o=e(n.useButtonTag?'':'
              ');this.element=o,this.options=n,this.toolbar=i,this.attributes(),n.primary&&o.addClass(U),n.togglable&&(o.addClass(M),this.toggle(n.selected)),n.url===t||n.useButtonTag||(o.attr("href",n.url),n.mobile&&o.attr(x.attr("role"),"button")),n.group&&(o.attr(x.attr("group"),n.group),this.group=this.toolbar.addToGroup(this,n.group)),!n.togglable&&n.click&&D(n.click)&&(this.clickHandler=n.click),n.togglable&&n.toggle&&D(n.toggle)&&(this.toggleHandler=n.toggle)},toggle:function(e,t){e=!!e,this.group&&e?this.group.select(this):this.group||this.select(e),t&&this.twin()&&this.twin().toggle(e)},getParentGroup:function(){return this.options.isChild?this.element.closest("."+F).data("buttonGroup"):t},_addGraphics:function(){var t,n,i,o=this.element,r=this.options.icon,a=this.options.spriteCssClass,s=this.options.imageUrl;(a||s||r)&&(t=!0,o.contents().not("span.k-sprite,span."+j+",img.k-image").each(function(n,i){(1==i.nodeType||3==i.nodeType&&e.trim(i.nodeValue).length>0)&&(t=!1)}),o.addClass(t?G:$)),r?(n=o.children("span."+j).first(),n[0]||(n=e('').prependTo(o)),n.addClass(q+r)):a?(n=o.children("span.k-sprite").first(),n[0]||(n=e('').prependTo(o)),n.addClass(a)):s&&(i=o.children("img.k-image").first(),i[0]||(i=e('icon').prependTo(o)),i.attr("src",s))}}),x.toolbar.Button=c,d=c.extend({init:function(e,t){c.fn.init.call(this,e,t);var n=this.element;n.addClass(I),this.addIdAttr(),e.align&&n.addClass("k-align-"+e.align),"overflow"!=e.showText&&e.text&&n.html(e.mobile?''+e.text+"":e.text),e.hasIcon="overflow"!=e.showIcon&&(e.icon||e.spriteCssClass||e.imageUrl),e.hasIcon&&this._addGraphics(),this.addUidAttr(),this.addOverflowAttr(),this.enable(e.enable),e.hidden&&this.hide(),this.element.data({type:"button",button:this})},select:function(e){e===t&&(e=!1),this.element.toggleClass(H,e),this.options.selected=e}}),x.toolbar.ToolBarButton=d,u=c.extend({init:function(e,t){this.overflow=!0,c.fn.init.call(this,e,t);var n=this.element;"toolbar"!=e.showText&&e.text&&n.html(e.mobile?''+e.text+"":''+e.text+""),e.hasIcon="toolbar"!=e.showIcon&&(e.icon||e.spriteCssClass||e.imageUrl),e.hasIcon&&this._addGraphics(),e.isChild||this._wrap(),this.addOverflowIdAttr(),this.attributes(),this.addUidAttr(),this.addOverflowAttr(),this.enable(e.enable),n.addClass(R+" "+I),e.hidden&&this.hide(),this.element.data({type:"button",button:this})},_wrap:function(){this.element=this.element.wrap("
            • ").parent()},overflowHidden:function(){this.element.addClass(ce)},select:function(e){e===t&&(e=!1),this.options.isChild?this.element.toggleClass(H,e):this.element.find(".k-button").toggleClass(H,e),this.options.selected=e}}),x.toolbar.OverflowButton=u,x.toolbar.registerComponent("button",d,u),h=l.extend({createButtons:function(t){var n,i,o=this.options,r=o.buttons||[];for(i=0;r.length>i;i++)r[i].uid||(r[i].uid=x.guid()),n=new t(e.extend({mobile:o.mobile,isChild:!0,type:"button"},r[i]),this.toolbar),n.element.appendTo(this.element)},refresh:function(){this.element.children().filter(":not('."+O+"'):first").addClass(V),this.element.children().filter(":not('."+O+"'):last").addClass(W)}}),x.toolbar.ButtonGroup=h,f=h.extend({init:function(t,n){var i=this.element=e("
              ");this.options=t,this.toolbar=n,this.addIdAttr(),t.align&&i.addClass("k-align-"+t.align),this.createButtons(d),this.attributes(),this.addUidAttr(),this.addOverflowAttr(),this.refresh(),i.addClass(F),this.element.data({type:"buttonGroup",buttonGroup:this})}}),x.toolbar.ToolBarButtonGroup=f,p=h.extend({init:function(t,n){var i=this.element=e("
            • ");this.options=t,this.toolbar=n,this.overflow=!0,this.addOverflowIdAttr(),this.createButtons(u),this.attributes(),this.addUidAttr(),this.addOverflowAttr(),this.refresh(),i.addClass((t.mobile?"":F)+" k-overflow-group"),this.element.data({type:"buttonGroup",buttonGroup:this})},overflowHidden:function(){this.element.addClass(ce)}}),x.toolbar.OverflowButtonGroup=p,x.toolbar.registerComponent("buttonGroup",f,p),m=l.extend({init:function(t,n){var i=this.element=e('
              ');this.options=t,this.toolbar=n,this.mainButton=new d(e.extend({},t,{hidden:!1}),n),this.arrowButton=e(''),this.popupElement=e('
                '),this.mainButton.element.removeAttr("href tabindex").appendTo(i),this.arrowButton.appendTo(i),this.popupElement.appendTo(i),t.align&&i.addClass("k-align-"+t.align),t.id||(t.id=t.uid),i.attr("id",t.id+"_wrapper"),this.addOverflowAttr(),this.addUidAttr(),this.createMenuButtons(),this.createPopup(),this._navigatable(),this.mainButton.main=!0,this.enable(t.enable),t.hidden&&this.hide(),i.data({type:"splitButton",splitButton:this,kendoPopup:this.popup})},_navigatable:function(){var t=this;t.popupElement.on("keydown","."+I,function(n){var i=e(n.target).parent();n.preventDefault(),n.keyCode===A.ESC||n.keyCode===A.TAB||n.altKey&&n.keyCode===A.UP?(t.toggle(),t.focus()):n.keyCode===A.DOWN?a(i,"next").focus():n.keyCode===A.UP?a(i,"prev").focus():n.keyCode!==A.SPACEBAR&&n.keyCode!==A.ENTER||t.toolbar.userEvents.trigger("tap",{target:e(n.target)})})},createMenuButtons:function(){var t,n,i=this.options,o=i.menuButtons;for(n=0;o.length>n;n++)t=new d(e.extend({mobile:i.mobile,type:"button",click:i.click},o[n]),this.toolbar),t.element.wrap("
              • ").parent().appendTo(this.popupElement)},createPopup:function(){var t=this.options,i=this.element;this.popupElement.attr("id",t.id+"_optionlist").attr(de,t.rootUid),t.mobile&&(this.popupElement=o(this.popupElement)),this.popup=this.popupElement.kendoPopup({appendTo:t.mobile?e(t.mobile).children(".km-pane"):null,anchor:i,isRtl:this.toolbar._isRtl,copyAnchorStyles:!1,animation:t.animation,open:n,activate:function(){this.element.find(":kendoFocusable").first().focus()},close:function(){i.focus()}}).data("kendoPopup"),this.popup.element.on(ee,"a.k-button",r)},remove:function(){this.popup.element.off(ee,"a.k-button"),this.popup.destroy(),this.element.remove()},toggle:function(){this.popup.toggle()},enable:function(e){e===t&&(e=!0),this.mainButton.enable(e),this.options.enable=e},focus:function(){this.element.focus()},hide:function(){this.popup&&this.popup.close(),this.element.addClass(O).hide(),this.options.hidden=!0},show:function(){this.element.removeClass(O).hide(),this.options.hidden=!1}}),x.toolbar.ToolBarSplitButton=m,g=l.extend({init:function(t,n){var i,o,r=this.element=e('
              • '),a=t.menuButtons;for(this.options=t,this.toolbar=n,this.overflow=!0,this.mainButton=new u(e.extend({isChild:!0},t)),this.mainButton.element.appendTo(r),o=0;a.length>o;o++)i=new u(e.extend({mobile:t.mobile,isChild:!0},a[o]),this.toolbar),i.element.appendTo(r);this.addUidAttr(),this.addOverflowAttr(),this.mainButton.main=!0,r.data({type:"splitButton",splitButton:this})},overflowHidden:function(){this.element.addClass(ce)}}),x.toolbar.OverflowSplitButton=g,x.toolbar.registerComponent("splitButton",m,g),v=l.extend({init:function(t,n){var i=this.element=e("
                 
                ");this.element=i,this.options=t,this.toolbar=n,this.attributes(),this.addIdAttr(),this.addUidAttr(),this.addOverflowAttr(),i.addClass(P),i.data({type:"separator",separator:this})}}),_=l.extend({init:function(t,n){var i=this.element=e("
              •  
              • ");this.element=i,this.options=t,this.toolbar=n,this.overflow=!0,this.attributes(),this.addUidAttr(),this.addOverflowIdAttr(),i.addClass(P),i.data({type:"separator",separator:this})},overflowHidden:function(){this.element.addClass(ce)}}),x.toolbar.registerComponent("separator",v,_),b=l.extend({init:function(t,n,i){var o=D(t)?t(n):t;o=o instanceof jQuery?o.wrap("
                ").parent():e("
                ").html(o),this.element=o,this.options=n,this.options.type="template",this.toolbar=i,this.attributes(),this.addUidAttr(),this.addIdAttr(),this.addOverflowAttr(),o.data({type:"template",template:this})}}),x.toolbar.TemplateItem=b,w=l.extend({init:function(t,n,i){var o=e(D(t)?t(n):t);o=o instanceof jQuery?o.wrap("
              • ").parent():e("
              • ").html(o),this.element=o,this.options=n,this.options.type="template",this.toolbar=i,this.overflow=!0,this.attributes(),this.addUidAttr(),this.addOverflowIdAttr(),this.addOverflowAttr(),o.data({type:"template",template:this})},overflowHidden:function(){this.element.addClass(ce)}}),x.toolbar.OverflowTemplateItem=w,y=C.extend({init:function(e){this.name=e,this.buttons=[]},add:function(e){this.buttons[this.buttons.length]=e},remove:function(t){var n=e.inArray(t,this.buttons);this.buttons.splice(n,1)},select:function(e){var t,n;for(n=0;this.buttons.length>n;n++)t=this.buttons[n],t.select(!1);e.select(!0),e.twin()&&e.twin().select(!0)}}),k=S.extend({init:function(t,n){var o,a=this;if(S.fn.init.call(a,t,n),n=a.options,t=a.wrapper=a.element,t.addClass(E+" k-widget"),this.uid=x.guid(),this._isRtl=x.support.isRtl(t),this._groups={},t.attr(de,this.uid),a.isMobile="boolean"==typeof n.mobile?n.mobile:a.element.closest(".km-root")[0],a.animation=a.isMobile?{open:{effects:"fade"}}:{},a.isMobile&&(t.addClass("km-widget"),j="km-icon",q="km-",I="km-button",F="km-buttongroup km-widget",H="km-state-active",N="km-state-disabled"),n.resizable?(a._renderOverflow(),t.addClass(L),a.overflowUserEvents=new x.UserEvents(a.element,{threshold:5,allowSelection:!0,filter:"."+Q,tap:T(a._toggleOverflow,a)}),a._resizeHandler=x.onResize(function(){a.resize()})):a.popup={element:e([])},n.items&&n.items.length)for(o=0;n.items.length>o;o++)a.add(n.items[o]);a.userEvents=new x.UserEvents(document,{threshold:5,allowSelection:!0,filter:"["+de+"="+this.uid+"] a."+I+", ["+de+"="+this.uid+"] ."+R,tap:T(a._buttonClick,a),press:i,release:i}),a.element.on(ee,"a.k-button",r),a._navigatable(),n.resizable&&a.popup.element.on(ee,NaN,r),n.resizable&&this._toggleOverflowAnchor(),x.notify(a)},events:[ee,te,ne,ie,oe,re],options:{name:"ToolBar",items:[],resizable:!0,mobile:null},addToGroup:function(e,t){var n;return n=this._groups[t]?this._groups[t]:this._groups[t]=new y,n.add(e),n},destroy:function(){var t=this;t.element.find("."+z).each(function(t,n){e(n).data("kendoPopup").destroy()}),t.element.off(ee,"a.k-button"),t.userEvents.destroy(),t.options.resizable&&(x.unbindResize(t._resizeHandler),t.overflowUserEvents.destroy(),t.popup.element.off(ee,"a.k-button"),t.popup.destroy()),S.fn.destroy.call(t)},add:function(t){var n,i,o,r=s[t.type],a=t.template,l=this,c=l.isMobile?"":"k-item k-state-default",d=t.overflowTemplate;if(e.extend(t,{uid:x.guid(),animation:l.animation,mobile:l.isMobile,rootUid:l.uid}),t.menuButtons)for(o=0;t.menuButtons.length>o;o++)e.extend(t.menuButtons[o],{uid:x.guid()});a&&!d?t.overflow=ae:t.overflow||(t.overflow=se),t.overflow!==ae&&l.options.resizable&&(d?i=new w(d,t,l):r&&(i=new r.overflow(t,l),i.element.addClass(c)),i&&(t.overflow===se&&i.overflowHidden(),i.element.appendTo(l.popup.container),l.angular("compile",function(){return{elements:i.element.get()}}))),t.overflow!==le&&(a?n=new b(a,t,l):r&&(n=new r.toolbar(t,l)),n&&(l.options.resizable?(n.element.appendTo(l.element).css("visibility","hidden"),l._shrink(l.element.innerWidth()),n.element.css("visibility","visible")):n.element.appendTo(l.element),l.angular("compile",function(){return{elements:n.element.get()}})))},_getItem:function(t){var n,i,o,r,a=this.options.resizable;return n=this.element.find(t),n.length||(n=e(".k-split-container[data-uid="+this.uid+"]").find(t)),r=n.length?n.data("type"):"",i=n.data(r),i?(i.main&&(n=n.parent("."+z),r="splitButton",i=n.data(r)),a&&(o=i.twin())):a&&(n=this.popup.element.find(t),r=n.length?n.data("type"):"",o=n.data(r),o&&o.main&&(n=n.parent("."+z),r="splitButton",o=n.data(r))),{type:r,toolbar:i,overflow:o}},remove:function(e){var t=this._getItem(e);t.toolbar&&t.toolbar.remove(),t.overflow&&t.overflow.remove(),this.resize(!0)},hide:function(e){var t=this._getItem(e);t.toolbar&&("button"===t.toolbar.options.type&&t.toolbar.options.isChild?(t.toolbar.hide(),t.toolbar.getParentGroup().refresh()):t.toolbar.options.hidden||t.toolbar.hide()),t.overflow&&("button"===t.overflow.options.type&&t.overflow.options.isChild?(t.overflow.hide(),t.overflow.getParentGroup().refresh()):t.overflow.options.hidden||t.overflow.hide()),this.resize(!0)},show:function(e){var t=this._getItem(e);t.toolbar&&("button"===t.toolbar.options.type&&t.toolbar.options.isChild?(t.toolbar.show(),t.toolbar.getParentGroup().refresh()):t.toolbar.options.hidden&&t.toolbar.show()),t.overflow&&("button"===t.overflow.options.type&&t.overflow.options.isChild?(t.toolbar.show(),t.overflow.getParentGroup().refresh()):t.overflow.options.hidden&&t.overflow.show()),this.resize(!0)},enable:function(e,n){var i=this._getItem(e);t===n&&(n=!0),i.toolbar&&i.toolbar.enable(n),i.overflow&&i.overflow.enable(n)},getSelectedFromGroup:function(e){return this.element.find("."+M+"[data-group='"+e+"']").filter("."+H)},toggle:function(n,i){var o=e(n),r=o.data("button");r.options.togglable&&(i===t&&(i=!0),r.toggle(i,!0))},_renderOverflow:function(){var t=this,n=s.overflowContainer,i=t._isRtl,r=i?"left":"right";t.overflowAnchor=e(s.overflowAnchor).addClass(I),t.element.append(t.overflowAnchor),t.isMobile?(t.overflowAnchor.append(''),n=o(n)):t.overflowAnchor.append(''),t.popup=new x.ui.Popup(n,{origin:"bottom "+r,position:"top "+r,anchor:t.overflowAnchor,isRtl:i,animation:t.animation,appendTo:t.isMobile?e(t.isMobile).children(".km-pane"):null,copyAnchorStyles:!1,open:function(n){var o=x.wrap(t.popup.element).addClass("k-overflow-wrapper");t.isMobile?t.popup.container.css("max-height",parseFloat(e(".km-content:visible").innerHeight())-15+"px"):o.css("margin-left",(i?-1:1)*((o.outerWidth()-o.width())/2+1)),t.trigger(oe)&&n.preventDefault()},activate:function(){this.element.find(":kendoFocusable").first().focus()},close:function(e){t.trigger(re)&&e.preventDefault(),this.element.focus()}}),t.popup.element.on("keydown","."+I,function(n){var i,o=e(n.target),r=o.parent(),s=r.is("."+F)||r.is("."+z);n.preventDefault(),n.keyCode===A.ESC||n.keyCode===A.TAB||n.altKey&&n.keyCode===A.UP?(t._toggleOverflow(),t.overflowAnchor.focus()):n.keyCode===A.DOWN?(i=!s||s&&o.is(":last-child")?r:o,a(i,"next").focus()):n.keyCode===A.UP?(i=!s||s&&o.is(":first-child")?r:o,a(i,"prev").focus()):n.keyCode!==A.SPACEBAR&&n.keyCode!==A.ENTER||t.userEvents.trigger("tap",{target:e(n.target)})}),t.popup.container=t.isMobile?t.popup.element.find("."+X):t.popup.element,t.popup.container.attr(de,this.uid)},_toggleOverflowAnchor:function(){var e=!1;e=this.options.mobile?this.popup.element.find("."+X).children(":not(."+ce+", ."+B+")").length>0:this.popup.element.children(":not(."+ce+", ."+B+")").length>0,this.overflowAnchor.css(e?{visibility:"visible",width:""}:{visibility:"hidden",width:"1px"})},_buttonClick:function(n){var i,o,r,a,s,l,c,d=this,u=n.target.closest("."+K).length;return n.preventDefault(),u?(d._toggle(n),t):(o=e(n.target).closest("."+I,d.element),o.hasClass(Q)||(r=o.data("button"),!r&&d.popup&&(o=e(n.target).closest("."+R,d.popup.container),r=o.parent("li").data("button")),r&&r.options.enable&&(r.options.togglable?(s=D(r.toggleHandler)?r.toggleHandler:null,r.toggle(!r.options.selected,!0),l={target:o,group:r.options.group,checked:r.options.selected,id:r.options.id},s&&s.call(d,l),d.trigger(te,l)):(s=D(r.clickHandler)?r.clickHandler:null,l={ +sender:d,target:o,id:r.options.id},s&&s.call(d,l),d.trigger(ee,l)),r.options.url&&(r.options.attributes&&r.options.attributes.target&&(c=r.options.attributes.target),window.open(r.options.url,c||"_self")),o.hasClass(R)&&d.popup.close(),a=o.closest(".k-split-container"),a[0]&&(i=a.data("kendoPopup"),(i?i:a.parents(".km-popup-wrapper").data("kendoPopup")).close()))),t)},_navigatable:function(){var t=this;t.element.attr("tabindex",0).focus(function(){var t=e(this).find(":kendoFocusable:first");t.is("."+Q)&&(t=a(t,"next")),t[0].focus()}).on("keydown",T(t._keydown,t))},_keydown:function(n){var i,o,r,a,s,l=e(n.target),c=n.keyCode,d=this.element.children(":not(.k-separator):visible");return c===A.TAB&&(i=l.parentsUntil(this.element).last(),o=!1,r=!1,i.length||(i=l),i.is("."+Q)&&(n.shiftKey&&n.preventDefault(),d.last().is(":kendoFocusable")?d.last().focus():d.last().find(":kendoFocusable").last().focus()),n.shiftKey||d.index(i)!==d.length-1||(o=i.is("."+F)?l.is(":last-child"):!0),n.shiftKey&&1===d.index(i)&&(r=i.is("."+F)?l.is(":first-child"):!0),o&&this.overflowAnchor&&"hidden"!==this.overflowAnchor.css("visibility")&&(n.preventDefault(),this.overflowAnchor.focus()),r&&(n.preventDefault(),this.wrapper.prev(":kendoFocusable").focus())),n.altKey&&c===A.DOWN?(a=e(document.activeElement).data("splitButton"),s=e(document.activeElement).is("."+Q),a?a.toggle():s&&this._toggleOverflow(),t):c!==A.SPACEBAR&&c!==A.ENTER||l.is("input, checkbox")?t:(n.preventDefault(),l.is("."+z)&&(l=l.children().first()),this.userEvents.trigger("tap",{target:l}),t)},_toggle:function(t){var n,i=e(t.target).closest("."+z).data("splitButton");t.preventDefault(),i.options.enable&&(n=i.popup.element.is(":visible")?this.trigger(ie,{target:i.element}):this.trigger(ne,{target:i.element}),n||i.toggle())},_toggleOverflow:function(){this.popup.toggle()},_resize:function(e){var t=e.width;this.options.resizable&&(this.popup.close(),this._shrink(t),this._stretch(t),this._markVisibles(),this._toggleOverflowAnchor())},_childrenWidth:function(){var t=0;return this.element.children(":visible:not('."+O+"')").each(function(){t+=e(this).outerWidth(!0)}),Math.ceil(t)},_shrink:function(e){var t,n,i;if(e=0&&(t=n.eq(i),!(e>this._childrenWidth()));i--)this._hideItem(t)},_stretch:function(e){var t,n,i;if(e>this._childrenWidth())for(n=this.element.children(":hidden:not('."+O+"')"),i=0;n.length>i&&(t=n.eq(i),!(eli[data-uid='"+e.data("uid")+"']").removeClass(ce)},_showItem:function(e,t){return e.length&&t>this._childrenWidth()+e.outerWidth(!0)?(e.show(),this.popup&&this.popup.container.find(">li[data-uid='"+e.data("uid")+"']").addClass(ce),!0):!1},_markVisibles:function(){var e=this.popup.container.children(),t=this.element.children(":not(.k-overflow-anchor)"),n=e.filter(":not(.k-overflow-hidden)"),i=t.filter(":visible");e.add(t).removeClass(J+" "+Z),n.first().add(i.first()).addClass(J),n.last().add(i.last()).addClass(Z)}}),x.ui.plugin(k)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.mediaplayer.min",["kendo.slider.min","kendo.toolbar.min","kendo.dropdownlist.min","kendo.tooltip.min"],e)}(function(){return function(e,t){var n=window.kendo,i="end",o="pause",r="play",a="ready",s="timeChange",l="volumeChange",c="k-i-fullscreen-enter",d="k-i-fullscreen-exit",u="k-i-volume-mute",h="k-i-volume-low",f="k-i-volume-high",p="k-mediaplayer-quality",m="k-i-play",g="k-i-pause",v="k-mediaplayer-titlebar",_="k-title",b="k-mediaplayer-toolbar",w="k-mediaplayer-seekbar",y="k-mediaplayer-volume",k="k-mediaplayer-media",x="k-mediaplayer-overlay",C="k-mediaplayer-yt",S=".",T=n.ui,D=".kendoMediaPlayer",A=new Date(1970,0,1),E=60*A.getTimezoneOffset(),I=n.ui.Widget,R=e.isArray,M={shortTime:"mm:ss",longTime:"HH:mm:ss"},F=n.template,z=e.proxy,P=n.keys,B={htmlPlayer:" ",titleBar:F("
                Video Title
                "),toolBar:"
                ",youtubePlayer:"
                ",toolBarTime:"00:00:00 / 00:00:00",slider:"",volumeSlider:"",qualityDropDown:"",toolTip:"#= kendo.toString(new Date(value), 'HH:mm:ss') #"},L=I.extend({init:function(t,i){this.wrapper=e(t),I.fn.init.call(this,t,i),this.wrapper.addClass("k-mediaplayer k-widget"),i=this.options,this._currentIndex=0,this._createTitlebar(),this._createToolbar(),this._createDropDown(),this._createSlider(),this._createVolumeSlider(),this._timers={},this._aria(),this._navigatable(),i.media&&this.media(this.options.media),n.notify(this)},events:[i,o,r,a,s,l],options:{name:"MediaPlayer",autoPlay:!1,autoRepeat:!1,volume:100,fullScreen:!1,mute:!1,navigatable:!1,forwardSeek:!0,media:null,messages:{pause:"Pause",play:"Play",mute:"Mute",unmute:"Unmute",quality:"Quality",fullscreen:"Full Screen"}},_msToTime:function(e){var t=new Date(A.getTime());return t.setSeconds(e),t},_timeToSec:function(e){var t=new Date(e).getTime();return t/1e3},_createTitlebar:function(){this._titleBar=this.wrapper.find(S+v),0===this._titleBar.length&&(this._titleBar=this.wrapper.find(S+v),this.wrapper.append(B.titleBar),this._titleBar=this.wrapper.find(S+v))},_createSlider:function(){var e=this.wrapper.find(S+w);this._slider||(this._sliderDragChangeHandler=z(this._sliderDragChange,this),this._sliderDraggingHandler=z(this._sliderDragging,this),e=this.wrapper.find(S+w),this._slider=new T.Slider(e[0],{smallStep:1e3,tickPlacement:"none",showButtons:!1,change:this._sliderDragChangeHandler,slide:this._sliderDraggingHandler,tooltip:{template:B.toolTip},dragHandleTitle:""}))},_createVolumeSlider:function(){var t=this.wrapper.find(S+y);this._volumeSlider||(this._volumeDraggingHandler=z(this._volumeDragging,this),this._volumeChangeHandler=z(this._volumeChange,this),t=e(S+y),t.width(87),this._volumeSlider=new T.Slider(t[0],{smallStep:1,min:0,max:100,value:this.options.volume,slide:this._volumeDraggingHandler,change:this._volumeChangeHandler,tickPlacement:"none",showButtons:!1,tooltip:{enabled:!1},dragHandleTitle:""}))},_resetTime:function(){this._youTubeVideo?this._ytmedia.seekTo(0,!0):this._media.currentTime=0,this._mediaTimeUpdate(),e.grep(this._toolBar.options.items,function(e){return!!e.template}).template=B.toolBarTime},_currentUrl:function(){var e=this.media();return R(e.source)?e.source[this._currentIndex].url:e.source},_isYouTubeUrl:function(){return!!this._currentUrl().match("youtube.com/|youtu.be/")},_setPlayerUrl:function(){var e,t=this._youTubeVideo;this.stop(),this._youTubeVideo=this._isYouTubeUrl(),t!==this._youTubeVideo&&(this.wrapper.find(S+C).toggle(),this.wrapper.find(S+k).toggle()),e=this._media||this._ytmedia,this._initializePlayer(),e&&(this.mute(this.mute()),this.volume(this.volume())),this._youTubeVideo?this._ytmedia&&(this._videoOverlay&&this._videoOverlay.hide(),this.options.autoPlay?(this._ytmedia.loadVideoById(this._getMediaId()),this._playStateToggle(!0)):(this._ytmedia.cueVideoById(this._getMediaId()),this._playStateToggle(!0))):(this._videoOverlay.show(),this.wrapper.find(S+k+" > source").remove(),this.wrapper.find(S+k).attr("src",this._currentUrl()),this.options.autoPlay&&this.play())},_createToolbar:function(){var t,n,i=this.wrapper.find(S+b);0===i.length&&(this._toolbarClickHandler=z(this._toolbarClick,this),this.wrapper.append(B.toolBar),i=e(S+b),i.width(e(S+k).width()),this._toolBar=new T.ToolBar(i,{click:this._toolbarClickHandler,resizable:!1,items:[{template:B.slider},{type:"button",spriteCssClass:"k-icon k-font-icon k-i-play"},{template:B.toolBarTime},{type:"button",spriteCssClass:"k-icon k-font-icon k-i-volume-high"},{template:B.volumeSlider},{template:B.qualityDropDown},{type:"button",spriteCssClass:"k-icon k-font-icon k-i-fullscreen-enter"}]}),t=i.find('span[class*="k-i-volume"]'),this._volumeButton=t.parent("a"),n=i.find('span[class*="k-i-fullscreen"]'),this._fullscreenButton=n.parent("a"),this._volumeButton.attr("title",this.options.mute?this.options.messages.unmute:this.options.messages.mute),this._volumeButton.attr("aria-label",this.options.mute?this.options.messages.unmute:this.options.messages.mute),this._fullscreenButton.attr("title",this.options.messages.fullscreen),this._fullscreenButton.attr("aria-label",this.options.messages.fullscreen),i.width("auto"),this._currentTimeElement=i.find(".k-mediaplayer-currenttime"),this._durationElement=i.find(".k-mediaplayer-duration"),this._playButtonSpan=i.find('span[class*="k-i-play"]'),this._playButton=this._playButtonSpan.parent("a"),this.options.autoPlay&&this._playStateToggle(!0),e([this._volumeButton[0],i.find(".k-mediaplayer-volume").parent()[0],i.find(".k-mediaplayer-quality").parent()[0],this._fullscreenButton[0]]).wrapAll("
                "),e(".k-button",i).addClass("k-button-bare"))},_createDropDown:function(){var e=this.wrapper.find(S+p),n=this.media();t===e.data("kendoDropDownList")&&(this._dropDownSelectHandler=z(this._dropDownSelect,this),this._dropDown=new T.DropDownList(e,{dataTextField:"quality",dataValueField:"url",popup:{position:"bottom",origin:"top",appendTo:this.wrapper},animation:{open:{effects:"slideIn:up",duration:1}},select:this._dropDownSelectHandler}),n&&R(n.source)&&(this._dropDown.setDataSource(n.source),this._dropDown.select(0)),this._dropDown.wrapper.addClass("k-button k-button-bare"),this._dropDown.wrapper.attr("title",this.options.messages.quality).hide(),this._dropDown.wrapper.find("span.k-i-arrow-s").removeClass("k-i-arrow-s").addClass("k-font-icon k-i-HD"),this._dropDown.list.addClass("k-quality-list"))},_dropDownSelect:function(e){this._currentIndex!==e.item.index()&&(this._currentIndex=e.item.index(),this._setPlayerUrl())},_toolbarClick:function(t){var n,i=e(t.target).children().first(),o=i.hasClass(m);this.media()&&((i.hasClass(m)||i.hasClass(g))&&(o?this.play():this.pause()),(i.hasClass(c)||i.hasClass(d))&&(this._isInFullScreen?(i.removeClass(d).addClass(c),this.fullScreen(!1)):(i.removeClass(c).addClass(d),this.fullScreen(!0))),(i.hasClass(u)||i.hasClass(h)||i.hasClass(f))&&(n=this.mute(),this.mute(!n)))},_sliderDragging:function(){this.media()&&(this._isDragging=!0)},_sliderDragChange:function(e){var t=this,n=e.sender,i=1e3*E;this.media()&&(t._sliderChangeFired=!0,t._isDragging=!1,!this.options.forwardSeek&&n.value()>this._seekBarLastPosition?setTimeout(function(){n.value(t._seekBarLastPosition)},1):this._youTubeVideo?t._ytmedia.seekTo(t._timeToSec(e.value-i)):t._media.currentTime=t._timeToSec(e.value-i),t.trigger(s),t._preventPlay=!0)},_changeVolumeButtonImage:function(e){var t=this._volumeButton,n=t.find("span"),i=n.attr("class");i=i.substring(0,i.lastIndexOf(" ")),0===e?(n.attr("class",i+" "+u),t.attr("title",this.options.messages.unmute),t.attr("aria-label",this.options.messages.unmute)):e>0&&51>e?(n.attr("class",i+" "+h),t.attr("title",this.options.messages.mute),t.attr("aria-label",this.options.messages.mute)):(n.attr("class",i+" "+f),t.attr("title",this.options.messages.mute),t.attr("aria-label",this.options.messages.mute))},_volumeDragging:function(e){this.media()&&(this.volume(e.value),this._changeVolumeButtonImage(e.value),this.trigger(l))},_volumeChange:function(e){this.media()&&(this.volume(e.value),this._changeVolumeButtonImage(e.value),this.trigger(l))},_mediaTimeUpdate:function(){var e=this._youTubeVideo?this._ytmedia.getCurrentTime():this._media.currentTime,t=this._msToTime(e);return this._currentTimeElement.text(n.toString(t,this._timeFormat)),this._isDragging||(this._seekBarLastPosition=1e3*(e+E),this._slider.value(this._seekBarLastPosition)),this.isPlaying()},_playStateToggle:function(e){t===e&&(e=this._playButtonSpan.is(S+m)),e?(this._playButtonSpan.removeClass(m).addClass(g),this._playButton.attr("title",this.options.messages.pause),this._playButton.attr("aria-label",this.options.messages.pause)):(this._playButtonSpan.removeClass(g).addClass(m),this._playButton.attr("title",this.options.messages.play),this._playButton.attr("aria-label",this.options.messages.play))},_mediaEnded:function(){this._playStateToggle(!1),this._currentTimeElement.text(n.toString(this._msToTime(0),this._timeFormat)),this._slider.value(1e3*(0+E)),this.trigger(i)},_mediaPlay:function(){this.trigger(r)},_mediaReady:function(){this.trigger(a)},_mediaDurationChange:function(){var e=this._msToTime(this._youTubeVideo?this._ytmedia.getDuration():this._media.duration);this._timeFormat=0===e.getHours()?M.shortTime:M.longTime,this._durationElement.text(n.toString(e,this._timeFormat)),this._slider.setOptions({min:A.getTime(),max:e.getTime()}),this._slider._distance=Math.round(this._slider.options.max-this._slider.options.min),this._slider._resize(),this._isFirstRun||(this._resetTime(),this._isFirstRun=!0)},_createYoutubePlayer:function(){this._mediaTimeUpdateHandler=z(this._mediaTimeUpdate,this),this._mediaDurationChangeHandler=z(this._mediaDurationChange,this),this.wrapper.prepend(B.youtubePlayer),this._ytPlayer=this.wrapper.find(S+C)[0],e(this._ytPlayer).css({width:this.wrapper.width(),height:this.wrapper.height()}),window.YT&&window.YT.Player?this._configurePlayer():(e.getScript("https://www.youtube.com/iframe_api"),this._youtubeApiReadyHandler=z(this._youtubeApiReady,this),window.onYouTubeIframeAPIReady=this._youtubeApiReadyHandler)},_poll:function(e,t,n,i){var o=this;return null!==o._timers[e]&&clearTimeout(o._timers[e]),o._timers[e]=setTimeout(function(i){return function r(){t.call(i)&&(o._timers[e]=setTimeout(r,n))}}(i),n)},_youtubeApiReady:function(){this._configurePlayer()},_configurePlayer:function(){var e,t={autoplay:+this.options.autoPlay,wmode:"transparent",controls:0,rel:0,showinfo:0};this._onYouTubePlayerReady=z(this._onYouTubePlayerReady,this),window.onYouTubePlayerReady=this._onYouTubePlayerReady,this._onPlayerStateChangeHandler=z(this._onPlayerStateChange,this),window.onPlayerStateChange=this._onPlayerStateChange,e=new window.YT.Player(this.wrapper.find(S+C)[0],{height:this.wrapper.height(),width:this.wrapper.width(),videoId:this._getMediaId(),playerVars:t,events:{onReady:this._onYouTubePlayerReady,onStateChange:this._onPlayerStateChangeHandler}})},_onYouTubePlayerReady:function(e){this._ytmedia=e.target,this._ytmedia.getIframe().style.width="100%",this._ytmedia.getIframe().style.height="100%",this._youTubeVideo=!0,this._mediaDurationChangeHandler(),this.options.autoPlay?(this._playStateToggle(!0),this._ytmedia.loadVideoById(this._getMediaId())):this._ytmedia.cueVideoById(this._getMediaId()),this.options.mute&&this.mute(!0),this.trigger(a)},_updateTitle:function(){this.titlebar().text(this.media().title||this.media().source)},_onPlayerStateChange:function(e){0===e.data?(this._slider.value(0),this._paused=!1,this._playStateToggle(!0),this.trigger(i),this.options.autoRepeat&&this.play()):1===e.data?(this._ytmedia.setVolume(this.volume()),this._sliderChangeFired?this._sliderChangeFired=!1:this._uiDisplay(!1),this.trigger(r),this._playStateToggle(!0),this._poll("progress",this._mediaTimeUpdate,500,this),this._paused=!1):2===e.data&&(this._paused||(this._uiDisplay(!0),this._playStateToggle(!1),this.trigger(o),this._paused=!0))},_getMediaId:function(){var e=this._currentUrl(),t=/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/,n=e.match(t);return n&&11===n[7].length&&(e=n[7]),e},_mouseClick:function(){this.isPaused()?this.play():this.pause()},_initializePlayer:function(){this._mouseMoveHandler||(this._mouseMoveHandler=z(this._mouseMove,this),this._mouseInHandler=z(this._mouseIn,this),this._mouseOutHandler=z(this._mouseOut,this),e(this.wrapper).on("mouseenter"+D,this._mouseInHandler).on("mouseleave"+D,this._mouseOutHandler).on("mousemove"+D,this._mouseMoveHandler)),!this._ytmedia&&this._youTubeVideo?this._createYoutubePlayer():this._media||this._youTubeVideo||this._createHtmlPlayer()},_createHtmlPlayer:function(){this._videoOverlay||(this._mouseClickHanlder=z(this._mouseClick,this),this.wrapper.append("
                "),this._videoOverlay=this.wrapper.find(".k-mediaplayer-overlay").on("click"+D,this._mouseClickHanlder)),this._mediaTimeUpdateHandler=z(this._mediaTimeUpdate,this),this._mediaDurationChangeHandler=z(this._mediaDurationChange,this),this._mediaEndedHandler=z(this._mediaEnded,this),this._mediaCanPlayHandler=z(this._mediaReady,this),this._mediaPlayHandler=z(this._mediaPlay,this),this._videoOverlay.after(B.htmlPlayer),this._media=this.wrapper.find(S+k)[0],e(this._media).css({width:"100%",height:"100%"}),this.options.mute&&this.mute(!0),this._media.ontimeupdate=this._mediaTimeUpdateHandler,this._media.ondurationchange=this._mediaDurationChangeHandler,this._media.oncanplay=this._mediaCanPlayHandler,this._media.onplay=this._mediaPlayHandler,this._media.onended=this._mediaEndedHandler},_mouseIn:function(){this._uiDisplay(!0)},_mouseOut:function(){this._poll("mouseIdle",this._mouseIdle,3e3,this)},_mouseIdle:function(){return this._uiDisplay(!1),!1},_mouseMove:function(){this._titleBar.is(":animated")||this._toolBar.element.is(":animated")||this._slider.wrapper.is(":animated")||this._uiDisplay(!0),this._poll("mouseIdle",this._mouseIdle,3e3,this)},_uiDisplay:function(e){var t="slow",n=this._titleBar.add(this._toolBar.element).add(this._slider.wrapper);e?n.fadeIn(t):n.fadeOut(t)},setOptions:function(e){I.fn.setOptions.call(this,e)},destroy:function(){I.fn.destroy.call(this),this.isPaused()||this.pause(),this.element.off(D),this.element.find(S+x).off(D),this._timers=null,this._mouseMoveHandler=null,this._mouseOutHandler=null,this._mouseInHandler=null,this._mouseClickHanlder=null,this._keyDownHandler=null,this._fullscreenHandler=null,this._toolbarClickHandler=null,this._sliderDragChangeHandler=null,this._sliderDraggingHandler=null,this._volumeDraggingHandler=null,this._volumeChangeHandler=null,this._youtubeApiReadyHandler=null,this._onYouTubePlayerReady=null,this._onPlayerStateChangeHandler=null,this._dropDownSelectHandler=null,this._media.ontimeupdate=this._mediaTimeUpdateHandler=null,this._media.ondurationchange=this._mediaDurationChangeHandler=null,this._media.oncanplay=this._mediaCanPlayHandler=null,this._media.onplay=this._mediaPlayHandler=null,this._media.onended=this._mediaEndedHandler=null,this._youTubeVideo?this._ytmedia.destroy():(this._media.src="",this._media.remove()),this._mouseMoveTimer=null,clearTimeout(this._mouseMoveTimer),n.destroy(this.element)},seek:function(e){if(t===e)return 1e3*this._youTubeVideo?this._ytmedia.getCurrentTime():this._media?this._media.currentTime:0;var n=e/1e3;return this._youTubeVideo?n+3>=this._ytmedia.getDuration()|0?this._ytmedia.seekTo(this._ytmedia.getDuration()-3|0,!0):this._ytmedia.seekTo(n,!0):this._media.currentTime=n,this},play:function(){return this._youTubeVideo?this._ytmedia.playVideo():(this._uiDisplay(!1),this._media.play()),this._paused=!1,this._playStateToggle(!0),this},stop:function(){return this._youTubeVideo&&this._ytmedia?this._ytmedia.stopVideo():this._media&&!this._youTubeVideo&&(this._uiDisplay(!0),this._media.pause(),this._media.currentTime=0),this._paused=!0,this._playStateToggle(!1),this},pause:function(){return this._youTubeVideo?this._ytmedia.pauseVideo():(this._uiDisplay(!0),this._media.pause()),this._paused=!0,this._playStateToggle(!1),this.trigger(o),this},toolbar:function(){return this._toolBar},dropdown:function(){return this._dropDown},titlebar:function(){return this._titleBar},fullScreen:function(e){if(t===e)return this._isInFullScreen||!1;var n=this.element.get(0);e?(this._width=this.element.width(),this._height=this.element.height(),this.element.width("100%").height("100%").css({position:"fixed",top:0,left:0}),n.requestFullscreen?n.requestFullscreen():n.webkitRequestFullscreen?n.webkitRequestFullscreen():n.mozRequestFullScreen?n.mozRequestFullScreen():n.msRequestFullscreen&&n.msRequestFullscreen(),this._isInFullScreen=!0):(document.cancelFullscreen?document.cancelFullscreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.msCancelFullscreen?document.msCancelFullscreen():document.exitFullscreen?document.exitFullscreen():document.msExitFullscreen&&document.msExitFullscreen(),this.element.css({position:"relative",top:null,left:null}),this.element.width(this._width),this.element.height(this._height),this._isInFullScreen=!1)},volume:function(e){return t===e?t!==this._volume?this._volume:this._volume=this.options.volume:(this._volume=e,this.mute(0>=e),this._youTubeVideo?this._ytmedia.setVolume(this._volume):this._media.volume=this._volume/100,this._volumeSlider.value(e),t)},mute:function(e){return t===e?this._youTubeVideo?this._ytmedia&&this._ytmedia.isMuted():this._media&&this._media.muted:(this._youTubeVideo?e?this._ytmedia.mute():this._ytmedia.unMute():this._media.muted=e,this._volumeSlider.value(e?0:this._media&&100*this._media.volume||this._ytmedia&&this._ytmedia.getVolume()),this.trigger(l),this._changeVolumeButtonImage(this._volumeSlider.value()),t)},isEnded:function(){return this._youTubeVideo?0===this._ytmedia.getPlayerState():this._media.ended},media:function(e){var n=this.dropdown();return t===e?t!==this._mediaData?this._mediaData:this._mediaData=this.options.media:(R(e.source)?(n.setDataSource(e.source),n.wrapper.show()):n.wrapper.hide(),this._mediaData=e,this._updateTitle(),this._setPlayerUrl(),t)},isPaused:function(){return this._paused},isPlaying:function(){return!this.isEnded()&&!this._paused},_aria:function(){this.wrapper.attr("role","region")},_navigatable:function(){this._fullscreenHandler=z(this._fullscreen,this),e(document).on("webkitfullscreenchange mozfullscreenchange fullscreenchange"+D,this._fullscreenHandler),this.options.navigatable&&(this.wrapper.attr("tabIndex",0),this._keyDownHandler=z(this._keyDown,this),this.wrapper.on("keydown"+D,this._keyDownHandler)),this._fullscreenHandler=z(this._fullscreen,this),e(document).on("webkitfullscreenchange mozfullscreenchange fullscreenchange"+D,this._fullscreenHandler)},_fullscreen:function(){var e=document.fullScreen||document.mozFullScreen||document.webkitIsFullScreen;this._uiDisplay(!0),this._slider.resize(),e||(this.wrapper.find('span[class*="k-i-fullscreen"]').removeClass(d).addClass(c),this.fullScreen(!1))},_keyDown:function(e){if(e.preventDefault(),e.keyCode===P.SPACEBAR&&(this.isPlaying()?this.pause():this.play()),e.keyCode===P.ENTER&&(this.wrapper.find('span[class*="k-i-fullscreen"]').removeClass(c).addClass(d),this.fullScreen(!0)),77===e.keyCode){var t=this.mute();this.mute(!t)}},_error:function(){},_progress:function(){}});T.plugin(L)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.pivotgrid.min",["kendo.dom.min","kendo.data.min"],e)}(function(){return function(e,t){function n(e){var n="string"==typeof e?[{name:e}]:e,i="[object Array]"===_e.call(n)?n:n!==t?[n]:[];return we(i,function(e){return"string"==typeof e?{name:e}:{name:e.name,type:e.type}})}function i(e){var n="string"==typeof e?[{name:[e],expand:!1}]:e,i="[object Array]"===_e.call(n)?n:n!==t?[n]:[];return we(i,function(e){return"string"==typeof e?{name:[e],expand:!1}:{name:"[object Array]"===_e.call(e.name)?e.name.slice():[e.name],expand:e.expand}})}function o(e){return-1!==e.indexOf(" ")&&(e='["'+e+'"]'),e}function r(e,t,n,i){var o,a,s,l;if(n||(n=t),i||(i=0),l=n.members[i],l&&!l.measure){if(s=l.children,a=s.length,n===t?e[fe.stringify([l.name])]=!!a:a&&(e[fe.stringify(se(n,i))]=!0),a)for(o=0;a>o;o++)r(e,t,s[o],i);r(e,t,n,i+1)}}function a(t){var n,i,o={};t.length&&r(o,t[0]),n=[];for(i in o)n.push({name:e.parseJSON(i),expand:o[i]});return n}function s(e,t){var n,i,o,r,a=t.tuples||[],s=a[0];if(s&&s.members.length>e.length)for(n=s.members,i=0;n.length>i;i++)if(!n[i].measure){for(o=!1,r=0;e.length>r;r++)if(0===H(e[r]).indexOf(n[i].hierarchy)){o=!0;break}o||e.push({name:[n[i].name],expand:!1})}}function l(e){var t,n=[],i=e.members;for(t=0;i.length>t;t++)i[t].measure||n.push({name:[i[t].name],expand:i[t].children.length>0});return n}function c(e,t,n){var o,r;return e=e||{},s(t,e),n.length>1&&t.push({name:Se,measure:!0,children:i(n)}),o={members:t},e.tuples&&(r=x(e.tuples,o),r.tuple&&(t=l(r.tuple))),t}function d(e){var t=fe.getter(e.field,!0);return function(n,i){return e.aggregate(t(n.dataItem),i,n)}}function u(e){return"number"==typeof e&&!isNaN(e)}function h(e){return e&&e.getTime}function f(e){return e[e.length]={value:"",fmtValue:"",ordinal:e.length},e}function p(e,n,i){return e.tuples.length<_(n.tuples,i)?n:t}function m(e,t,n,i,o){var r,a,s,l=e.length,c=_(t,i),d=i.length||1;for(a=0;n>a;a++)for(r=0;l>r;r++)s=v(e[r],t)*d,s+=r%d,o[a*l+r].ordinal=a*c+s}function g(e,t,n,i,o){var r,a,s,l=e.length,c=i.length||1;for(a=0;l>a;a++)for(s=v(e[a],t),s*=c,s+=a%c,r=0;n>r;r++)o[a*n+r].ordinal=s*n+r}function v(e,t){return x(t,e).index}function _(e,t){var n,i,o;if(!e.length)return 0;for(n=e.slice(),i=n.shift(),o=1;i;)i.members?[].push.apply(n,i.members):i.children&&(i.measure||(o+=i.children.length),[].push.apply(n,i.children)),i=n.shift();return t.length&&(o*=t.length),o}function b(e){return e||(e={tuples:[]}),e.tuples||(e.tuples=[]),e}function w(e,t,n){var i,o,r,a;if(!e)return 0;for(i=Math.max(n.length,1),o=e.members.slice(0,t),r=i,a=o.shift(),i>1&&(i+=1);a;)a.name===Se?r+=i:a.children?[].push.apply(o,a.children):(r++,[].push.apply(o,a.members)),a=o.shift();return r}function y(e,t,n){var i,o,r,a,s,l;if(!t[0])return{parsedRoot:null,tuples:e,memberIndex:0,index:0};if(i=x(e,t[0]),!i.tuple)return{parsedRoot:null,tuples:t,memberIndex:0,index:0};if(o=i.tuple.members,r=t[0].members,a=-1,o.length!==r.length)return{parsedRoot:null,tuples:t,memberIndex:0,index:0};for(s=0,l=o.length;l>s;s++)!o[s].measure&&r[s].children[0]&&(-1==a&&r[s].children.length&&(a=s),o[s].children=r[s].children);return n=Math.max(n.length,1),{parsedRoot:i.tuple,index:i.index*n,memberIndex:a,tuples:e}}function k(e,t){var n,i,o=!0;for(e=e.members,t=t.members,n=0,i=e.length;i>n;n++)e[n].measure||t[n].measure||(o=o&&H(e[n])===H(t[n]));return o}function x(e,t){var n,i,o,r,a,s,l,c=0;for(n=0,i=e.length;i>n;n++){if(o=e[n],k(o,t))return{tuple:o,index:c};for(c++,a=0,s=o.members.length;s>a;a++)if(l=o.members[a],!l.measure&&(r=x(l.children,t),c+=r.index,r.tuple))return{tuple:r.tuple,index:c}}return{index:c}}function C(e,t){var n,i,o,r="";for(i=0,o=e.length;o>i;i++)n=e[i],r+=n.name,t[r]||(t[r]=n)}function S(e,t){var n,i,o,r,a=e.members,s="",l="";for(n=0,i=a.length;i>n;n++){if(o=a[n],r){if(t[s+o.name]){s+=o.name,r=t[s];continue}return t[s+o.parentName]?t[s+o.parentName]:t[l+o.parentName]?t[l+o.parentName]:t[l]}if(s+=o.name,r=t[o.parentName],!r&&(r=t[s],!r))return null;r&&(l+=r.name)}return r}function T(e,t){var n,i,o,r;if(0===t.length)return-1;for(n=t[0],i=e.members,o=0,r=i.length;r>o;o++)if(i[o].name==n.name)return o}function D(n,i){if(!(0>i)){var o={name:Se,measure:!0,children:[e.extend({members:[],dataIndex:n.dataIndex},n.members[i])]};n.members.splice(i,1,o),n.dataIndex=t}}function A(e,t){var n,i,o,r,a,s;if(1>e.length)return[];for(n=[],i={},o=T(e[0],t),r=0;e.length>r;r++)a=e[r],a.dataIndex=r,D(a,o),s=S(a,i),s?s.children.push(0>o||!s.measure?a:a.members[o].children[0]):n.push(a),C(a.members,i);return n}function E(e,t){var n,i,o,r,a,s,l,c,d;if(!e||!e.length)return t;for(n=[],i=R(e),o=i.length,r=Math.max(t.length/o,1),a=0;o>a;a++)for(l=r*a,c=r*i[a],s=0;r>s;s++)d=parseInt(c+s,10),n[parseInt(l+s,10)]=t[d]||{value:"",fmtValue:"",ordinal:d};return n}function I(e,t){var n,i,o,r,a,s,l,c;if(!e||!e.length)return t;for(n=[],i=R(e),o=i.length,r=Math.max(t.length/o,1),s=0;r>s;s++)for(l=o*s,a=0;o>a;a++)c=i[a]+l,n[l+a]=t[c]||{value:"",fmtValue:"",ordinal:c};return n}function R(e){var n,i,o,r,a,s,l;for(e=e.slice(),n=[],i=e.shift();i;){for(i.dataIndex!==t&&n.push(i.dataIndex),a=0,o=0,r=i.members.length;r>o;o++)l=i.members[o],s=l.children,l.measure?[].splice.apply(e,[0,0].concat(s)):[].splice.apply(e,[a,0].concat(s)),a+=s.length;i=e.shift()}return n}function M(e){var t=e.split(".");return t.length>2?t[0]+"."+t[1]:e}function F(e,t){var n=e.length-1,i=e[n],o=z(t,i);return o&&o.dir?i="ORDER("+i+".Children,"+o.field+".CurrentMember.MEMBER_CAPTION,"+o.dir+")":i+=".Children",e[n]=i,e}function z(e,t){for(var n=0,i=e.length;i>n;n++)if(0===t.indexOf(e[n].field))return e[n];return null}function P(e){var t,n="CROSSJOIN({";return e.length>2?(t=e.pop(),n+=P(e)):(n+=e.shift(),t=e.pop()),n+="},{",n+=t,n+="})"}function B(e,t){var n=e.slice(0);return t.length>1&&n.push("{"+L(t).join(",")+"}"),P(n)}function L(e){for(var n,i=0,o=e.length,r=[];o>i;i++)n=e[i],r.push(n.name!==t?n.name:n);return r}function H(e){return e=e.name||e,"[object Array]"===_e.call(e)&&(e=e[e.length-1]),e}function N(e){for(var t=e.length,n=[],i=0;t>i;i++)n.push(e[i].name[0]);return n}function O(e,t){var n,i,o,r=0,a=e.length,s=t.length;for(t=t.slice(0);a>r;r++)for(n=e[r],o=0;s>o;o++)if(i=M(t[o]),-1!==n.indexOf(i)){t[o]=n;break}return{names:t,expandedIdx:o,uniquePath:t.slice(0,o+1).join("")}}function V(e){for(var t,n,i,o,r,a,s=[],l=[],c=[],d=0,u=e.length;u>d;d++)if(t=e[d],o=t.name,a=!1,"[object Array]"!==_e.call(o)&&(t.name=o=[o]),o.length>1)l.push(t);else{for(r=M(o[0]),n=0,i=c.length;i>n;n++)if(0===c[n].name[0].indexOf(r)){a=!0;break}a||c.push(t),t.expand&&s.push(t)}return s=s.concat(l),{root:c,expanded:s}}function W(e,t,n){var i,o,r,a,s,l,c,d,u="";if(e=e||[],i=V(e),o=i.root,r=N(o),a=[],i=i.expanded,s=i.length,l=0,d=[],r.length>1||t.length>1){for(a.push(B(r,t));s>l;l++)c=F(i[l].name,n),d=O(c,r).names,a.push(B(d,t));u+=a.join(",")}else{for(;s>l;l++)c=F(i[l].name,n),d.push(c[0]);u+=r.concat(d).join(",")}return u}function U(e){var t="",n=e.value,i=e.field,o=e.operator;return"in"==o?(t+="{",t+=n,t+="}"):(t+="Filter(",t+=i+".MEMBERS",t+=fe.format(Y[o],i,n),t+=")"),t}function j(e,t){var n,i,o="",r=e.filters,a=r.length;for(i=a-1;i>=0;i--)n="SELECT (",n+=U(r[i]),n+=") ON 0",i==a-1?(n+=" FROM ["+t+"]",o=n):o=n+" FROM ( "+o+" )";return o}function q(e,t,n){var i,o,r="";if(t){r+="<"+e+">";for(o in t)i=t[o],n&&(o=o.replace(/([A-Z]+(?=$|[A-Z][a-z])|[A-Z]?[a-z]+)/g,"$1_").toUpperCase().replace(/_$/,"")),r+="<"+o+">"+i+"";r+=""}else r+="<"+e+"/>";return r}function G(e){if(null==e)return[];var t=_e.call(e);return"[object Array]"!==t?[e]:e}function $(e){var t,n,i,o,r={tuples:[]},a=G(fe.getter("Tuples.Tuple",!0)(e)),s=fe.getter("Caption['#text']"),l=fe.getter("UName['#text']"),c=fe.getter("LName['#text']"),d=fe.getter("LNum['#text']"),u=fe.getter("CHILDREN_CARDINALITY['#text']",!0),h=fe.getter("['@Hierarchy']"),f=fe.getter("PARENT_UNIQUE_NAME['#text']",!0);for(t=0;a.length>t;t++){for(n=[],i=G(a[t].Member),o=0;i.length>o;o++)n.push({children:[],caption:s(i[o]),name:l(i[o]),levelName:c(i[o]),levelNum:d(i[o]),hasChildren:parseInt(u(i[o]),10)>0,parentName:f(i[o]),hierarchy:h(i[o])});r.tuples.push({members:n})}return r}var Y,K,Q,X,J,Z,ee,te,ne,ie,oe,re,ae,se,le,ce,de,ue,he,fe=window.kendo,pe=fe.ui,me=fe.Class,ge=pe.Widget,ve=fe.data.DataSource,_e={}.toString,be=function(e){return e},we=e.map,ye=e.extend,ke=fe.isFunction,xe="change",Ce="error",Se="Measures",Te="progress",De="stateReset",Ae="auto",Ee="
                ",Ie=".kendoPivotGrid",Re="__row_total__",Me="dataBinding",Fe="dataBound",ze="expandMember",Pe="collapseMember",Be="k-i-arrow-s",Le="k-i-arrow-e",He="#: data.member.caption || data.member.name #",Ne='#:data.dataItem.value#',Oe='#:data.dataItem.value#',Ve='#= data.dataItem ? kendo.htmlEncode(data.dataItem.fmtValue || data.dataItem.value) || " " : " " #',We='
                ',Ue={ +sum:function(e,t){var n=t.accumulator;return u(n)?u(e)&&(n+=e):n=e,n},count:function(e,t){return(t.accumulator||0)+1},average:{aggregate:function(e,n){var i=n.accumulator;return n.count===t&&(n.count=0),u(i)?u(e)&&(i+=e):i=e,u(e)&&n.count++,i},result:function(e){var t=e.accumulator;return u(t)&&(t/=e.count),t}},max:function(e,t){var n=t.accumulator;return u(n)||h(n)||(n=e),e>n&&(u(e)||h(e))&&(n=e),n},min:function(e,t){var n=t.accumulator;return u(n)||h(n)||(n=e),n>e&&(u(e)||h(e))&&(n=e),n}},je=me.extend({init:function(e){this.options=ye({},this.options,e),this.dimensions=this._normalizeDescriptors("field",this.options.dimensions),this.measures=this._normalizeDescriptors("name",this.options.measures)},_normalizeDescriptors:function(e,t){var n,i,o,r;if(t=t||{},n={},"[object Array]"===_e.call(t)){for(o=0,r=t.length;r>o;o++)i=t[o],"string"==typeof i?n[i]={}:i[e]&&(n[i[e]]=i);t=n}return t},_rootTuples:function(e,n){var i,o,r,a,s=n.length||1,l=this.dimensions||[],c=0,d=e.length,u=[],h=[];if(d||n.length){for(c=0;s>c;c++){for(i={members:[]},a=0;d>a;a++)o=e[a],r=o.split("&"),i.members[i.members.length]={children:[],caption:(l[o]||{}).caption||"All",name:o,levelName:o,levelNum:"0",hasChildren:!0,parentName:r.length>1?r[0]:t,hierarchy:o};s>1&&(i.members[i.members.length]={children:[],caption:n[c].caption,name:n[c].descriptor.name,levelName:"MEASURES",levelNum:"0",hasChildren:!1,parentName:t,hierarchy:"MEASURES"}),u[u.length]=i}h.push(Re)}return{keys:h,tuples:u}},_expandedTuples:function(e,n,i){var o,r,a,s,l,c,d,u,h,f,p,m=i.length||1,g=this.dimensions||[],v=[],_=[];for(a in e){for(s=e[a],d=this._findExpandedMember(n,s.uniquePath),l=v[d.index]||[],c=_[d.index]||[],u=d.member.names,o=0;m>o;o++){for(r={members:[]},p=0;u.length>p;p++)p===d.member.expandedIdx?(r.members[r.members.length]={children:[],caption:s.value,name:s.name,hasChildren:!1,levelNum:1,levelName:s.parentName+s.name,parentName:s.parentName,hierarchy:s.parentName+s.name},0===o&&c.push(se(r,p).join(""))):(f=u[p],h=f.split("&"),r.members[r.members.length]={children:[],caption:(g[f]||{}).caption||"All",name:f,levelName:f,levelNum:"0",hasChildren:!0,parentName:h.length>1?h[0]:t,hierarchy:f});m>1&&(r.members[r.members.length]={children:[],caption:i[o].caption,name:i[o].descriptor.name,levelName:"MEASURES",levelNum:"0",hasChildren:!0,parentName:t,hierarchy:"MEASURES"}),l[l.length]=r}v[d.index]=l,_[d.index]=c}return{keys:_,tuples:v}},_findExpandedMember:function(e,t){for(var n=0;e.length>n;n++)if(e[n].uniquePath===t)return{member:e[n],index:n}},_asTuples:function(e,t,n){var i,o;return n=n||[],i=this._rootTuples(t.root,n),o=this._expandedTuples(e,t.expanded,n),{keys:[].concat.apply(i.keys,o.keys),tuples:[].concat.apply(i.tuples,o.tuples)}},_measuresInfo:function(e,t){for(var n,i,o=0,r=e&&e.length,a=[],s={},l={},c=this.measures||{};r>o;o++)i=e[o].descriptor.name,n=c[i]||{},a.push(i),n.result&&(s[i]=n.result),n.format&&(l[i]=n.format);return{names:a,formats:l,resultFuncs:s,rowAxis:t}},_toDataArray:function(e,t,n,i){var o,r,a,s,l,c,d,u,h,f,p=[],m=1,g=[],v=n.length||1,_=i.length||1;for(t.rowAxis?(g=t.names,m=g.length):f=t.names,a=0;v>a;a++)for(d=e[n[a]||Re],c=0;m>c;c++)for(t.rowAxis&&(f=[g[c]]),s=0;_>s;s++)for(h=i[s]||Re,u=d.items[h],o=h===Re?d.aggregates:u?u.aggregates:{},l=0;f.length>l;l++)r=f[l],this._addData(p,o[r],t.formats[r],t.resultFuncs[r]);return p},_addData:function(e,t,n,i){var o,r="";t&&(t=i?i(t):t.accumulator,r=n?fe.format(n,t):t),o=e.length,e[o]={ordinal:o,value:t||"",fmtValue:r}},_matchDescriptors:function(e,n,i){for(var o,r,a,s,l=n.names,c=n.expandedIdx;c>0;)if(o=l[--c].split("&"),o.length>1&&(r=o[0],a=o[1],s=i[r](e),s=s!==t&&null!==s?""+s:s,s!=a))return!1;return!0},_calculateAggregate:function(e,t,n){var i,o,r,a={};for(r=0;e.length>r;r++)o=e[r].descriptor.name,i=n.aggregates[o]||{},i.accumulator=e[r].aggregator(t,i),a[o]=i;return a},_processColumns:function(e,n,i,o,r,a,s,l){for(var c,d,u,h,f,p,m,g,v=r.dataItem,_=0;n.length>_;_++)d=n[_],this._matchDescriptors(v,d,i)&&(g=d.names.slice(0,d.expandedIdx).join(""),p=d.names[d.expandedIdx],c=i[p](v),c=c!==t&&null!==c?""+c:c,m=p,p=p+"&"+c,f=g+p,u=o[f]||{index:s.columnIndex,parentName:m,name:p,uniquePath:g+m,value:c},h=a.items[f]||{aggregates:{}},a.items[f]={index:u.index,aggregates:this._calculateAggregate(e,r,h)},l&&(o[f]||s.columnIndex++,o[f]=u))},_measureAggregators:function(e){var t,n,i,o,r,a,s=e.measures||[],l=this.measures||{},c=[];if(s.length){for(i=0,o=s.length;o>i;i++)if(t=s[i],n=l[t.name],r=null,n){if(a=n.aggregate,"string"==typeof a){if(r=Ue[a.toLowerCase()],!r)throw Error("There is no such aggregate function");n.aggregate=r.aggregate||r,n.result=r.result}c.push({descriptor:t,caption:n.caption,result:n.result,aggregator:d(n)})}}else c.push({descriptor:{name:"default"},caption:"default",aggregator:function(){return 1}});return c},_buildGetters:function(e){var t,n,i,r={};for(i=0;e.length>i;i++)n=e[i],t=n.split("&"),t.length>1?r[t[0]]=fe.getter(t[0],!0):r[n]=fe.getter(o(n),!0);return r},_parseDescriptors:function(e){var t,n=V(e),i=N(n.root),o=n.expanded,r=[];for(t=0;o.length>t;t++)r.push(O(o[t].name,i));return{root:i,expanded:r}},_filter:function(e,t){var n,i,o;if(!t)return e;for(i=0,o=t.filters;o.length>i;i++)n=o[i],"in"===n.operator&&(o[i]=this._normalizeFilter(n));return new fe.data.Query(e).filter(t).data},_normalizeFilter:function(e){var t,n=e.value.split(","),i=[];if(!n.length)return n;for(t=0;n.length>t;t++)i.push({field:e.field,operator:"eq",value:n[t]});return{logic:"or",filters:i}},process:function(e,n){var o,r,a,s,l,c,d,u,h,f,p,m,g,v,_,b,w,y,k,x,C,S,T,D,A,E,I,R,M,F;if(e=e||[],n=n||{},e=this._filter(e,n.filter),o=n.measures||[],r="rows"===n.measuresAxis,a=n.columns||[],s=n.rows||[],!a.length&&s.length&&(!o.length||o.length&&r)&&(a=s,s=[],r=!1),a.length||s.length||(r=!1),!a.length&&o.length&&(a=i(n.measures)),a=this._parseDescriptors(a),s=this._parseDescriptors(s),l={},c={},d={},h={columnIndex:0},f=this._measureAggregators(n),p=this._buildGetters(a.root),m=this._buildGetters(s.root),g=!1,v=a.expanded,_=s.expanded,y=0!==_.length,M=e.length,F=0,a.root.length||s.root.length)for(g=!0,F=0;M>F;F++)for(b=e[F],w={dataItem:b,index:F},S=l[Re]||{items:{},aggregates:{}},this._processColumns(f,v,p,c,w,S,h,!y),S.aggregates=this._calculateAggregate(f,w,S),l[Re]=S,k=0;_.length>k;k++)x=_[k],this._matchDescriptors(b,x,m)?(D=x.names.slice(0,x.expandedIdx).join(""),C=x.names[x.expandedIdx],A=C,u=m[C](b),u=u!==t?""+u:u,C=C+"&"+u,T=D+C,d[T]={uniquePath:D+A,parentName:A,name:C,value:u},E=l[T]||{items:{},aggregates:{}},this._processColumns(f,v,p,c,w,E,h,!0),E.aggregates=this._calculateAggregate(f,w,E),l[T]=E):this._processColumns(f,v,p,c,w,{items:{},aggregates:{}},h,!0);return g&&M?(!(f.length>1)||n.columns&&n.columns.length||(a={root:[],expanded:[]}),I=this._asTuples(c,a,r?[]:f),R=this._asTuples(d,s,r?f:[]),c=I.tuples,d=R.tuples,l=this._toDataArray(l,this._measuresInfo(f,r),R.keys,I.keys)):l=c=d=[],{axes:{columns:{tuples:c},rows:{tuples:d}},data:l}}}),qe=me.extend({init:function(e,t){this.transport=t,this.options=t.options||{},this.transport.discover||ke(e.discover)&&(this.discover=e.discover)},read:function(e){return this.transport.read(e)},update:function(e){return this.transport.update(e)},create:function(e){return this.transport.create(e)},destroy:function(e){return this.transport.destroy(e)},discover:function(e){return this.transport.discover?this.transport.discover(e):(e.success({}),t)},catalog:function(n){var i,o=this.options||{};return n===t?(o.connection||{}).catalog:(i=o.connection||{},i.catalog=n,this.options.connection=i,e.extend(this.transport.options,{connection:i}),t)},cube:function(e){var n,i=this.options||{};return e===t?(i.connection||{}).cube:(n=i.connection||{},n.cube=e,this.options.connection=n,ye(!0,this.transport.options,{connection:n}),t)}}),Ge=ve.extend({init:function(t){var o,r=((t||{}).schema||{}).cube,a="columns",s={axes:be,cubes:be,catalogs:be,measures:be,dimensions:be,hierarchies:be,levels:be,members:be};r&&(s=e.extend(s,this._cubeSchema(r)),this.cubeBuilder=new je(r)),ve.fn.init.call(this,ye(!0,{},{schema:s},t)),this.transport=new qe(this.options.transport||{},this.transport),this._columns=i(this.options.columns),this._rows=i(this.options.rows),o=this.options.measures||[],"[object Object]"===_e.call(o)&&(a=o.axis||"columns",o=o.values||[]),this._measures=n(o),this._measuresAxis=a,this._skipNormalize=0,this._axes={}},_cubeSchema:function(t){return{dimensions:function(){var e,n=[],i=t.dimensions;for(e in i)n.push({name:e,caption:i[e].caption||e,uniqueName:e,defaultHierarchy:e,type:1});return t.measures&&n.push({name:Se,caption:Se,uniqueName:Se,type:2}),n},hierarchies:function(){return[]},measures:function(){var e,n=[],i=t.measures;for(e in i)n.push({name:e,caption:e,uniqueName:e,aggregator:e});return n},members:e.proxy(function(e,n){var i,r,a=n.levelUniqueName||n.memberUniqueName,s=this.options.schema.data,l=ke(s)?s:fe.getter(s,!0),c=this.options.data&&l(this.options.data)||this._rawData||[],d=[],u=0,h={};if(a&&(a=a.split(".")[0]),!n.treeOp)return d.push({caption:t.dimensions[a].caption||a,childrenCardinality:"1",dimensionUniqueName:a,hierarchyUniqueName:a,levelUniqueName:a,name:a,uniqueName:a}),d;for(i=fe.getter(o(a),!0);c.length>u;u++)r=i(c[u]),!r&&0!==r||h[r]||(h[r]=!0,d.push({caption:r,childrenCardinality:"0",dimensionUniqueName:a,hierarchyUniqueName:a,levelUniqueName:a,name:r,uniqueName:r}));return d},this)}},options:{serverSorting:!0,serverPaging:!0,serverFiltering:!0,serverGrouping:!0,serverAggregates:!0},catalog:function(e){return e===t?this.transport.catalog():(this.transport.catalog(e),this._mergeState({}),this._axes={},this.data([]),t)},cube:function(e){return e===t?this.transport.cube():(this.transport.cube(e),this._axes={},this._mergeState({}),this.data([]),t)},axes:function(){return this._axes},columns:function(e){return e===t?this._columns:(this._skipNormalize+=1,this._clearAxesData=!0,this._columns=i(e),this.query({columns:e,rows:this.rowsAxisDescriptors(),measures:this.measures()}),t)},rows:function(e){return e===t?this._rows:(this._skipNormalize+=1,this._clearAxesData=!0,this._rows=i(e),this.query({columns:this.columnsAxisDescriptors(),rows:e,measures:this.measures()}),t)},measures:function(e){return e===t?this._measures:(this._skipNormalize+=1,this._clearAxesData=!0,this.query({columns:this.columnsAxisDescriptors(),rows:this.rowsAxisDescriptors(),measures:n(e)}),t)},measuresAxis:function(){return this._measuresAxis||"columns"},_expandPath:function(e,t){var n,o,r,a="columns"===t?"columns":"rows",s="columns"===t?"rows":"columns",l=i(e),d=H(l[l.length-1]);for(this._lastExpanded=a,l=c(this.axes()[a],l,this.measures()),n=0;l.length>n;n++)if(o=H(l[n]),o===d){if(l[n].expand)return;l[n].expand=!0}else l[n].expand=!1;r={},r[a]=l,r[s]=this._descriptorsForAxis(s),this._query(r)},_descriptorsForAxis:function(e){var t=this.axes(),n=this[e]()||[];return t&&t[e]&&t[e].tuples&&t[e].tuples[0]&&(n=a(t[e].tuples||[])),n},columnsAxisDescriptors:function(){return this._descriptorsForAxis("columns")},rowsAxisDescriptors:function(){return this._descriptorsForAxis("rows")},_process:function(e,t){this._view=e,t=t||{},t.items=t.items||this._view,this.trigger(xe,t)},_query:function(e){var t=this;return e||(this._skipNormalize+=1,this._clearAxesData=!0),t.query(ye({},{page:t.page(),pageSize:t.pageSize(),sort:t.sort(),filter:t.filter(),group:t.group(),aggregate:t.aggregate(),columns:this.columnsAxisDescriptors(),rows:this.rowsAxisDescriptors(),measures:this.measures()},e))},query:function(t){var n=this._mergeState(t);return this._data.length&&this.cubeBuilder?(this._params(n),this._updateLocalData(this._pristineData),e.Deferred().resolve().promise()):this.read(n)},_mergeState:function(e){return e=ve.fn._mergeState.call(this,e),e!==t&&(this._measures=n(e.measures),e.columns?e.columns=i(e.columns):e.columns||(this._columns=[]),e.rows?e.rows=i(e.rows):e.rows||(this._rows=[])),e},filter:function(e){return e===t?this._filter:(this._skipNormalize+=1,this._clearAxesData=!0,this._query({filter:e,page:1}),t)},expandColumn:function(e){this._expandPath(e,"columns")},expandRow:function(e){this._expandPath(e,"rows")},success:function(e){var t;this.cubeBuilder&&(t=(this.reader.data(e)||[]).slice(0)),ve.fn.success.call(this,e),t&&(this._pristineData=t)},_processResult:function(e,t){var n,i,o,r,a,s,l,c,d,u,h;return this.cubeBuilder&&(n=this.cubeBuilder.process(e,this._requestData),e=n.data,t=n.axes),c=this.columns(),d=this.rows(),u=t.columns&&t.columns.tuples,c.length||!d.length||!u||!this._rowMeasures().length&&this.measures().length||(t={columns:{},rows:t.columns}),c.length||d.length||"rows"!==this.measuresAxis()||!u||(t={columns:{},rows:t.columns}),this._axes={columns:b(this._axes.columns),rows:b(this._axes.rows)},t={columns:b(t.columns),rows:b(t.rows)},i=this._normalizeTuples(t.columns.tuples,this._axes.columns.tuples,c,this._columnMeasures()),o=this._normalizeTuples(t.rows.tuples,this._axes.rows.tuples,d,this._rowMeasures()),this._skipNormalize-=1,this.cubeBuilder||(e=this._normalizeData({columnsLength:t.columns.tuples.length,rowsLength:t.rows.tuples.length,columnIndexes:i,rowIndexes:o,data:e})),"rows"==this._lastExpanded?(r=t.columns.tuples,s=this._columnMeasures(),a=p(t.columns,this._axes.columns,s),a&&(l="columns",t.columns=a,m(r,a.tuples,t.rows.tuples.length,s,e),this.cubeBuilder||(e=this._normalizeData({columnsLength:_(t.columns.tuples,s),rowsLength:t.rows.tuples.length,data:e})))):"columns"==this._lastExpanded&&(r=t.rows.tuples,s=this._rowMeasures(),a=p(t.rows,this._axes.rows,s),a&&(l="rows",t.rows=a,g(r,a.tuples,t.columns.tuples.length,s,e),this.cubeBuilder||(e=this._normalizeData({columnsLength:_(t.rows.tuples,s),rowsLength:t.columns.tuples.length,data:e})))),this._lastExpanded=null,h=this._mergeAxes(t,e,l),this._axes=h.axes,h.data},_readData:function(e){var t=this.reader.axes(e),n=this.reader.data(e);return this.cubeBuilder&&(this._rawData=n),this._processResult(n,t)},_createTuple:function(e,t,n){var i,o,r,a,s,l,c,d,u=e.members,h=u.length,f={members:[]},p=0;for(t&&(h-=1);h>p;p++)d=u[p],o=+d.levelNum,r=d.name,a=d.parentName,c=d.caption||r,s=d.hasChildren,l=d.hierarchy,i=d.levelName,n&&(c="All",0===o?a=d.name:o-=1,s=!0,r=l=i=a),f.members.push({name:r,children:[],caption:c,levelName:i,levelNum:""+o,hasChildren:s,hierarchy:l,parentName:n?"":a});return t&&f.members.push({name:t.name,children:[]}),f},_hasRoot:function(e,t,n){var i,o,r,a,s,l,c;if(t.length)return x(t,e).tuple;for(i=e.members,a=!0,l=0,c=i.length;c>l;l++)if(o=i[l],s=+o.levelNum||0,r=n[l],!(0===s||r&&o.name===H(r))){a=!1;break}return a},_mergeAxes:function(e,t,n){var i,o,r,a,s,l=this._columnMeasures(),c=this._rowMeasures(),d=this.axes(),u=_(d.rows.tuples,c),h=e.rows.tuples.length,f=_(d.columns.tuples,l),p=e.columns.tuples.length;return"columns"==n?(p=f,o=e.columns.tuples):(o=A(e.columns.tuples,l),t=I(o,t)),r=y(d.columns.tuples,o,l),"rows"==n?(h=_(e.rows.tuples,c),o=e.rows.tuples):(o=A(e.rows.tuples,c),t=E(o,t)),a=y(d.rows.tuples,o,c),d.columns.tuples=r.tuples,d.rows.tuples=a.tuples,f!==_(d.columns.tuples,l)?(i=r.index+w(r.parsedRoot,r.memberIndex,l),s=f+p,t=this._mergeColumnData(t,i,h,p,s)):u!==_(d.rows.tuples,c)&&(i=a.index+w(a.parsedRoot,a.memberIndex,c),t=this._mergeRowData(t,i,h,p)),0===d.columns.tuples.length&&0===d.rows.tuples.length&&(t=[]),{axes:d,data:t}},_mergeColumnData:function(e,t,n,i,o){var r,a,s,l=this.data().toJSON(),c=0,d=Math.max(this._columnMeasures().length,1);for(n=Math.max(n,1),l.length>0&&(c=d,o-=d),r=0;n>r;r++)a=t+r*o,s=e.splice(0,i),s.splice(0,c),[].splice.apply(l,[a,0].concat(s));return l},_mergeRowData:function(e,t,n,i){var o,r,a,s=this.data().toJSON(),l=Math.max(this._rowMeasures().length,1);for(i=Math.max(i,1),s.length>0&&(n-=l,e.splice(0,i*l)),o=0;n>o;o++)a=e.splice(0,i),r=t*i+o*i,[].splice.apply(s,[r,0].concat(a));return s},_columnMeasures:function(){var e=this.measures(),t=[];return"columns"===this.measuresAxis()&&(0===this.columns().length?t=e:e.length>1&&(t=e)),t},_rowMeasures:function(){var e=this.measures(),t=[];return"rows"===this.measuresAxis()&&(0===this.rows().length?t=e:e.length>1&&(t=e)),t},_updateLocalData:function(e,t){this.cubeBuilder&&(t&&(this._requestData=t),e=this._processResult(e)),this._data=this._observe(e),this._ranges=[],this._addRange(this._data),this._total=this._data.length,this._pristineTotal=this._total,this._process(this._data)},data:function(e){var n=this;return e===t?n._data:(this._pristineData=e.slice(0),this._updateLocalData(e,{columns:this.columns(),rows:this.rows(),measures:this.measures()}),t)},_normalizeTuples:function(e,t,n,i){var o,r,a,s=i.length||1,l=0,c=[],d={},u=0;if(e.length){if(0>=this._skipNormalize&&!this._hasRoot(e[0],t,n)){for(this._skipNormalize=0;s>l;l++)c.push(this._createTuple(e[0],i[l],!0)),d[l]=l;e.splice.apply(e,[0,e.length].concat(c).concat(e)),l=s}if(i.length)for(a=o=e[l],r=o.members.length-1;o;){if(u>=s&&(u=0),o.members[r].name!==i[u].name&&(e.splice(l,0,this._createTuple(o,i[u])),d[l]=l),l+=1,u+=1,o=e[l],s>u&&(!o||le(a,r-1)!==le(o,r-1))){for(;s>u;u++)e.splice(l,0,this._createTuple(a,i[u])),d[l]=l,l+=1;o=e[l]}a=o}return d}},_addMissingDataItems:function(e,n){for(;n.rowIndexes[parseInt(e.length/n.columnsLength,10)]!==t;)for(var i=0;n.columnsLength>i;i++)e=f(e);for(;n.columnIndexes[e.length%n.columnsLength]!==t;)e=f(e);return e},_normalizeOrdinals:function(e,t,n){var i=n.lastOrdinal;if(!t)return f(e);if(t.ordinal-i>1)for(i+=1;t.ordinal>i&&n.length>e.length;)e=this._addMissingDataItems(f(e),n),i+=1;return t.ordinal=e.length,e[e.length]=t,e},_normalizeData:function(e){var t,n,i,o=e.data,r=0,a=[];if(e.lastOrdinal=0,e.columnIndexes=e.columnIndexes||{},e.rowIndexes=e.rowIndexes||{},e.columnsLength=e.columnsLength||1,e.rowsLength=e.rowsLength||1,e.length=e.columnsLength*e.rowsLength,i=e.length,o.length===i)return o;for(;i>a.length;)t=o[r++],t&&(n=t.ordinal),a=this._normalizeOrdinals(this._addMissingDataItems(a,e),t,e),e.lastOrdinal=n;return a},discover:function(t,n){var i=this,o=i.transport;return e.Deferred(function(e){o.discover(ye({success:function(t){t=i.reader.parse(t),i._handleCustomErrors(t)||(n&&(t=n(t)),e.resolve(t))},error:function(t,n,o){e.reject(t),i.error(t,n,o)}},t))}).promise().done(function(){i.trigger("schemaChange")})},schemaMeasures:function(){var e=this;return e.discover({data:{command:"schemaMeasures",restrictions:{catalogName:e.transport.catalog(),cubeName:e.transport.cube()}}},function(t){return e.reader.measures(t)})},schemaKPIs:function(){var e=this;return e.discover({data:{command:"schemaKPIs",restrictions:{catalogName:e.transport.catalog(),cubeName:e.transport.cube()}}},function(t){return e.reader.kpis(t)})},schemaDimensions:function(){var e=this;return e.discover({data:{command:"schemaDimensions",restrictions:{catalogName:e.transport.catalog(),cubeName:e.transport.cube()}}},function(t){return e.reader.dimensions(t)})},schemaHierarchies:function(e){var t=this;return t.discover({data:{command:"schemaHierarchies",restrictions:{catalogName:t.transport.catalog(),cubeName:t.transport.cube(),dimensionUniqueName:e}}},function(e){return t.reader.hierarchies(e)})},schemaLevels:function(e){var t=this;return t.discover({data:{command:"schemaLevels",restrictions:{catalogName:t.transport.catalog(),cubeName:t.transport.cube(),hierarchyUniqueName:e}}},function(e){return t.reader.levels(e)})},schemaCubes:function(){var e=this;return e.discover({data:{command:"schemaCubes",restrictions:{catalogName:e.transport.catalog()}}},function(t){return e.reader.cubes(t)})},schemaCatalogs:function(){var e=this;return e.discover({data:{command:"schemaCatalogs"}},function(t){return e.reader.catalogs(t)})},schemaMembers:function(e){var t=this,n=function(e){return function(n){return t.reader.members(n,e)}}(e);return t.discover({data:{command:"schemaMembers",restrictions:ye({catalogName:t.transport.catalog(),cubeName:t.transport.cube()},e)}},n)},_params:function(e){this._clearAxesData&&(this._axes={},this._data=this._observe([]),this._clearAxesData=!1,this.trigger(De));var t=ve.fn._params.call(this,e);return t=ye({measures:this.measures(),measuresAxis:this.measuresAxis(),columns:this.columns(),rows:this.rows()},t),this.cubeBuilder&&(this._requestData=t),t}});Ge.create=function(e){e=e&&e.push?{data:e}:e;var t=e||{},n=t.data;if(t.data=n,!(t instanceof Ge)&&t instanceof fe.data.DataSource)throw Error("Incorrect DataSource type. Only PivotDataSource instances are supported");return t instanceof Ge?t:new Ge(t)},Y={contains:', InStr({0}.CurrentMember.MEMBER_CAPTION,"{1}") > 0',doesnotcontain:', InStr({0}.CurrentMember.MEMBER_CAPTION,"{1}") = 0',startswith:', Left({0}.CurrentMember.MEMBER_CAPTION,Len("{1}"))="{1}"',endswith:', Right({0}.CurrentMember.MEMBER_CAPTION,Len("{1}"))="{1}"',eq:', {0}.CurrentMember.MEMBER_CAPTION = "{1}"',neq:', NOT {0}.CurrentMember.MEMBER_CAPTION = "{1}"'},K={schemaCubes:"MDSCHEMA_CUBES",schemaCatalogs:"DBSCHEMA_CATALOGS",schemaMeasures:"MDSCHEMA_MEASURES",schemaDimensions:"MDSCHEMA_DIMENSIONS",schemaHierarchies:"MDSCHEMA_HIERARCHIES",schemaLevels:"MDSCHEMA_LEVELS",schemaMembers:"MDSCHEMA_MEMBERS",schemaKPIs:"MDSCHEMA_KPIS"},Q={read:function(e){var t,n,i,o,r,a='
                ';return a+="SELECT NON EMPTY {",t=e.columns||[],n=e.rows||[],i=e.measures||[],o="rows"===e.measuresAxis,r=e.sort||[],!t.length&&n.length&&(!i.length||i.length&&o)&&(t=n,n=[],o=!1),t.length||n.length||(o=!1),t.length?a+=W(t,o?[]:i,r):i.length&&!o&&(a+=L(i).join(",")),a+="} DIMENSION PROPERTIES CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON COLUMNS",(n.length||o&&i.length>1)&&(a+=", NON EMPTY {",a+=n.length?W(n,o?i:[],r):L(i).join(","),a+="} DIMENSION PROPERTIES CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON ROWS"),e.filter?(a+=" FROM ",a+="(",a+=j(e.filter,e.connection.cube),a+=")"):a+=" FROM ["+e.connection.cube+"]",1==i.length&&t.length&&(a+=" WHERE ("+L(i).join(",")+")"),a+=""+e.connection.catalog+"Multidimensional",a.replace(/\&/g,"&")},discover:function(t){t=t||{};var n='
                ';return n+=""+(K[t.command]||t.command)+"",n+=""+q("RestrictionList",t.restrictions,!0)+"",t.connection&&t.connection.catalog&&(t.properties=e.extend({},{Catalog:t.connection.catalog},t.properties)),n+=""+q("PropertyList",t.properties)+"",n+=""}},X=fe.data.RemoteTransport.extend({init:function(e){var t=e;e=this.options=ye(!0,{},this.options,e),fe.data.RemoteTransport.call(this,e),ke(t.discover)?this.discover=t.discover:"string"==typeof t.discover?this.options.discover={url:t.discover}:t.discover||(this.options.discover=this.options.read)},setup:function(t,n){return t.data=t.data||{},e.extend(!0,t.data,{connection:this.options.connection}),fe.data.RemoteTransport.fn.setup.call(this,t,n)},options:{read:{dataType:"text",contentType:"text/xml",type:"POST"},discover:{dataType:"text",contentType:"text/xml",type:"POST"},parameterMap:function(e,t){return Q[t](e,t)}},discover:function(t){return e.ajax(this.setup(t,"discover"))}}),J={cubes:{name:fe.getter("CUBE_NAME['#text']",!0),caption:fe.getter("CUBE_CAPTION['#text']",!0),description:fe.getter("DESCRIPTION['#text']",!0),type:fe.getter("CUBE_TYPE['#text']",!0)},catalogs:{name:fe.getter("CATALOG_NAME['#text']",!0),description:fe.getter("DESCRIPTION['#text']",!0)},measures:{name:fe.getter("MEASURE_NAME['#text']",!0),caption:fe.getter("MEASURE_CAPTION['#text']",!0),uniqueName:fe.getter("MEASURE_UNIQUE_NAME['#text']",!0),description:fe.getter("DESCRIPTION['#text']",!0),aggregator:fe.getter("MEASURE_AGGREGATOR['#text']",!0),groupName:fe.getter("MEASUREGROUP_NAME['#text']",!0),displayFolder:fe.getter("MEASURE_DISPLAY_FOLDER['#text']",!0),defaultFormat:fe.getter("DEFAULT_FORMAT_STRING['#text']",!0)},kpis:{name:fe.getter("KPI_NAME['#text']",!0),caption:fe.getter("KPI_CAPTION['#text']",!0),value:fe.getter("KPI_VALUE['#text']",!0),goal:fe.getter("KPI_GOAL['#text']",!0),status:fe.getter("KPI_STATUS['#text']",!0),trend:fe.getter("KPI_TREND['#text']",!0),statusGraphic:fe.getter("KPI_STATUS_GRAPHIC['#text']",!0),trendGraphic:fe.getter("KPI_TREND_GRAPHIC['#text']",!0),description:fe.getter("KPI_DESCRIPTION['#text']",!0),groupName:fe.getter("MEASUREGROUP_NAME['#text']",!0)},dimensions:{name:fe.getter("DIMENSION_NAME['#text']",!0),caption:fe.getter("DIMENSION_CAPTION['#text']",!0),description:fe.getter("DESCRIPTION['#text']",!0),uniqueName:fe.getter("DIMENSION_UNIQUE_NAME['#text']",!0),defaultHierarchy:fe.getter("DEFAULT_HIERARCHY['#text']",!0),type:fe.getter("DIMENSION_TYPE['#text']",!0)},hierarchies:{name:fe.getter("HIERARCHY_NAME['#text']",!0),caption:fe.getter("HIERARCHY_CAPTION['#text']",!0),description:fe.getter("DESCRIPTION['#text']",!0),uniqueName:fe.getter("HIERARCHY_UNIQUE_NAME['#text']",!0),dimensionUniqueName:fe.getter("DIMENSION_UNIQUE_NAME['#text']",!0),displayFolder:fe.getter("HIERARCHY_DISPLAY_FOLDER['#text']",!0),origin:fe.getter("HIERARCHY_ORIGIN['#text']",!0),defaultMember:fe.getter("DEFAULT_MEMBER['#text']",!0)},levels:{name:fe.getter("LEVEL_NAME['#text']",!0),caption:fe.getter("LEVEL_CAPTION['#text']",!0),description:fe.getter("DESCRIPTION['#text']",!0),uniqueName:fe.getter("LEVEL_UNIQUE_NAME['#text']",!0),dimensionUniqueName:fe.getter("DIMENSION_UNIQUE_NAME['#text']",!0),displayFolder:fe.getter("LEVEL_DISPLAY_FOLDER['#text']",!0),orderingProperty:fe.getter("LEVEL_ORDERING_PROPERTY['#text']",!0),origin:fe.getter("LEVEL_ORIGIN['#text']",!0),hierarchyUniqueName:fe.getter("HIERARCHY_UNIQUE_NAME['#text']",!0)},members:{name:fe.getter("MEMBER_NAME['#text']",!0),caption:fe.getter("MEMBER_CAPTION['#text']",!0),uniqueName:fe.getter("MEMBER_UNIQUE_NAME['#text']",!0),dimensionUniqueName:fe.getter("DIMENSION_UNIQUE_NAME['#text']",!0),hierarchyUniqueName:fe.getter("HIERARCHY_UNIQUE_NAME['#text']",!0),levelUniqueName:fe.getter("LEVEL_UNIQUE_NAME['#text']",!0),childrenCardinality:fe.getter("CHILDREN_CARDINALITY['#text']",!0)}},Z=["axes","catalogs","cubes","dimensions","hierarchies","levels","measures"],ee=fe.data.XmlDataReader.extend({init:function(e){fe.data.XmlDataReader.call(this,e),this._extend(e)},_extend:function(e){for(var t,n,i=0,o=Z.length;o>i;i++)t=Z[i],n=e[t],n&&n!==be&&(this[t]=n)},parse:function(e){var t=fe.data.XmlDataReader.fn.parse(e.replace(/<(\/?)(\w|-)+:/g,"<$1"));return fe.getter("['Envelope']['Body']",!0)(t)},errors:function(e){var t=fe.getter("['Fault']",!0)(e);return t?[{faultstring:fe.getter("faultstring['#text']",!0)(t),faultcode:fe.getter("faultcode['#text']",!0)(t)}]:null},axes:function(e){var t,n,i,o;for(e=fe.getter('ExecuteResponse["return"].root',!0)(e),t=G(fe.getter("Axes.Axis",!0)(e)),i={columns:{},rows:{}},o=0;t.length>o;o++)n=t[o],"sliceraxis"!==n["@name"].toLowerCase()&&(i.columns.tuples?i.rows=$(n):i.columns=$(n));return i},data:function(e){var t,n,i,o,r,a;for(e=fe.getter('ExecuteResponse["return"].root',!0)(e),t=G(fe.getter("CellData.Cell",!0)(e)),n=[],i=fe.getter("['@CellOrdinal']"),o=fe.getter("Value['#text']"),r=fe.getter("FmtValue['#text']"),a=0;t.length>a;a++)n.push({value:o(t[a]),fmtValue:r(t[a]),ordinal:parseInt(i(t[a]),10)});return n},_mapSchema:function(e,t){var n,i,o,r,a;for(e=fe.getter('DiscoverResponse["return"].root',!0)(e),n=G(fe.getter("row",!0)(e)),i=[],o=0;n.length>o;o++){r={};for(a in t)r[a]=t[a](n[o]);i.push(r)}return i},measures:function(e){return this._mapSchema(e,J.measures)},kpis:function(e){return this._mapSchema(e,J.kpis)},hierarchies:function(e){return this._mapSchema(e,J.hierarchies)},levels:function(e){return this._mapSchema(e,J.levels)},dimensions:function(e){return this._mapSchema(e,J.dimensions)},cubes:function(e){return this._mapSchema(e,J.cubes)},catalogs:function(e){return this._mapSchema(e,J.catalogs)},members:function(e){return this._mapSchema(e,J.members)}}),ye(!0,fe.data,{PivotDataSource:Ge,XmlaTransport:X,XmlaDataReader:ee,PivotCubeBuilder:je,transports:{xmla:X},readers:{xmla:ee}}),te=function(e,t){if(!e)return null;for(var n=0,i=e.length;i>n;n++)if(e[n].field===t)return e[n];return null},ne=function(e,t){var n,i,o=[];for(n=0,i=e.length;i>n;n++)e[n].field!==t&&o.push(e[n]);return o},fe.ui.PivotSettingTarget=ge.extend({init:function(t,n){var i=this;ge.fn.init.call(i,t,n),i.element.addClass("k-pivot-setting"),i.dataSource=fe.data.PivotDataSource.create(n.dataSource),i._refreshHandler=e.proxy(i.refresh,i),i.dataSource.first(xe,i._refreshHandler),n.template||(i.options.template="
                ${data.name || data}'+(i.options.enabled?'':"")+"
                "),i.template=fe.template(i.options.template),i.emptyTemplate=fe.template(i.options.emptyTemplate),i._sortable(),i.element.on("click"+Ie,".k-button,.k-item",function(t){var n=e(t.target),o=n.closest("["+fe.attr("name")+"]").attr(fe.attr("name"));o&&(n.hasClass("k-setting-delete")?i.remove(o):i.options.sortable&&n[0]===t.currentTarget&&i.sort({field:o,dir:n.find(".k-i-sort-asc")[0]?"desc":"asc"}))}),(n.filterable||n.sortable)&&(i.fieldMenu=new pe.PivotFieldMenu(i.element,{messages:i.options.messages.fieldMenu,filter:".k-setting-fieldmenu",filterable:n.filterable,sortable:n.sortable,dataSource:i.dataSource})),i.refresh()},options:{name:"PivotSettingTarget",template:null,filterable:!1,sortable:!1,emptyTemplate:"
                ${data}
                ",setting:"columns",enabled:!0,messages:{empty:"Drop Fields Here"}},setDataSource:function(e){this.dataSource.unbind(xe,this._refreshHandler),this.dataSource=this.options.dataSource=e,this.fieldMenu&&this.fieldMenu.setDataSource(e),e.first(xe,this._refreshHandler),this.refresh()},_sortable:function(){var e=this;e.options.enabled&&(this.sortable=this.element.kendoSortable({connectWith:this.options.connectWith,filter:">:not(.k-empty)",hint:e.options.hint,cursor:"move",start:function(e){e.item.focus().blur()},change:function(t){var n=t.item.attr(fe.attr("name"));"receive"==t.action?e.add(n):"remove"==t.action?e.remove(n):"sort"==t.action&&e.move(n,t.newIndex)}}).data("kendoSortable"))},_indexOf:function(e,t){var n,i,o=-1;for(n=0,i=t.length;i>n;n++)if(H(t[n])===e){o=n;break}return o},_isKPI:function(e){return"kpi"===e.type||e.measure},validate:function(e){var t,n,i=2==e.type||"aggregator"in e||this._isKPI(e);return i?"measures"===this.options.setting:"measures"===this.options.setting?i:(t=this.dataSource[this.options.setting](),n=e.defaultHierarchy||e.uniqueName,this._indexOf(n,t)>-1?!1:(t=this.dataSource["columns"===this.options.setting?"rows":"columns"](),!(this._indexOf(n,t)>-1)))},add:function(t){var n,i,o=this.dataSource[this.options.setting]();for(t=e.isArray(t)?t.slice(0):[t],n=0,i=t.length;i>n;n++)-1!==this._indexOf(t[n],o)&&(t.splice(n,1),n-=1,i-=1);t.length&&(o=o.concat(t),this.dataSource[this.options.setting](o))},move:function(e,t){var n=this.dataSource[this.options.setting](),i=this._indexOf(e,n);i>-1&&(e=n.splice(i,1)[0],n.splice(t,0,e),this.dataSource[this.options.setting](n))},remove:function(e){var t=this.dataSource[this.options.setting](),n=this._indexOf(e,t);n>-1&&(t.splice(n,1),this.dataSource[this.options.setting](t))},sort:function(e){var t=this.options.sortable,n=t===!0||t.allowUnsort,i=n&&"asc"===e.dir,o=this.dataSource.sort()||[],r=ne(o,e.field);i&&o.length!==r.length&&(e=null),e&&r.push(e),this.dataSource.sort(r)},refresh:function(){var e,n="",i=this.dataSource[this.options.setting](),o=i.length,r=0;if(o)for(;o>r;r++)e=i[r],e=e.name===t?{name:e}:e,n+=this.template(ye({sortIcon:this._sortIcon(e.name)},e));else n=this.emptyTemplate(this.options.messages.empty);this.element.html(n)},destroy:function(){ge.fn.destroy.call(this),this.dataSource.unbind(xe,this._refreshHandler), +this.element.off(Ie),this.sortable&&this.sortable.destroy(),this.fieldMenu&&this.fieldMenu.destroy(),this.element=null,this._refreshHandler=null},_sortIcon:function(e){var t=this.dataSource.sort(),n=te(t,H(e)),i="";return n&&(i="k-i-sort-"+n.dir),i}}),ie=ge.extend({init:function(n,i){var o,r,a=this;ge.fn.init.call(a,n,i),a._dataSource(),a._bindConfigurator(),a._wrapper(),a._createLayout(),a._columnBuilder=o=new ce,a._rowBuilder=r=new de,a._contentBuilder=new ue,a._templates(),a.columnsHeader.add(a.rowsHeader).on("click","span.k-icon",function(){var n,i,s,l,c=e(this),d=o,u="expandColumn",h=c.attr(fe.attr("path")),f={axis:"columns",path:e.parseJSON(h)};c.parent().is("td")&&(d=r,u="expandRow",f.axis="rows"),i=c.hasClass(Be),s=d.metadata[h],l=s.expanded===t,n=i?Pe:ze,f.childrenLoaded=s.maxChildren>s.children,a.trigger(n,f)||(d.metadata[h].expanded=!i,c.toggleClass(Be,!i).toggleClass(Le,i),!i&&l?a.dataSource[u](f.path):a.refresh())}),a._scrollable(),a.options.autoBind&&a.dataSource.fetch(),fe.notify(a)},events:[Me,Fe,ze,Pe],options:{name:"PivotGrid",autoBind:!0,reorderable:!0,filterable:!1,sortable:!1,height:null,columnWidth:100,configurator:"",columnHeaderTemplate:null,rowHeaderTemplate:null,dataCellTemplate:null,kpiStatusTemplate:null,kpiTrendTemplate:null,messages:{measureFields:"Drop Data Fields Here",columnFields:"Drop Column Fields Here",rowFields:"Drop Rows Fields Here"}},_templates:function(){var e=this.options.columnHeaderTemplate,t=this.options.rowHeaderTemplate,n=this.options.dataCellTemplate,i=this.options.kpiStatusTemplate,o=this.options.kpiTrendTemplate;this._columnBuilder.template=fe.template(e||He,{useWithBlock:!!e}),this._contentBuilder.dataTemplate=fe.template(n||Ve,{useWithBlock:!!n}),this._contentBuilder.kpiStatusTemplate=fe.template(i||Ne,{useWithBlock:!!i}),this._contentBuilder.kpiTrendTemplate=fe.template(o||Oe,{useWithBlock:!!o}),this._rowBuilder.template=fe.template(t||He,{useWithBlock:!!t})},_bindConfigurator:function(){var t=this.options.configurator;t&&e(t).kendoPivotConfigurator("setDataSource",this.dataSource)},cellInfoByElement:function(t){return t=e(t),this.cellInfo(t.index(),t.parent("tr").index())},cellInfo:function(e,t){var n,i=this._contentBuilder,o=i.columnIndexes[e||0],r=i.rowIndexes[t||0];return o&&r?(n=r.index*i.rowLength+o.index,{columnTuple:o.tuple,rowTuple:r.tuple,measure:o.measure||r.measure,dataItem:this.dataSource.view()[n]}):null},setDataSource:function(e){this.options.dataSource=e,this._dataSource(),this.measuresTarget&&this.measuresTarget.setDataSource(e),this.rowsTarget&&this.rowsTarget.setDataSource(e),this.columnsTarget&&this.columnsTarget.setDataSource(e),this._bindConfigurator(),this.options.autoBind&&e.fetch()},setOptions:function(e){ge.fn.setOptions.call(this,e),this._templates()},destroy:function(){ge.fn.destroy.call(this),clearTimeout(this._headerReflowTimeout)},_dataSource:function(){var t=this,n=t.options.dataSource;n=e.isArray(n)?{data:n}:n,t.dataSource&&this._refreshHandler?t.dataSource.unbind(xe,t._refreshHandler).unbind(De,t._stateResetHandler).unbind(Te,t._progressHandler).unbind(Ce,t._errorHandler):(t._refreshHandler=e.proxy(t.refresh,t),t._progressHandler=e.proxy(t._requestStart,t),t._stateResetHandler=e.proxy(t._stateReset,t),t._errorHandler=e.proxy(t._error,t)),t.dataSource=fe.data.PivotDataSource.create(n).bind(xe,t._refreshHandler).bind(Te,t._progressHandler).bind(De,t._stateResetHandler).bind(Ce,t._errorHandler)},_error:function(){this._progress(!1)},_requestStart:function(){this._progress(!0)},_stateReset:function(){this._columnBuilder.reset(),this._rowBuilder.reset()},_wrapper:function(){var e=this.options.height;this.wrapper=this.element.addClass("k-widget k-pivot"),e&&this.wrapper.css("height",e)},_measureFields:function(){this.measureFields=e(Ee).addClass("k-pivot-toolbar k-header k-settings-measures"),this.measuresTarget=this._createSettingTarget(this.measureFields,{setting:"measures",messages:{empty:this.options.messages.measureFields}})},_createSettingTarget:function(t,n){var i='${data.name}',o=n.sortable,r="";return o&&(r+="#if (data.sortIcon) {#",r+='',r+="#}#"),(n.filterable||o)&&(r+=''),this.options.reorderable&&(r+=''),r&&(i+=''+r+""),i+="",new fe.ui.PivotSettingTarget(t,e.extend({template:i,emptyTemplate:'${data}',enabled:this.options.reorderable,dataSource:this.dataSource},n))},_initSettingTargets:function(){this.columnsTarget=this._createSettingTarget(this.columnFields,{connectWith:this.rowFields,setting:"columns",filterable:this.options.filterable,sortable:this.options.sortable,messages:{empty:this.options.messages.columnFields,fieldMenu:this.options.messages.fieldMenu}}),this.rowsTarget=this._createSettingTarget(this.rowFields,{connectWith:this.columnFields,setting:"rows",filterable:this.options.filterable,sortable:this.options.sortable,messages:{empty:this.options.messages.rowFields,fieldMenu:this.options.messages.fieldMenu}})},_createLayout:function(){var t=this,n=e(We),i=n.find(".k-pivot-rowheaders"),o=n.find(".k-pivot-table"),r=e(Ee).addClass("k-grid k-widget");t._measureFields(),t.columnFields=e(Ee).addClass("k-pivot-toolbar k-header k-settings-columns"),t.rowFields=e(Ee).addClass("k-pivot-toolbar k-header k-settings-rows"),t.columnsHeader=e('
                ').wrap('
                '),t.columnsHeader.parent().css("padding-right",fe.support.scrollbar()),t.rowsHeader=e('
                '),t.content=e('
                '),i.append(t.measureFields),i.append(t.rowFields),i.append(t.rowsHeader),r.append(t.columnsHeader.parent()),r.append(t.content),o.append(t.columnFields),o.append(r),t.wrapper.append(n),t.columnsHeaderTree=new fe.dom.Tree(t.columnsHeader[0]),t.rowsHeaderTree=new fe.dom.Tree(t.rowsHeader[0]),t.contentTree=new fe.dom.Tree(t.content[0]),t._initSettingTargets()},_progress:function(e){fe.ui.progress(this.wrapper,e)},_resize:function(){this.content[0].firstChild&&(this._setSectionsWidth(),this._setSectionsHeight(),this._setContentWidth(),this._setContentHeight(),this._columnHeaderReflow())},_columnHeaderReflow:function(){var e=this.columnsHeader.children("table");fe.support.browser.mozilla&&(clearTimeout(this._headerReflowTimeout),e.css("table-layout","auto"),this._headerReflowTimeout=setTimeout(function(){e.css("table-layout","")}))},_setSectionsWidth:function(){var e=this.rowsHeader,t=e.parent(".k-pivot-rowheaders").width(Ae),n=Math.max(this.measureFields.outerWidth(),this.rowFields.outerWidth());n=Math.max(e.children("table").width(),n),t.width(n)},_setSectionsHeight:function(){var e=this.measureFields.height(Ae).height(),t=this.columnFields.height(Ae).height(),n=this.rowFields.height(Ae).innerHeight(),i=this.columnsHeader.height(Ae).innerHeight(),o=n-this.rowFields.height(),r=t>e?t:e,a=i>n?i:n;this.measureFields.height(r),this.columnFields.height(r),this.rowFields.height(a-o),this.columnsHeader.height(a)},_setContentWidth:function(){var e=this.content.find("table"),t=this.columnsHeader.children("table"),n=e.children("colgroup").children().length,i=n*this.options.columnWidth,o=Math.ceil(i/this.content.width()*100);100>o&&(o=100),e.add(t).css("width",o+"%"),this._resetColspan(t)},_setContentHeight:function(){var e=this,n=e.content,i=e.rowsHeader,o=e.wrapper.innerHeight(),r=fe.support.scrollbar(),a=n[0].offsetHeight===n[0].clientHeight,s=e.options.height;if(e.wrapper.is(":visible")){if(!o||!s)return a&&(r=0),n.height("auto"),i.height(n.height()-r),t;o-=e.columnFields.outerHeight(),o-=e.columnsHeader.outerHeight(),2*r>=o&&(o=2*r+1,a||(o+=r)),n.height(o),a&&(r=0),i.height(o-r)}},_resetColspan:function(e){var n=this,i=e.children("tbody").children(":first").children(":first");n._colspan===t&&(n._colspan=i.attr("colspan")),i.attr("colspan",1),clearTimeout(n._layoutTimeout),n._layoutTimeout=setTimeout(function(){i.attr("colspan",n._colspan),n._colspan=t})},_axisMeasures:function(e){var t=[],n=this.dataSource,i=n.measures(),o=i.length>1||i[0]&&i[0].type;return n.measuresAxis()===e&&(0===n[e]().length||o)&&(t=i),t},items:function(){return[]},refresh:function(){var e,t=this,n=t.dataSource,i=n.axes(),o=(i.columns||{}).tuples||[],r=(i.rows||{}).tuples||[],a=t._columnBuilder,s=t._rowBuilder,l={},c={};t.trigger(Me,{action:"rebind"})||(a.measures=t._axisMeasures("columns"),t.columnsHeaderTree.render(a.build(o)),t.rowsHeaderTree.render(s.build(r)),l={indexes:a._indexes,measures:a.measures,metadata:a.metadata},c={indexes:s._indexes,measures:this._axisMeasures("rows"),metadata:s.metadata},t.contentTree.render(t._contentBuilder.build(n.view(),l,c)),t._resize(),t.touchScroller?t.touchScroller.contentResized():(e=fe.touchScroller(t.content),e&&e.movable&&(t.touchScroller=e,e.movable.bind("change",function(e){t.columnsHeader.scrollLeft(-e.sender.x),t.rowsHeader.scrollTop(-e.sender.y)}))),t._progress(!1),t.trigger(Fe))},_scrollable:function(){var t=this,n=t.columnsHeader,i=t.rowsHeader;t.content.scroll(function(){n.scrollLeft(this.scrollLeft),i.scrollTop(this.scrollTop)}),i.bind("DOMMouseScroll"+Ie+" mousewheel"+Ie,e.proxy(t._wheelScroll,t))},_wheelScroll:function(t){var n,i;t.ctrlKey||(n=fe.wheelDeltaY(t),i=this.content.scrollTop(),n&&(t.preventDefault(),e(t.currentTarget).one("wheel"+Ie,!1),this.rowsHeader.scrollTop(i+-n),this.content.scrollTop(i+-n)))}}),oe=fe.dom.element,re=fe.dom.html,ae=function(e,t){return{maxChildren:0,children:0,maxMembers:0,members:0,measures:1,levelNum:e,parentMember:0!==t}},se=function(e,t){for(var n=[],i=0;t>=i;i++)n.push(e.members[i].name);return n},le=function(e,t){for(var n="",i=0;t>=i;i++)n+=e.members[i].name;return n},ce=me.extend({init:function(){this.measures=1,this.metadata={}},build:function(e){var t=this._tbody(e),n=this._colGroup();return[oe("table",null,[n,t])]},reset:function(){this.metadata={}},_colGroup:function(){for(var e=this._rowLength(),t=[],n=0;e>n;n++)t.push(oe("col",null));return oe("colgroup",null,t)},_tbody:function(e){var t=e[0];return this.map={},this.rows=[],this.rootTuple=t,this._indexes=[],t?(this._buildRows(t,0),this._normalize()):this.rows.push(oe("tr",null,[oe("th",null,[re(" ")])])),oe("tbody",null,this.rows)},_normalize:function(){for(var e,t,n,i,o,r=this.rows,a=r.length,s=0;a>s;s++)if(e=r[s],1!==e.rowSpan)for(i=e.children,n=0,t=i.length;t>n;n++)o=i[n],o.tupleAll&&(o.attr.rowSpan=e.rowSpan)},_rowIndex:function(e){for(var t=this.rows,n=t.length,i=0;n>i&&t[i]!==e;i++);return i},_rowLength:function(){var e=this.rows[0]?this.rows[0].children:[],t=e.length,n=0,i=0;if(t)for(;t>i;i++)n+=e[i].attr.colSpan||1;return n||(n=this.measures),n},_row:function(e,t,n){var i,o,r=this.rootTuple.members[t].name,a=e.members[t].levelNum,s=r+a,l=this.map,c=l[s];return c?(c.notFirst=!1,c.parentMember&&c.parentMember===n||(c.parentMember=n,c.collapsed=0,c.colSpan=0)):(c=oe("tr",null,[]),c.parentMember=n,c.collapsed=0,c.colSpan=0,c.rowSpan=1,l[s]=c,i=l[r+(+a-1)],i&&(o=i.children,c.notFirst=o[1]&&-1===o[1].attr.className.indexOf("k-alt")?!0:i.notFirst),this.rows.splice(this._rowIndex(i)+1,0,c)),c},_measures:function(e,t,n){var i,o,r,a=this.map,s=a.measureRow;for(s||(s=oe("tr",null,[]),a.measureRow=s,this.rows.push(s)),o=0,r=e.length;r>o;o++)i=e[o],s.children.push(this._cell(n||"",[this._content(i,t)],i));return r},_content:function(e,t){return re(this.template({member:e,tuple:t}))},_cell:function(e,t,n){var i=oe("th",{className:"k-header"+e},t);return i.value=n.caption||n.name,i},_buildRows:function(e,n,i){var o,r,a,s,l,c,d,u,h,f,p=e.members,m=p[n],g=p[n+1],v=[],_=0,b=0,w=0;if(m.measure)return this._measures(m.children,e),t;if(u=fe.stringify(se(e,n)),o=this._row(e,n,i),a=m.children,s=a.length,h=this.metadata[u],h||(this.metadata[u]=h=ae(+m.levelNum,n),h.rootLevelNum=+this.rootTuple.members[n].levelNum),this._indexes.push({path:u,tuple:e}),m.hasChildren&&(h.expanded===!1&&(b=h.maxChildren,o.collapsed+=b,h.children=0,s=0),d={className:"k-icon "+(s?Be:Le)},d[fe.attr("path")]=u,v.push(oe("span",d))),v.push(this._content(m,e)),l=this._cell(o.notFirst?" k-first":"",v,m),o.children.push(l),o.colSpan+=1,s){for(c=this._cell(" k-alt",[this._content(m,e)],m),o.children.push(c);s>_;_++)r=this._buildRows(a[_],n,m);f=r.colSpan,b=r.collapsed,l.attr.colSpan=f,h.children=f,h.members=1,o.colSpan+=f,o.collapsed+=b,o.rowSpan=r.rowSpan+1,g&&(g.measure?f=this._measures(g.children,e," k-alt"):(r=this._buildRows(e,n+1),f=r.colSpan,o.collapsed+=r.collapsed,w=r.collapsed),c.attr.colSpan=f,f-=1,h.members+=f,o.colSpan+=f)}else g&&(g.measure?f=this._measures(g.children,e):(r=this._buildRows(e,n+1),f=r.colSpan,o.collapsed+=r.collapsed,w=r.collapsed),h.members=f,f>1&&(l.attr.colSpan=f,o.colSpan+=f-1));return h.members+w>h.maxMembers&&(h.maxMembers=h.members+w),a=h.children+b,a>h.maxChildren&&(h.maxChildren=a),(c||l).tupleAll=!0,o}}),de=me.extend({init:function(){this.metadata={}},build:function(e){var t=this._tbody(e),n=this._colGroup();return[oe("table",null,[n,t])]},reset:function(){this.metadata={}},_rowLength:function(){for(var e=this.rows[0].children,t=0,n=0,i=e[n];i;)t+=i.attr.colSpan||1,i=e[++n];return t},_colGroup:function(){for(var e=this._rowLength(),t=[],n=0;e>n;n++)t.push(oe("col",null));return oe("colgroup",null,t)},_tbody:function(e){var t=e[0];return this.rootTuple=t,this.rows=[],this.map={},this._indexes=[],t?(this._buildRows(t,0),this._normalize()):this.rows.push(oe("tr",null,[oe("td",null,[re(" ")])])),oe("tbody",null,this.rows)},_normalize:function(){for(var e,t,n,i,o=this.rows,r=o.length,a=0,s=this.rootTuple.members,l=s[0].name,c=s.length,d=0,u=this.map;r>a;a++)for(e=o[a],d=0;c>d;d++)n=this[s[d].name],t=e.colSpan["dim"+d],t&&n>t.colSpan&&(t.attr.colSpan=n-t.colSpan+1);e=u[l],i=u[l+"all"],e&&(e.children[0].attr.className="k-first"),i&&(i.children[0].attr.className+=" k-first")},_row:function(e){var t=oe("tr",null,e);return t.rowSpan=1,t.colSpan={},this.rows.push(t),t},_content:function(e,t){return re(this.template({member:e,tuple:t}))},_cell:function(e,t,n){var i=oe("td",{className:e},t);return i.value=n.caption||n.name,i},_buildRows:function(e,t){var n,i,o,r,a,s,l,c,d,u=this.map,h=e.members,f=h[t],p=h[t+1],m=f.children,g=m.length,v=+f.levelNum,_=this.rootTuple.members[t].name,b=se(e,t-1).join(""),w=+this.rootTuple.members[t].levelNum,y=b+(w===v?"":f.parentName||""),k=u[y+"all"]||u[y],x=v+1,C=[];if(!k||k.hasChild?k=this._row():k.hasChild=!0,f.measure){for(l=k.allCell?"k-grid-footer":"",k.children.push(this._cell(l,[this._content(m[0],e)],m[0])),k.rowSpan=g,d=1;g>d;d++)this._row([this._cell(l,[this._content(m[d],e)],m[d])]);return k}if(u[b+f.name]=k,n=fe.stringify(se(e,t)),s=this.metadata[n],s||(this.metadata[n]=s=ae(v,t),s.rootLevelNum=w),this._indexes.push({path:n,tuple:e}),f.hasChildren&&(s.expanded===!1&&(g=0,s.children=0),c={className:"k-icon "+(g?Be:Le)},c[fe.attr("path")]=n,C.push(oe("span",c))),C.push(this._content(f,e)),l=k.allCell&&!g?"k-grid-footer":"",i=this._cell(l,C,f),i.colSpan=x,k.children.push(i),k.colSpan["dim"+t]=i,(!this[_]||x>this[_])&&(this[_]=x),g){for(k.allCell=!1,k.hasChild=!1,d=0;g>d;d++)r=this._buildRows(m[d],t),k!==r&&(k.rowSpan+=r.rowSpan);k.rowSpan>1&&(i.attr.rowSpan=k.rowSpan),s.children=k.rowSpan,o=this._cell("k-grid-footer",[this._content(f,e)],f),o.colSpan=x,a=this._row([o]),a.colSpan["dim"+t]=o,a.allCell=!0,u[b+f.name+"all"]=a,p&&(r=this._buildRows(e,t+1),o.attr.rowSpan=r.rowSpan),k.rowSpan+=a.rowSpan,s.members=a.rowSpan}else p&&(k.hasChild=!1,this._buildRows(e,t+1),(o||i).attr.rowSpan=k.rowSpan,s.members=k.rowSpan);return s.children>s.maxChildren&&(s.maxChildren=s.children),s.members>s.maxMembers&&(s.maxMembers=s.members),k}}),ue=me.extend({init:function(){this.columnAxis={},this.rowAxis={}},build:function(e,n,i){var o,r,a=n.indexes[0],s=n.metadata[a?a.path:t];return this.columnAxis=n,this.rowAxis=i,this.data=e,this.rowLength=s?s.maxChildren+s.maxMembers:n.measures.length||1,this.rowLength||(this.rowLength=1),o=this._tbody(),r=this._colGroup(),[oe("table",null,[r,o])]},_colGroup:function(){var e=this.columnAxis.measures.length||1,t=[],n=0;for(this.rows[0]&&(e=this.rows[0].children.length);e>n;n++)t.push(oe("col",null));return oe("colgroup",null,t)},_tbody:function(){return this.rows=[],this.data[0]?(this.columnIndexes=this._indexes(this.columnAxis,this.rowLength),this.rowIndexes=this._indexes(this.rowAxis,Math.ceil(this.data.length/this.rowLength)),this._buildRows()):this.rows.push(oe("tr",null,[oe("td",null,[re(" ")])])),oe("tbody",null,this.rows)},_indexes:function(e,n){var i,o,r,a,s,l,c=[],d=e.indexes,u=e.metadata,h=e.measures,f=h.length||1,p=0,m=0,g=0,v=d.length;if(!v){for(r=0;f>r;r++)c[r]={index:r,measure:h[r],tuple:null};return c}for(;v>g;g++){if(i=d[g],o=u[i.path],s=o.children+o.members,l=0,s&&(s-=f),o.expanded===!1&&o.children!==o.maxChildren&&(l=o.maxChildren),o.parentMember&&o.levelNum===o.rootLevelNum&&(s=-1),s>-1){for(r=0;f>r;r++)a=s+r,o.children||(a+=m),c[s+m+r]={children:s,index:p,measure:h[r],tuple:i.tuple},p+=1;for(;c[m]!==t;)m+=1}if(m===n)break;p+=l}return c},_buildRows:function(){for(var e=this.rowIndexes,t=e.length,n=0;t>n;n++)this.rows.push(this._buildRow(e[n]))},_buildRow:function(e){for(var t,n,i,o,r,a,s,l=e.index*this.rowLength,c=this.columnIndexes,d=c.length,u=[],h=0;d>h;h++)t=c[h],r={},t.children&&(r.className="k-alt"),o="",a=this.data[l+t.index],s=t.measure||e.measure,n={columnTuple:t.tuple,rowTuple:e.tuple,measure:s,dataItem:a},""!==a.value&&s&&s.type&&("status"===s.type?o=this.kpiStatusTemplate(n):"trend"===s.type&&(o=this.kpiTrendTemplate(n))),o||(o=this.dataTemplate(n)),i=oe("td",r,[re(o)]),i.value=a.value,u.push(i);return r={},e.children&&(r.className="k-grid-footer"),oe("tr",r,u)}}),pe.plugin(ie),fe.PivotExcelExporter=fe.Class.extend({init:function(e){this.options=e,this.widget=e.widget,this.dataSource=this.widget.dataSource},_columns:function(){var e,t=this.widget.columnsHeaderTree.children[0],n=this.widget.rowsHeaderTree.children[0],i=t.children[0].children.length,o=n.children[0].children.length,r=this.widget.options.columnWidth,a=[];if(o&&this.dataSource.data()[0])for(e=0;o>e;e++)a.push({autoWidth:!0});for(e=0;i>e;e++)a.push({autoWidth:!1,width:r});return a},_cells:function(e,t,n){for(var i,o,r,a,s,l=[],c=0,d=e.length;d>c;c++){for(o=[],r=e[c].children,i=r.length,a=0;i>a;a++)s=r[a],o.push({background:"#7a7a7a",color:"#fff",value:s.value,colSpan:s.attr.colSpan||1,rowSpan:s.attr.rowSpan||1});n&&n(o,c),l.push({cells:o,type:t})}return l},_rows:function(){var e,t,n=this.widget.columnsHeaderTree.children[0],i=this.widget.rowsHeaderTree.children[0],o=n.children[0].children.length,r=i.children[0].children.length,a=n.children[1].children,s=i.children[1].children,l=this.widget.contentTree.children[0].children[1].children,c=this._cells(a,"header");return r&&c[0].cells.splice(0,0,{background:"#7a7a7a",color:"#fff",value:"",colSpan:r,rowSpan:a.length}),e=function(e,t){for(var n,i,r=0,a=l[t].children;o>r;r++)n=a[r],i=+n.value,isNaN(i)&&(i=n.value),e.push({background:"#dfdfdf",color:"#333",value:i,colSpan:1,rowSpan:1})},t=this._cells(s,"data",e),c.concat(t)},_freezePane:function(){var e=this.widget.columnsHeaderTree.children[0],t=this.widget.rowsHeaderTree.children[0],n=t.children[0].children.length,i=e.children[1].children;return{colSplit:n,rowSplit:i.length}},workbook:function(){var t;return this.dataSource.view()[0]?(t=e.Deferred(),t.resolve()):t=this.dataSource.fetch(),t.then(e.proxy(function(){return{sheets:[{columns:this._columns(),rows:this._rows(),freezePane:this._freezePane(),filter:null}]}},this))}}),he={extend:function(t){t.events.push("excelExport"),t.options.excel=e.extend(t.options.excel,this.options),t.saveAsExcel=this.saveAsExcel},options:{proxyURL:"",filterable:!1,fileName:"Export.xlsx"},saveAsExcel:function(){var t=this.options.excel||{},n=new fe.PivotExcelExporter({widget:this});n.workbook().then(e.proxy(function(e){if(!this.trigger("excelExport",{workbook:e})){var n=new fe.ooxml.Workbook(e);fe.saveAs({dataURI:n.toDataURL(),fileName:e.fileName||t.fileName,proxyURL:t.proxyURL,forceProxy:t.forceProxy})}},this))}},fe.PivotExcelMixin=he,fe.ooxml&&fe.ooxml.Workbook&&he.extend(ie.prototype),fe.PDFMixin&&(fe.PDFMixin.extend(ie.prototype),ie.fn._drawPDF=function(){return this._drawPDFShadow({width:this.wrapper.width()},{avoidLinks:this.options.pdf.avoidLinks})})}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.treeview.draganddrop.min",["kendo.data.min","kendo.draganddrop.min"],e)}(function(){return function(e,t){var n=window.kendo,i=n.ui,o=e.proxy,r=e.extend,a="visibility",s="k-state-hover",l="input,a,textarea,.k-multiselect-wrap,select,button,a.k-button>.k-icon,button.k-button>.k-icon,span.k-icon.k-i-expand,span.k-icon.k-i-collapse";i.HierarchicalDragAndDrop=n.Class.extend({init:function(t,a){this.element=t,this.hovered=t,this.options=r({dragstart:e.noop,drag:e.noop,drop:e.noop,dragend:e.noop},a),this._draggable=new i.Draggable(t,{ignore:l,filter:a.filter,autoScroll:a.autoScroll,cursorOffset:{left:10,top:n.support.mobileOS?-40/n.support.zoomLevel():10},hint:o(this._hint,this),dragstart:o(this.dragstart,this),dragcancel:o(this.dragcancel,this),drag:o(this.drag,this),dragend:o(this.dragend,this),$angular:a.$angular})},_hint:function(e){return"
                "+this.options.hintText(e)+"
                "},_removeTouchHover:function(){n.support.touch&&this.hovered&&(this.hovered.find("."+s).removeClass(s),this.hovered=!1)},_hintStatus:function(n){var i=this._draggable.hint.find(".k-drag-status")[0];return n?(i.className="k-icon k-drag-status "+n,t):e.trim(i.className.replace(/k-(icon|drag-status)/g,""))},dragstart:function(t){this.source=t.currentTarget.closest(this.options.itemSelector),this.options.dragstart(this.source)&&t.preventDefault(),this.dropHint=this.options.reorderable?e("
                ").css(a,"hidden").appendTo(this.element):e()},drag:function(t){var i,o,r,l,c,d,u,h,f,p,m,g=this.options,v=this.source,_=this.dropTarget=e(n.eventTarget(t)),b=_.closest(g.allowedContainers);b.length?v[0]==_[0]||g.contains(v[0],_[0])?m="k-i-denied":(m="k-i-insert-middle",f=g.itemFromTarget(_),i=f.item,i.length?(this._removeTouchHover(),o=i.outerHeight(),l=f.content,g.reorderable?(c=o/(l.length>0?4:2),r=n.getOffset(i).top,d=r+c>t.y.location,u=t.y.location>r+o-c,h=l.length&&!d&&!u):(h=!0,d=!1,u=!1),this.hovered=h?b:!1,this.dropHint.css(a,h?"hidden":"visible"),this._lastHover&&this._lastHover[0]!=l[0]&&this._lastHover.removeClass(s),this._lastHover=l.toggleClass(s,h),h?m="k-i-add":(p=i.position(),p.top+=d?0:o,this.dropHint.css(p)[d?"prependTo":"appendTo"](g.dropHintContainer(i)),d&&f.first&&(m="k-i-insert-top"),u&&f.last&&(m="k-i-insert-bottom"))):_[0]!=this.dropHint[0]&&(this._lastHover&&this._lastHover.removeClass(s),m=e.contains(this.element[0],b[0])?"k-i-denied":"k-i-add")):(m="k-i-denied",this._removeTouchHover()),this.options.drag({originalEvent:t.originalEvent,source:v,target:_,pageY:t.y.location,pageX:t.x.location,status:m.substring(2),setStatus:function(e){m=e}}),0!==m.indexOf("k-i-insert")&&this.dropHint.css(a,"hidden"),this._hintStatus(m)},dragcancel:function(){this.dropHint.remove()},dragend:function(e){var n,i,o,r="over",l=this.source,c=this.dropHint,d=this.dropTarget;return"visible"==c.css(a)?(r=this.options.dropPositionFrom(c),n=c.closest(this.options.itemSelector)):d&&(n=d.closest(this.options.itemSelector),n.length||(n=d.closest(this.options.allowedContainers))),i={originalEvent:e.originalEvent,source:l[0],destination:n[0],valid:"k-i-denied"!=this._hintStatus(),setValid:function(e){this.valid=e},dropTarget:d[0],position:r},o=this.options.drop(i),c.remove(),this._removeTouchHover(),this._lastHover&&this._lastHover.removeClass(s),!i.valid||o?(this._draggable.dropped=i.valid,t):(this._draggable.dropped=!0,this.options.dragend({originalEvent:e.originalEvent,source:l,destination:n,position:r}),t)},destroy:function(){this._lastHover=this.hovered=null,this._draggable.destroy()}})}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.treeview.min",["kendo.data.min","kendo.treeview.draganddrop.min"],e)}(function(){return function(e,t){function n(e){return function(t){var n=t.children(".k-animation-container");return n.length||(n=t),n.children(e)}}function i(e){return f.template(e,{useWithBlock:!1})}function o(e){return e.find("> div .k-checkbox-wrapper [type=checkbox]")}function r(e){return function(t,n){n=n.closest(U);var i,o=n.parent();return o.parent().is("li")&&(i=o.parent()),this._dataSourceMove(t,o,i,function(t,i){return this._insert(t.data(),i,n.index()+e)})}}function a(t,n){for(var i;t&&"ul"!=t.nodeName.toLowerCase();)i=t,t=t.nextSibling,3==i.nodeType&&(i.nodeValue=e.trim(i.nodeValue)),h.test(i.className)?n.insertBefore(i,n.firstChild):n.appendChild(i)}function s(t){var n=t.children("div"),i=t.children("ul"),o=n.children(".k-icon"),r=t.children(":checkbox"),s=n.children(".k-in");t.hasClass("k-treeview")||(n.length||(n=e("
                ").prependTo(t)),!o.length&&i.length?o=e("").prependTo(n):i.length&&i.children().length||(o.remove(),i.remove()),r.length&&e("").appendTo(n).append(r),s.length||(s=t.children("a").eq(0).addClass("k-in k-link"),s.length||(s=e("")),s.appendTo(n),n.length&&a(n[0].nextSibling,s[0])))}var l,c,d,u,h,f=window.kendo,p=f.ui,m=f.data,g=e.extend,v=f.template,_=e.isArray,b=p.Widget,w=m.HierarchicalDataSource,y=e.proxy,k=f.keys,x=".kendoTreeView",C="select",S="check",T="navigate",D="expand",A="change",E="error",I="checked",R="indeterminate",M="collapse",F="dragstart",z="drag",P="drop",B="dragend",L="dataBound",H="click",N="undefined",O="k-state-hover",V="k-treeview",W=":visible",U=".k-item",j="string",q="aria-selected",G="aria-disabled",$={text:"dataTextField",url:"dataUrlField",spriteCssClass:"dataSpriteCssClassField",imageUrl:"dataImageUrlField"},Y=function(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&1===e.nodeType&&typeof e.nodeName===j};c=n(".k-group"),d=n(".k-group,.k-content"),u=function(e){return e.children("div").children(".k-icon")},h=/k-sprite/,l=f.ui.DataBoundWidget.extend({init:function(e,t){var n,i=this,o=!1,r=t&&!!t.dataSource;_(t)&&(t={dataSource:t}),t&&typeof t.loadOnDemand==N&&_(t.dataSource)&&(t.loadOnDemand=!1),b.prototype.init.call(i,e,t),e=i.element,t=i.options,n=e.is("ul")&&e||e.hasClass(V)&&e.children("ul"),o=!r&&n.length,o&&(t.dataSource.list=n),i._animation(),i._accessors(),i._templates(),e.hasClass(V)?(i.wrapper=e,i.root=e.children("ul").eq(0)):(i._wrapper(),n&&(i.root=e,i._group(i.wrapper))),i._tabindex(),i.root.attr("role","tree"),i._dataSource(o),i._attachEvents(),i._dragging(),o?i._syncHtmlAndDataSource():t.autoBind&&(i._progress(!0),i.dataSource.fetch()),t.checkboxes&&t.checkboxes.checkChildren&&i.updateIndeterminate(),i.element[0].id&&(i._ariaId=f.format("{0}_tv_active",i.element[0].id)),f.notify(i)},_attachEvents:function(){var t=this,n=".k-in:not(.k-state-selected,.k-state-disabled)",i="mouseenter";t.wrapper.on(i+x,".k-in.k-state-selected",function(e){e.preventDefault()}).on(i+x,n,function(){e(this).addClass(O)}).on("mouseleave"+x,n,function(){e(this).removeClass(O)}).on(H+x,n,y(t._click,t)).on("dblclick"+x,".k-in:not(.k-state-disabled)",y(t._toggleButtonClick,t)).on(H+x,".k-i-expand,.k-i-collapse",y(t._toggleButtonClick,t)).on("keydown"+x,y(t._keydown,t)).on("focus"+x,y(t._focus,t)).on("blur"+x,y(t._blur,t)).on("mousedown"+x,".k-in,.k-checkbox-wrapper :checkbox,.k-i-expand,.k-i-collapse",y(t._mousedown,t)).on("change"+x,".k-checkbox-wrapper :checkbox",y(t._checkboxChange,t)).on("click"+x,".k-checkbox-wrapper :checkbox",y(t._checkboxClick,t)).on("click"+x,".k-request-retry",y(t._retryRequest,t)).on("click"+x,function(n){e(n.target).is(":kendoFocusable")||t.focus()})},_checkboxClick:function(t){var n=e(t.target);n.data(R)&&(n.data(R,!1).prop(R,!1).prop(I,!0),this._checkboxChange(t))},_syncHtmlAndDataSource:function(e,t){e=e||this.root,t=t||this.dataSource;var n,i,r,a,s,l=t.view(),c=f.attr("uid"),d=f.attr("expanded"),u=this.options.checkboxes,h=e.children("li");for(n=0;h.length>n;n++)r=l[n],a=r.uid,i=h.eq(n),i.attr("role","treeitem").attr(c,a),r.expanded="true"===i.attr(d),u&&(s=o(i),r.checked=s.prop(I),s.attr("id","_"+a),s.next(".k-checkbox-label").attr("for","_"+a)),this._syncHtmlAndDataSource(i.children("ul"),r.children)},_animation:function(){var e=this.options,t=e.animation;t===!1?t={expand:{effects:{}},collapse:{hide:!0,effects:{}}}:t.collapse&&"effects"in t.collapse||(t.collapse=g({reverse:!0},t.expand)),g(t.collapse,{hide:!0}),e.animation=t},_dragging:function(){var t,n=this.options.dragAndDrop,i=this.dragging;n&&!i?(t=this,this.dragging=new p.HierarchicalDragAndDrop(this.element,{reorderable:!0,$angular:this.options.$angular,autoScroll:this.options.autoScroll,filter:"div:not(.k-state-disabled) .k-in",allowedContainers:".k-treeview",itemSelector:".k-treeview .k-item",hintText:y(this._hintText,this),contains:function(t,n){return e.contains(t,n)},dropHintContainer:function(e){return e},itemFromTarget:function(e){var t=e.closest(".k-top,.k-mid,.k-bot");return{item:t,content:e.closest(".k-in"),first:t.hasClass("k-top"),last:t.hasClass("k-bot")}},dropPositionFrom:function(e){return e.prevAll(".k-in").length>0?"after":"before"},dragstart:function(e){return t.trigger(F,{sourceNode:e[0]})},drag:function(e){t.trigger(z,{originalEvent:e.originalEvent,sourceNode:e.source[0],dropTarget:e.target[0],pageY:e.pageY,pageX:e.pageX,statusClass:e.status,setStatusClass:e.setStatus})},drop:function(e){return t.trigger(P,{originalEvent:e.originalEvent,sourceNode:e.source,destinationNode:e.destination,valid:e.valid,setValid:function(t){this.valid=t,e.setValid(t)},dropTarget:e.dropTarget,dropPosition:e.position})},dragend:function(e){function n(n){t.updateIndeterminate(),t.trigger(B,{originalEvent:e.originalEvent,sourceNode:n&&n[0],destinationNode:o[0],dropPosition:r})}var i=e.source,o=e.destination,r=e.position;"over"==r?t.append(i,o,n):("before"==r?i=t.insertBefore(i,o):"after"==r&&(i=t.insertAfter(i,o)),n(i))}})):!n&&i&&(i.destroy(),this.dragging=null)},_hintText:function(e){return this.templates.dragClue({item:this.dataItem(e),treeview:this.options})},_templates:function(){var e=this,t=e.options,n=y(e._fieldAccessor,e);t.template&&typeof t.template==j?t.template=v(t.template):t.template||(t.template=i("# var text = "+n("text")+"(data.item); ## if (typeof data.item.encoded != 'undefined' && data.item.encoded === false) {##= text ## } else { ##: text ## } #")),e._checkboxes(),e.templates={wrapperCssClass:function(e,t){var n="k-item",i=t.index;return e.firstLevel&&0===i&&(n+=" k-first"),i==e.length-1&&(n+=" k-last"),n},cssClass:function(e,t){var n="",i=t.index,o=e.length-1;return e.firstLevel&&0===i&&(n+="k-top "),n+=0===i&&i!=o?"k-top":i==o?"k-bot":"k-mid"},textClass:function(e,t){var n="k-in";return t&&(n+=" k-link"),e.enabled===!1&&(n+=" k-state-disabled"),e.selected===!0&&(n+=" k-state-selected"),n},toggleButtonClass:function(e){var t="k-icon";return t+=e.expanded!==!0?" k-i-expand":" k-i-collapse"},groupAttributes:function(e){var t="";return e.firstLevel||(t="role='group'"),t+(e.expanded!==!0?" style='display:none'":"")},groupCssClass:function(e){var t="k-group";return e.firstLevel&&(t+=" k-treeview-lines"),t},dragClue:i("#= data.treeview.template(data) #"),group:i("
                  #= data.renderItems(data) #
                "),itemContent:i("# var imageUrl = "+n("imageUrl")+"(data.item); ## var spriteCssClass = "+n("spriteCssClass")+"(data.item); ## if (imageUrl) { ## } ## if (spriteCssClass) { ## } ##= data.treeview.template(data) #"), +itemElement:i("# var item = data.item, r = data.r; ## var url = "+n("url")+"(item); #
                # if (item.hasChildren) { ## } ## if (data.treeview.checkboxes) { ##= data.treeview.checkboxes.template(data) ## } ## var tag = url ? 'a' : 'span'; ## var textAttr = url ? ' href=\\'' + url + '\\'' : ''; #<#=tag# class='#= r.textClass(item, !!url) #'#= textAttr #>#= r.itemContent(data) #
                "),item:i("# var item = data.item, r = data.r; #
              • #= r.itemElement(data) #
              • "),loading:i("
                #: data.messages.loading #"),retry:i("#: data.messages.requestFailed # ")}},items:function(){return this.element.find(".k-item > div:first-child")},setDataSource:function(t){var n=this.options;n.dataSource=t,this._dataSource(),n.checkboxes&&n.checkboxes.checkChildren&&this.dataSource.one("change",e.proxy(this.updateIndeterminate,this,null)),this.options.autoBind&&this.dataSource.fetch()},_bindDataSource:function(){this._refreshHandler=y(this.refresh,this),this._errorHandler=y(this._error,this),this.dataSource.bind(A,this._refreshHandler),this.dataSource.bind(E,this._errorHandler)},_unbindDataSource:function(){var e=this.dataSource;e&&(e.unbind(A,this._refreshHandler),e.unbind(E,this._errorHandler))},_dataSource:function(e){function t(e){for(var n=0;e.length>n;n++)e[n]._initChildren(),e[n].children.fetch(),t(e[n].children.view())}var n=this,i=n.options,o=i.dataSource;o=_(o)?{data:o}:o,n._unbindDataSource(),o.fields||(o.fields=[{field:"text"},{field:"url"},{field:"spriteCssClass"},{field:"imageUrl"}]),n.dataSource=o=w.create(o),e&&(o.fetch(),t(o.view())),n._bindDataSource()},events:[F,z,P,B,L,D,M,C,A,T,S],options:{name:"TreeView",dataSource:{},animation:{expand:{effects:"expand:vertical",duration:200},collapse:{duration:100}},messages:{loading:"Loading...",requestFailed:"Request failed.",retry:"Retry"},dragAndDrop:!1,checkboxes:!1,autoBind:!0,autoScroll:!1,loadOnDemand:!0,template:"",dataTextField:null},_accessors:function(){var e,t,n,i=this,o=i.options,r=i.element;for(e in $)t=o[$[e]],n=r.attr(f.attr(e+"-field")),!t&&n&&(t=n),t||(t=e),_(t)||(t=[t]),o[$[e]]=t},_fieldAccessor:function(t){var n=this.options[$[t]],i=n.length,o="(function(item) {";return 0===i?o+="return item['"+t+"'];":(o+="var levels = ["+e.map(n,function(e){return"function(d){ return "+f.expr(e)+"}"}).join(",")+"];",o+="return levels[Math.min(item.level(), "+i+"-1)](item)"),o+="})"},setOptions:function(e){b.fn.setOptions.call(this,e),this._animation(),this._dragging(),this._templates()},_trigger:function(e,t){return this.trigger(e,{node:t.closest(U)[0]})},_setChecked:function(t,n){if(t&&e.isFunction(t.view))for(var i=0,o=t.view();o.length>i;i++)o[i][I]=n,o[i].children&&this._setChecked(o[i].children,n)},_setIndeterminate:function(e){var t,n,i,r=c(e),a=!0;if(r.length&&(t=o(r.children()),n=t.length)){if(n>1){for(i=1;n>i;i++)if(t[i].checked!=t[i-1].checked||t[i].indeterminate||t[i-1].indeterminate){a=!1;break}}else a=!t[0].indeterminate;return o(e).data(R,!a).prop(R,!a).prop(I,a&&t[0].checked)}},updateIndeterminate:function(e){var t,n,i;if(e=e||this.wrapper,t=c(e).children(),t.length){for(n=0;t.length>n;n++)this.updateIndeterminate(t.eq(n));i=this._setIndeterminate(e),i&&i.prop(I)&&(this.dataItem(e).checked=!0)}},_bubbleIndeterminate:function(e){if(e.length){var t,n=this.parent(e);n.length&&(this._setIndeterminate(n),t=n.children("div").find(".k-checkbox-wrapper :checkbox"),t.prop(R)===!1?this.dataItem(n).set(I,t.prop(I)):delete this.dataItem(n).checked,this._bubbleIndeterminate(n))}},_checkboxChange:function(t){var n=e(t.target),i=n.prop(I),o=n.closest(U),r=this.dataItem(o);r.checked!=i&&(r.set(I,i),this._trigger(S,o))},_toggleButtonClick:function(t){var n=e(t.currentTarget).closest(U);n.is("[aria-disabled='true']")||this.toggle(e(t.target).closest(U))},_mousedown:function(t){var n=e(t.currentTarget).closest(U);n.is("[aria-disabled='true']")||(this._clickTarget=n,this.current(n))},_focusable:function(e){return e&&e.length&&e.is(":visible")&&!e.find(".k-in:first").hasClass("k-state-disabled")},_focus:function(){var t=this.select(),n=this._clickTarget;f.support.touch||(n&&n.length&&(t=n),this._focusable(t)||(t=this.current()),this._focusable(t)||(t=this._nextVisible(e())),this.current(t))},focus:function(){var e,t=this.wrapper,n=t[0],i=[],o=[],r=document.documentElement;do n=n.parentNode,n.scrollHeight>n.clientHeight&&(i.push(n),o.push(n.scrollTop));while(n!=r);for(t.focus(),e=0;i.length>e;e++)i[e].scrollTop=o[e]},_blur:function(){this.current().find(".k-in:first").removeClass("k-state-focused")},_enabled:function(e){return!e.children("div").children(".k-in").hasClass("k-state-disabled")},parent:function(t){var n,i,o=/\bk-treeview\b/,r=/\bk-item\b/;typeof t==j&&(t=this.element.find(t)),Y(t)||(t=t[0]),i=r.test(t.className);do t=t.parentNode,r.test(t.className)&&(i?n=t:i=!0);while(!o.test(t.className)&&!n);return e(n)},_nextVisible:function(e){function t(e){for(;e.length&&!e.next().length;)e=i.parent(e);return e.next().length?e.next():e}var n,i=this,o=i._expanded(e);return e.length&&e.is(":visible")?o?(n=c(e).children().first(),n.length||(n=t(e))):n=t(e):n=i.root.children().eq(0),i._enabled(n)||(n=i._nextVisible(n)),n},_previousVisible:function(e){var t,n,i=this;if(!e.length||e.prev().length)for(n=e.length?e.prev():i.root.children().last();i._expanded(n)&&(t=c(n).children().last(),t.length);)n=t;else n=i.parent(e)||e;return i._enabled(n)||(n=i._previousVisible(n)),n},_keydown:function(n){var i,o=this,r=n.keyCode,a=o.current(),s=o._expanded(a),l=a.find(".k-checkbox-wrapper:first :checkbox"),c=f.support.isRtl(o.element);n.target==n.currentTarget&&(!c&&r==k.RIGHT||c&&r==k.LEFT?s?i=o._nextVisible(a):o.expand(a):!c&&r==k.LEFT||c&&r==k.RIGHT?s?o.collapse(a):(i=o.parent(a),o._enabled(i)||(i=t)):r==k.DOWN?i=o._nextVisible(a):r==k.UP?i=o._previousVisible(a):r==k.HOME?i=o._nextVisible(e()):r==k.END?i=o._previousVisible(e()):r==k.ENTER?a.find(".k-in:first").hasClass("k-state-selected")||o._trigger(C,a)||o.select(a):r==k.SPACEBAR&&l.length&&(l.prop(I,!l.prop(I)).data(R,!1).prop(R,!1),o._checkboxChange({target:l}),i=a),i&&(n.preventDefault(),a[0]!=i[0]&&(o._trigger(T,i),o.current(i))))},_click:function(t){var n,i=this,o=e(t.currentTarget),r=d(o.closest(U)),a=o.attr("href");n=a?"#"==a||a.indexOf("#"+this.element.id+"-")>=0:r.length&&!r.children().length,n&&t.preventDefault(),o.hasClass(".k-state-selected")||i._trigger(C,o)||i.select(o)},_wrapper:function(){var e,t,n=this,i=n.element,o="k-widget k-treeview";i.is("ul")?(e=i.wrap("
                ").parent(),t=i):(e=i,t=e.children("ul").eq(0)),n.wrapper=e.addClass(o),n.root=t},_group:function(e){var t=this,n=e.hasClass(V),i={firstLevel:n,expanded:n||t._expanded(e)},o=e.children("ul");o.addClass(t.templates.groupCssClass(i)).css("display",i.expanded?"":"none"),t._nodes(o,i)},_nodes:function(t,n){var i,o=this,r=t.children("li");n=g({length:r.length},n),r.each(function(t,r){r=e(r),i={index:t,expanded:o._expanded(r)},s(r),o._updateNodeClasses(r,n,i),o._group(r)})},_checkboxes:function(){var e,t=this.options,n=t.checkboxes;n&&(e="d;d++)u=t[d],u.index=n+d,g+=h._renderItem({group:m,item:u});if(l=e(g),l.length){for(h.angular("compile",function(){return{elements:l.get(),data:t.map(function(e){return{dataItem:e}})}}),f.length||(f=e(h._renderGroup({group:m})).appendTo(i)),o(l,f),i.hasClass("k-item")&&(s(i),h._updateNodeClasses(i)),h._updateNodeClasses(l.prev().first()),h._updateNodeClasses(l.next().last()),d=0;t.length>d;d++)u=t[d],u.hasChildren&&(a=u.children.data(),a.length&&h._insertNode(a,u.index,l.eq(d),v,!h._expanded(l.eq(d))));return l}},_updateNodes:function(t,n){function i(e,t){e.find(".k-checkbox-wrapper :checkbox").prop(I,t).data(R,!1).prop(R,!1)}var o,r,a,s,l,c,u,h=this,f={treeview:h.options,item:s},m="expanded"!=n&&"checked"!=n;if("selected"==n)s=t[0],r=h.findByUid(s.uid).find(".k-in:first").removeClass("k-state-hover").toggleClass("k-state-selected",s[n]).end(),s[n]&&h.current(r),r.attr(q,!!s[n]);else{for(u=e.map(t,function(e){return h.findByUid(e.uid).children("div")}),m&&h.angular("cleanup",function(){return{elements:u}}),o=0;t.length>o;o++)f.item=s=t[o],a=u[o],r=a.parent(),m&&a.children(".k-in").html(h.templates.itemContent(f)),n==I?(l=s[n],i(a,l),h.options.checkboxes.checkChildren&&(i(r.children(".k-group"),l),h._setChecked(s.children,l),h._bubbleIndeterminate(r))):"expanded"==n?h._toggle(r,s,s[n]):"enabled"==n&&(r.find(".k-checkbox-wrapper :checkbox").prop("disabled",!s[n]),c=!d(r).is(W),r.removeAttr(G),s[n]||(s.selected&&s.set("selected",!1),s.expanded&&s.set("expanded",!1),c=!0,r.attr(q,!1).attr(G,!0)),h._updateNodeClasses(r,{},{enabled:s[n],expanded:!c})),a.length&&this.trigger("itemChange",{item:a,data:s,ns:p});m&&h.angular("compile",function(){return{elements:u,data:e.map(t,function(e){return[{dataItem:e}]})}})}},_appendItems:function(e,t,n){var i=c(n),o=i.children(),r=!this._expanded(n);typeof e==N&&(e=o.length),this._insertNode(t,e,n,function(t,n){e>=o.length?t.appendTo(n):t.insertBefore(o.eq(e))},r),this._expanded(n)&&(this._updateNodeClasses(n),c(n).css("display","block"))},_refreshChildren:function(e,t,n){var i,o,r,a=this.options,l=a.loadOnDemand,d=a.checkboxes&&a.checkboxes.checkChildren;if(c(e).empty(),t.length)for(this._appendItems(n,t,e),o=c(e).children(),l&&d&&this._bubbleIndeterminate(o.last()),i=0;o.length>i;i++)r=o.eq(i),this.trigger("itemChange",{item:r.children("div"),data:this.dataItem(r),ns:p});else s(e)},_refreshRoot:function(t){var n,i,o,r=this._renderGroup({items:t,group:{firstLevel:!0,expanded:!0}});for(this.root.length?(this._angularItems("cleanup"),n=e(r),this.root.attr("class",n.attr("class")).html(n.html())):this.root=this.wrapper.html(r).children("ul"),this.root.attr("role","tree"),i=this.root.children(".k-item"),o=0;t.length>o;o++)this.trigger("itemChange",{item:i.eq(o),data:t[o],ns:p});this._angularItems("compile")},refresh:function(e){var n,i,o=e.node,r=e.action,a=e.items,s=this.wrapper,l=this.options,c=l.loadOnDemand,d=l.checkboxes&&l.checkboxes.checkChildren;if(e.field){if(!a[0]||!a[0].level)return;return this._updateNodes(a,e.field)}if(o&&(s=this.findByUid(o.uid),this._progress(s,!1)),d&&"remove"!=r){for(i=!1,n=0;a.length>n;n++)if("checked"in a[n]){i=!0;break}if(!i&&o&&o.checked)for(n=0;a.length>n;n++)a[n].checked=!0}if("add"==r?this._appendItems(e.index,a,s):"remove"==r?this._remove(this.findByUid(a[0].uid),!1):"itemchange"==r?this._updateNodes(a):"itemloaded"==r?this._refreshChildren(s,a,e.index):this._refreshRoot(a),"remove"!=r)for(n=0;a.length>n;n++)c&&!a[n].expanded||a[n].load();this.trigger(L,{node:o?s:t})},_error:function(e){var t=e.node&&this.findByUid(e.node.uid),n=this.templates.retry({messages:this.options.messages});t?(this._progress(t,!1),this._expanded(t,!1),u(t).addClass("k-i-refresh"),e.node.loaded(!1)):(this._progress(!1),this.element.html(n))},_retryRequest:function(e){e.preventDefault(),this.dataSource.fetch()},expand:function(e){this._processNodes(e,function(e,t){this.toggle(t,!0)})},collapse:function(e){this._processNodes(e,function(e,t){this.toggle(t,!1)})},enable:function(e,t){t=2==arguments.length?!!t:!0,this._processNodes(e,function(e,n){this.dataItem(n).set("enabled",t)})},current:function(n){var i=this,o=i._current,r=i.element,a=i._ariaId;return arguments.length>0&&n&&n.length?(o&&(o[0].id===a&&o.removeAttr("id"),o.find(".k-in:first").removeClass("k-state-focused")),o=i._current=e(n,r).closest(U),o.find(".k-in:first").addClass("k-state-focused"),a=o[0].id||a,a&&(i.wrapper.removeAttr("aria-activedescendant"),o.attr("id",a),i.wrapper.attr("aria-activedescendant",a)),t):(o||(o=i._nextVisible(e())),o)},select:function(n){var i=this,o=i.element;return arguments.length?(n=e(n,o).closest(U),o.find(".k-state-selected").each(function(){var t=i.dataItem(this);t?(t.set("selected",!1),delete t.selected):e(this).removeClass("k-state-selected")}),n.length&&(i.dataItem(n).set("selected",!0),i._clickTarget=n),i.trigger(A),t):o.find(".k-state-selected").closest(U)},_toggle:function(e,t,n){var i,o=this.options,r=d(e),a=n?"expand":"collapse";r.data("animating")||this._trigger(a,e)||(this._expanded(e,n),i=t&&t.loaded(),n&&!i?(o.loadOnDemand&&this._progress(e,!0),r.remove(),t.load()):(this._updateNodeClasses(e,{},{expanded:n}),n||r.css("height",r.height()).css("height"),r.kendoStop(!0,!0).kendoAnimate(g({reset:!0},o.animation[a],{complete:function(){n&&r.css("height","")}}))))},toggle:function(t,n){t=e(t),u(t).is(".k-i-expand, .k-i-collapse")&&(1==arguments.length&&(n=!this._expanded(t)),this._expanded(t,n))},destroy:function(){var e=this;b.fn.destroy.call(e),e.wrapper.off(x),e._unbindDataSource(),e.dragging&&e.dragging.destroy(),f.destroy(e.element),e.root=e.wrapper=e.element=null},_expanded:function(e,n){var i=f.attr("expanded"),o=this.dataItem(e),r=n;return 1==arguments.length?"true"===e.attr(i)||o&&o.expanded:(d(e).data("animating")||(o&&(o.set("expanded",r),r=o.expanded),r?(e.attr(i,"true"),e.attr("aria-expanded","true")):(e.removeAttr(i),e.attr("aria-expanded","false"))),t)},_progress:function(e,t){var n=this.element,i=this.templates.loading({messages:this.options.messages});1==arguments.length?(t=e,t?n.html(i):n.empty()):u(e).toggleClass("k-i-loading",t).removeClass("k-i-refresh")},text:function(e,n){var i=this.dataItem(e),o=this.options[$.text],r=i.level(),a=o.length,s=o[Math.min(r,a-1)];return n?(i.set(s,n),t):i[s]},_objectOrSelf:function(t){return e(t).closest("[data-role=treeview]").data("kendoTreeView")||this},_dataSourceMove:function(t,n,i,o){var r,a=this._objectOrSelf(i||n),s=a.dataSource,l=e.Deferred().resolve().promise();return i&&i[0]!=a.element[0]&&(r=a.dataItem(i),r.loaded()||(a._progress(i,!0),l=r.load()),i!=this.root&&(s=r.children,s&&s instanceof w||(r._initChildren(),r.loaded(!0),s=r.children))),t=this._toObservableData(t),o.call(a,s,t,l)},_toObservableData:function(t){var n,i,o=t;return(t instanceof window.jQuery||Y(t))&&(n=this._objectOrSelf(t).dataSource,i=e(t).attr(f.attr("uid")),o=n.getByUid(i),o&&(o=n.remove(o))),o},_insert:function(e,t,n){t instanceof f.data.ObservableArray?t=t.toJSON():_(t)||(t=[t]);var i=e.parent();return i&&i._initChildren&&(i.hasChildren=!0,i._initChildren()),e.splice.apply(e,[n,0].concat(t)),this.findByUid(e[n].uid)},insertAfter:r(1),insertBefore:r(0),append:function(t,n,i){var o=this.root;return n&&(o=c(n)),this._dataSourceMove(t,o,n,function(t,o,r){function a(){n&&l._expanded(n,!0);var e=t.data(),i=Math.max(e.length,0);return l._insert(e,o,i)}var s,l=this;return r.then(function(){s=a(),(i=i||e.noop)(s)}),s||null})},_remove:function(t,n){var i,o,r,a=this;return t=e(t,a.element),this.angular("cleanup",function(){return{elements:t.get()}}),i=t.parent().parent(),o=t.prev(),r=t.next(),t[n?"detach":"remove"](),i.hasClass("k-item")&&(s(i),a._updateNodeClasses(i)),a._updateNodeClasses(o),a._updateNodeClasses(r),t},remove:function(e){var t=this.dataItem(e);t&&this.dataSource.remove(t)},detach:function(e){return this._remove(e,!0)},findByText:function(t){return e(this.element).find(".k-in").filter(function(n,i){return e(i).text()==t}).closest(U)},findByUid:function(t){var n,i,o=this.element.find(".k-item"),r=f.attr("uid");for(i=0;o.length>i;i++)if(o[i].getAttribute(r)==t){n=o[i];break}return e(n)},expandPath:function(t,n){function i(){a.shift(),a.length?o(a[0]).then(i):s.call(r)}function o(t){var n=e.Deferred(),i=r.dataSource.get(t);return i?i.loaded()?(i.set("expanded",!0),n.resolve()):(r._progress(r.findByUid(i.uid),!0),i.load().then(function(){i.set("expanded",!0),n.resolve()})):n.resolve(),n.promise()}var r=this,a=t.slice(0),s=n||e.noop;o(a[0]).then(i)},_parentIds:function(e){for(var t=e&&e.parentNode(),n=[];t&&t.parentNode;)n.unshift(t.id),t=t.parentNode();return n},expandTo:function(e){e instanceof f.data.Node||(e=this.dataSource.get(e));var t=this._parentIds(e);this.expandPath(t)},_renderItem:function(e){return e.group||(e.group={}),e.treeview=this.options,e.r=this.templates,this.templates.item(e)},_renderGroup:function(e){var t=this;return e.renderItems=function(e){var n="",i=0,o=e.items,r=o?o.length:0,a=e.group;for(a.length=r;r>i;i++)e.group=a,e.item=o[i],e.item.index=i,n+=t._renderItem(e);return n},e.r=t.templates,t.templates.group(e)}}),p.plugin(l)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.pivot.fieldmenu.min",["kendo.pivotgrid.min","kendo.menu.min","kendo.window.min","kendo.treeview.min","kendo.dropdownlist.min"],e)}(function(){return function(e,t){function n(e,t){var n,i,o=[];for(n=0,i=e.length;i>n;n++)e[n].field!==t&&o.push(e[n]);return o}function i(e,t,n){var i,o,r,a;if(!e)return[];for(e=e.filters,i=0,o=[],r=e.length;r>i;i++)a=e[i].operator,(n||"in"===a)&&a!==n||e[i].field!==t||o.push(e[i]);return o}function o(t,n,o){var r,a=0,s=o.length;if(t=i(t,n,"in")[0])for(r=t.value.split(",");s>a;a++)o[a].checked=e.inArray(o[a].uniqueName,r)>=0;else for(;s>a;a++)o[a].checked=!0}function r(e,t){var n,i=e.length;for(n=0;i>n;n++)e[n].checked&&0!==e[n].level()&&t.push(e[n].uniqueName),e[n].hasChildren&&r(e[n].children.view(),t)}var a=window.kendo,s=a.ui,l="kendoContextMenu",c=e.proxy,d=".kendoPivotFieldMenu",u=s.Widget,h=u.extend({init:function(e,t){u.fn.init.call(this,e,t),this._dataSource(),this._layout(),a.notify(this)},events:[],options:{name:"PivotFieldMenu",filter:null,filterable:!0,sortable:!0,messages:{info:"Show items with value that:",sortAscending:"Sort Ascending",sortDescending:"Sort Descending",filterFields:"Fields Filter",filter:"Filter",include:"Include Fields...",title:"Fields to include",clear:"Clear",ok:"OK",cancel:"Cancel",operators:{contains:"Contains",doesnotcontain:"Does not contain",startswith:"Starts with",endswith:"Ends with",eq:"Is equal to",neq:"Is not equal to"}}},_layout:function(){var t=this.options;this.wrapper=e(a.template(p)({ns:a.ns,filterable:t.filterable,sortable:t.sortable,messages:t.messages})),this.menu=this.wrapper[l]({filter:t.filter,target:this.element,orientation:"vertical",showOn:"click",closeOnClick:!1,open:c(this._menuOpen,this),select:c(this._select,this),copyAnchorStyles:!1}).data(l),this._createWindow(),t.filterable&&this._initFilterForm()},_initFilterForm:function(){var e=this.menu.element.find(".k-filter-item"),t=c(this._filter,this);this._filterOperator=new a.ui.DropDownList(e.find("select")),this._filterValue=e.find(".k-textbox"),e.on("submit"+d,t).on("click"+d,".k-button-filter",t).on("click"+d,".k-button-clear",c(this._reset,this))},_setFilterForm:function(e){var t=this._filterOperator,n="",i="";e&&(n=e.operator,i=e.value),t.value(n),t.value()||t.select(0),this._filterValue.val(i)},_clearFilters:function(e){var t,n,o=this.dataSource.filter()||{},r=0;for(o.filters=o.filters||[],t=i(o,e),n=t.length;n>r;r++)o.filters.splice(o.filters.indexOf(t[r]),1);return o},_convert:function(t){var n=this.dataSource.options.schema,i=((n.model||{}).fields||{})[this.currentMember];return i&&("number"===i.type?t=parseFloat(t):"boolean"===i.type&&(t=!!e.parseJSON(t))),t},_filter:function(e){var n,i,o=this,r=o._convert(o._filterValue.val());return e.preventDefault(),""===r?(o.menu.close(),t):(n={field:o.currentMember,operator:o._filterOperator.value(),value:r},i=o._clearFilters(o.currentMember),i.filters.push(n),o.dataSource.filter(i),o.menu.close(),t)},_reset:function(e){var t=this,n=t._clearFilters(t.currentMember);e.preventDefault(),n.filters[0]||(n={}),t.dataSource.filter(n),t._setFilterForm(null),t.menu.close()},_sort:function(e){var t=this.currentMember,i=this.dataSource.sort()||[];i=n(i,t),i.push({field:t,dir:e}),this.dataSource.sort(i),this.menu.close()},setDataSource:function(e){this.options.dataSource=e,this._dataSource()},_dataSource:function(){this.dataSource=a.data.PivotDataSource.create(this.options.dataSource)},_createWindow:function(){var t=this.options.messages;this.includeWindow=e(a.template(m)({messages:t})).on("click"+d,".k-button-ok",c(this._applyIncludes,this)).on("click"+d,".k-button-cancel",c(this._closeWindow,this)),this.includeWindow=new s.Window(this.includeWindow,{title:t.title,visible:!1,resizable:!1,open:c(this._windowOpen,this)})},_applyIncludes:function(e){var t,n=[],o=this.treeView.dataSource.view(),a=o[0].checked,s=this.dataSource.filter(),l=i(s,this.currentMember,"in")[0];r(o,n),l&&(a?(s.filters.splice(s.filters.indexOf(l),1),s.filters.length||(s={})):l.value=n.join(","),t=s),n.length&&(t||a||(t={field:this.currentMember,operator:"in",value:n.join(",")},s&&(s.filters.push(t),t=s))),t&&this.dataSource.filter(t),this._closeWindow(e)},_closeWindow:function(e){e.preventDefault(),this.includeWindow.close()},_treeViewDataSource:function(){var e=this;return a.data.HierarchicalDataSource.create({schema:{model:{id:"uniqueName",hasChildren:function(e){return parseInt(e.childrenCardinality,10)>0}}},transport:{read:function(t){var n={},i=e.treeView.dataSource.get(t.data.uniqueName),r=t.data.uniqueName;r?(n.memberUniqueName=i.uniqueName.replace(/\&/g,"&"),n.treeOp=1):n.levelUniqueName=e.currentMember+".[(ALL)]",e.dataSource.schemaMembers(n).done(function(n){o(e.dataSource.filter(),e.currentMember,n),t.success(n)}).fail(t.error)}}})},_createTreeView:function(e){var t=this;t.treeView=new s.TreeView(e,{autoBind:!1,dataSource:t._treeViewDataSource(),dataTextField:"caption",template:"#: data.item.caption || data.item.name #",checkboxes:{checkChildren:!0},dataBound:function(){s.progress(t.includeWindow.element,!1)}})},_menuOpen:function(t){if(t.event){var n=a.attr("name");this.currentMember=e(t.event.target).closest("["+n+"]").attr(n),this.options.filterable&&this._setFilterForm(i(this.dataSource.filter(),this.currentMember)[0])}},_select:function(t){var n=e(t.item);e(".k-pivot-filter-window").not(this.includeWindow.element).kendoWindow("close"),n.hasClass("k-include-item")?this.includeWindow.center().open():n.hasClass("k-sort-asc")?this._sort("asc"):n.hasClass("k-sort-desc")&&this._sort("desc")},_windowOpen:function(){this.treeView||this._createTreeView(this.includeWindow.element.find(".k-treeview")),s.progress(this.includeWindow.element,!0),this.treeView.dataSource.read()},destroy:function(){u.fn.destroy.call(this),this.menu&&(this.menu.destroy(),this.menu=null),this.treeView&&(this.treeView.destroy(),this.treeView=null),this.includeWindow&&(this.includeWindow.destroy(),this.includeWindow=null),this.wrapper=null,this.element=null}}),f='
                #=messages.info#
                #=messages.filter##=messages.clear#
                ',p='
                  # if (sortable) {#
                • ${messages.sortAscending}
                • ${messages.sortDescending}
                • # if (filterable) {#
                • # } ## } ## if (filterable) {#
                • ${messages.include}
                • ${messages.filterFields}
                  • '+f+"
                • # } #
                ",m='
                ${messages.ok}${messages.cancel}
                ';s.plugin(h)}(window.kendo.jQuery),window.kendo},"function"==typeof define&&define.amd?define:function(e,t,n){(n||t)()}),function(e,define){define("kendo.filtercell.min",["kendo.autocomplete.min","kendo.datepicker.min","kendo.numerictextbox.min","kendo.combobox.min","kendo.dropdownlist.min"],e)}(function(){return function(e,t){function n(t){var n="string"==typeof t?t:t.operator;return e.inArray(n,v)>-1}function i(t,n){var o,r,a=[];if(e.isPlainObject(t))if(t.hasOwnProperty("filters"))a=t.filters;else if(t.field==n)return t;for(e.isArray(t)&&(a=t),o=0;a.length>o;o++)if(r=i(a[o],n))return r}function o(t,n){t.filters&&(t.filters=e.grep(t.filters,function(e){return o(e,n),e.filters?e.filters.length:e.field!=n}))}function r(e,t){var n=a.getter(t,!0);return function(t){for(var i,o,r=e(t),a=[],s=0,l={};r.length>s;)i=r[s++],o=n(i),l.hasOwnProperty(o)||(a.push(i),l[o]=!0);return a}}var a=window.kendo,s=a.ui,l=a.data.DataSource,c=s.Widget,d="change",u="boolean",h="enums",f="string",p="Is equal to",m="Is not equal to",g=e.proxy,v=["isnull","isnotnull","isempty","isnotempty"],_=c.extend({init:function(i,o){var r,s,l,p,m,v,_,b,w,y,k,x,C;if(i=e(i).addClass("k-filtercell"),r=this.wrapper=e("").appendTo(i),s=this,m=o,b=s.operators=o.operators||{},w=s.input=e("").attr(a.attr("bind"),"value: value").appendTo(r),y=o?o.suggestDataSource:null,y&&(o=e.extend({},o,{suggestDataSource:{}})),c.fn.init.call(s,i[0],o),y&&(s.options.suggestDataSource=y),o=s.options,l=s.dataSource=o.dataSource,s.model=l.reader.model,_=o.type=f,k=a.getter("reader.model.fields",!0)(l)||{},x=k[o.field],x&&x.type&&(_=o.type=x.type),o.values&&(o.type=_=h),b=b[_]||o.operators[_],!m.operator)for(v in b){o.operator=v;break}s._parse=function(e){return null!=e?e+"":e},s.model&&s.model.fields&&(C=s.model.fields[o.field],C&&C.parse&&(s._parse=g(C.parse,C))),s.defaultOperator=o.operator,s.viewModel=p=a.observable({operator:o.operator,value:null,operatorVisible:function(){var e=this.get("value");return null!==e&&e!==t&&"undefined"!=e||n(this.get("operator"))&&!s._clearInProgress}}),p.bind(d,g(s.updateDsFilter,s)),_==f&&s.initSuggestDataSource(o),null!==o.inputWidth&&w.width(o.inputWidth),s._setInputType(o,_),_!=u&&o.showOperators!==!1?s._createOperatorDropDown(b):r.addClass("k-operator-hidden"),s._createClearIcon(),a.bind(this.wrapper,p),_==f&&(o.template||s.setAutoCompleteSource()),_==h&&s.setComboBoxSource(s.options.values),s._refreshUI(),s._refreshHandler=g(s._refreshUI,s),s.dataSource.bind(d,s._refreshHandler)},_setInputType:function(t,n){var i,o,r,s,l,c=this,d=c.input;"function"==typeof t.template?(t.template.call(c.viewModel,{element:c.input,dataSource:c.suggestDataSource}),c._angularItems("compile")):n==f?d.attr(a.attr("role"),"autocomplete").attr(a.attr("text-field"),t.dataTextField||t.field).attr(a.attr("filter"),t.suggestionOperator).attr(a.attr("delay"),t.delay).attr(a.attr("min-length"),t.minLength).attr(a.attr("value-primitive"),!0):"date"==n?d.attr(a.attr("role"),"datepicker"):n==u?(d.remove(),i=e(""),o=c.wrapper,r=a.guid(),s=e("
                + * + */ +ngMap.directive('marker', ['Attr2Options', function(Attr2Options) { + var parser = Attr2Options; + + var getMarker = function(options, events) { + var marker; + + /** + * set options + */ + if (options.icon instanceof Object) { + if ((""+options.icon.path).match(/^[A-Z_]+$/)) { + options.icon.path = google.maps.SymbolPath[options.icon.path]; + } + for (var key in options.icon) { + var arr = options.icon[key]; + if (key == "anchor" || key == "origin") { + options.icon[key] = new google.maps.Point(arr[0], arr[1]); + } else if (key == "size" || key == "scaledSize") { + options.icon[key] = new google.maps.Size(arr[0], arr[1]); + } + } + } + if (!(options.position instanceof google.maps.LatLng)) { + var orgPosition = options.position; + options.position = new google.maps.LatLng(0,0); + marker = new google.maps.Marker(options); + parser.setDelayedGeoLocation(marker, 'setPosition', orgPosition); + } else { + marker = new google.maps.Marker(options); + } + + /** + * set events + */ + if (Object.keys(events).length > 0) { + void 0; + } + for (var eventName in events) { + if (eventName) { + google.maps.event.addListener(marker, eventName, events[eventName]); + } + } + + return marker; + }; + + return { + restrict: 'E', + require: '^map', + link: function(scope, element, attrs, mapController) { + var orgAttrs = parser.orgAttributes(element); + var filtered = parser.filter(attrs); + var markerOptions = parser.getOptions(filtered, scope); + var markerEvents = parser.getEvents(scope, filtered); + void 0; + + /** + * set event to clean up removed marker + * useful with ng-repeat + */ + element.bind('$destroy', function() { + var markers = marker.map.markers; + for (var name in markers) { + if (markers[name] == marker) { + delete markers[name]; + } + } + marker.setMap(null); + }); + + var marker = getMarker(markerOptions, markerEvents); + mapController.addMarker(marker); + + /** + * set observers + */ + parser.observeAttrSetObj(orgAttrs, attrs, marker); /* observers */ + + } //link + }; // return +}]);// + +/** + * @ngdoc directive + * @name overlay-map-type + * @requires Attr2Options + * @description + * Requires: map directive + * Restrict To: Element + * + * @example + * Example: + * + * + * + * + */ +/*jshint -W089*/ +ngMap.directive('overlayMapType', ['Attr2Options', '$window', function(Attr2Options, $window) { + var parser = Attr2Options; + + return { + restrict: 'E', + require: '^map', + + link: function(scope, element, attrs, mapController) { + var overlayMapTypeObject; + var initMethod = attrs.initMethod || "insertAt"; + if (attrs.object) { + var __scope = scope[attrs.object] ? scope : $window; + overlayMapTypeObject = __scope[attrs.object]; + if (typeof overlayMapTypeObject == "function") { + overlayMapTypeObject = new overlayMapTypeObject(); + } + } + if (!overlayMapTypeObject) { + throw "invalid map-type object"; + } + + scope.$on('mapInitialized', function(evt, map) { + if (initMethod == "insertAt") { + var index = parseInt(attrs.index, 10); + map.overlayMapTypes.insertAt(index, overlayMapTypeObject); + } else if (initMethod == "push") { + map.overlayMapTypes.push(overlayMapTypeObject); + } + }); + mapController.addObject('overlayMapTypes', overlayMapTypeObject); + } + }; // return +}]); + +/** + * @ngdoc directive + * @name shape + * @requires Attr2Options + * @description + * Initialize a Google map shape in map with given options and register events + * The shapes are: + * . circle + * . polygon + * . polyline + * . rectangle + * . groundOverlay(or image) + * + * Requires: map directive + * + * Restrict To: Element + * + * @param {Boolean} centered if set, map will be centered with this marker + * @param {String} <OPTIONS> + * For circle, [any circle options](https://developers.google.com/maps/documentation/javascript/reference#CircleOptions) + * For polygon, [any polygon options](https://developers.google.com/maps/documentation/javascript/reference#PolygonOptions) + * For polyline, [any polyline options](https://developers.google.com/maps/documentation/javascript/reference#PolylineOptions) + * For rectangle, [any rectangle options](https://developers.google.com/maps/documentation/javascript/reference#RectangleOptions) + * For image, [any groundOverlay options](https://developers.google.com/maps/documentation/javascript/reference#GroundOverlayOptions) + * @param {String} <MapEvent> Any Shape events, https://developers.google.com/maps/documentation/javascript/reference + * @example + * Usage: + * + * + * + * + * Example: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * For full-working example, please visit + * [shape example](https://rawgit.com/allenhwkim/angularjs-google-maps/master/build/shape.html) + */ +ngMap.directive('shape', ['Attr2Options', function(Attr2Options) { + var parser = Attr2Options; + + var getBounds = function(points) { + return new google.maps.LatLngBounds(points[0], points[1]); + }; + + var getShape = function(options, events) { + var shape; + + var shapeName = options.name; + delete options.name; //remove name bcoz it's not for options + void 0; + + /** + * set options + */ + if (options.icons) { + for (var i=0; i + * + * + */ +/*jshint -W089*/ +ngMap.directive('trafficLayer', ['Attr2Options', function(Attr2Options) { + var parser = Attr2Options; + + var getLayer = function(options, events) { + var layer = new google.maps.TrafficLayer(options); + for (var eventName in events) { + google.maps.event.addListener(layer, eventName, events[eventName]); + } + return layer; + }; + + return { + restrict: 'E', + require: '^map', + + link: function(scope, element, attrs, mapController) { + var orgAttrs = parser.orgAttributes(element); + var filtered = parser.filter(attrs); + var options = parser.getOptions(filtered); + var events = parser.getEvents(scope, filtered); + void 0; + + var layer = getLayer(options, events); + mapController.addObject('trafficLayers', layer); + parser.observeAttrSetObj(orgAttrs, attrs, layer); //observers + } + }; // return +}]); + +/** + * @ngdoc directive + * @name transit-layer + * @requires Attr2Options + * @description + * Requires: map directive + * Restrict To: Element + * + * @example + * Example: + * + * + * + * + */ +/*jshint -W089*/ +ngMap.directive('transitLayer', ['Attr2Options', function(Attr2Options) { + var parser = Attr2Options; + + var getLayer = function(options, events) { + var layer = new google.maps.TransitLayer(options); + for (var eventName in events) { + google.maps.event.addListener(layer, eventName, events[eventName]); + } + return layer; + }; + + return { + restrict: 'E', + require: '^map', + + link: function(scope, element, attrs, mapController) { + var orgAttrs = parser.orgAttributes(element); + var filtered = parser.filter(attrs); + var options = parser.getOptions(filtered); + var events = parser.getEvents(scope, filtered); + void 0; + + var layer = getLayer(options, events); + mapController.addObject('transitLayers', layer); + parser.observeAttrSetObj(orgAttrs, attrs, layer); //observers + } + }; // return +}]); + +/** + * @ngdoc directive + * @name weather-layer + * @requires Attr2Options + * @description + * Requires: map directive + * Restrict To: Element + * + * @example + * Example: + * + * + * + * + */ +/*jshint -W089*/ +ngMap.directive('weatherLayer', ['Attr2Options', function(Attr2Options) { + var parser = Attr2Options; + + var getLayer = function(options, events) { + var layer = new google.maps.weather.WeatherLayer(options); + for (var eventName in events) { + google.maps.event.addListener(layer, eventName, events[eventName]); + } + return layer; + }; + + return { + restrict: 'E', + require: '^map', + + link: function(scope, element, attrs, mapController) { + var orgAttrs = parser.orgAttributes(element); + var filtered = parser.filter(attrs); + var options = parser.getOptions(filtered); + var events = parser.getEvents(scope, filtered); + + void 0; + + var layer = getLayer(options, events); + mapController.addObject('weatherLayers', layer); + parser.observeAttrSetObj(orgAttrs, attrs, layer); //observers + } + }; // return +}]); diff --git a/bower_components/ngmap/build/scripts/ng-map.min.js b/bower_components/ngmap/build/scripts/ng-map.min.js new file mode 100644 index 0000000..6fc4d13 --- /dev/null +++ b/bower_components/ngmap/build/scripts/ng-map.min.js @@ -0,0 +1 @@ +var ngMap=angular.module("ngMap",[]);ngMap.service("Attr2Options",["$parse","NavigatorGeolocation","GeoCoder",function($parse,NavigatorGeolocation,GeoCoder){var SPECIAL_CHARS_REGEXP=/([\:\-\_]+(.))/g,MOZ_HACK_REGEXP=/^moz([A-Z])/,orgAttributes=function(e){e.length>0&&(e=e[0]);for(var t={},n=0;n0;for(var eventName in events)eventName&&google.maps.event.addListener(infoWindow,eventName,events[eventName]);var template=element.html().trim();if(1!=angular.element(template).length)throw"info-window working as a template must have a container";return infoWindow.__template=template.replace(/\s?ng-non-bindable[='"]+/,""),infoWindow.__compile=function(e){var t=$compile(infoWindow.__template)(e);e.$apply(),infoWindow.setContent(t[0])},infoWindow.__eval=function(event){var template=infoWindow.__template,_this=this;return template=template.replace(/{{(event|this)[^;\}]+}}/g,function(match){var expression=match.replace(/[{}]/g,"").replace("this.","_this.");return eval(expression)})},infoWindow};return{restrict:"E",require:"^map",link:function(e,t,n,o){t.css("display","none");var a=parser.orgAttributes(t),r=parser.filter(n),i=parser.getOptions(r,e),s=parser.getEvents(e,r),p=getInfoWindow(i,s,t);o.addObject("infoWindows",p),parser.observeAttrSetObj(a,n,p),p.visible&&e.$on("mapInitialized",function(t,n){$timeout(function(){p.__template=p.__eval.apply(this,[t]),p.__compile(e),p.map=n,p.position&&p.open(n)})}),p.visibleOnMarker&&e.$on("mapInitialized",function(t,n){$timeout(function(){var o=p.visibleOnMarker,a=n.markers[o];if(!a)throw"Invalid marker id";p.__template=p.__eval.apply(this,[t]),p.__compile(e),p.open(n,a)})}),e.showInfoWindow=e.showInfoWindow||function(t,n,a){var r=o.map.infoWindows[n],i=r.__template;r.__template=r.__eval.apply(this,[t]),r.__compile(e),a?r.open(o.map,a):this.getPosition?r.open(o.map,this):r.open(o.map),r.__template=i},e.hideInfoWindow=e.hideInfoWindow||function(t,n){var a=o.map.infoWindows[n];a.__template=a.__eval.apply(this,[t]),a.__compile(e),a.close()}}}}]),ngMap.directive("kmlLayer",["Attr2Options",function(e){var t=e,n=function(e,t){var n=new google.maps.KmlLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:"^map",link:function(e,o,a,r){var i=t.orgAttributes(o),s=t.filter(a),p=t.getOptions(s),c=t.getEvents(e,s),l=n(p,c);r.addObject("kmlLayers",l),t.observeAttrSetObj(i,a,l)}}}]),ngMap.directive("mapData",["Attr2Options",function(e){var t=e;return{restrict:"E",require:"^map",link:function(e,n,o){var a=t.filter(o),r=t.getOptions(a),i=t.getEvents(e,a,i);e.$on("mapInitialized",function(t,n){for(var o in r)if(o){var a=r[o];"function"==typeof e[a]?n.data[o](e[a]):n.data[o](a)}for(var s in i)i[s]&&n.data.addListener(s,i[s])})}}}]),ngMap.directive("mapLazyLoad",["$compile","$timeout",function(e,t){"use strict";var n={compile:function(n,o){!o.mapLazyLoad&&void 0;var a=n.html(),r=o.mapLazyLoad;return document.querySelector('script[src="'+r+'"]')?!1:(n.html(""),{pre:function(n,o){window.lazyLoadCallback=function(){t(function(){o.html(a),e(o.contents())(n)},100)};var i=document.createElement("script");i.src=r+"?callback=lazyLoadCallback",document.body.appendChild(i)}})}};return n}]),ngMap.directive("mapType",["Attr2Options","$window",function(e,t){return{restrict:"E",require:"^map",link:function(e,n,o,a){var r,i=o.name;if(!i)throw"invalid map-type name";if(o.object){var s=e[o.object]?e:t;r=s[o.object],"function"==typeof r&&(r=new r)}if(!r)throw"invalid map-type object";e.$on("mapInitialized",function(e,t){t.mapTypes.set(i,r)}),a.addObject("mapTypes",r)}}}]),ngMap.directive("map",["Attr2Options","$timeout",function(e,t){function n(e,t){if(e.currentStyle)var n=e.currentStyle[t];else if(window.getComputedStyle)var n=document.defaultView.getComputedStyle(e,null).getPropertyValue(t);return n}var o=e;return{restrict:"AE",controller:ngMap.MapController,link:function(a,r,i,s){var p=o.orgAttributes(r);a.google=google;var c=document.createElement("div");c.style.width="100%",c.style.height="100%",r.prepend(c),"block"!=n(r[0],"display")&&r.css("display","block"),n(r[0],"height").match(/^(0|auto)/)&&r.css("height","300px");var l=function(n,r){var l=new google.maps.Map(c,{});l.markers={},l.shapes={},t(function(){google.maps.event.trigger(l,"resize")}),n.zoom=n.zoom||15;var u=n.center;u?u instanceof google.maps.LatLng||(delete n.center,e.setDelayedGeoLocation(l,"setCenter",u,{fallbackLocation:g.geoFallbackCenter})):n.center=new google.maps.LatLng(0,0),l.setOptions(n);for(var m in r)m&&google.maps.event.addListener(l,m,r[m]);o.observeAttrSetObj(p,i,l),s.map=l,s.addObjects(s._objects),a.map=l,a.map.scope=a,a.$emit("mapInitialized",l),a.maps=a.maps||{},a.maps[g.id||Object.keys(a.maps).length]=l,a.$emit("mapsInitialized",a.maps)},u=o.filter(i),g=o.getOptions(u,a),m=o.getControlOptions(u),v=angular.extend(g,m),d=o.getEvents(a,u);i.initEvent?a.$on(i.initEvent,function(){!s.map&&l(v,d)}):l(v,d)}}}]),ngMap.MapController=function(){this.map=null,this._objects=[],this.addMarker=function(e){if(this.map){this.map.markers=this.map.markers||{},e.setMap(this.map),e.centered&&this.map.setCenter(e.position);var t=Object.keys(this.map.markers).length;this.map.markers[e.id||t]=e}else this._objects.push(e)},this.addShape=function(e){if(this.map){this.map.shapes=this.map.shapes||{},e.setMap(this.map);var t=Object.keys(this.map.shapes).length;this.map.shapes[e.id||t]=e}else this._objects.push(e)},this.addObject=function(e,t){if(this.map){this.map[e]=this.map[e]||{};var n=Object.keys(this.map[e]).length;this.map[e][t.id||n]=t,"infoWindows"!=e&&t.setMap&&t.setMap(this.map)}else t.groupName=e,this._objects.push(t)},this.addObjects=function(e){for(var t=0;t0;for(var s in n)s&&google.maps.event.addListener(o,s,n[s]);return o};return{restrict:"E",require:"^map",link:function(e,o,a,r){var i=t.orgAttributes(o),s=t.filter(a),p=t.getOptions(s,e),c=t.getEvents(e,s);o.bind("$destroy",function(){var e=l.map.markers;for(var t in e)e[t]==l&&delete e[t];l.setMap(null)});var l=n(p,c);r.addMarker(l),t.observeAttrSetObj(i,a,l)}}}]),ngMap.directive("overlayMapType",["Attr2Options","$window",function(e,t){return{restrict:"E",require:"^map",link:function(e,n,o,a){var r,i=o.initMethod||"insertAt";if(o.object){var s=e[o.object]?e:t;r=s[o.object],"function"==typeof r&&(r=new r)}if(!r)throw"invalid map-type object";e.$on("mapInitialized",function(e,t){if("insertAt"==i){var n=parseInt(o.index,10);t.overlayMapTypes.insertAt(n,r)}else"push"==i&&t.overlayMapTypes.push(r)}),a.addObject("overlayMapTypes",r)}}}]),ngMap.directive("shape",["Attr2Options",function(e){var t=e,n=function(e){return new google.maps.LatLngBounds(e[0],e[1])},o=function(e,o){var a,r=e.name;if(delete e.name,e.icons)for(var i=0;i' + hash + ''; +} + +function needsSignature(doclet) { + var needsSig = false; + + // function and class definitions always get a signature + if (doclet.kind === 'function' || doclet.kind === 'class') { + needsSig = true; + } + // typedefs that contain functions get a signature, too + else if (doclet.kind === 'typedef' && doclet.type && doclet.type.names && + doclet.type.names.length) { + for (var i = 0, l = doclet.type.names.length; i < l; i++) { + if (doclet.type.names[i].toLowerCase() === 'function') { + needsSig = true; + break; + } + } + } + + return needsSig; +} + +function getSignatureAttributes(item) { + var attributes = []; + + if (item.optional) { + attributes.push('opt'); + } + + if (item.nullable === true) { + attributes.push('nullable'); + } + else if (item.nullable === false) { + attributes.push('non-null'); + } + + return attributes; +} + +function updateItemName(item) { + var attributes = getSignatureAttributes(item); + var itemName = item.name || ''; + + if (item.variable) { + itemName = '…' + itemName; + } + + if (attributes && attributes.length) { + itemName = util.format( '%s%s', itemName, + attributes.join(', ') ); + } + + return itemName; +} + +function addParamAttributes(params) { + return params.map(updateItemName); +} + +function buildItemTypeStrings(item) { + var types = []; + + if (item.type && item.type.names) { + item.type.names.forEach(function(name) { + types.push( linkto(name, htmlsafe(name)) ); + }); + } + + return types; +} + +function buildAttribsString(attribs) { + var attribsString = ''; + + if (attribs && attribs.length) { + attribsString = htmlsafe( util.format('(%s) ', attribs.join(', ')) ); + } + + return attribsString; +} + +function addNonParamAttributes(items) { + var types = []; + + items.forEach(function(item) { + types = types.concat( buildItemTypeStrings(item) ); + }); + + return types; +} + +function addSignatureParams(f) { + var params = f.params ? addParamAttributes(f.params) : []; + + f.signature = util.format( '%s(%s)', (f.signature || ''), params.join(', ') ); +} + +function addSignatureReturns(f) { + var attribs = []; + var attribsString = ''; + var returnTypes = []; + var returnTypesString = ''; + + // jam all the return-type attributes into an array. this could create odd results (for example, + // if there are both nullable and non-nullable return types), but let's assume that most people + // who use multiple @return tags aren't using Closure Compiler type annotations, and vice-versa. + if (f.returns) { + f.returns.forEach(function(item) { + helper.getAttribs(item).forEach(function(attrib) { + if (attribs.indexOf(attrib) === -1) { + attribs.push(attrib); + } + }); + }); + + attribsString = buildAttribsString(attribs); + } + + if (f.returns) { + returnTypes = addNonParamAttributes(f.returns); + } + if (returnTypes.length) { + returnTypesString = util.format( ' → %s{%s}', attribsString, returnTypes.join('|') ); + } + + f.signature = '' + (f.signature || '') + '' + + '' + returnTypesString + ''; +} + +function addSignatureTypes(f) { + var types = f.type ? buildItemTypeStrings(f) : []; + + f.signature = (f.signature || '') + '' + + (types.length ? ' :' + types.join('|') : '') + ''; +} + +function addAttribs(f) { + var attribs = helper.getAttribs(f); + var attribsString = buildAttribsString(attribs); + + f.attribs = util.format('%s', attribsString); +} + +function shortenPaths(files, commonPrefix) { + Object.keys(files).forEach(function(file) { + files[file].shortened = files[file].resolved.replace(commonPrefix, '') + // always use forward slashes + .replace(/\\/g, '/'); + }); + + return files; +} + +function getPathFromDoclet(doclet) { + if (!doclet.meta) { + return null; + } + + return doclet.meta.path && doclet.meta.path !== 'null' ? + path.join(doclet.meta.path, doclet.meta.filename) : + doclet.meta.filename; +} + +function generate(title, docs, filename, resolveLinks) { + resolveLinks = resolveLinks === false ? false : true; + + var docData = { + title: title, + docs: docs + }; + + var outpath = path.join(outdir, filename), + html = view.render('container.tmpl', docData); + + if (resolveLinks) { + html = helper.resolveLinks(html); // turn {@link foo} into foo + } + + fs.writeFileSync(outpath, html, 'utf8'); +} + +function generateSourceFiles(sourceFiles, encoding) { + encoding = encoding || 'utf8'; + Object.keys(sourceFiles).forEach(function(file) { + var source; + // links are keyed to the shortened path in each doclet's `meta.shortpath` property + var sourceOutfile = helper.getUniqueFilename(sourceFiles[file].shortened); + helper.registerLink(sourceFiles[file].shortened, sourceOutfile); + + try { + source = { + kind: 'source', + code: helper.htmlsafe( fs.readFileSync(sourceFiles[file].resolved, encoding) ) + }; + } + catch(e) { + logger.error('Error while generating source file %s: %s', file, e.message); + } + + generate('Source: ' + sourceFiles[file].shortened, [source], sourceOutfile, + false); + }); +} + +/** + * Look for classes or functions with the same name as modules (which indicates that the module + * exports only that class or function), then attach the classes or functions to the `module` + * property of the appropriate module doclets. The name of each class or function is also updated + * for display purposes. This function mutates the original arrays. + * + * @private + * @param {Array.} doclets - The array of classes and functions to + * check. + * @param {Array.} modules - The array of module doclets to search. + */ +function attachModuleSymbols(doclets, modules) { + var symbols = {}; + + // build a lookup table + doclets.forEach(function(symbol) { + symbols[symbol.longname] = symbol; + }); + + return modules.map(function(module) { + if (symbols[module.longname]) { + module.module = symbols[module.longname]; + module.module.name = module.module.name.replace('module:', '(require("') + '"))'; + } + }); +} + +/** + * Create the navigation sidebar. + * @param {object} members The members that will be used to create the sidebar. + * @param {array} members.classes + * @param {array} members.externals + * @param {array} members.globals + * @param {array} members.mixins + * @param {array} members.modules + * @param {array} members.namespaces + * @param {array} members.tutorials + * @param {array} members.events + * @return {string} The HTML for the navigation sidebar. + */ +function buildNav(members) { + var nav = '

                Index

                ', + seen = {}, + hasClassList = false, + globalNav = ''; + + if (members.modules.length) { + nav += '

                Modules

                  '; + members.modules.forEach(function(m) { + if ( !hasOwnProp.call(seen, m.longname) ) { + nav += '
                • ' + linkto(m.longname, m.name) + '
                • '; + } + seen[m.longname] = true; + }); + + nav += '
                '; + } + + if (members.externals.length) { + nav += '

                Externals

                  '; + members.externals.forEach(function(e) { + if ( !hasOwnProp.call(seen, e.longname) ) { + nav += '
                • ' + linkto( e.longname, e.name.replace(/(^"|"$)/g, '') ) + '
                • '; + } + seen[e.longname] = true; + }); + + nav += '
                '; + } + + if (members.classes.length) { + var groups = {}; + for (var i=0; i< members.classes.length; i++) { + var klass = members.classes[i]; + var groupName = klass.ngdoc || 'class'; + groups[groupName] = groups[groupName] || []; + groups[groupName].push( klass ); + } + for (var groupName in groups) { + var classNav = ''; + groups[groupName].forEach(function(c) { + if ( !hasOwnProp.call(seen, c.longname) ) { + //console.log('class', c); + classNav += '
              • ' + linkto(c.longname, c.name) + '
              • '; + } + seen[c.longname] = true; + }); + + if (classNav !== '') { + nav += '

                ' + groupName + '

                  '; + nav += classNav; + nav += '
                '; + } + } // for + } // if + + if (members.events.length) { + nav += '

                Events

                  '; + members.events.forEach(function(e) { + if ( !hasOwnProp.call(seen, e.longname) ) { + nav += '
                • ' + linkto(e.longname, e.name) + '
                • '; + } + seen[e.longname] = true; + }); + + nav += '
                '; + } + + if (members.namespaces.length) { + nav += '

                Namespaces

                  '; + members.namespaces.forEach(function(n) { + if ( !hasOwnProp.call(seen, n.longname) ) { + nav += '
                • ' + linkto(n.longname, n.longname) + '
                • '; + } + seen[n.longname] = true; + }); + + nav += '
                '; + } + + if (members.mixins.length) { + nav += '

                Mixins

                  '; + members.mixins.forEach(function(m) { + if ( !hasOwnProp.call(seen, m.longname) ) { + nav += '
                • ' + linkto(m.longname, m.name) + '
                • '; + } + seen[m.longname] = true; + }); + + nav += '
                '; + } + + if (members.tutorials.length) { + nav += '

                Tutorials

                  '; + members.tutorials.forEach(function(t) { + nav += '
                • ' + tutoriallink(t.name) + '
                • '; + }); + + nav += '
                '; + } + + if (members.globals.length) { + members.globals.forEach(function(g) { + if ( g.kind !== 'typedef' && !hasOwnProp.call(seen, g.longname) ) { + globalNav += '
              • ' + linkto(g.longname, g.name) + '
              • '; + } + seen[g.longname] = true; + }); + + if (!globalNav) { + // turn the heading into a link so you can actually get to the global page + nav += '

                ' + linkto('global', 'Global') + '

                '; + } + else { + nav += '

                Global

                  ' + globalNav + '
                '; + } + } + + return nav; +} + +/** + @param {TAFFY} taffyData See . + @param {object} opts + @param {Tutorial} tutorials + */ +exports.publish = function(taffyData, opts, tutorials) { + data = taffyData; + + var conf = env.conf.templates || {}; + conf['default'] = conf['default'] || {}; + + var templatePath = opts.template; + view = new template.Template(templatePath + '/tmpl'); + + // claim some special filenames in advance, so the All-Powerful Overseer of Filename Uniqueness + // doesn't try to hand them out later + var indexUrl = helper.getUniqueFilename('index'); + // don't call registerLink() on this one! 'index' is also a valid longname + + var globalUrl = helper.getUniqueFilename('global'); + helper.registerLink('global', globalUrl); + + // set up templating + view.layout = conf['default'].layoutFile ? + path.getResourcePath(path.dirname(conf['default'].layoutFile), + path.basename(conf['default'].layoutFile) ) : + 'layout.tmpl'; + + // set up tutorials for helper + helper.setTutorials(tutorials); + + data = helper.prune(data); + data.sort('longname, version, since'); + helper.addEventListeners(data); + + var sourceFiles = {}; + var sourceFilePaths = []; + data().each(function(doclet) { + doclet.attribs = ''; + + if (doclet.examples) { + doclet.examples = doclet.examples.map(function(example) { + var caption, code; + + if (example.match(/^\s*([\s\S]+?)<\/caption>(\s*[\n\r])([\s\S]+)$/i)) { + caption = RegExp.$1; + code = RegExp.$3; + } + + return { + caption: caption || '', + code: code || example + }; + }); + } + if (doclet.see) { + doclet.see.forEach(function(seeItem, i) { + doclet.see[i] = hashToLink(doclet, seeItem); + }); + } + + // build a list of source files + var sourcePath; + if (doclet.meta) { + sourcePath = getPathFromDoclet(doclet); + sourceFiles[sourcePath] = { + resolved: sourcePath, + shortened: null + }; + if (sourceFilePaths.indexOf(sourcePath) === -1) { + sourceFilePaths.push(sourcePath); + } + } + }); + + // update outdir if necessary, then create outdir + var packageInfo = ( find({kind: 'package'}) || [] ) [0]; + if (packageInfo && packageInfo.name) { + outdir = path.join(outdir, packageInfo.name, packageInfo.version); + } + fs.mkPath(outdir); + + // copy the template's static files to outdir + var fromDir = path.join(templatePath, 'static'); + var staticFiles = fs.ls(fromDir, 3); + + staticFiles.forEach(function(fileName) { + var toDir = fs.toDir( fileName.replace(fromDir, outdir) ); + fs.mkPath(toDir); + fs.copyFileSync(fileName, toDir); + }); + + // copy user-specified static files to outdir + var staticFilePaths; + var staticFileFilter; + var staticFileScanner; + if (conf['default'].staticFiles) { + staticFilePaths = conf['default'].staticFiles.paths || []; + staticFileFilter = new (require('jsdoc/src/filter')).Filter(conf['default'].staticFiles); + staticFileScanner = new (require('jsdoc/src/scanner')).Scanner(); + + staticFilePaths.forEach(function(filePath) { + var extraStaticFiles = staticFileScanner.scan([filePath], 10, staticFileFilter); + + extraStaticFiles.forEach(function(fileName) { + var sourcePath = fs.toDir(filePath); + var toDir = fs.toDir( fileName.replace(sourcePath, outdir) ); + fs.mkPath(toDir); + fs.copyFileSync(fileName, toDir); + }); + }); + } + + if (sourceFilePaths.length) { + sourceFiles = shortenPaths( sourceFiles, path.commonPrefix(sourceFilePaths) ); + } + data().each(function(doclet) { + var url = helper.createLink(doclet); + helper.registerLink(doclet.longname, url); + + // add a shortened version of the full path + var docletPath; + if (doclet.meta) { + docletPath = getPathFromDoclet(doclet); + docletPath = sourceFiles[docletPath].shortened; + if (docletPath) { + doclet.meta.shortpath = docletPath; + } + } + }); + + data().each(function(doclet) { + var url = helper.longnameToUrl[doclet.longname]; + + if (url.indexOf('#') > -1) { + doclet.id = helper.longnameToUrl[doclet.longname].split(/#/).pop(); + } + else { + doclet.id = doclet.name; + } + + if ( needsSignature(doclet) ) { + addSignatureParams(doclet); + addSignatureReturns(doclet); + addAttribs(doclet); + } + }); + + // do this after the urls have all been generated + data().each(function(doclet) { + doclet.ancestors = getAncestorLinks(doclet); + + if (doclet.kind === 'member') { + addSignatureTypes(doclet); + addAttribs(doclet); + } + + if (doclet.kind === 'constant') { + addSignatureTypes(doclet); + addAttribs(doclet); + doclet.kind = 'member'; + } + }); + + var members = helper.getMembers(data); + members.tutorials = tutorials.children; + + // output pretty-printed source files by default + var outputSourceFiles = conf['default'] && conf['default'].outputSourceFiles !== false ? true : + false; + + // add template helpers + view.find = find; + view.linkto = linkto; + view.resolveAuthorLinks = resolveAuthorLinks; + view.tutoriallink = tutoriallink; + view.htmlsafe = htmlsafe; + view.outputSourceFiles = outputSourceFiles; + + // once for all + view.nav = buildNav(members); + attachModuleSymbols( find({ kind: ['class', 'function'], longname: {left: 'module:'} }), + members.modules ); + + // generate the pretty-printed source files first so other pages can link to them + if (outputSourceFiles) { + generateSourceFiles(sourceFiles, opts.encoding); + } + + if (members.globals.length) { generate('Global', [{kind: 'globalobj'}], globalUrl); } + + // index page displays information from package.json and lists files + var files = find({kind: 'file'}), + packages = find({kind: 'package'}); + + generate('Index', + packages.concat( + [{kind: 'mainpage', readme: opts.readme, longname: (opts.mainpagetitle) ? opts.mainpagetitle : 'Main Page'}] + ).concat(files), + indexUrl); + + // set up the lists that we'll use to generate pages + var classes = taffy(members.classes); + var modules = taffy(members.modules); + var namespaces = taffy(members.namespaces); + var mixins = taffy(members.mixins); + var externals = taffy(members.externals); + + Object.keys(helper.longnameToUrl).forEach(function(longname) { + var myClasses = helper.find(classes, {longname: longname}); + if (myClasses.length) { + var titlePrefix = myClasses[0].ngdoc ? myClasses[0].ngdoc : 'Class'; + generate(titlePrefix + ': ' + myClasses[0].name, myClasses, helper.longnameToUrl[longname]); + } + + var myModules = helper.find(modules, {longname: longname}); + if (myModules.length) { + generate('Module: ' + myModules[0].name, myModules, helper.longnameToUrl[longname]); + } + + var myNamespaces = helper.find(namespaces, {longname: longname}); + if (myNamespaces.length) { + generate('Namespace: ' + myNamespaces[0].name, myNamespaces, helper.longnameToUrl[longname]); + } + + var myMixins = helper.find(mixins, {longname: longname}); + if (myMixins.length) { + generate('Mixin: ' + myMixins[0].name, myMixins, helper.longnameToUrl[longname]); + } + + var myExternals = helper.find(externals, {longname: longname}); + if (myExternals.length) { + generate('External: ' + myExternals[0].name, myExternals, helper.longnameToUrl[longname]); + } + }); + + // TODO: move the tutorial functions to templateHelper.js + function generateTutorial(title, tutorial, filename) { + var tutorialData = { + title: title, + header: tutorial.title, + content: tutorial.parse(), + children: tutorial.children + }; + + var tutorialPath = path.join(outdir, filename), + html = view.render('tutorial.tmpl', tutorialData); + + // yes, you can use {@link} in tutorials too! + html = helper.resolveLinks(html); // turn {@link foo} into foo + + fs.writeFileSync(tutorialPath, html, 'utf8'); + } + + // tutorials can have only one parent so there is no risk for loops + function saveChildren(node) { + node.children.forEach(function(child) { + generateTutorial('Tutorial: ' + child.title, child, helper.tutorialToUrl(child.name)); + saveChildren(child); + }); + } + saveChildren(tutorials); +}; diff --git a/bower_components/ngmap/config/jsdoc/template/static/scripts/linenumber.js b/bower_components/ngmap/config/jsdoc/template/static/scripts/linenumber.js new file mode 100644 index 0000000..8d52f7e --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/static/scripts/linenumber.js @@ -0,0 +1,25 @@ +/*global document */ +(function() { + var source = document.getElementsByClassName('prettyprint source linenums'); + var i = 0; + var lineNumber = 0; + var lineId; + var lines; + var totalLines; + var anchorHash; + + if (source && source[0]) { + anchorHash = document.location.hash.substring(1); + lines = source[0].getElementsByTagName('li'); + totalLines = lines.length; + + for (; i < totalLines; i++) { + lineNumber++; + lineId = 'line' + lineNumber; + lines[i].id = lineId; + if (lineId === anchorHash) { + lines[i].className += ' selected'; + } + } + } +})(); diff --git a/bower_components/ngmap/config/jsdoc/template/static/scripts/prettify/Apache-License-2.0.txt b/bower_components/ngmap/config/jsdoc/template/static/scripts/prettify/Apache-License-2.0.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/static/scripts/prettify/Apache-License-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/bower_components/ngmap/config/jsdoc/template/static/scripts/prettify/lang-css.js b/bower_components/ngmap/config/jsdoc/template/static/scripts/prettify/lang-css.js new file mode 100644 index 0000000..041e1f5 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/static/scripts/prettify/lang-css.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", +/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/bower_components/ngmap/config/jsdoc/template/static/scripts/prettify/prettify.js b/bower_components/ngmap/config/jsdoc/template/static/scripts/prettify/prettify.js new file mode 100644 index 0000000..eef5ad7 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/static/scripts/prettify/prettify.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p p:first-child +{ + margin-top: 0; + padding-top: 0; +} + +.params td.description > p:last-child +{ + margin-bottom: 0; + padding-bottom: 0; +} + +.disabled { + color: #454545; +} diff --git a/bower_components/ngmap/config/jsdoc/template/static/styles/prettify-jsdoc.css b/bower_components/ngmap/config/jsdoc/template/static/styles/prettify-jsdoc.css new file mode 100644 index 0000000..5a2526e --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/static/styles/prettify-jsdoc.css @@ -0,0 +1,111 @@ +/* JSDoc prettify.js theme */ + +/* plain text */ +.pln { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* string content */ +.str { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a keyword */ +.kwd { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a comment */ +.com { + font-weight: normal; + font-style: italic; +} + +/* a type name */ +.typ { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* a literal value */ +.lit { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* punctuation */ +.pun { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* lisp open bracket */ +.opn { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* lisp close bracket */ +.clo { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a markup tag name */ +.tag { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a markup attribute name */ +.atn { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a markup attribute value */ +.atv { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a declaration */ +.dec { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a variable name */ +.var { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* a function name */ +.fun { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; +} diff --git a/bower_components/ngmap/config/jsdoc/template/static/styles/prettify-tomorrow.css b/bower_components/ngmap/config/jsdoc/template/static/styles/prettify-tomorrow.css new file mode 100644 index 0000000..aa2908c --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/static/styles/prettify-tomorrow.css @@ -0,0 +1,132 @@ +/* Tomorrow Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* Pretty printing styles. Used with prettify.js. */ +/* SPAN elements with the classes below are added by prettyprint. */ +/* plain text */ +.pln { + color: #4d4d4c; } + +@media screen { + /* string content */ + .str { + color: #718c00; } + + /* a keyword */ + .kwd { + color: #8959a8; } + + /* a comment */ + .com { + color: #8e908c; } + + /* a type name */ + .typ { + color: #4271ae; } + + /* a literal value */ + .lit { + color: #f5871f; } + + /* punctuation */ + .pun { + color: #4d4d4c; } + + /* lisp open bracket */ + .opn { + color: #4d4d4c; } + + /* lisp close bracket */ + .clo { + color: #4d4d4c; } + + /* a markup tag name */ + .tag { + color: #c82829; } + + /* a markup attribute name */ + .atn { + color: #f5871f; } + + /* a markup attribute value */ + .atv { + color: #3e999f; } + + /* a declaration */ + .dec { + color: #f5871f; } + + /* a variable name */ + .var { + color: #c82829; } + + /* a function name */ + .fun { + color: #4271ae; } } +/* Use higher contrast and text-weight for printable form. */ +@media print, projection { + .str { + color: #060; } + + .kwd { + color: #006; + font-weight: bold; } + + .com { + color: #600; + font-style: italic; } + + .typ { + color: #404; + font-weight: bold; } + + .lit { + color: #044; } + + .pun, .opn, .clo { + color: #440; } + + .tag { + color: #006; + font-weight: bold; } + + .atn { + color: #404; } + + .atv { + color: #060; } } +/* Style */ +/* +pre.prettyprint { + background: white; + font-family: Menlo, Monaco, Consolas, monospace; + font-size: 12px; + line-height: 1.5; + border: 1px solid #ccc; + padding: 10px; } +*/ + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; } + +/* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L4, +li.L5, +li.L6, +li.L7, +li.L8, +li.L9 { + /* */ } + +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { + /* */ } diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/container.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/container.tmpl new file mode 100644 index 0000000..173b043 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/container.tmpl @@ -0,0 +1,166 @@ + + + + + + + + +
                + +
                +

                + + + + + +

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

                Example 1? 's':'' ?>

                + + + +
                + + +

                Extends

                + +
                  +
                • +
                + + + +

                Mixes In

                + +
                  +
                • +
                + + + +

                Requires

                + +
                  +
                • +
                + + + +

                Classes

                + +
                +
                +
                +
                + + + +

                Mixins

                + +
                +
                +
                +
                + + + +

                Namespaces

                + +
                +
                +
                +
                + + + +

                Members

                + +
                + +
                + + + +

                Methods

                + +
                + +
                + + + +

                Type Definitions

                + +
                + + + +
                + + + +

                Events

                + +
                + +
                + +
                + +
                + + + diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/details.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/details.tmpl new file mode 100644 index 0000000..1ee86d2 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/details.tmpl @@ -0,0 +1,107 @@ +" + data.defaultvalue + ""; + defaultObjectClass = ' class="object-value"'; +} +?> +
                + + +
                Properties:
                + +
                + + + + +
                Version:
                +
                + + + +
                Since:
                +
                + + + +
                Inherited From:
                +
                • + +
                + + + +
                Deprecated:
                • Yes
                  + + + +
                  Author:
                  +
                  +
                    +
                  • +
                  +
                  + + + +
                  Copyright:
                  +
                  + + + +
                  License:
                  +
                  + + + +
                  Default Value:
                  +
                    + > +
                  + + + +
                  Source:
                  +
                  • + , +
                  + + + +
                  Tutorials:
                  +
                  +
                    +
                  • +
                  +
                  + + + +
                  See:
                  +
                  +
                    +
                  • +
                  +
                  + + + +
                  To Do:
                  +
                  +
                    +
                  • +
                  +
                  + +
                  diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/example.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/example.tmpl new file mode 100644 index 0000000..e87caa5 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/example.tmpl @@ -0,0 +1,2 @@ + +
                  diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/examples.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/examples.tmpl new file mode 100644 index 0000000..04d975e --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/examples.tmpl @@ -0,0 +1,13 @@ + +

                  + +
                  + \ No newline at end of file diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/exceptions.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/exceptions.tmpl new file mode 100644 index 0000000..78c4e25 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/exceptions.tmpl @@ -0,0 +1,30 @@ + + +
                  +
                  +
                  + +
                  +
                  +
                  +
                  +
                  + Type +
                  +
                  + +
                  +
                  +
                  +
                  + +
                  + + + + + +
                  + diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/layout.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/layout.tmpl new file mode 100644 index 0000000..0884e99 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/layout.tmpl @@ -0,0 +1,39 @@ + + + + + JSDoc: <?js= title ?> + + + + + + + + + + +
                  + +

                  + + +
                  + +
                  + +
                  + +
                  + +
                  + Documentation generated by JSDoc + and angular-jsdoc +
                  + + + + + diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/mainpage.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/mainpage.tmpl new file mode 100644 index 0000000..64e9e59 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/mainpage.tmpl @@ -0,0 +1,14 @@ + + + +

                  + + + +
                  +
                  +
                  + diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/members.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/members.tmpl new file mode 100644 index 0000000..0f99998 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/members.tmpl @@ -0,0 +1,41 @@ + +
                  +

                  + + +

                  + +
                  +
                  + +
                  + +
                  + + + +
                  Type:
                  +
                    +
                  • + +
                  • +
                  + + + + + +
                  Fires:
                  +
                    +
                  • +
                  + + + +
                  Example 1? 's':'' ?>
                  + + +
                  diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/method.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/method.tmpl new file mode 100644 index 0000000..d18e13b --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/method.tmpl @@ -0,0 +1,106 @@ + +
                  + + ' + h4Title + ''; + ?> + + + + + + + +

                  + +
                  +
                  + + +
                  + +
                  + + + +
                  Type:
                  +
                    +
                  • + +
                  • +
                  + + + +
                  This:
                  +
                  + + + +
                  Parameters:
                  + + + + + + +
                  Requires:
                  +
                    +
                  • +
                  + + + +
                  Fires:
                  +
                    +
                  • +
                  + + + +
                  Listens to Events:
                  +
                    +
                  • +
                  + + + +
                  Listeners of This Event:
                  +
                    +
                  • +
                  + + + +
                  Throws:
                  + 1) { ?>
                    +
                  • +
                  + + + + +
                  Returns:
                  + 1) { ?>
                    +
                  • +
                  + + + + +
                  Example 1? 's':'' ?>
                  + + +
                  diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/params.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/params.tmpl new file mode 100644 index 0000000..66ab045 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/params.tmpl @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  NameTypeAttributesDefaultDescription
                  + + + + + + <optional>
                  + + + + <nullable>
                  + + + + <repeatable>
                  + +
                  + + + + +
                  Properties
                  + +
                  \ No newline at end of file diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/properties.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/properties.tmpl new file mode 100644 index 0000000..58f412f --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/properties.tmpl @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  NameTypeAttributesDefaultDescription
                  + + + + + + <optional>
                  + + + + <nullable>
                  + +
                  + + + + +
                  Properties
                  +
                  \ No newline at end of file diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/returns.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/returns.tmpl new file mode 100644 index 0000000..d070459 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/returns.tmpl @@ -0,0 +1,19 @@ + +
                  + +
                  + + + +
                  +
                  + Type +
                  +
                  + +
                  +
                  + \ No newline at end of file diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/source.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/source.tmpl new file mode 100644 index 0000000..e559b5d --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/source.tmpl @@ -0,0 +1,8 @@ + +
                  +
                  +
                  +
                  +
                  \ No newline at end of file diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/tutorial.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/tutorial.tmpl new file mode 100644 index 0000000..88a0ad5 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/tutorial.tmpl @@ -0,0 +1,19 @@ +
                  + +
                  + 0) { ?> +
                    +
                  • +
                  + + +

                  +
                  + +
                  + +
                  + +
                  diff --git a/bower_components/ngmap/config/jsdoc/template/tmpl/type.tmpl b/bower_components/ngmap/config/jsdoc/template/tmpl/type.tmpl new file mode 100644 index 0000000..ec2c6c0 --- /dev/null +++ b/bower_components/ngmap/config/jsdoc/template/tmpl/type.tmpl @@ -0,0 +1,7 @@ + + +| + \ No newline at end of file diff --git a/bower_components/ngmap/config/karma.conf.js b/bower_components/ngmap/config/karma.conf.js new file mode 100644 index 0000000..0b59e43 --- /dev/null +++ b/bower_components/ngmap/config/karma.conf.js @@ -0,0 +1,76 @@ +// Karma configuration +// Generated on Mon Jun 23 2014 15:46:44 GMT-0400 (EDT) + +module.exports = function(config) { + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['jasmine'], + + + // list of files / patterns to load in the browser + files: [ + // libraries + __dirname + '/../spec/lib/angular.js', + __dirname + '/../spec/lib/angular-mocks.js', + 'https://maps.google.com/maps/api/js', + __dirname + '/../spec/lib/markerclusterer.js', + + // our app + __dirname + '/../app/scripts/app.js', + __dirname + '/../app/scripts/directives/*.js', + __dirname + '/../app/scripts/services/*.js', + + // tests + __dirname + '/../spec/directives/*_spec.js', + __dirname + '/../spec/services/*_spec.js' + ], + + + // list of files to exclude + exclude: [ ], + + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { }, + + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress'], + + + // web server port + port: 9876, + + + // enable / disable colors in the output (reporters and logs) + colors: true, + + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: false, + + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['PhantomJS'], + + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: true + }); +}; diff --git a/bower_components/ngmap/config/protractor.conf.js b/bower_components/ngmap/config/protractor.conf.js new file mode 100644 index 0000000..97b37f1 --- /dev/null +++ b/bower_components/ngmap/config/protractor.conf.js @@ -0,0 +1,20 @@ +// The main suite of Protractor tests. +exports.config = { + seleniumServerJar: __dirname + + '/../node_modules/gulp-protractor' + + '/node_modules/protractor/selenium/selenium-server-standalone-2.44.0.jar', + + browserName: 'chrome', + + // Exclude patterns are relative to this directory. + // exclude: [], + + jasmineNodeOpts: { + showColors: true, + isVerbose: true, // List all tests in the console + includeStackTrace: true, + defaultTimeoutInterval: 30000 + } + + //baseUrl: 'http://localhost:8081' +}; diff --git a/bower_components/ngmap/gulpfile.js b/bower_components/ngmap/gulpfile.js new file mode 100644 index 0000000..d3bf842 --- /dev/null +++ b/bower_components/ngmap/gulpfile.js @@ -0,0 +1,114 @@ +var gulp = require('gulp'); +var concat = require('gulp-concat'); +var uglify = require('gulp-uglify'); +var debug = require('gulp-debug'); +var rename = require('gulp-rename'); +var stripDebug = require('gulp-strip-debug'); +var gutil = require('gulp-util'); +var clean = require('gulp-clean'); +var runSequence = require('run-sequence'); +var gutil = require('gulp-util'); +var through = require('through2'); +var replace = require('gulp-replace'); +var tap = require('gulp-tap'); +var bump = require('gulp-bump'); +var shell = require('gulp-shell'); +var karma = require('karma').server; +var connect = require('gulp-connect'); +var gulpProtractor = require("gulp-protractor").protractor; +var bumpVersion = function(type) { + type = type || 'patch'; + var version = ''; + gulp.src(['./bower.json', './package.json']) + .pipe(bump({type: type})) + .pipe(gulp.dest('./')) + .pipe(tap(function(file, t) { + version = JSON.parse(file.contents.toString()).version; + })).on('end', function() { + var color = gutil.colors; + gulp.src('') + .pipe(shell([ + 'git commit --all --message "Version ' + version + '"', + (type != 'patch' ? 'git tag --annotate "v' + version + '" --message "Version ' + version + '"' : 'true') + ], {ignoreErrors: false})) + .pipe(tap(function() { + gutil.log(color.green("Version bumped to ") + color.yellow(version) + color.green(", don't forget to push!")); + })); + }); + +}; + +gulp.task('clean', function() { + return gulp.src('bulid') + .pipe(clean({force: true})); +}); + +gulp.task('build-js', function() { + return gulp.src([ + 'app/scripts/app.js', + 'app/scripts/services/*.js', + 'app/scripts/directives/*.js' + ]) + .pipe(concat('ng-map.debug.js')) + .pipe(gulp.dest('build/scripts')) + .pipe(stripDebug()) + .pipe(concat('ng-map.js')) + .pipe(gulp.dest('build/scripts')) + .pipe(uglify()) + .pipe(rename('ng-map.min.js')) + .pipe(gulp.dest('build/scripts')) + .on('error', gutil.log); +}); + +gulp.task('docs', shell.task([ + 'node_modules/jsdoc/jsdoc.js '+ + '-c node_modules/angular-jsdoc/conf.json '+ + '-t node_modules/angular-jsdoc/template '+ + '-d build/docs '+ + './README.md ' + + '-r app/scripts' +])); + +gulp.task('bump', ['build'], function() { bumpVersion('patch'); }); +gulp.task('bump:patch', ['build'], function() { bumpVersion('patch'); }); +gulp.task('bump:minor', ['build'], function() { bumpVersion('minor'); }); +gulp.task('bump:major', ['build'], function() { bumpVersion('major'); }); + +gulp.task('build', function(callback) { + runSequence('clean', 'build-js', 'test', 'docs', callback); +}); + +gulp.task('test', function (done) { + karma.start({ + configFile: __dirname + '/config/karma.conf.js', + singleRun: true + }, done); +}); + +gulp.task('testapp-server', function() { + connect.server({ + root: __dirname + '/testapp', + port: 8888 + }); +}); + +/** + * For first-time user, we need to update webdrivers + * $ node_modules/gulp-protractor/node_modules/protractor/bin/webdriver-manager update + */ +gulp.task('e2e-test', ['testapp-server'], function() { + gulp.src([__dirname + "/spec/e2e/*_spec.js"]) + .pipe(gulpProtractor({ + configFile: __dirname + "/config/protractor.conf.js", + args: [ + '--baseUrl', 'http://localhost:8888' + ] + })) + .on('error', function(e) { + throw e; + }) + .on('end', function() { // when process exits: + connect.serverClose(); + }); +}); + diff --git a/bower_components/ngmap/package.json b/bower_components/ngmap/package.json new file mode 100644 index 0000000..10e61f2 --- /dev/null +++ b/bower_components/ngmap/package.json @@ -0,0 +1,45 @@ +{ + "name": "ngmap", + "version": "1.4.2", + "main": "build/scripts/ng-map.js", + "dependencies": { + "glob": "~4.0.2", + "gulp": "^3.8.0" + }, + "engines": { + "node": ">=0.8.0" + }, + "scripts": { + "test": "gulp test" + }, + "devDependencies": { + "angular-jsdoc": "^0.1.0", + "compression": "~1.0.6", + "express": "~4.4.1", + "gulp-bump": "~0.1.9", + "gulp-clean": "~0.3.0", + "gulp-concat": "~2.2.0", + "gulp-connect": "^2.2.0", + "gulp-debug": "~0.3.0", + "gulp-html-replace": "~1.1.0", + "gulp-protractor": "0.0.12", + "gulp-rename": "~1.2.0", + "gulp-replace": "~0.3.0", + "gulp-rev": "~0.4.0", + "gulp-shell": "~0.2.7", + "gulp-strip-debug": "~0.3.0", + "gulp-tap": "~0.1.1", + "gulp-uglify": "~0.3.0", + "gulp-util": "~2.2.16", + "jsdoc": "~3.3.0-alpha8", + "karma": "~0.12.16", + "karma-chrome-launcher": "~0.1.4", + "karma-jasmine": "~0.1.5", + "karma-ng-html2js-preprocessor": "~0.1.0", + "karma-phantomjs-launcher": "~0.1.4", + "run-sequence": "~0.3.6", + "selenium-webdriver": "^2.44.0", + "through2": "~0.5.1", + "zeparser": "0.0.7" + } +} diff --git a/bower_components/ngmap/spec/directives/map_controller_spec.js b/bower_components/ngmap/spec/directives/map_controller_spec.js new file mode 100644 index 0000000..f2d9216 --- /dev/null +++ b/bower_components/ngmap/spec/directives/map_controller_spec.js @@ -0,0 +1,70 @@ +/* global ngMap, google */ +describe('MapController', function() { + + var scope, ctrl; + var el = document.body; + + beforeEach( function() { + inject( function($controller, $rootScope){ + scope = $rootScope; + ctrl = $controller(ngMap.MapController, {$scope: scope, 'NavigatorGeolocation': {}, 'GeoCoder': {} }); + }); + }); + + describe('addMarker', function() { + it('should add a marker to the existing map', function() { + ctrl.map = new google.maps.Map(el, {}); //each method require ctrl.map; + ctrl.map.markers = {}; + var marker = new google.maps.Marker({ + position: new google.maps.LatLng(1,1), + centered: true + }); + ctrl.addMarker(marker); + // set map for this marker + expect(marker.getMap()).toBe(ctrl.map); + // set center of the map with this marker + expect(marker.getPosition()).toBe(ctrl.map.getCenter()); + // ctrl.map.markers + expect(Object.keys(ctrl.map.markers).length).toEqual(1); + }); + + it('should add a marker to ctrl._objects when ctrl.map is not init', function() { + ctrl._objects = []; + var marker = new google.maps.Marker({position: new google.maps.LatLng(1,1)}); + ctrl.addMarker(marker); + expect(ctrl._objects[0]).toBe(marker); + }); + }); + + describe('addShape', function() { + it('should add a shape to ctrl._objects when ctrl.map is not init', function() { + ctrl._objects = []; + var circle = new google.maps.Circle({center: new google.maps.LatLng(1,1)}); + ctrl.addShape(circle); + expect(ctrl._objects[0]).toBe(circle); + }); + + it('should add a shape to the existing map', function() { + ctrl.map = new google.maps.Map(el, {}); //each method require ctrl.map; + ctrl.map.shapes = {}; + var circle = new google.maps.Circle({center: new google.maps.LatLng(1,1)}); + ctrl.addShape(circle); + expect(ctrl.map.shapes[0]).toBe(circle); + expect(ctrl.map.shapes[0].getMap()).toBe(ctrl.map); + }); + }); + + describe('addObjects', function() { + it('should add objects; markers and shapes when map is init', function() { + var marker = new google.maps.Marker({position: new google.maps.LatLng(1,1)}); + var circle = new google.maps.Circle({center: new google.maps.LatLng(1,1)}); + var objects = [marker, circle]; + + ctrl.map = new google.maps.Map(el, {}); //each method require ctrl.map; + ctrl.addObjects(objects); + expect(marker.getMap()).toBe(ctrl.map); + expect(circle.getMap()).toBe(ctrl.map); + }); + }); + +}); diff --git a/bower_components/ngmap/spec/directives/map_spec.js b/bower_components/ngmap/spec/directives/map_spec.js new file mode 100644 index 0000000..04e5a3b --- /dev/null +++ b/bower_components/ngmap/spec/directives/map_spec.js @@ -0,0 +1,71 @@ +/* global google, waitsFor */ +/* mock Attr2Options, knowns as parser */ +describe('map', function() { + var elm, scope; + + // load the tabs code + beforeEach(function() { + module('ngMap'); + inject(function($rootScope, $compile) { + elm = angular.element( + ''); + scope = $rootScope; + $compile(elm)(scope); + scope.$digest(); + waitsFor(function() { + return scope.map; + }); + }); + }); + + it('should prepend a div tag', function() { + var divTag = elm.find('div'); + expect(scope.map.getDiv()).toBe(divTag[0]); + }); + + it('should set map options', function() { + expect(scope.map.getZoom()).toEqual(11); + expect(scope.map.mapTypeId).toBe(google.maps.MapTypeId.TERRAIN); + }); + + it('should set map controls', function() { + expect(scope.map.zoomControl).toBe(true); + expect(scope.map.zoomControlOptions.style).toBe(google.maps.ZoomControlStyle.SMALL); + expect(scope.map.zoomControlOptions.position).toBe(google.maps.ControlPosition.BOTTOM_LEFT); + }); + + it('should set events', function() { + //TODO: need to test events, but don't know how to detect event in a map + }); + + it('should set observers', function() { + //TODO: need to test observers + }); + +}); diff --git a/bower_components/ngmap/spec/directives/marker_spec.js b/bower_components/ngmap/spec/directives/marker_spec.js new file mode 100644 index 0000000..87c5dc0 --- /dev/null +++ b/bower_components/ngmap/spec/directives/marker_spec.js @@ -0,0 +1,61 @@ +/* global google, waitsFor */ + +describe('marker', function() { + var elm, scope; + + /* mock Attr2Options, knowns as parser */ + var MockAttr2Options = function() { + var hashFilter = function(hash) { + var newHash = {}; + for (var key in hash) { + if (hash[key].match(regexp)) { + newHash[key] = hash[key]; + } + }; + return newHash; + }; + return { + filter: function(attrs) {return attrs;}, + getOptions: function(attrs) {return attrs;}, + getControlOptions: function(attrs) {return hashFilter(attrs, /ControlOptions$/);}, + getEvents: function(attrs) {return hashFilter(attrs, /^on[A-E]/);} + }; + }; + + // load the marker code + beforeEach(function() { + module(function($provide) { + $provide.value('Attr2Options', MockAttr2Options); + }); + module('ngMap'); + inject(function($rootScope, $compile) { + elm = angular.element( + ''+ + ' '+ + ' '+ + ''); + scope = $rootScope; + $compile(elm)(scope); + scope.$digest(); + waitsFor(function() { + return scope.map; + }); + }); + }); + + it('should set scope.markers with options ', function() { + // scope.markers + expect(Object.keys(scope.map.markers).length).toEqual(2); + // options from attribute + expect(scope.map.markers[0].draggable).toEqual(true); + // contents from html + }); + + it('should set marker events', function() { + //TODO: need to test marker events, but don't know don't know how to get events of a marker + }); + + it('should set marker observers', function() { + //TODO: need to test marker observers + }); +}); diff --git a/bower_components/ngmap/spec/directives/shape_spec.js b/bower_components/ngmap/spec/directives/shape_spec.js new file mode 100644 index 0000000..42e787b --- /dev/null +++ b/bower_components/ngmap/spec/directives/shape_spec.js @@ -0,0 +1,53 @@ +/* global google, waitsFor */ +describe('shape', function() { + var elm, scope; + + // load the marker code + beforeEach(function() { + module('ngMap'); + inject(function($rootScope, $compile) { + elm = angular.element( + ''+ + ' '+ + ' '+ + ' '+ + ' '+ + ' '+ + ''); + scope = $rootScope; + $compile(elm)(scope); + scope.$digest(); + waitsFor(function() { + return scope.map; + }); + }); + }); + + it('should set scope.shapes with options ', function() { + // scope.shapes + expect(Object.keys(scope.map.shapes).length).toEqual(5); + // polyline + expect(scope.map.shapes.polyline.geodesic).toBe(true); + // polygon + expect(scope.map.shapes.polygon.strokeColor).toEqual('#FF0000'); + // rectangle + expect(scope.map.shapes.rectangle.editable).toBe(true); + // circle + expect(scope.map.shapes.circle.radius).toEqual(4000); + // image + expect(scope.map.shapes.image.getUrl()).toEqual("https://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg"); + }); + + it('should set shape events', function() { + //TODO: should test events, but don't know how to get events of a shape + }); + + it('should set shape observers', function() { + //TODO: need to test observers + }); +}); diff --git a/bower_components/ngmap/spec/e2e/testapp_spec.js b/bower_components/ngmap/spec/e2e/testapp_spec.js new file mode 100644 index 0000000..8d1759c --- /dev/null +++ b/bower_components/ngmap/spec/e2e/testapp_spec.js @@ -0,0 +1,56 @@ +/*global jasmine*/ +var excludes = [ + "map_events.html", + "map_fit_bounds.html", + "map_lazy_init.html", + "map-lazy-load.html", + "marker_with_dynamic_position.html", + "marker_with_ng_repeat_dynamic.html" + ]; + +function using(values, func){ + for (var i = 0, count = values.length; i < count; i++) { + if (Object.prototype.toString.call(values[i]) !== '[object Array]') { + values[i] = [values[i]]; + } + func.apply(this, values[i]); + jasmine.currentEnv_.currentSpec.description += ' (with using ' + values[i].join(', ') + ')'; + } +} + +describe('testapp directory', function() { + 'use strict'; + //var urls = ["aerial-rotate.html", "aerial-simple.html", "hello_map.html", "map_control.html"]; + var files = require('fs').readdirSync(__dirname + "/../../testapp"); + var urls = files.filter(function(filename) { + return filename.match(/\.html$/) && excludes.indexOf(filename) === -1; + }); + console.log('urls', urls); + + using(urls, function(url){ + + it('testapp/'+url, function() { + browser.get(url); + browser.wait( function() { + return browser.executeScript( function() { + var el = document.querySelector("map"); + var scope = angular.element(el).scope(); + //return scope.map.getCenter().lat(); + return scope.map.getCenter(); + }).then(function(result) { + return result; + }); + }, 5000); + //element(by.css("map")).evaluate('map.getCenter().lat()').then(function(lat) { + // console.log('lat', lat); + // expect(lat).toNotEqual(0); + //}); + browser.manage().logs().get('browser').then(function(browserLog) { + (browserLog.length > 0) && console.log('log: ' + require('util').inspect(browserLog)); + expect(browserLog).toEqual([]); + }); + }); + + }); + +}); diff --git a/bower_components/ngmap/spec/lib/angular-mocks.js b/bower_components/ngmap/spec/lib/angular-mocks.js new file mode 100644 index 0000000..c51a83a --- /dev/null +++ b/bower_components/ngmap/spec/lib/angular-mocks.js @@ -0,0 +1,2165 @@ +/** + * @license AngularJS v1.2.9 + * (c) 2010-2014 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) { + +'use strict'; + +/** + * @ngdoc overview + * @name angular.mock + * @description + * + * Namespace from 'angular-mocks.js' which contains testing related code. + */ +angular.mock = {}; + +/** + * ! This is a private undocumented service ! + * + * @name ngMock.$browser + * + * @description + * This service is a mock implementation of {@link ng.$browser}. It provides fake + * implementation for commonly used browser apis that are hard to test, e.g. setTimeout, xhr, + * cookies, etc... + * + * The api of this service is the same as that of the real {@link ng.$browser $browser}, except + * that there are several helper methods available which can be used in tests. + */ +angular.mock.$BrowserProvider = function() { + this.$get = function() { + return new angular.mock.$Browser(); + }; +}; + +angular.mock.$Browser = function() { + var self = this; + + this.isMock = true; + self.$$url = "http://server/"; + self.$$lastUrl = self.$$url; // used by url polling fn + self.pollFns = []; + + // TODO(vojta): remove this temporary api + self.$$completeOutstandingRequest = angular.noop; + self.$$incOutstandingRequestCount = angular.noop; + + + // register url polling fn + + self.onUrlChange = function(listener) { + self.pollFns.push( + function() { + if (self.$$lastUrl != self.$$url) { + self.$$lastUrl = self.$$url; + listener(self.$$url); + } + } + ); + + return listener; + }; + + self.cookieHash = {}; + self.lastCookieHash = {}; + self.deferredFns = []; + self.deferredNextId = 0; + + self.defer = function(fn, delay) { + delay = delay || 0; + self.deferredFns.push({time:(self.defer.now + delay), fn:fn, id: self.deferredNextId}); + self.deferredFns.sort(function(a,b){ return a.time - b.time;}); + return self.deferredNextId++; + }; + + + /** + * @name ngMock.$browser#defer.now + * @propertyOf ngMock.$browser + * + * @description + * Current milliseconds mock time. + */ + self.defer.now = 0; + + + self.defer.cancel = function(deferId) { + var fnIndex; + + angular.forEach(self.deferredFns, function(fn, index) { + if (fn.id === deferId) fnIndex = index; + }); + + if (fnIndex !== undefined) { + self.deferredFns.splice(fnIndex, 1); + return true; + } + + return false; + }; + + + /** + * @name ngMock.$browser#defer.flush + * @methodOf ngMock.$browser + * + * @description + * Flushes all pending requests and executes the defer callbacks. + * + * @param {number=} number of milliseconds to flush. See {@link #defer.now} + */ + self.defer.flush = function(delay) { + if (angular.isDefined(delay)) { + self.defer.now += delay; + } else { + if (self.deferredFns.length) { + self.defer.now = self.deferredFns[self.deferredFns.length-1].time; + } else { + throw new Error('No deferred tasks to be flushed'); + } + } + + while (self.deferredFns.length && self.deferredFns[0].time <= self.defer.now) { + self.deferredFns.shift().fn(); + } + }; + + self.$$baseHref = ''; + self.baseHref = function() { + return this.$$baseHref; + }; +}; +angular.mock.$Browser.prototype = { + +/** + * @name ngMock.$browser#poll + * @methodOf ngMock.$browser + * + * @description + * run all fns in pollFns + */ + poll: function poll() { + angular.forEach(this.pollFns, function(pollFn){ + pollFn(); + }); + }, + + addPollFn: function(pollFn) { + this.pollFns.push(pollFn); + return pollFn; + }, + + url: function(url, replace) { + if (url) { + this.$$url = url; + return this; + } + + return this.$$url; + }, + + cookies: function(name, value) { + if (name) { + if (angular.isUndefined(value)) { + delete this.cookieHash[name]; + } else { + if (angular.isString(value) && //strings only + value.length <= 4096) { //strict cookie storage limits + this.cookieHash[name] = value; + } + } + } else { + if (!angular.equals(this.cookieHash, this.lastCookieHash)) { + this.lastCookieHash = angular.copy(this.cookieHash); + this.cookieHash = angular.copy(this.cookieHash); + } + return this.cookieHash; + } + }, + + notifyWhenNoOutstandingRequests: function(fn) { + fn(); + } +}; + + +/** + * @ngdoc object + * @name ngMock.$exceptionHandlerProvider + * + * @description + * Configures the mock implementation of {@link ng.$exceptionHandler} to rethrow or to log errors + * passed into the `$exceptionHandler`. + */ + +/** + * @ngdoc object + * @name ngMock.$exceptionHandler + * + * @description + * Mock implementation of {@link ng.$exceptionHandler} that rethrows or logs errors passed + * into it. See {@link ngMock.$exceptionHandlerProvider $exceptionHandlerProvider} for configuration + * information. + * + * + *
                  + *   describe('$exceptionHandlerProvider', function() {
                  + *
                  + *     it('should capture log messages and exceptions', function() {
                  + *
                  + *       module(function($exceptionHandlerProvider) {
                  + *         $exceptionHandlerProvider.mode('log');
                  + *       });
                  + *
                  + *       inject(function($log, $exceptionHandler, $timeout) {
                  + *         $timeout(function() { $log.log(1); });
                  + *         $timeout(function() { $log.log(2); throw 'banana peel'; });
                  + *         $timeout(function() { $log.log(3); });
                  + *         expect($exceptionHandler.errors).toEqual([]);
                  + *         expect($log.assertEmpty());
                  + *         $timeout.flush();
                  + *         expect($exceptionHandler.errors).toEqual(['banana peel']);
                  + *         expect($log.log.logs).toEqual([[1], [2], [3]]);
                  + *       });
                  + *     });
                  + *   });
                  + * 
                  + */ + +angular.mock.$ExceptionHandlerProvider = function() { + var handler; + + /** + * @ngdoc method + * @name ngMock.$exceptionHandlerProvider#mode + * @methodOf ngMock.$exceptionHandlerProvider + * + * @description + * Sets the logging mode. + * + * @param {string} mode Mode of operation, defaults to `rethrow`. + * + * - `rethrow`: If any errors are passed into the handler in tests, it typically + * means that there is a bug in the application or test, so this mock will + * make these tests fail. + * - `log`: Sometimes it is desirable to test that an error is thrown, for this case the `log` + * mode stores an array of errors in `$exceptionHandler.errors`, to allow later + * assertion of them. See {@link ngMock.$log#assertEmpty assertEmpty()} and + * {@link ngMock.$log#reset reset()} + */ + this.mode = function(mode) { + switch(mode) { + case 'rethrow': + handler = function(e) { + throw e; + }; + break; + case 'log': + var errors = []; + + handler = function(e) { + if (arguments.length == 1) { + errors.push(e); + } else { + errors.push([].slice.call(arguments, 0)); + } + }; + + handler.errors = errors; + break; + default: + throw new Error("Unknown mode '" + mode + "', only 'log'/'rethrow' modes are allowed!"); + } + }; + + this.$get = function() { + return handler; + }; + + this.mode('rethrow'); +}; + + +/** + * @ngdoc service + * @name ngMock.$log + * + * @description + * Mock implementation of {@link ng.$log} that gathers all logged messages in arrays + * (one array per logging level). These arrays are exposed as `logs` property of each of the + * level-specific log function, e.g. for level `error` the array is exposed as `$log.error.logs`. + * + */ +angular.mock.$LogProvider = function() { + var debug = true; + + function concat(array1, array2, index) { + return array1.concat(Array.prototype.slice.call(array2, index)); + } + + this.debugEnabled = function(flag) { + if (angular.isDefined(flag)) { + debug = flag; + return this; + } else { + return debug; + } + }; + + this.$get = function () { + var $log = { + log: function() { $log.log.logs.push(concat([], arguments, 0)); }, + warn: function() { $log.warn.logs.push(concat([], arguments, 0)); }, + info: function() { $log.info.logs.push(concat([], arguments, 0)); }, + error: function() { $log.error.logs.push(concat([], arguments, 0)); }, + debug: function() { + if (debug) { + $log.debug.logs.push(concat([], arguments, 0)); + } + } + }; + + /** + * @ngdoc method + * @name ngMock.$log#reset + * @methodOf ngMock.$log + * + * @description + * Reset all of the logging arrays to empty. + */ + $log.reset = function () { + /** + * @ngdoc property + * @name ngMock.$log#log.logs + * @propertyOf ngMock.$log + * + * @description + * Array of messages logged using {@link ngMock.$log#log}. + * + * @example + *
                  +       * $log.log('Some Log');
                  +       * var first = $log.log.logs.unshift();
                  +       * 
                  + */ + $log.log.logs = []; + /** + * @ngdoc property + * @name ngMock.$log#info.logs + * @propertyOf ngMock.$log + * + * @description + * Array of messages logged using {@link ngMock.$log#info}. + * + * @example + *
                  +       * $log.info('Some Info');
                  +       * var first = $log.info.logs.unshift();
                  +       * 
                  + */ + $log.info.logs = []; + /** + * @ngdoc property + * @name ngMock.$log#warn.logs + * @propertyOf ngMock.$log + * + * @description + * Array of messages logged using {@link ngMock.$log#warn}. + * + * @example + *
                  +       * $log.warn('Some Warning');
                  +       * var first = $log.warn.logs.unshift();
                  +       * 
                  + */ + $log.warn.logs = []; + /** + * @ngdoc property + * @name ngMock.$log#error.logs + * @propertyOf ngMock.$log + * + * @description + * Array of messages logged using {@link ngMock.$log#error}. + * + * @example + *
                  +       * $log.log('Some Error');
                  +       * var first = $log.error.logs.unshift();
                  +       * 
                  + */ + $log.error.logs = []; + /** + * @ngdoc property + * @name ngMock.$log#debug.logs + * @propertyOf ngMock.$log + * + * @description + * Array of messages logged using {@link ngMock.$log#debug}. + * + * @example + *
                  +       * $log.debug('Some Error');
                  +       * var first = $log.debug.logs.unshift();
                  +       * 
                  + */ + $log.debug.logs = []; + }; + + /** + * @ngdoc method + * @name ngMock.$log#assertEmpty + * @methodOf ngMock.$log + * + * @description + * Assert that the all of the logging methods have no logged messages. If messages present, an + * exception is thrown. + */ + $log.assertEmpty = function() { + var errors = []; + angular.forEach(['error', 'warn', 'info', 'log', 'debug'], function(logLevel) { + angular.forEach($log[logLevel].logs, function(log) { + angular.forEach(log, function (logItem) { + errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + '\n' + + (logItem.stack || '')); + }); + }); + }); + if (errors.length) { + errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or "+ + "an expected log message was not checked and removed:"); + errors.push(''); + throw new Error(errors.join('\n---------\n')); + } + }; + + $log.reset(); + return $log; + }; +}; + + +/** + * @ngdoc service + * @name ngMock.$interval + * + * @description + * Mock implementation of the $interval service. + * + * Use {@link ngMock.$interval#methods_flush `$interval.flush(millis)`} to + * move forward by `millis` milliseconds and trigger any functions scheduled to run in that + * time. + * + * @param {function()} fn A function that should be called repeatedly. + * @param {number} delay Number of milliseconds between each function call. + * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat + * indefinitely. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#methods_$apply $apply} block. + * @returns {promise} A promise which will be notified on each iteration. + */ +angular.mock.$IntervalProvider = function() { + this.$get = ['$rootScope', '$q', + function($rootScope, $q) { + var repeatFns = [], + nextRepeatId = 0, + now = 0; + + var $interval = function(fn, delay, count, invokeApply) { + var deferred = $q.defer(), + promise = deferred.promise, + iteration = 0, + skipApply = (angular.isDefined(invokeApply) && !invokeApply); + + count = (angular.isDefined(count)) ? count : 0, + promise.then(null, null, fn); + + promise.$$intervalId = nextRepeatId; + + function tick() { + deferred.notify(iteration++); + + if (count > 0 && iteration >= count) { + var fnIndex; + deferred.resolve(iteration); + + angular.forEach(repeatFns, function(fn, index) { + if (fn.id === promise.$$intervalId) fnIndex = index; + }); + + if (fnIndex !== undefined) { + repeatFns.splice(fnIndex, 1); + } + } + + if (!skipApply) $rootScope.$apply(); + } + + repeatFns.push({ + nextTime:(now + delay), + delay: delay, + fn: tick, + id: nextRepeatId, + deferred: deferred + }); + repeatFns.sort(function(a,b){ return a.nextTime - b.nextTime;}); + + nextRepeatId++; + return promise; + }; + + $interval.cancel = function(promise) { + var fnIndex; + + angular.forEach(repeatFns, function(fn, index) { + if (fn.id === promise.$$intervalId) fnIndex = index; + }); + + if (fnIndex !== undefined) { + repeatFns[fnIndex].deferred.reject('canceled'); + repeatFns.splice(fnIndex, 1); + return true; + } + + return false; + }; + + /** + * @ngdoc method + * @name ngMock.$interval#flush + * @methodOf ngMock.$interval + * @description + * + * Runs interval tasks scheduled to be run in the next `millis` milliseconds. + * + * @param {number=} millis maximum timeout amount to flush up until. + * + * @return {number} The amount of time moved forward. + */ + $interval.flush = function(millis) { + now += millis; + while (repeatFns.length && repeatFns[0].nextTime <= now) { + var task = repeatFns[0]; + task.fn(); + task.nextTime += task.delay; + repeatFns.sort(function(a,b){ return a.nextTime - b.nextTime;}); + } + return millis; + }; + + return $interval; + }]; +}; + + +/* jshint -W101 */ +/* The R_ISO8061_STR regex is never going to fit into the 100 char limit! + * This directive should go inside the anonymous function but a bug in JSHint means that it would + * not be enacted early enough to prevent the warning. + */ +var R_ISO8061_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/; + +function jsonStringToDate(string) { + var match; + if (match = string.match(R_ISO8061_STR)) { + var date = new Date(0), + tzHour = 0, + tzMin = 0; + if (match[9]) { + tzHour = int(match[9] + match[10]); + tzMin = int(match[9] + match[11]); + } + date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3])); + date.setUTCHours(int(match[4]||0) - tzHour, + int(match[5]||0) - tzMin, + int(match[6]||0), + int(match[7]||0)); + return date; + } + return string; +} + +function int(str) { + return parseInt(str, 10); +} + +function padNumber(num, digits, trim) { + var neg = ''; + if (num < 0) { + neg = '-'; + num = -num; + } + num = '' + num; + while(num.length < digits) num = '0' + num; + if (trim) + num = num.substr(num.length - digits); + return neg + num; +} + + +/** + * @ngdoc object + * @name angular.mock.TzDate + * @description + * + * *NOTE*: this is not an injectable instance, just a globally available mock class of `Date`. + * + * Mock of the Date type which has its timezone specified via constructor arg. + * + * The main purpose is to create Date-like instances with timezone fixed to the specified timezone + * offset, so that we can test code that depends on local timezone settings without dependency on + * the time zone settings of the machine where the code is running. + * + * @param {number} offset Offset of the *desired* timezone in hours (fractions will be honored) + * @param {(number|string)} timestamp Timestamp representing the desired time in *UTC* + * + * @example + * !!!! WARNING !!!!! + * This is not a complete Date object so only methods that were implemented can be called safely. + * To make matters worse, TzDate instances inherit stuff from Date via a prototype. + * + * We do our best to intercept calls to "unimplemented" methods, but since the list of methods is + * incomplete we might be missing some non-standard methods. This can result in errors like: + * "Date.prototype.foo called on incompatible Object". + * + *
                  + * var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z');
                  + * newYearInBratislava.getTimezoneOffset() => -60;
                  + * newYearInBratislava.getFullYear() => 2010;
                  + * newYearInBratislava.getMonth() => 0;
                  + * newYearInBratislava.getDate() => 1;
                  + * newYearInBratislava.getHours() => 0;
                  + * newYearInBratislava.getMinutes() => 0;
                  + * newYearInBratislava.getSeconds() => 0;
                  + * 
                  + * + */ +angular.mock.TzDate = function (offset, timestamp) { + var self = new Date(0); + if (angular.isString(timestamp)) { + var tsStr = timestamp; + + self.origDate = jsonStringToDate(timestamp); + + timestamp = self.origDate.getTime(); + if (isNaN(timestamp)) + throw { + name: "Illegal Argument", + message: "Arg '" + tsStr + "' passed into TzDate constructor is not a valid date string" + }; + } else { + self.origDate = new Date(timestamp); + } + + var localOffset = new Date(timestamp).getTimezoneOffset(); + self.offsetDiff = localOffset*60*1000 - offset*1000*60*60; + self.date = new Date(timestamp + self.offsetDiff); + + self.getTime = function() { + return self.date.getTime() - self.offsetDiff; + }; + + self.toLocaleDateString = function() { + return self.date.toLocaleDateString(); + }; + + self.getFullYear = function() { + return self.date.getFullYear(); + }; + + self.getMonth = function() { + return self.date.getMonth(); + }; + + self.getDate = function() { + return self.date.getDate(); + }; + + self.getHours = function() { + return self.date.getHours(); + }; + + self.getMinutes = function() { + return self.date.getMinutes(); + }; + + self.getSeconds = function() { + return self.date.getSeconds(); + }; + + self.getMilliseconds = function() { + return self.date.getMilliseconds(); + }; + + self.getTimezoneOffset = function() { + return offset * 60; + }; + + self.getUTCFullYear = function() { + return self.origDate.getUTCFullYear(); + }; + + self.getUTCMonth = function() { + return self.origDate.getUTCMonth(); + }; + + self.getUTCDate = function() { + return self.origDate.getUTCDate(); + }; + + self.getUTCHours = function() { + return self.origDate.getUTCHours(); + }; + + self.getUTCMinutes = function() { + return self.origDate.getUTCMinutes(); + }; + + self.getUTCSeconds = function() { + return self.origDate.getUTCSeconds(); + }; + + self.getUTCMilliseconds = function() { + return self.origDate.getUTCMilliseconds(); + }; + + self.getDay = function() { + return self.date.getDay(); + }; + + // provide this method only on browsers that already have it + if (self.toISOString) { + self.toISOString = function() { + return padNumber(self.origDate.getUTCFullYear(), 4) + '-' + + padNumber(self.origDate.getUTCMonth() + 1, 2) + '-' + + padNumber(self.origDate.getUTCDate(), 2) + 'T' + + padNumber(self.origDate.getUTCHours(), 2) + ':' + + padNumber(self.origDate.getUTCMinutes(), 2) + ':' + + padNumber(self.origDate.getUTCSeconds(), 2) + '.' + + padNumber(self.origDate.getUTCMilliseconds(), 3) + 'Z'; + }; + } + + //hide all methods not implemented in this mock that the Date prototype exposes + var unimplementedMethods = ['getUTCDay', + 'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds', + 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear', + 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', + 'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 'toLocaleString', + 'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 'toUTCString', 'valueOf']; + + angular.forEach(unimplementedMethods, function(methodName) { + self[methodName] = function() { + throw new Error("Method '" + methodName + "' is not implemented in the TzDate mock"); + }; + }); + + return self; +}; + +//make "tzDateInstance instanceof Date" return true +angular.mock.TzDate.prototype = Date.prototype; +/* jshint +W101 */ + +// TODO(matias): remove this IMMEDIATELY once we can properly detect the +// presence of a registered module +var animateLoaded; +try { + angular.module('ngAnimate'); + animateLoaded = true; +} catch(e) {} + +if(animateLoaded) { + angular.module('ngAnimate').config(['$provide', function($provide) { + var reflowQueue = []; + $provide.value('$$animateReflow', function(fn) { + reflowQueue.push(fn); + return angular.noop; + }); + $provide.decorator('$animate', function($delegate) { + $delegate.triggerReflow = function() { + if(reflowQueue.length === 0) { + throw new Error('No animation reflows present'); + } + angular.forEach(reflowQueue, function(fn) { + fn(); + }); + reflowQueue = []; + }; + return $delegate; + }); + }]); +} + +angular.mock.animate = angular.module('mock.animate', ['ng']) + + .config(['$provide', function($provide) { + + $provide.decorator('$animate', function($delegate) { + var animate = { + queue : [], + enabled : $delegate.enabled, + flushNext : function(name) { + var tick = animate.queue.shift(); + + if (!tick) throw new Error('No animation to be flushed'); + if(tick.method !== name) { + throw new Error('The next animation is not "' + name + + '", but is "' + tick.method + '"'); + } + tick.fn(); + return tick; + } + }; + + angular.forEach(['enter','leave','move','addClass','removeClass'], function(method) { + animate[method] = function() { + var params = arguments; + animate.queue.push({ + method : method, + params : params, + element : angular.isElement(params[0]) && params[0], + parent : angular.isElement(params[1]) && params[1], + after : angular.isElement(params[2]) && params[2], + fn : function() { + $delegate[method].apply($delegate, params); + } + }); + }; + }); + + return animate; + }); + + }]); + + +/** + * @ngdoc function + * @name angular.mock.dump + * @description + * + * *NOTE*: this is not an injectable instance, just a globally available function. + * + * Method for serializing common angular objects (scope, elements, etc..) into strings, useful for + * debugging. + * + * This method is also available on window, where it can be used to display objects on debug + * console. + * + * @param {*} object - any object to turn into string. + * @return {string} a serialized string of the argument + */ +angular.mock.dump = function(object) { + return serialize(object); + + function serialize(object) { + var out; + + if (angular.isElement(object)) { + object = angular.element(object); + out = angular.element('
                  '); + angular.forEach(object, function(element) { + out.append(angular.element(element).clone()); + }); + out = out.html(); + } else if (angular.isArray(object)) { + out = []; + angular.forEach(object, function(o) { + out.push(serialize(o)); + }); + out = '[ ' + out.join(', ') + ' ]'; + } else if (angular.isObject(object)) { + if (angular.isFunction(object.$eval) && angular.isFunction(object.$apply)) { + out = serializeScope(object); + } else if (object instanceof Error) { + out = object.stack || ('' + object.name + ': ' + object.message); + } else { + // TODO(i): this prevents methods being logged, + // we should have a better way to serialize objects + out = angular.toJson(object, true); + } + } else { + out = String(object); + } + + return out; + } + + function serializeScope(scope, offset) { + offset = offset || ' '; + var log = [offset + 'Scope(' + scope.$id + '): {']; + for ( var key in scope ) { + if (Object.prototype.hasOwnProperty.call(scope, key) && !key.match(/^(\$|this)/)) { + log.push(' ' + key + ': ' + angular.toJson(scope[key])); + } + } + var child = scope.$$childHead; + while(child) { + log.push(serializeScope(child, offset + ' ')); + child = child.$$nextSibling; + } + log.push('}'); + return log.join('\n' + offset); + } +}; + +/** + * @ngdoc object + * @name ngMock.$httpBackend + * @description + * Fake HTTP backend implementation suitable for unit testing applications that use the + * {@link ng.$http $http service}. + * + * *Note*: For fake HTTP backend implementation suitable for end-to-end testing or backend-less + * development please see {@link ngMockE2E.$httpBackend e2e $httpBackend mock}. + * + * During unit testing, we want our unit tests to run quickly and have no external dependencies so + * we don’t want to send {@link https://developer.mozilla.org/en/xmlhttprequest XHR} or + * {@link http://en.wikipedia.org/wiki/JSONP JSONP} requests to a real server. All we really need is + * to verify whether a certain request has been sent or not, or alternatively just let the + * application make requests, respond with pre-trained responses and assert that the end result is + * what we expect it to be. + * + * This mock implementation can be used to respond with static or dynamic responses via the + * `expect` and `when` apis and their shortcuts (`expectGET`, `whenPOST`, etc). + * + * When an Angular application needs some data from a server, it calls the $http service, which + * sends the request to a real server using $httpBackend service. With dependency injection, it is + * easy to inject $httpBackend mock (which has the same API as $httpBackend) and use it to verify + * the requests and respond with some testing data without sending a request to real server. + * + * There are two ways to specify what test data should be returned as http responses by the mock + * backend when the code under test makes http requests: + * + * - `$httpBackend.expect` - specifies a request expectation + * - `$httpBackend.when` - specifies a backend definition + * + * + * # Request Expectations vs Backend Definitions + * + * Request expectations provide a way to make assertions about requests made by the application and + * to define responses for those requests. The test will fail if the expected requests are not made + * or they are made in the wrong order. + * + * Backend definitions allow you to define a fake backend for your application which doesn't assert + * if a particular request was made or not, it just returns a trained response if a request is made. + * The test will pass whether or not the request gets made during testing. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
                  Request expectationsBackend definitions
                  Syntax.expect(...).respond(...).when(...).respond(...)
                  Typical usagestrict unit testsloose (black-box) unit testing
                  Fulfills multiple requestsNOYES
                  Order of requests mattersYESNO
                  Request requiredYESNO
                  Response requiredoptional (see below)YES
                  + * + * In cases where both backend definitions and request expectations are specified during unit + * testing, the request expectations are evaluated first. + * + * If a request expectation has no response specified, the algorithm will search your backend + * definitions for an appropriate response. + * + * If a request didn't match any expectation or if the expectation doesn't have the response + * defined, the backend definitions are evaluated in sequential order to see if any of them match + * the request. The response from the first matched definition is returned. + * + * + * # Flushing HTTP requests + * + * The $httpBackend used in production, always responds to requests with responses asynchronously. + * If we preserved this behavior in unit testing, we'd have to create async unit tests, which are + * hard to write, follow and maintain. At the same time the testing mock, can't respond + * synchronously because that would change the execution of the code under test. For this reason the + * mock $httpBackend has a `flush()` method, which allows the test to explicitly flush pending + * requests and thus preserving the async api of the backend, while allowing the test to execute + * synchronously. + * + * + * # Unit testing with mock $httpBackend + * The following code shows how to setup and use the mock backend in unit testing a controller. + * First we create the controller under test + * +
                  +  // The controller code
                  +  function MyController($scope, $http) {
                  +    var authToken;
                  +
                  +    $http.get('/auth.py').success(function(data, status, headers) {
                  +      authToken = headers('A-Token');
                  +      $scope.user = data;
                  +    });
                  +
                  +    $scope.saveMessage = function(message) {
                  +      var headers = { 'Authorization': authToken };
                  +      $scope.status = 'Saving...';
                  +
                  +      $http.post('/add-msg.py', message, { headers: headers } ).success(function(response) {
                  +        $scope.status = '';
                  +      }).error(function() {
                  +        $scope.status = 'ERROR!';
                  +      });
                  +    };
                  +  }
                  +  
                  + * + * Now we setup the mock backend and create the test specs. + * +
                  +    // testing controller
                  +    describe('MyController', function() {
                  +       var $httpBackend, $rootScope, createController;
                  +
                  +       beforeEach(inject(function($injector) {
                  +         // Set up the mock http service responses
                  +         $httpBackend = $injector.get('$httpBackend');
                  +         // backend definition common for all tests
                  +         $httpBackend.when('GET', '/auth.py').respond({userId: 'userX'}, {'A-Token': 'xxx'});
                  +
                  +         // Get hold of a scope (i.e. the root scope)
                  +         $rootScope = $injector.get('$rootScope');
                  +         // The $controller service is used to create instances of controllers
                  +         var $controller = $injector.get('$controller');
                  +
                  +         createController = function() {
                  +           return $controller('MyController', {'$scope' : $rootScope });
                  +         };
                  +       }));
                  +
                  +
                  +       afterEach(function() {
                  +         $httpBackend.verifyNoOutstandingExpectation();
                  +         $httpBackend.verifyNoOutstandingRequest();
                  +       });
                  +
                  +
                  +       it('should fetch authentication token', function() {
                  +         $httpBackend.expectGET('/auth.py');
                  +         var controller = createController();
                  +         $httpBackend.flush();
                  +       });
                  +
                  +
                  +       it('should send msg to server', function() {
                  +         var controller = createController();
                  +         $httpBackend.flush();
                  +
                  +         // now you don’t care about the authentication, but
                  +         // the controller will still send the request and
                  +         // $httpBackend will respond without you having to
                  +         // specify the expectation and response for this request
                  +
                  +         $httpBackend.expectPOST('/add-msg.py', 'message content').respond(201, '');
                  +         $rootScope.saveMessage('message content');
                  +         expect($rootScope.status).toBe('Saving...');
                  +         $httpBackend.flush();
                  +         expect($rootScope.status).toBe('');
                  +       });
                  +
                  +
                  +       it('should send auth header', function() {
                  +         var controller = createController();
                  +         $httpBackend.flush();
                  +
                  +         $httpBackend.expectPOST('/add-msg.py', undefined, function(headers) {
                  +           // check if the header was send, if it wasn't the expectation won't
                  +           // match the request and the test will fail
                  +           return headers['Authorization'] == 'xxx';
                  +         }).respond(201, '');
                  +
                  +         $rootScope.saveMessage('whatever');
                  +         $httpBackend.flush();
                  +       });
                  +    });
                  +   
                  + */ +angular.mock.$HttpBackendProvider = function() { + this.$get = ['$rootScope', createHttpBackendMock]; +}; + +/** + * General factory function for $httpBackend mock. + * Returns instance for unit testing (when no arguments specified): + * - passing through is disabled + * - auto flushing is disabled + * + * Returns instance for e2e testing (when `$delegate` and `$browser` specified): + * - passing through (delegating request to real backend) is enabled + * - auto flushing is enabled + * + * @param {Object=} $delegate Real $httpBackend instance (allow passing through if specified) + * @param {Object=} $browser Auto-flushing enabled if specified + * @return {Object} Instance of $httpBackend mock + */ +function createHttpBackendMock($rootScope, $delegate, $browser) { + var definitions = [], + expectations = [], + responses = [], + responsesPush = angular.bind(responses, responses.push), + copy = angular.copy; + + function createResponse(status, data, headers) { + if (angular.isFunction(status)) return status; + + return function() { + return angular.isNumber(status) + ? [status, data, headers] + : [200, status, data]; + }; + } + + // TODO(vojta): change params to: method, url, data, headers, callback + function $httpBackend(method, url, data, callback, headers, timeout, withCredentials) { + var xhr = new MockXhr(), + expectation = expectations[0], + wasExpected = false; + + function prettyPrint(data) { + return (angular.isString(data) || angular.isFunction(data) || data instanceof RegExp) + ? data + : angular.toJson(data); + } + + function wrapResponse(wrapped) { + if (!$browser && timeout && timeout.then) timeout.then(handleTimeout); + + return handleResponse; + + function handleResponse() { + var response = wrapped.response(method, url, data, headers); + xhr.$$respHeaders = response[2]; + callback(copy(response[0]), copy(response[1]), xhr.getAllResponseHeaders()); + } + + function handleTimeout() { + for (var i = 0, ii = responses.length; i < ii; i++) { + if (responses[i] === handleResponse) { + responses.splice(i, 1); + callback(-1, undefined, ''); + break; + } + } + } + } + + if (expectation && expectation.match(method, url)) { + if (!expectation.matchData(data)) + throw new Error('Expected ' + expectation + ' with different data\n' + + 'EXPECTED: ' + prettyPrint(expectation.data) + '\nGOT: ' + data); + + if (!expectation.matchHeaders(headers)) + throw new Error('Expected ' + expectation + ' with different headers\n' + + 'EXPECTED: ' + prettyPrint(expectation.headers) + '\nGOT: ' + + prettyPrint(headers)); + + expectations.shift(); + + if (expectation.response) { + responses.push(wrapResponse(expectation)); + return; + } + wasExpected = true; + } + + var i = -1, definition; + while ((definition = definitions[++i])) { + if (definition.match(method, url, data, headers || {})) { + if (definition.response) { + // if $browser specified, we do auto flush all requests + ($browser ? $browser.defer : responsesPush)(wrapResponse(definition)); + } else if (definition.passThrough) { + $delegate(method, url, data, callback, headers, timeout, withCredentials); + } else throw new Error('No response defined !'); + return; + } + } + throw wasExpected ? + new Error('No response defined !') : + new Error('Unexpected request: ' + method + ' ' + url + '\n' + + (expectation ? 'Expected ' + expectation : 'No more request expected')); + } + + /** + * @ngdoc method + * @name ngMock.$httpBackend#when + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition. + * + * @param {string} method HTTP method. + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives + * data string and returns true if the data is as expected. + * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header + * object and returns true if the headers match the current definition. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. + * + * - respond – + * `{function([status,] data[, headers])|function(function(method, url, data, headers)}` + * – The respond method takes a set of static data to be returned or a function that can return + * an array containing response status (number), response data (string) and response headers + * (Object). + */ + $httpBackend.when = function(method, url, data, headers) { + var definition = new MockHttpExpectation(method, url, data, headers), + chain = { + respond: function(status, data, headers) { + definition.response = createResponse(status, data, headers); + } + }; + + if ($browser) { + chain.passThrough = function() { + definition.passThrough = true; + }; + } + + definitions.push(definition); + return chain; + }; + + /** + * @ngdoc method + * @name ngMock.$httpBackend#whenGET + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition for GET requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#whenHEAD + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition for HEAD requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#whenDELETE + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition for DELETE requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#whenPOST + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition for POST requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives + * data string and returns true if the data is as expected. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#whenPUT + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition for PUT requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives + * data string and returns true if the data is as expected. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#whenJSONP + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition for JSONP requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + createShortMethods('when'); + + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expect + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation. + * + * @param {string} method HTTP method. + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that + * receives data string and returns true if the data is as expected, or Object if request body + * is in JSON format. + * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header + * object and returns true if the headers match the current expectation. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + * + * - respond – + * `{function([status,] data[, headers])|function(function(method, url, data, headers)}` + * – The respond method takes a set of static data to be returned or a function that can return + * an array containing response status (number), response data (string) and response headers + * (Object). + */ + $httpBackend.expect = function(method, url, data, headers) { + var expectation = new MockHttpExpectation(method, url, data, headers); + expectations.push(expectation); + return { + respond: function(status, data, headers) { + expectation.response = createResponse(status, data, headers); + } + }; + }; + + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectGET + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for GET requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. See #expect for more info. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectHEAD + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for HEAD requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectDELETE + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for DELETE requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectPOST + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for POST requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that + * receives data string and returns true if the data is as expected, or Object if request body + * is in JSON format. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectPUT + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for PUT requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that + * receives data string and returns true if the data is as expected, or Object if request body + * is in JSON format. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectPATCH + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for PATCH requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that + * receives data string and returns true if the data is as expected, or Object if request body + * is in JSON format. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectJSONP + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for JSONP requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + createShortMethods('expect'); + + + /** + * @ngdoc method + * @name ngMock.$httpBackend#flush + * @methodOf ngMock.$httpBackend + * @description + * Flushes all pending requests using the trained responses. + * + * @param {number=} count Number of responses to flush (in the order they arrived). If undefined, + * all pending requests will be flushed. If there are no pending requests when the flush method + * is called an exception is thrown (as this typically a sign of programming error). + */ + $httpBackend.flush = function(count) { + $rootScope.$digest(); + if (!responses.length) throw new Error('No pending request to flush !'); + + if (angular.isDefined(count)) { + while (count--) { + if (!responses.length) throw new Error('No more pending request to flush !'); + responses.shift()(); + } + } else { + while (responses.length) { + responses.shift()(); + } + } + $httpBackend.verifyNoOutstandingExpectation(); + }; + + + /** + * @ngdoc method + * @name ngMock.$httpBackend#verifyNoOutstandingExpectation + * @methodOf ngMock.$httpBackend + * @description + * Verifies that all of the requests defined via the `expect` api were made. If any of the + * requests were not made, verifyNoOutstandingExpectation throws an exception. + * + * Typically, you would call this method following each test case that asserts requests using an + * "afterEach" clause. + * + *
                  +   *   afterEach($httpBackend.verifyNoOutstandingExpectation);
                  +   * 
                  + */ + $httpBackend.verifyNoOutstandingExpectation = function() { + $rootScope.$digest(); + if (expectations.length) { + throw new Error('Unsatisfied requests: ' + expectations.join(', ')); + } + }; + + + /** + * @ngdoc method + * @name ngMock.$httpBackend#verifyNoOutstandingRequest + * @methodOf ngMock.$httpBackend + * @description + * Verifies that there are no outstanding requests that need to be flushed. + * + * Typically, you would call this method following each test case that asserts requests using an + * "afterEach" clause. + * + *
                  +   *   afterEach($httpBackend.verifyNoOutstandingRequest);
                  +   * 
                  + */ + $httpBackend.verifyNoOutstandingRequest = function() { + if (responses.length) { + throw new Error('Unflushed requests: ' + responses.length); + } + }; + + + /** + * @ngdoc method + * @name ngMock.$httpBackend#resetExpectations + * @methodOf ngMock.$httpBackend + * @description + * Resets all request expectations, but preserves all backend definitions. Typically, you would + * call resetExpectations during a multiple-phase test when you want to reuse the same instance of + * $httpBackend mock. + */ + $httpBackend.resetExpectations = function() { + expectations.length = 0; + responses.length = 0; + }; + + return $httpBackend; + + + function createShortMethods(prefix) { + angular.forEach(['GET', 'DELETE', 'JSONP'], function(method) { + $httpBackend[prefix + method] = function(url, headers) { + return $httpBackend[prefix](method, url, undefined, headers); + }; + }); + + angular.forEach(['PUT', 'POST', 'PATCH'], function(method) { + $httpBackend[prefix + method] = function(url, data, headers) { + return $httpBackend[prefix](method, url, data, headers); + }; + }); + } +} + +function MockHttpExpectation(method, url, data, headers) { + + this.data = data; + this.headers = headers; + + this.match = function(m, u, d, h) { + if (method != m) return false; + if (!this.matchUrl(u)) return false; + if (angular.isDefined(d) && !this.matchData(d)) return false; + if (angular.isDefined(h) && !this.matchHeaders(h)) return false; + return true; + }; + + this.matchUrl = function(u) { + if (!url) return true; + if (angular.isFunction(url.test)) return url.test(u); + return url == u; + }; + + this.matchHeaders = function(h) { + if (angular.isUndefined(headers)) return true; + if (angular.isFunction(headers)) return headers(h); + return angular.equals(headers, h); + }; + + this.matchData = function(d) { + if (angular.isUndefined(data)) return true; + if (data && angular.isFunction(data.test)) return data.test(d); + if (data && angular.isFunction(data)) return data(d); + if (data && !angular.isString(data)) return angular.equals(data, angular.fromJson(d)); + return data == d; + }; + + this.toString = function() { + return method + ' ' + url; + }; +} + +function createMockXhr() { + return new MockXhr(); +} + +function MockXhr() { + + // hack for testing $http, $httpBackend + MockXhr.$$lastInstance = this; + + this.open = function(method, url, async) { + this.$$method = method; + this.$$url = url; + this.$$async = async; + this.$$reqHeaders = {}; + this.$$respHeaders = {}; + }; + + this.send = function(data) { + this.$$data = data; + }; + + this.setRequestHeader = function(key, value) { + this.$$reqHeaders[key] = value; + }; + + this.getResponseHeader = function(name) { + // the lookup must be case insensitive, + // that's why we try two quick lookups first and full scan last + var header = this.$$respHeaders[name]; + if (header) return header; + + name = angular.lowercase(name); + header = this.$$respHeaders[name]; + if (header) return header; + + header = undefined; + angular.forEach(this.$$respHeaders, function(headerVal, headerName) { + if (!header && angular.lowercase(headerName) == name) header = headerVal; + }); + return header; + }; + + this.getAllResponseHeaders = function() { + var lines = []; + + angular.forEach(this.$$respHeaders, function(value, key) { + lines.push(key + ': ' + value); + }); + return lines.join('\n'); + }; + + this.abort = angular.noop; +} + + +/** + * @ngdoc function + * @name ngMock.$timeout + * @description + * + * This service is just a simple decorator for {@link ng.$timeout $timeout} service + * that adds a "flush" and "verifyNoPendingTasks" methods. + */ + +angular.mock.$TimeoutDecorator = function($delegate, $browser) { + + /** + * @ngdoc method + * @name ngMock.$timeout#flush + * @methodOf ngMock.$timeout + * @description + * + * Flushes the queue of pending tasks. + * + * @param {number=} delay maximum timeout amount to flush up until + */ + $delegate.flush = function(delay) { + $browser.defer.flush(delay); + }; + + /** + * @ngdoc method + * @name ngMock.$timeout#verifyNoPendingTasks + * @methodOf ngMock.$timeout + * @description + * + * Verifies that there are no pending tasks that need to be flushed. + */ + $delegate.verifyNoPendingTasks = function() { + if ($browser.deferredFns.length) { + throw new Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' + + formatPendingTasksAsString($browser.deferredFns)); + } + }; + + function formatPendingTasksAsString(tasks) { + var result = []; + angular.forEach(tasks, function(task) { + result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}'); + }); + + return result.join(', '); + } + + return $delegate; +}; + +/** + * + */ +angular.mock.$RootElementProvider = function() { + this.$get = function() { + return angular.element('
                  '); + }; +}; + +/** + * @ngdoc overview + * @name ngMock + * @description + * + * # ngMock + * + * The `ngMock` module providers support to inject and mock Angular services into unit tests. + * In addition, ngMock also extends various core ng services such that they can be + * inspected and controlled in a synchronous manner within test code. + * + * {@installModule mocks} + * + *
                  + * + */ +angular.module('ngMock', ['ng']).provider({ + $browser: angular.mock.$BrowserProvider, + $exceptionHandler: angular.mock.$ExceptionHandlerProvider, + $log: angular.mock.$LogProvider, + $interval: angular.mock.$IntervalProvider, + $httpBackend: angular.mock.$HttpBackendProvider, + $rootElement: angular.mock.$RootElementProvider +}).config(['$provide', function($provide) { + $provide.decorator('$timeout', angular.mock.$TimeoutDecorator); +}]); + +/** + * @ngdoc overview + * @name ngMockE2E + * @description + * + * The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing. + * Currently there is only one mock present in this module - + * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock. + */ +angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) { + $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator); +}]); + +/** + * @ngdoc object + * @name ngMockE2E.$httpBackend + * @description + * Fake HTTP backend implementation suitable for end-to-end testing or backend-less development of + * applications that use the {@link ng.$http $http service}. + * + * *Note*: For fake http backend implementation suitable for unit testing please see + * {@link ngMock.$httpBackend unit-testing $httpBackend mock}. + * + * This implementation can be used to respond with static or dynamic responses via the `when` api + * and its shortcuts (`whenGET`, `whenPOST`, etc) and optionally pass through requests to the + * real $httpBackend for specific requests (e.g. to interact with certain remote apis or to fetch + * templates from a webserver). + * + * As opposed to unit-testing, in an end-to-end testing scenario or in scenario when an application + * is being developed with the real backend api replaced with a mock, it is often desirable for + * certain category of requests to bypass the mock and issue a real http request (e.g. to fetch + * templates or static files from the webserver). To configure the backend with this behavior + * use the `passThrough` request handler of `when` instead of `respond`. + * + * Additionally, we don't want to manually have to flush mocked out requests like we do during unit + * testing. For this reason the e2e $httpBackend automatically flushes mocked out requests + * automatically, closely simulating the behavior of the XMLHttpRequest object. + * + * To setup the application to run with this http backend, you have to create a module that depends + * on the `ngMockE2E` and your application modules and defines the fake backend: + * + *
                  + *   myAppDev = angular.module('myAppDev', ['myApp', 'ngMockE2E']);
                  + *   myAppDev.run(function($httpBackend) {
                  + *     phones = [{name: 'phone1'}, {name: 'phone2'}];
                  + *
                  + *     // returns the current list of phones
                  + *     $httpBackend.whenGET('/phones').respond(phones);
                  + *
                  + *     // adds a new phone to the phones array
                  + *     $httpBackend.whenPOST('/phones').respond(function(method, url, data) {
                  + *       phones.push(angular.fromJson(data));
                  + *     });
                  + *     $httpBackend.whenGET(/^\/templates\//).passThrough();
                  + *     //...
                  + *   });
                  + * 
                  + * + * Afterwards, bootstrap your app with this new module. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#when + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition. + * + * @param {string} method HTTP method. + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header + * object and returns true if the headers match the current definition. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + * + * - respond – + * `{function([status,] data[, headers])|function(function(method, url, data, headers)}` + * – The respond method takes a set of static data to be returned or a function that can return + * an array containing response status (number), response data (string) and response headers + * (Object). + * - passThrough – `{function()}` – Any request matching a backend definition with `passThrough` + * handler, will be pass through to the real backend (an XHR request will be made to the + * server. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenGET + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for GET requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenHEAD + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for HEAD requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenDELETE + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for DELETE requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenPOST + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for POST requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenPUT + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for PUT requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenPATCH + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for PATCH requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenJSONP + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for JSONP requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ +angular.mock.e2e = {}; +angular.mock.e2e.$httpBackendDecorator = + ['$rootScope', '$delegate', '$browser', createHttpBackendMock]; + + +angular.mock.clearDataCache = function() { + var key, + cache = angular.element.cache; + + for(key in cache) { + if (Object.prototype.hasOwnProperty.call(cache,key)) { + var handle = cache[key].handle; + + handle && angular.element(handle.elem).off(); + delete cache[key]; + } + } +}; + + +if(window.jasmine || window.mocha) { + + var currentSpec = null, + isSpecRunning = function() { + return currentSpec && (window.mocha || currentSpec.queue.running); + }; + + + beforeEach(function() { + currentSpec = this; + }); + + afterEach(function() { + var injector = currentSpec.$injector; + + currentSpec.$injector = null; + currentSpec.$modules = null; + currentSpec = null; + + if (injector) { + injector.get('$rootElement').off(); + injector.get('$browser').pollFns.length = 0; + } + + angular.mock.clearDataCache(); + + // clean up jquery's fragment cache + angular.forEach(angular.element.fragments, function(val, key) { + delete angular.element.fragments[key]; + }); + + MockXhr.$$lastInstance = null; + + angular.forEach(angular.callbacks, function(val, key) { + delete angular.callbacks[key]; + }); + angular.callbacks.counter = 0; + }); + + /** + * @ngdoc function + * @name angular.mock.module + * @description + * + * *NOTE*: This function is also published on window for easy access.
                  + * + * This function registers a module configuration code. It collects the configuration information + * which will be used when the injector is created by {@link angular.mock.inject inject}. + * + * See {@link angular.mock.inject inject} for usage example + * + * @param {...(string|Function|Object)} fns any number of modules which are represented as string + * aliases or as anonymous module initialization functions. The modules are used to + * configure the injector. The 'ng' and 'ngMock' modules are automatically loaded. If an + * object literal is passed they will be register as values in the module, the key being + * the module name and the value being what is returned. + */ + window.module = angular.mock.module = function() { + var moduleFns = Array.prototype.slice.call(arguments, 0); + return isSpecRunning() ? workFn() : workFn; + ///////////////////// + function workFn() { + if (currentSpec.$injector) { + throw new Error('Injector already created, can not register a module!'); + } else { + var modules = currentSpec.$modules || (currentSpec.$modules = []); + angular.forEach(moduleFns, function(module) { + if (angular.isObject(module) && !angular.isArray(module)) { + modules.push(function($provide) { + angular.forEach(module, function(value, key) { + $provide.value(key, value); + }); + }); + } else { + modules.push(module); + } + }); + } + } + }; + + /** + * @ngdoc function + * @name angular.mock.inject + * @description + * + * *NOTE*: This function is also published on window for easy access.
                  + * + * The inject function wraps a function into an injectable function. The inject() creates new + * instance of {@link AUTO.$injector $injector} per test, which is then used for + * resolving references. + * + * + * ## Resolving References (Underscore Wrapping) + * Often, we would like to inject a reference once, in a `beforeEach()` block and reuse this + * in multiple `it()` clauses. To be able to do this we must assign the reference to a variable + * that is declared in the scope of the `describe()` block. Since we would, most likely, want + * the variable to have the same name of the reference we have a problem, since the parameter + * to the `inject()` function would hide the outer variable. + * + * To help with this, the injected parameters can, optionally, be enclosed with underscores. + * These are ignored by the injector when the reference name is resolved. + * + * For example, the parameter `_myService_` would be resolved as the reference `myService`. + * Since it is available in the function body as _myService_, we can then assign it to a variable + * defined in an outer scope. + * + * ``` + * // Defined out reference variable outside + * var myService; + * + * // Wrap the parameter in underscores + * beforeEach( inject( function(_myService_){ + * myService = _myService_; + * })); + * + * // Use myService in a series of tests. + * it('makes use of myService', function() { + * myService.doStuff(); + * }); + * + * ``` + * + * See also {@link angular.mock.module angular.mock.module} + * + * ## Example + * Example of what a typical jasmine tests looks like with the inject method. + *
                  +   *
                  +   *   angular.module('myApplicationModule', [])
                  +   *       .value('mode', 'app')
                  +   *       .value('version', 'v1.0.1');
                  +   *
                  +   *
                  +   *   describe('MyApp', function() {
                  +   *
                  +   *     // You need to load modules that you want to test,
                  +   *     // it loads only the "ng" module by default.
                  +   *     beforeEach(module('myApplicationModule'));
                  +   *
                  +   *
                  +   *     // inject() is used to inject arguments of all given functions
                  +   *     it('should provide a version', inject(function(mode, version) {
                  +   *       expect(version).toEqual('v1.0.1');
                  +   *       expect(mode).toEqual('app');
                  +   *     }));
                  +   *
                  +   *
                  +   *     // The inject and module method can also be used inside of the it or beforeEach
                  +   *     it('should override a version and test the new version is injected', function() {
                  +   *       // module() takes functions or strings (module aliases)
                  +   *       module(function($provide) {
                  +   *         $provide.value('version', 'overridden'); // override version here
                  +   *       });
                  +   *
                  +   *       inject(function(version) {
                  +   *         expect(version).toEqual('overridden');
                  +   *       });
                  +   *     });
                  +   *   });
                  +   *
                  +   * 
                  + * + * @param {...Function} fns any number of functions which will be injected using the injector. + */ + + + + var ErrorAddingDeclarationLocationStack = function(e, errorForStack) { + this.message = e.message; + this.name = e.name; + if (e.line) this.line = e.line; + if (e.sourceId) this.sourceId = e.sourceId; + if (e.stack && errorForStack) + this.stack = e.stack + '\n' + errorForStack.stack; + if (e.stackArray) this.stackArray = e.stackArray; + }; + ErrorAddingDeclarationLocationStack.prototype.toString = Error.prototype.toString; + + window.inject = angular.mock.inject = function() { + var blockFns = Array.prototype.slice.call(arguments, 0); + var errorForStack = new Error('Declaration Location'); + return isSpecRunning() ? workFn() : workFn; + ///////////////////// + function workFn() { + var modules = currentSpec.$modules || []; + + modules.unshift('ngMock'); + modules.unshift('ng'); + var injector = currentSpec.$injector; + if (!injector) { + injector = currentSpec.$injector = angular.injector(modules); + } + for(var i = 0, ii = blockFns.length; i < ii; i++) { + try { + /* jshint -W040 *//* Jasmine explicitly provides a `this` object when calling functions */ + injector.invoke(blockFns[i] || angular.noop, this); + /* jshint +W040 */ + } catch (e) { + if (e.stack && errorForStack) { + throw new ErrorAddingDeclarationLocationStack(e, errorForStack); + } + throw e; + } finally { + errorForStack = null; + } + } + } + }; +} + + +})(window, window.angular); diff --git a/bower_components/ngmap/spec/lib/angular.js b/bower_components/ngmap/spec/lib/angular.js new file mode 100644 index 0000000..197110e --- /dev/null +++ b/bower_components/ngmap/spec/lib/angular.js @@ -0,0 +1,20560 @@ +/** + * @license AngularJS v1.2.9 + * (c) 2010-2014 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, document, undefined) {'use strict'; + +/** + * @description + * + * This object provides a utility for producing rich Error messages within + * Angular. It can be called as follows: + * + * var exampleMinErr = minErr('example'); + * throw exampleMinErr('one', 'This {0} is {1}', foo, bar); + * + * The above creates an instance of minErr in the example namespace. The + * resulting error will have a namespaced error code of example.one. The + * resulting error will replace {0} with the value of foo, and {1} with the + * value of bar. The object is not restricted in the number of arguments it can + * take. + * + * If fewer arguments are specified than necessary for interpolation, the extra + * interpolation markers will be preserved in the final string. + * + * Since data will be parsed statically during a build step, some restrictions + * are applied with respect to how minErr instances are created and called. + * Instances should have names of the form namespaceMinErr for a minErr created + * using minErr('namespace') . Error codes, namespaces and template strings + * should all be static strings, not variables or general expressions. + * + * @param {string} module The namespace to use for the new minErr instance. + * @returns {function(string, string, ...): Error} instance + */ + +function minErr(module) { + return function () { + var code = arguments[0], + prefix = '[' + (module ? module + ':' : '') + code + '] ', + template = arguments[1], + templateArgs = arguments, + stringify = function (obj) { + if (typeof obj === 'function') { + return obj.toString().replace(/ \{[\s\S]*$/, ''); + } else if (typeof obj === 'undefined') { + return 'undefined'; + } else if (typeof obj !== 'string') { + return JSON.stringify(obj); + } + return obj; + }, + message, i; + + message = prefix + template.replace(/\{\d+\}/g, function (match) { + var index = +match.slice(1, -1), arg; + + if (index + 2 < templateArgs.length) { + arg = templateArgs[index + 2]; + if (typeof arg === 'function') { + return arg.toString().replace(/ ?\{[\s\S]*$/, ''); + } else if (typeof arg === 'undefined') { + return 'undefined'; + } else if (typeof arg !== 'string') { + return toJson(arg); + } + return arg; + } + return match; + }); + + message = message + '\nhttp://errors.angularjs.org/1.2.9/' + + (module ? module + '/' : '') + code; + for (i = 2; i < arguments.length; i++) { + message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' + + encodeURIComponent(stringify(arguments[i])); + } + + return new Error(message); + }; +} + +/* We need to tell jshint what variables are being exported */ +/* global + -angular, + -msie, + -jqLite, + -jQuery, + -slice, + -push, + -toString, + -ngMinErr, + -_angular, + -angularModule, + -nodeName_, + -uid, + + -lowercase, + -uppercase, + -manualLowercase, + -manualUppercase, + -nodeName_, + -isArrayLike, + -forEach, + -sortedKeys, + -forEachSorted, + -reverseParams, + -nextUid, + -setHashKey, + -extend, + -int, + -inherit, + -noop, + -identity, + -valueFn, + -isUndefined, + -isDefined, + -isObject, + -isString, + -isNumber, + -isDate, + -isArray, + -isFunction, + -isRegExp, + -isWindow, + -isScope, + -isFile, + -isBoolean, + -trim, + -isElement, + -makeMap, + -map, + -size, + -includes, + -indexOf, + -arrayRemove, + -isLeafNode, + -copy, + -shallowCopy, + -equals, + -csp, + -concat, + -sliceArgs, + -bind, + -toJsonReplacer, + -toJson, + -fromJson, + -toBoolean, + -startingTag, + -tryDecodeURIComponent, + -parseKeyValue, + -toKeyValue, + -encodeUriSegment, + -encodeUriQuery, + -angularInit, + -bootstrap, + -snake_case, + -bindJQuery, + -assertArg, + -assertArgFn, + -assertNotHasOwnProperty, + -getter, + -getBlockElements, + +*/ + +//////////////////////////////////// + +/** + * @ngdoc function + * @name angular.lowercase + * @function + * + * @description Converts the specified string to lowercase. + * @param {string} string String to be converted to lowercase. + * @returns {string} Lowercased string. + */ +var lowercase = function(string){return isString(string) ? string.toLowerCase() : string;}; + + +/** + * @ngdoc function + * @name angular.uppercase + * @function + * + * @description Converts the specified string to uppercase. + * @param {string} string String to be converted to uppercase. + * @returns {string} Uppercased string. + */ +var uppercase = function(string){return isString(string) ? string.toUpperCase() : string;}; + + +var manualLowercase = function(s) { + /* jshint bitwise: false */ + return isString(s) + ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);}) + : s; +}; +var manualUppercase = function(s) { + /* jshint bitwise: false */ + return isString(s) + ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);}) + : s; +}; + + +// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish +// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods +// with correct but slower alternatives. +if ('i' !== 'I'.toLowerCase()) { + lowercase = manualLowercase; + uppercase = manualUppercase; +} + + +var /** holds major version number for IE or NaN for real browsers */ + msie, + jqLite, // delay binding since jQuery could be loaded after us. + jQuery, // delay binding + slice = [].slice, + push = [].push, + toString = Object.prototype.toString, + ngMinErr = minErr('ng'), + + + _angular = window.angular, + /** @name angular */ + angular = window.angular || (window.angular = {}), + angularModule, + nodeName_, + uid = ['0', '0', '0']; + +/** + * IE 11 changed the format of the UserAgent string. + * See http://msdn.microsoft.com/en-us/library/ms537503.aspx + */ +msie = int((/msie (\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]); +if (isNaN(msie)) { + msie = int((/trident\/.*; rv:(\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]); +} + + +/** + * @private + * @param {*} obj + * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments, + * String ...) + */ +function isArrayLike(obj) { + if (obj == null || isWindow(obj)) { + return false; + } + + var length = obj.length; + + if (obj.nodeType === 1 && length) { + return true; + } + + return isString(obj) || isArray(obj) || length === 0 || + typeof length === 'number' && length > 0 && (length - 1) in obj; +} + +/** + * @ngdoc function + * @name angular.forEach + * @function + * + * @description + * Invokes the `iterator` function once for each item in `obj` collection, which can be either an + * object or an array. The `iterator` function is invoked with `iterator(value, key)`, where `value` + * is the value of an object property or an array element and `key` is the object property key or + * array element index. Specifying a `context` for the function is optional. + * + * It is worth nothing that `.forEach` does not iterate over inherited properties because it filters + * using the `hasOwnProperty` method. + * +
                  +     var values = {name: 'misko', gender: 'male'};
                  +     var log = [];
                  +     angular.forEach(values, function(value, key){
                  +       this.push(key + ': ' + value);
                  +     }, log);
                  +     expect(log).toEqual(['name: misko', 'gender:male']);
                  +   
                  + * + * @param {Object|Array} obj Object to iterate over. + * @param {Function} iterator Iterator function. + * @param {Object=} context Object to become context (`this`) for the iterator function. + * @returns {Object|Array} Reference to `obj`. + */ +function forEach(obj, iterator, context) { + var key; + if (obj) { + if (isFunction(obj)){ + for (key in obj) { + // Need to check if hasOwnProperty exists, + // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function + if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { + iterator.call(context, obj[key], key); + } + } + } else if (obj.forEach && obj.forEach !== forEach) { + obj.forEach(iterator, context); + } else if (isArrayLike(obj)) { + for (key = 0; key < obj.length; key++) + iterator.call(context, obj[key], key); + } else { + for (key in obj) { + if (obj.hasOwnProperty(key)) { + iterator.call(context, obj[key], key); + } + } + } + } + return obj; +} + +function sortedKeys(obj) { + var keys = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + keys.push(key); + } + } + return keys.sort(); +} + +function forEachSorted(obj, iterator, context) { + var keys = sortedKeys(obj); + for ( var i = 0; i < keys.length; i++) { + iterator.call(context, obj[keys[i]], keys[i]); + } + return keys; +} + + +/** + * when using forEach the params are value, key, but it is often useful to have key, value. + * @param {function(string, *)} iteratorFn + * @returns {function(*, string)} + */ +function reverseParams(iteratorFn) { + return function(value, key) { iteratorFn(key, value); }; +} + +/** + * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric + * characters such as '012ABC'. The reason why we are not using simply a number counter is that + * the number string gets longer over time, and it can also overflow, where as the nextId + * will grow much slower, it is a string, and it will never overflow. + * + * @returns an unique alpha-numeric string + */ +function nextUid() { + var index = uid.length; + var digit; + + while(index) { + index--; + digit = uid[index].charCodeAt(0); + if (digit == 57 /*'9'*/) { + uid[index] = 'A'; + return uid.join(''); + } + if (digit == 90 /*'Z'*/) { + uid[index] = '0'; + } else { + uid[index] = String.fromCharCode(digit + 1); + return uid.join(''); + } + } + uid.unshift('0'); + return uid.join(''); +} + + +/** + * Set or clear the hashkey for an object. + * @param obj object + * @param h the hashkey (!truthy to delete the hashkey) + */ +function setHashKey(obj, h) { + if (h) { + obj.$$hashKey = h; + } + else { + delete obj.$$hashKey; + } +} + +/** + * @ngdoc function + * @name angular.extend + * @function + * + * @description + * Extends the destination object `dst` by copying all of the properties from the `src` object(s) + * to `dst`. You can specify multiple `src` objects. + * + * @param {Object} dst Destination object. + * @param {...Object} src Source object(s). + * @returns {Object} Reference to `dst`. + */ +function extend(dst) { + var h = dst.$$hashKey; + forEach(arguments, function(obj){ + if (obj !== dst) { + forEach(obj, function(value, key){ + dst[key] = value; + }); + } + }); + + setHashKey(dst,h); + return dst; +} + +function int(str) { + return parseInt(str, 10); +} + + +function inherit(parent, extra) { + return extend(new (extend(function() {}, {prototype:parent}))(), extra); +} + +/** + * @ngdoc function + * @name angular.noop + * @function + * + * @description + * A function that performs no operations. This function can be useful when writing code in the + * functional style. +
                  +     function foo(callback) {
                  +       var result = calculateResult();
                  +       (callback || angular.noop)(result);
                  +     }
                  +   
                  + */ +function noop() {} +noop.$inject = []; + + +/** + * @ngdoc function + * @name angular.identity + * @function + * + * @description + * A function that returns its first argument. This function is useful when writing code in the + * functional style. + * +
                  +     function transformer(transformationFn, value) {
                  +       return (transformationFn || angular.identity)(value);
                  +     };
                  +   
                  + */ +function identity($) {return $;} +identity.$inject = []; + + +function valueFn(value) {return function() {return value;};} + +/** + * @ngdoc function + * @name angular.isUndefined + * @function + * + * @description + * Determines if a reference is undefined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is undefined. + */ +function isUndefined(value){return typeof value === 'undefined';} + + +/** + * @ngdoc function + * @name angular.isDefined + * @function + * + * @description + * Determines if a reference is defined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is defined. + */ +function isDefined(value){return typeof value !== 'undefined';} + + +/** + * @ngdoc function + * @name angular.isObject + * @function + * + * @description + * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not + * considered to be objects. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Object` but not `null`. + */ +function isObject(value){return value != null && typeof value === 'object';} + + +/** + * @ngdoc function + * @name angular.isString + * @function + * + * @description + * Determines if a reference is a `String`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `String`. + */ +function isString(value){return typeof value === 'string';} + + +/** + * @ngdoc function + * @name angular.isNumber + * @function + * + * @description + * Determines if a reference is a `Number`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Number`. + */ +function isNumber(value){return typeof value === 'number';} + + +/** + * @ngdoc function + * @name angular.isDate + * @function + * + * @description + * Determines if a value is a date. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Date`. + */ +function isDate(value){ + return toString.call(value) === '[object Date]'; +} + + +/** + * @ngdoc function + * @name angular.isArray + * @function + * + * @description + * Determines if a reference is an `Array`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Array`. + */ +function isArray(value) { + return toString.call(value) === '[object Array]'; +} + + +/** + * @ngdoc function + * @name angular.isFunction + * @function + * + * @description + * Determines if a reference is a `Function`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Function`. + */ +function isFunction(value){return typeof value === 'function';} + + +/** + * Determines if a value is a regular expression object. + * + * @private + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `RegExp`. + */ +function isRegExp(value) { + return toString.call(value) === '[object RegExp]'; +} + + +/** + * Checks if `obj` is a window object. + * + * @private + * @param {*} obj Object to check + * @returns {boolean} True if `obj` is a window obj. + */ +function isWindow(obj) { + return obj && obj.document && obj.location && obj.alert && obj.setInterval; +} + + +function isScope(obj) { + return obj && obj.$evalAsync && obj.$watch; +} + + +function isFile(obj) { + return toString.call(obj) === '[object File]'; +} + + +function isBoolean(value) { + return typeof value === 'boolean'; +} + + +var trim = (function() { + // native trim is way faster: http://jsperf.com/angular-trim-test + // but IE doesn't have it... :-( + // TODO: we should move this into IE/ES5 polyfill + if (!String.prototype.trim) { + return function(value) { + return isString(value) ? value.replace(/^\s\s*/, '').replace(/\s\s*$/, '') : value; + }; + } + return function(value) { + return isString(value) ? value.trim() : value; + }; +})(); + + +/** + * @ngdoc function + * @name angular.isElement + * @function + * + * @description + * Determines if a reference is a DOM element (or wrapped jQuery element). + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element). + */ +function isElement(node) { + return !!(node && + (node.nodeName // we are a direct element + || (node.on && node.find))); // we have an on and find method part of jQuery API +} + +/** + * @param str 'key1,key2,...' + * @returns {object} in the form of {key1:true, key2:true, ...} + */ +function makeMap(str){ + var obj = {}, items = str.split(","), i; + for ( i = 0; i < items.length; i++ ) + obj[ items[i] ] = true; + return obj; +} + + +if (msie < 9) { + nodeName_ = function(element) { + element = element.nodeName ? element : element[0]; + return (element.scopeName && element.scopeName != 'HTML') + ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName; + }; +} else { + nodeName_ = function(element) { + return element.nodeName ? element.nodeName : element[0].nodeName; + }; +} + + +function map(obj, iterator, context) { + var results = []; + forEach(obj, function(value, index, list) { + results.push(iterator.call(context, value, index, list)); + }); + return results; +} + + +/** + * @description + * Determines the number of elements in an array, the number of properties an object has, or + * the length of a string. + * + * Note: This function is used to augment the Object type in Angular expressions. See + * {@link angular.Object} for more information about Angular arrays. + * + * @param {Object|Array|string} obj Object, array, or string to inspect. + * @param {boolean} [ownPropsOnly=false] Count only "own" properties in an object + * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array. + */ +function size(obj, ownPropsOnly) { + var count = 0, key; + + if (isArray(obj) || isString(obj)) { + return obj.length; + } else if (isObject(obj)){ + for (key in obj) + if (!ownPropsOnly || obj.hasOwnProperty(key)) + count++; + } + + return count; +} + + +function includes(array, obj) { + return indexOf(array, obj) != -1; +} + +function indexOf(array, obj) { + if (array.indexOf) return array.indexOf(obj); + + for (var i = 0; i < array.length; i++) { + if (obj === array[i]) return i; + } + return -1; +} + +function arrayRemove(array, value) { + var index = indexOf(array, value); + if (index >=0) + array.splice(index, 1); + return value; +} + +function isLeafNode (node) { + if (node) { + switch (node.nodeName) { + case "OPTION": + case "PRE": + case "TITLE": + return true; + } + } + return false; +} + +/** + * @ngdoc function + * @name angular.copy + * @function + * + * @description + * Creates a deep copy of `source`, which should be an object or an array. + * + * * If no destination is supplied, a copy of the object or array is created. + * * If a destination is provided, all of its elements (for array) or properties (for objects) + * are deleted and then all elements/properties from the source are copied to it. + * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned. + * * If `source` is identical to 'destination' an exception will be thrown. + * + * @param {*} source The source that will be used to make a copy. + * Can be any type, including primitives, `null`, and `undefined`. + * @param {(Object|Array)=} destination Destination into which the source is copied. If + * provided, must be of the same type as `source`. + * @returns {*} The copy or updated `destination`, if `destination` was specified. + * + * @example + + +
                  +
                  + Name:
                  + E-mail:
                  + Gender: male + female
                  + + +
                  +
                  form = {{user | json}}
                  +
                  master = {{master | json}}
                  +
                  + + +
                  +
                  + */ +function copy(source, destination){ + if (isWindow(source) || isScope(source)) { + throw ngMinErr('cpws', + "Can't copy! Making copies of Window or Scope instances is not supported."); + } + + if (!destination) { + destination = source; + if (source) { + if (isArray(source)) { + destination = copy(source, []); + } else if (isDate(source)) { + destination = new Date(source.getTime()); + } else if (isRegExp(source)) { + destination = new RegExp(source.source); + } else if (isObject(source)) { + destination = copy(source, {}); + } + } + } else { + if (source === destination) throw ngMinErr('cpi', + "Can't copy! Source and destination are identical."); + if (isArray(source)) { + destination.length = 0; + for ( var i = 0; i < source.length; i++) { + destination.push(copy(source[i])); + } + } else { + var h = destination.$$hashKey; + forEach(destination, function(value, key){ + delete destination[key]; + }); + for ( var key in source) { + destination[key] = copy(source[key]); + } + setHashKey(destination,h); + } + } + return destination; +} + +/** + * Create a shallow copy of an object + */ +function shallowCopy(src, dst) { + dst = dst || {}; + + for(var key in src) { + // shallowCopy is only ever called by $compile nodeLinkFn, which has control over src + // so we don't need to worry about using our custom hasOwnProperty here + if (src.hasOwnProperty(key) && key.charAt(0) !== '$' && key.charAt(1) !== '$') { + dst[key] = src[key]; + } + } + + return dst; +} + + +/** + * @ngdoc function + * @name angular.equals + * @function + * + * @description + * Determines if two objects or two values are equivalent. Supports value types, regular + * expressions, arrays and objects. + * + * Two objects or values are considered equivalent if at least one of the following is true: + * + * * Both objects or values pass `===` comparison. + * * Both objects or values are of the same type and all of their properties are equal by + * comparing them with `angular.equals`. + * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal) + * * Both values represent the same regular expression (In JavasScript, + * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual + * representation matches). + * + * During a property comparison, properties of `function` type and properties with names + * that begin with `$` are ignored. + * + * Scope and DOMWindow objects are being compared only by identify (`===`). + * + * @param {*} o1 Object or value to compare. + * @param {*} o2 Object or value to compare. + * @returns {boolean} True if arguments are equal. + */ +function equals(o1, o2) { + if (o1 === o2) return true; + if (o1 === null || o2 === null) return false; + if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN + var t1 = typeof o1, t2 = typeof o2, length, key, keySet; + if (t1 == t2) { + if (t1 == 'object') { + if (isArray(o1)) { + if (!isArray(o2)) return false; + if ((length = o1.length) == o2.length) { + for(key=0; key 2 ? sliceArgs(arguments, 2) : []; + if (isFunction(fn) && !(fn instanceof RegExp)) { + return curryArgs.length + ? function() { + return arguments.length + ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0))) + : fn.apply(self, curryArgs); + } + : function() { + return arguments.length + ? fn.apply(self, arguments) + : fn.call(self); + }; + } else { + // in IE, native methods are not functions so they cannot be bound (note: they don't need to be) + return fn; + } +} + + +function toJsonReplacer(key, value) { + var val = value; + + if (typeof key === 'string' && key.charAt(0) === '$') { + val = undefined; + } else if (isWindow(value)) { + val = '$WINDOW'; + } else if (value && document === value) { + val = '$DOCUMENT'; + } else if (isScope(value)) { + val = '$SCOPE'; + } + + return val; +} + + +/** + * @ngdoc function + * @name angular.toJson + * @function + * + * @description + * Serializes input into a JSON-formatted string. Properties with leading $ characters will be + * stripped since angular uses this notation internally. + * + * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. + * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace. + * @returns {string|undefined} JSON-ified string representing `obj`. + */ +function toJson(obj, pretty) { + if (typeof obj === 'undefined') return undefined; + return JSON.stringify(obj, toJsonReplacer, pretty ? ' ' : null); +} + + +/** + * @ngdoc function + * @name angular.fromJson + * @function + * + * @description + * Deserializes a JSON string. + * + * @param {string} json JSON string to deserialize. + * @returns {Object|Array|Date|string|number} Deserialized thingy. + */ +function fromJson(json) { + return isString(json) + ? JSON.parse(json) + : json; +} + + +function toBoolean(value) { + if (typeof value === 'function') { + value = true; + } else if (value && value.length !== 0) { + var v = lowercase("" + value); + value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]'); + } else { + value = false; + } + return value; +} + +/** + * @returns {string} Returns the string representation of the element. + */ +function startingTag(element) { + element = jqLite(element).clone(); + try { + // turns out IE does not let you set .html() on elements which + // are not allowed to have children. So we just ignore it. + element.empty(); + } catch(e) {} + // As Per DOM Standards + var TEXT_NODE = 3; + var elemHtml = jqLite('
                  ').append(element).html(); + try { + return element[0].nodeType === TEXT_NODE ? lowercase(elemHtml) : + elemHtml. + match(/^(<[^>]+>)/)[1]. + replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); }); + } catch(e) { + return lowercase(elemHtml); + } + +} + + +///////////////////////////////////////////////// + +/** + * Tries to decode the URI component without throwing an exception. + * + * @private + * @param str value potential URI component to check. + * @returns {boolean} True if `value` can be decoded + * with the decodeURIComponent function. + */ +function tryDecodeURIComponent(value) { + try { + return decodeURIComponent(value); + } catch(e) { + // Ignore any invalid uri component + } +} + + +/** + * Parses an escaped url query string into key-value pairs. + * @returns Object.<(string|boolean)> + */ +function parseKeyValue(/**string*/keyValue) { + var obj = {}, key_value, key; + forEach((keyValue || "").split('&'), function(keyValue){ + if ( keyValue ) { + key_value = keyValue.split('='); + key = tryDecodeURIComponent(key_value[0]); + if ( isDefined(key) ) { + var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true; + if (!obj[key]) { + obj[key] = val; + } else if(isArray(obj[key])) { + obj[key].push(val); + } else { + obj[key] = [obj[key],val]; + } + } + } + }); + return obj; +} + +function toKeyValue(obj) { + var parts = []; + forEach(obj, function(value, key) { + if (isArray(value)) { + forEach(value, function(arrayValue) { + parts.push(encodeUriQuery(key, true) + + (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true))); + }); + } else { + parts.push(encodeUriQuery(key, true) + + (value === true ? '' : '=' + encodeUriQuery(value, true))); + } + }); + return parts.length ? parts.join('&') : ''; +} + + +/** + * We need our custom method because encodeURIComponent is too aggressive and doesn't follow + * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path + * segments: + * segment = *pchar + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * pct-encoded = "%" HEXDIG HEXDIG + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriSegment(val) { + return encodeUriQuery(val, true). + replace(/%26/gi, '&'). + replace(/%3D/gi, '='). + replace(/%2B/gi, '+'); +} + + +/** + * This method is intended for encoding *key* or *value* parts of query component. We need a custom + * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be + * encoded per http://tools.ietf.org/html/rfc3986: + * query = *( pchar / "/" / "?" ) + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * pct-encoded = "%" HEXDIG HEXDIG + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriQuery(val, pctEncodeSpaces) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); +} + + +/** + * @ngdoc directive + * @name ng.directive:ngApp + * + * @element ANY + * @param {angular.Module} ngApp an optional application + * {@link angular.module module} name to load. + * + * @description + * + * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive + * designates the **root element** of the application and is typically placed near the root element + * of the page - e.g. on the `` or `` tags. + * + * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp` + * found in the document will be used to define the root element to auto-bootstrap as an + * application. To run multiple applications in an HTML document you must manually bootstrap them using + * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other. + * + * You can specify an **AngularJS module** to be used as the root module for the application. This + * module will be loaded into the {@link AUTO.$injector} when the application is bootstrapped and + * should contain the application code needed or have dependencies on other modules that will + * contain the code. See {@link angular.module} for more information. + * + * In the example below if the `ngApp` directive were not placed on the `html` element then the + * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}` + * would not be resolved to `3`. + * + * `ngApp` is the easiest, and most common, way to bootstrap an application. + * + + +
                  + I can add: {{a}} + {{b}} = {{ a+b }} + + + angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) { + $scope.a = 1; + $scope.b = 2; + }); + + + * + */ +function angularInit(element, bootstrap) { + var elements = [element], + appElement, + module, + names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'], + NG_APP_CLASS_REGEXP = /\sng[:\-]app(:\s*([\w\d_]+);?)?\s/; + + function append(element) { + element && elements.push(element); + } + + forEach(names, function(name) { + names[name] = true; + append(document.getElementById(name)); + name = name.replace(':', '\\:'); + if (element.querySelectorAll) { + forEach(element.querySelectorAll('.' + name), append); + forEach(element.querySelectorAll('.' + name + '\\:'), append); + forEach(element.querySelectorAll('[' + name + ']'), append); + } + }); + + forEach(elements, function(element) { + if (!appElement) { + var className = ' ' + element.className + ' '; + var match = NG_APP_CLASS_REGEXP.exec(className); + if (match) { + appElement = element; + module = (match[2] || '').replace(/\s+/g, ','); + } else { + forEach(element.attributes, function(attr) { + if (!appElement && names[attr.name]) { + appElement = element; + module = attr.value; + } + }); + } + } + }); + if (appElement) { + bootstrap(appElement, module ? [module] : []); + } +} + +/** + * @ngdoc function + * @name angular.bootstrap + * @description + * Use this function to manually start up angular application. + * + * See: {@link guide/bootstrap Bootstrap} + * + * Note that ngScenario-based end-to-end tests cannot use this function to bootstrap manually. + * They must use {@link api/ng.directive:ngApp ngApp}. + * + * @param {Element} element DOM element which is the root of angular application. + * @param {Array=} modules an array of modules to load into the application. + * Each item in the array should be the name of a predefined module or a (DI annotated) + * function that will be invoked by the injector as a run block. + * See: {@link angular.module modules} + * @returns {AUTO.$injector} Returns the newly created injector for this app. + */ +function bootstrap(element, modules) { + var doBootstrap = function() { + element = jqLite(element); + + if (element.injector()) { + var tag = (element[0] === document) ? 'document' : startingTag(element); + throw ngMinErr('btstrpd', "App Already Bootstrapped with this Element '{0}'", tag); + } + + modules = modules || []; + modules.unshift(['$provide', function($provide) { + $provide.value('$rootElement', element); + }]); + modules.unshift('ng'); + var injector = createInjector(modules); + injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', '$animate', + function(scope, element, compile, injector, animate) { + scope.$apply(function() { + element.data('$injector', injector); + compile(element)(scope); + }); + }] + ); + return injector; + }; + + var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; + + if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) { + return doBootstrap(); + } + + window.name = window.name.replace(NG_DEFER_BOOTSTRAP, ''); + angular.resumeBootstrap = function(extraModules) { + forEach(extraModules, function(module) { + modules.push(module); + }); + doBootstrap(); + }; +} + +var SNAKE_CASE_REGEXP = /[A-Z]/g; +function snake_case(name, separator){ + separator = separator || '_'; + return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { + return (pos ? separator : '') + letter.toLowerCase(); + }); +} + +function bindJQuery() { + // bind to jQuery if present; + jQuery = window.jQuery; + // reset to jQuery or default to us. + if (jQuery) { + jqLite = jQuery; + extend(jQuery.fn, { + scope: JQLitePrototype.scope, + isolateScope: JQLitePrototype.isolateScope, + controller: JQLitePrototype.controller, + injector: JQLitePrototype.injector, + inheritedData: JQLitePrototype.inheritedData + }); + // Method signature: + // jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments) + jqLitePatchJQueryRemove('remove', true, true, false); + jqLitePatchJQueryRemove('empty', false, false, false); + jqLitePatchJQueryRemove('html', false, false, true); + } else { + jqLite = JQLite; + } + angular.element = jqLite; +} + +/** + * throw error if the argument is falsy. + */ +function assertArg(arg, name, reason) { + if (!arg) { + throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); + } + return arg; +} + +function assertArgFn(arg, name, acceptArrayAnnotation) { + if (acceptArrayAnnotation && isArray(arg)) { + arg = arg[arg.length - 1]; + } + + assertArg(isFunction(arg), name, 'not a function, got ' + + (arg && typeof arg == 'object' ? arg.constructor.name || 'Object' : typeof arg)); + return arg; +} + +/** + * throw error if the name given is hasOwnProperty + * @param {String} name the name to test + * @param {String} context the context in which the name is used, such as module or directive + */ +function assertNotHasOwnProperty(name, context) { + if (name === 'hasOwnProperty') { + throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context); + } +} + +/** + * Return the value accessible from the object by path. Any undefined traversals are ignored + * @param {Object} obj starting object + * @param {string} path path to traverse + * @param {boolean=true} bindFnToScope + * @returns value as accessible by path + */ +//TODO(misko): this function needs to be removed +function getter(obj, path, bindFnToScope) { + if (!path) return obj; + var keys = path.split('.'); + var key; + var lastInstance = obj; + var len = keys.length; + + for (var i = 0; i < len; i++) { + key = keys[i]; + if (obj) { + obj = (lastInstance = obj)[key]; + } + } + if (!bindFnToScope && isFunction(obj)) { + return bind(lastInstance, obj); + } + return obj; +} + +/** + * Return the DOM siblings between the first and last node in the given array. + * @param {Array} array like object + * @returns jQlite object containing the elements + */ +function getBlockElements(nodes) { + var startNode = nodes[0], + endNode = nodes[nodes.length - 1]; + if (startNode === endNode) { + return jqLite(startNode); + } + + var element = startNode; + var elements = [element]; + + do { + element = element.nextSibling; + if (!element) break; + elements.push(element); + } while (element !== endNode); + + return jqLite(elements); +} + +/** + * @ngdoc interface + * @name angular.Module + * @description + * + * Interface for configuring angular {@link angular.module modules}. + */ + +function setupModuleLoader(window) { + + var $injectorMinErr = minErr('$injector'); + var ngMinErr = minErr('ng'); + + function ensure(obj, name, factory) { + return obj[name] || (obj[name] = factory()); + } + + var angular = ensure(window, 'angular', Object); + + // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap + angular.$$minErr = angular.$$minErr || minErr; + + return ensure(angular, 'module', function() { + /** @type {Object.} */ + var modules = {}; + + /** + * @ngdoc function + * @name angular.module + * @description + * + * The `angular.module` is a global place for creating, registering and retrieving Angular + * modules. + * All modules (angular core or 3rd party) that should be available to an application must be + * registered using this mechanism. + * + * When passed two or more arguments, a new module is created. If passed only one argument, an + * existing module (the name passed as the first argument to `module`) is retrieved. + * + * + * # Module + * + * A module is a collection of services, directives, filters, and configuration information. + * `angular.module` is used to configure the {@link AUTO.$injector $injector}. + * + *
                  +     * // Create a new module
                  +     * var myModule = angular.module('myModule', []);
                  +     *
                  +     * // register a new service
                  +     * myModule.value('appName', 'MyCoolApp');
                  +     *
                  +     * // configure existing services inside initialization blocks.
                  +     * myModule.config(function($locationProvider) {
                  +     *   // Configure existing providers
                  +     *   $locationProvider.hashPrefix('!');
                  +     * });
                  +     * 
                  + * + * Then you can create an injector and load your modules like this: + * + *
                  +     * var injector = angular.injector(['ng', 'MyModule'])
                  +     * 
                  + * + * However it's more likely that you'll just use + * {@link ng.directive:ngApp ngApp} or + * {@link angular.bootstrap} to simplify this process for you. + * + * @param {!string} name The name of the module to create or retrieve. + * @param {Array.=} requires If specified then new module is being created. If + * unspecified then the the module is being retrieved for further configuration. + * @param {Function} configFn Optional configuration function for the module. Same as + * {@link angular.Module#methods_config Module#config()}. + * @returns {module} new module with the {@link angular.Module} api. + */ + return function module(name, requires, configFn) { + var assertNotHasOwnProperty = function(name, context) { + if (name === 'hasOwnProperty') { + throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context); + } + }; + + assertNotHasOwnProperty(name, 'module'); + if (requires && modules.hasOwnProperty(name)) { + modules[name] = null; + } + return ensure(modules, name, function() { + if (!requires) { + throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + + "the module name or forgot to load it. If registering a module ensure that you " + + "specify the dependencies as the second argument.", name); + } + + /** @type {!Array.>} */ + var invokeQueue = []; + + /** @type {!Array.} */ + var runBlocks = []; + + var config = invokeLater('$injector', 'invoke'); + + /** @type {angular.Module} */ + var moduleInstance = { + // Private state + _invokeQueue: invokeQueue, + _runBlocks: runBlocks, + + /** + * @ngdoc property + * @name angular.Module#requires + * @propertyOf angular.Module + * @returns {Array.} List of module names which must be loaded before this module. + * @description + * Holds the list of modules which the injector will load before the current module is + * loaded. + */ + requires: requires, + + /** + * @ngdoc property + * @name angular.Module#name + * @propertyOf angular.Module + * @returns {string} Name of the module. + * @description + */ + name: name, + + + /** + * @ngdoc method + * @name angular.Module#provider + * @methodOf angular.Module + * @param {string} name service name + * @param {Function} providerType Construction function for creating new instance of the + * service. + * @description + * See {@link AUTO.$provide#provider $provide.provider()}. + */ + provider: invokeLater('$provide', 'provider'), + + /** + * @ngdoc method + * @name angular.Module#factory + * @methodOf angular.Module + * @param {string} name service name + * @param {Function} providerFunction Function for creating new instance of the service. + * @description + * See {@link AUTO.$provide#factory $provide.factory()}. + */ + factory: invokeLater('$provide', 'factory'), + + /** + * @ngdoc method + * @name angular.Module#service + * @methodOf angular.Module + * @param {string} name service name + * @param {Function} constructor A constructor function that will be instantiated. + * @description + * See {@link AUTO.$provide#service $provide.service()}. + */ + service: invokeLater('$provide', 'service'), + + /** + * @ngdoc method + * @name angular.Module#value + * @methodOf angular.Module + * @param {string} name service name + * @param {*} object Service instance object. + * @description + * See {@link AUTO.$provide#value $provide.value()}. + */ + value: invokeLater('$provide', 'value'), + + /** + * @ngdoc method + * @name angular.Module#constant + * @methodOf angular.Module + * @param {string} name constant name + * @param {*} object Constant value. + * @description + * Because the constant are fixed, they get applied before other provide methods. + * See {@link AUTO.$provide#constant $provide.constant()}. + */ + constant: invokeLater('$provide', 'constant', 'unshift'), + + /** + * @ngdoc method + * @name angular.Module#animation + * @methodOf angular.Module + * @param {string} name animation name + * @param {Function} animationFactory Factory function for creating new instance of an + * animation. + * @description + * + * **NOTE**: animations take effect only if the **ngAnimate** module is loaded. + * + * + * Defines an animation hook that can be later used with + * {@link ngAnimate.$animate $animate} service and directives that use this service. + * + *
                  +           * module.animation('.animation-name', function($inject1, $inject2) {
                  +           *   return {
                  +           *     eventName : function(element, done) {
                  +           *       //code to run the animation
                  +           *       //once complete, then run done()
                  +           *       return function cancellationFunction(element) {
                  +           *         //code to cancel the animation
                  +           *       }
                  +           *     }
                  +           *   }
                  +           * })
                  +           * 
                  + * + * See {@link ngAnimate.$animateProvider#register $animateProvider.register()} and + * {@link ngAnimate ngAnimate module} for more information. + */ + animation: invokeLater('$animateProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#filter + * @methodOf angular.Module + * @param {string} name Filter name. + * @param {Function} filterFactory Factory function for creating new instance of filter. + * @description + * See {@link ng.$filterProvider#register $filterProvider.register()}. + */ + filter: invokeLater('$filterProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#controller + * @methodOf angular.Module + * @param {string|Object} name Controller name, or an object map of controllers where the + * keys are the names and the values are the constructors. + * @param {Function} constructor Controller constructor function. + * @description + * See {@link ng.$controllerProvider#register $controllerProvider.register()}. + */ + controller: invokeLater('$controllerProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#directive + * @methodOf angular.Module + * @param {string|Object} name Directive name, or an object map of directives where the + * keys are the names and the values are the factories. + * @param {Function} directiveFactory Factory function for creating new instance of + * directives. + * @description + * See {@link ng.$compileProvider#methods_directive $compileProvider.directive()}. + */ + directive: invokeLater('$compileProvider', 'directive'), + + /** + * @ngdoc method + * @name angular.Module#config + * @methodOf angular.Module + * @param {Function} configFn Execute this function on module load. Useful for service + * configuration. + * @description + * Use this method to register work which needs to be performed on module loading. + */ + config: config, + + /** + * @ngdoc method + * @name angular.Module#run + * @methodOf angular.Module + * @param {Function} initializationFn Execute this function after injector creation. + * Useful for application initialization. + * @description + * Use this method to register work which should be performed when the injector is done + * loading all modules. + */ + run: function(block) { + runBlocks.push(block); + return this; + } + }; + + if (configFn) { + config(configFn); + } + + return moduleInstance; + + /** + * @param {string} provider + * @param {string} method + * @param {String=} insertMethod + * @returns {angular.Module} + */ + function invokeLater(provider, method, insertMethod) { + return function() { + invokeQueue[insertMethod || 'push']([provider, method, arguments]); + return moduleInstance; + }; + } + }); + }; + }); + +} + +/* global + angularModule: true, + version: true, + + $LocaleProvider, + $CompileProvider, + + htmlAnchorDirective, + inputDirective, + inputDirective, + formDirective, + scriptDirective, + selectDirective, + styleDirective, + optionDirective, + ngBindDirective, + ngBindHtmlDirective, + ngBindTemplateDirective, + ngClassDirective, + ngClassEvenDirective, + ngClassOddDirective, + ngCspDirective, + ngCloakDirective, + ngControllerDirective, + ngFormDirective, + ngHideDirective, + ngIfDirective, + ngIncludeDirective, + ngIncludeFillContentDirective, + ngInitDirective, + ngNonBindableDirective, + ngPluralizeDirective, + ngRepeatDirective, + ngShowDirective, + ngStyleDirective, + ngSwitchDirective, + ngSwitchWhenDirective, + ngSwitchDefaultDirective, + ngOptionsDirective, + ngTranscludeDirective, + ngModelDirective, + ngListDirective, + ngChangeDirective, + requiredDirective, + requiredDirective, + ngValueDirective, + ngAttributeAliasDirectives, + ngEventDirectives, + + $AnchorScrollProvider, + $AnimateProvider, + $BrowserProvider, + $CacheFactoryProvider, + $ControllerProvider, + $DocumentProvider, + $ExceptionHandlerProvider, + $FilterProvider, + $InterpolateProvider, + $IntervalProvider, + $HttpProvider, + $HttpBackendProvider, + $LocationProvider, + $LogProvider, + $ParseProvider, + $RootScopeProvider, + $QProvider, + $$SanitizeUriProvider, + $SceProvider, + $SceDelegateProvider, + $SnifferProvider, + $TemplateCacheProvider, + $TimeoutProvider, + $WindowProvider +*/ + + +/** + * @ngdoc property + * @name angular.version + * @description + * An object that contains information about the current AngularJS version. This object has the + * following properties: + * + * - `full` – `{string}` – Full version string, such as "0.9.18". + * - `major` – `{number}` – Major version number, such as "0". + * - `minor` – `{number}` – Minor version number, such as "9". + * - `dot` – `{number}` – Dot version number, such as "18". + * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". + */ +var version = { + full: '1.2.9', // all of these placeholder strings will be replaced by grunt's + major: 1, // package task + minor: 2, + dot: 9, + codeName: 'enchanted-articulacy' +}; + + +function publishExternalAPI(angular){ + extend(angular, { + 'bootstrap': bootstrap, + 'copy': copy, + 'extend': extend, + 'equals': equals, + 'element': jqLite, + 'forEach': forEach, + 'injector': createInjector, + 'noop':noop, + 'bind':bind, + 'toJson': toJson, + 'fromJson': fromJson, + 'identity':identity, + 'isUndefined': isUndefined, + 'isDefined': isDefined, + 'isString': isString, + 'isFunction': isFunction, + 'isObject': isObject, + 'isNumber': isNumber, + 'isElement': isElement, + 'isArray': isArray, + 'version': version, + 'isDate': isDate, + 'lowercase': lowercase, + 'uppercase': uppercase, + 'callbacks': {counter: 0}, + '$$minErr': minErr, + '$$csp': csp + }); + + angularModule = setupModuleLoader(window); + try { + angularModule('ngLocale'); + } catch (e) { + angularModule('ngLocale', []).provider('$locale', $LocaleProvider); + } + + angularModule('ng', ['ngLocale'], ['$provide', + function ngModule($provide) { + // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it. + $provide.provider({ + $$sanitizeUri: $$SanitizeUriProvider + }); + $provide.provider('$compile', $CompileProvider). + directive({ + a: htmlAnchorDirective, + input: inputDirective, + textarea: inputDirective, + form: formDirective, + script: scriptDirective, + select: selectDirective, + style: styleDirective, + option: optionDirective, + ngBind: ngBindDirective, + ngBindHtml: ngBindHtmlDirective, + ngBindTemplate: ngBindTemplateDirective, + ngClass: ngClassDirective, + ngClassEven: ngClassEvenDirective, + ngClassOdd: ngClassOddDirective, + ngCloak: ngCloakDirective, + ngController: ngControllerDirective, + ngForm: ngFormDirective, + ngHide: ngHideDirective, + ngIf: ngIfDirective, + ngInclude: ngIncludeDirective, + ngInit: ngInitDirective, + ngNonBindable: ngNonBindableDirective, + ngPluralize: ngPluralizeDirective, + ngRepeat: ngRepeatDirective, + ngShow: ngShowDirective, + ngStyle: ngStyleDirective, + ngSwitch: ngSwitchDirective, + ngSwitchWhen: ngSwitchWhenDirective, + ngSwitchDefault: ngSwitchDefaultDirective, + ngOptions: ngOptionsDirective, + ngTransclude: ngTranscludeDirective, + ngModel: ngModelDirective, + ngList: ngListDirective, + ngChange: ngChangeDirective, + required: requiredDirective, + ngRequired: requiredDirective, + ngValue: ngValueDirective + }). + directive({ + ngInclude: ngIncludeFillContentDirective + }). + directive(ngAttributeAliasDirectives). + directive(ngEventDirectives); + $provide.provider({ + $anchorScroll: $AnchorScrollProvider, + $animate: $AnimateProvider, + $browser: $BrowserProvider, + $cacheFactory: $CacheFactoryProvider, + $controller: $ControllerProvider, + $document: $DocumentProvider, + $exceptionHandler: $ExceptionHandlerProvider, + $filter: $FilterProvider, + $interpolate: $InterpolateProvider, + $interval: $IntervalProvider, + $http: $HttpProvider, + $httpBackend: $HttpBackendProvider, + $location: $LocationProvider, + $log: $LogProvider, + $parse: $ParseProvider, + $rootScope: $RootScopeProvider, + $q: $QProvider, + $sce: $SceProvider, + $sceDelegate: $SceDelegateProvider, + $sniffer: $SnifferProvider, + $templateCache: $TemplateCacheProvider, + $timeout: $TimeoutProvider, + $window: $WindowProvider + }); + } + ]); +} + +/* global + + -JQLitePrototype, + -addEventListenerFn, + -removeEventListenerFn, + -BOOLEAN_ATTR +*/ + +////////////////////////////////// +//JQLite +////////////////////////////////// + +/** + * @ngdoc function + * @name angular.element + * @function + * + * @description + * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. + * + * If jQuery is available, `angular.element` is an alias for the + * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element` + * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or "jqLite." + * + *
                  jqLite is a tiny, API-compatible subset of jQuery that allows + * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most + * commonly needed functionality with the goal of having a very small footprint.
                  + * + * To use jQuery, simply load it before `DOMContentLoaded` event fired. + * + *
                  **Note:** all element references in Angular are always wrapped with jQuery or + * jqLite; they are never raw DOM references.
                  + * + * ## Angular's jqLite + * jqLite provides only the following jQuery methods: + * + * - [`addClass()`](http://api.jquery.com/addClass/) + * - [`after()`](http://api.jquery.com/after/) + * - [`append()`](http://api.jquery.com/append/) + * - [`attr()`](http://api.jquery.com/attr/) + * - [`bind()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData + * - [`children()`](http://api.jquery.com/children/) - Does not support selectors + * - [`clone()`](http://api.jquery.com/clone/) + * - [`contents()`](http://api.jquery.com/contents/) + * - [`css()`](http://api.jquery.com/css/) + * - [`data()`](http://api.jquery.com/data/) + * - [`empty()`](http://api.jquery.com/empty/) + * - [`eq()`](http://api.jquery.com/eq/) + * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name + * - [`hasClass()`](http://api.jquery.com/hasClass/) + * - [`html()`](http://api.jquery.com/html/) + * - [`next()`](http://api.jquery.com/next/) - Does not support selectors + * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData + * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors + * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors + * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors + * - [`prepend()`](http://api.jquery.com/prepend/) + * - [`prop()`](http://api.jquery.com/prop/) + * - [`ready()`](http://api.jquery.com/ready/) + * - [`remove()`](http://api.jquery.com/remove/) + * - [`removeAttr()`](http://api.jquery.com/removeAttr/) + * - [`removeClass()`](http://api.jquery.com/removeClass/) + * - [`removeData()`](http://api.jquery.com/removeData/) + * - [`replaceWith()`](http://api.jquery.com/replaceWith/) + * - [`text()`](http://api.jquery.com/text/) + * - [`toggleClass()`](http://api.jquery.com/toggleClass/) + * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers. + * - [`unbind()`](http://api.jquery.com/off/) - Does not support namespaces + * - [`val()`](http://api.jquery.com/val/) + * - [`wrap()`](http://api.jquery.com/wrap/) + * + * ## jQuery/jqLite Extras + * Angular also provides the following additional methods and events to both jQuery and jqLite: + * + * ### Events + * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event + * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM + * element before it is removed. + * + * ### Methods + * - `controller(name)` - retrieves the controller of the current element or its parent. By default + * retrieves controller associated with the `ngController` directive. If `name` is provided as + * camelCase directive name, then the controller for this directive will be retrieved (e.g. + * `'ngModel'`). + * - `injector()` - retrieves the injector of the current element or its parent. + * - `scope()` - retrieves the {@link api/ng.$rootScope.Scope scope} of the current + * element or its parent. + * - `isolateScope()` - retrieves an isolate {@link api/ng.$rootScope.Scope scope} if one is attached directly to the + * current element. This getter should be used only on elements that contain a directive which starts a new isolate + * scope. Calling `scope()` on this element always returns the original non-isolate scope. + * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top + * parent element is reached. + * + * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery. + * @returns {Object} jQuery object. + */ + +var jqCache = JQLite.cache = {}, + jqName = JQLite.expando = 'ng-' + new Date().getTime(), + jqId = 1, + addEventListenerFn = (window.document.addEventListener + ? function(element, type, fn) {element.addEventListener(type, fn, false);} + : function(element, type, fn) {element.attachEvent('on' + type, fn);}), + removeEventListenerFn = (window.document.removeEventListener + ? function(element, type, fn) {element.removeEventListener(type, fn, false); } + : function(element, type, fn) {element.detachEvent('on' + type, fn); }); + +function jqNextId() { return ++jqId; } + + +var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; +var MOZ_HACK_REGEXP = /^moz([A-Z])/; +var jqLiteMinErr = minErr('jqLite'); + +/** + * Converts snake_case to camelCase. + * Also there is special case for Moz prefix starting with upper case letter. + * @param name Name to normalize + */ +function camelCase(name) { + return name. + replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { + return offset ? letter.toUpperCase() : letter; + }). + replace(MOZ_HACK_REGEXP, 'Moz$1'); +} + +///////////////////////////////////////////// +// jQuery mutation patch +// +// In conjunction with bindJQuery intercepts all jQuery's DOM destruction apis and fires a +// $destroy event on all DOM nodes being removed. +// +///////////////////////////////////////////// + +function jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments) { + var originalJqFn = jQuery.fn[name]; + originalJqFn = originalJqFn.$original || originalJqFn; + removePatch.$original = originalJqFn; + jQuery.fn[name] = removePatch; + + function removePatch(param) { + // jshint -W040 + var list = filterElems && param ? [this.filter(param)] : [this], + fireEvent = dispatchThis, + set, setIndex, setLength, + element, childIndex, childLength, children; + + if (!getterIfNoArguments || param != null) { + while(list.length) { + set = list.shift(); + for(setIndex = 0, setLength = set.length; setIndex < setLength; setIndex++) { + element = jqLite(set[setIndex]); + if (fireEvent) { + element.triggerHandler('$destroy'); + } else { + fireEvent = !fireEvent; + } + for(childIndex = 0, childLength = (children = element.children()).length; + childIndex < childLength; + childIndex++) { + list.push(jQuery(children[childIndex])); + } + } + } + } + return originalJqFn.apply(this, arguments); + } +} + +///////////////////////////////////////////// +function JQLite(element) { + if (element instanceof JQLite) { + return element; + } + if (!(this instanceof JQLite)) { + if (isString(element) && element.charAt(0) != '<') { + throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element'); + } + return new JQLite(element); + } + + if (isString(element)) { + var div = document.createElement('div'); + // Read about the NoScope elements here: + // http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx + div.innerHTML = '
                   
                  ' + element; // IE insanity to make NoScope elements work! + div.removeChild(div.firstChild); // remove the superfluous div + jqLiteAddNodes(this, div.childNodes); + var fragment = jqLite(document.createDocumentFragment()); + fragment.append(this); // detach the elements from the temporary DOM div. + } else { + jqLiteAddNodes(this, element); + } +} + +function jqLiteClone(element) { + return element.cloneNode(true); +} + +function jqLiteDealoc(element){ + jqLiteRemoveData(element); + for ( var i = 0, children = element.childNodes || []; i < children.length; i++) { + jqLiteDealoc(children[i]); + } +} + +function jqLiteOff(element, type, fn, unsupported) { + if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument'); + + var events = jqLiteExpandoStore(element, 'events'), + handle = jqLiteExpandoStore(element, 'handle'); + + if (!handle) return; //no listeners registered + + if (isUndefined(type)) { + forEach(events, function(eventHandler, type) { + removeEventListenerFn(element, type, eventHandler); + delete events[type]; + }); + } else { + forEach(type.split(' '), function(type) { + if (isUndefined(fn)) { + removeEventListenerFn(element, type, events[type]); + delete events[type]; + } else { + arrayRemove(events[type] || [], fn); + } + }); + } +} + +function jqLiteRemoveData(element, name) { + var expandoId = element[jqName], + expandoStore = jqCache[expandoId]; + + if (expandoStore) { + if (name) { + delete jqCache[expandoId].data[name]; + return; + } + + if (expandoStore.handle) { + expandoStore.events.$destroy && expandoStore.handle({}, '$destroy'); + jqLiteOff(element); + } + delete jqCache[expandoId]; + element[jqName] = undefined; // ie does not allow deletion of attributes on elements. + } +} + +function jqLiteExpandoStore(element, key, value) { + var expandoId = element[jqName], + expandoStore = jqCache[expandoId || -1]; + + if (isDefined(value)) { + if (!expandoStore) { + element[jqName] = expandoId = jqNextId(); + expandoStore = jqCache[expandoId] = {}; + } + expandoStore[key] = value; + } else { + return expandoStore && expandoStore[key]; + } +} + +function jqLiteData(element, key, value) { + var data = jqLiteExpandoStore(element, 'data'), + isSetter = isDefined(value), + keyDefined = !isSetter && isDefined(key), + isSimpleGetter = keyDefined && !isObject(key); + + if (!data && !isSimpleGetter) { + jqLiteExpandoStore(element, 'data', data = {}); + } + + if (isSetter) { + data[key] = value; + } else { + if (keyDefined) { + if (isSimpleGetter) { + // don't create data in this case. + return data && data[key]; + } else { + extend(data, key); + } + } else { + return data; + } + } +} + +function jqLiteHasClass(element, selector) { + if (!element.getAttribute) return false; + return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " "). + indexOf( " " + selector + " " ) > -1); +} + +function jqLiteRemoveClass(element, cssClasses) { + if (cssClasses && element.setAttribute) { + forEach(cssClasses.split(' '), function(cssClass) { + element.setAttribute('class', trim( + (" " + (element.getAttribute('class') || '') + " ") + .replace(/[\n\t]/g, " ") + .replace(" " + trim(cssClass) + " ", " ")) + ); + }); + } +} + +function jqLiteAddClass(element, cssClasses) { + if (cssClasses && element.setAttribute) { + var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') + .replace(/[\n\t]/g, " "); + + forEach(cssClasses.split(' '), function(cssClass) { + cssClass = trim(cssClass); + if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) { + existingClasses += cssClass + ' '; + } + }); + + element.setAttribute('class', trim(existingClasses)); + } +} + +function jqLiteAddNodes(root, elements) { + if (elements) { + elements = (!elements.nodeName && isDefined(elements.length) && !isWindow(elements)) + ? elements + : [ elements ]; + for(var i=0; i < elements.length; i++) { + root.push(elements[i]); + } + } +} + +function jqLiteController(element, name) { + return jqLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller'); +} + +function jqLiteInheritedData(element, name, value) { + element = jqLite(element); + + // if element is the document object work with the html element instead + // this makes $(document).scope() possible + if(element[0].nodeType == 9) { + element = element.find('html'); + } + var names = isArray(name) ? name : [name]; + + while (element.length) { + + for (var i = 0, ii = names.length; i < ii; i++) { + if ((value = element.data(names[i])) !== undefined) return value; + } + element = element.parent(); + } +} + +function jqLiteEmpty(element) { + for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) { + jqLiteDealoc(childNodes[i]); + } + while (element.firstChild) { + element.removeChild(element.firstChild); + } +} + +////////////////////////////////////////// +// Functions which are declared directly. +////////////////////////////////////////// +var JQLitePrototype = JQLite.prototype = { + ready: function(fn) { + var fired = false; + + function trigger() { + if (fired) return; + fired = true; + fn(); + } + + // check if document already is loaded + if (document.readyState === 'complete'){ + setTimeout(trigger); + } else { + this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9 + // we can not use jqLite since we are not done loading and jQuery could be loaded later. + // jshint -W064 + JQLite(window).on('load', trigger); // fallback to window.onload for others + // jshint +W064 + } + }, + toString: function() { + var value = []; + forEach(this, function(e){ value.push('' + e);}); + return '[' + value.join(', ') + ']'; + }, + + eq: function(index) { + return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]); + }, + + length: 0, + push: push, + sort: [].sort, + splice: [].splice +}; + +////////////////////////////////////////// +// Functions iterating getter/setters. +// these functions return self on setter and +// value on get. +////////////////////////////////////////// +var BOOLEAN_ATTR = {}; +forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) { + BOOLEAN_ATTR[lowercase(value)] = value; +}); +var BOOLEAN_ELEMENTS = {}; +forEach('input,select,option,textarea,button,form,details'.split(','), function(value) { + BOOLEAN_ELEMENTS[uppercase(value)] = true; +}); + +function getBooleanAttrName(element, name) { + // check dom last since we will most likely fail on name + var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; + + // booleanAttr is here twice to minimize DOM access + return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr; +} + +forEach({ + data: jqLiteData, + inheritedData: jqLiteInheritedData, + + scope: function(element) { + // Can't use jqLiteData here directly so we stay compatible with jQuery! + return jqLite(element).data('$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']); + }, + + isolateScope: function(element) { + // Can't use jqLiteData here directly so we stay compatible with jQuery! + return jqLite(element).data('$isolateScope') || jqLite(element).data('$isolateScopeNoTemplate'); + }, + + controller: jqLiteController , + + injector: function(element) { + return jqLiteInheritedData(element, '$injector'); + }, + + removeAttr: function(element,name) { + element.removeAttribute(name); + }, + + hasClass: jqLiteHasClass, + + css: function(element, name, value) { + name = camelCase(name); + + if (isDefined(value)) { + element.style[name] = value; + } else { + var val; + + if (msie <= 8) { + // this is some IE specific weirdness that jQuery 1.6.4 does not sure why + val = element.currentStyle && element.currentStyle[name]; + if (val === '') val = 'auto'; + } + + val = val || element.style[name]; + + if (msie <= 8) { + // jquery weirdness :-/ + val = (val === '') ? undefined : val; + } + + return val; + } + }, + + attr: function(element, name, value){ + var lowercasedName = lowercase(name); + if (BOOLEAN_ATTR[lowercasedName]) { + if (isDefined(value)) { + if (!!value) { + element[name] = true; + element.setAttribute(name, lowercasedName); + } else { + element[name] = false; + element.removeAttribute(lowercasedName); + } + } else { + return (element[name] || + (element.attributes.getNamedItem(name)|| noop).specified) + ? lowercasedName + : undefined; + } + } else if (isDefined(value)) { + element.setAttribute(name, value); + } else if (element.getAttribute) { + // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code + // some elements (e.g. Document) don't have get attribute, so return undefined + var ret = element.getAttribute(name, 2); + // normalize non-existing attributes to undefined (as jQuery) + return ret === null ? undefined : ret; + } + }, + + prop: function(element, name, value) { + if (isDefined(value)) { + element[name] = value; + } else { + return element[name]; + } + }, + + text: (function() { + var NODE_TYPE_TEXT_PROPERTY = []; + if (msie < 9) { + NODE_TYPE_TEXT_PROPERTY[1] = 'innerText'; /** Element **/ + NODE_TYPE_TEXT_PROPERTY[3] = 'nodeValue'; /** Text **/ + } else { + NODE_TYPE_TEXT_PROPERTY[1] = /** Element **/ + NODE_TYPE_TEXT_PROPERTY[3] = 'textContent'; /** Text **/ + } + getText.$dv = ''; + return getText; + + function getText(element, value) { + var textProp = NODE_TYPE_TEXT_PROPERTY[element.nodeType]; + if (isUndefined(value)) { + return textProp ? element[textProp] : ''; + } + element[textProp] = value; + } + })(), + + val: function(element, value) { + if (isUndefined(value)) { + if (nodeName_(element) === 'SELECT' && element.multiple) { + var result = []; + forEach(element.options, function (option) { + if (option.selected) { + result.push(option.value || option.text); + } + }); + return result.length === 0 ? null : result; + } + return element.value; + } + element.value = value; + }, + + html: function(element, value) { + if (isUndefined(value)) { + return element.innerHTML; + } + for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) { + jqLiteDealoc(childNodes[i]); + } + element.innerHTML = value; + }, + + empty: jqLiteEmpty +}, function(fn, name){ + /** + * Properties: writes return selection, reads return first value + */ + JQLite.prototype[name] = function(arg1, arg2) { + var i, key; + + // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it + // in a way that survives minification. + // jqLiteEmpty takes no arguments but is a setter. + if (fn !== jqLiteEmpty && + (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) { + if (isObject(arg1)) { + + // we are a write, but the object properties are the key/values + for (i = 0; i < this.length; i++) { + if (fn === jqLiteData) { + // data() takes the whole object in jQuery + fn(this[i], arg1); + } else { + for (key in arg1) { + fn(this[i], key, arg1[key]); + } + } + } + // return self for chaining + return this; + } else { + // we are a read, so read the first child. + var value = fn.$dv; + // Only if we have $dv do we iterate over all, otherwise it is just the first element. + var jj = (value === undefined) ? Math.min(this.length, 1) : this.length; + for (var j = 0; j < jj; j++) { + var nodeValue = fn(this[j], arg1, arg2); + value = value ? value + nodeValue : nodeValue; + } + return value; + } + } else { + // we are a write, so apply to all children + for (i = 0; i < this.length; i++) { + fn(this[i], arg1, arg2); + } + // return self for chaining + return this; + } + }; +}); + +function createEventHandler(element, events) { + var eventHandler = function (event, type) { + if (!event.preventDefault) { + event.preventDefault = function() { + event.returnValue = false; //ie + }; + } + + if (!event.stopPropagation) { + event.stopPropagation = function() { + event.cancelBubble = true; //ie + }; + } + + if (!event.target) { + event.target = event.srcElement || document; + } + + if (isUndefined(event.defaultPrevented)) { + var prevent = event.preventDefault; + event.preventDefault = function() { + event.defaultPrevented = true; + prevent.call(event); + }; + event.defaultPrevented = false; + } + + event.isDefaultPrevented = function() { + return event.defaultPrevented || event.returnValue === false; + }; + + // Copy event handlers in case event handlers array is modified during execution. + var eventHandlersCopy = shallowCopy(events[type || event.type] || []); + + forEach(eventHandlersCopy, function(fn) { + fn.call(element, event); + }); + + // Remove monkey-patched methods (IE), + // as they would cause memory leaks in IE8. + if (msie <= 8) { + // IE7/8 does not allow to delete property on native object + event.preventDefault = null; + event.stopPropagation = null; + event.isDefaultPrevented = null; + } else { + // It shouldn't affect normal browsers (native methods are defined on prototype). + delete event.preventDefault; + delete event.stopPropagation; + delete event.isDefaultPrevented; + } + }; + eventHandler.elem = element; + return eventHandler; +} + +////////////////////////////////////////// +// Functions iterating traversal. +// These functions chain results into a single +// selector. +////////////////////////////////////////// +forEach({ + removeData: jqLiteRemoveData, + + dealoc: jqLiteDealoc, + + on: function onFn(element, type, fn, unsupported){ + if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters'); + + var events = jqLiteExpandoStore(element, 'events'), + handle = jqLiteExpandoStore(element, 'handle'); + + if (!events) jqLiteExpandoStore(element, 'events', events = {}); + if (!handle) jqLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events)); + + forEach(type.split(' '), function(type){ + var eventFns = events[type]; + + if (!eventFns) { + if (type == 'mouseenter' || type == 'mouseleave') { + var contains = document.body.contains || document.body.compareDocumentPosition ? + function( a, b ) { + // jshint bitwise: false + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + events[type] = []; + + // Refer to jQuery's implementation of mouseenter & mouseleave + // Read about mouseenter and mouseleave: + // http://www.quirksmode.org/js/events_mouse.html#link8 + var eventmap = { mouseleave : "mouseout", mouseenter : "mouseover"}; + + onFn(element, eventmap[type], function(event) { + var target = this, related = event.relatedTarget; + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !contains(target, related)) ){ + handle(event, type); + } + }); + + } else { + addEventListenerFn(element, type, handle); + events[type] = []; + } + eventFns = events[type]; + } + eventFns.push(fn); + }); + }, + + off: jqLiteOff, + + one: function(element, type, fn) { + element = jqLite(element); + + //add the listener twice so that when it is called + //you can remove the original function and still be + //able to call element.off(ev, fn) normally + element.on(type, function onFn() { + element.off(type, fn); + element.off(type, onFn); + }); + element.on(type, fn); + }, + + replaceWith: function(element, replaceNode) { + var index, parent = element.parentNode; + jqLiteDealoc(element); + forEach(new JQLite(replaceNode), function(node){ + if (index) { + parent.insertBefore(node, index.nextSibling); + } else { + parent.replaceChild(node, element); + } + index = node; + }); + }, + + children: function(element) { + var children = []; + forEach(element.childNodes, function(element){ + if (element.nodeType === 1) + children.push(element); + }); + return children; + }, + + contents: function(element) { + return element.childNodes || []; + }, + + append: function(element, node) { + forEach(new JQLite(node), function(child){ + if (element.nodeType === 1 || element.nodeType === 11) { + element.appendChild(child); + } + }); + }, + + prepend: function(element, node) { + if (element.nodeType === 1) { + var index = element.firstChild; + forEach(new JQLite(node), function(child){ + element.insertBefore(child, index); + }); + } + }, + + wrap: function(element, wrapNode) { + wrapNode = jqLite(wrapNode)[0]; + var parent = element.parentNode; + if (parent) { + parent.replaceChild(wrapNode, element); + } + wrapNode.appendChild(element); + }, + + remove: function(element) { + jqLiteDealoc(element); + var parent = element.parentNode; + if (parent) parent.removeChild(element); + }, + + after: function(element, newElement) { + var index = element, parent = element.parentNode; + forEach(new JQLite(newElement), function(node){ + parent.insertBefore(node, index.nextSibling); + index = node; + }); + }, + + addClass: jqLiteAddClass, + removeClass: jqLiteRemoveClass, + + toggleClass: function(element, selector, condition) { + if (isUndefined(condition)) { + condition = !jqLiteHasClass(element, selector); + } + (condition ? jqLiteAddClass : jqLiteRemoveClass)(element, selector); + }, + + parent: function(element) { + var parent = element.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + + next: function(element) { + if (element.nextElementSibling) { + return element.nextElementSibling; + } + + // IE8 doesn't have nextElementSibling + var elm = element.nextSibling; + while (elm != null && elm.nodeType !== 1) { + elm = elm.nextSibling; + } + return elm; + }, + + find: function(element, selector) { + if (element.getElementsByTagName) { + return element.getElementsByTagName(selector); + } else { + return []; + } + }, + + clone: jqLiteClone, + + triggerHandler: function(element, eventName, eventData) { + var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName]; + + eventData = eventData || []; + + var event = [{ + preventDefault: noop, + stopPropagation: noop + }]; + + forEach(eventFns, function(fn) { + fn.apply(element, event.concat(eventData)); + }); + } +}, function(fn, name){ + /** + * chaining functions + */ + JQLite.prototype[name] = function(arg1, arg2, arg3) { + var value; + for(var i=0; i < this.length; i++) { + if (isUndefined(value)) { + value = fn(this[i], arg1, arg2, arg3); + if (isDefined(value)) { + // any function which returns a value needs to be wrapped + value = jqLite(value); + } + } else { + jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3)); + } + } + return isDefined(value) ? value : this; + }; + + // bind legacy bind/unbind to on/off + JQLite.prototype.bind = JQLite.prototype.on; + JQLite.prototype.unbind = JQLite.prototype.off; +}); + +/** + * Computes a hash of an 'obj'. + * Hash of a: + * string is string + * number is number as string + * object is either result of calling $$hashKey function on the object or uniquely generated id, + * that is also assigned to the $$hashKey property of the object. + * + * @param obj + * @returns {string} hash string such that the same input will have the same hash string. + * The resulting string key is in 'type:hashKey' format. + */ +function hashKey(obj) { + var objType = typeof obj, + key; + + if (objType == 'object' && obj !== null) { + if (typeof (key = obj.$$hashKey) == 'function') { + // must invoke on object to keep the right this + key = obj.$$hashKey(); + } else if (key === undefined) { + key = obj.$$hashKey = nextUid(); + } + } else { + key = obj; + } + + return objType + ':' + key; +} + +/** + * HashMap which can use objects as keys + */ +function HashMap(array){ + forEach(array, this.put, this); +} +HashMap.prototype = { + /** + * Store key value pair + * @param key key to store can be any type + * @param value value to store can be any type + */ + put: function(key, value) { + this[hashKey(key)] = value; + }, + + /** + * @param key + * @returns the value for the key + */ + get: function(key) { + return this[hashKey(key)]; + }, + + /** + * Remove the key/value pair + * @param key + */ + remove: function(key) { + var value = this[key = hashKey(key)]; + delete this[key]; + return value; + } +}; + +/** + * @ngdoc function + * @name angular.injector + * @function + * + * @description + * Creates an injector function that can be used for retrieving services as well as for + * dependency injection (see {@link guide/di dependency injection}). + * + + * @param {Array.} modules A list of module functions or their aliases. See + * {@link angular.module}. The `ng` module must be explicitly added. + * @returns {function()} Injector function. See {@link AUTO.$injector $injector}. + * + * @example + * Typical usage + *
                  + *   // create an injector
                  + *   var $injector = angular.injector(['ng']);
                  + *
                  + *   // use the injector to kick off your application
                  + *   // use the type inference to auto inject arguments, or use implicit injection
                  + *   $injector.invoke(function($rootScope, $compile, $document){
                  + *     $compile($document)($rootScope);
                  + *     $rootScope.$digest();
                  + *   });
                  + * 
                  + * + * Sometimes you want to get access to the injector of a currently running Angular app + * from outside Angular. Perhaps, you want to inject and compile some markup after the + * application has been bootstrapped. You can do this using extra `injector()` added + * to JQuery/jqLite elements. See {@link angular.element}. + * + * *This is fairly rare but could be the case if a third party library is injecting the + * markup.* + * + * In the following example a new block of HTML containing a `ng-controller` + * directive is added to the end of the document body by JQuery. We then compile and link + * it into the current AngularJS scope. + * + *
                  + * var $div = $('
                  {{content.label}}
                  '); + * $(document.body).append($div); + * + * angular.element(document).injector().invoke(function($compile) { + * var scope = angular.element($div).scope(); + * $compile($div)(scope); + * }); + *
                  + */ + + +/** + * @ngdoc overview + * @name AUTO + * @description + * + * Implicit module which gets automatically added to each {@link AUTO.$injector $injector}. + */ + +var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; +var FN_ARG_SPLIT = /,/; +var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; +var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; +var $injectorMinErr = minErr('$injector'); +function annotate(fn) { + var $inject, + fnText, + argDecl, + last; + + if (typeof fn == 'function') { + if (!($inject = fn.$inject)) { + $inject = []; + if (fn.length) { + fnText = fn.toString().replace(STRIP_COMMENTS, ''); + argDecl = fnText.match(FN_ARGS); + forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){ + arg.replace(FN_ARG, function(all, underscore, name){ + $inject.push(name); + }); + }); + } + fn.$inject = $inject; + } + } else if (isArray(fn)) { + last = fn.length - 1; + assertArgFn(fn[last], 'fn'); + $inject = fn.slice(0, last); + } else { + assertArgFn(fn, 'fn', true); + } + return $inject; +} + +/////////////////////////////////////// + +/** + * @ngdoc object + * @name AUTO.$injector + * @function + * + * @description + * + * `$injector` is used to retrieve object instances as defined by + * {@link AUTO.$provide provider}, instantiate types, invoke methods, + * and load modules. + * + * The following always holds true: + * + *
                  + *   var $injector = angular.injector();
                  + *   expect($injector.get('$injector')).toBe($injector);
                  + *   expect($injector.invoke(function($injector){
                  + *     return $injector;
                  + *   }).toBe($injector);
                  + * 
                  + * + * # Injection Function Annotation + * + * JavaScript does not have annotations, and annotations are needed for dependency injection. The + * following are all valid ways of annotating function with injection arguments and are equivalent. + * + *
                  + *   // inferred (only works if code not minified/obfuscated)
                  + *   $injector.invoke(function(serviceA){});
                  + *
                  + *   // annotated
                  + *   function explicit(serviceA) {};
                  + *   explicit.$inject = ['serviceA'];
                  + *   $injector.invoke(explicit);
                  + *
                  + *   // inline
                  + *   $injector.invoke(['serviceA', function(serviceA){}]);
                  + * 
                  + * + * ## Inference + * + * In JavaScript calling `toString()` on a function returns the function definition. The definition + * can then be parsed and the function arguments can be extracted. *NOTE:* This does not work with + * minification, and obfuscation tools since these tools change the argument names. + * + * ## `$inject` Annotation + * By adding a `$inject` property onto a function the injection parameters can be specified. + * + * ## Inline + * As an array of injection names, where the last item in the array is the function to call. + */ + +/** + * @ngdoc method + * @name AUTO.$injector#get + * @methodOf AUTO.$injector + * + * @description + * Return an instance of the service. + * + * @param {string} name The name of the instance to retrieve. + * @return {*} The instance. + */ + +/** + * @ngdoc method + * @name AUTO.$injector#invoke + * @methodOf AUTO.$injector + * + * @description + * Invoke the method and supply the method arguments from the `$injector`. + * + * @param {!function} fn The function to invoke. Function parameters are injected according to the + * {@link guide/di $inject Annotation} rules. + * @param {Object=} self The `this` for the invoked method. + * @param {Object=} locals Optional object. If preset then any argument names are read from this + * object first, before the `$injector` is consulted. + * @returns {*} the value returned by the invoked `fn` function. + */ + +/** + * @ngdoc method + * @name AUTO.$injector#has + * @methodOf AUTO.$injector + * + * @description + * Allows the user to query if the particular service exist. + * + * @param {string} Name of the service to query. + * @returns {boolean} returns true if injector has given service. + */ + +/** + * @ngdoc method + * @name AUTO.$injector#instantiate + * @methodOf AUTO.$injector + * @description + * Create a new instance of JS type. The method takes a constructor function invokes the new + * operator and supplies all of the arguments to the constructor function as specified by the + * constructor annotation. + * + * @param {function} Type Annotated constructor function. + * @param {Object=} locals Optional object. If preset then any argument names are read from this + * object first, before the `$injector` is consulted. + * @returns {Object} new instance of `Type`. + */ + +/** + * @ngdoc method + * @name AUTO.$injector#annotate + * @methodOf AUTO.$injector + * + * @description + * Returns an array of service names which the function is requesting for injection. This API is + * used by the injector to determine which services need to be injected into the function when the + * function is invoked. There are three ways in which the function can be annotated with the needed + * dependencies. + * + * # Argument names + * + * The simplest form is to extract the dependencies from the arguments of the function. This is done + * by converting the function into a string using `toString()` method and extracting the argument + * names. + *
                  + *   // Given
                  + *   function MyController($scope, $route) {
                  + *     // ...
                  + *   }
                  + *
                  + *   // Then
                  + *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
                  + * 
                  + * + * This method does not work with code minification / obfuscation. For this reason the following + * annotation strategies are supported. + * + * # The `$inject` property + * + * If a function has an `$inject` property and its value is an array of strings, then the strings + * represent names of services to be injected into the function. + *
                  + *   // Given
                  + *   var MyController = function(obfuscatedScope, obfuscatedRoute) {
                  + *     // ...
                  + *   }
                  + *   // Define function dependencies
                  + *   MyController['$inject'] = ['$scope', '$route'];
                  + *
                  + *   // Then
                  + *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
                  + * 
                  + * + * # The array notation + * + * It is often desirable to inline Injected functions and that's when setting the `$inject` property + * is very inconvenient. In these situations using the array notation to specify the dependencies in + * a way that survives minification is a better choice: + * + *
                  + *   // We wish to write this (not minification / obfuscation safe)
                  + *   injector.invoke(function($compile, $rootScope) {
                  + *     // ...
                  + *   });
                  + *
                  + *   // We are forced to write break inlining
                  + *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {
                  + *     // ...
                  + *   };
                  + *   tmpFn.$inject = ['$compile', '$rootScope'];
                  + *   injector.invoke(tmpFn);
                  + *
                  + *   // To better support inline function the inline annotation is supported
                  + *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {
                  + *     // ...
                  + *   }]);
                  + *
                  + *   // Therefore
                  + *   expect(injector.annotate(
                  + *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])
                  + *    ).toEqual(['$compile', '$rootScope']);
                  + * 
                  + * + * @param {function|Array.} fn Function for which dependent service names need to + * be retrieved as described above. + * + * @returns {Array.} The names of the services which the function requires. + */ + + + + +/** + * @ngdoc object + * @name AUTO.$provide + * + * @description + * + * The {@link AUTO.$provide $provide} service has a number of methods for registering components + * with the {@link AUTO.$injector $injector}. Many of these functions are also exposed on + * {@link angular.Module}. + * + * An Angular **service** is a singleton object created by a **service factory**. These **service + * factories** are functions which, in turn, are created by a **service provider**. + * The **service providers** are constructor functions. When instantiated they must contain a + * property called `$get`, which holds the **service factory** function. + * + * When you request a service, the {@link AUTO.$injector $injector} is responsible for finding the + * correct **service provider**, instantiating it and then calling its `$get` **service factory** + * function to get the instance of the **service**. + * + * Often services have no configuration options and there is no need to add methods to the service + * provider. The provider will be no more than a constructor function with a `$get` property. For + * these cases the {@link AUTO.$provide $provide} service has additional helper methods to register + * services without specifying a provider. + * + * * {@link AUTO.$provide#methods_provider provider(provider)} - registers a **service provider** with the + * {@link AUTO.$injector $injector} + * * {@link AUTO.$provide#methods_constant constant(obj)} - registers a value/object that can be accessed by + * providers and services. + * * {@link AUTO.$provide#methods_value value(obj)} - registers a value/object that can only be accessed by + * services, not providers. + * * {@link AUTO.$provide#methods_factory factory(fn)} - registers a service **factory function**, `fn`, + * that will be wrapped in a **service provider** object, whose `$get` property will contain the + * given factory function. + * * {@link AUTO.$provide#methods_service service(class)} - registers a **constructor function**, `class` that + * that will be wrapped in a **service provider** object, whose `$get` property will instantiate + * a new object using the given constructor function. + * + * See the individual methods for more information and examples. + */ + +/** + * @ngdoc method + * @name AUTO.$provide#provider + * @methodOf AUTO.$provide + * @description + * + * Register a **provider function** with the {@link AUTO.$injector $injector}. Provider functions + * are constructor functions, whose instances are responsible for "providing" a factory for a + * service. + * + * Service provider names start with the name of the service they provide followed by `Provider`. + * For example, the {@link ng.$log $log} service has a provider called + * {@link ng.$logProvider $logProvider}. + * + * Service provider objects can have additional methods which allow configuration of the provider + * and its service. Importantly, you can configure what kind of service is created by the `$get` + * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a + * method {@link ng.$logProvider#debugEnabled debugEnabled} + * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the + * console or not. + * + * @param {string} name The name of the instance. NOTE: the provider will be available under `name + + 'Provider'` key. + * @param {(Object|function())} provider If the provider is: + * + * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using + * {@link AUTO.$injector#invoke $injector.invoke()} when an instance needs to be + * created. + * - `Constructor`: a new instance of the provider will be created using + * {@link AUTO.$injector#instantiate $injector.instantiate()}, then treated as + * `object`. + * + * @returns {Object} registered provider instance + + * @example + * + * The following example shows how to create a simple event tracking service and register it using + * {@link AUTO.$provide#methods_provider $provide.provider()}. + * + *
                  + *  // Define the eventTracker provider
                  + *  function EventTrackerProvider() {
                  + *    var trackingUrl = '/track';
                  + *
                  + *    // A provider method for configuring where the tracked events should been saved
                  + *    this.setTrackingUrl = function(url) {
                  + *      trackingUrl = url;
                  + *    };
                  + *
                  + *    // The service factory function
                  + *    this.$get = ['$http', function($http) {
                  + *      var trackedEvents = {};
                  + *      return {
                  + *        // Call this to track an event
                  + *        event: function(event) {
                  + *          var count = trackedEvents[event] || 0;
                  + *          count += 1;
                  + *          trackedEvents[event] = count;
                  + *          return count;
                  + *        },
                  + *        // Call this to save the tracked events to the trackingUrl
                  + *        save: function() {
                  + *          $http.post(trackingUrl, trackedEvents);
                  + *        }
                  + *      };
                  + *    }];
                  + *  }
                  + *
                  + *  describe('eventTracker', function() {
                  + *    var postSpy;
                  + *
                  + *    beforeEach(module(function($provide) {
                  + *      // Register the eventTracker provider
                  + *      $provide.provider('eventTracker', EventTrackerProvider);
                  + *    }));
                  + *
                  + *    beforeEach(module(function(eventTrackerProvider) {
                  + *      // Configure eventTracker provider
                  + *      eventTrackerProvider.setTrackingUrl('/custom-track');
                  + *    }));
                  + *
                  + *    it('tracks events', inject(function(eventTracker) {
                  + *      expect(eventTracker.event('login')).toEqual(1);
                  + *      expect(eventTracker.event('login')).toEqual(2);
                  + *    }));
                  + *
                  + *    it('saves to the tracking url', inject(function(eventTracker, $http) {
                  + *      postSpy = spyOn($http, 'post');
                  + *      eventTracker.event('login');
                  + *      eventTracker.save();
                  + *      expect(postSpy).toHaveBeenCalled();
                  + *      expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');
                  + *      expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');
                  + *      expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });
                  + *    }));
                  + *  });
                  + * 
                  + */ + +/** + * @ngdoc method + * @name AUTO.$provide#factory + * @methodOf AUTO.$provide + * @description + * + * Register a **service factory**, which will be called to return the service instance. + * This is short for registering a service where its provider consists of only a `$get` property, + * which is the given service factory function. + * You should use {@link AUTO.$provide#factory $provide.factory(getFn)} if you do not need to + * configure your service in a provider. + * + * @param {string} name The name of the instance. + * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand + * for `$provide.provider(name, {$get: $getFn})`. + * @returns {Object} registered provider instance + * + * @example + * Here is an example of registering a service + *
                  + *   $provide.factory('ping', ['$http', function($http) {
                  + *     return function ping() {
                  + *       return $http.send('/ping');
                  + *     };
                  + *   }]);
                  + * 
                  + * You would then inject and use this service like this: + *
                  + *   someModule.controller('Ctrl', ['ping', function(ping) {
                  + *     ping();
                  + *   }]);
                  + * 
                  + */ + + +/** + * @ngdoc method + * @name AUTO.$provide#service + * @methodOf AUTO.$provide + * @description + * + * Register a **service constructor**, which will be invoked with `new` to create the service + * instance. + * This is short for registering a service where its provider's `$get` property is the service + * constructor function that will be used to instantiate the service instance. + * + * You should use {@link AUTO.$provide#methods_service $provide.service(class)} if you define your service + * as a type/class. + * + * @param {string} name The name of the instance. + * @param {Function} constructor A class (constructor function) that will be instantiated. + * @returns {Object} registered provider instance + * + * @example + * Here is an example of registering a service using + * {@link AUTO.$provide#methods_service $provide.service(class)}. + *
                  + *   $provide.service('ping', ['$http', function($http) {
                  + *     var Ping = function() {
                  + *       this.$http = $http;
                  + *     };
                  + *   
                  + *     Ping.prototype.send = function() {
                  + *       return this.$http.get('/ping');
                  + *     }; 
                  + *   
                  + *     return Ping;
                  + *   }]);
                  + * 
                  + * You would then inject and use this service like this: + *
                  + *   someModule.controller('Ctrl', ['ping', function(ping) {
                  + *     ping.send();
                  + *   }]);
                  + * 
                  + */ + + +/** + * @ngdoc method + * @name AUTO.$provide#value + * @methodOf AUTO.$provide + * @description + * + * Register a **value service** with the {@link AUTO.$injector $injector}, such as a string, a + * number, an array, an object or a function. This is short for registering a service where its + * provider's `$get` property is a factory function that takes no arguments and returns the **value + * service**. + * + * Value services are similar to constant services, except that they cannot be injected into a + * module configuration function (see {@link angular.Module#config}) but they can be overridden by + * an Angular + * {@link AUTO.$provide#decorator decorator}. + * + * @param {string} name The name of the instance. + * @param {*} value The value. + * @returns {Object} registered provider instance + * + * @example + * Here are some examples of creating value services. + *
                  + *   $provide.value('ADMIN_USER', 'admin');
                  + *
                  + *   $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 });
                  + *
                  + *   $provide.value('halfOf', function(value) {
                  + *     return value / 2;
                  + *   });
                  + * 
                  + */ + + +/** + * @ngdoc method + * @name AUTO.$provide#constant + * @methodOf AUTO.$provide + * @description + * + * Register a **constant service**, such as a string, a number, an array, an object or a function, + * with the {@link AUTO.$injector $injector}. Unlike {@link AUTO.$provide#value value} it can be + * injected into a module configuration function (see {@link angular.Module#config}) and it cannot + * be overridden by an Angular {@link AUTO.$provide#decorator decorator}. + * + * @param {string} name The name of the constant. + * @param {*} value The constant value. + * @returns {Object} registered instance + * + * @example + * Here a some examples of creating constants: + *
                  + *   $provide.constant('SHARD_HEIGHT', 306);
                  + *
                  + *   $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);
                  + *
                  + *   $provide.constant('double', function(value) {
                  + *     return value * 2;
                  + *   });
                  + * 
                  + */ + + +/** + * @ngdoc method + * @name AUTO.$provide#decorator + * @methodOf AUTO.$provide + * @description + * + * Register a **service decorator** with the {@link AUTO.$injector $injector}. A service decorator + * intercepts the creation of a service, allowing it to override or modify the behaviour of the + * service. The object returned by the decorator may be the original service, or a new service + * object which replaces or wraps and delegates to the original service. + * + * @param {string} name The name of the service to decorate. + * @param {function()} decorator This function will be invoked when the service needs to be + * instantiated and should return the decorated service instance. The function is called using + * the {@link AUTO.$injector#invoke injector.invoke} method and is therefore fully injectable. + * Local injection arguments: + * + * * `$delegate` - The original service instance, which can be monkey patched, configured, + * decorated or delegated to. + * + * @example + * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting + * calls to {@link ng.$log#error $log.warn()}. + *
                  + *   $provider.decorator('$log', ['$delegate', function($delegate) {
                  + *     $delegate.warn = $delegate.error;
                  + *     return $delegate;
                  + *   }]);
                  + * 
                  + */ + + +function createInjector(modulesToLoad) { + var INSTANTIATING = {}, + providerSuffix = 'Provider', + path = [], + loadedModules = new HashMap(), + providerCache = { + $provide: { + provider: supportObject(provider), + factory: supportObject(factory), + service: supportObject(service), + value: supportObject(value), + constant: supportObject(constant), + decorator: decorator + } + }, + providerInjector = (providerCache.$injector = + createInternalInjector(providerCache, function() { + throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- ')); + })), + instanceCache = {}, + instanceInjector = (instanceCache.$injector = + createInternalInjector(instanceCache, function(servicename) { + var provider = providerInjector.get(servicename + providerSuffix); + return instanceInjector.invoke(provider.$get, provider); + })); + + + forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); }); + + return instanceInjector; + + //////////////////////////////////// + // $provider + //////////////////////////////////// + + function supportObject(delegate) { + return function(key, value) { + if (isObject(key)) { + forEach(key, reverseParams(delegate)); + } else { + return delegate(key, value); + } + }; + } + + function provider(name, provider_) { + assertNotHasOwnProperty(name, 'service'); + if (isFunction(provider_) || isArray(provider_)) { + provider_ = providerInjector.instantiate(provider_); + } + if (!provider_.$get) { + throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name); + } + return providerCache[name + providerSuffix] = provider_; + } + + function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); } + + function service(name, constructor) { + return factory(name, ['$injector', function($injector) { + return $injector.instantiate(constructor); + }]); + } + + function value(name, val) { return factory(name, valueFn(val)); } + + function constant(name, value) { + assertNotHasOwnProperty(name, 'constant'); + providerCache[name] = value; + instanceCache[name] = value; + } + + function decorator(serviceName, decorFn) { + var origProvider = providerInjector.get(serviceName + providerSuffix), + orig$get = origProvider.$get; + + origProvider.$get = function() { + var origInstance = instanceInjector.invoke(orig$get, origProvider); + return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); + }; + } + + //////////////////////////////////// + // Module Loading + //////////////////////////////////// + function loadModules(modulesToLoad){ + var runBlocks = [], moduleFn, invokeQueue, i, ii; + forEach(modulesToLoad, function(module) { + if (loadedModules.get(module)) return; + loadedModules.put(module, true); + + try { + if (isString(module)) { + moduleFn = angularModule(module); + runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); + + for(invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) { + var invokeArgs = invokeQueue[i], + provider = providerInjector.get(invokeArgs[0]); + + provider[invokeArgs[1]].apply(provider, invokeArgs[2]); + } + } else if (isFunction(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else if (isArray(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else { + assertArgFn(module, 'module'); + } + } catch (e) { + if (isArray(module)) { + module = module[module.length - 1]; + } + if (e.message && e.stack && e.stack.indexOf(e.message) == -1) { + // Safari & FF's stack traces don't contain error.message content + // unlike those of Chrome and IE + // So if stack doesn't contain message, we create a new string that contains both. + // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here. + /* jshint -W022 */ + e = e.message + '\n' + e.stack; + } + throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}", + module, e.stack || e.message || e); + } + }); + return runBlocks; + } + + //////////////////////////////////// + // internal Injector + //////////////////////////////////// + + function createInternalInjector(cache, factory) { + + function getService(serviceName) { + if (cache.hasOwnProperty(serviceName)) { + if (cache[serviceName] === INSTANTIATING) { + throw $injectorMinErr('cdep', 'Circular dependency found: {0}', path.join(' <- ')); + } + return cache[serviceName]; + } else { + try { + path.unshift(serviceName); + cache[serviceName] = INSTANTIATING; + return cache[serviceName] = factory(serviceName); + } catch (err) { + if (cache[serviceName] === INSTANTIATING) { + delete cache[serviceName]; + } + throw err; + } finally { + path.shift(); + } + } + } + + function invoke(fn, self, locals){ + var args = [], + $inject = annotate(fn), + length, i, + key; + + for(i = 0, length = $inject.length; i < length; i++) { + key = $inject[i]; + if (typeof key !== 'string') { + throw $injectorMinErr('itkn', + 'Incorrect injection token! Expected service name as string, got {0}', key); + } + args.push( + locals && locals.hasOwnProperty(key) + ? locals[key] + : getService(key) + ); + } + if (!fn.$inject) { + // this means that we must be an array. + fn = fn[length]; + } + + // http://jsperf.com/angularjs-invoke-apply-vs-switch + // #5388 + return fn.apply(self, args); + } + + function instantiate(Type, locals) { + var Constructor = function() {}, + instance, returnedValue; + + // Check if Type is annotated and use just the given function at n-1 as parameter + // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]); + Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype; + instance = new Constructor(); + returnedValue = invoke(Type, instance, locals); + + return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance; + } + + return { + invoke: invoke, + instantiate: instantiate, + get: getService, + annotate: annotate, + has: function(name) { + return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name); + } + }; + } +} + +/** + * @ngdoc function + * @name ng.$anchorScroll + * @requires $window + * @requires $location + * @requires $rootScope + * + * @description + * When called, it checks current value of `$location.hash()` and scroll to related element, + * according to rules specified in + * {@link http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document Html5 spec}. + * + * It also watches the `$location.hash()` and scrolls whenever it changes to match any anchor. + * This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`. + * + * @example + + +
                  + Go to bottom + You're at the bottom! +
                  +
                  + + function ScrollCtrl($scope, $location, $anchorScroll) { + $scope.gotoBottom = function (){ + // set the location.hash to the id of + // the element you wish to scroll to. + $location.hash('bottom'); + + // call $anchorScroll() + $anchorScroll(); + } + } + + + #scrollArea { + height: 350px; + overflow: auto; + } + + #bottom { + display: block; + margin-top: 2000px; + } + +
                  + */ +function $AnchorScrollProvider() { + + var autoScrollingEnabled = true; + + this.disableAutoScrolling = function() { + autoScrollingEnabled = false; + }; + + this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) { + var document = $window.document; + + // helper function to get first anchor from a NodeList + // can't use filter.filter, as it accepts only instances of Array + // and IE can't convert NodeList to an array using [].slice + // TODO(vojta): use filter if we change it to accept lists as well + function getFirstAnchor(list) { + var result = null; + forEach(list, function(element) { + if (!result && lowercase(element.nodeName) === 'a') result = element; + }); + return result; + } + + function scroll() { + var hash = $location.hash(), elm; + + // empty hash, scroll to the top of the page + if (!hash) $window.scrollTo(0, 0); + + // element with given id + else if ((elm = document.getElementById(hash))) elm.scrollIntoView(); + + // first anchor with given name :-D + else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) elm.scrollIntoView(); + + // no element and hash == 'top', scroll to the top of the page + else if (hash === 'top') $window.scrollTo(0, 0); + } + + // does not scroll when user clicks on anchor link that is currently on + // (no url change, no $location.hash() change), browser native does scroll + if (autoScrollingEnabled) { + $rootScope.$watch(function autoScrollWatch() {return $location.hash();}, + function autoScrollWatchAction() { + $rootScope.$evalAsync(scroll); + }); + } + + return scroll; + }]; +} + +var $animateMinErr = minErr('$animate'); + +/** + * @ngdoc object + * @name ng.$animateProvider + * + * @description + * Default implementation of $animate that doesn't perform any animations, instead just + * synchronously performs DOM + * updates and calls done() callbacks. + * + * In order to enable animations the ngAnimate module has to be loaded. + * + * To see the functional implementation check out src/ngAnimate/animate.js + */ +var $AnimateProvider = ['$provide', function($provide) { + + + this.$$selectors = {}; + + + /** + * @ngdoc function + * @name ng.$animateProvider#register + * @methodOf ng.$animateProvider + * + * @description + * Registers a new injectable animation factory function. The factory function produces the + * animation object which contains callback functions for each event that is expected to be + * animated. + * + * * `eventFn`: `function(Element, doneFunction)` The element to animate, the `doneFunction` + * must be called once the element animation is complete. If a function is returned then the + * animation service will use this function to cancel the animation whenever a cancel event is + * triggered. + * + * + *
                  +   *   return {
                  +     *     eventFn : function(element, done) {
                  +     *       //code to run the animation
                  +     *       //once complete, then run done()
                  +     *       return function cancellationFunction() {
                  +     *         //code to cancel the animation
                  +     *       }
                  +     *     }
                  +     *   }
                  +   *
                  + * + * @param {string} name The name of the animation. + * @param {function} factory The factory function that will be executed to return the animation + * object. + */ + this.register = function(name, factory) { + var key = name + '-animation'; + if (name && name.charAt(0) != '.') throw $animateMinErr('notcsel', + "Expecting class selector starting with '.' got '{0}'.", name); + this.$$selectors[name.substr(1)] = key; + $provide.factory(key, factory); + }; + + /** + * @ngdoc function + * @name ng.$animateProvider#classNameFilter + * @methodOf ng.$animateProvider + * + * @description + * Sets and/or returns the CSS class regular expression that is checked when performing + * an animation. Upon bootstrap the classNameFilter value is not set at all and will + * therefore enable $animate to attempt to perform an animation on any element. + * When setting the classNameFilter value, animations will only be performed on elements + * that successfully match the filter expression. This in turn can boost performance + * for low-powered devices as well as applications containing a lot of structural operations. + * @param {RegExp=} expression The className expression which will be checked against all animations + * @return {RegExp} The current CSS className expression value. If null then there is no expression value + */ + this.classNameFilter = function(expression) { + if(arguments.length === 1) { + this.$$classNameFilter = (expression instanceof RegExp) ? expression : null; + } + return this.$$classNameFilter; + }; + + this.$get = ['$timeout', function($timeout) { + + /** + * + * @ngdoc object + * @name ng.$animate + * @description The $animate service provides rudimentary DOM manipulation functions to + * insert, remove and move elements within the DOM, as well as adding and removing classes. + * This service is the core service used by the ngAnimate $animator service which provides + * high-level animation hooks for CSS and JavaScript. + * + * $animate is available in the AngularJS core, however, the ngAnimate module must be included + * to enable full out animation support. Otherwise, $animate will only perform simple DOM + * manipulation operations. + * + * To learn more about enabling animation support, click here to visit the {@link ngAnimate + * ngAnimate module page} as well as the {@link ngAnimate.$animate ngAnimate $animate service + * page}. + */ + return { + + /** + * + * @ngdoc function + * @name ng.$animate#enter + * @methodOf ng.$animate + * @function + * @description Inserts the element into the DOM either after the `after` element or within + * the `parent` element. Once complete, the done() callback will be fired (if provided). + * @param {jQuery/jqLite element} element the element which will be inserted into the DOM + * @param {jQuery/jqLite element} parent the parent element which will append the element as + * a child (if the after element is not present) + * @param {jQuery/jqLite element} after the sibling element which will append the element + * after itself + * @param {function=} done callback function that will be called after the element has been + * inserted into the DOM + */ + enter : function(element, parent, after, done) { + if (after) { + after.after(element); + } else { + if (!parent || !parent[0]) { + parent = after.parent(); + } + parent.append(element); + } + done && $timeout(done, 0, false); + }, + + /** + * + * @ngdoc function + * @name ng.$animate#leave + * @methodOf ng.$animate + * @function + * @description Removes the element from the DOM. Once complete, the done() callback will be + * fired (if provided). + * @param {jQuery/jqLite element} element the element which will be removed from the DOM + * @param {function=} done callback function that will be called after the element has been + * removed from the DOM + */ + leave : function(element, done) { + element.remove(); + done && $timeout(done, 0, false); + }, + + /** + * + * @ngdoc function + * @name ng.$animate#move + * @methodOf ng.$animate + * @function + * @description Moves the position of the provided element within the DOM to be placed + * either after the `after` element or inside of the `parent` element. Once complete, the + * done() callback will be fired (if provided). + * + * @param {jQuery/jqLite element} element the element which will be moved around within the + * DOM + * @param {jQuery/jqLite element} parent the parent element where the element will be + * inserted into (if the after element is not present) + * @param {jQuery/jqLite element} after the sibling element where the element will be + * positioned next to + * @param {function=} done the callback function (if provided) that will be fired after the + * element has been moved to its new position + */ + move : function(element, parent, after, done) { + // Do not remove element before insert. Removing will cause data associated with the + // element to be dropped. Insert will implicitly do the remove. + this.enter(element, parent, after, done); + }, + + /** + * + * @ngdoc function + * @name ng.$animate#addClass + * @methodOf ng.$animate + * @function + * @description Adds the provided className CSS class value to the provided element. Once + * complete, the done() callback will be fired (if provided). + * @param {jQuery/jqLite element} element the element which will have the className value + * added to it + * @param {string} className the CSS class which will be added to the element + * @param {function=} done the callback function (if provided) that will be fired after the + * className value has been added to the element + */ + addClass : function(element, className, done) { + className = isString(className) ? + className : + isArray(className) ? className.join(' ') : ''; + forEach(element, function (element) { + jqLiteAddClass(element, className); + }); + done && $timeout(done, 0, false); + }, + + /** + * + * @ngdoc function + * @name ng.$animate#removeClass + * @methodOf ng.$animate + * @function + * @description Removes the provided className CSS class value from the provided element. + * Once complete, the done() callback will be fired (if provided). + * @param {jQuery/jqLite element} element the element which will have the className value + * removed from it + * @param {string} className the CSS class which will be removed from the element + * @param {function=} done the callback function (if provided) that will be fired after the + * className value has been removed from the element + */ + removeClass : function(element, className, done) { + className = isString(className) ? + className : + isArray(className) ? className.join(' ') : ''; + forEach(element, function (element) { + jqLiteRemoveClass(element, className); + }); + done && $timeout(done, 0, false); + }, + + enabled : noop + }; + }]; +}]; + +/** + * ! This is a private undocumented service ! + * + * @name ng.$browser + * @requires $log + * @description + * This object has two goals: + * + * - hide all the global state in the browser caused by the window object + * - abstract away all the browser specific features and inconsistencies + * + * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser` + * service, which can be used for convenient testing of the application without the interaction with + * the real browser apis. + */ +/** + * @param {object} window The global window object. + * @param {object} document jQuery wrapped document. + * @param {function()} XHR XMLHttpRequest constructor. + * @param {object} $log console.log or an object with the same interface. + * @param {object} $sniffer $sniffer service + */ +function Browser(window, document, $log, $sniffer) { + var self = this, + rawDocument = document[0], + location = window.location, + history = window.history, + setTimeout = window.setTimeout, + clearTimeout = window.clearTimeout, + pendingDeferIds = {}; + + self.isMock = false; + + var outstandingRequestCount = 0; + var outstandingRequestCallbacks = []; + + // TODO(vojta): remove this temporary api + self.$$completeOutstandingRequest = completeOutstandingRequest; + self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; }; + + /** + * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks` + * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed. + */ + function completeOutstandingRequest(fn) { + try { + fn.apply(null, sliceArgs(arguments, 1)); + } finally { + outstandingRequestCount--; + if (outstandingRequestCount === 0) { + while(outstandingRequestCallbacks.length) { + try { + outstandingRequestCallbacks.pop()(); + } catch (e) { + $log.error(e); + } + } + } + } + } + + /** + * @private + * Note: this method is used only by scenario runner + * TODO(vojta): prefix this method with $$ ? + * @param {function()} callback Function that will be called when no outstanding request + */ + self.notifyWhenNoOutstandingRequests = function(callback) { + // force browser to execute all pollFns - this is needed so that cookies and other pollers fire + // at some deterministic time in respect to the test runner's actions. Leaving things up to the + // regular poller would result in flaky tests. + forEach(pollFns, function(pollFn){ pollFn(); }); + + if (outstandingRequestCount === 0) { + callback(); + } else { + outstandingRequestCallbacks.push(callback); + } + }; + + ////////////////////////////////////////////////////////////// + // Poll Watcher API + ////////////////////////////////////////////////////////////// + var pollFns = [], + pollTimeout; + + /** + * @name ng.$browser#addPollFn + * @methodOf ng.$browser + * + * @param {function()} fn Poll function to add + * + * @description + * Adds a function to the list of functions that poller periodically executes, + * and starts polling if not started yet. + * + * @returns {function()} the added function + */ + self.addPollFn = function(fn) { + if (isUndefined(pollTimeout)) startPoller(100, setTimeout); + pollFns.push(fn); + return fn; + }; + + /** + * @param {number} interval How often should browser call poll functions (ms) + * @param {function()} setTimeout Reference to a real or fake `setTimeout` function. + * + * @description + * Configures the poller to run in the specified intervals, using the specified + * setTimeout fn and kicks it off. + */ + function startPoller(interval, setTimeout) { + (function check() { + forEach(pollFns, function(pollFn){ pollFn(); }); + pollTimeout = setTimeout(check, interval); + })(); + } + + ////////////////////////////////////////////////////////////// + // URL API + ////////////////////////////////////////////////////////////// + + var lastBrowserUrl = location.href, + baseElement = document.find('base'), + newLocation = null; + + /** + * @name ng.$browser#url + * @methodOf ng.$browser + * + * @description + * GETTER: + * Without any argument, this method just returns current value of location.href. + * + * SETTER: + * With at least one argument, this method sets url to new value. + * If html5 history api supported, pushState/replaceState is used, otherwise + * location.href/location.replace is used. + * Returns its own instance to allow chaining + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to change url. + * + * @param {string} url New url (when used as setter) + * @param {boolean=} replace Should new url replace current history record ? + */ + self.url = function(url, replace) { + // Android Browser BFCache causes location, history reference to become stale. + if (location !== window.location) location = window.location; + if (history !== window.history) history = window.history; + + // setter + if (url) { + if (lastBrowserUrl == url) return; + lastBrowserUrl = url; + if ($sniffer.history) { + if (replace) history.replaceState(null, '', url); + else { + history.pushState(null, '', url); + // Crazy Opera Bug: http://my.opera.com/community/forums/topic.dml?id=1185462 + baseElement.attr('href', baseElement.attr('href')); + } + } else { + newLocation = url; + if (replace) { + location.replace(url); + } else { + location.href = url; + } + } + return self; + // getter + } else { + // - newLocation is a workaround for an IE7-9 issue with location.replace and location.href + // methods not updating location.href synchronously. + // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 + return newLocation || location.href.replace(/%27/g,"'"); + } + }; + + var urlChangeListeners = [], + urlChangeInit = false; + + function fireUrlChange() { + newLocation = null; + if (lastBrowserUrl == self.url()) return; + + lastBrowserUrl = self.url(); + forEach(urlChangeListeners, function(listener) { + listener(self.url()); + }); + } + + /** + * @name ng.$browser#onUrlChange + * @methodOf ng.$browser + * @TODO(vojta): refactor to use node's syntax for events + * + * @description + * Register callback function that will be called, when url changes. + * + * It's only called when the url is changed from outside of angular: + * - user types different url into address bar + * - user clicks on history (forward/back) button + * - user clicks on a link + * + * It's not called when url is changed by $browser.url() method + * + * The listener gets called with new url as parameter. + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to monitor url changes in angular apps. + * + * @param {function(string)} listener Listener function to be called when url changes. + * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous. + */ + self.onUrlChange = function(callback) { + if (!urlChangeInit) { + // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera) + // don't fire popstate when user change the address bar and don't fire hashchange when url + // changed by push/replaceState + + // html5 history api - popstate event + if ($sniffer.history) jqLite(window).on('popstate', fireUrlChange); + // hashchange event + if ($sniffer.hashchange) jqLite(window).on('hashchange', fireUrlChange); + // polling + else self.addPollFn(fireUrlChange); + + urlChangeInit = true; + } + + urlChangeListeners.push(callback); + return callback; + }; + + ////////////////////////////////////////////////////////////// + // Misc API + ////////////////////////////////////////////////////////////// + + /** + * @name ng.$browser#baseHref + * @methodOf ng.$browser + * + * @description + * Returns current + * (always relative - without domain) + * + * @returns {string=} current + */ + self.baseHref = function() { + var href = baseElement.attr('href'); + return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : ''; + }; + + ////////////////////////////////////////////////////////////// + // Cookies API + ////////////////////////////////////////////////////////////// + var lastCookies = {}; + var lastCookieString = ''; + var cookiePath = self.baseHref(); + + /** + * @name ng.$browser#cookies + * @methodOf ng.$browser + * + * @param {string=} name Cookie name + * @param {string=} value Cookie value + * + * @description + * The cookies method provides a 'private' low level access to browser cookies. + * It is not meant to be used directly, use the $cookie service instead. + * + * The return values vary depending on the arguments that the method was called with as follows: + * + * - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify + * it + * - cookies(name, value) -> set name to value, if value is undefined delete the cookie + * - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that + * way) + * + * @returns {Object} Hash of all cookies (if called without any parameter) + */ + self.cookies = function(name, value) { + /* global escape: false, unescape: false */ + var cookieLength, cookieArray, cookie, i, index; + + if (name) { + if (value === undefined) { + rawDocument.cookie = escape(name) + "=;path=" + cookiePath + + ";expires=Thu, 01 Jan 1970 00:00:00 GMT"; + } else { + if (isString(value)) { + cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) + + ';path=' + cookiePath).length + 1; + + // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum: + // - 300 cookies + // - 20 cookies per unique domain + // - 4096 bytes per cookie + if (cookieLength > 4096) { + $log.warn("Cookie '"+ name + + "' possibly not set or overflowed because it was too large ("+ + cookieLength + " > 4096 bytes)!"); + } + } + } + } else { + if (rawDocument.cookie !== lastCookieString) { + lastCookieString = rawDocument.cookie; + cookieArray = lastCookieString.split("; "); + lastCookies = {}; + + for (i = 0; i < cookieArray.length; i++) { + cookie = cookieArray[i]; + index = cookie.indexOf('='); + if (index > 0) { //ignore nameless cookies + name = unescape(cookie.substring(0, index)); + // the first value that is seen for a cookie is the most + // specific one. values for the same cookie name that + // follow are for less specific paths. + if (lastCookies[name] === undefined) { + lastCookies[name] = unescape(cookie.substring(index + 1)); + } + } + } + } + return lastCookies; + } + }; + + + /** + * @name ng.$browser#defer + * @methodOf ng.$browser + * @param {function()} fn A function, who's execution should be deferred. + * @param {number=} [delay=0] of milliseconds to defer the function execution. + * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`. + * + * @description + * Executes a fn asynchronously via `setTimeout(fn, delay)`. + * + * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using + * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed + * via `$browser.defer.flush()`. + * + */ + self.defer = function(fn, delay) { + var timeoutId; + outstandingRequestCount++; + timeoutId = setTimeout(function() { + delete pendingDeferIds[timeoutId]; + completeOutstandingRequest(fn); + }, delay || 0); + pendingDeferIds[timeoutId] = true; + return timeoutId; + }; + + + /** + * @name ng.$browser#defer.cancel + * @methodOf ng.$browser.defer + * + * @description + * Cancels a deferred task identified with `deferId`. + * + * @param {*} deferId Token returned by the `$browser.defer` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + self.defer.cancel = function(deferId) { + if (pendingDeferIds[deferId]) { + delete pendingDeferIds[deferId]; + clearTimeout(deferId); + completeOutstandingRequest(noop); + return true; + } + return false; + }; + +} + +function $BrowserProvider(){ + this.$get = ['$window', '$log', '$sniffer', '$document', + function( $window, $log, $sniffer, $document){ + return new Browser($window, $document, $log, $sniffer); + }]; +} + +/** + * @ngdoc object + * @name ng.$cacheFactory + * + * @description + * Factory that constructs cache objects and gives access to them. + * + *
                  + * 
                  + *  var cache = $cacheFactory('cacheId');
                  + *  expect($cacheFactory.get('cacheId')).toBe(cache);
                  + *  expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();
                  + *
                  + *  cache.put("key", "value");
                  + *  cache.put("another key", "another value");
                  + *
                  + *  // We've specified no options on creation
                  + *  expect(cache.info()).toEqual({id: 'cacheId', size: 2}); 
                  + * 
                  + * 
                  + * + * + * @param {string} cacheId Name or id of the newly created cache. + * @param {object=} options Options object that specifies the cache behavior. Properties: + * + * - `{number=}` `capacity` — turns the cache into LRU cache. + * + * @returns {object} Newly created cache object with the following set of methods: + * + * - `{object}` `info()` — Returns id, size, and options of cache. + * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns + * it. + * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss. + * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache. + * - `{void}` `removeAll()` — Removes all cached values. + * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. + * + */ +function $CacheFactoryProvider() { + + this.$get = function() { + var caches = {}; + + function cacheFactory(cacheId, options) { + if (cacheId in caches) { + throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId); + } + + var size = 0, + stats = extend({}, options, {id: cacheId}), + data = {}, + capacity = (options && options.capacity) || Number.MAX_VALUE, + lruHash = {}, + freshEnd = null, + staleEnd = null; + + return caches[cacheId] = { + + put: function(key, value) { + var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); + + refresh(lruEntry); + + if (isUndefined(value)) return; + if (!(key in data)) size++; + data[key] = value; + + if (size > capacity) { + this.remove(staleEnd.key); + } + + return value; + }, + + + get: function(key) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + refresh(lruEntry); + + return data[key]; + }, + + + remove: function(key) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + if (lruEntry == freshEnd) freshEnd = lruEntry.p; + if (lruEntry == staleEnd) staleEnd = lruEntry.n; + link(lruEntry.n,lruEntry.p); + + delete lruHash[key]; + delete data[key]; + size--; + }, + + + removeAll: function() { + data = {}; + size = 0; + lruHash = {}; + freshEnd = staleEnd = null; + }, + + + destroy: function() { + data = null; + stats = null; + lruHash = null; + delete caches[cacheId]; + }, + + + info: function() { + return extend({}, stats, {size: size}); + } + }; + + + /** + * makes the `entry` the freshEnd of the LRU linked list + */ + function refresh(entry) { + if (entry != freshEnd) { + if (!staleEnd) { + staleEnd = entry; + } else if (staleEnd == entry) { + staleEnd = entry.n; + } + + link(entry.n, entry.p); + link(entry, freshEnd); + freshEnd = entry; + freshEnd.n = null; + } + } + + + /** + * bidirectionally links two entries of the LRU linked list + */ + function link(nextEntry, prevEntry) { + if (nextEntry != prevEntry) { + if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify + if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify + } + } + } + + + /** + * @ngdoc method + * @name ng.$cacheFactory#info + * @methodOf ng.$cacheFactory + * + * @description + * Get information about all the of the caches that have been created + * + * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info` + */ + cacheFactory.info = function() { + var info = {}; + forEach(caches, function(cache, cacheId) { + info[cacheId] = cache.info(); + }); + return info; + }; + + + /** + * @ngdoc method + * @name ng.$cacheFactory#get + * @methodOf ng.$cacheFactory + * + * @description + * Get access to a cache object by the `cacheId` used when it was created. + * + * @param {string} cacheId Name or id of a cache to access. + * @returns {object} Cache object identified by the cacheId or undefined if no such cache. + */ + cacheFactory.get = function(cacheId) { + return caches[cacheId]; + }; + + + return cacheFactory; + }; +} + +/** + * @ngdoc object + * @name ng.$templateCache + * + * @description + * The first time a template is used, it is loaded in the template cache for quick retrieval. You + * can load templates directly into the cache in a `script` tag, or by consuming the + * `$templateCache` service directly. + * + * Adding via the `script` tag: + *
                  + * 
                  + * 
                  + * 
                  + * 
                  + *   ...
                  + * 
                  + * 
                  + * + * **Note:** the `script` tag containing the template does not need to be included in the `head` of + * the document, but it must be below the `ng-app` definition. + * + * Adding via the $templateCache service: + * + *
                  + * var myApp = angular.module('myApp', []);
                  + * myApp.run(function($templateCache) {
                  + *   $templateCache.put('templateId.html', 'This is the content of the template');
                  + * });
                  + * 
                  + * + * To retrieve the template later, simply use it in your HTML: + *
                  + * 
                  + *
                  + * + * or get it via Javascript: + *
                  + * $templateCache.get('templateId.html')
                  + * 
                  + * + * See {@link ng.$cacheFactory $cacheFactory}. + * + */ +function $TemplateCacheProvider() { + this.$get = ['$cacheFactory', function($cacheFactory) { + return $cacheFactory('templates'); + }]; +} + +/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE! + * + * DOM-related variables: + * + * - "node" - DOM Node + * - "element" - DOM Element or Node + * - "$node" or "$element" - jqLite-wrapped node or element + * + * + * Compiler related stuff: + * + * - "linkFn" - linking fn of a single directive + * - "nodeLinkFn" - function that aggregates all linking fns for a particular node + * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node + * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList) + */ + + +/** + * @ngdoc function + * @name ng.$compile + * @function + * + * @description + * Compiles an HTML string or DOM into a template and produces a template function, which + * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together. + * + * The compilation is a process of walking the DOM tree and matching DOM elements to + * {@link ng.$compileProvider#methods_directive directives}. + * + *
                  + * **Note:** This document is an in-depth reference of all directive options. + * For a gentle introduction to directives with examples of common use cases, + * see the {@link guide/directive directive guide}. + *
                  + * + * ## Comprehensive Directive API + * + * There are many different options for a directive. + * + * The difference resides in the return value of the factory function. + * You can either return a "Directive Definition Object" (see below) that defines the directive properties, + * or just the `postLink` function (all other properties will have the default values). + * + *
                  + * **Best Practice:** It's recommended to use the "directive definition object" form. + *
                  + * + * Here's an example directive declared with a Directive Definition Object: + * + *
                  + *   var myModule = angular.module(...);
                  + *
                  + *   myModule.directive('directiveName', function factory(injectables) {
                  + *     var directiveDefinitionObject = {
                  + *       priority: 0,
                  + *       template: '
                  ', // or // function(tElement, tAttrs) { ... }, + * // or + * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... }, + * replace: false, + * transclude: false, + * restrict: 'A', + * scope: false, + * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, + * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], + * compile: function compile(tElement, tAttrs, transclude) { + * return { + * pre: function preLink(scope, iElement, iAttrs, controller) { ... }, + * post: function postLink(scope, iElement, iAttrs, controller) { ... } + * } + * // or + * // return function postLink( ... ) { ... } + * }, + * // or + * // link: { + * // pre: function preLink(scope, iElement, iAttrs, controller) { ... }, + * // post: function postLink(scope, iElement, iAttrs, controller) { ... } + * // } + * // or + * // link: function postLink( ... ) { ... } + * }; + * return directiveDefinitionObject; + * }); + *
                  + * + *
                  + * **Note:** Any unspecified options will use the default value. You can see the default values below. + *
                  + * + * Therefore the above can be simplified as: + * + *
                  + *   var myModule = angular.module(...);
                  + *
                  + *   myModule.directive('directiveName', function factory(injectables) {
                  + *     var directiveDefinitionObject = {
                  + *       link: function postLink(scope, iElement, iAttrs) { ... }
                  + *     };
                  + *     return directiveDefinitionObject;
                  + *     // or
                  + *     // return function postLink(scope, iElement, iAttrs) { ... }
                  + *   });
                  + * 
                  + * + * + * + * ### Directive Definition Object + * + * The directive definition object provides instructions to the {@link api/ng.$compile + * compiler}. The attributes are: + * + * #### `priority` + * When there are multiple directives defined on a single DOM element, sometimes it + * is necessary to specify the order in which the directives are applied. The `priority` is used + * to sort the directives before their `compile` functions get called. Priority is defined as a + * number. Directives with greater numerical `priority` are compiled first. Pre-link functions + * are also run in priority order, but post-link functions are run in reverse order. The order + * of directives with the same priority is undefined. The default priority is `0`. + * + * #### `terminal` + * If set to true then the current `priority` will be the last set of directives + * which will execute (any directives at the current priority will still execute + * as the order of execution on same `priority` is undefined). + * + * #### `scope` + * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the + * same element request a new scope, only one new scope is created. The new scope rule does not + * apply for the root of the template since the root of the template always gets a new scope. + * + * **If set to `{}` (object hash),** then a new "isolate" scope is created. The 'isolate' scope differs from + * normal scope in that it does not prototypically inherit from the parent scope. This is useful + * when creating reusable components, which should not accidentally read or modify data in the + * parent scope. + * + * The 'isolate' scope takes an object hash which defines a set of local scope properties + * derived from the parent scope. These local properties are useful for aliasing values for + * templates. Locals definition is a hash of local scope property to its source: + * + * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is + * always a string since DOM attributes are strings. If no `attr` name is specified then the + * attribute name is assumed to be the same as the local name. + * Given `` and widget definition + * of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect + * the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the + * `localName` property on the widget scope. The `name` is read from the parent scope (not + * component scope). + * + * * `=` or `=attr` - set up bi-directional binding between a local scope property and the + * parent scope property of name defined via the value of the `attr` attribute. If no `attr` + * name is specified then the attribute name is assumed to be the same as the local name. + * Given `` and widget definition of + * `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the + * value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected + * in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent + * scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You + * can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional. + * + * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope. + * If no `attr` name is specified then the attribute name is assumed to be the same as the + * local name. Given `` and widget definition of + * `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to + * a function wrapper for the `count = count + value` expression. Often it's desirable to + * pass data from the isolated scope via an expression and to the parent scope, this can be + * done by passing a map of local variable names and values into the expression wrapper fn. + * For example, if the expression is `increment(amount)` then we can specify the amount value + * by calling the `localFn` as `localFn({amount: 22})`. + * + * + * + * #### `controller` + * Controller constructor function. The controller is instantiated before the + * pre-linking phase and it is shared with other directives (see + * `require` attribute). This allows the directives to communicate with each other and augment + * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals: + * + * * `$scope` - Current scope associated with the element + * * `$element` - Current element + * * `$attrs` - Current attributes object for the element + * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope. + * The scope can be overridden by an optional first argument. + * `function([scope], cloneLinkingFn)`. + * + * + * #### `require` + * Require another directive and inject its controller as the fourth argument to the linking function. The + * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the + * injected argument will be an array in corresponding order. If no such directive can be + * found, or if the directive does not have a controller, then an error is raised. The name can be prefixed with: + * + * * (no prefix) - Locate the required controller on the current element. Throw an error if not found. + * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found. + * * `^` - Locate the required controller by searching the element's parents. Throw an error if not found. + * * `?^` - Attempt to locate the required controller by searching the element's parents or pass `null` to the + * `link` fn if not found. + * + * + * #### `controllerAs` + * Controller alias at the directive scope. An alias for the controller so it + * can be referenced at the directive template. The directive needs to define a scope for this + * configuration to be used. Useful in the case when directive is used as component. + * + * + * #### `restrict` + * String of subset of `EACM` which restricts the directive to a specific directive + * declaration style. If omitted, the default (attributes only) is used. + * + * * `E` - Element name: `` + * * `A` - Attribute (default): `
                  ` + * * `C` - Class: `
                  ` + * * `M` - Comment: `` + * + * + * #### `template` + * replace the current element with the contents of the HTML. The replacement process + * migrates all of the attributes / classes from the old element to the new one. See the + * {@link guide/directive#creating-custom-directives_creating-directives_template-expanding-directive + * Directives Guide} for an example. + * + * You can specify `template` as a string representing the template or as a function which takes + * two arguments `tElement` and `tAttrs` (described in the `compile` function api below) and + * returns a string value representing the template. + * + * + * #### `templateUrl` + * Same as `template` but the template is loaded from the specified URL. Because + * the template loading is asynchronous the compilation/linking is suspended until the template + * is loaded. + * + * You can specify `templateUrl` as a string representing the URL or as a function which takes two + * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns + * a string value representing the url. In either case, the template URL is passed through {@link + * api/ng.$sce#methods_getTrustedResourceUrl $sce.getTrustedResourceUrl}. + * + * + * #### `replace` + * specify where the template should be inserted. Defaults to `false`. + * + * * `true` - the template will replace the current element. + * * `false` - the template will replace the contents of the current element. + * + * + * #### `transclude` + * compile the content of the element and make it available to the directive. + * Typically used with {@link api/ng.directive:ngTransclude + * ngTransclude}. The advantage of transclusion is that the linking function receives a + * transclusion function which is pre-bound to the correct scope. In a typical setup the widget + * creates an `isolate` scope, but the transclusion is not a child, but a sibling of the `isolate` + * scope. This makes it possible for the widget to have private state, and the transclusion to + * be bound to the parent (pre-`isolate`) scope. + * + * * `true` - transclude the content of the directive. + * * `'element'` - transclude the whole element including any directives defined at lower priority. + * + * + * #### `compile` + * + *
                  + *   function compile(tElement, tAttrs, transclude) { ... }
                  + * 
                  + * + * The compile function deals with transforming the template DOM. Since most directives do not do + * template transformation, it is not used often. Examples that require compile functions are + * directives that transform template DOM, such as {@link + * api/ng.directive:ngRepeat ngRepeat}, or load the contents + * asynchronously, such as {@link api/ngRoute.directive:ngView ngView}. The + * compile function takes the following arguments. + * + * * `tElement` - template element - The element where the directive has been declared. It is + * safe to do template transformation on the element and child elements only. + * + * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared + * between all directive compile functions. + * + * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)` + * + *
                  + * **Note:** The template instance and the link instance may be different objects if the template has + * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that + * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration + * should be done in a linking function rather than in a compile function. + *
                  + * + *
                  + * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it + * e.g. does not know about the right outer scope. Please use the transclude function that is passed + * to the link function instead. + *
                  + + * A compile function can have a return value which can be either a function or an object. + * + * * returning a (post-link) function - is equivalent to registering the linking function via the + * `link` property of the config object when the compile function is empty. + * + * * returning an object with function(s) registered via `pre` and `post` properties - allows you to + * control when a linking function should be called during the linking phase. See info about + * pre-linking and post-linking functions below. + * + * + * #### `link` + * This property is used only if the `compile` property is not defined. + * + *
                  + *   function link(scope, iElement, iAttrs, controller, transcludeFn) { ... }
                  + * 
                  + * + * The link function is responsible for registering DOM listeners as well as updating the DOM. It is + * executed after the template has been cloned. This is where most of the directive logic will be + * put. + * + * * `scope` - {@link api/ng.$rootScope.Scope Scope} - The scope to be used by the + * directive for registering {@link api/ng.$rootScope.Scope#methods_$watch watches}. + * + * * `iElement` - instance element - The element where the directive is to be used. It is safe to + * manipulate the children of the element only in `postLink` function since the children have + * already been linked. + * + * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared + * between all directive linking functions. + * + * * `controller` - a controller instance - A controller instance if at least one directive on the + * element defines a controller. The controller is shared among all the directives, which allows + * the directives to use the controllers as a communication channel. + * + * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope. + * The scope can be overridden by an optional first argument. This is the same as the `$transclude` + * parameter of directive controllers. + * `function([scope], cloneLinkingFn)`. + * + * + * #### Pre-linking function + * + * Executed before the child elements are linked. Not safe to do DOM transformation since the + * compiler linking function will fail to locate the correct elements for linking. + * + * #### Post-linking function + * + * Executed after the child elements are linked. It is safe to do DOM transformation in the post-linking function. + * + * + * ### Attributes + * + * The {@link api/ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the + * `link()` or `compile()` functions. It has a variety of uses. + * + * accessing *Normalized attribute names:* + * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'. + * the attributes object allows for normalized access to + * the attributes. + * + * * *Directive inter-communication:* All directives share the same instance of the attributes + * object which allows the directives to use the attributes object as inter directive + * communication. + * + * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object + * allowing other directives to read the interpolated value. + * + * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes + * that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also + * the only way to easily get the actual value because during the linking phase the interpolation + * hasn't been evaluated yet and so the value is at this time set to `undefined`. + * + *
                  + * function linkingFn(scope, elm, attrs, ctrl) {
                  + *   // get the attribute value
                  + *   console.log(attrs.ngModel);
                  + *
                  + *   // change the attribute
                  + *   attrs.$set('ngModel', 'new value');
                  + *
                  + *   // observe changes to interpolated attribute
                  + *   attrs.$observe('ngModel', function(value) {
                  + *     console.log('ngModel has changed value to ' + value);
                  + *   });
                  + * }
                  + * 
                  + * + * Below is an example using `$compileProvider`. + * + *
                  + * **Note**: Typically directives are registered with `module.directive`. The example below is + * to illustrate how `$compile` works. + *
                  + * + + + +
                  +
                  +
                  +
                  +
                  +
                  + + it('should auto compile', function() { + expect(element('div[compile]').text()).toBe('Hello Angular'); + input('html').enter('{{name}}!'); + expect(element('div[compile]').text()).toBe('Angular!'); + }); + +
                  + + * + * + * @param {string|DOMElement} element Element or HTML string to compile into a template function. + * @param {function(angular.Scope[, cloneAttachFn]} transclude function available to directives. + * @param {number} maxPriority only apply directives lower then given priority (Only effects the + * root element(s), not their children) + * @returns {function(scope[, cloneAttachFn])} a link function which is used to bind template + * (a DOM element/tree) to a scope. Where: + * + * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to. + * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the + * `template` and call the `cloneAttachFn` function allowing the caller to attach the + * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is + * called as:
                  `cloneAttachFn(clonedElement, scope)` where: + * + * * `clonedElement` - is a clone of the original `element` passed into the compiler. + * * `scope` - is the current scope with which the linking function is working with. + * + * Calling the linking function returns the element of the template. It is either the original + * element passed in, or the clone of the element if the `cloneAttachFn` is provided. + * + * After linking the view is not updated until after a call to $digest which typically is done by + * Angular automatically. + * + * If you need access to the bound view, there are two ways to do it: + * + * - If you are not asking the linking function to clone the template, create the DOM element(s) + * before you send them to the compiler and keep this reference around. + *
                  + *     var element = $compile('

                  {{total}}

                  ')(scope); + *
                  + * + * - if on the other hand, you need the element to be cloned, the view reference from the original + * example would not point to the clone, but rather to the original template that was cloned. In + * this case, you can access the clone via the cloneAttachFn: + *
                  + *     var templateElement = angular.element('

                  {{total}}

                  '), + * scope = ....; + * + * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) { + * //attach the clone to DOM document at the right place + * }); + * + * //now we have reference to the cloned DOM via `clonedElement` + *
                  + * + * + * For information on how the compiler works, see the + * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide. + */ + +var $compileMinErr = minErr('$compile'); + +/** + * @ngdoc service + * @name ng.$compileProvider + * @function + * + * @description + */ +$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider']; +function $CompileProvider($provide, $$sanitizeUriProvider) { + var hasDirectives = {}, + Suffix = 'Directive', + COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/, + CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/; + + // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes + // The assumption is that future DOM event attribute names will begin with + // 'on' and be composed of only English letters. + var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/; + + /** + * @ngdoc function + * @name ng.$compileProvider#directive + * @methodOf ng.$compileProvider + * @function + * + * @description + * Register a new directive with the compiler. + * + * @param {string|Object} name Name of the directive in camel-case (i.e. ngBind which + * will match as ng-bind), or an object map of directives where the keys are the + * names and the values are the factories. + * @param {function|Array} directiveFactory An injectable directive factory function. See + * {@link guide/directive} for more info. + * @returns {ng.$compileProvider} Self for chaining. + */ + this.directive = function registerDirective(name, directiveFactory) { + assertNotHasOwnProperty(name, 'directive'); + if (isString(name)) { + assertArg(directiveFactory, 'directiveFactory'); + if (!hasDirectives.hasOwnProperty(name)) { + hasDirectives[name] = []; + $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', + function($injector, $exceptionHandler) { + var directives = []; + forEach(hasDirectives[name], function(directiveFactory, index) { + try { + var directive = $injector.invoke(directiveFactory); + if (isFunction(directive)) { + directive = { compile: valueFn(directive) }; + } else if (!directive.compile && directive.link) { + directive.compile = valueFn(directive.link); + } + directive.priority = directive.priority || 0; + directive.index = index; + directive.name = directive.name || name; + directive.require = directive.require || (directive.controller && directive.name); + directive.restrict = directive.restrict || 'A'; + directives.push(directive); + } catch (e) { + $exceptionHandler(e); + } + }); + return directives; + }]); + } + hasDirectives[name].push(directiveFactory); + } else { + forEach(name, reverseParams(registerDirective)); + } + return this; + }; + + + /** + * @ngdoc function + * @name ng.$compileProvider#aHrefSanitizationWhitelist + * @methodOf ng.$compileProvider + * @function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during a[href] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.aHrefSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp); + return this; + } else { + return $$sanitizeUriProvider.aHrefSanitizationWhitelist(); + } + }; + + + /** + * @ngdoc function + * @name ng.$compileProvider#imgSrcSanitizationWhitelist + * @methodOf ng.$compileProvider + * @function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during img[src] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.imgSrcSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp); + return this; + } else { + return $$sanitizeUriProvider.imgSrcSanitizationWhitelist(); + } + }; + + this.$get = [ + '$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse', + '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri', + function($injector, $interpolate, $exceptionHandler, $http, $templateCache, $parse, + $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri) { + + var Attributes = function(element, attr) { + this.$$element = element; + this.$attr = attr || {}; + }; + + Attributes.prototype = { + $normalize: directiveNormalize, + + + /** + * @ngdoc function + * @name ng.$compile.directive.Attributes#$addClass + * @methodOf ng.$compile.directive.Attributes + * @function + * + * @description + * Adds the CSS class value specified by the classVal parameter to the element. If animations + * are enabled then an animation will be triggered for the class addition. + * + * @param {string} classVal The className value that will be added to the element + */ + $addClass : function(classVal) { + if(classVal && classVal.length > 0) { + $animate.addClass(this.$$element, classVal); + } + }, + + /** + * @ngdoc function + * @name ng.$compile.directive.Attributes#$removeClass + * @methodOf ng.$compile.directive.Attributes + * @function + * + * @description + * Removes the CSS class value specified by the classVal parameter from the element. If + * animations are enabled then an animation will be triggered for the class removal. + * + * @param {string} classVal The className value that will be removed from the element + */ + $removeClass : function(classVal) { + if(classVal && classVal.length > 0) { + $animate.removeClass(this.$$element, classVal); + } + }, + + /** + * @ngdoc function + * @name ng.$compile.directive.Attributes#$updateClass + * @methodOf ng.$compile.directive.Attributes + * @function + * + * @description + * Adds and removes the appropriate CSS class values to the element based on the difference + * between the new and old CSS class values (specified as newClasses and oldClasses). + * + * @param {string} newClasses The current CSS className value + * @param {string} oldClasses The former CSS className value + */ + $updateClass : function(newClasses, oldClasses) { + this.$removeClass(tokenDifference(oldClasses, newClasses)); + this.$addClass(tokenDifference(newClasses, oldClasses)); + }, + + /** + * Set a normalized attribute on the element in a way such that all directives + * can share the attribute. This function properly handles boolean attributes. + * @param {string} key Normalized key. (ie ngAttribute) + * @param {string|boolean} value The value to set. If `null` attribute will be deleted. + * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute. + * Defaults to true. + * @param {string=} attrName Optional none normalized name. Defaults to key. + */ + $set: function(key, value, writeAttr, attrName) { + // TODO: decide whether or not to throw an error if "class" + //is set through this function since it may cause $updateClass to + //become unstable. + + var booleanKey = getBooleanAttrName(this.$$element[0], key), + normalizedVal, + nodeName; + + if (booleanKey) { + this.$$element.prop(key, value); + attrName = booleanKey; + } + + this[key] = value; + + // translate normalized key to actual key + if (attrName) { + this.$attr[key] = attrName; + } else { + attrName = this.$attr[key]; + if (!attrName) { + this.$attr[key] = attrName = snake_case(key, '-'); + } + } + + nodeName = nodeName_(this.$$element); + + // sanitize a[href] and img[src] values + if ((nodeName === 'A' && key === 'href') || + (nodeName === 'IMG' && key === 'src')) { + this[key] = value = $$sanitizeUri(value, key === 'src'); + } + + if (writeAttr !== false) { + if (value === null || value === undefined) { + this.$$element.removeAttr(attrName); + } else { + this.$$element.attr(attrName, value); + } + } + + // fire observers + var $$observers = this.$$observers; + $$observers && forEach($$observers[key], function(fn) { + try { + fn(value); + } catch (e) { + $exceptionHandler(e); + } + }); + }, + + + /** + * @ngdoc function + * @name ng.$compile.directive.Attributes#$observe + * @methodOf ng.$compile.directive.Attributes + * @function + * + * @description + * Observes an interpolated attribute. + * + * The observer function will be invoked once during the next `$digest` following + * compilation. The observer is then invoked whenever the interpolated value + * changes. + * + * @param {string} key Normalized key. (ie ngAttribute) . + * @param {function(interpolatedValue)} fn Function that will be called whenever + the interpolated value of the attribute changes. + * See the {@link guide/directive#Attributes Directives} guide for more info. + * @returns {function()} the `fn` parameter. + */ + $observe: function(key, fn) { + var attrs = this, + $$observers = (attrs.$$observers || (attrs.$$observers = {})), + listeners = ($$observers[key] || ($$observers[key] = [])); + + listeners.push(fn); + $rootScope.$evalAsync(function() { + if (!listeners.$$inter) { + // no one registered attribute interpolation function, so lets call it manually + fn(attrs[key]); + } + }); + return fn; + } + }; + + var startSymbol = $interpolate.startSymbol(), + endSymbol = $interpolate.endSymbol(), + denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}') + ? identity + : function denormalizeTemplate(template) { + return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); + }, + NG_ATTR_BINDING = /^ngAttr[A-Z]/; + + + return compile; + + //================================ + + function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, + previousCompileContext) { + if (!($compileNodes instanceof jqLite)) { + // jquery always rewraps, whereas we need to preserve the original selector so that we can + // modify it. + $compileNodes = jqLite($compileNodes); + } + // We can not compile top level text elements since text nodes can be merged and we will + // not be able to attach scope data to them, so we will wrap them in + forEach($compileNodes, function(node, index){ + if (node.nodeType == 3 /* text node */ && node.nodeValue.match(/\S+/) /* non-empty */ ) { + $compileNodes[index] = node = jqLite(node).wrap('').parent()[0]; + } + }); + var compositeLinkFn = + compileNodes($compileNodes, transcludeFn, $compileNodes, + maxPriority, ignoreDirective, previousCompileContext); + safeAddClass($compileNodes, 'ng-scope'); + return function publicLinkFn(scope, cloneConnectFn, transcludeControllers){ + assertArg(scope, 'scope'); + // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart + // and sometimes changes the structure of the DOM. + var $linkNode = cloneConnectFn + ? JQLitePrototype.clone.call($compileNodes) // IMPORTANT!!! + : $compileNodes; + + forEach(transcludeControllers, function(instance, name) { + $linkNode.data('$' + name + 'Controller', instance); + }); + + // Attach scope only to non-text nodes. + for(var i = 0, ii = $linkNode.length; i + addDirective(directives, + directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority, ignoreDirective); + + // iterate over the attributes + for (var attr, name, nName, ngAttrName, value, nAttrs = node.attributes, + j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { + var attrStartName = false; + var attrEndName = false; + + attr = nAttrs[j]; + if (!msie || msie >= 8 || attr.specified) { + name = attr.name; + // support ngAttr attribute binding + ngAttrName = directiveNormalize(name); + if (NG_ATTR_BINDING.test(ngAttrName)) { + name = snake_case(ngAttrName.substr(6), '-'); + } + + var directiveNName = ngAttrName.replace(/(Start|End)$/, ''); + if (ngAttrName === directiveNName + 'Start') { + attrStartName = name; + attrEndName = name.substr(0, name.length - 5) + 'end'; + name = name.substr(0, name.length - 6); + } + + nName = directiveNormalize(name.toLowerCase()); + attrsMap[nName] = name; + attrs[nName] = value = trim(attr.value); + if (getBooleanAttrName(node, nName)) { + attrs[nName] = true; // presence means true + } + addAttrInterpolateDirective(node, directives, value, nName); + addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName, + attrEndName); + } + } + + // use class as directive + className = node.className; + if (isString(className) && className !== '') { + while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { + nName = directiveNormalize(match[2]); + if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[3]); + } + className = className.substr(match.index + match[0].length); + } + } + break; + case 3: /* Text Node */ + addTextInterpolateDirective(directives, node.nodeValue); + break; + case 8: /* Comment */ + try { + match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); + if (match) { + nName = directiveNormalize(match[1]); + if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[2]); + } + } + } catch (e) { + // turns out that under some circumstances IE9 throws errors when one attempts to read + // comment's node value. + // Just ignore it and continue. (Can't seem to reproduce in test case.) + } + break; + } + + directives.sort(byPriority); + return directives; + } + + /** + * Given a node with an directive-start it collects all of the siblings until it finds + * directive-end. + * @param node + * @param attrStart + * @param attrEnd + * @returns {*} + */ + function groupScan(node, attrStart, attrEnd) { + var nodes = []; + var depth = 0; + if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) { + var startNode = node; + do { + if (!node) { + throw $compileMinErr('uterdir', + "Unterminated attribute, found '{0}' but no matching '{1}' found.", + attrStart, attrEnd); + } + if (node.nodeType == 1 /** Element **/) { + if (node.hasAttribute(attrStart)) depth++; + if (node.hasAttribute(attrEnd)) depth--; + } + nodes.push(node); + node = node.nextSibling; + } while (depth > 0); + } else { + nodes.push(node); + } + + return jqLite(nodes); + } + + /** + * Wrapper for linking function which converts normal linking function into a grouped + * linking function. + * @param linkFn + * @param attrStart + * @param attrEnd + * @returns {Function} + */ + function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) { + return function(scope, element, attrs, controllers, transcludeFn) { + element = groupScan(element[0], attrStart, attrEnd); + return linkFn(scope, element, attrs, controllers, transcludeFn); + }; + } + + /** + * Once the directives have been collected, their compile functions are executed. This method + * is responsible for inlining directive templates as well as terminating the application + * of the directives if the terminal directive has been reached. + * + * @param {Array} directives Array of collected directives to execute their compile function. + * this needs to be pre-sorted by priority order. + * @param {Node} compileNode The raw DOM node to apply the compile functions to + * @param {Object} templateAttrs The shared attribute function + * @param {function(angular.Scope[, cloneAttachFn]} transcludeFn A linking function, where the + * scope argument is auto-generated to the new + * child of the transcluded parent scope. + * @param {JQLite} jqCollection If we are working on the root of the compile tree then this + * argument has the root jqLite array so that we can replace nodes + * on it. + * @param {Object=} originalReplaceDirective An optional directive that will be ignored when + * compiling the transclusion. + * @param {Array.} preLinkFns + * @param {Array.} postLinkFns + * @param {Object} previousCompileContext Context used for previous compilation of the current + * node + * @returns linkFn + */ + function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, + jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, + previousCompileContext) { + previousCompileContext = previousCompileContext || {}; + + var terminalPriority = -Number.MAX_VALUE, + newScopeDirective, + controllerDirectives = previousCompileContext.controllerDirectives, + newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, + templateDirective = previousCompileContext.templateDirective, + nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, + hasTranscludeDirective = false, + hasElementTranscludeDirective = false, + $compileNode = templateAttrs.$$element = jqLite(compileNode), + directive, + directiveName, + $template, + replaceDirective = originalReplaceDirective, + childTranscludeFn = transcludeFn, + linkFn, + directiveValue; + + // executes all directives on the current element + for(var i = 0, ii = directives.length; i < ii; i++) { + directive = directives[i]; + var attrStart = directive.$$start; + var attrEnd = directive.$$end; + + // collect multiblock sections + if (attrStart) { + $compileNode = groupScan(compileNode, attrStart, attrEnd); + } + $template = undefined; + + if (terminalPriority > directive.priority) { + break; // prevent further processing of directives + } + + if (directiveValue = directive.scope) { + newScopeDirective = newScopeDirective || directive; + + // skip the check for directives with async templates, we'll check the derived sync + // directive when the template arrives + if (!directive.templateUrl) { + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive, + $compileNode); + if (isObject(directiveValue)) { + newIsolateScopeDirective = directive; + } + } + } + + directiveName = directive.name; + + if (!directive.templateUrl && directive.controller) { + directiveValue = directive.controller; + controllerDirectives = controllerDirectives || {}; + assertNoDuplicate("'" + directiveName + "' controller", + controllerDirectives[directiveName], directive, $compileNode); + controllerDirectives[directiveName] = directive; + } + + if (directiveValue = directive.transclude) { + hasTranscludeDirective = true; + + // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion. + // This option should only be used by directives that know how to how to safely handle element transclusion, + // where the transcluded nodes are added or replaced after linking. + if (!directive.$$tlb) { + assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode); + nonTlbTranscludeDirective = directive; + } + + if (directiveValue == 'element') { + hasElementTranscludeDirective = true; + terminalPriority = directive.priority; + $template = groupScan(compileNode, attrStart, attrEnd); + $compileNode = templateAttrs.$$element = + jqLite(document.createComment(' ' + directiveName + ': ' + + templateAttrs[directiveName] + ' ')); + compileNode = $compileNode[0]; + replaceWith(jqCollection, jqLite(sliceArgs($template)), compileNode); + + childTranscludeFn = compile($template, transcludeFn, terminalPriority, + replaceDirective && replaceDirective.name, { + // Don't pass in: + // - controllerDirectives - otherwise we'll create duplicates controllers + // - newIsolateScopeDirective or templateDirective - combining templates with + // element transclusion doesn't make sense. + // + // We need only nonTlbTranscludeDirective so that we prevent putting transclusion + // on the same element more than once. + nonTlbTranscludeDirective: nonTlbTranscludeDirective + }); + } else { + $template = jqLite(jqLiteClone(compileNode)).contents(); + $compileNode.empty(); // clear contents + childTranscludeFn = compile($template, transcludeFn); + } + } + + if (directive.template) { + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + directiveValue = (isFunction(directive.template)) + ? directive.template($compileNode, templateAttrs) + : directive.template; + + directiveValue = denormalizeTemplate(directiveValue); + + if (directive.replace) { + replaceDirective = directive; + $template = jqLite('
                  ' + + trim(directiveValue) + + '
                  ').contents(); + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== 1) { + throw $compileMinErr('tplrt', + "Template for directive '{0}' must have exactly one root element. {1}", + directiveName, ''); + } + + replaceWith(jqCollection, $compileNode, compileNode); + + var newTemplateAttrs = {$attr: {}}; + + // combine directives from the original node and from the template: + // - take the array of directives for this element + // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed) + // - collect directives from the template and sort them by priority + // - combine directives as: processed + template + unprocessed + var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs); + var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1)); + + if (newIsolateScopeDirective) { + markDirectivesAsIsolate(templateDirectives); + } + directives = directives.concat(templateDirectives).concat(unprocessedDirectives); + mergeTemplateAttributes(templateAttrs, newTemplateAttrs); + + ii = directives.length; + } else { + $compileNode.html(directiveValue); + } + } + + if (directive.templateUrl) { + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + if (directive.replace) { + replaceDirective = directive; + } + + nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode, + templateAttrs, jqCollection, childTranscludeFn, preLinkFns, postLinkFns, { + controllerDirectives: controllerDirectives, + newIsolateScopeDirective: newIsolateScopeDirective, + templateDirective: templateDirective, + nonTlbTranscludeDirective: nonTlbTranscludeDirective + }); + ii = directives.length; + } else if (directive.compile) { + try { + linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); + if (isFunction(linkFn)) { + addLinkFns(null, linkFn, attrStart, attrEnd); + } else if (linkFn) { + addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd); + } + } catch (e) { + $exceptionHandler(e, startingTag($compileNode)); + } + } + + if (directive.terminal) { + nodeLinkFn.terminal = true; + terminalPriority = Math.max(terminalPriority, directive.priority); + } + + } + + nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; + nodeLinkFn.transclude = hasTranscludeDirective && childTranscludeFn; + + // might be normal or delayed nodeLinkFn depending on if templateUrl is present + return nodeLinkFn; + + //////////////////// + + function addLinkFns(pre, post, attrStart, attrEnd) { + if (pre) { + if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd); + pre.require = directive.require; + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { + pre = cloneAndAnnotateFn(pre, {isolateScope: true}); + } + preLinkFns.push(pre); + } + if (post) { + if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd); + post.require = directive.require; + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { + post = cloneAndAnnotateFn(post, {isolateScope: true}); + } + postLinkFns.push(post); + } + } + + + function getControllers(require, $element, elementControllers) { + var value, retrievalMethod = 'data', optional = false; + if (isString(require)) { + while((value = require.charAt(0)) == '^' || value == '?') { + require = require.substr(1); + if (value == '^') { + retrievalMethod = 'inheritedData'; + } + optional = optional || value == '?'; + } + value = null; + + if (elementControllers && retrievalMethod === 'data') { + value = elementControllers[require]; + } + value = value || $element[retrievalMethod]('$' + require + 'Controller'); + + if (!value && !optional) { + throw $compileMinErr('ctreq', + "Controller '{0}', required by directive '{1}', can't be found!", + require, directiveName); + } + return value; + } else if (isArray(require)) { + value = []; + forEach(require, function(require) { + value.push(getControllers(require, $element, elementControllers)); + }); + } + return value; + } + + + function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) { + var attrs, $element, i, ii, linkFn, controller, isolateScope, elementControllers = {}, transcludeFn; + + if (compileNode === linkNode) { + attrs = templateAttrs; + } else { + attrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr)); + } + $element = attrs.$$element; + + if (newIsolateScopeDirective) { + var LOCAL_REGEXP = /^\s*([@=&])(\??)\s*(\w*)\s*$/; + var $linkNode = jqLite(linkNode); + + isolateScope = scope.$new(true); + + if (templateDirective && (templateDirective === newIsolateScopeDirective.$$originalDirective)) { + $linkNode.data('$isolateScope', isolateScope) ; + } else { + $linkNode.data('$isolateScopeNoTemplate', isolateScope); + } + + + + safeAddClass($linkNode, 'ng-isolate-scope'); + + forEach(newIsolateScopeDirective.scope, function(definition, scopeName) { + var match = definition.match(LOCAL_REGEXP) || [], + attrName = match[3] || scopeName, + optional = (match[2] == '?'), + mode = match[1], // @, =, or & + lastValue, + parentGet, parentSet, compare; + + isolateScope.$$isolateBindings[scopeName] = mode + attrName; + + switch (mode) { + + case '@': + attrs.$observe(attrName, function(value) { + isolateScope[scopeName] = value; + }); + attrs.$$observers[attrName].$$scope = scope; + if( attrs[attrName] ) { + // If the attribute has been provided then we trigger an interpolation to ensure + // the value is there for use in the link fn + isolateScope[scopeName] = $interpolate(attrs[attrName])(scope); + } + break; + + case '=': + if (optional && !attrs[attrName]) { + return; + } + parentGet = $parse(attrs[attrName]); + if (parentGet.literal) { + compare = equals; + } else { + compare = function(a,b) { return a === b; }; + } + parentSet = parentGet.assign || function() { + // reset the change, or we will throw this exception on every $digest + lastValue = isolateScope[scopeName] = parentGet(scope); + throw $compileMinErr('nonassign', + "Expression '{0}' used with directive '{1}' is non-assignable!", + attrs[attrName], newIsolateScopeDirective.name); + }; + lastValue = isolateScope[scopeName] = parentGet(scope); + isolateScope.$watch(function parentValueWatch() { + var parentValue = parentGet(scope); + if (!compare(parentValue, isolateScope[scopeName])) { + // we are out of sync and need to copy + if (!compare(parentValue, lastValue)) { + // parent changed and it has precedence + isolateScope[scopeName] = parentValue; + } else { + // if the parent can be assigned then do so + parentSet(scope, parentValue = isolateScope[scopeName]); + } + } + return lastValue = parentValue; + }, null, parentGet.literal); + break; + + case '&': + parentGet = $parse(attrs[attrName]); + isolateScope[scopeName] = function(locals) { + return parentGet(scope, locals); + }; + break; + + default: + throw $compileMinErr('iscp', + "Invalid isolate scope definition for directive '{0}'." + + " Definition: {... {1}: '{2}' ...}", + newIsolateScopeDirective.name, scopeName, definition); + } + }); + } + transcludeFn = boundTranscludeFn && controllersBoundTransclude; + if (controllerDirectives) { + forEach(controllerDirectives, function(directive) { + var locals = { + $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope, + $element: $element, + $attrs: attrs, + $transclude: transcludeFn + }, controllerInstance; + + controller = directive.controller; + if (controller == '@') { + controller = attrs[directive.name]; + } + + controllerInstance = $controller(controller, locals); + // For directives with element transclusion the element is a comment, + // but jQuery .data doesn't support attaching data to comment nodes as it's hard to + // clean up (http://bugs.jquery.com/ticket/8335). + // Instead, we save the controllers for the element in a local hash and attach to .data + // later, once we have the actual element. + elementControllers[directive.name] = controllerInstance; + if (!hasElementTranscludeDirective) { + $element.data('$' + directive.name + 'Controller', controllerInstance); + } + + if (directive.controllerAs) { + locals.$scope[directive.controllerAs] = controllerInstance; + } + }); + } + + // PRELINKING + for(i = 0, ii = preLinkFns.length; i < ii; i++) { + try { + linkFn = preLinkFns[i]; + linkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs, + linkFn.require && getControllers(linkFn.require, $element, elementControllers), transcludeFn); + } catch (e) { + $exceptionHandler(e, startingTag($element)); + } + } + + // RECURSION + // We only pass the isolate scope, if the isolate directive has a template, + // otherwise the child elements do not belong to the isolate directive. + var scopeToChild = scope; + if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) { + scopeToChild = isolateScope; + } + childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn); + + // POSTLINKING + for(i = postLinkFns.length - 1; i >= 0; i--) { + try { + linkFn = postLinkFns[i]; + linkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs, + linkFn.require && getControllers(linkFn.require, $element, elementControllers), transcludeFn); + } catch (e) { + $exceptionHandler(e, startingTag($element)); + } + } + + // This is the function that is injected as `$transclude`. + function controllersBoundTransclude(scope, cloneAttachFn) { + var transcludeControllers; + + // no scope passed + if (arguments.length < 2) { + cloneAttachFn = scope; + scope = undefined; + } + + if (hasElementTranscludeDirective) { + transcludeControllers = elementControllers; + } + + return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers); + } + } + } + + function markDirectivesAsIsolate(directives) { + // mark all directives as needing isolate scope. + for (var j = 0, jj = directives.length; j < jj; j++) { + directives[j] = inherit(directives[j], {$$isolateScope: true}); + } + } + + /** + * looks up the directive and decorates it with exception handling and proper parameters. We + * call this the boundDirective. + * + * @param {string} name name of the directive to look up. + * @param {string} location The directive must be found in specific format. + * String containing any of theses characters: + * + * * `E`: element name + * * `A': attribute + * * `C`: class + * * `M`: comment + * @returns true if directive was added. + */ + function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName, + endAttrName) { + if (name === ignoreDirective) return null; + var match = null; + if (hasDirectives.hasOwnProperty(name)) { + for(var directive, directives = $injector.get(name + Suffix), + i = 0, ii = directives.length; i directive.priority) && + directive.restrict.indexOf(location) != -1) { + if (startAttrName) { + directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName}); + } + tDirectives.push(directive); + match = directive; + } + } catch(e) { $exceptionHandler(e); } + } + } + return match; + } + + + /** + * When the element is replaced with HTML template then the new attributes + * on the template need to be merged with the existing attributes in the DOM. + * The desired effect is to have both of the attributes present. + * + * @param {object} dst destination attributes (original DOM) + * @param {object} src source attributes (from the directive template) + */ + function mergeTemplateAttributes(dst, src) { + var srcAttr = src.$attr, + dstAttr = dst.$attr, + $element = dst.$$element; + + // reapply the old attributes to the new element + forEach(dst, function(value, key) { + if (key.charAt(0) != '$') { + if (src[key]) { + value += (key === 'style' ? ';' : ' ') + src[key]; + } + dst.$set(key, value, true, srcAttr[key]); + } + }); + + // copy the new attributes on the old attrs object + forEach(src, function(value, key) { + if (key == 'class') { + safeAddClass($element, value); + dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value; + } else if (key == 'style') { + $element.attr('style', $element.attr('style') + ';' + value); + dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value; + // `dst` will never contain hasOwnProperty as DOM parser won't let it. + // You will get an "InvalidCharacterError: DOM Exception 5" error if you + // have an attribute like "has-own-property" or "data-has-own-property", etc. + } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { + dst[key] = value; + dstAttr[key] = srcAttr[key]; + } + }); + } + + + function compileTemplateUrl(directives, $compileNode, tAttrs, + $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) { + var linkQueue = [], + afterTemplateNodeLinkFn, + afterTemplateChildLinkFn, + beforeTemplateCompileNode = $compileNode[0], + origAsyncDirective = directives.shift(), + // The fact that we have to copy and patch the directive seems wrong! + derivedSyncDirective = extend({}, origAsyncDirective, { + templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective + }), + templateUrl = (isFunction(origAsyncDirective.templateUrl)) + ? origAsyncDirective.templateUrl($compileNode, tAttrs) + : origAsyncDirective.templateUrl; + + $compileNode.empty(); + + $http.get($sce.getTrustedResourceUrl(templateUrl), {cache: $templateCache}). + success(function(content) { + var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn; + + content = denormalizeTemplate(content); + + if (origAsyncDirective.replace) { + $template = jqLite('
                  ' + trim(content) + '
                  ').contents(); + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== 1) { + throw $compileMinErr('tplrt', + "Template for directive '{0}' must have exactly one root element. {1}", + origAsyncDirective.name, templateUrl); + } + + tempTemplateAttrs = {$attr: {}}; + replaceWith($rootElement, $compileNode, compileNode); + var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs); + + if (isObject(origAsyncDirective.scope)) { + markDirectivesAsIsolate(templateDirectives); + } + directives = templateDirectives.concat(directives); + mergeTemplateAttributes(tAttrs, tempTemplateAttrs); + } else { + compileNode = beforeTemplateCompileNode; + $compileNode.html(content); + } + + directives.unshift(derivedSyncDirective); + + afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, + childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns, + previousCompileContext); + forEach($rootElement, function(node, i) { + if (node == compileNode) { + $rootElement[i] = $compileNode[0]; + } + }); + afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); + + + while(linkQueue.length) { + var scope = linkQueue.shift(), + beforeTemplateLinkNode = linkQueue.shift(), + linkRootElement = linkQueue.shift(), + boundTranscludeFn = linkQueue.shift(), + linkNode = $compileNode[0]; + + if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { + // it was cloned therefore we have to clone as well. + linkNode = jqLiteClone(compileNode); + replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); + } + if (afterTemplateNodeLinkFn.transclude) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude); + } else { + childBoundTranscludeFn = boundTranscludeFn; + } + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, + childBoundTranscludeFn); + } + linkQueue = null; + }). + error(function(response, code, headers, config) { + throw $compileMinErr('tpload', 'Failed to load template: {0}', config.url); + }); + + return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) { + if (linkQueue) { + linkQueue.push(scope); + linkQueue.push(node); + linkQueue.push(rootElement); + linkQueue.push(boundTranscludeFn); + } else { + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, boundTranscludeFn); + } + }; + } + + + /** + * Sorting function for bound directives. + */ + function byPriority(a, b) { + var diff = b.priority - a.priority; + if (diff !== 0) return diff; + if (a.name !== b.name) return (a.name < b.name) ? -1 : 1; + return a.index - b.index; + } + + + function assertNoDuplicate(what, previousDirective, directive, element) { + if (previousDirective) { + throw $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}', + previousDirective.name, directive.name, what, startingTag(element)); + } + } + + + function addTextInterpolateDirective(directives, text) { + var interpolateFn = $interpolate(text, true); + if (interpolateFn) { + directives.push({ + priority: 0, + compile: valueFn(function textInterpolateLinkFn(scope, node) { + var parent = node.parent(), + bindings = parent.data('$binding') || []; + bindings.push(interpolateFn); + safeAddClass(parent.data('$binding', bindings), 'ng-binding'); + scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { + node[0].nodeValue = value; + }); + }) + }); + } + } + + + function getTrustedContext(node, attrNormalizedName) { + if (attrNormalizedName == "srcdoc") { + return $sce.HTML; + } + var tag = nodeName_(node); + // maction[xlink:href] can source SVG. It's not limited to . + if (attrNormalizedName == "xlinkHref" || + (tag == "FORM" && attrNormalizedName == "action") || + (tag != "IMG" && (attrNormalizedName == "src" || + attrNormalizedName == "ngSrc"))) { + return $sce.RESOURCE_URL; + } + } + + + function addAttrInterpolateDirective(node, directives, value, name) { + var interpolateFn = $interpolate(value, true); + + // no interpolation found -> ignore + if (!interpolateFn) return; + + + if (name === "multiple" && nodeName_(node) === "SELECT") { + throw $compileMinErr("selmulti", + "Binding to the 'multiple' attribute is not supported. Element: {0}", + startingTag(node)); + } + + directives.push({ + priority: 100, + compile: function() { + return { + pre: function attrInterpolatePreLinkFn(scope, element, attr) { + var $$observers = (attr.$$observers || (attr.$$observers = {})); + + if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { + throw $compileMinErr('nodomevents', + "Interpolations for HTML DOM event attributes are disallowed. Please use the " + + "ng- versions (such as ng-click instead of onclick) instead."); + } + + // we need to interpolate again, in case the attribute value has been updated + // (e.g. by another directive's compile function) + interpolateFn = $interpolate(attr[name], true, getTrustedContext(node, name)); + + // if attribute was updated so that there is no interpolation going on we don't want to + // register any observers + if (!interpolateFn) return; + + // TODO(i): this should likely be attr.$set(name, iterpolateFn(scope) so that we reset the + // actual attr value + attr[name] = interpolateFn(scope); + ($$observers[name] || ($$observers[name] = [])).$$inter = true; + (attr.$$observers && attr.$$observers[name].$$scope || scope). + $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) { + //special case for class attribute addition + removal + //so that class changes can tap into the animation + //hooks provided by the $animate service. Be sure to + //skip animations when the first digest occurs (when + //both the new and the old values are the same) since + //the CSS classes are the non-interpolated values + if(name === 'class' && newValue != oldValue) { + attr.$updateClass(newValue, oldValue); + } else { + attr.$set(name, newValue); + } + }); + } + }; + } + }); + } + + + /** + * This is a special jqLite.replaceWith, which can replace items which + * have no parents, provided that the containing jqLite collection is provided. + * + * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes + * in the root of the tree. + * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep + * the shell, but replace its DOM node reference. + * @param {Node} newNode The new DOM node. + */ + function replaceWith($rootElement, elementsToRemove, newNode) { + var firstElementToRemove = elementsToRemove[0], + removeCount = elementsToRemove.length, + parent = firstElementToRemove.parentNode, + i, ii; + + if ($rootElement) { + for(i = 0, ii = $rootElement.length; i < ii; i++) { + if ($rootElement[i] == firstElementToRemove) { + $rootElement[i++] = newNode; + for (var j = i, j2 = j + removeCount - 1, + jj = $rootElement.length; + j < jj; j++, j2++) { + if (j2 < jj) { + $rootElement[j] = $rootElement[j2]; + } else { + delete $rootElement[j]; + } + } + $rootElement.length -= removeCount - 1; + break; + } + } + } + + if (parent) { + parent.replaceChild(newNode, firstElementToRemove); + } + var fragment = document.createDocumentFragment(); + fragment.appendChild(firstElementToRemove); + newNode[jqLite.expando] = firstElementToRemove[jqLite.expando]; + for (var k = 1, kk = elementsToRemove.length; k < kk; k++) { + var element = elementsToRemove[k]; + jqLite(element).remove(); // must do this way to clean up expando + fragment.appendChild(element); + delete elementsToRemove[k]; + } + + elementsToRemove[0] = newNode; + elementsToRemove.length = 1; + } + + + function cloneAndAnnotateFn(fn, annotation) { + return extend(function() { return fn.apply(null, arguments); }, fn, annotation); + } + }]; +} + +var PREFIX_REGEXP = /^(x[\:\-_]|data[\:\-_])/i; +/** + * Converts all accepted directives format into proper directive name. + * All of these will become 'myDirective': + * my:Directive + * my-directive + * x-my-directive + * data-my:directive + * + * Also there is special case for Moz prefix starting with upper case letter. + * @param name Name to normalize + */ +function directiveNormalize(name) { + return camelCase(name.replace(PREFIX_REGEXP, '')); +} + +/** + * @ngdoc object + * @name ng.$compile.directive.Attributes + * + * @description + * A shared object between directive compile / linking functions which contains normalized DOM + * element attributes. The values reflect current binding state `{{ }}`. The normalization is + * needed since all of these are treated as equivalent in Angular: + * + * + */ + +/** + * @ngdoc property + * @name ng.$compile.directive.Attributes#$attr + * @propertyOf ng.$compile.directive.Attributes + * @returns {object} A map of DOM element attribute names to the normalized name. This is + * needed to do reverse lookup from normalized name back to actual name. + */ + + +/** + * @ngdoc function + * @name ng.$compile.directive.Attributes#$set + * @methodOf ng.$compile.directive.Attributes + * @function + * + * @description + * Set DOM element attribute value. + * + * + * @param {string} name Normalized element attribute name of the property to modify. The name is + * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr} + * property to the original name. + * @param {string} value Value to set the attribute to. The value can be an interpolated string. + */ + + + +/** + * Closure compiler type information + */ + +function nodesetLinkingFn( + /* angular.Scope */ scope, + /* NodeList */ nodeList, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +){} + +function directiveLinkingFn( + /* nodesetLinkingFn */ nodesetLinkingFn, + /* angular.Scope */ scope, + /* Node */ node, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +){} + +function tokenDifference(str1, str2) { + var values = '', + tokens1 = str1.split(/\s+/), + tokens2 = str2.split(/\s+/); + + outer: + for(var i = 0; i < tokens1.length; i++) { + var token = tokens1[i]; + for(var j = 0; j < tokens2.length; j++) { + if(token == tokens2[j]) continue outer; + } + values += (values.length > 0 ? ' ' : '') + token; + } + return values; +} + +/** + * @ngdoc object + * @name ng.$controllerProvider + * @description + * The {@link ng.$controller $controller service} is used by Angular to create new + * controllers. + * + * This provider allows controller registration via the + * {@link ng.$controllerProvider#methods_register register} method. + */ +function $ControllerProvider() { + var controllers = {}, + CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/; + + + /** + * @ngdoc function + * @name ng.$controllerProvider#register + * @methodOf ng.$controllerProvider + * @param {string|Object} name Controller name, or an object map of controllers where the keys are + * the names and the values are the constructors. + * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI + * annotations in the array notation). + */ + this.register = function(name, constructor) { + assertNotHasOwnProperty(name, 'controller'); + if (isObject(name)) { + extend(controllers, name); + } else { + controllers[name] = constructor; + } + }; + + + this.$get = ['$injector', '$window', function($injector, $window) { + + /** + * @ngdoc function + * @name ng.$controller + * @requires $injector + * + * @param {Function|string} constructor If called with a function then it's considered to be the + * controller constructor function. Otherwise it's considered to be a string which is used + * to retrieve the controller constructor using the following steps: + * + * * check if a controller with given name is registered via `$controllerProvider` + * * check if evaluating the string on the current scope returns a constructor + * * check `window[constructor]` on the global `window` object + * + * @param {Object} locals Injection locals for Controller. + * @return {Object} Instance of given controller. + * + * @description + * `$controller` service is responsible for instantiating controllers. + * + * It's just a simple call to {@link AUTO.$injector $injector}, but extracted into + * a service, so that one can override this service with {@link https://gist.github.com/1649788 + * BC version}. + */ + return function(expression, locals) { + var instance, match, constructor, identifier; + + if(isString(expression)) { + match = expression.match(CNTRL_REG), + constructor = match[1], + identifier = match[3]; + expression = controllers.hasOwnProperty(constructor) + ? controllers[constructor] + : getter(locals.$scope, constructor, true) || getter($window, constructor, true); + + assertArgFn(expression, constructor, true); + } + + instance = $injector.instantiate(expression, locals); + + if (identifier) { + if (!(locals && typeof locals.$scope == 'object')) { + throw minErr('$controller')('noscp', + "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", + constructor || expression.name, identifier); + } + + locals.$scope[identifier] = instance; + } + + return instance; + }; + }]; +} + +/** + * @ngdoc object + * @name ng.$document + * @requires $window + * + * @description + * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object. + */ +function $DocumentProvider(){ + this.$get = ['$window', function(window){ + return jqLite(window.document); + }]; +} + +/** + * @ngdoc function + * @name ng.$exceptionHandler + * @requires $log + * + * @description + * Any uncaught exception in angular expressions is delegated to this service. + * The default implementation simply delegates to `$log.error` which logs it into + * the browser console. + * + * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by + * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. + * + * ## Example: + * + *
                  + *   angular.module('exceptionOverride', []).factory('$exceptionHandler', function () {
                  + *     return function (exception, cause) {
                  + *       exception.message += ' (caused by "' + cause + '")';
                  + *       throw exception;
                  + *     };
                  + *   });
                  + * 
                  + * + * This example will override the normal action of `$exceptionHandler`, to make angular + * exceptions fail hard when they happen, instead of just logging to the console. + * + * @param {Error} exception Exception associated with the error. + * @param {string=} cause optional information about the context in which + * the error was thrown. + * + */ +function $ExceptionHandlerProvider() { + this.$get = ['$log', function($log) { + return function(exception, cause) { + $log.error.apply($log, arguments); + }; + }]; +} + +/** + * Parse headers into key value object + * + * @param {string} headers Raw headers as a string + * @returns {Object} Parsed headers as key value object + */ +function parseHeaders(headers) { + var parsed = {}, key, val, i; + + if (!headers) return parsed; + + forEach(headers.split('\n'), function(line) { + i = line.indexOf(':'); + key = lowercase(trim(line.substr(0, i))); + val = trim(line.substr(i + 1)); + + if (key) { + if (parsed[key]) { + parsed[key] += ', ' + val; + } else { + parsed[key] = val; + } + } + }); + + return parsed; +} + + +/** + * Returns a function that provides access to parsed headers. + * + * Headers are lazy parsed when first requested. + * @see parseHeaders + * + * @param {(string|Object)} headers Headers to provide access to. + * @returns {function(string=)} Returns a getter function which if called with: + * + * - if called with single an argument returns a single header value or null + * - if called with no arguments returns an object containing all headers. + */ +function headersGetter(headers) { + var headersObj = isObject(headers) ? headers : undefined; + + return function(name) { + if (!headersObj) headersObj = parseHeaders(headers); + + if (name) { + return headersObj[lowercase(name)] || null; + } + + return headersObj; + }; +} + + +/** + * Chain all given functions + * + * This function is used for both request and response transforming + * + * @param {*} data Data to transform. + * @param {function(string=)} headers Http headers getter fn. + * @param {(function|Array.)} fns Function or an array of functions. + * @returns {*} Transformed data. + */ +function transformData(data, headers, fns) { + if (isFunction(fns)) + return fns(data, headers); + + forEach(fns, function(fn) { + data = fn(data, headers); + }); + + return data; +} + + +function isSuccess(status) { + return 200 <= status && status < 300; +} + + +function $HttpProvider() { + var JSON_START = /^\s*(\[|\{[^\{])/, + JSON_END = /[\}\]]\s*$/, + PROTECTION_PREFIX = /^\)\]\}',?\n/, + CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'}; + + var defaults = this.defaults = { + // transform incoming response data + transformResponse: [function(data) { + if (isString(data)) { + // strip json vulnerability protection prefix + data = data.replace(PROTECTION_PREFIX, ''); + if (JSON_START.test(data) && JSON_END.test(data)) + data = fromJson(data); + } + return data; + }], + + // transform outgoing request data + transformRequest: [function(d) { + return isObject(d) && !isFile(d) ? toJson(d) : d; + }], + + // default headers + headers: { + common: { + 'Accept': 'application/json, text/plain, */*' + }, + post: copy(CONTENT_TYPE_APPLICATION_JSON), + put: copy(CONTENT_TYPE_APPLICATION_JSON), + patch: copy(CONTENT_TYPE_APPLICATION_JSON) + }, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN' + }; + + /** + * Are ordered by request, i.e. they are applied in the same order as the + * array, on request, but reverse order, on response. + */ + var interceptorFactories = this.interceptors = []; + + /** + * For historical reasons, response interceptors are ordered by the order in which + * they are applied to the response. (This is the opposite of interceptorFactories) + */ + var responseInterceptorFactories = this.responseInterceptors = []; + + this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector', + function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) { + + var defaultCache = $cacheFactory('$http'); + + /** + * Interceptors stored in reverse order. Inner interceptors before outer interceptors. + * The reversal is needed so that we can build up the interception chain around the + * server request. + */ + var reversedInterceptors = []; + + forEach(interceptorFactories, function(interceptorFactory) { + reversedInterceptors.unshift(isString(interceptorFactory) + ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory)); + }); + + forEach(responseInterceptorFactories, function(interceptorFactory, index) { + var responseFn = isString(interceptorFactory) + ? $injector.get(interceptorFactory) + : $injector.invoke(interceptorFactory); + + /** + * Response interceptors go before "around" interceptors (no real reason, just + * had to pick one.) But they are already reversed, so we can't use unshift, hence + * the splice. + */ + reversedInterceptors.splice(index, 0, { + response: function(response) { + return responseFn($q.when(response)); + }, + responseError: function(response) { + return responseFn($q.reject(response)); + } + }); + }); + + + /** + * @ngdoc function + * @name ng.$http + * @requires $httpBackend + * @requires $browser + * @requires $cacheFactory + * @requires $rootScope + * @requires $q + * @requires $injector + * + * @description + * The `$http` service is a core Angular service that facilitates communication with the remote + * HTTP servers via the browser's {@link https://developer.mozilla.org/en/xmlhttprequest + * XMLHttpRequest} object or via {@link http://en.wikipedia.org/wiki/JSONP JSONP}. + * + * For unit testing applications that use `$http` service, see + * {@link ngMock.$httpBackend $httpBackend mock}. + * + * For a higher level of abstraction, please check out the {@link ngResource.$resource + * $resource} service. + * + * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by + * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage + * it is important to familiarize yourself with these APIs and the guarantees they provide. + * + * + * # General usage + * The `$http` service is a function which takes a single argument — a configuration object — + * that is used to generate an HTTP request and returns a {@link ng.$q promise} + * with two $http specific methods: `success` and `error`. + * + *
                  +     *   $http({method: 'GET', url: '/someUrl'}).
                  +     *     success(function(data, status, headers, config) {
                  +     *       // this callback will be called asynchronously
                  +     *       // when the response is available
                  +     *     }).
                  +     *     error(function(data, status, headers, config) {
                  +     *       // called asynchronously if an error occurs
                  +     *       // or server returns response with an error status.
                  +     *     });
                  +     * 
                  + * + * Since the returned value of calling the $http function is a `promise`, you can also use + * the `then` method to register callbacks, and these callbacks will receive a single argument – + * an object representing the response. See the API signature and type info below for more + * details. + * + * A response status code between 200 and 299 is considered a success status and + * will result in the success callback being called. Note that if the response is a redirect, + * XMLHttpRequest will transparently follow it, meaning that the error callback will not be + * called for such responses. + * + * # Calling $http from outside AngularJS + * The `$http` service will not actually send the request until the next `$digest()` is + * executed. Normally this is not an issue, since almost all the time your call to `$http` will + * be from within a `$apply()` block. + * If you are calling `$http` from outside Angular, then you should wrap it in a call to + * `$apply` to cause a $digest to occur and also to handle errors in the block correctly. + * + * ``` + * $scope.$apply(function() { + * $http(...); + * }); + * ``` + * + * # Writing Unit Tests that use $http + * When unit testing you are mostly responsible for scheduling the `$digest` cycle. If you do + * not trigger a `$digest` before calling `$httpBackend.flush()` then the request will not have + * been made and `$httpBackend.expect(...)` expectations will fail. The solution is to run the + * code that calls the `$http()` method inside a $apply block as explained in the previous + * section. + * + * ``` + * $httpBackend.expectGET(...); + * $scope.$apply(function() { + * $http.get(...); + * }); + * $httpBackend.flush(); + * ``` + * + * # Shortcut methods + * + * Since all invocations of the $http service require passing in an HTTP method and URL, and + * POST/PUT requests require request data to be provided as well, shortcut methods + * were created: + * + *
                  +     *   $http.get('/someUrl').success(successCallback);
                  +     *   $http.post('/someUrl', data).success(successCallback);
                  +     * 
                  + * + * Complete list of shortcut methods: + * + * - {@link ng.$http#methods_get $http.get} + * - {@link ng.$http#methods_head $http.head} + * - {@link ng.$http#methods_post $http.post} + * - {@link ng.$http#methods_put $http.put} + * - {@link ng.$http#methods_delete $http.delete} + * - {@link ng.$http#methods_jsonp $http.jsonp} + * + * + * # Setting HTTP Headers + * + * The $http service will automatically add certain HTTP headers to all requests. These defaults + * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration + * object, which currently contains this default configuration: + * + * - `$httpProvider.defaults.headers.common` (headers that are common for all requests): + * - `Accept: application/json, text/plain, * / *` + * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests) + * - `Content-Type: application/json` + * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests) + * - `Content-Type: application/json` + * + * To add or overwrite these defaults, simply add or remove a property from these configuration + * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object + * with the lowercased HTTP method name as the key, e.g. + * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }. + * + * The defaults can also be set at runtime via the `$http.defaults` object in the same + * fashion. For example: + * + * ``` + * module.run(function($http) { + * $http.defaults.headers.common.Authentication = 'Basic YmVlcDpib29w' + * }); + * ``` + * + * In addition, you can supply a `headers` property in the config object passed when + * calling `$http(config)`, which overrides the defaults without changing them globally. + * + * + * # Transforming Requests and Responses + * + * Both requests and responses can be transformed using transform functions. By default, Angular + * applies these transformations: + * + * Request transformations: + * + * - If the `data` property of the request configuration object contains an object, serialize it + * into JSON format. + * + * Response transformations: + * + * - If XSRF prefix is detected, strip it (see Security Considerations section below). + * - If JSON response is detected, deserialize it using a JSON parser. + * + * To globally augment or override the default transforms, modify the + * `$httpProvider.defaults.transformRequest` and `$httpProvider.defaults.transformResponse` + * properties. These properties are by default an array of transform functions, which allows you + * to `push` or `unshift` a new transformation function into the transformation chain. You can + * also decide to completely override any default transformations by assigning your + * transformation functions to these properties directly without the array wrapper. These defaults + * are again available on the $http factory at run-time, which may be useful if you have run-time + * services you wish to be involved in your transformations. + * + * Similarly, to locally override the request/response transforms, augment the + * `transformRequest` and/or `transformResponse` properties of the configuration object passed + * into `$http`. + * + * + * # Caching + * + * To enable caching, set the request configuration `cache` property to `true` (to use default + * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}). + * When the cache is enabled, `$http` stores the response from the server in the specified + * cache. The next time the same request is made, the response is served from the cache without + * sending a request to the server. + * + * Note that even if the response is served from cache, delivery of the data is asynchronous in + * the same way that real requests are. + * + * If there are multiple GET requests for the same URL that should be cached using the same + * cache, but the cache is not populated yet, only one request to the server will be made and + * the remaining requests will be fulfilled using the response from the first request. + * + * You can change the default cache to a new object (built with + * {@link ng.$cacheFactory `$cacheFactory`}) by updating the + * {@link ng.$http#properties_defaults `$http.defaults.cache`} property. All requests who set + * their `cache` property to `true` will now use this cache object. + * + * If you set the default cache to `false` then only requests that specify their own custom + * cache object will be cached. + * + * # Interceptors + * + * Before you start creating interceptors, be sure to understand the + * {@link ng.$q $q and deferred/promise APIs}. + * + * For purposes of global error handling, authentication, or any kind of synchronous or + * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be + * able to intercept requests before they are handed to the server and + * responses before they are handed over to the application code that + * initiated these requests. The interceptors leverage the {@link ng.$q + * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing. + * + * The interceptors are service factories that are registered with the `$httpProvider` by + * adding them to the `$httpProvider.interceptors` array. The factory is called and + * injected with dependencies (if specified) and returns the interceptor. + * + * There are two kinds of interceptors (and two kinds of rejection interceptors): + * + * * `request`: interceptors get called with http `config` object. The function is free to + * modify the `config` or create a new one. The function needs to return the `config` + * directly or as a promise. + * * `requestError`: interceptor gets called when a previous interceptor threw an error or + * resolved with a rejection. + * * `response`: interceptors get called with http `response` object. The function is free to + * modify the `response` or create a new one. The function needs to return the `response` + * directly or as a promise. + * * `responseError`: interceptor gets called when a previous interceptor threw an error or + * resolved with a rejection. + * + * + *
                  +     *   // register the interceptor as a service
                  +     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
                  +     *     return {
                  +     *       // optional method
                  +     *       'request': function(config) {
                  +     *         // do something on success
                  +     *         return config || $q.when(config);
                  +     *       },
                  +     *
                  +     *       // optional method
                  +     *      'requestError': function(rejection) {
                  +     *         // do something on error
                  +     *         if (canRecover(rejection)) {
                  +     *           return responseOrNewPromise
                  +     *         }
                  +     *         return $q.reject(rejection);
                  +     *       },
                  +     *
                  +     *
                  +     *
                  +     *       // optional method
                  +     *       'response': function(response) {
                  +     *         // do something on success
                  +     *         return response || $q.when(response);
                  +     *       },
                  +     *
                  +     *       // optional method
                  +     *      'responseError': function(rejection) {
                  +     *         // do something on error
                  +     *         if (canRecover(rejection)) {
                  +     *           return responseOrNewPromise
                  +     *         }
                  +     *         return $q.reject(rejection);
                  +     *       }
                  +     *     };
                  +     *   });
                  +     *
                  +     *   $httpProvider.interceptors.push('myHttpInterceptor');
                  +     *
                  +     *
                  +     *   // alternatively, register the interceptor via an anonymous factory
                  +     *   $httpProvider.interceptors.push(function($q, dependency1, dependency2) {
                  +     *     return {
                  +     *      'request': function(config) {
                  +     *          // same as above
                  +     *       },
                  +     *
                  +     *       'response': function(response) {
                  +     *          // same as above
                  +     *       }
                  +     *     };
                  +     *   });
                  +     * 
                  + * + * # Response interceptors (DEPRECATED) + * + * Before you start creating interceptors, be sure to understand the + * {@link ng.$q $q and deferred/promise APIs}. + * + * For purposes of global error handling, authentication or any kind of synchronous or + * asynchronous preprocessing of received responses, it is desirable to be able to intercept + * responses for http requests before they are handed over to the application code that + * initiated these requests. The response interceptors leverage the {@link ng.$q + * promise apis} to fulfil this need for both synchronous and asynchronous preprocessing. + * + * The interceptors are service factories that are registered with the $httpProvider by + * adding them to the `$httpProvider.responseInterceptors` array. The factory is called and + * injected with dependencies (if specified) and returns the interceptor — a function that + * takes a {@link ng.$q promise} and returns the original or a new promise. + * + *
                  +     *   // register the interceptor as a service
                  +     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
                  +     *     return function(promise) {
                  +     *       return promise.then(function(response) {
                  +     *         // do something on success
                  +     *         return response;
                  +     *       }, function(response) {
                  +     *         // do something on error
                  +     *         if (canRecover(response)) {
                  +     *           return responseOrNewPromise
                  +     *         }
                  +     *         return $q.reject(response);
                  +     *       });
                  +     *     }
                  +     *   });
                  +     *
                  +     *   $httpProvider.responseInterceptors.push('myHttpInterceptor');
                  +     *
                  +     *
                  +     *   // register the interceptor via an anonymous factory
                  +     *   $httpProvider.responseInterceptors.push(function($q, dependency1, dependency2) {
                  +     *     return function(promise) {
                  +     *       // same as above
                  +     *     }
                  +     *   });
                  +     * 
                  + * + * + * # Security Considerations + * + * When designing web applications, consider security threats from: + * + * - {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx + * JSON vulnerability} + * - {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF} + * + * Both server and the client must cooperate in order to eliminate these threats. Angular comes + * pre-configured with strategies that address these issues, but for this to work backend server + * cooperation is required. + * + * ## JSON Vulnerability Protection + * + * A {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx + * JSON vulnerability} allows third party website to turn your JSON resource URL into + * {@link http://en.wikipedia.org/wiki/JSONP JSONP} request under some conditions. To + * counter this your server can prefix all JSON requests with following string `")]}',\n"`. + * Angular will automatically strip the prefix before processing it as JSON. + * + * For example if your server needs to return: + *
                  +     * ['one','two']
                  +     * 
                  + * + * which is vulnerable to attack, your server can return: + *
                  +     * )]}',
                  +     * ['one','two']
                  +     * 
                  + * + * Angular will strip the prefix, before processing the JSON. + * + * + * ## Cross Site Request Forgery (XSRF) Protection + * + * {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF} is a technique by which + * an unauthorized site can gain your user's private data. Angular provides a mechanism + * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie + * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only + * JavaScript that runs on your domain could read the cookie, your server can be assured that + * the XHR came from JavaScript running on your domain. The header will not be set for + * cross-domain requests. + * + * To take advantage of this, your server needs to set a token in a JavaScript readable session + * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the + * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure + * that only JavaScript running on your domain could have sent the request. The token must be + * unique for each user and must be verifiable by the server (to prevent the JavaScript from + * making up its own tokens). We recommend that the token is a digest of your site's + * authentication cookie with a {@link https://en.wikipedia.org/wiki/Salt_(cryptography) salt} + * for added security. + * + * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName + * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time, + * or the per-request config object. + * + * + * @param {object} config Object describing the request to be made and how it should be + * processed. The object has following properties: + * + * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc) + * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested. + * - **params** – `{Object.}` – Map of strings or objects which will be turned + * to `?key1=value1&key2=value2` after the url. If the value is not a string, it will be + * JSONified. + * - **data** – `{string|Object}` – Data to be sent as the request message data. + * - **headers** – `{Object}` – Map of strings or functions which return strings representing + * HTTP headers to send to the server. If the return value of a function is null, the + * header will not be sent. + * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token. + * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token. + * - **transformRequest** – + * `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * request body and headers and returns its transformed (typically serialized) version. + * - **transformResponse** – + * `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * response body and headers and returns its transformed (typically deserialized) version. + * - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the + * GET request, otherwise if a cache instance built with + * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for + * caching. + * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} + * that should abort the request when resolved. + * - **withCredentials** - `{boolean}` - whether to to set the `withCredentials` flag on the + * XHR object. See {@link https://developer.mozilla.org/en/http_access_control#section_5 + * requests with credentials} for more information. + * - **responseType** - `{string}` - see {@link + * https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType requestType}. + * + * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the + * standard `then` method and two http specific methods: `success` and `error`. The `then` + * method takes two arguments a success and an error callback which will be called with a + * response object. The `success` and `error` methods take a single argument - a function that + * will be called when the request succeeds or fails respectively. The arguments passed into + * these functions are destructured representation of the response object passed into the + * `then` method. The response object has these properties: + * + * - **data** – `{string|Object}` – The response body transformed with the transform + * functions. + * - **status** – `{number}` – HTTP status code of the response. + * - **headers** – `{function([headerName])}` – Header getter function. + * - **config** – `{Object}` – The configuration object that was used to generate the request. + * + * @property {Array.} pendingRequests Array of config objects for currently pending + * requests. This is primarily meant to be used for debugging purposes. + * + * + * @example + + +
                  + + +
                  + + + +
                  http status code: {{status}}
                  +
                  http response data: {{data}}
                  +
                  +
                  + + function FetchCtrl($scope, $http, $templateCache) { + $scope.method = 'GET'; + $scope.url = 'http-hello.html'; + + $scope.fetch = function() { + $scope.code = null; + $scope.response = null; + + $http({method: $scope.method, url: $scope.url, cache: $templateCache}). + success(function(data, status) { + $scope.status = status; + $scope.data = data; + }). + error(function(data, status) { + $scope.data = data || "Request failed"; + $scope.status = status; + }); + }; + + $scope.updateModel = function(method, url) { + $scope.method = method; + $scope.url = url; + }; + } + + + Hello, $http! + + + it('should make an xhr GET request', function() { + element(':button:contains("Sample GET")').click(); + element(':button:contains("fetch")').click(); + expect(binding('status')).toBe('200'); + expect(binding('data')).toMatch(/Hello, \$http!/); + }); + + it('should make a JSONP request to angularjs.org', function() { + element(':button:contains("Sample JSONP")').click(); + element(':button:contains("fetch")').click(); + expect(binding('status')).toBe('200'); + expect(binding('data')).toMatch(/Super Hero!/); + }); + + it('should make JSONP request to invalid URL and invoke the error handler', + function() { + element(':button:contains("Invalid JSONP")').click(); + element(':button:contains("fetch")').click(); + expect(binding('status')).toBe('0'); + expect(binding('data')).toBe('Request failed'); + }); + +
                  + */ + function $http(requestConfig) { + var config = { + transformRequest: defaults.transformRequest, + transformResponse: defaults.transformResponse + }; + var headers = mergeHeaders(requestConfig); + + extend(config, requestConfig); + config.headers = headers; + config.method = uppercase(config.method); + + var xsrfValue = urlIsSameOrigin(config.url) + ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName] + : undefined; + if (xsrfValue) { + headers[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; + } + + + var serverRequest = function(config) { + headers = config.headers; + var reqData = transformData(config.data, headersGetter(headers), config.transformRequest); + + // strip content-type if data is undefined + if (isUndefined(config.data)) { + forEach(headers, function(value, header) { + if (lowercase(header) === 'content-type') { + delete headers[header]; + } + }); + } + + if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { + config.withCredentials = defaults.withCredentials; + } + + // send request + return sendReq(config, reqData, headers).then(transformResponse, transformResponse); + }; + + var chain = [serverRequest, undefined]; + var promise = $q.when(config); + + // apply interceptors + forEach(reversedInterceptors, function(interceptor) { + if (interceptor.request || interceptor.requestError) { + chain.unshift(interceptor.request, interceptor.requestError); + } + if (interceptor.response || interceptor.responseError) { + chain.push(interceptor.response, interceptor.responseError); + } + }); + + while(chain.length) { + var thenFn = chain.shift(); + var rejectFn = chain.shift(); + + promise = promise.then(thenFn, rejectFn); + } + + promise.success = function(fn) { + promise.then(function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + + promise.error = function(fn) { + promise.then(null, function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + + return promise; + + function transformResponse(response) { + // make a copy since the response must be cacheable + var resp = extend({}, response, { + data: transformData(response.data, response.headers, config.transformResponse) + }); + return (isSuccess(response.status)) + ? resp + : $q.reject(resp); + } + + function mergeHeaders(config) { + var defHeaders = defaults.headers, + reqHeaders = extend({}, config.headers), + defHeaderName, lowercaseDefHeaderName, reqHeaderName; + + defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]); + + // execute if header value is function + execHeaders(defHeaders); + execHeaders(reqHeaders); + + // using for-in instead of forEach to avoid unecessary iteration after header has been found + defaultHeadersIteration: + for (defHeaderName in defHeaders) { + lowercaseDefHeaderName = lowercase(defHeaderName); + + for (reqHeaderName in reqHeaders) { + if (lowercase(reqHeaderName) === lowercaseDefHeaderName) { + continue defaultHeadersIteration; + } + } + + reqHeaders[defHeaderName] = defHeaders[defHeaderName]; + } + + return reqHeaders; + + function execHeaders(headers) { + var headerContent; + + forEach(headers, function(headerFn, header) { + if (isFunction(headerFn)) { + headerContent = headerFn(); + if (headerContent != null) { + headers[header] = headerContent; + } else { + delete headers[header]; + } + } + }); + } + } + } + + $http.pendingRequests = []; + + /** + * @ngdoc method + * @name ng.$http#get + * @methodOf ng.$http + * + * @description + * Shortcut method to perform `GET` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name ng.$http#delete + * @methodOf ng.$http + * + * @description + * Shortcut method to perform `DELETE` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name ng.$http#head + * @methodOf ng.$http + * + * @description + * Shortcut method to perform `HEAD` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name ng.$http#jsonp + * @methodOf ng.$http + * + * @description + * Shortcut method to perform `JSONP` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request. + * Should contain `JSON_CALLBACK` string. + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethods('get', 'delete', 'head', 'jsonp'); + + /** + * @ngdoc method + * @name ng.$http#post + * @methodOf ng.$http + * + * @description + * Shortcut method to perform `POST` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name ng.$http#put + * @methodOf ng.$http + * + * @description + * Shortcut method to perform `PUT` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethodsWithData('post', 'put'); + + /** + * @ngdoc property + * @name ng.$http#defaults + * @propertyOf ng.$http + * + * @description + * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of + * default headers, withCredentials as well as request and response transformations. + * + * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above. + */ + $http.defaults = defaults; + + + return $http; + + + function createShortMethods(names) { + forEach(arguments, function(name) { + $http[name] = function(url, config) { + return $http(extend(config || {}, { + method: name, + url: url + })); + }; + }); + } + + + function createShortMethodsWithData(name) { + forEach(arguments, function(name) { + $http[name] = function(url, data, config) { + return $http(extend(config || {}, { + method: name, + url: url, + data: data + })); + }; + }); + } + + + /** + * Makes the request. + * + * !!! ACCESSES CLOSURE VARS: + * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests + */ + function sendReq(config, reqData, reqHeaders) { + var deferred = $q.defer(), + promise = deferred.promise, + cache, + cachedResp, + url = buildUrl(config.url, config.params); + + $http.pendingRequests.push(config); + promise.then(removePendingReq, removePendingReq); + + + if ((config.cache || defaults.cache) && config.cache !== false && config.method == 'GET') { + cache = isObject(config.cache) ? config.cache + : isObject(defaults.cache) ? defaults.cache + : defaultCache; + } + + if (cache) { + cachedResp = cache.get(url); + if (isDefined(cachedResp)) { + if (cachedResp.then) { + // cached request has already been sent, but there is no response yet + cachedResp.then(removePendingReq, removePendingReq); + return cachedResp; + } else { + // serving from cache + if (isArray(cachedResp)) { + resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2])); + } else { + resolvePromise(cachedResp, 200, {}); + } + } + } else { + // put the promise for the non-transformed response into cache as a placeholder + cache.put(url, promise); + } + } + + // if we won't have the response in cache, send the request to the backend + if (isUndefined(cachedResp)) { + $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, + config.withCredentials, config.responseType); + } + + return promise; + + + /** + * Callback registered to $httpBackend(): + * - caches the response if desired + * - resolves the raw $http promise + * - calls $apply + */ + function done(status, response, headersString) { + if (cache) { + if (isSuccess(status)) { + cache.put(url, [status, response, parseHeaders(headersString)]); + } else { + // remove promise from the cache + cache.remove(url); + } + } + + resolvePromise(response, status, headersString); + if (!$rootScope.$$phase) $rootScope.$apply(); + } + + + /** + * Resolves the raw $http promise. + */ + function resolvePromise(response, status, headers) { + // normalize internal statuses to 0 + status = Math.max(status, 0); + + (isSuccess(status) ? deferred.resolve : deferred.reject)({ + data: response, + status: status, + headers: headersGetter(headers), + config: config + }); + } + + + function removePendingReq() { + var idx = indexOf($http.pendingRequests, config); + if (idx !== -1) $http.pendingRequests.splice(idx, 1); + } + } + + + function buildUrl(url, params) { + if (!params) return url; + var parts = []; + forEachSorted(params, function(value, key) { + if (value === null || isUndefined(value)) return; + if (!isArray(value)) value = [value]; + + forEach(value, function(v) { + if (isObject(v)) { + v = toJson(v); + } + parts.push(encodeUriQuery(key) + '=' + + encodeUriQuery(v)); + }); + }); + return url + ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&'); + } + + + }]; +} + +function createXhr(method) { + // IE8 doesn't support PATCH method, but the ActiveX object does + /* global ActiveXObject */ + return (msie <= 8 && lowercase(method) === 'patch') + ? new ActiveXObject('Microsoft.XMLHTTP') + : new window.XMLHttpRequest(); +} + + +/** + * @ngdoc object + * @name ng.$httpBackend + * @requires $browser + * @requires $window + * @requires $document + * + * @description + * HTTP backend used by the {@link ng.$http service} that delegates to + * XMLHttpRequest object or JSONP and deals with browser incompatibilities. + * + * You should never need to use this service directly, instead use the higher-level abstractions: + * {@link ng.$http $http} or {@link ngResource.$resource $resource}. + * + * During testing this implementation is swapped with {@link ngMock.$httpBackend mock + * $httpBackend} which can be trained with responses. + */ +function $HttpBackendProvider() { + this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) { + return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]); + }]; +} + +function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) { + var ABORTED = -1; + + // TODO(vojta): fix the signature + return function(method, url, post, callback, headers, timeout, withCredentials, responseType) { + var status; + $browser.$$incOutstandingRequestCount(); + url = url || $browser.url(); + + if (lowercase(method) == 'jsonp') { + var callbackId = '_' + (callbacks.counter++).toString(36); + callbacks[callbackId] = function(data) { + callbacks[callbackId].data = data; + }; + + var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), + function() { + if (callbacks[callbackId].data) { + completeRequest(callback, 200, callbacks[callbackId].data); + } else { + completeRequest(callback, status || -2); + } + callbacks[callbackId] = angular.noop; + }); + } else { + + var xhr = createXhr(method); + + xhr.open(method, url, true); + forEach(headers, function(value, key) { + if (isDefined(value)) { + xhr.setRequestHeader(key, value); + } + }); + + // In IE6 and 7, this might be called synchronously when xhr.send below is called and the + // response is in the cache. the promise api will ensure that to the app code the api is + // always async + xhr.onreadystatechange = function() { + // onreadystatechange might get called multiple times with readyState === 4 on mobile webkit caused by + // xhrs that are resolved while the app is in the background (see #5426). + // since calling completeRequest sets the `xhr` variable to null, we just check if it's not null before + // continuing + // + // we can't set xhr.onreadystatechange to undefined or delete it because that breaks IE8 (method=PATCH) and + // Safari respectively. + if (xhr && xhr.readyState == 4) { + var responseHeaders = null, + response = null; + + if(status !== ABORTED) { + responseHeaders = xhr.getAllResponseHeaders(); + + // responseText is the old-school way of retrieving response (supported by IE8 & 9) + // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) + response = ('response' in xhr) ? xhr.response : xhr.responseText; + } + + completeRequest(callback, + status || xhr.status, + response, + responseHeaders); + } + }; + + if (withCredentials) { + xhr.withCredentials = true; + } + + if (responseType) { + xhr.responseType = responseType; + } + + xhr.send(post || null); + } + + if (timeout > 0) { + var timeoutId = $browserDefer(timeoutRequest, timeout); + } else if (timeout && timeout.then) { + timeout.then(timeoutRequest); + } + + + function timeoutRequest() { + status = ABORTED; + jsonpDone && jsonpDone(); + xhr && xhr.abort(); + } + + function completeRequest(callback, status, response, headersString) { + // cancel timeout and subsequent timeout promise resolution + timeoutId && $browserDefer.cancel(timeoutId); + jsonpDone = xhr = null; + + // fix status code when it is 0 (0 status is undocumented). + // Occurs when accessing file resources. + // On Android 4.1 stock browser it occurs while retrieving files from application cache. + status = (status === 0) ? (response ? 200 : 404) : status; + + // normalize IE bug (http://bugs.jquery.com/ticket/1450) + status = status == 1223 ? 204 : status; + + callback(status, response, headersString); + $browser.$$completeOutstandingRequest(noop); + } + }; + + function jsonpReq(url, done) { + // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.: + // - fetches local scripts via XHR and evals them + // - adds and immediately removes script elements from the document + var script = rawDocument.createElement('script'), + doneWrapper = function() { + script.onreadystatechange = script.onload = script.onerror = null; + rawDocument.body.removeChild(script); + if (done) done(); + }; + + script.type = 'text/javascript'; + script.src = url; + + if (msie && msie <= 8) { + script.onreadystatechange = function() { + if (/loaded|complete/.test(script.readyState)) { + doneWrapper(); + } + }; + } else { + script.onload = script.onerror = function() { + doneWrapper(); + }; + } + + rawDocument.body.appendChild(script); + return doneWrapper; + } +} + +var $interpolateMinErr = minErr('$interpolate'); + +/** + * @ngdoc object + * @name ng.$interpolateProvider + * @function + * + * @description + * + * Used for configuring the interpolation markup. Defaults to `{{` and `}}`. + * + * @example + + + +
                  + //demo.label// +
                  +
                  + + it('should interpolate binding with custom symbols', function() { + expect(binding('demo.label')).toBe('This binding is brought you by // interpolation symbols.'); + }); + +
                  + */ +function $InterpolateProvider() { + var startSymbol = '{{'; + var endSymbol = '}}'; + + /** + * @ngdoc method + * @name ng.$interpolateProvider#startSymbol + * @methodOf ng.$interpolateProvider + * @description + * Symbol to denote start of expression in the interpolated string. Defaults to `{{`. + * + * @param {string=} value new value to set the starting symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.startSymbol = function(value){ + if (value) { + startSymbol = value; + return this; + } else { + return startSymbol; + } + }; + + /** + * @ngdoc method + * @name ng.$interpolateProvider#endSymbol + * @methodOf ng.$interpolateProvider + * @description + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. + * + * @param {string=} value new value to set the ending symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.endSymbol = function(value){ + if (value) { + endSymbol = value; + return this; + } else { + return endSymbol; + } + }; + + + this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) { + var startSymbolLength = startSymbol.length, + endSymbolLength = endSymbol.length; + + /** + * @ngdoc function + * @name ng.$interpolate + * @function + * + * @requires $parse + * @requires $sce + * + * @description + * + * Compiles a string with markup into an interpolation function. This service is used by the + * HTML {@link ng.$compile $compile} service for data binding. See + * {@link ng.$interpolateProvider $interpolateProvider} for configuring the + * interpolation markup. + * + * +
                  +         var $interpolate = ...; // injected
                  +         var exp = $interpolate('Hello {{name | uppercase}}!');
                  +         expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!');
                  +       
                  + * + * + * @param {string} text The text with markup to interpolate. + * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have + * embedded expression in order to return an interpolation function. Strings with no + * embedded expression will return null for the interpolation function. + * @param {string=} trustedContext when provided, the returned function passes the interpolated + * result through {@link ng.$sce#methods_getTrusted $sce.getTrusted(interpolatedResult, + * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that + * provides Strict Contextual Escaping for details. + * @returns {function(context)} an interpolation function which is used to compute the + * interpolated string. The function has these parameters: + * + * * `context`: an object against which any expressions embedded in the strings are evaluated + * against. + * + */ + function $interpolate(text, mustHaveExpression, trustedContext) { + var startIndex, + endIndex, + index = 0, + parts = [], + length = text.length, + hasInterpolation = false, + fn, + exp, + concat = []; + + while(index < length) { + if ( ((startIndex = text.indexOf(startSymbol, index)) != -1) && + ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1) ) { + (index != startIndex) && parts.push(text.substring(index, startIndex)); + parts.push(fn = $parse(exp = text.substring(startIndex + startSymbolLength, endIndex))); + fn.exp = exp; + index = endIndex + endSymbolLength; + hasInterpolation = true; + } else { + // we did not find anything, so we have to add the remainder to the parts array + (index != length) && parts.push(text.substring(index)); + index = length; + } + } + + if (!(length = parts.length)) { + // we added, nothing, must have been an empty string. + parts.push(''); + length = 1; + } + + // Concatenating expressions makes it hard to reason about whether some combination of + // concatenated values are unsafe to use and could easily lead to XSS. By requiring that a + // single expression be used for iframe[src], object[src], etc., we ensure that the value + // that's used is assigned or constructed by some JS code somewhere that is more testable or + // make it obvious that you bound the value to some user controlled value. This helps reduce + // the load when auditing for XSS issues. + if (trustedContext && parts.length > 1) { + throw $interpolateMinErr('noconcat', + "Error while interpolating: {0}\nStrict Contextual Escaping disallows " + + "interpolations that concatenate multiple expressions when a trusted value is " + + "required. See http://docs.angularjs.org/api/ng.$sce", text); + } + + if (!mustHaveExpression || hasInterpolation) { + concat.length = length; + fn = function(context) { + try { + for(var i = 0, ii = length, part; i + * **Note**: Intervals created by this service must be explicitly destroyed when you are finished + * with them. In particular they are not automatically destroyed when a controller's scope or a + * directive's element are destroyed. + * You should take this into consideration and make sure to always cancel the interval at the + * appropriate moment. See the example below for more details on how and when to do this. + * + * + * @param {function()} fn A function that should be called repeatedly. + * @param {number} delay Number of milliseconds between each function call. + * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat + * indefinitely. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#methods_$apply $apply} block. + * @returns {promise} A promise which will be notified on each iteration. + * + * @example + + + + +
                  +
                  + Date format:
                  + Current time is: +
                  + Blood 1 : {{blood_1}} + Blood 2 : {{blood_2}} + + + +
                  +
                  + +
                  +
                  + */ + function interval(fn, delay, count, invokeApply) { + var setInterval = $window.setInterval, + clearInterval = $window.clearInterval, + deferred = $q.defer(), + promise = deferred.promise, + iteration = 0, + skipApply = (isDefined(invokeApply) && !invokeApply); + + count = isDefined(count) ? count : 0, + + promise.then(null, null, fn); + + promise.$$intervalId = setInterval(function tick() { + deferred.notify(iteration++); + + if (count > 0 && iteration >= count) { + deferred.resolve(iteration); + clearInterval(promise.$$intervalId); + delete intervals[promise.$$intervalId]; + } + + if (!skipApply) $rootScope.$apply(); + + }, delay); + + intervals[promise.$$intervalId] = deferred; + + return promise; + } + + + /** + * @ngdoc function + * @name ng.$interval#cancel + * @methodOf ng.$interval + * + * @description + * Cancels a task associated with the `promise`. + * + * @param {number} promise Promise returned by the `$interval` function. + * @returns {boolean} Returns `true` if the task was successfully canceled. + */ + interval.cancel = function(promise) { + if (promise && promise.$$intervalId in intervals) { + intervals[promise.$$intervalId].reject('canceled'); + clearInterval(promise.$$intervalId); + delete intervals[promise.$$intervalId]; + return true; + } + return false; + }; + + return interval; + }]; +} + +/** + * @ngdoc object + * @name ng.$locale + * + * @description + * $locale service provides localization rules for various Angular components. As of right now the + * only public api is: + * + * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`) + */ +function $LocaleProvider(){ + this.$get = function() { + return { + id: 'en-us', + + NUMBER_FORMATS: { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PATTERNS: [ + { // Decimal Pattern + minInt: 1, + minFrac: 0, + maxFrac: 3, + posPre: '', + posSuf: '', + negPre: '-', + negSuf: '', + gSize: 3, + lgSize: 3 + },{ //Currency Pattern + minInt: 1, + minFrac: 2, + maxFrac: 2, + posPre: '\u00A4', + posSuf: '', + negPre: '(\u00A4', + negSuf: ')', + gSize: 3, + lgSize: 3 + } + ], + CURRENCY_SYM: '$' + }, + + DATETIME_FORMATS: { + MONTH: + 'January,February,March,April,May,June,July,August,September,October,November,December' + .split(','), + SHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','), + DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','), + SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','), + AMPMS: ['AM','PM'], + medium: 'MMM d, y h:mm:ss a', + short: 'M/d/yy h:mm a', + fullDate: 'EEEE, MMMM d, y', + longDate: 'MMMM d, y', + mediumDate: 'MMM d, y', + shortDate: 'M/d/yy', + mediumTime: 'h:mm:ss a', + shortTime: 'h:mm a' + }, + + pluralCat: function(num) { + if (num === 1) { + return 'one'; + } + return 'other'; + } + }; + }; +} + +var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, + DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21}; +var $locationMinErr = minErr('$location'); + + +/** + * Encode path using encodeUriSegment, ignoring forward slashes + * + * @param {string} path Path to encode + * @returns {string} + */ +function encodePath(path) { + var segments = path.split('/'), + i = segments.length; + + while (i--) { + segments[i] = encodeUriSegment(segments[i]); + } + + return segments.join('/'); +} + +function parseAbsoluteUrl(absoluteUrl, locationObj, appBase) { + var parsedUrl = urlResolve(absoluteUrl, appBase); + + locationObj.$$protocol = parsedUrl.protocol; + locationObj.$$host = parsedUrl.hostname; + locationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null; +} + + +function parseAppUrl(relativeUrl, locationObj, appBase) { + var prefixed = (relativeUrl.charAt(0) !== '/'); + if (prefixed) { + relativeUrl = '/' + relativeUrl; + } + var match = urlResolve(relativeUrl, appBase); + locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ? + match.pathname.substring(1) : match.pathname); + locationObj.$$search = parseKeyValue(match.search); + locationObj.$$hash = decodeURIComponent(match.hash); + + // make sure path starts with '/'; + if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') { + locationObj.$$path = '/' + locationObj.$$path; + } +} + + +/** + * + * @param {string} begin + * @param {string} whole + * @returns {string} returns text from whole after begin or undefined if it does not begin with + * expected string. + */ +function beginsWith(begin, whole) { + if (whole.indexOf(begin) === 0) { + return whole.substr(begin.length); + } +} + + +function stripHash(url) { + var index = url.indexOf('#'); + return index == -1 ? url : url.substr(0, index); +} + + +function stripFile(url) { + return url.substr(0, stripHash(url).lastIndexOf('/') + 1); +} + +/* return the server only (scheme://host:port) */ +function serverBase(url) { + return url.substring(0, url.indexOf('/', url.indexOf('//') + 2)); +} + + +/** + * LocationHtml5Url represents an url + * This object is exposed as $location service when HTML5 mode is enabled and supported + * + * @constructor + * @param {string} appBase application base URL + * @param {string} basePrefix url path prefix + */ +function LocationHtml5Url(appBase, basePrefix) { + this.$$html5 = true; + basePrefix = basePrefix || ''; + var appBaseNoFile = stripFile(appBase); + parseAbsoluteUrl(appBase, this, appBase); + + + /** + * Parse given html5 (regular) url string into properties + * @param {string} newAbsoluteUrl HTML5 url + * @private + */ + this.$$parse = function(url) { + var pathUrl = beginsWith(appBaseNoFile, url); + if (!isString(pathUrl)) { + throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url, + appBaseNoFile); + } + + parseAppUrl(pathUrl, this, appBase); + + if (!this.$$path) { + this.$$path = '/'; + } + + this.$$compose(); + }; + + /** + * Compose url and update `absUrl` property + * @private + */ + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/' + }; + + this.$$rewrite = function(url) { + var appUrl, prevAppUrl; + + if ( (appUrl = beginsWith(appBase, url)) !== undefined ) { + prevAppUrl = appUrl; + if ( (appUrl = beginsWith(basePrefix, appUrl)) !== undefined ) { + return appBaseNoFile + (beginsWith('/', appUrl) || appUrl); + } else { + return appBase + prevAppUrl; + } + } else if ( (appUrl = beginsWith(appBaseNoFile, url)) !== undefined ) { + return appBaseNoFile + appUrl; + } else if (appBaseNoFile == url + '/') { + return appBaseNoFile; + } + }; +} + + +/** + * LocationHashbangUrl represents url + * This object is exposed as $location service when developer doesn't opt into html5 mode. + * It also serves as the base class for html5 mode fallback on legacy browsers. + * + * @constructor + * @param {string} appBase application base URL + * @param {string} hashPrefix hashbang prefix + */ +function LocationHashbangUrl(appBase, hashPrefix) { + var appBaseNoFile = stripFile(appBase); + + parseAbsoluteUrl(appBase, this, appBase); + + + /** + * Parse given hashbang url into properties + * @param {string} url Hashbang url + * @private + */ + this.$$parse = function(url) { + var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url); + var withoutHashUrl = withoutBaseUrl.charAt(0) == '#' + ? beginsWith(hashPrefix, withoutBaseUrl) + : (this.$$html5) + ? withoutBaseUrl + : ''; + + if (!isString(withoutHashUrl)) { + throw $locationMinErr('ihshprfx', 'Invalid url "{0}", missing hash prefix "{1}".', url, + hashPrefix); + } + parseAppUrl(withoutHashUrl, this, appBase); + + this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase); + + this.$$compose(); + + /* + * In Windows, on an anchor node on documents loaded from + * the filesystem, the browser will return a pathname + * prefixed with the drive name ('/C:/path') when a + * pathname without a drive is set: + * * a.setAttribute('href', '/foo') + * * a.pathname === '/C:/foo' //true + * + * Inside of Angular, we're always using pathnames that + * do not include drive names for routing. + */ + function removeWindowsDriveName (path, url, base) { + /* + Matches paths for file protocol on windows, + such as /C:/foo/bar, and captures only /foo/bar. + */ + var windowsFilePathExp = /^\/?.*?:(\/.*)/; + + var firstPathSegmentMatch; + + //Get the relative path from the input URL. + if (url.indexOf(base) === 0) { + url = url.replace(base, ''); + } + + /* + * The input URL intentionally contains a + * first path segment that ends with a colon. + */ + if (windowsFilePathExp.exec(url)) { + return path; + } + + firstPathSegmentMatch = windowsFilePathExp.exec(path); + return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path; + } + }; + + /** + * Compose hashbang url and update `absUrl` property + * @private + */ + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : ''); + }; + + this.$$rewrite = function(url) { + if(stripHash(appBase) == stripHash(url)) { + return url; + } + }; +} + + +/** + * LocationHashbangUrl represents url + * This object is exposed as $location service when html5 history api is enabled but the browser + * does not support it. + * + * @constructor + * @param {string} appBase application base URL + * @param {string} hashPrefix hashbang prefix + */ +function LocationHashbangInHtml5Url(appBase, hashPrefix) { + this.$$html5 = true; + LocationHashbangUrl.apply(this, arguments); + + var appBaseNoFile = stripFile(appBase); + + this.$$rewrite = function(url) { + var appUrl; + + if ( appBase == stripHash(url) ) { + return url; + } else if ( (appUrl = beginsWith(appBaseNoFile, url)) ) { + return appBase + hashPrefix + appUrl; + } else if ( appBaseNoFile === url + '/') { + return appBaseNoFile; + } + }; +} + + +LocationHashbangInHtml5Url.prototype = + LocationHashbangUrl.prototype = + LocationHtml5Url.prototype = { + + /** + * Are we in html5 mode? + * @private + */ + $$html5: false, + + /** + * Has any change been replacing ? + * @private + */ + $$replace: false, + + /** + * @ngdoc method + * @name ng.$location#absUrl + * @methodOf ng.$location + * + * @description + * This method is getter only. + * + * Return full url representation with all segments encoded according to rules specified in + * {@link http://www.ietf.org/rfc/rfc3986.txt RFC 3986}. + * + * @return {string} full url + */ + absUrl: locationGetter('$$absUrl'), + + /** + * @ngdoc method + * @name ng.$location#url + * @methodOf ng.$location + * + * @description + * This method is getter / setter. + * + * Return url (e.g. `/path?a=b#hash`) when called without any parameter. + * + * Change path, search and hash, when called with parameter and return `$location`. + * + * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`) + * @param {string=} replace The path that will be changed + * @return {string} url + */ + url: function(url, replace) { + if (isUndefined(url)) + return this.$$url; + + var match = PATH_MATCH.exec(url); + if (match[1]) this.path(decodeURIComponent(match[1])); + if (match[2] || match[1]) this.search(match[3] || ''); + this.hash(match[5] || '', replace); + + return this; + }, + + /** + * @ngdoc method + * @name ng.$location#protocol + * @methodOf ng.$location + * + * @description + * This method is getter only. + * + * Return protocol of current url. + * + * @return {string} protocol of current url + */ + protocol: locationGetter('$$protocol'), + + /** + * @ngdoc method + * @name ng.$location#host + * @methodOf ng.$location + * + * @description + * This method is getter only. + * + * Return host of current url. + * + * @return {string} host of current url. + */ + host: locationGetter('$$host'), + + /** + * @ngdoc method + * @name ng.$location#port + * @methodOf ng.$location + * + * @description + * This method is getter only. + * + * Return port of current url. + * + * @return {Number} port + */ + port: locationGetter('$$port'), + + /** + * @ngdoc method + * @name ng.$location#path + * @methodOf ng.$location + * + * @description + * This method is getter / setter. + * + * Return path of current url when called without any parameter. + * + * Change path when called with parameter and return `$location`. + * + * Note: Path should always begin with forward slash (/), this method will add the forward slash + * if it is missing. + * + * @param {string=} path New path + * @return {string} path + */ + path: locationGetterSetter('$$path', function(path) { + return path.charAt(0) == '/' ? path : '/' + path; + }), + + /** + * @ngdoc method + * @name ng.$location#search + * @methodOf ng.$location + * + * @description + * This method is getter / setter. + * + * Return search part (as object) of current url when called without any parameter. + * + * Change search part when called with parameter and return `$location`. + * + * @param {string|Object.|Object.>} search New search params - string or + * hash object. Hash object may contain an array of values, which will be decoded as duplicates in + * the url. + * + * @param {(string|Array)=} paramValue If `search` is a string, then `paramValue` will override only a + * single search parameter. If `paramValue` is an array, it will set the parameter as a + * comma-separated value. If `paramValue` is `null`, the parameter will be deleted. + * + * @return {string} search + */ + search: function(search, paramValue) { + switch (arguments.length) { + case 0: + return this.$$search; + case 1: + if (isString(search)) { + this.$$search = parseKeyValue(search); + } else if (isObject(search)) { + this.$$search = search; + } else { + throw $locationMinErr('isrcharg', + 'The first argument of the `$location#search()` call must be a string or an object.'); + } + break; + default: + if (isUndefined(paramValue) || paramValue === null) { + delete this.$$search[search]; + } else { + this.$$search[search] = paramValue; + } + } + + this.$$compose(); + return this; + }, + + /** + * @ngdoc method + * @name ng.$location#hash + * @methodOf ng.$location + * + * @description + * This method is getter / setter. + * + * Return hash fragment when called without any parameter. + * + * Change hash fragment when called with parameter and return `$location`. + * + * @param {string=} hash New hash fragment + * @return {string} hash + */ + hash: locationGetterSetter('$$hash', identity), + + /** + * @ngdoc method + * @name ng.$location#replace + * @methodOf ng.$location + * + * @description + * If called, all changes to $location during current `$digest` will be replacing current history + * record, instead of adding new one. + */ + replace: function() { + this.$$replace = true; + return this; + } +}; + +function locationGetter(property) { + return function() { + return this[property]; + }; +} + + +function locationGetterSetter(property, preprocess) { + return function(value) { + if (isUndefined(value)) + return this[property]; + + this[property] = preprocess(value); + this.$$compose(); + + return this; + }; +} + + +/** + * @ngdoc object + * @name ng.$location + * + * @requires $browser + * @requires $sniffer + * @requires $rootElement + * + * @description + * The $location service parses the URL in the browser address bar (based on the + * {@link https://developer.mozilla.org/en/window.location window.location}) and makes the URL + * available to your application. Changes to the URL in the address bar are reflected into + * $location service and changes to $location are reflected into the browser address bar. + * + * **The $location service:** + * + * - Exposes the current URL in the browser address bar, so you can + * - Watch and observe the URL. + * - Change the URL. + * - Synchronizes the URL with the browser when the user + * - Changes the address bar. + * - Clicks the back or forward button (or clicks a History link). + * - Clicks on a link. + * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). + * + * For more information see {@link guide/dev_guide.services.$location Developer Guide: Angular + * Services: Using $location} + */ + +/** + * @ngdoc object + * @name ng.$locationProvider + * @description + * Use the `$locationProvider` to configure how the application deep linking paths are stored. + */ +function $LocationProvider(){ + var hashPrefix = '', + html5Mode = false; + + /** + * @ngdoc property + * @name ng.$locationProvider#hashPrefix + * @methodOf ng.$locationProvider + * @description + * @param {string=} prefix Prefix for hash part (containing path and search) + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.hashPrefix = function(prefix) { + if (isDefined(prefix)) { + hashPrefix = prefix; + return this; + } else { + return hashPrefix; + } + }; + + /** + * @ngdoc property + * @name ng.$locationProvider#html5Mode + * @methodOf ng.$locationProvider + * @description + * @param {boolean=} mode Use HTML5 strategy if available. + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.html5Mode = function(mode) { + if (isDefined(mode)) { + html5Mode = mode; + return this; + } else { + return html5Mode; + } + }; + + /** + * @ngdoc event + * @name ng.$location#$locationChangeStart + * @eventOf ng.$location + * @eventType broadcast on root scope + * @description + * Broadcasted before a URL will change. This change can be prevented by calling + * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more + * details about event object. Upon successful change + * {@link ng.$location#events_$locationChangeSuccess $locationChangeSuccess} is fired. + * + * @param {Object} angularEvent Synthetic event object. + * @param {string} newUrl New URL + * @param {string=} oldUrl URL that was before it was changed. + */ + + /** + * @ngdoc event + * @name ng.$location#$locationChangeSuccess + * @eventOf ng.$location + * @eventType broadcast on root scope + * @description + * Broadcasted after a URL was changed. + * + * @param {Object} angularEvent Synthetic event object. + * @param {string} newUrl New URL + * @param {string=} oldUrl URL that was before it was changed. + */ + + this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', + function( $rootScope, $browser, $sniffer, $rootElement) { + var $location, + LocationMode, + baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to '' + initialUrl = $browser.url(), + appBase; + + if (html5Mode) { + appBase = serverBase(initialUrl) + (baseHref || '/'); + LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url; + } else { + appBase = stripHash(initialUrl); + LocationMode = LocationHashbangUrl; + } + $location = new LocationMode(appBase, '#' + hashPrefix); + $location.$$parse($location.$$rewrite(initialUrl)); + + $rootElement.on('click', function(event) { + // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) + // currently we open nice url link and redirect then + + if (event.ctrlKey || event.metaKey || event.which == 2) return; + + var elm = jqLite(event.target); + + // traverse the DOM up to find first A tag + while (lowercase(elm[0].nodeName) !== 'a') { + // ignore rewriting if no A tag (reached root element, or no parent - removed from document) + if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; + } + + var absHref = elm.prop('href'); + + if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') { + // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during + // an animation. + absHref = urlResolve(absHref.animVal).href; + } + + var rewrittenUrl = $location.$$rewrite(absHref); + + if (absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented()) { + event.preventDefault(); + if (rewrittenUrl != $browser.url()) { + // update location manually + $location.$$parse(rewrittenUrl); + $rootScope.$apply(); + // hack to work around FF6 bug 684208 when scenario runner clicks on links + window.angular['ff-684208-preventDefault'] = true; + } + } + }); + + + // rewrite hashbang url <> html5 url + if ($location.absUrl() != initialUrl) { + $browser.url($location.absUrl(), true); + } + + // update $location when $browser url changes + $browser.onUrlChange(function(newUrl) { + if ($location.absUrl() != newUrl) { + $rootScope.$evalAsync(function() { + var oldUrl = $location.absUrl(); + + $location.$$parse(newUrl); + if ($rootScope.$broadcast('$locationChangeStart', newUrl, + oldUrl).defaultPrevented) { + $location.$$parse(oldUrl); + $browser.url(oldUrl); + } else { + afterLocationChange(oldUrl); + } + }); + if (!$rootScope.$$phase) $rootScope.$digest(); + } + }); + + // update browser + var changeCounter = 0; + $rootScope.$watch(function $locationWatch() { + var oldUrl = $browser.url(); + var currentReplace = $location.$$replace; + + if (!changeCounter || oldUrl != $location.absUrl()) { + changeCounter++; + $rootScope.$evalAsync(function() { + if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl). + defaultPrevented) { + $location.$$parse(oldUrl); + } else { + $browser.url($location.absUrl(), currentReplace); + afterLocationChange(oldUrl); + } + }); + } + $location.$$replace = false; + + return changeCounter; + }); + + return $location; + + function afterLocationChange(oldUrl) { + $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl); + } +}]; +} + +/** + * @ngdoc object + * @name ng.$log + * @requires $window + * + * @description + * Simple service for logging. Default implementation safely writes the message + * into the browser's console (if present). + * + * The main purpose of this service is to simplify debugging and troubleshooting. + * + * The default is to log `debug` messages. You can use + * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this. + * + * @example + + + function LogCtrl($scope, $log) { + $scope.$log = $log; + $scope.message = 'Hello World!'; + } + + +
                  +

                  Reload this page with open console, enter text and hit the log button...

                  + Message: + + + + + +
                  +
                  +
                  + */ + +/** + * @ngdoc object + * @name ng.$logProvider + * @description + * Use the `$logProvider` to configure how the application logs messages + */ +function $LogProvider(){ + var debug = true, + self = this; + + /** + * @ngdoc property + * @name ng.$logProvider#debugEnabled + * @methodOf ng.$logProvider + * @description + * @param {string=} flag enable or disable debug level messages + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.debugEnabled = function(flag) { + if (isDefined(flag)) { + debug = flag; + return this; + } else { + return debug; + } + }; + + this.$get = ['$window', function($window){ + return { + /** + * @ngdoc method + * @name ng.$log#log + * @methodOf ng.$log + * + * @description + * Write a log message + */ + log: consoleLog('log'), + + /** + * @ngdoc method + * @name ng.$log#info + * @methodOf ng.$log + * + * @description + * Write an information message + */ + info: consoleLog('info'), + + /** + * @ngdoc method + * @name ng.$log#warn + * @methodOf ng.$log + * + * @description + * Write a warning message + */ + warn: consoleLog('warn'), + + /** + * @ngdoc method + * @name ng.$log#error + * @methodOf ng.$log + * + * @description + * Write an error message + */ + error: consoleLog('error'), + + /** + * @ngdoc method + * @name ng.$log#debug + * @methodOf ng.$log + * + * @description + * Write a debug message + */ + debug: (function () { + var fn = consoleLog('debug'); + + return function() { + if (debug) { + fn.apply(self, arguments); + } + }; + }()) + }; + + function formatError(arg) { + if (arg instanceof Error) { + if (arg.stack) { + arg = (arg.message && arg.stack.indexOf(arg.message) === -1) + ? 'Error: ' + arg.message + '\n' + arg.stack + : arg.stack; + } else if (arg.sourceURL) { + arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; + } + } + return arg; + } + + function consoleLog(type) { + var console = $window.console || {}, + logFn = console[type] || console.log || noop, + hasApply = false; + + // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. + // The reason behind this is that console.log has type "object" in IE8... + try { + hasApply = !! logFn.apply; + } catch (e) {} + + if (hasApply) { + return function() { + var args = []; + forEach(arguments, function(arg) { + args.push(formatError(arg)); + }); + return logFn.apply(console, args); + }; + } + + // we are IE which either doesn't have window.console => this is noop and we do nothing, + // or we are IE where console.log doesn't have apply so we log at least first 2 args + return function(arg1, arg2) { + logFn(arg1, arg2 == null ? '' : arg2); + }; + } + }]; +} + +var $parseMinErr = minErr('$parse'); +var promiseWarningCache = {}; +var promiseWarning; + +// Sandboxing Angular Expressions +// ------------------------------ +// Angular expressions are generally considered safe because these expressions only have direct +// access to $scope and locals. However, one can obtain the ability to execute arbitrary JS code by +// obtaining a reference to native JS functions such as the Function constructor. +// +// As an example, consider the following Angular expression: +// +// {}.toString.constructor(alert("evil JS code")) +// +// We want to prevent this type of access. For the sake of performance, during the lexing phase we +// disallow any "dotted" access to any member named "constructor". +// +// For reflective calls (a[b]) we check that the value of the lookup is not the Function constructor +// while evaluating the expression, which is a stronger but more expensive test. Since reflective +// calls are expensive anyway, this is not such a big deal compared to static dereferencing. +// +// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits +// against the expression language, but not to prevent exploits that were enabled by exposing +// sensitive JavaScript or browser apis on Scope. Exposing such objects on a Scope is never a good +// practice and therefore we are not even trying to protect against interaction with an object +// explicitly exposed in this way. +// +// A developer could foil the name check by aliasing the Function constructor under a different +// name on the scope. +// +// In general, it is not possible to access a Window object from an angular expression unless a +// window or some DOM object that has a reference to window is published onto a Scope. + +function ensureSafeMemberName(name, fullExpression) { + if (name === "constructor") { + throw $parseMinErr('isecfld', + 'Referencing "constructor" field in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } + return name; +} + +function ensureSafeObject(obj, fullExpression) { + // nifty check if obj is Function that is fast and works across iframes and other contexts + if (obj) { + if (obj.constructor === obj) { + throw $parseMinErr('isecfn', + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// isWindow(obj) + obj.document && obj.location && obj.alert && obj.setInterval) { + throw $parseMinErr('isecwindow', + 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// isElement(obj) + obj.children && (obj.nodeName || (obj.on && obj.find))) { + throw $parseMinErr('isecdom', + 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } + } + return obj; +} + +var OPERATORS = { + /* jshint bitwise : false */ + 'null':function(){return null;}, + 'true':function(){return true;}, + 'false':function(){return false;}, + undefined:noop, + '+':function(self, locals, a,b){ + a=a(self, locals); b=b(self, locals); + if (isDefined(a)) { + if (isDefined(b)) { + return a + b; + } + return a; + } + return isDefined(b)?b:undefined;}, + '-':function(self, locals, a,b){ + a=a(self, locals); b=b(self, locals); + return (isDefined(a)?a:0)-(isDefined(b)?b:0); + }, + '*':function(self, locals, a,b){return a(self, locals)*b(self, locals);}, + '/':function(self, locals, a,b){return a(self, locals)/b(self, locals);}, + '%':function(self, locals, a,b){return a(self, locals)%b(self, locals);}, + '^':function(self, locals, a,b){return a(self, locals)^b(self, locals);}, + '=':noop, + '===':function(self, locals, a, b){return a(self, locals)===b(self, locals);}, + '!==':function(self, locals, a, b){return a(self, locals)!==b(self, locals);}, + '==':function(self, locals, a,b){return a(self, locals)==b(self, locals);}, + '!=':function(self, locals, a,b){return a(self, locals)!=b(self, locals);}, + '<':function(self, locals, a,b){return a(self, locals)':function(self, locals, a,b){return a(self, locals)>b(self, locals);}, + '<=':function(self, locals, a,b){return a(self, locals)<=b(self, locals);}, + '>=':function(self, locals, a,b){return a(self, locals)>=b(self, locals);}, + '&&':function(self, locals, a,b){return a(self, locals)&&b(self, locals);}, + '||':function(self, locals, a,b){return a(self, locals)||b(self, locals);}, + '&':function(self, locals, a,b){return a(self, locals)&b(self, locals);}, +// '|':function(self, locals, a,b){return a|b;}, + '|':function(self, locals, a,b){return b(self, locals)(self, locals, a(self, locals));}, + '!':function(self, locals, a){return !a(self, locals);} +}; +/* jshint bitwise: true */ +var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; + + +///////////////////////////////////////// + + +/** + * @constructor + */ +var Lexer = function (options) { + this.options = options; +}; + +Lexer.prototype = { + constructor: Lexer, + + lex: function (text) { + this.text = text; + + this.index = 0; + this.ch = undefined; + this.lastCh = ':'; // can start regexp + + this.tokens = []; + + var token; + var json = []; + + while (this.index < this.text.length) { + this.ch = this.text.charAt(this.index); + if (this.is('"\'')) { + this.readString(this.ch); + } else if (this.isNumber(this.ch) || this.is('.') && this.isNumber(this.peek())) { + this.readNumber(); + } else if (this.isIdent(this.ch)) { + this.readIdent(); + // identifiers can only be if the preceding char was a { or , + if (this.was('{,') && json[0] === '{' && + (token = this.tokens[this.tokens.length - 1])) { + token.json = token.text.indexOf('.') === -1; + } + } else if (this.is('(){}[].,;:?')) { + this.tokens.push({ + index: this.index, + text: this.ch, + json: (this.was(':[,') && this.is('{[')) || this.is('}]:,') + }); + if (this.is('{[')) json.unshift(this.ch); + if (this.is('}]')) json.shift(); + this.index++; + } else if (this.isWhitespace(this.ch)) { + this.index++; + continue; + } else { + var ch2 = this.ch + this.peek(); + var ch3 = ch2 + this.peek(2); + var fn = OPERATORS[this.ch]; + var fn2 = OPERATORS[ch2]; + var fn3 = OPERATORS[ch3]; + if (fn3) { + this.tokens.push({index: this.index, text: ch3, fn: fn3}); + this.index += 3; + } else if (fn2) { + this.tokens.push({index: this.index, text: ch2, fn: fn2}); + this.index += 2; + } else if (fn) { + this.tokens.push({ + index: this.index, + text: this.ch, + fn: fn, + json: (this.was('[,:') && this.is('+-')) + }); + this.index += 1; + } else { + this.throwError('Unexpected next character ', this.index, this.index + 1); + } + } + this.lastCh = this.ch; + } + return this.tokens; + }, + + is: function(chars) { + return chars.indexOf(this.ch) !== -1; + }, + + was: function(chars) { + return chars.indexOf(this.lastCh) !== -1; + }, + + peek: function(i) { + var num = i || 1; + return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false; + }, + + isNumber: function(ch) { + return ('0' <= ch && ch <= '9'); + }, + + isWhitespace: function(ch) { + // IE treats non-breaking space as \u00A0 + return (ch === ' ' || ch === '\r' || ch === '\t' || + ch === '\n' || ch === '\v' || ch === '\u00A0'); + }, + + isIdent: function(ch) { + return ('a' <= ch && ch <= 'z' || + 'A' <= ch && ch <= 'Z' || + '_' === ch || ch === '$'); + }, + + isExpOperator: function(ch) { + return (ch === '-' || ch === '+' || this.isNumber(ch)); + }, + + throwError: function(error, start, end) { + end = end || this.index; + var colStr = (isDefined(start) + ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']' + : ' ' + end); + throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].', + error, colStr, this.text); + }, + + readNumber: function() { + var number = ''; + var start = this.index; + while (this.index < this.text.length) { + var ch = lowercase(this.text.charAt(this.index)); + if (ch == '.' || this.isNumber(ch)) { + number += ch; + } else { + var peekCh = this.peek(); + if (ch == 'e' && this.isExpOperator(peekCh)) { + number += ch; + } else if (this.isExpOperator(ch) && + peekCh && this.isNumber(peekCh) && + number.charAt(number.length - 1) == 'e') { + number += ch; + } else if (this.isExpOperator(ch) && + (!peekCh || !this.isNumber(peekCh)) && + number.charAt(number.length - 1) == 'e') { + this.throwError('Invalid exponent'); + } else { + break; + } + } + this.index++; + } + number = 1 * number; + this.tokens.push({ + index: start, + text: number, + json: true, + fn: function() { return number; } + }); + }, + + readIdent: function() { + var parser = this; + + var ident = ''; + var start = this.index; + + var lastDot, peekIndex, methodName, ch; + + while (this.index < this.text.length) { + ch = this.text.charAt(this.index); + if (ch === '.' || this.isIdent(ch) || this.isNumber(ch)) { + if (ch === '.') lastDot = this.index; + ident += ch; + } else { + break; + } + this.index++; + } + + //check if this is not a method invocation and if it is back out to last dot + if (lastDot) { + peekIndex = this.index; + while (peekIndex < this.text.length) { + ch = this.text.charAt(peekIndex); + if (ch === '(') { + methodName = ident.substr(lastDot - start + 1); + ident = ident.substr(0, lastDot - start); + this.index = peekIndex; + break; + } + if (this.isWhitespace(ch)) { + peekIndex++; + } else { + break; + } + } + } + + + var token = { + index: start, + text: ident + }; + + // OPERATORS is our own object so we don't need to use special hasOwnPropertyFn + if (OPERATORS.hasOwnProperty(ident)) { + token.fn = OPERATORS[ident]; + token.json = OPERATORS[ident]; + } else { + var getter = getterFn(ident, this.options, this.text); + token.fn = extend(function(self, locals) { + return (getter(self, locals)); + }, { + assign: function(self, value) { + return setter(self, ident, value, parser.text, parser.options); + } + }); + } + + this.tokens.push(token); + + if (methodName) { + this.tokens.push({ + index:lastDot, + text: '.', + json: false + }); + this.tokens.push({ + index: lastDot + 1, + text: methodName, + json: false + }); + } + }, + + readString: function(quote) { + var start = this.index; + this.index++; + var string = ''; + var rawString = quote; + var escape = false; + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + rawString += ch; + if (escape) { + if (ch === 'u') { + var hex = this.text.substring(this.index + 1, this.index + 5); + if (!hex.match(/[\da-f]{4}/i)) + this.throwError('Invalid unicode escape [\\u' + hex + ']'); + this.index += 4; + string += String.fromCharCode(parseInt(hex, 16)); + } else { + var rep = ESCAPE[ch]; + if (rep) { + string += rep; + } else { + string += ch; + } + } + escape = false; + } else if (ch === '\\') { + escape = true; + } else if (ch === quote) { + this.index++; + this.tokens.push({ + index: start, + text: rawString, + string: string, + json: true, + fn: function() { return string; } + }); + return; + } else { + string += ch; + } + this.index++; + } + this.throwError('Unterminated quote', start); + } +}; + + +/** + * @constructor + */ +var Parser = function (lexer, $filter, options) { + this.lexer = lexer; + this.$filter = $filter; + this.options = options; +}; + +Parser.ZERO = function () { return 0; }; + +Parser.prototype = { + constructor: Parser, + + parse: function (text, json) { + this.text = text; + + //TODO(i): strip all the obsolte json stuff from this file + this.json = json; + + this.tokens = this.lexer.lex(text); + + if (json) { + // The extra level of aliasing is here, just in case the lexer misses something, so that + // we prevent any accidental execution in JSON. + this.assignment = this.logicalOR; + + this.functionCall = + this.fieldAccess = + this.objectIndex = + this.filterChain = function() { + this.throwError('is not valid json', {text: text, index: 0}); + }; + } + + var value = json ? this.primary() : this.statements(); + + if (this.tokens.length !== 0) { + this.throwError('is an unexpected token', this.tokens[0]); + } + + value.literal = !!value.literal; + value.constant = !!value.constant; + + return value; + }, + + primary: function () { + var primary; + if (this.expect('(')) { + primary = this.filterChain(); + this.consume(')'); + } else if (this.expect('[')) { + primary = this.arrayDeclaration(); + } else if (this.expect('{')) { + primary = this.object(); + } else { + var token = this.expect(); + primary = token.fn; + if (!primary) { + this.throwError('not a primary expression', token); + } + if (token.json) { + primary.constant = true; + primary.literal = true; + } + } + + var next, context; + while ((next = this.expect('(', '[', '.'))) { + if (next.text === '(') { + primary = this.functionCall(primary, context); + context = null; + } else if (next.text === '[') { + context = primary; + primary = this.objectIndex(primary); + } else if (next.text === '.') { + context = primary; + primary = this.fieldAccess(primary); + } else { + this.throwError('IMPOSSIBLE'); + } + } + return primary; + }, + + throwError: function(msg, token) { + throw $parseMinErr('syntax', + 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].', + token.text, msg, (token.index + 1), this.text, this.text.substring(token.index)); + }, + + peekToken: function() { + if (this.tokens.length === 0) + throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); + return this.tokens[0]; + }, + + peek: function(e1, e2, e3, e4) { + if (this.tokens.length > 0) { + var token = this.tokens[0]; + var t = token.text; + if (t === e1 || t === e2 || t === e3 || t === e4 || + (!e1 && !e2 && !e3 && !e4)) { + return token; + } + } + return false; + }, + + expect: function(e1, e2, e3, e4){ + var token = this.peek(e1, e2, e3, e4); + if (token) { + if (this.json && !token.json) { + this.throwError('is not valid json', token); + } + this.tokens.shift(); + return token; + } + return false; + }, + + consume: function(e1){ + if (!this.expect(e1)) { + this.throwError('is unexpected, expecting [' + e1 + ']', this.peek()); + } + }, + + unaryFn: function(fn, right) { + return extend(function(self, locals) { + return fn(self, locals, right); + }, { + constant:right.constant + }); + }, + + ternaryFn: function(left, middle, right){ + return extend(function(self, locals){ + return left(self, locals) ? middle(self, locals) : right(self, locals); + }, { + constant: left.constant && middle.constant && right.constant + }); + }, + + binaryFn: function(left, fn, right) { + return extend(function(self, locals) { + return fn(self, locals, left, right); + }, { + constant:left.constant && right.constant + }); + }, + + statements: function() { + var statements = []; + while (true) { + if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']')) + statements.push(this.filterChain()); + if (!this.expect(';')) { + // optimize for the common case where there is only one statement. + // TODO(size): maybe we should not support multiple statements? + return (statements.length === 1) + ? statements[0] + : function(self, locals) { + var value; + for (var i = 0; i < statements.length; i++) { + var statement = statements[i]; + if (statement) { + value = statement(self, locals); + } + } + return value; + }; + } + } + }, + + filterChain: function() { + var left = this.expression(); + var token; + while (true) { + if ((token = this.expect('|'))) { + left = this.binaryFn(left, token.fn, this.filter()); + } else { + return left; + } + } + }, + + filter: function() { + var token = this.expect(); + var fn = this.$filter(token.text); + var argsFn = []; + while (true) { + if ((token = this.expect(':'))) { + argsFn.push(this.expression()); + } else { + var fnInvoke = function(self, locals, input) { + var args = [input]; + for (var i = 0; i < argsFn.length; i++) { + args.push(argsFn[i](self, locals)); + } + return fn.apply(self, args); + }; + return function() { + return fnInvoke; + }; + } + } + }, + + expression: function() { + return this.assignment(); + }, + + assignment: function() { + var left = this.ternary(); + var right; + var token; + if ((token = this.expect('='))) { + if (!left.assign) { + this.throwError('implies assignment but [' + + this.text.substring(0, token.index) + '] can not be assigned to', token); + } + right = this.ternary(); + return function(scope, locals) { + return left.assign(scope, right(scope, locals), locals); + }; + } + return left; + }, + + ternary: function() { + var left = this.logicalOR(); + var middle; + var token; + if ((token = this.expect('?'))) { + middle = this.ternary(); + if ((token = this.expect(':'))) { + return this.ternaryFn(left, middle, this.ternary()); + } else { + this.throwError('expected :', token); + } + } else { + return left; + } + }, + + logicalOR: function() { + var left = this.logicalAND(); + var token; + while (true) { + if ((token = this.expect('||'))) { + left = this.binaryFn(left, token.fn, this.logicalAND()); + } else { + return left; + } + } + }, + + logicalAND: function() { + var left = this.equality(); + var token; + if ((token = this.expect('&&'))) { + left = this.binaryFn(left, token.fn, this.logicalAND()); + } + return left; + }, + + equality: function() { + var left = this.relational(); + var token; + if ((token = this.expect('==','!=','===','!=='))) { + left = this.binaryFn(left, token.fn, this.equality()); + } + return left; + }, + + relational: function() { + var left = this.additive(); + var token; + if ((token = this.expect('<', '>', '<=', '>='))) { + left = this.binaryFn(left, token.fn, this.relational()); + } + return left; + }, + + additive: function() { + var left = this.multiplicative(); + var token; + while ((token = this.expect('+','-'))) { + left = this.binaryFn(left, token.fn, this.multiplicative()); + } + return left; + }, + + multiplicative: function() { + var left = this.unary(); + var token; + while ((token = this.expect('*','/','%'))) { + left = this.binaryFn(left, token.fn, this.unary()); + } + return left; + }, + + unary: function() { + var token; + if (this.expect('+')) { + return this.primary(); + } else if ((token = this.expect('-'))) { + return this.binaryFn(Parser.ZERO, token.fn, this.unary()); + } else if ((token = this.expect('!'))) { + return this.unaryFn(token.fn, this.unary()); + } else { + return this.primary(); + } + }, + + fieldAccess: function(object) { + var parser = this; + var field = this.expect().text; + var getter = getterFn(field, this.options, this.text); + + return extend(function(scope, locals, self) { + return getter(self || object(scope, locals), locals); + }, { + assign: function(scope, value, locals) { + return setter(object(scope, locals), field, value, parser.text, parser.options); + } + }); + }, + + objectIndex: function(obj) { + var parser = this; + + var indexFn = this.expression(); + this.consume(']'); + + return extend(function(self, locals) { + var o = obj(self, locals), + i = indexFn(self, locals), + v, p; + + if (!o) return undefined; + v = ensureSafeObject(o[i], parser.text); + if (v && v.then && parser.options.unwrapPromises) { + p = v; + if (!('$$v' in v)) { + p.$$v = undefined; + p.then(function(val) { p.$$v = val; }); + } + v = v.$$v; + } + return v; + }, { + assign: function(self, value, locals) { + var key = indexFn(self, locals); + // prevent overwriting of Function.constructor which would break ensureSafeObject check + var safe = ensureSafeObject(obj(self, locals), parser.text); + return safe[key] = value; + } + }); + }, + + functionCall: function(fn, contextGetter) { + var argsFn = []; + if (this.peekToken().text !== ')') { + do { + argsFn.push(this.expression()); + } while (this.expect(',')); + } + this.consume(')'); + + var parser = this; + + return function(scope, locals) { + var args = []; + var context = contextGetter ? contextGetter(scope, locals) : scope; + + for (var i = 0; i < argsFn.length; i++) { + args.push(argsFn[i](scope, locals)); + } + var fnPtr = fn(scope, locals, context) || noop; + + ensureSafeObject(context, parser.text); + ensureSafeObject(fnPtr, parser.text); + + // IE stupidity! (IE doesn't have apply for some native functions) + var v = fnPtr.apply + ? fnPtr.apply(context, args) + : fnPtr(args[0], args[1], args[2], args[3], args[4]); + + return ensureSafeObject(v, parser.text); + }; + }, + + // This is used with json array declaration + arrayDeclaration: function () { + var elementFns = []; + var allConstant = true; + if (this.peekToken().text !== ']') { + do { + var elementFn = this.expression(); + elementFns.push(elementFn); + if (!elementFn.constant) { + allConstant = false; + } + } while (this.expect(',')); + } + this.consume(']'); + + return extend(function(self, locals) { + var array = []; + for (var i = 0; i < elementFns.length; i++) { + array.push(elementFns[i](self, locals)); + } + return array; + }, { + literal: true, + constant: allConstant + }); + }, + + object: function () { + var keyValues = []; + var allConstant = true; + if (this.peekToken().text !== '}') { + do { + var token = this.expect(), + key = token.string || token.text; + this.consume(':'); + var value = this.expression(); + keyValues.push({key: key, value: value}); + if (!value.constant) { + allConstant = false; + } + } while (this.expect(',')); + } + this.consume('}'); + + return extend(function(self, locals) { + var object = {}; + for (var i = 0; i < keyValues.length; i++) { + var keyValue = keyValues[i]; + object[keyValue.key] = keyValue.value(self, locals); + } + return object; + }, { + literal: true, + constant: allConstant + }); + } +}; + + +////////////////////////////////////////////////// +// Parser helper functions +////////////////////////////////////////////////// + +function setter(obj, path, setValue, fullExp, options) { + //needed? + options = options || {}; + + var element = path.split('.'), key; + for (var i = 0; element.length > 1; i++) { + key = ensureSafeMemberName(element.shift(), fullExp); + var propertyObj = obj[key]; + if (!propertyObj) { + propertyObj = {}; + obj[key] = propertyObj; + } + obj = propertyObj; + if (obj.then && options.unwrapPromises) { + promiseWarning(fullExp); + if (!("$$v" in obj)) { + (function(promise) { + promise.then(function(val) { promise.$$v = val; }); } + )(obj); + } + if (obj.$$v === undefined) { + obj.$$v = {}; + } + obj = obj.$$v; + } + } + key = ensureSafeMemberName(element.shift(), fullExp); + obj[key] = setValue; + return setValue; +} + +var getterFnCache = {}; + +/** + * Implementation of the "Black Hole" variant from: + * - http://jsperf.com/angularjs-parse-getter/4 + * - http://jsperf.com/path-evaluation-simplified/7 + */ +function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) { + ensureSafeMemberName(key0, fullExp); + ensureSafeMemberName(key1, fullExp); + ensureSafeMemberName(key2, fullExp); + ensureSafeMemberName(key3, fullExp); + ensureSafeMemberName(key4, fullExp); + + return !options.unwrapPromises + ? function cspSafeGetter(scope, locals) { + var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope; + + if (pathVal == null) return pathVal; + pathVal = pathVal[key0]; + + if (!key1) return pathVal; + if (pathVal == null) return undefined; + pathVal = pathVal[key1]; + + if (!key2) return pathVal; + if (pathVal == null) return undefined; + pathVal = pathVal[key2]; + + if (!key3) return pathVal; + if (pathVal == null) return undefined; + pathVal = pathVal[key3]; + + if (!key4) return pathVal; + if (pathVal == null) return undefined; + pathVal = pathVal[key4]; + + return pathVal; + } + : function cspSafePromiseEnabledGetter(scope, locals) { + var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope, + promise; + + if (pathVal == null) return pathVal; + + pathVal = pathVal[key0]; + if (pathVal && pathVal.then) { + promiseWarning(fullExp); + if (!("$$v" in pathVal)) { + promise = pathVal; + promise.$$v = undefined; + promise.then(function(val) { promise.$$v = val; }); + } + pathVal = pathVal.$$v; + } + + if (!key1) return pathVal; + if (pathVal == null) return undefined; + pathVal = pathVal[key1]; + if (pathVal && pathVal.then) { + promiseWarning(fullExp); + if (!("$$v" in pathVal)) { + promise = pathVal; + promise.$$v = undefined; + promise.then(function(val) { promise.$$v = val; }); + } + pathVal = pathVal.$$v; + } + + if (!key2) return pathVal; + if (pathVal == null) return undefined; + pathVal = pathVal[key2]; + if (pathVal && pathVal.then) { + promiseWarning(fullExp); + if (!("$$v" in pathVal)) { + promise = pathVal; + promise.$$v = undefined; + promise.then(function(val) { promise.$$v = val; }); + } + pathVal = pathVal.$$v; + } + + if (!key3) return pathVal; + if (pathVal == null) return undefined; + pathVal = pathVal[key3]; + if (pathVal && pathVal.then) { + promiseWarning(fullExp); + if (!("$$v" in pathVal)) { + promise = pathVal; + promise.$$v = undefined; + promise.then(function(val) { promise.$$v = val; }); + } + pathVal = pathVal.$$v; + } + + if (!key4) return pathVal; + if (pathVal == null) return undefined; + pathVal = pathVal[key4]; + if (pathVal && pathVal.then) { + promiseWarning(fullExp); + if (!("$$v" in pathVal)) { + promise = pathVal; + promise.$$v = undefined; + promise.then(function(val) { promise.$$v = val; }); + } + pathVal = pathVal.$$v; + } + return pathVal; + }; +} + +function simpleGetterFn1(key0, fullExp) { + ensureSafeMemberName(key0, fullExp); + + return function simpleGetterFn1(scope, locals) { + if (scope == null) return undefined; + return ((locals && locals.hasOwnProperty(key0)) ? locals : scope)[key0]; + }; +} + +function simpleGetterFn2(key0, key1, fullExp) { + ensureSafeMemberName(key0, fullExp); + ensureSafeMemberName(key1, fullExp); + + return function simpleGetterFn2(scope, locals) { + if (scope == null) return undefined; + scope = ((locals && locals.hasOwnProperty(key0)) ? locals : scope)[key0]; + return scope == null ? undefined : scope[key1]; + }; +} + +function getterFn(path, options, fullExp) { + // Check whether the cache has this getter already. + // We can use hasOwnProperty directly on the cache because we ensure, + // see below, that the cache never stores a path called 'hasOwnProperty' + if (getterFnCache.hasOwnProperty(path)) { + return getterFnCache[path]; + } + + var pathKeys = path.split('.'), + pathKeysLength = pathKeys.length, + fn; + + // When we have only 1 or 2 tokens, use optimized special case closures. + // http://jsperf.com/angularjs-parse-getter/6 + if (!options.unwrapPromises && pathKeysLength === 1) { + fn = simpleGetterFn1(pathKeys[0], fullExp); + } else if (!options.unwrapPromises && pathKeysLength === 2) { + fn = simpleGetterFn2(pathKeys[0], pathKeys[1], fullExp); + } else if (options.csp) { + if (pathKeysLength < 6) { + fn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp, + options); + } else { + fn = function(scope, locals) { + var i = 0, val; + do { + val = cspSafeGetterFn(pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++], + pathKeys[i++], fullExp, options)(scope, locals); + + locals = undefined; // clear after first iteration + scope = val; + } while (i < pathKeysLength); + return val; + }; + } + } else { + var code = 'var p;\n'; + forEach(pathKeys, function(key, index) { + ensureSafeMemberName(key, fullExp); + code += 'if(s == null) return undefined;\n' + + 's='+ (index + // we simply dereference 's' on any .dot notation + ? 's' + // but if we are first then we check locals first, and if so read it first + : '((k&&k.hasOwnProperty("' + key + '"))?k:s)') + '["' + key + '"]' + ';\n' + + (options.unwrapPromises + ? 'if (s && s.then) {\n' + + ' pw("' + fullExp.replace(/(["\r\n])/g, '\\$1') + '");\n' + + ' if (!("$$v" in s)) {\n' + + ' p=s;\n' + + ' p.$$v = undefined;\n' + + ' p.then(function(v) {p.$$v=v;});\n' + + '}\n' + + ' s=s.$$v\n' + + '}\n' + : ''); + }); + code += 'return s;'; + + /* jshint -W054 */ + var evaledFnGetter = new Function('s', 'k', 'pw', code); // s=scope, k=locals, pw=promiseWarning + /* jshint +W054 */ + evaledFnGetter.toString = valueFn(code); + fn = options.unwrapPromises ? function(scope, locals) { + return evaledFnGetter(scope, locals, promiseWarning); + } : evaledFnGetter; + } + + // Only cache the value if it's not going to mess up the cache object + // This is more performant that using Object.prototype.hasOwnProperty.call + if (path !== 'hasOwnProperty') { + getterFnCache[path] = fn; + } + return fn; +} + +/////////////////////////////////// + +/** + * @ngdoc function + * @name ng.$parse + * @function + * + * @description + * + * Converts Angular {@link guide/expression expression} into a function. + * + *
                  + *   var getter = $parse('user.name');
                  + *   var setter = getter.assign;
                  + *   var context = {user:{name:'angular'}};
                  + *   var locals = {user:{name:'local'}};
                  + *
                  + *   expect(getter(context)).toEqual('angular');
                  + *   setter(context, 'newValue');
                  + *   expect(context.user.name).toEqual('newValue');
                  + *   expect(getter(context, locals)).toEqual('local');
                  + * 
                  + * + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + * + * The returned function also has the following properties: + * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript + * literal. + * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript + * constant literals. + * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be + * set to a function to change its value on the given context. + * + */ + + +/** + * @ngdoc object + * @name ng.$parseProvider + * @function + * + * @description + * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse} + * service. + */ +function $ParseProvider() { + var cache = {}; + + var $parseOptions = { + csp: false, + unwrapPromises: false, + logPromiseWarnings: true + }; + + + /** + * @deprecated Promise unwrapping via $parse is deprecated and will be removed in the future. + * + * @ngdoc method + * @name ng.$parseProvider#unwrapPromises + * @methodOf ng.$parseProvider + * @description + * + * **This feature is deprecated, see deprecation notes below for more info** + * + * If set to true (default is false), $parse will unwrap promises automatically when a promise is + * found at any part of the expression. In other words, if set to true, the expression will always + * result in a non-promise value. + * + * While the promise is unresolved, it's treated as undefined, but once resolved and fulfilled, + * the fulfillment value is used in place of the promise while evaluating the expression. + * + * **Deprecation notice** + * + * This is a feature that didn't prove to be wildly useful or popular, primarily because of the + * dichotomy between data access in templates (accessed as raw values) and controller code + * (accessed as promises). + * + * In most code we ended up resolving promises manually in controllers anyway and thus unifying + * the model access there. + * + * Other downsides of automatic promise unwrapping: + * + * - when building components it's often desirable to receive the raw promises + * - adds complexity and slows down expression evaluation + * - makes expression code pre-generation unattractive due to the amount of code that needs to be + * generated + * - makes IDE auto-completion and tool support hard + * + * **Warning Logs** + * + * If the unwrapping is enabled, Angular will log a warning about each expression that unwraps a + * promise (to reduce the noise, each expression is logged only once). To disable this logging use + * `$parseProvider.logPromiseWarnings(false)` api. + * + * + * @param {boolean=} value New value. + * @returns {boolean|self} Returns the current setting when used as getter and self if used as + * setter. + */ + this.unwrapPromises = function(value) { + if (isDefined(value)) { + $parseOptions.unwrapPromises = !!value; + return this; + } else { + return $parseOptions.unwrapPromises; + } + }; + + + /** + * @deprecated Promise unwrapping via $parse is deprecated and will be removed in the future. + * + * @ngdoc method + * @name ng.$parseProvider#logPromiseWarnings + * @methodOf ng.$parseProvider + * @description + * + * Controls whether Angular should log a warning on any encounter of a promise in an expression. + * + * The default is set to `true`. + * + * This setting applies only if `$parseProvider.unwrapPromises` setting is set to true as well. + * + * @param {boolean=} value New value. + * @returns {boolean|self} Returns the current setting when used as getter and self if used as + * setter. + */ + this.logPromiseWarnings = function(value) { + if (isDefined(value)) { + $parseOptions.logPromiseWarnings = value; + return this; + } else { + return $parseOptions.logPromiseWarnings; + } + }; + + + this.$get = ['$filter', '$sniffer', '$log', function($filter, $sniffer, $log) { + $parseOptions.csp = $sniffer.csp; + + promiseWarning = function promiseWarningFn(fullExp) { + if (!$parseOptions.logPromiseWarnings || promiseWarningCache.hasOwnProperty(fullExp)) return; + promiseWarningCache[fullExp] = true; + $log.warn('[$parse] Promise found in the expression `' + fullExp + '`. ' + + 'Automatic unwrapping of promises in Angular expressions is deprecated.'); + }; + + return function(exp) { + var parsedExpression; + + switch (typeof exp) { + case 'string': + + if (cache.hasOwnProperty(exp)) { + return cache[exp]; + } + + var lexer = new Lexer($parseOptions); + var parser = new Parser(lexer, $filter, $parseOptions); + parsedExpression = parser.parse(exp, false); + + if (exp !== 'hasOwnProperty') { + // Only cache the value if it's not going to mess up the cache object + // This is more performant that using Object.prototype.hasOwnProperty.call + cache[exp] = parsedExpression; + } + + return parsedExpression; + + case 'function': + return exp; + + default: + return noop; + } + }; + }]; +} + +/** + * @ngdoc service + * @name ng.$q + * @requires $rootScope + * + * @description + * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q). + * + * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an + * interface for interacting with an object that represents the result of an action that is + * performed asynchronously, and may or may not be finished at any given point in time. + * + * From the perspective of dealing with error handling, deferred and promise APIs are to + * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming. + * + *
                  + *   // for the purpose of this example let's assume that variables `$q` and `scope` are
                  + *   // available in the current lexical scope (they could have been injected or passed in).
                  + *
                  + *   function asyncGreet(name) {
                  + *     var deferred = $q.defer();
                  + *
                  + *     setTimeout(function() {
                  + *       // since this fn executes async in a future turn of the event loop, we need to wrap
                  + *       // our code into an $apply call so that the model changes are properly observed.
                  + *       scope.$apply(function() {
                  + *         deferred.notify('About to greet ' + name + '.');
                  + *
                  + *         if (okToGreet(name)) {
                  + *           deferred.resolve('Hello, ' + name + '!');
                  + *         } else {
                  + *           deferred.reject('Greeting ' + name + ' is not allowed.');
                  + *         }
                  + *       });
                  + *     }, 1000);
                  + *
                  + *     return deferred.promise;
                  + *   }
                  + *
                  + *   var promise = asyncGreet('Robin Hood');
                  + *   promise.then(function(greeting) {
                  + *     alert('Success: ' + greeting);
                  + *   }, function(reason) {
                  + *     alert('Failed: ' + reason);
                  + *   }, function(update) {
                  + *     alert('Got notification: ' + update);
                  + *   });
                  + * 
                  + * + * At first it might not be obvious why this extra complexity is worth the trouble. The payoff + * comes in the way of guarantees that promise and deferred APIs make, see + * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md. + * + * Additionally the promise api allows for composition that is very hard to do with the + * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach. + * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the + * section on serial or parallel joining of promises. + * + * + * # The Deferred API + * + * A new instance of deferred is constructed by calling `$q.defer()`. + * + * The purpose of the deferred object is to expose the associated Promise instance as well as APIs + * that can be used for signaling the successful or unsuccessful completion, as well as the status + * of the task. + * + * **Methods** + * + * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection + * constructed via `$q.reject`, the promise will be rejected instead. + * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to + * resolving it with a rejection constructed via `$q.reject`. + * - `notify(value)` - provides updates on the status of the promises execution. This may be called + * multiple times before the promise is either resolved or rejected. + * + * **Properties** + * + * - promise – `{Promise}` – promise object associated with this deferred. + * + * + * # The Promise API + * + * A new promise instance is created when a deferred instance is created and can be retrieved by + * calling `deferred.promise`. + * + * The purpose of the promise object is to allow for interested parties to get access to the result + * of the deferred task when it completes. + * + * **Methods** + * + * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or + * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously + * as soon as the result is available. The callbacks are called with a single argument: the result + * or rejection reason. Additionally, the notify callback may be called zero or more times to + * provide a progress indication, before the promise is resolved or rejected. + * + * This method *returns a new promise* which is resolved or rejected via the return value of the + * `successCallback`, `errorCallback`. It also notifies via the return value of the + * `notifyCallback` method. The promise can not be resolved or rejected from the notifyCallback + * method. + * + * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)` + * + * - `finally(callback)` – allows you to observe either the fulfillment or rejection of a promise, + * but to do so without modifying the final value. This is useful to release resources or do some + * clean-up that needs to be done whether the promise was rejected or resolved. See the [full + * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for + * more information. + * + * Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as + * property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to + * make your code IE8 compatible. + * + * # Chaining promises + * + * Because calling the `then` method of a promise returns a new derived promise, it is easily + * possible to create a chain of promises: + * + *
                  + *   promiseB = promiseA.then(function(result) {
                  + *     return result + 1;
                  + *   });
                  + *
                  + *   // promiseB will be resolved immediately after promiseA is resolved and its value
                  + *   // will be the result of promiseA incremented by 1
                  + * 
                  + * + * It is possible to create chains of any length and since a promise can be resolved with another + * promise (which will defer its resolution further), it is possible to pause/defer resolution of + * the promises at any point in the chain. This makes it possible to implement powerful APIs like + * $http's response interceptors. + * + * + * # Differences between Kris Kowal's Q and $q + * + * There are two main differences: + * + * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation + * mechanism in angular, which means faster propagation of resolution or rejection into your + * models and avoiding unnecessary browser repaints, which would result in flickering UI. + * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains + * all the important functionality needed for common async tasks. + * + * # Testing + * + *
                  + *    it('should simulate promise', inject(function($q, $rootScope) {
                  + *      var deferred = $q.defer();
                  + *      var promise = deferred.promise;
                  + *      var resolvedValue;
                  + *
                  + *      promise.then(function(value) { resolvedValue = value; });
                  + *      expect(resolvedValue).toBeUndefined();
                  + *
                  + *      // Simulate resolving of promise
                  + *      deferred.resolve(123);
                  + *      // Note that the 'then' function does not get called synchronously.
                  + *      // This is because we want the promise API to always be async, whether or not
                  + *      // it got called synchronously or asynchronously.
                  + *      expect(resolvedValue).toBeUndefined();
                  + *
                  + *      // Propagate promise resolution to 'then' functions using $apply().
                  + *      $rootScope.$apply();
                  + *      expect(resolvedValue).toEqual(123);
                  + *    }));
                  + *  
                  + */ +function $QProvider() { + + this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { + return qFactory(function(callback) { + $rootScope.$evalAsync(callback); + }, $exceptionHandler); + }]; +} + + +/** + * Constructs a promise manager. + * + * @param {function(function)} nextTick Function for executing functions in the next turn. + * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for + * debugging purposes. + * @returns {object} Promise manager. + */ +function qFactory(nextTick, exceptionHandler) { + + /** + * @ngdoc + * @name ng.$q#defer + * @methodOf ng.$q + * @description + * Creates a `Deferred` object which represents a task which will finish in the future. + * + * @returns {Deferred} Returns a new instance of deferred. + */ + var defer = function() { + var pending = [], + value, deferred; + + deferred = { + + resolve: function(val) { + if (pending) { + var callbacks = pending; + pending = undefined; + value = ref(val); + + if (callbacks.length) { + nextTick(function() { + var callback; + for (var i = 0, ii = callbacks.length; i < ii; i++) { + callback = callbacks[i]; + value.then(callback[0], callback[1], callback[2]); + } + }); + } + } + }, + + + reject: function(reason) { + deferred.resolve(reject(reason)); + }, + + + notify: function(progress) { + if (pending) { + var callbacks = pending; + + if (pending.length) { + nextTick(function() { + var callback; + for (var i = 0, ii = callbacks.length; i < ii; i++) { + callback = callbacks[i]; + callback[2](progress); + } + }); + } + } + }, + + + promise: { + then: function(callback, errback, progressback) { + var result = defer(); + + var wrappedCallback = function(value) { + try { + result.resolve((isFunction(callback) ? callback : defaultCallback)(value)); + } catch(e) { + result.reject(e); + exceptionHandler(e); + } + }; + + var wrappedErrback = function(reason) { + try { + result.resolve((isFunction(errback) ? errback : defaultErrback)(reason)); + } catch(e) { + result.reject(e); + exceptionHandler(e); + } + }; + + var wrappedProgressback = function(progress) { + try { + result.notify((isFunction(progressback) ? progressback : defaultCallback)(progress)); + } catch(e) { + exceptionHandler(e); + } + }; + + if (pending) { + pending.push([wrappedCallback, wrappedErrback, wrappedProgressback]); + } else { + value.then(wrappedCallback, wrappedErrback, wrappedProgressback); + } + + return result.promise; + }, + + "catch": function(callback) { + return this.then(null, callback); + }, + + "finally": function(callback) { + + function makePromise(value, resolved) { + var result = defer(); + if (resolved) { + result.resolve(value); + } else { + result.reject(value); + } + return result.promise; + } + + function handleCallback(value, isResolved) { + var callbackOutput = null; + try { + callbackOutput = (callback ||defaultCallback)(); + } catch(e) { + return makePromise(e, false); + } + if (callbackOutput && isFunction(callbackOutput.then)) { + return callbackOutput.then(function() { + return makePromise(value, isResolved); + }, function(error) { + return makePromise(error, false); + }); + } else { + return makePromise(value, isResolved); + } + } + + return this.then(function(value) { + return handleCallback(value, true); + }, function(error) { + return handleCallback(error, false); + }); + } + } + }; + + return deferred; + }; + + + var ref = function(value) { + if (value && isFunction(value.then)) return value; + return { + then: function(callback) { + var result = defer(); + nextTick(function() { + result.resolve(callback(value)); + }); + return result.promise; + } + }; + }; + + + /** + * @ngdoc + * @name ng.$q#reject + * @methodOf ng.$q + * @description + * Creates a promise that is resolved as rejected with the specified `reason`. This api should be + * used to forward rejection in a chain of promises. If you are dealing with the last promise in + * a promise chain, you don't need to worry about it. + * + * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of + * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via + * a promise error callback and you want to forward the error to the promise derived from the + * current promise, you have to "rethrow" the error by returning a rejection constructed via + * `reject`. + * + *
                  +   *   promiseB = promiseA.then(function(result) {
                  +   *     // success: do something and resolve promiseB
                  +   *     //          with the old or a new result
                  +   *     return result;
                  +   *   }, function(reason) {
                  +   *     // error: handle the error if possible and
                  +   *     //        resolve promiseB with newPromiseOrValue,
                  +   *     //        otherwise forward the rejection to promiseB
                  +   *     if (canHandle(reason)) {
                  +   *      // handle the error and recover
                  +   *      return newPromiseOrValue;
                  +   *     }
                  +   *     return $q.reject(reason);
                  +   *   });
                  +   * 
                  + * + * @param {*} reason Constant, message, exception or an object representing the rejection reason. + * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. + */ + var reject = function(reason) { + return { + then: function(callback, errback) { + var result = defer(); + nextTick(function() { + try { + result.resolve((isFunction(errback) ? errback : defaultErrback)(reason)); + } catch(e) { + result.reject(e); + exceptionHandler(e); + } + }); + return result.promise; + } + }; + }; + + + /** + * @ngdoc + * @name ng.$q#when + * @methodOf ng.$q + * @description + * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. + * This is useful when you are dealing with an object that might or might not be a promise, or if + * the promise comes from a source that can't be trusted. + * + * @param {*} value Value or a promise + * @returns {Promise} Returns a promise of the passed value or promise + */ + var when = function(value, callback, errback, progressback) { + var result = defer(), + done; + + var wrappedCallback = function(value) { + try { + return (isFunction(callback) ? callback : defaultCallback)(value); + } catch (e) { + exceptionHandler(e); + return reject(e); + } + }; + + var wrappedErrback = function(reason) { + try { + return (isFunction(errback) ? errback : defaultErrback)(reason); + } catch (e) { + exceptionHandler(e); + return reject(e); + } + }; + + var wrappedProgressback = function(progress) { + try { + return (isFunction(progressback) ? progressback : defaultCallback)(progress); + } catch (e) { + exceptionHandler(e); + } + }; + + nextTick(function() { + ref(value).then(function(value) { + if (done) return; + done = true; + result.resolve(ref(value).then(wrappedCallback, wrappedErrback, wrappedProgressback)); + }, function(reason) { + if (done) return; + done = true; + result.resolve(wrappedErrback(reason)); + }, function(progress) { + if (done) return; + result.notify(wrappedProgressback(progress)); + }); + }); + + return result.promise; + }; + + + function defaultCallback(value) { + return value; + } + + + function defaultErrback(reason) { + return reject(reason); + } + + + /** + * @ngdoc + * @name ng.$q#all + * @methodOf ng.$q + * @description + * Combines multiple promises into a single promise that is resolved when all of the input + * promises are resolved. + * + * @param {Array.|Object.} promises An array or hash of promises. + * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values, + * each value corresponding to the promise at the same index/key in the `promises` array/hash. + * If any of the promises is resolved with a rejection, this resulting promise will be rejected + * with the same rejection value. + */ + function all(promises) { + var deferred = defer(), + counter = 0, + results = isArray(promises) ? [] : {}; + + forEach(promises, function(promise, key) { + counter++; + ref(promise).then(function(value) { + if (results.hasOwnProperty(key)) return; + results[key] = value; + if (!(--counter)) deferred.resolve(results); + }, function(reason) { + if (results.hasOwnProperty(key)) return; + deferred.reject(reason); + }); + }); + + if (counter === 0) { + deferred.resolve(results); + } + + return deferred.promise; + } + + return { + defer: defer, + reject: reject, + when: when, + all: all + }; +} + +/** + * DESIGN NOTES + * + * The design decisions behind the scope are heavily favored for speed and memory consumption. + * + * The typical use of scope is to watch the expressions, which most of the time return the same + * value as last time so we optimize the operation. + * + * Closures construction is expensive in terms of speed as well as memory: + * - No closures, instead use prototypical inheritance for API + * - Internal state needs to be stored on scope directly, which means that private state is + * exposed as $$____ properties + * + * Loop operations are optimized by using while(count--) { ... } + * - this means that in order to keep the same order of execution as addition we have to add + * items to the array at the beginning (shift) instead of at the end (push) + * + * Child scopes are created and removed often + * - Using an array would be slow since inserts in middle are expensive so we use linked list + * + * There are few watches then a lot of observers. This is why you don't want the observer to be + * implemented in the same way as watch. Watch requires return of initialization function which + * are expensive to construct. + */ + + +/** + * @ngdoc object + * @name ng.$rootScopeProvider + * @description + * + * Provider for the $rootScope service. + */ + +/** + * @ngdoc function + * @name ng.$rootScopeProvider#digestTtl + * @methodOf ng.$rootScopeProvider + * @description + * + * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and + * assuming that the model is unstable. + * + * The current default is 10 iterations. + * + * In complex applications it's possible that the dependencies between `$watch`s will result in + * several digest iterations. However if an application needs more than the default 10 digest + * iterations for its model to stabilize then you should investigate what is causing the model to + * continuously change during the digest. + * + * Increasing the TTL could have performance implications, so you should not change it without + * proper justification. + * + * @param {number} limit The number of digest iterations. + */ + + +/** + * @ngdoc object + * @name ng.$rootScope + * @description + * + * Every application has a single root {@link ng.$rootScope.Scope scope}. + * All other scopes are descendant scopes of the root scope. Scopes provide separation + * between the model and the view, via a mechanism for watching the model for changes. + * They also provide an event emission/broadcast and subscription facility. See the + * {@link guide/scope developer guide on scopes}. + */ +function $RootScopeProvider(){ + var TTL = 10; + var $rootScopeMinErr = minErr('$rootScope'); + var lastDirtyWatch = null; + + this.digestTtl = function(value) { + if (arguments.length) { + TTL = value; + } + return TTL; + }; + + this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser', + function( $injector, $exceptionHandler, $parse, $browser) { + + /** + * @ngdoc function + * @name ng.$rootScope.Scope + * + * @description + * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the + * {@link AUTO.$injector $injector}. Child scopes are created using the + * {@link ng.$rootScope.Scope#methods_$new $new()} method. (Most scopes are created automatically when + * compiled HTML template is executed.) + * + * Here is a simple scope snippet to show how you can interact with the scope. + *
                  +     * 
                  +     * 
                  + * + * # Inheritance + * A scope can inherit from a parent scope, as in this example: + *
                  +         var parent = $rootScope;
                  +         var child = parent.$new();
                  +
                  +         parent.salutation = "Hello";
                  +         child.name = "World";
                  +         expect(child.salutation).toEqual('Hello');
                  +
                  +         child.salutation = "Welcome";
                  +         expect(child.salutation).toEqual('Welcome');
                  +         expect(parent.salutation).toEqual('Hello');
                  +     * 
                  + * + * + * @param {Object.=} providers Map of service factory which need to be + * provided for the current scope. Defaults to {@link ng}. + * @param {Object.=} instanceCache Provides pre-instantiated services which should + * append/override services provided by `providers`. This is handy + * when unit-testing and having the need to override a default + * service. + * @returns {Object} Newly created scope. + * + */ + function Scope() { + this.$id = nextUid(); + this.$$phase = this.$parent = this.$$watchers = + this.$$nextSibling = this.$$prevSibling = + this.$$childHead = this.$$childTail = null; + this['this'] = this.$root = this; + this.$$destroyed = false; + this.$$asyncQueue = []; + this.$$postDigestQueue = []; + this.$$listeners = {}; + this.$$listenerCount = {}; + this.$$isolateBindings = {}; + } + + /** + * @ngdoc property + * @name ng.$rootScope.Scope#$id + * @propertyOf ng.$rootScope.Scope + * @returns {number} Unique scope ID (monotonically increasing alphanumeric sequence) useful for + * debugging. + */ + + + Scope.prototype = { + constructor: Scope, + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$new + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Creates a new child {@link ng.$rootScope.Scope scope}. + * + * The parent scope will propagate the {@link ng.$rootScope.Scope#methods_$digest $digest()} and + * {@link ng.$rootScope.Scope#methods_$digest $digest()} events. The scope can be removed from the + * scope hierarchy using {@link ng.$rootScope.Scope#methods_$destroy $destroy()}. + * + * {@link ng.$rootScope.Scope#methods_$destroy $destroy()} must be called on a scope when it is + * desired for the scope and its child scopes to be permanently detached from the parent and + * thus stop participating in model change detection and listener notification by invoking. + * + * @param {boolean} isolate If true, then the scope does not prototypically inherit from the + * parent scope. The scope is isolated, as it can not see parent scope properties. + * When creating widgets, it is useful for the widget to not accidentally read parent + * state. + * + * @returns {Object} The newly created child scope. + * + */ + $new: function(isolate) { + var ChildScope, + child; + + if (isolate) { + child = new Scope(); + child.$root = this.$root; + // ensure that there is just one async queue per $rootScope and its children + child.$$asyncQueue = this.$$asyncQueue; + child.$$postDigestQueue = this.$$postDigestQueue; + } else { + ChildScope = function() {}; // should be anonymous; This is so that when the minifier munges + // the name it does not become random set of chars. This will then show up as class + // name in the web inspector. + ChildScope.prototype = this; + child = new ChildScope(); + child.$id = nextUid(); + } + child['this'] = child; + child.$$listeners = {}; + child.$$listenerCount = {}; + child.$parent = this; + child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null; + child.$$prevSibling = this.$$childTail; + if (this.$$childHead) { + this.$$childTail.$$nextSibling = child; + this.$$childTail = child; + } else { + this.$$childHead = this.$$childTail = child; + } + return child; + }, + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$watch + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Registers a `listener` callback to be executed whenever the `watchExpression` changes. + * + * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#methods_$digest + * $digest()} and should return the value that will be watched. (Since + * {@link ng.$rootScope.Scope#methods_$digest $digest()} reruns when it detects changes the + * `watchExpression` can execute multiple times per + * {@link ng.$rootScope.Scope#methods_$digest $digest()} and should be idempotent.) + * - The `listener` is called only when the value from the current `watchExpression` and the + * previous call to `watchExpression` are not equal (with the exception of the initial run, + * see below). The inequality is determined according to + * {@link angular.equals} function. To save the value of the object for later comparison, + * the {@link angular.copy} function is used. It also means that watching complex options + * will have adverse memory and performance implications. + * - The watch `listener` may change the model, which may trigger other `listener`s to fire. + * This is achieved by rerunning the watchers until no changes are detected. The rerun + * iteration limit is 10 to prevent an infinite loop deadlock. + * + * + * If you want to be notified whenever {@link ng.$rootScope.Scope#methods_$digest $digest} is called, + * you can register a `watchExpression` function with no `listener`. (Since `watchExpression` + * can execute multiple times per {@link ng.$rootScope.Scope#methods_$digest $digest} cycle when a + * change is detected, be prepared for multiple calls to your listener.) + * + * After a watcher is registered with the scope, the `listener` fn is called asynchronously + * (via {@link ng.$rootScope.Scope#methods_$evalAsync $evalAsync}) to initialize the + * watcher. In rare cases, this is undesirable because the listener is called when the result + * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you + * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the + * listener was called due to initialization. + * + * The example below contains an illustration of using a function as your $watch listener + * + * + * # Example + *
                  +           // let's assume that scope was dependency injected as the $rootScope
                  +           var scope = $rootScope;
                  +           scope.name = 'misko';
                  +           scope.counter = 0;
                  +
                  +           expect(scope.counter).toEqual(0);
                  +           scope.$watch('name', function(newValue, oldValue) {
                  +             scope.counter = scope.counter + 1;
                  +           });
                  +           expect(scope.counter).toEqual(0);
                  +
                  +           scope.$digest();
                  +           // no variable change
                  +           expect(scope.counter).toEqual(0);
                  +
                  +           scope.name = 'adam';
                  +           scope.$digest();
                  +           expect(scope.counter).toEqual(1);
                  +
                  +
                  +
                  +           // Using a listener function
                  +           var food;
                  +           scope.foodCounter = 0;
                  +           expect(scope.foodCounter).toEqual(0);
                  +           scope.$watch(
                  +             // This is the listener function
                  +             function() { return food; },
                  +             // This is the change handler
                  +             function(newValue, oldValue) {
                  +               if ( newValue !== oldValue ) {
                  +                 // Only increment the counter if the value changed
                  +                 scope.foodCounter = scope.foodCounter + 1;
                  +               }
                  +             }
                  +           );
                  +           // No digest has been run so the counter will be zero
                  +           expect(scope.foodCounter).toEqual(0);
                  +
                  +           // Run the digest but since food has not changed count will still be zero
                  +           scope.$digest();
                  +           expect(scope.foodCounter).toEqual(0);
                  +
                  +           // Update food and run digest.  Now the counter will increment
                  +           food = 'cheeseburger';
                  +           scope.$digest();
                  +           expect(scope.foodCounter).toEqual(1);
                  +
                  +       * 
                  + * + * + * + * @param {(function()|string)} watchExpression Expression that is evaluated on each + * {@link ng.$rootScope.Scope#methods_$digest $digest} cycle. A change in the return value triggers + * a call to the `listener`. + * + * - `string`: Evaluated as {@link guide/expression expression} + * - `function(scope)`: called with current `scope` as a parameter. + * @param {(function()|string)=} listener Callback called whenever the return value of + * the `watchExpression` changes. + * + * - `string`: Evaluated as {@link guide/expression expression} + * - `function(newValue, oldValue, scope)`: called with current and previous values as + * parameters. + * + * @param {boolean=} objectEquality Compare object for equality rather than for reference. + * @returns {function()} Returns a deregistration function for this listener. + */ + $watch: function(watchExp, listener, objectEquality) { + var scope = this, + get = compileToFn(watchExp, 'watch'), + array = scope.$$watchers, + watcher = { + fn: listener, + last: initWatchVal, + get: get, + exp: watchExp, + eq: !!objectEquality + }; + + lastDirtyWatch = null; + + // in the case user pass string, we need to compile it, do we really need this ? + if (!isFunction(listener)) { + var listenFn = compileToFn(listener || noop, 'listener'); + watcher.fn = function(newVal, oldVal, scope) {listenFn(scope);}; + } + + if (typeof watchExp == 'string' && get.constant) { + var originalFn = watcher.fn; + watcher.fn = function(newVal, oldVal, scope) { + originalFn.call(this, newVal, oldVal, scope); + arrayRemove(array, watcher); + }; + } + + if (!array) { + array = scope.$$watchers = []; + } + // we use unshift since we use a while loop in $digest for speed. + // the while loop reads in reverse order. + array.unshift(watcher); + + return function() { + arrayRemove(array, watcher); + lastDirtyWatch = null; + }; + }, + + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$watchCollection + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Shallow watches the properties of an object and fires whenever any of the properties change + * (for arrays, this implies watching the array items; for object maps, this implies watching + * the properties). If a change is detected, the `listener` callback is fired. + * + * - The `obj` collection is observed via standard $watch operation and is examined on every + * call to $digest() to see if any items have been added, removed, or moved. + * - The `listener` is called whenever anything within the `obj` has changed. Examples include + * adding, removing, and moving items belonging to an object or array. + * + * + * # Example + *
                  +          $scope.names = ['igor', 'matias', 'misko', 'james'];
                  +          $scope.dataCount = 4;
                  +
                  +          $scope.$watchCollection('names', function(newNames, oldNames) {
                  +            $scope.dataCount = newNames.length;
                  +          });
                  +
                  +          expect($scope.dataCount).toEqual(4);
                  +          $scope.$digest();
                  +
                  +          //still at 4 ... no changes
                  +          expect($scope.dataCount).toEqual(4);
                  +
                  +          $scope.names.pop();
                  +          $scope.$digest();
                  +
                  +          //now there's been a change
                  +          expect($scope.dataCount).toEqual(3);
                  +       * 
                  + * + * + * @param {string|Function(scope)} obj Evaluated as {@link guide/expression expression}. The + * expression value should evaluate to an object or an array which is observed on each + * {@link ng.$rootScope.Scope#methods_$digest $digest} cycle. Any shallow change within the + * collection will trigger a call to the `listener`. + * + * @param {function(newCollection, oldCollection, scope)} listener a callback function that is + * fired with both the `newCollection` and `oldCollection` as parameters. + * The `newCollection` object is the newly modified data obtained from the `obj` expression + * and the `oldCollection` object is a copy of the former collection data. + * The `scope` refers to the current scope. + * + * @returns {function()} Returns a de-registration function for this listener. When the + * de-registration function is executed, the internal watch operation is terminated. + */ + $watchCollection: function(obj, listener) { + var self = this; + var oldValue; + var newValue; + var changeDetected = 0; + var objGetter = $parse(obj); + var internalArray = []; + var internalObject = {}; + var oldLength = 0; + + function $watchCollectionWatch() { + newValue = objGetter(self); + var newLength, key; + + if (!isObject(newValue)) { + if (oldValue !== newValue) { + oldValue = newValue; + changeDetected++; + } + } else if (isArrayLike(newValue)) { + if (oldValue !== internalArray) { + // we are transitioning from something which was not an array into array. + oldValue = internalArray; + oldLength = oldValue.length = 0; + changeDetected++; + } + + newLength = newValue.length; + + if (oldLength !== newLength) { + // if lengths do not match we need to trigger change notification + changeDetected++; + oldValue.length = oldLength = newLength; + } + // copy the items to oldValue and look for changes. + for (var i = 0; i < newLength; i++) { + if (oldValue[i] !== newValue[i]) { + changeDetected++; + oldValue[i] = newValue[i]; + } + } + } else { + if (oldValue !== internalObject) { + // we are transitioning from something which was not an object into object. + oldValue = internalObject = {}; + oldLength = 0; + changeDetected++; + } + // copy the items to oldValue and look for changes. + newLength = 0; + for (key in newValue) { + if (newValue.hasOwnProperty(key)) { + newLength++; + if (oldValue.hasOwnProperty(key)) { + if (oldValue[key] !== newValue[key]) { + changeDetected++; + oldValue[key] = newValue[key]; + } + } else { + oldLength++; + oldValue[key] = newValue[key]; + changeDetected++; + } + } + } + if (oldLength > newLength) { + // we used to have more keys, need to find them and destroy them. + changeDetected++; + for(key in oldValue) { + if (oldValue.hasOwnProperty(key) && !newValue.hasOwnProperty(key)) { + oldLength--; + delete oldValue[key]; + } + } + } + } + return changeDetected; + } + + function $watchCollectionAction() { + listener(newValue, oldValue, self); + } + + return this.$watch($watchCollectionWatch, $watchCollectionAction); + }, + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$digest + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Processes all of the {@link ng.$rootScope.Scope#methods_$watch watchers} of the current scope and + * its children. Because a {@link ng.$rootScope.Scope#methods_$watch watcher}'s listener can change + * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#methods_$watch watchers} + * until no more listeners are firing. This means that it is possible to get into an infinite + * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of + * iterations exceeds 10. + * + * Usually, you don't call `$digest()` directly in + * {@link ng.directive:ngController controllers} or in + * {@link ng.$compileProvider#methods_directive directives}. + * Instead, you should call {@link ng.$rootScope.Scope#methods_$apply $apply()} (typically from within + * a {@link ng.$compileProvider#methods_directive directives}), which will force a `$digest()`. + * + * If you want to be notified whenever `$digest()` is called, + * you can register a `watchExpression` function with + * {@link ng.$rootScope.Scope#methods_$watch $watch()} with no `listener`. + * + * In unit tests, you may need to call `$digest()` to simulate the scope life cycle. + * + * # Example + *
                  +           var scope = ...;
                  +           scope.name = 'misko';
                  +           scope.counter = 0;
                  +
                  +           expect(scope.counter).toEqual(0);
                  +           scope.$watch('name', function(newValue, oldValue) {
                  +             scope.counter = scope.counter + 1;
                  +           });
                  +           expect(scope.counter).toEqual(0);
                  +
                  +           scope.$digest();
                  +           // no variable change
                  +           expect(scope.counter).toEqual(0);
                  +
                  +           scope.name = 'adam';
                  +           scope.$digest();
                  +           expect(scope.counter).toEqual(1);
                  +       * 
                  + * + */ + $digest: function() { + var watch, value, last, + watchers, + asyncQueue = this.$$asyncQueue, + postDigestQueue = this.$$postDigestQueue, + length, + dirty, ttl = TTL, + next, current, target = this, + watchLog = [], + logIdx, logMsg, asyncTask; + + beginPhase('$digest'); + + lastDirtyWatch = null; + + do { // "while dirty" loop + dirty = false; + current = target; + + while(asyncQueue.length) { + try { + asyncTask = asyncQueue.shift(); + asyncTask.scope.$eval(asyncTask.expression); + } catch (e) { + clearPhase(); + $exceptionHandler(e); + } + lastDirtyWatch = null; + } + + traverseScopesLoop: + do { // "traverse the scopes" loop + if ((watchers = current.$$watchers)) { + // process our watches + length = watchers.length; + while (length--) { + try { + watch = watchers[length]; + // Most common watches are on primitives, in which case we can short + // circuit it with === operator, only when === fails do we use .equals + if (watch) { + if ((value = watch.get(current)) !== (last = watch.last) && + !(watch.eq + ? equals(value, last) + : (typeof value == 'number' && typeof last == 'number' + && isNaN(value) && isNaN(last)))) { + dirty = true; + lastDirtyWatch = watch; + watch.last = watch.eq ? copy(value) : value; + watch.fn(value, ((last === initWatchVal) ? value : last), current); + if (ttl < 5) { + logIdx = 4 - ttl; + if (!watchLog[logIdx]) watchLog[logIdx] = []; + logMsg = (isFunction(watch.exp)) + ? 'fn: ' + (watch.exp.name || watch.exp.toString()) + : watch.exp; + logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last); + watchLog[logIdx].push(logMsg); + } + } else if (watch === lastDirtyWatch) { + // If the most recently dirty watcher is now clean, short circuit since the remaining watchers + // have already been tested. + dirty = false; + break traverseScopesLoop; + } + } + } catch (e) { + clearPhase(); + $exceptionHandler(e); + } + } + } + + // Insanity Warning: scope depth-first traversal + // yes, this code is a bit crazy, but it works and we have tests to prove it! + // this piece should be kept in sync with the traversal in $broadcast + if (!(next = (current.$$childHead || + (current !== target && current.$$nextSibling)))) { + while(current !== target && !(next = current.$$nextSibling)) { + current = current.$parent; + } + } + } while ((current = next)); + + // `break traverseScopesLoop;` takes us to here + + if((dirty || asyncQueue.length) && !(ttl--)) { + clearPhase(); + throw $rootScopeMinErr('infdig', + '{0} $digest() iterations reached. Aborting!\n' + + 'Watchers fired in the last 5 iterations: {1}', + TTL, toJson(watchLog)); + } + + } while (dirty || asyncQueue.length); + + clearPhase(); + + while(postDigestQueue.length) { + try { + postDigestQueue.shift()(); + } catch (e) { + $exceptionHandler(e); + } + } + }, + + + /** + * @ngdoc event + * @name ng.$rootScope.Scope#$destroy + * @eventOf ng.$rootScope.Scope + * @eventType broadcast on scope being destroyed + * + * @description + * Broadcasted when a scope and its children are being destroyed. + * + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to + * clean up DOM bindings before an element is removed from the DOM. + */ + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$destroy + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Removes the current scope (and all of its children) from the parent scope. Removal implies + * that calls to {@link ng.$rootScope.Scope#methods_$digest $digest()} will no longer + * propagate to the current scope and its children. Removal also implies that the current + * scope is eligible for garbage collection. + * + * The `$destroy()` is usually used by directives such as + * {@link ng.directive:ngRepeat ngRepeat} for managing the + * unrolling of the loop. + * + * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope. + * Application code can register a `$destroy` event handler that will give it a chance to + * perform any necessary cleanup. + * + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to + * clean up DOM bindings before an element is removed from the DOM. + */ + $destroy: function() { + // we can't destroy the root scope or a scope that has been already destroyed + if (this.$$destroyed) return; + var parent = this.$parent; + + this.$broadcast('$destroy'); + this.$$destroyed = true; + if (this === $rootScope) return; + + forEach(this.$$listenerCount, bind(null, decrementListenerCount, this)); + + if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; + if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; + if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; + if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; + + // This is bogus code that works around Chrome's GC leak + // see: https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 + this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = + this.$$childTail = null; + }, + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$eval + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Executes the `expression` on the current scope and returns the result. Any exceptions in + * the expression are propagated (uncaught). This is useful when evaluating Angular + * expressions. + * + * # Example + *
                  +           var scope = ng.$rootScope.Scope();
                  +           scope.a = 1;
                  +           scope.b = 2;
                  +
                  +           expect(scope.$eval('a+b')).toEqual(3);
                  +           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);
                  +       * 
                  + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + * @param {(object)=} locals Local variables object, useful for overriding values in scope. + * @returns {*} The result of evaluating the expression. + */ + $eval: function(expr, locals) { + return $parse(expr)(this, locals); + }, + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$evalAsync + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Executes the expression on the current scope at a later point in time. + * + * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only + * that: + * + * - it will execute after the function that scheduled the evaluation (preferably before DOM + * rendering). + * - at least one {@link ng.$rootScope.Scope#methods_$digest $digest cycle} will be performed after + * `expression` execution. + * + * Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle + * will be scheduled. However, it is encouraged to always call code that changes the model + * from within an `$apply` call. That includes code evaluated via `$evalAsync`. + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + */ + $evalAsync: function(expr) { + // if we are outside of an $digest loop and this is the first time we are scheduling async + // task also schedule async auto-flush + if (!$rootScope.$$phase && !$rootScope.$$asyncQueue.length) { + $browser.defer(function() { + if ($rootScope.$$asyncQueue.length) { + $rootScope.$digest(); + } + }); + } + + this.$$asyncQueue.push({scope: this, expression: expr}); + }, + + $$postDigest : function(fn) { + this.$$postDigestQueue.push(fn); + }, + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$apply + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * `$apply()` is used to execute an expression in angular from outside of the angular + * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries). + * Because we are calling into the angular framework we need to perform proper scope life + * cycle of {@link ng.$exceptionHandler exception handling}, + * {@link ng.$rootScope.Scope#methods_$digest executing watches}. + * + * ## Life cycle + * + * # Pseudo-Code of `$apply()` + *
                  +           function $apply(expr) {
                  +             try {
                  +               return $eval(expr);
                  +             } catch (e) {
                  +               $exceptionHandler(e);
                  +             } finally {
                  +               $root.$digest();
                  +             }
                  +           }
                  +       * 
                  + * + * + * Scope's `$apply()` method transitions through the following stages: + * + * 1. The {@link guide/expression expression} is executed using the + * {@link ng.$rootScope.Scope#methods_$eval $eval()} method. + * 2. Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * 3. The {@link ng.$rootScope.Scope#methods_$watch watch} listeners are fired immediately after the + * expression was executed using the {@link ng.$rootScope.Scope#methods_$digest $digest()} method. + * + * + * @param {(string|function())=} exp An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with current `scope` parameter. + * + * @returns {*} The result of evaluating the expression. + */ + $apply: function(expr) { + try { + beginPhase('$apply'); + return this.$eval(expr); + } catch (e) { + $exceptionHandler(e); + } finally { + clearPhase(); + try { + $rootScope.$digest(); + } catch (e) { + $exceptionHandler(e); + throw e; + } + } + }, + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$on + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Listens on events of a given type. See {@link ng.$rootScope.Scope#methods_$emit $emit} for + * discussion of event life cycle. + * + * The event listener function format is: `function(event, args...)`. The `event` object + * passed into the listener has the following attributes: + * + * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or + * `$broadcast`-ed. + * - `currentScope` - `{Scope}`: the current scope which is handling the event. + * - `name` - `{string}`: name of the event. + * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel + * further event propagation (available only for events that were `$emit`-ed). + * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag + * to true. + * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called. + * + * @param {string} name Event name to listen on. + * @param {function(event, args...)} listener Function to call when the event is emitted. + * @returns {function()} Returns a deregistration function for this listener. + */ + $on: function(name, listener) { + var namedListeners = this.$$listeners[name]; + if (!namedListeners) { + this.$$listeners[name] = namedListeners = []; + } + namedListeners.push(listener); + + var current = this; + do { + if (!current.$$listenerCount[name]) { + current.$$listenerCount[name] = 0; + } + current.$$listenerCount[name]++; + } while ((current = current.$parent)); + + var self = this; + return function() { + namedListeners[indexOf(namedListeners, listener)] = null; + decrementListenerCount(self, 1, name); + }; + }, + + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$emit + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Dispatches an event `name` upwards through the scope hierarchy notifying the + * registered {@link ng.$rootScope.Scope#methods_$on} listeners. + * + * The event life cycle starts at the scope on which `$emit` was called. All + * {@link ng.$rootScope.Scope#methods_$on listeners} listening for `name` event on this scope get + * notified. Afterwards, the event traverses upwards toward the root scope and calls all + * registered listeners along the way. The event will stop propagating if one of the listeners + * cancels it. + * + * Any exception emitted from the {@link ng.$rootScope.Scope#methods_$on listeners} will be passed + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {string} name Event name to emit. + * @param {...*} args Optional set of arguments which will be passed onto the event listeners. + * @return {Object} Event object (see {@link ng.$rootScope.Scope#methods_$on}). + */ + $emit: function(name, args) { + var empty = [], + namedListeners, + scope = this, + stopPropagation = false, + event = { + name: name, + targetScope: scope, + stopPropagation: function() {stopPropagation = true;}, + preventDefault: function() { + event.defaultPrevented = true; + }, + defaultPrevented: false + }, + listenerArgs = concat([event], arguments, 1), + i, length; + + do { + namedListeners = scope.$$listeners[name] || empty; + event.currentScope = scope; + for (i=0, length=namedListeners.length; i= 8 ) { + normalizedVal = urlResolve(uri).href; + if (normalizedVal !== '' && !normalizedVal.match(regex)) { + return 'unsafe:'+normalizedVal; + } + } + return uri; + }; + }; +} + +var $sceMinErr = minErr('$sce'); + +var SCE_CONTEXTS = { + HTML: 'html', + CSS: 'css', + URL: 'url', + // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a + // url. (e.g. ng-include, script src, templateUrl) + RESOURCE_URL: 'resourceUrl', + JS: 'js' +}; + +// Helper functions follow. + +// Copied from: +// http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962 +// Prereq: s is a string. +function escapeForRegexp(s) { + return s.replace(/([-()\[\]{}+?*.$\^|,:# -1) { + throw $sceMinErr('iwcard', + 'Illegal sequence *** in string matcher. String: {0}', matcher); + } + matcher = escapeForRegexp(matcher). + replace('\\*\\*', '.*'). + replace('\\*', '[^:/.?&;]*'); + return new RegExp('^' + matcher + '$'); + } else if (isRegExp(matcher)) { + // The only other type of matcher allowed is a Regexp. + // Match entire URL / disallow partial matches. + // Flags are reset (i.e. no global, ignoreCase or multiline) + return new RegExp('^' + matcher.source + '$'); + } else { + throw $sceMinErr('imatcher', + 'Matchers may only be "self", string patterns or RegExp objects'); + } +} + + +function adjustMatchers(matchers) { + var adjustedMatchers = []; + if (isDefined(matchers)) { + forEach(matchers, function(matcher) { + adjustedMatchers.push(adjustMatcher(matcher)); + }); + } + return adjustedMatchers; +} + + +/** + * @ngdoc service + * @name ng.$sceDelegate + * @function + * + * @description + * + * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict + * Contextual Escaping (SCE)} services to AngularJS. + * + * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of + * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS. This is + * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to + * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things + * work because `$sce` delegates to `$sceDelegate` for these operations. + * + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service. + * + * The default instance of `$sceDelegate` should work out of the box with little pain. While you + * can override it completely to change the behavior of `$sce`, the common case would + * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting + * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as + * templates. Refer {@link ng.$sceDelegateProvider#methods_resourceUrlWhitelist + * $sceDelegateProvider.resourceUrlWhitelist} and {@link + * ng.$sceDelegateProvider#methods_resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} + */ + +/** + * @ngdoc object + * @name ng.$sceDelegateProvider + * @description + * + * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate + * $sceDelegate} service. This allows one to get/set the whitelists and blacklists used to ensure + * that the URLs used for sourcing Angular templates are safe. Refer {@link + * ng.$sceDelegateProvider#methods_resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and + * {@link ng.$sceDelegateProvider#methods_resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} + * + * For the general details about this service in Angular, read the main page for {@link ng.$sce + * Strict Contextual Escaping (SCE)}. + * + * **Example**: Consider the following case. + * + * - your app is hosted at url `http://myapp.example.com/` + * - but some of your templates are hosted on other domains you control such as + * `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc. + * - and you have an open redirect at `http://myapp.example.com/clickThru?...`. + * + * Here is what a secure configuration for this scenario might look like: + * + *
                  + *    angular.module('myApp', []).config(function($sceDelegateProvider) {
                  + *      $sceDelegateProvider.resourceUrlWhitelist([
                  + *        // Allow same origin resource loads.
                  + *        'self',
                  + *        // Allow loading from our assets domain.  Notice the difference between * and **.
                  + *        'http://srv*.assets.example.com/**']);
                  + *
                  + *      // The blacklist overrides the whitelist so the open redirect here is blocked.
                  + *      $sceDelegateProvider.resourceUrlBlacklist([
                  + *        'http://myapp.example.com/clickThru**']);
                  + *      });
                  + * 
                  + */ + +function $SceDelegateProvider() { + this.SCE_CONTEXTS = SCE_CONTEXTS; + + // Resource URLs can also be trusted by policy. + var resourceUrlWhitelist = ['self'], + resourceUrlBlacklist = []; + + /** + * @ngdoc function + * @name ng.sceDelegateProvider#resourceUrlWhitelist + * @methodOf ng.$sceDelegateProvider + * @function + * + * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value + * provided. This must be an array or null. A snapshot of this array is used so further + * changes to the array are ignored. + * + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items + * allowed in this array. + * + * Note: **an empty whitelist array will block all URLs**! + * + * @return {Array} the currently set whitelist array. + * + * The **default value** when no whitelist has been explicitly set is `['self']` allowing only + * same origin resource requests. + * + * @description + * Sets/Gets the whitelist of trusted resource URLs. + */ + this.resourceUrlWhitelist = function (value) { + if (arguments.length) { + resourceUrlWhitelist = adjustMatchers(value); + } + return resourceUrlWhitelist; + }; + + /** + * @ngdoc function + * @name ng.sceDelegateProvider#resourceUrlBlacklist + * @methodOf ng.$sceDelegateProvider + * @function + * + * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value + * provided. This must be an array or null. A snapshot of this array is used so further + * changes to the array are ignored. + * + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items + * allowed in this array. + * + * The typical usage for the blacklist is to **block + * [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as + * these would otherwise be trusted but actually return content from the redirected domain. + * + * Finally, **the blacklist overrides the whitelist** and has the final say. + * + * @return {Array} the currently set blacklist array. + * + * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there + * is no blacklist.) + * + * @description + * Sets/Gets the blacklist of trusted resource URLs. + */ + + this.resourceUrlBlacklist = function (value) { + if (arguments.length) { + resourceUrlBlacklist = adjustMatchers(value); + } + return resourceUrlBlacklist; + }; + + this.$get = ['$injector', function($injector) { + + var htmlSanitizer = function htmlSanitizer(html) { + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); + }; + + if ($injector.has('$sanitize')) { + htmlSanitizer = $injector.get('$sanitize'); + } + + + function matchUrl(matcher, parsedUrl) { + if (matcher === 'self') { + return urlIsSameOrigin(parsedUrl); + } else { + // definitely a regex. See adjustMatchers() + return !!matcher.exec(parsedUrl.href); + } + } + + function isResourceUrlAllowedByPolicy(url) { + var parsedUrl = urlResolve(url.toString()); + var i, n, allowed = false; + // Ensure that at least one item from the whitelist allows this url. + for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) { + if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) { + allowed = true; + break; + } + } + if (allowed) { + // Ensure that no item from the blacklist blocked this url. + for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) { + if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) { + allowed = false; + break; + } + } + } + return allowed; + } + + function generateHolderType(Base) { + var holderType = function TrustedValueHolderType(trustedValue) { + this.$$unwrapTrustedValue = function() { + return trustedValue; + }; + }; + if (Base) { + holderType.prototype = new Base(); + } + holderType.prototype.valueOf = function sceValueOf() { + return this.$$unwrapTrustedValue(); + }; + holderType.prototype.toString = function sceToString() { + return this.$$unwrapTrustedValue().toString(); + }; + return holderType; + } + + var trustedValueHolderBase = generateHolderType(), + byType = {}; + + byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]); + + /** + * @ngdoc method + * @name ng.$sceDelegate#trustAs + * @methodOf ng.$sceDelegate + * + * @description + * Returns an object that is trusted by angular for use in specified strict + * contextual escaping contexts (such as ng-html-bind-unsafe, ng-include, any src + * attribute interpolation, any dom event binding attribute interpolation + * such as for onclick, etc.) that uses the provided value. + * See {@link ng.$sce $sce} for enabling strict contextual escaping. + * + * @param {string} type The kind of context in which this value is safe for use. e.g. url, + * resourceUrl, html, js and css. + * @param {*} value The value that that should be considered trusted/safe. + * @returns {*} A value that can be used to stand in for the provided `value` in places + * where Angular expects a $sce.trustAs() return value. + */ + function trustAs(type, trustedValue) { + var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null); + if (!Constructor) { + throw $sceMinErr('icontext', + 'Attempted to trust a value in invalid context. Context: {0}; Value: {1}', + type, trustedValue); + } + if (trustedValue === null || trustedValue === undefined || trustedValue === '') { + return trustedValue; + } + // All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting + // mutable objects, we ensure here that the value passed in is actually a string. + if (typeof trustedValue !== 'string') { + throw $sceMinErr('itype', + 'Attempted to trust a non-string value in a content requiring a string: Context: {0}', + type); + } + return new Constructor(trustedValue); + } + + /** + * @ngdoc method + * @name ng.$sceDelegate#valueOf + * @methodOf ng.$sceDelegate + * + * @description + * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#methods_trustAs + * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link + * ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs`}. + * + * If the passed parameter is not a value that had been returned by {@link + * ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs`}, returns it as-is. + * + * @param {*} value The result of a prior {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs`} + * call or anything else. + * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#methods_trustAs + * `$sceDelegate.trustAs`} if `value` is the result of such a call. Otherwise, returns + * `value` unchanged. + */ + function valueOf(maybeTrusted) { + if (maybeTrusted instanceof trustedValueHolderBase) { + return maybeTrusted.$$unwrapTrustedValue(); + } else { + return maybeTrusted; + } + } + + /** + * @ngdoc method + * @name ng.$sceDelegate#getTrusted + * @methodOf ng.$sceDelegate + * + * @description + * Takes the result of a {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs`} call and + * returns the originally supplied value if the queried context type is a supertype of the + * created type. If this condition isn't satisfied, throws an exception. + * + * @param {string} type The kind of context in which this value is to be used. + * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#methods_trustAs + * `$sceDelegate.trustAs`} call. + * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#methods_trustAs + * `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception. + */ + function getTrusted(type, maybeTrusted) { + if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') { + return maybeTrusted; + } + var constructor = (byType.hasOwnProperty(type) ? byType[type] : null); + if (constructor && maybeTrusted instanceof constructor) { + return maybeTrusted.$$unwrapTrustedValue(); + } + // If we get here, then we may only take one of two actions. + // 1. sanitize the value for the requested type, or + // 2. throw an exception. + if (type === SCE_CONTEXTS.RESOURCE_URL) { + if (isResourceUrlAllowedByPolicy(maybeTrusted)) { + return maybeTrusted; + } else { + throw $sceMinErr('insecurl', + 'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}', + maybeTrusted.toString()); + } + } else if (type === SCE_CONTEXTS.HTML) { + return htmlSanitizer(maybeTrusted); + } + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); + } + + return { trustAs: trustAs, + getTrusted: getTrusted, + valueOf: valueOf }; + }]; +} + + +/** + * @ngdoc object + * @name ng.$sceProvider + * @description + * + * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service. + * - enable/disable Strict Contextual Escaping (SCE) in a module + * - override the default implementation with a custom delegate + * + * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}. + */ + +/* jshint maxlen: false*/ + +/** + * @ngdoc service + * @name ng.$sce + * @function + * + * @description + * + * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS. + * + * # Strict Contextual Escaping + * + * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain + * contexts to result in a value that is marked as safe to use for that context. One example of + * such a context is binding arbitrary html controlled by the user via `ng-bind-html`. We refer + * to these contexts as privileged or SCE contexts. + * + * As of version 1.2, Angular ships with SCE enabled by default. + * + * Note: When enabled (the default), IE8 in quirks mode is not supported. In this mode, IE8 allows + * one to execute arbitrary javascript by the use of the expression() syntax. Refer + * to learn more about them. + * You can ensure your document is in standards mode and not quirks mode by adding `` + * to the top of your HTML document. + * + * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for + * security vulnerabilities such as XSS, clickjacking, etc. a lot easier. + * + * Here's an example of a binding in a privileged context: + * + *
                  + *     
                  + *     
                  + *
                  + * + * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE + * disabled, this application allows the user to render arbitrary HTML into the DIV. + * In a more realistic example, one may be rendering user comments, blog articles, etc. via + * bindings. (HTML is just one example of a context where rendering user controlled input creates + * security vulnerabilities.) + * + * For the case of HTML, you might use a library, either on the client side, or on the server side, + * to sanitize unsafe HTML before binding to the value and rendering it in the document. + * + * How would you ensure that every place that used these types of bindings was bound to a value that + * was sanitized by your library (or returned as safe for rendering by your server?) How can you + * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some + * properties/fields and forgot to update the binding to the sanitized value? + * + * To be secure by default, you want to ensure that any such bindings are disallowed unless you can + * determine that something explicitly says it's safe to use a value for binding in that + * context. You can then audit your code (a simple grep would do) to ensure that this is only done + * for those values that you can easily tell are safe - because they were received from your server, + * sanitized by your library, etc. You can organize your codebase to help with this - perhaps + * allowing only the files in a specific directory to do this. Ensuring that the internal API + * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task. + * + * In the case of AngularJS' SCE service, one uses {@link ng.$sce#methods_trustAs $sce.trustAs} + * (and shorthand methods such as {@link ng.$sce#methods_trustAsHtml $sce.trustAsHtml}, etc.) to + * obtain values that will be accepted by SCE / privileged contexts. + * + * + * ## How does it work? + * + * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#methods_getTrusted + * $sce.getTrusted(context, value)} rather than to the value directly. Directives use {@link + * ng.$sce#methods_parse $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the + * {@link ng.$sce#methods_getTrusted $sce.getTrusted} behind the scenes on non-constant literals. + * + * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link + * ng.$sce#methods_parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly + * simplified): + * + *
                  + *   var ngBindHtmlDirective = ['$sce', function($sce) {
                  + *     return function(scope, element, attr) {
                  + *       scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {
                  + *         element.html(value || '');
                  + *       });
                  + *     };
                  + *   }];
                  + * 
                  + * + * ## Impact on loading templates + * + * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as + * `templateUrl`'s specified by {@link guide/directive directives}. + * + * By default, Angular only loads templates from the same domain and protocol as the application + * document. This is done by calling {@link ng.$sce#methods_getTrustedResourceUrl + * $sce.getTrustedResourceUrl} on the template URL. To load templates from other domains and/or + * protocols, you may either either {@link ng.$sceDelegateProvider#methods_resourceUrlWhitelist whitelist + * them} or {@link ng.$sce#methods_trustAsResourceUrl wrap it} into a trusted value. + * + * *Please note*: + * The browser's + * {@link https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest + * Same Origin Policy} and {@link http://www.w3.org/TR/cors/ Cross-Origin Resource Sharing (CORS)} + * policy apply in addition to this and may further restrict whether the template is successfully + * loaded. This means that without the right CORS policy, loading templates from a different domain + * won't work on all browsers. Also, loading templates from `file://` URL does not work on some + * browsers. + * + * ## This feels like too much overhead for the developer? + * + * It's important to remember that SCE only applies to interpolation expressions. + * + * If your expressions are constant literals, they're automatically trusted and you don't need to + * call `$sce.trustAs` on them. (e.g. + * `
                  `) just works. + * + * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them + * through {@link ng.$sce#methods_getTrusted $sce.getTrusted}. SCE doesn't play a role here. + * + * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load + * templates in `ng-include` from your application's domain without having to even know about SCE. + * It blocks loading templates from other domains or loading templates over http from an https + * served document. You can change these by setting your own custom {@link + * ng.$sceDelegateProvider#methods_resourceUrlWhitelist whitelists} and {@link + * ng.$sceDelegateProvider#methods_resourceUrlBlacklist blacklists} for matching such URLs. + * + * This significantly reduces the overhead. It is far easier to pay the small overhead and have an + * application that's secure and can be audited to verify that with much more ease than bolting + * security onto an application later. + * + * + * ## What trusted context types are supported? + * + * | Context | Notes | + * |---------------------|----------------| + * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. | + * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | + * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`
                  Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | + * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | + * + * ## Format of items in {@link ng.$sceDelegateProvider#methods_resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#methods_resourceUrlBlacklist Blacklist}
                  + * + * Each element in these arrays must be one of the following: + * + * - **'self'** + * - The special **string**, `'self'`, can be used to match against all URLs of the **same + * domain** as the application document using the **same protocol**. + * - **String** (except the special value `'self'`) + * - The string is matched against the full *normalized / absolute URL* of the resource + * being tested (substring matches are not good enough.) + * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters + * match themselves. + * - `*`: matches zero or more occurances of any character other than one of the following 6 + * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'. It's a useful wildcard for use + * in a whitelist. + * - `**`: matches zero or more occurances of *any* character. As such, it's not + * not appropriate to use in for a scheme, domain, etc. as it would match too much. (e.g. + * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might + * not have been the intention.) It's usage at the very end of the path is ok. (e.g. + * http://foo.example.com/templates/**). + * - **RegExp** (*see caveat below*) + * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax + * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to + * accidentally introduce a bug when one updates a complex expression (imho, all regexes should + * have good test coverage.). For instance, the use of `.` in the regex is correct only in a + * small number of cases. A `.` character in the regex used when matching the scheme or a + * subdomain could be matched against a `:` or literal `.` that was likely not intended. It + * is highly recommended to use the string patterns and only fall back to regular expressions + * if they as a last resort. + * - The regular expression must be an instance of RegExp (i.e. not a string.) It is + * matched against the **entire** *normalized / absolute URL* of the resource being tested + * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags + * present on the RegExp (such as multiline, global, ignoreCase) are ignored. + * - If you are generating your Javascript from some other templating engine (not + * recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)), + * remember to escape your regular expression (and be aware that you might need more than + * one level of escaping depending on your templating engine and the way you interpolated + * the value.) Do make use of your platform's escaping mechanism as it might be good + * enough before coding your own. e.g. Ruby has + * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape) + * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape). + * Javascript lacks a similar built in function for escaping. Take a look at Google + * Closure library's [goog.string.regExpEscape(s)]( + * http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962). + * + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example. + * + * ## Show me an example using SCE. + * + * @example + + +
                  +

                  + User comments
                  + By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when + $sanitize is available. If $sanitize isn't available, this results in an error instead of an + exploit. +
                  +
                  + {{userComment.name}}: + +
                  +
                  +
                  +
                  +
                  + + + var mySceApp = angular.module('mySceApp', ['ngSanitize']); + + mySceApp.controller("myAppController", function myAppController($http, $templateCache, $sce) { + var self = this; + $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) { + self.userComments = userComments; + }); + self.explicitlyTrustedHtml = $sce.trustAsHtml( + 'Hover over this text.'); + }); + + + +[ + { "name": "Alice", + "htmlComment": + "Is anyone reading this?" + }, + { "name": "Bob", + "htmlComment": "Yes! Am I the only other one?" + } +] + + + + describe('SCE doc demo', function() { + it('should sanitize untrusted values', function() { + expect(element('.htmlComment').html()).toBe('Is anyone reading this?'); + }); + it('should NOT sanitize explicitly trusted values', function() { + expect(element('#explicitlyTrustedHtml').html()).toBe( + 'Hover over this text.'); + }); + }); + +
                  + * + * + * + * ## Can I disable SCE completely? + * + * Yes, you can. However, this is strongly discouraged. SCE gives you a lot of security benefits + * for little coding overhead. It will be much harder to take an SCE disabled application and + * either secure it on your own or enable SCE at a later stage. It might make sense to disable SCE + * for cases where you have a lot of existing code that was written before SCE was introduced and + * you're migrating them a module at a time. + * + * That said, here's how you can completely disable SCE: + * + *
                  + *   angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {
                  + *     // Completely disable SCE.  For demonstration purposes only!
                  + *     // Do not use in new projects.
                  + *     $sceProvider.enabled(false);
                  + *   });
                  + * 
                  + * + */ +/* jshint maxlen: 100 */ + +function $SceProvider() { + var enabled = true; + + /** + * @ngdoc function + * @name ng.sceProvider#enabled + * @methodOf ng.$sceProvider + * @function + * + * @param {boolean=} value If provided, then enables/disables SCE. + * @return {boolean} true if SCE is enabled, false otherwise. + * + * @description + * Enables/disables SCE and returns the current value. + */ + this.enabled = function (value) { + if (arguments.length) { + enabled = !!value; + } + return enabled; + }; + + + /* Design notes on the default implementation for SCE. + * + * The API contract for the SCE delegate + * ------------------------------------- + * The SCE delegate object must provide the following 3 methods: + * + * - trustAs(contextEnum, value) + * This method is used to tell the SCE service that the provided value is OK to use in the + * contexts specified by contextEnum. It must return an object that will be accepted by + * getTrusted() for a compatible contextEnum and return this value. + * + * - valueOf(value) + * For values that were not produced by trustAs(), return them as is. For values that were + * produced by trustAs(), return the corresponding input value to trustAs. Basically, if + * trustAs is wrapping the given values into some type, this operation unwraps it when given + * such a value. + * + * - getTrusted(contextEnum, value) + * This function should return the a value that is safe to use in the context specified by + * contextEnum or throw and exception otherwise. + * + * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be + * opaque or wrapped in some holder object. That happens to be an implementation detail. For + * instance, an implementation could maintain a registry of all trusted objects by context. In + * such a case, trustAs() would return the same object that was passed in. getTrusted() would + * return the same object passed in if it was found in the registry under a compatible context or + * throw an exception otherwise. An implementation might only wrap values some of the time based + * on some criteria. getTrusted() might return a value and not throw an exception for special + * constants or objects even if not wrapped. All such implementations fulfill this contract. + * + * + * A note on the inheritance model for SCE contexts + * ------------------------------------------------ + * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types. This + * is purely an implementation details. + * + * The contract is simply this: + * + * getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value) + * will also succeed. + * + * Inheritance happens to capture this in a natural way. In some future, we + * may not use inheritance anymore. That is OK because no code outside of + * sce.js and sceSpecs.js would need to be aware of this detail. + */ + + this.$get = ['$parse', '$sniffer', '$sceDelegate', function( + $parse, $sniffer, $sceDelegate) { + // Prereq: Ensure that we're not running in IE8 quirks mode. In that mode, IE allows + // the "expression(javascript expression)" syntax which is insecure. + if (enabled && $sniffer.msie && $sniffer.msieDocumentMode < 8) { + throw $sceMinErr('iequirks', + 'Strict Contextual Escaping does not support Internet Explorer version < 9 in quirks ' + + 'mode. You can fix this by adding the text to the top of your HTML ' + + 'document. See http://docs.angularjs.org/api/ng.$sce for more information.'); + } + + var sce = copy(SCE_CONTEXTS); + + /** + * @ngdoc function + * @name ng.sce#isEnabled + * @methodOf ng.$sce + * @function + * + * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you + * have to do it at module config time on {@link ng.$sceProvider $sceProvider}. + * + * @description + * Returns a boolean indicating if SCE is enabled. + */ + sce.isEnabled = function () { + return enabled; + }; + sce.trustAs = $sceDelegate.trustAs; + sce.getTrusted = $sceDelegate.getTrusted; + sce.valueOf = $sceDelegate.valueOf; + + if (!enabled) { + sce.trustAs = sce.getTrusted = function(type, value) { return value; }; + sce.valueOf = identity; + } + + /** + * @ngdoc method + * @name ng.$sce#parse + * @methodOf ng.$sce + * + * @description + * Converts Angular {@link guide/expression expression} into a function. This is like {@link + * ng.$parse $parse} and is identical when the expression is a literal constant. Otherwise, it + * wraps the expression in a call to {@link ng.$sce#methods_getTrusted $sce.getTrusted(*type*, + * *result*)} + * + * @param {string} type The kind of SCE context in which this result will be used. + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + sce.parseAs = function sceParseAs(type, expr) { + var parsed = $parse(expr); + if (parsed.literal && parsed.constant) { + return parsed; + } else { + return function sceParseAsTrusted(self, locals) { + return sce.getTrusted(type, parsed(self, locals)); + }; + } + }; + + /** + * @ngdoc method + * @name ng.$sce#trustAs + * @methodOf ng.$sce + * + * @description + * Delegates to {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs`}. As such, + * returns an objectthat is trusted by angular for use in specified strict contextual + * escaping contexts (such as ng-html-bind-unsafe, ng-include, any src attribute + * interpolation, any dom event binding attribute interpolation such as for onclick, etc.) + * that uses the provided value. See * {@link ng.$sce $sce} for enabling strict contextual + * escaping. + * + * @param {string} type The kind of context in which this value is safe for use. e.g. url, + * resource_url, html, js and css. + * @param {*} value The value that that should be considered trusted/safe. + * @returns {*} A value that can be used to stand in for the provided `value` in places + * where Angular expects a $sce.trustAs() return value. + */ + + /** + * @ngdoc method + * @name ng.$sce#trustAsHtml + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.trustAsHtml(value)` → + * {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs($sce.HTML, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#methods_getTrustedHtml + * $sce.getTrustedHtml(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#methods_trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name ng.$sce#trustAsUrl + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.trustAsUrl(value)` → + * {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs($sce.URL, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#methods_getTrustedUrl + * $sce.getTrustedUrl(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#methods_trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name ng.$sce#trustAsResourceUrl + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.trustAsResourceUrl(value)` → + * {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#methods_getTrustedResourceUrl + * $sce.getTrustedResourceUrl(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the return + * value of {@link ng.$sce#methods_trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name ng.$sce#trustAsJs + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.trustAsJs(value)` → + * {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs($sce.JS, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#methods_getTrustedJs + * $sce.getTrustedJs(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#methods_trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name ng.$sce#getTrusted + * @methodOf ng.$sce + * + * @description + * Delegates to {@link ng.$sceDelegate#methods_getTrusted `$sceDelegate.getTrusted`}. As such, + * takes the result of a {@link ng.$sce#methods_trustAs `$sce.trustAs`}() call and returns the + * originally supplied value if the queried context type is a supertype of the created type. + * If this condition isn't satisfied, throws an exception. + * + * @param {string} type The kind of context in which this value is to be used. + * @param {*} maybeTrusted The result of a prior {@link ng.$sce#methods_trustAs `$sce.trustAs`} + * call. + * @returns {*} The value the was originally provided to + * {@link ng.$sce#methods_trustAs `$sce.trustAs`} if valid in this context. + * Otherwise, throws an exception. + */ + + /** + * @ngdoc method + * @name ng.$sce#getTrustedHtml + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.getTrustedHtml(value)` → + * {@link ng.$sceDelegate#methods_getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)` + */ + + /** + * @ngdoc method + * @name ng.$sce#getTrustedCss + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.getTrustedCss(value)` → + * {@link ng.$sceDelegate#methods_getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)` + */ + + /** + * @ngdoc method + * @name ng.$sce#getTrustedUrl + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.getTrustedUrl(value)` → + * {@link ng.$sceDelegate#methods_getTrusted `$sceDelegate.getTrusted($sce.URL, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)` + */ + + /** + * @ngdoc method + * @name ng.$sce#getTrustedResourceUrl + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.getTrustedResourceUrl(value)` → + * {@link ng.$sceDelegate#methods_getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`} + * + * @param {*} value The value to pass to `$sceDelegate.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)` + */ + + /** + * @ngdoc method + * @name ng.$sce#getTrustedJs + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.getTrustedJs(value)` → + * {@link ng.$sceDelegate#methods_getTrusted `$sceDelegate.getTrusted($sce.JS, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)` + */ + + /** + * @ngdoc method + * @name ng.$sce#parseAsHtml + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.parseAsHtml(expression string)` → + * {@link ng.$sce#methods_parse `$sce.parseAs($sce.HTML, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name ng.$sce#parseAsCss + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.parseAsCss(value)` → + * {@link ng.$sce#methods_parse `$sce.parseAs($sce.CSS, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name ng.$sce#parseAsUrl + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.parseAsUrl(value)` → + * {@link ng.$sce#methods_parse `$sce.parseAs($sce.URL, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name ng.$sce#parseAsResourceUrl + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.parseAsResourceUrl(value)` → + * {@link ng.$sce#methods_parse `$sce.parseAs($sce.RESOURCE_URL, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name ng.$sce#parseAsJs + * @methodOf ng.$sce + * + * @description + * Shorthand method. `$sce.parseAsJs(value)` → + * {@link ng.$sce#methods_parse `$sce.parseAs($sce.JS, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + // Shorthand delegations. + var parse = sce.parseAs, + getTrusted = sce.getTrusted, + trustAs = sce.trustAs; + + forEach(SCE_CONTEXTS, function (enumValue, name) { + var lName = lowercase(name); + sce[camelCase("parse_as_" + lName)] = function (expr) { + return parse(enumValue, expr); + }; + sce[camelCase("get_trusted_" + lName)] = function (value) { + return getTrusted(enumValue, value); + }; + sce[camelCase("trust_as_" + lName)] = function (value) { + return trustAs(enumValue, value); + }; + }); + + return sce; + }]; +} + +/** + * !!! This is an undocumented "private" service !!! + * + * @name ng.$sniffer + * @requires $window + * @requires $document + * + * @property {boolean} history Does the browser support html5 history api ? + * @property {boolean} hashchange Does the browser support hashchange event ? + * @property {boolean} transitions Does the browser support CSS transition events ? + * @property {boolean} animations Does the browser support CSS animation events ? + * + * @description + * This is very simple implementation of testing browser's features. + */ +function $SnifferProvider() { + this.$get = ['$window', '$document', function($window, $document) { + var eventSupport = {}, + android = + int((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), + boxee = /Boxee/i.test(($window.navigator || {}).userAgent), + document = $document[0] || {}, + documentMode = document.documentMode, + vendorPrefix, + vendorRegex = /^(Moz|webkit|O|ms)(?=[A-Z])/, + bodyStyle = document.body && document.body.style, + transitions = false, + animations = false, + match; + + if (bodyStyle) { + for(var prop in bodyStyle) { + if(match = vendorRegex.exec(prop)) { + vendorPrefix = match[0]; + vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1); + break; + } + } + + if(!vendorPrefix) { + vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit'; + } + + transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle)); + animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle)); + + if (android && (!transitions||!animations)) { + transitions = isString(document.body.style.webkitTransition); + animations = isString(document.body.style.webkitAnimation); + } + } + + + return { + // Android has history.pushState, but it does not update location correctly + // so let's not use the history API at all. + // http://code.google.com/p/android/issues/detail?id=17471 + // https://github.com/angular/angular.js/issues/904 + + // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has + // so let's not use the history API also + // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined + // jshint -W018 + history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee), + // jshint +W018 + hashchange: 'onhashchange' in $window && + // IE8 compatible mode lies + (!documentMode || documentMode > 7), + hasEvent: function(event) { + // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have + // it. In particular the event is not fired when backspace or delete key are pressed or + // when cut operation is performed. + if (event == 'input' && msie == 9) return false; + + if (isUndefined(eventSupport[event])) { + var divElm = document.createElement('div'); + eventSupport[event] = 'on' + event in divElm; + } + + return eventSupport[event]; + }, + csp: csp(), + vendorPrefix: vendorPrefix, + transitions : transitions, + animations : animations, + android: android, + msie : msie, + msieDocumentMode: documentMode + }; + }]; +} + +function $TimeoutProvider() { + this.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler', + function($rootScope, $browser, $q, $exceptionHandler) { + var deferreds = {}; + + + /** + * @ngdoc function + * @name ng.$timeout + * @requires $browser + * + * @description + * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch + * block and delegates any exceptions to + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * The return value of registering a timeout function is a promise, which will be resolved when + * the timeout is reached and the timeout function is executed. + * + * To cancel a timeout request, call `$timeout.cancel(promise)`. + * + * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to + * synchronously flush the queue of deferred functions. + * + * @param {function()} fn A function, whose execution should be delayed. + * @param {number=} [delay=0] Delay in milliseconds. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#methods_$apply $apply} block. + * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this + * promise will be resolved with is the return value of the `fn` function. + * + */ + function timeout(fn, delay, invokeApply) { + var deferred = $q.defer(), + promise = deferred.promise, + skipApply = (isDefined(invokeApply) && !invokeApply), + timeoutId; + + timeoutId = $browser.defer(function() { + try { + deferred.resolve(fn()); + } catch(e) { + deferred.reject(e); + $exceptionHandler(e); + } + finally { + delete deferreds[promise.$$timeoutId]; + } + + if (!skipApply) $rootScope.$apply(); + }, delay); + + promise.$$timeoutId = timeoutId; + deferreds[timeoutId] = deferred; + + return promise; + } + + + /** + * @ngdoc function + * @name ng.$timeout#cancel + * @methodOf ng.$timeout + * + * @description + * Cancels a task associated with the `promise`. As a result of this, the promise will be + * resolved with a rejection. + * + * @param {Promise=} promise Promise returned by the `$timeout` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + timeout.cancel = function(promise) { + if (promise && promise.$$timeoutId in deferreds) { + deferreds[promise.$$timeoutId].reject('canceled'); + delete deferreds[promise.$$timeoutId]; + return $browser.defer.cancel(promise.$$timeoutId); + } + return false; + }; + + return timeout; + }]; +} + +// NOTE: The usage of window and document instead of $window and $document here is +// deliberate. This service depends on the specific behavior of anchor nodes created by the +// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and +// cause us to break tests. In addition, when the browser resolves a URL for XHR, it +// doesn't know about mocked locations and resolves URLs to the real document - which is +// exactly the behavior needed here. There is little value is mocking these out for this +// service. +var urlParsingNode = document.createElement("a"); +var originUrl = urlResolve(window.location.href, true); + + +/** + * + * Implementation Notes for non-IE browsers + * ---------------------------------------- + * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM, + * results both in the normalizing and parsing of the URL. Normalizing means that a relative + * URL will be resolved into an absolute URL in the context of the application document. + * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related + * properties are all populated to reflect the normalized URL. This approach has wide + * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html + * + * Implementation Notes for IE + * --------------------------- + * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other + * browsers. However, the parsed components will not be set if the URL assigned did not specify + * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We + * work around that by performing the parsing in a 2nd step by taking a previously normalized + * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the + * properties such as protocol, hostname, port, etc. + * + * IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one + * uses the inner HTML approach to assign the URL as part of an HTML snippet - + * http://stackoverflow.com/a/472729) However, setting img[src] does normalize the URL. + * Unfortunately, setting img[src] to something like "javascript:foo" on IE throws an exception. + * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that + * method and IE < 8 is unsupported. + * + * References: + * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html + * http://url.spec.whatwg.org/#urlutils + * https://github.com/angular/angular.js/pull/2902 + * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/ + * + * @function + * @param {string} url The URL to be parsed. + * @description Normalizes and parses a URL. + * @returns {object} Returns the normalized URL as a dictionary. + * + * | member name | Description | + * |---------------|----------------| + * | href | A normalized version of the provided URL if it was not an absolute URL | + * | protocol | The protocol including the trailing colon | + * | host | The host and port (if the port is non-default) of the normalizedUrl | + * | search | The search params, minus the question mark | + * | hash | The hash string, minus the hash symbol + * | hostname | The hostname + * | port | The port, without ":" + * | pathname | The pathname, beginning with "/" + * + */ +function urlResolve(url, base) { + var href = url; + + if (msie) { + // Normalize before parse. Refer Implementation Notes on why this is + // done in two steps on IE. + urlParsingNode.setAttribute("href", href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') + ? urlParsingNode.pathname + : '/' + urlParsingNode.pathname + }; +} + +/** + * Parse a request URL and determine whether this is a same-origin request as the application document. + * + * @param {string|object} requestUrl The url of the request as a string that will be resolved + * or a parsed URL object. + * @returns {boolean} Whether the request is for the same origin as the application document. + */ +function urlIsSameOrigin(requestUrl) { + var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl; + return (parsed.protocol === originUrl.protocol && + parsed.host === originUrl.host); +} + +/** + * @ngdoc object + * @name ng.$window + * + * @description + * A reference to the browser's `window` object. While `window` + * is globally available in JavaScript, it causes testability problems, because + * it is a global variable. In angular we always refer to it through the + * `$window` service, so it may be overridden, removed or mocked for testing. + * + * Expressions, like the one defined for the `ngClick` directive in the example + * below, are evaluated with respect to the current scope. Therefore, there is + * no risk of inadvertently coding in a dependency on a global value in such an + * expression. + * + * @example + + + +
                  + + +
                  +
                  + + it('should display the greeting in the input box', function() { + input('greeting').enter('Hello, E2E Tests'); + // If we click the button it will block the test runner + // element(':button').click(); + }); + +
                  + */ +function $WindowProvider(){ + this.$get = valueFn(window); +} + +/** + * @ngdoc object + * @name ng.$filterProvider + * @description + * + * Filters are just functions which transform input to an output. However filters need to be + * Dependency Injected. To achieve this a filter definition consists of a factory function which is + * annotated with dependencies and is responsible for creating a filter function. + * + *
                  + *   // Filter registration
                  + *   function MyModule($provide, $filterProvider) {
                  + *     // create a service to demonstrate injection (not always needed)
                  + *     $provide.value('greet', function(name){
                  + *       return 'Hello ' + name + '!';
                  + *     });
                  + *
                  + *     // register a filter factory which uses the
                  + *     // greet service to demonstrate DI.
                  + *     $filterProvider.register('greet', function(greet){
                  + *       // return the filter function which uses the greet service
                  + *       // to generate salutation
                  + *       return function(text) {
                  + *         // filters need to be forgiving so check input validity
                  + *         return text && greet(text) || text;
                  + *       };
                  + *     });
                  + *   }
                  + * 
                  + * + * The filter function is registered with the `$injector` under the filter name suffix with + * `Filter`. + * + *
                  + *   it('should be the same instance', inject(
                  + *     function($filterProvider) {
                  + *       $filterProvider.register('reverse', function(){
                  + *         return ...;
                  + *       });
                  + *     },
                  + *     function($filter, reverseFilter) {
                  + *       expect($filter('reverse')).toBe(reverseFilter);
                  + *     });
                  + * 
                  + * + * + * For more information about how angular filters work, and how to create your own filters, see + * {@link guide/filter Filters} in the Angular Developer Guide. + */ +/** + * @ngdoc method + * @name ng.$filterProvider#register + * @methodOf ng.$filterProvider + * @description + * Register filter factory function. + * + * @param {String} name Name of the filter. + * @param {function} fn The filter factory function which is injectable. + */ + + +/** + * @ngdoc function + * @name ng.$filter + * @function + * @description + * Filters are used for formatting data displayed to the user. + * + * The general syntax in templates is as follows: + * + * {{ expression [| filter_name[:parameter_value] ... ] }} + * + * @param {String} name Name of the filter function to retrieve + * @return {Function} the filter function + */ +$FilterProvider.$inject = ['$provide']; +function $FilterProvider($provide) { + var suffix = 'Filter'; + + /** + * @ngdoc function + * @name ng.$controllerProvider#register + * @methodOf ng.$controllerProvider + * @param {string|Object} name Name of the filter function, or an object map of filters where + * the keys are the filter names and the values are the filter factories. + * @returns {Object} Registered filter instance, or if a map of filters was provided then a map + * of the registered filter instances. + */ + function register(name, factory) { + if(isObject(name)) { + var filters = {}; + forEach(name, function(filter, key) { + filters[key] = register(key, filter); + }); + return filters; + } else { + return $provide.factory(name + suffix, factory); + } + } + this.register = register; + + this.$get = ['$injector', function($injector) { + return function(name) { + return $injector.get(name + suffix); + }; + }]; + + //////////////////////////////////////// + + /* global + currencyFilter: false, + dateFilter: false, + filterFilter: false, + jsonFilter: false, + limitToFilter: false, + lowercaseFilter: false, + numberFilter: false, + orderByFilter: false, + uppercaseFilter: false, + */ + + register('currency', currencyFilter); + register('date', dateFilter); + register('filter', filterFilter); + register('json', jsonFilter); + register('limitTo', limitToFilter); + register('lowercase', lowercaseFilter); + register('number', numberFilter); + register('orderBy', orderByFilter); + register('uppercase', uppercaseFilter); +} + +/** + * @ngdoc filter + * @name ng.filter:filter + * @function + * + * @description + * Selects a subset of items from `array` and returns it as a new array. + * + * @param {Array} array The source array. + * @param {string|Object|function()} expression The predicate to be used for selecting items from + * `array`. + * + * Can be one of: + * + * - `string`: The string is evaluated as an expression and the resulting value is used for substring match against + * the contents of the `array`. All strings or objects with string properties in `array` that contain this string + * will be returned. The predicate can be negated by prefixing the string with `!`. + * + * - `Object`: A pattern object can be used to filter specific properties on objects contained + * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items + * which have property `name` containing "M" and property `phone` containing "1". A special + * property name `$` can be used (as in `{$:"text"}`) to accept a match against any + * property of the object. That's equivalent to the simple substring match with a `string` + * as described above. + * + * - `function(value)`: A predicate function can be used to write arbitrary filters. The function is + * called for each element of `array`. The final result is an array of those elements that + * the predicate returned true for. + * + * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in + * determining if the expected value (from the filter expression) and actual value (from + * the object in the array) should be considered a match. + * + * Can be one of: + * + * - `function(actual, expected)`: + * The function will be given the object value and the predicate value to compare and + * should return true if the item should be included in filtered result. + * + * - `true`: A shorthand for `function(actual, expected) { return angular.equals(expected, actual)}`. + * this is essentially strict comparison of expected and actual. + * + * - `false|undefined`: A short hand for a function which will look for a substring match in case + * insensitive way. + * + * @example + + +
                  + + Search: + + + + + + +
                  NamePhone
                  {{friend.name}}{{friend.phone}}
                  +
                  + Any:
                  + Name only
                  + Phone only
                  + Equality
                  + + + + + + +
                  NamePhone
                  {{friend.name}}{{friend.phone}}
                  +
                  + + it('should search across all fields when filtering with a string', function() { + input('searchText').enter('m'); + expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')). + toEqual(['Mary', 'Mike', 'Adam']); + + input('searchText').enter('76'); + expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')). + toEqual(['John', 'Julie']); + }); + + it('should search in specific fields when filtering with a predicate object', function() { + input('search.$').enter('i'); + expect(repeater('#searchObjResults tr', 'friend in friends').column('friend.name')). + toEqual(['Mary', 'Mike', 'Julie', 'Juliette']); + }); + it('should use a equal comparison when comparator is true', function() { + input('search.name').enter('Julie'); + input('strict').check(); + expect(repeater('#searchObjResults tr', 'friend in friends').column('friend.name')). + toEqual(['Julie']); + }); + +
                  + */ +function filterFilter() { + return function(array, expression, comparator) { + if (!isArray(array)) return array; + + var comparatorType = typeof(comparator), + predicates = []; + + predicates.check = function(value) { + for (var j = 0; j < predicates.length; j++) { + if(!predicates[j](value)) { + return false; + } + } + return true; + }; + + if (comparatorType !== 'function') { + if (comparatorType === 'boolean' && comparator) { + comparator = function(obj, text) { + return angular.equals(obj, text); + }; + } else { + comparator = function(obj, text) { + text = (''+text).toLowerCase(); + return (''+obj).toLowerCase().indexOf(text) > -1; + }; + } + } + + var search = function(obj, text){ + if (typeof text == 'string' && text.charAt(0) === '!') { + return !search(obj, text.substr(1)); + } + switch (typeof obj) { + case "boolean": + case "number": + case "string": + return comparator(obj, text); + case "object": + switch (typeof text) { + case "object": + return comparator(obj, text); + default: + for ( var objKey in obj) { + if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) { + return true; + } + } + break; + } + return false; + case "array": + for ( var i = 0; i < obj.length; i++) { + if (search(obj[i], text)) { + return true; + } + } + return false; + default: + return false; + } + }; + switch (typeof expression) { + case "boolean": + case "number": + case "string": + // Set up expression object and fall through + expression = {$:expression}; + // jshint -W086 + case "object": + // jshint +W086 + for (var key in expression) { + (function(path) { + if (typeof expression[path] == 'undefined') return; + predicates.push(function(value) { + return search(path == '$' ? value : getter(value, path), expression[path]); + }); + })(key); + } + break; + case 'function': + predicates.push(expression); + break; + default: + return array; + } + var filtered = []; + for ( var j = 0; j < array.length; j++) { + var value = array[j]; + if (predicates.check(value)) { + filtered.push(value); + } + } + return filtered; + }; +} + +/** + * @ngdoc filter + * @name ng.filter:currency + * @function + * + * @description + * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default + * symbol for current locale is used. + * + * @param {number} amount Input to filter. + * @param {string=} symbol Currency symbol or identifier to be displayed. + * @returns {string} Formatted number. + * + * + * @example + + + +
                  +
                  + default currency symbol ($): {{amount | currency}}
                  + custom currency identifier (USD$): {{amount | currency:"USD$"}} +
                  +
                  + + it('should init with 1234.56', function() { + expect(binding('amount | currency')).toBe('$1,234.56'); + expect(binding('amount | currency:"USD$"')).toBe('USD$1,234.56'); + }); + it('should update', function() { + input('amount').enter('-1234'); + expect(binding('amount | currency')).toBe('($1,234.00)'); + expect(binding('amount | currency:"USD$"')).toBe('(USD$1,234.00)'); + }); + +
                  + */ +currencyFilter.$inject = ['$locale']; +function currencyFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(amount, currencySymbol){ + if (isUndefined(currencySymbol)) currencySymbol = formats.CURRENCY_SYM; + return formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2). + replace(/\u00A4/g, currencySymbol); + }; +} + +/** + * @ngdoc filter + * @name ng.filter:number + * @function + * + * @description + * Formats a number as text. + * + * If the input is not a number an empty string is returned. + * + * @param {number|string} number Number to format. + * @param {(number|string)=} fractionSize Number of decimal places to round the number to. + * If this is not provided then the fraction size is computed from the current locale's number + * formatting pattern. In the case of the default locale, it will be 3. + * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit. + * + * @example + + + +
                  + Enter number:
                  + Default formatting: {{val | number}}
                  + No fractions: {{val | number:0}}
                  + Negative number: {{-val | number:4}} +
                  +
                  + + it('should format numbers', function() { + expect(binding('val | number')).toBe('1,234.568'); + expect(binding('val | number:0')).toBe('1,235'); + expect(binding('-val | number:4')).toBe('-1,234.5679'); + }); + + it('should update', function() { + input('val').enter('3374.333'); + expect(binding('val | number')).toBe('3,374.333'); + expect(binding('val | number:0')).toBe('3,374'); + expect(binding('-val | number:4')).toBe('-3,374.3330'); + }); + +
                  + */ + + +numberFilter.$inject = ['$locale']; +function numberFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(number, fractionSize) { + return formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, + fractionSize); + }; +} + +var DECIMAL_SEP = '.'; +function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { + if (isNaN(number) || !isFinite(number)) return ''; + + var isNegative = number < 0; + number = Math.abs(number); + var numStr = number + '', + formatedText = '', + parts = []; + + var hasExponent = false; + if (numStr.indexOf('e') !== -1) { + var match = numStr.match(/([\d\.]+)e(-?)(\d+)/); + if (match && match[2] == '-' && match[3] > fractionSize + 1) { + numStr = '0'; + } else { + formatedText = numStr; + hasExponent = true; + } + } + + if (!hasExponent) { + var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length; + + // determine fractionSize if it is not specified + if (isUndefined(fractionSize)) { + fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac); + } + + var pow = Math.pow(10, fractionSize); + number = Math.round(number * pow) / pow; + var fraction = ('' + number).split(DECIMAL_SEP); + var whole = fraction[0]; + fraction = fraction[1] || ''; + + var i, pos = 0, + lgroup = pattern.lgSize, + group = pattern.gSize; + + if (whole.length >= (lgroup + group)) { + pos = whole.length - lgroup; + for (i = 0; i < pos; i++) { + if ((pos - i)%group === 0 && i !== 0) { + formatedText += groupSep; + } + formatedText += whole.charAt(i); + } + } + + for (i = pos; i < whole.length; i++) { + if ((whole.length - i)%lgroup === 0 && i !== 0) { + formatedText += groupSep; + } + formatedText += whole.charAt(i); + } + + // format fraction part. + while(fraction.length < fractionSize) { + fraction += '0'; + } + + if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize); + } else { + + if (fractionSize > 0 && number > -1 && number < 1) { + formatedText = number.toFixed(fractionSize); + } + } + + parts.push(isNegative ? pattern.negPre : pattern.posPre); + parts.push(formatedText); + parts.push(isNegative ? pattern.negSuf : pattern.posSuf); + return parts.join(''); +} + +function padNumber(num, digits, trim) { + var neg = ''; + if (num < 0) { + neg = '-'; + num = -num; + } + num = '' + num; + while(num.length < digits) num = '0' + num; + if (trim) + num = num.substr(num.length - digits); + return neg + num; +} + + +function dateGetter(name, size, offset, trim) { + offset = offset || 0; + return function(date) { + var value = date['get' + name](); + if (offset > 0 || value > -offset) + value += offset; + if (value === 0 && offset == -12 ) value = 12; + return padNumber(value, size, trim); + }; +} + +function dateStrGetter(name, shortForm) { + return function(date, formats) { + var value = date['get' + name](); + var get = uppercase(shortForm ? ('SHORT' + name) : name); + + return formats[get][value]; + }; +} + +function timeZoneGetter(date) { + var zone = -1 * date.getTimezoneOffset(); + var paddedZone = (zone >= 0) ? "+" : ""; + + paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + + padNumber(Math.abs(zone % 60), 2); + + return paddedZone; +} + +function ampmGetter(date, formats) { + return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]; +} + +var DATE_FORMATS = { + yyyy: dateGetter('FullYear', 4), + yy: dateGetter('FullYear', 2, 0, true), + y: dateGetter('FullYear', 1), + MMMM: dateStrGetter('Month'), + MMM: dateStrGetter('Month', true), + MM: dateGetter('Month', 2, 1), + M: dateGetter('Month', 1, 1), + dd: dateGetter('Date', 2), + d: dateGetter('Date', 1), + HH: dateGetter('Hours', 2), + H: dateGetter('Hours', 1), + hh: dateGetter('Hours', 2, -12), + h: dateGetter('Hours', 1, -12), + mm: dateGetter('Minutes', 2), + m: dateGetter('Minutes', 1), + ss: dateGetter('Seconds', 2), + s: dateGetter('Seconds', 1), + // while ISO 8601 requires fractions to be prefixed with `.` or `,` + // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions + sss: dateGetter('Milliseconds', 3), + EEEE: dateStrGetter('Day'), + EEE: dateStrGetter('Day', true), + a: ampmGetter, + Z: timeZoneGetter +}; + +var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/, + NUMBER_STRING = /^\-?\d+$/; + +/** + * @ngdoc filter + * @name ng.filter:date + * @function + * + * @description + * Formats `date` to a string based on the requested `format`. + * + * `format` string can be composed of the following elements: + * + * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) + * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) + * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) + * * `'MMMM'`: Month in year (January-December) + * * `'MMM'`: Month in year (Jan-Dec) + * * `'MM'`: Month in year, padded (01-12) + * * `'M'`: Month in year (1-12) + * * `'dd'`: Day in month, padded (01-31) + * * `'d'`: Day in month (1-31) + * * `'EEEE'`: Day in Week,(Sunday-Saturday) + * * `'EEE'`: Day in Week, (Sun-Sat) + * * `'HH'`: Hour in day, padded (00-23) + * * `'H'`: Hour in day (0-23) + * * `'hh'`: Hour in am/pm, padded (01-12) + * * `'h'`: Hour in am/pm, (1-12) + * * `'mm'`: Minute in hour, padded (00-59) + * * `'m'`: Minute in hour (0-59) + * * `'ss'`: Second in minute, padded (00-59) + * * `'s'`: Second in minute (0-59) + * * `'.sss' or ',sss'`: Millisecond in second, padded (000-999) + * * `'a'`: am/pm marker + * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200) + * + * `format` string can also be one of the following predefined + * {@link guide/i18n localizable formats}: + * + * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale + * (e.g. Sep 3, 2010 12:05:08 pm) + * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 pm) + * * `'fullDate'`: equivalent to `'EEEE, MMMM d,y'` for en_US locale + * (e.g. Friday, September 3, 2010) + * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010) + * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010) + * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10) + * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 pm) + * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 pm) + * + * `format` string can contain literal values. These need to be quoted with single quotes (e.g. + * `"h 'in the morning'"`). In order to output single quote, use two single quotes in a sequence + * (e.g. `"h 'o''clock'"`). + * + * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or + * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and its + * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is + * specified in the string input, the time is considered to be in the local timezone. + * @param {string=} format Formatting rules (see Description). If not specified, + * `mediumDate` is used. + * @returns {string} Formatted string or the input if input is not recognized as date/millis. + * + * @example + + + {{1288323623006 | date:'medium'}}: + {{1288323623006 | date:'medium'}}
                  + {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}: + {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}
                  + {{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}: + {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}
                  +
                  + + it('should format date', function() { + expect(binding("1288323623006 | date:'medium'")). + toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); + expect(binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")). + toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); + expect(binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")). + toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); + }); + +
                  + */ +dateFilter.$inject = ['$locale']; +function dateFilter($locale) { + + + var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; + // 1 2 3 4 5 6 7 8 9 10 11 + function jsonStringToDate(string) { + var match; + if (match = string.match(R_ISO8601_STR)) { + var date = new Date(0), + tzHour = 0, + tzMin = 0, + dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, + timeSetter = match[8] ? date.setUTCHours : date.setHours; + + if (match[9]) { + tzHour = int(match[9] + match[10]); + tzMin = int(match[9] + match[11]); + } + dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3])); + var h = int(match[4]||0) - tzHour; + var m = int(match[5]||0) - tzMin; + var s = int(match[6]||0); + var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000); + timeSetter.call(date, h, m, s, ms); + return date; + } + return string; + } + + + return function(date, format) { + var text = '', + parts = [], + fn, match; + + format = format || 'mediumDate'; + format = $locale.DATETIME_FORMATS[format] || format; + if (isString(date)) { + if (NUMBER_STRING.test(date)) { + date = int(date); + } else { + date = jsonStringToDate(date); + } + } + + if (isNumber(date)) { + date = new Date(date); + } + + if (!isDate(date)) { + return date; + } + + while(format) { + match = DATE_FORMATS_SPLIT.exec(format); + if (match) { + parts = concat(parts, match, 1); + format = parts.pop(); + } else { + parts.push(format); + format = null; + } + } + + forEach(parts, function(value){ + fn = DATE_FORMATS[value]; + text += fn ? fn(date, $locale.DATETIME_FORMATS) + : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); + }); + + return text; + }; +} + + +/** + * @ngdoc filter + * @name ng.filter:json + * @function + * + * @description + * Allows you to convert a JavaScript object into JSON string. + * + * This filter is mostly useful for debugging. When using the double curly {{value}} notation + * the binding is automatically converted to JSON. + * + * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. + * @returns {string} JSON string. + * + * + * @example: + + +
                  {{ {'name':'value'} | json }}
                  +
                  + + it('should jsonify filtered objects', function() { + expect(binding("{'name':'value'}")).toMatch(/\{\n "name": ?"value"\n}/); + }); + +
                  + * + */ +function jsonFilter() { + return function(object) { + return toJson(object, true); + }; +} + + +/** + * @ngdoc filter + * @name ng.filter:lowercase + * @function + * @description + * Converts string to lowercase. + * @see angular.lowercase + */ +var lowercaseFilter = valueFn(lowercase); + + +/** + * @ngdoc filter + * @name ng.filter:uppercase + * @function + * @description + * Converts string to uppercase. + * @see angular.uppercase + */ +var uppercaseFilter = valueFn(uppercase); + +/** + * @ngdoc function + * @name ng.filter:limitTo + * @function + * + * @description + * Creates a new array or string containing only a specified number of elements. The elements + * are taken from either the beginning or the end of the source array or string, as specified by + * the value and sign (positive or negative) of `limit`. + * + * @param {Array|string} input Source array or string to be limited. + * @param {string|number} limit The length of the returned array or string. If the `limit` number + * is positive, `limit` number of items from the beginning of the source array/string are copied. + * If the number is negative, `limit` number of items from the end of the source array/string + * are copied. The `limit` will be trimmed if it exceeds `array.length` + * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array + * had less than `limit` elements. + * + * @example + + + +
                  + Limit {{numbers}} to: +

                  Output numbers: {{ numbers | limitTo:numLimit }}

                  + Limit {{letters}} to: +

                  Output letters: {{ letters | limitTo:letterLimit }}

                  +
                  +
                  + + it('should limit the number array to first three items', function() { + expect(element('.doc-example-live input[ng-model=numLimit]').val()).toBe('3'); + expect(element('.doc-example-live input[ng-model=letterLimit]').val()).toBe('3'); + expect(binding('numbers | limitTo:numLimit')).toEqual('[1,2,3]'); + expect(binding('letters | limitTo:letterLimit')).toEqual('abc'); + }); + + it('should update the output when -3 is entered', function() { + input('numLimit').enter(-3); + input('letterLimit').enter(-3); + expect(binding('numbers | limitTo:numLimit')).toEqual('[7,8,9]'); + expect(binding('letters | limitTo:letterLimit')).toEqual('ghi'); + }); + + it('should not exceed the maximum size of input array', function() { + input('numLimit').enter(100); + input('letterLimit').enter(100); + expect(binding('numbers | limitTo:numLimit')).toEqual('[1,2,3,4,5,6,7,8,9]'); + expect(binding('letters | limitTo:letterLimit')).toEqual('abcdefghi'); + }); + +
                  + */ +function limitToFilter(){ + return function(input, limit) { + if (!isArray(input) && !isString(input)) return input; + + limit = int(limit); + + if (isString(input)) { + //NaN check on limit + if (limit) { + return limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length); + } else { + return ""; + } + } + + var out = [], + i, n; + + // if abs(limit) exceeds maximum length, trim it + if (limit > input.length) + limit = input.length; + else if (limit < -input.length) + limit = -input.length; + + if (limit > 0) { + i = 0; + n = limit; + } else { + i = input.length + limit; + n = input.length; + } + + for (; i} expression A predicate to be + * used by the comparator to determine the order of elements. + * + * Can be one of: + * + * - `function`: Getter function. The result of this function will be sorted using the + * `<`, `=`, `>` operator. + * - `string`: An Angular expression which evaluates to an object to order by, such as 'name' + * to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control + * ascending or descending sort order (for example, +name or -name). + * - `Array`: An array of function or string predicates. The first predicate in the array + * is used for sorting, but when two items are equivalent, the next predicate is used. + * + * @param {boolean=} reverse Reverse the order the array. + * @returns {Array} Sorted copy of the source array. + * + * @example + + + +
                  +
                  Sorting predicate = {{predicate}}; reverse = {{reverse}}
                  +
                  + [ unsorted ] + + + + + + + + + + + +
                  Name + (^)Phone NumberAge
                  {{friend.name}}{{friend.phone}}{{friend.age}}
                  +
                  +
                  + + it('should be reverse ordered by aged', function() { + expect(binding('predicate')).toBe('-age'); + expect(repeater('table.friend', 'friend in friends').column('friend.age')). + toEqual(['35', '29', '21', '19', '10']); + expect(repeater('table.friend', 'friend in friends').column('friend.name')). + toEqual(['Adam', 'Julie', 'Mike', 'Mary', 'John']); + }); + + it('should reorder the table when user selects different predicate', function() { + element('.doc-example-live a:contains("Name")').click(); + expect(repeater('table.friend', 'friend in friends').column('friend.name')). + toEqual(['Adam', 'John', 'Julie', 'Mary', 'Mike']); + expect(repeater('table.friend', 'friend in friends').column('friend.age')). + toEqual(['35', '10', '29', '19', '21']); + + element('.doc-example-live a:contains("Phone")').click(); + expect(repeater('table.friend', 'friend in friends').column('friend.phone')). + toEqual(['555-9876', '555-8765', '555-5678', '555-4321', '555-1212']); + expect(repeater('table.friend', 'friend in friends').column('friend.name')). + toEqual(['Mary', 'Julie', 'Adam', 'Mike', 'John']); + }); + +
                  + */ +orderByFilter.$inject = ['$parse']; +function orderByFilter($parse){ + return function(array, sortPredicate, reverseOrder) { + if (!isArray(array)) return array; + if (!sortPredicate) return array; + sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate]; + sortPredicate = map(sortPredicate, function(predicate){ + var descending = false, get = predicate || identity; + if (isString(predicate)) { + if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { + descending = predicate.charAt(0) == '-'; + predicate = predicate.substring(1); + } + get = $parse(predicate); + } + return reverseComparator(function(a,b){ + return compare(get(a),get(b)); + }, descending); + }); + var arrayCopy = []; + for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); } + return arrayCopy.sort(reverseComparator(comparator, reverseOrder)); + + function comparator(o1, o2){ + for ( var i = 0; i < sortPredicate.length; i++) { + var comp = sortPredicate[i](o1, o2); + if (comp !== 0) return comp; + } + return 0; + } + function reverseComparator(comp, descending) { + return toBoolean(descending) + ? function(a,b){return comp(b,a);} + : comp; + } + function compare(v1, v2){ + var t1 = typeof v1; + var t2 = typeof v2; + if (t1 == t2) { + if (t1 == "string") { + v1 = v1.toLowerCase(); + v2 = v2.toLowerCase(); + } + if (v1 === v2) return 0; + return v1 < v2 ? -1 : 1; + } else { + return t1 < t2 ? -1 : 1; + } + } + }; +} + +function ngDirective(directive) { + if (isFunction(directive)) { + directive = { + link: directive + }; + } + directive.restrict = directive.restrict || 'AC'; + return valueFn(directive); +} + +/** + * @ngdoc directive + * @name ng.directive:a + * @restrict E + * + * @description + * Modifies the default behavior of the html A tag so that the default action is prevented when + * the href attribute is empty. + * + * This change permits the easy creation of action links with the `ngClick` directive + * without changing the location or causing page reloads, e.g.: + * `Add Item` + */ +var htmlAnchorDirective = valueFn({ + restrict: 'E', + compile: function(element, attr) { + + if (msie <= 8) { + + // turn link into a stylable link in IE + // but only if it doesn't have name attribute, in which case it's an anchor + if (!attr.href && !attr.name) { + attr.$set('href', ''); + } + + // add a comment node to anchors to workaround IE bug that causes element content to be reset + // to new attribute content if attribute is updated with value containing @ and element also + // contains value with @ + // see issue #1949 + element.append(document.createComment('IE fix')); + } + + if (!attr.href && !attr.name) { + return function(scope, element) { + element.on('click', function(event){ + // if we have no href url, then don't navigate anywhere. + if (!element.attr('href')) { + event.preventDefault(); + } + }); + }; + } + } +}); + +/** + * @ngdoc directive + * @name ng.directive:ngHref + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in an href attribute will + * make the link go to the wrong URL if the user clicks it before + * Angular has a chance to replace the `{{hash}}` markup with its + * value. Until Angular replaces the markup the link will be broken + * and will most likely return a 404 error. + * + * The `ngHref` directive solves this problem. + * + * The wrong way to write it: + *
                  + * 
                  + * 
                  + * + * The correct way to write it: + *
                  + * 
                  + * 
                  + * + * @element A + * @param {template} ngHref any string which can contain `{{}}` markup. + * + * @example + * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes + * in links and their different behaviors: + + +
                  +
                  link 1 (link, don't reload)
                  + link 2 (link, don't reload)
                  + link 3 (link, reload!)
                  + anchor (link, don't reload)
                  + anchor (no link)
                  + link (link, change location) + + + it('should execute ng-click but not reload when href without value', function() { + element('#link-1').click(); + expect(input('value').val()).toEqual('1'); + expect(element('#link-1').attr('href')).toBe(""); + }); + + it('should execute ng-click but not reload when href empty string', function() { + element('#link-2').click(); + expect(input('value').val()).toEqual('2'); + expect(element('#link-2').attr('href')).toBe(""); + }); + + it('should execute ng-click and change url when ng-href specified', function() { + expect(element('#link-3').attr('href')).toBe("/123"); + + element('#link-3').click(); + expect(browser().window().path()).toEqual('/123'); + }); + + it('should execute ng-click but not reload when href empty string and name specified', function() { + element('#link-4').click(); + expect(input('value').val()).toEqual('4'); + expect(element('#link-4').attr('href')).toBe(''); + }); + + it('should execute ng-click but not reload when no href but name specified', function() { + element('#link-5').click(); + expect(input('value').val()).toEqual('5'); + expect(element('#link-5').attr('href')).toBe(undefined); + }); + + it('should only change url when only ng-href', function() { + input('value').enter('6'); + expect(element('#link-6').attr('href')).toBe('6'); + + element('#link-6').click(); + expect(browser().location().url()).toEqual('/6'); + }); + + + */ + +/** + * @ngdoc directive + * @name ng.directive:ngSrc + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in a `src` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrc` directive solves this problem. + * + * The buggy way to write it: + *
                  + * 
                  + * 
                  + * + * The correct way to write it: + *
                  + * 
                  + * 
                  + * + * @element IMG + * @param {template} ngSrc any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ng.directive:ngSrcset + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrcset` directive solves this problem. + * + * The buggy way to write it: + *
                  + * 
                  + * 
                  + * + * The correct way to write it: + *
                  + * 
                  + * 
                  + * + * @element IMG + * @param {template} ngSrcset any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ng.directive:ngDisabled + * @restrict A + * @priority 100 + * + * @description + * + * The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs: + *
                  + * 
                  + * + *
                  + *
                  + * + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as disabled. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngDisabled` directive solves this problem for the `disabled` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * + * @example + + + Click me to toggle:
                  + +
                  + + it('should toggle button', function() { + expect(element('.doc-example-live :button').prop('disabled')).toBeFalsy(); + input('checked').check(); + expect(element('.doc-example-live :button').prop('disabled')).toBeTruthy(); + }); + +
                  + * + * @element INPUT + * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy, + * then special attribute "disabled" will be set on the element + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngChecked + * @restrict A + * @priority 100 + * + * @description + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as checked. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngChecked` directive solves this problem for the `checked` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @example + + + Check me to check both:
                  + +
                  + + it('should check both checkBoxes', function() { + expect(element('.doc-example-live #checkSlave').prop('checked')).toBeFalsy(); + input('master').check(); + expect(element('.doc-example-live #checkSlave').prop('checked')).toBeTruthy(); + }); + +
                  + * + * @element INPUT + * @param {expression} ngChecked If the {@link guide/expression expression} is truthy, + * then special attribute "checked" will be set on the element + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngReadonly + * @restrict A + * @priority 100 + * + * @description + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as readonly. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngReadonly` directive solves this problem for the `readonly` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @example + + + Check me to make text readonly:
                  + +
                  + + it('should toggle readonly attr', function() { + expect(element('.doc-example-live :text').prop('readonly')).toBeFalsy(); + input('checked').check(); + expect(element('.doc-example-live :text').prop('readonly')).toBeTruthy(); + }); + +
                  + * + * @element INPUT + * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy, + * then special attribute "readonly" will be set on the element + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngSelected + * @restrict A + * @priority 100 + * + * @description + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as selected. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngSelected` directive solves this problem for the `selected` atttribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * + * @example + + + Check me to select:
                  + +
                  + + it('should select Greetings!', function() { + expect(element('.doc-example-live #greet').prop('selected')).toBeFalsy(); + input('selected').check(); + expect(element('.doc-example-live #greet').prop('selected')).toBeTruthy(); + }); + +
                  + * + * @element OPTION + * @param {expression} ngSelected If the {@link guide/expression expression} is truthy, + * then special attribute "selected" will be set on the element + */ + +/** + * @ngdoc directive + * @name ng.directive:ngOpen + * @restrict A + * @priority 100 + * + * @description + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as open. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngOpen` directive solves this problem for the `open` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @example + + + Check me check multiple:
                  +
                  + Show/Hide me +
                  +
                  + + it('should toggle open', function() { + expect(element('#details').prop('open')).toBeFalsy(); + input('open').check(); + expect(element('#details').prop('open')).toBeTruthy(); + }); + +
                  + * + * @element DETAILS + * @param {expression} ngOpen If the {@link guide/expression expression} is truthy, + * then special attribute "open" will be set on the element + */ + +var ngAttributeAliasDirectives = {}; + + +// boolean attrs are evaluated +forEach(BOOLEAN_ATTR, function(propName, attrName) { + // binding to multiple is not supported + if (propName == "multiple") return; + + var normalized = directiveNormalize('ng-' + attrName); + ngAttributeAliasDirectives[normalized] = function() { + return { + priority: 100, + link: function(scope, element, attr) { + scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { + attr.$set(attrName, !!value); + }); + } + }; + }; +}); + + +// ng-src, ng-srcset, ng-href are interpolated +forEach(['src', 'srcset', 'href'], function(attrName) { + var normalized = directiveNormalize('ng-' + attrName); + ngAttributeAliasDirectives[normalized] = function() { + return { + priority: 99, // it needs to run after the attributes are interpolated + link: function(scope, element, attr) { + attr.$observe(normalized, function(value) { + if (!value) + return; + + attr.$set(attrName, value); + + // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist + // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need + // to set the property as well to achieve the desired effect. + // we use attr[attrName] value since $set can sanitize the url. + if (msie) element.prop(attrName, attr[attrName]); + }); + } + }; + }; +}); + +/* global -nullFormCtrl */ +var nullFormCtrl = { + $addControl: noop, + $removeControl: noop, + $setValidity: noop, + $setDirty: noop, + $setPristine: noop +}; + +/** + * @ngdoc object + * @name ng.directive:form.FormController + * + * @property {boolean} $pristine True if user has not interacted with the form yet. + * @property {boolean} $dirty True if user has already interacted with the form. + * @property {boolean} $valid True if all of the containing forms and controls are valid. + * @property {boolean} $invalid True if at least one containing control or form is invalid. + * + * @property {Object} $error Is an object hash, containing references to all invalid controls or + * forms, where: + * + * - keys are validation tokens (error names), + * - values are arrays of controls or forms that are invalid for given error name. + * + * + * Built-in validation tokens: + * + * - `email` + * - `max` + * - `maxlength` + * - `min` + * - `minlength` + * - `number` + * - `pattern` + * - `required` + * - `url` + * + * @description + * `FormController` keeps track of all its controls and nested forms as well as state of them, + * such as being valid/invalid or dirty/pristine. + * + * Each {@link ng.directive:form form} directive creates an instance + * of `FormController`. + * + */ +//asks for $scope to fool the BC controller module +FormController.$inject = ['$element', '$attrs', '$scope']; +function FormController(element, attrs) { + var form = this, + parentForm = element.parent().controller('form') || nullFormCtrl, + invalidCount = 0, // used to easily determine if we are valid + errors = form.$error = {}, + controls = []; + + // init state + form.$name = attrs.name || attrs.ngForm; + form.$dirty = false; + form.$pristine = true; + form.$valid = true; + form.$invalid = false; + + parentForm.$addControl(form); + + // Setup initial state of the control + element.addClass(PRISTINE_CLASS); + toggleValidCss(true); + + // convenience method for easy toggling of classes + function toggleValidCss(isValid, validationErrorKey) { + validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : ''; + element. + removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey). + addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey); + } + + /** + * @ngdoc function + * @name ng.directive:form.FormController#$addControl + * @methodOf ng.directive:form.FormController + * + * @description + * Register a control with the form. + * + * Input elements using ngModelController do this automatically when they are linked. + */ + form.$addControl = function(control) { + // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored + // and not added to the scope. Now we throw an error. + assertNotHasOwnProperty(control.$name, 'input'); + controls.push(control); + + if (control.$name) { + form[control.$name] = control; + } + }; + + /** + * @ngdoc function + * @name ng.directive:form.FormController#$removeControl + * @methodOf ng.directive:form.FormController + * + * @description + * Deregister a control from the form. + * + * Input elements using ngModelController do this automatically when they are destroyed. + */ + form.$removeControl = function(control) { + if (control.$name && form[control.$name] === control) { + delete form[control.$name]; + } + forEach(errors, function(queue, validationToken) { + form.$setValidity(validationToken, true, control); + }); + + arrayRemove(controls, control); + }; + + /** + * @ngdoc function + * @name ng.directive:form.FormController#$setValidity + * @methodOf ng.directive:form.FormController + * + * @description + * Sets the validity of a form control. + * + * This method will also propagate to parent forms. + */ + form.$setValidity = function(validationToken, isValid, control) { + var queue = errors[validationToken]; + + if (isValid) { + if (queue) { + arrayRemove(queue, control); + if (!queue.length) { + invalidCount--; + if (!invalidCount) { + toggleValidCss(isValid); + form.$valid = true; + form.$invalid = false; + } + errors[validationToken] = false; + toggleValidCss(true, validationToken); + parentForm.$setValidity(validationToken, true, form); + } + } + + } else { + if (!invalidCount) { + toggleValidCss(isValid); + } + if (queue) { + if (includes(queue, control)) return; + } else { + errors[validationToken] = queue = []; + invalidCount++; + toggleValidCss(false, validationToken); + parentForm.$setValidity(validationToken, false, form); + } + queue.push(control); + + form.$valid = false; + form.$invalid = true; + } + }; + + /** + * @ngdoc function + * @name ng.directive:form.FormController#$setDirty + * @methodOf ng.directive:form.FormController + * + * @description + * Sets the form to a dirty state. + * + * This method can be called to add the 'ng-dirty' class and set the form to a dirty + * state (ng-dirty class). This method will also propagate to parent forms. + */ + form.$setDirty = function() { + element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS); + form.$dirty = true; + form.$pristine = false; + parentForm.$setDirty(); + }; + + /** + * @ngdoc function + * @name ng.directive:form.FormController#$setPristine + * @methodOf ng.directive:form.FormController + * + * @description + * Sets the form to its pristine state. + * + * This method can be called to remove the 'ng-dirty' class and set the form to its pristine + * state (ng-pristine class). This method will also propagate to all the controls contained + * in this form. + * + * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after + * saving or resetting it. + */ + form.$setPristine = function () { + element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS); + form.$dirty = false; + form.$pristine = true; + forEach(controls, function(control) { + control.$setPristine(); + }); + }; +} + + +/** + * @ngdoc directive + * @name ng.directive:ngForm + * @restrict EAC + * + * @description + * Nestable alias of {@link ng.directive:form `form`} directive. HTML + * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a + * sub-group of controls needs to be determined. + * + * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + * + */ + + /** + * @ngdoc directive + * @name ng.directive:form + * @restrict E + * + * @description + * Directive that instantiates + * {@link ng.directive:form.FormController FormController}. + * + * If the `name` attribute is specified, the form controller is published onto the current scope under + * this name. + * + * # Alias: {@link ng.directive:ngForm `ngForm`} + * + * In Angular forms can be nested. This means that the outer form is valid when all of the child + * forms are valid as well. However, browsers do not allow nesting of `
                  ` elements, so + * Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to + * `` but can be nested. This allows you to have nested forms, which is very useful when + * using Angular validation directives in forms that are dynamically generated using the + * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name` + * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an + * `ngForm` directive and nest these in an outer `form` element. + * + * + * # CSS classes + * - `ng-valid` is set if the form is valid. + * - `ng-invalid` is set if the form is invalid. + * - `ng-pristine` is set if the form is pristine. + * - `ng-dirty` is set if the form is dirty. + * + * + * # Submitting a form and preventing the default action + * + * Since the role of forms in client-side Angular applications is different than in classical + * roundtrip apps, it is desirable for the browser not to translate the form submission into a full + * page reload that sends the data to the server. Instead some javascript logic should be triggered + * to handle the form submission in an application-specific way. + * + * For this reason, Angular prevents the default action (form submission to the server) unless the + * `` element has an `action` attribute specified. + * + * You can use one of the following two ways to specify what javascript method should be called when + * a form is submitted: + * + * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element + * - {@link ng.directive:ngClick ngClick} directive on the first + * button or input field of type submit (input[type=submit]) + * + * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit} + * or {@link ng.directive:ngClick ngClick} directives. + * This is because of the following form submission rules in the HTML specification: + * + * - If a form has only one input field then hitting enter in this field triggers form submit + * (`ngSubmit`) + * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter + * doesn't trigger submit + * - if a form has one or more input fields and one or more buttons or input[type=submit] then + * hitting enter in any of the input fields will trigger the click handler on the *first* button or + * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`) + * + * @param {string=} name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + * + * @example + + + + + userType: + Required!
                  + userType = {{userType}}
                  + myForm.input.$valid = {{myForm.input.$valid}}
                  + myForm.input.$error = {{myForm.input.$error}}
                  + myForm.$valid = {{myForm.$valid}}
                  + myForm.$error.required = {{!!myForm.$error.required}}
                  + +
                  + + it('should initialize to model', function() { + expect(binding('userType')).toEqual('guest'); + expect(binding('myForm.input.$valid')).toEqual('true'); + }); + + it('should be invalid if empty', function() { + input('userType').enter(''); + expect(binding('userType')).toEqual(''); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + +
                  + */ +var formDirectiveFactory = function(isNgForm) { + return ['$timeout', function($timeout) { + var formDirective = { + name: 'form', + restrict: isNgForm ? 'EAC' : 'E', + controller: FormController, + compile: function() { + return { + pre: function(scope, formElement, attr, controller) { + if (!attr.action) { + // we can't use jq events because if a form is destroyed during submission the default + // action is not prevented. see #1238 + // + // IE 9 is not affected because it doesn't fire a submit event and try to do a full + // page reload if the form was destroyed by submission of the form via a click handler + // on a button in the form. Looks like an IE9 specific bug. + var preventDefaultListener = function(event) { + event.preventDefault + ? event.preventDefault() + : event.returnValue = false; // IE + }; + + addEventListenerFn(formElement[0], 'submit', preventDefaultListener); + + // unregister the preventDefault listener so that we don't not leak memory but in a + // way that will achieve the prevention of the default action. + formElement.on('$destroy', function() { + $timeout(function() { + removeEventListenerFn(formElement[0], 'submit', preventDefaultListener); + }, 0, false); + }); + } + + var parentFormCtrl = formElement.parent().controller('form'), + alias = attr.name || attr.ngForm; + + if (alias) { + setter(scope, alias, controller, alias); + } + if (parentFormCtrl) { + formElement.on('$destroy', function() { + parentFormCtrl.$removeControl(controller); + if (alias) { + setter(scope, alias, undefined, alias); + } + extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards + }); + } + } + }; + } + }; + + return formDirective; + }]; +}; + +var formDirective = formDirectiveFactory(); +var ngFormDirective = formDirectiveFactory(true); + +/* global + + -VALID_CLASS, + -INVALID_CLASS, + -PRISTINE_CLASS, + -DIRTY_CLASS +*/ + +var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; +var EMAIL_REGEXP = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/; +var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/; + +var inputType = { + + /** + * @ngdoc inputType + * @name ng.directive:input.text + * + * @description + * Standard HTML text input with angular data binding. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Adds `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for + * patterns defined as scope expressions. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + * + * @example + + + +
                  + Single word: + + Required! + + Single word only! + + text = {{text}}
                  + myForm.input.$valid = {{myForm.input.$valid}}
                  + myForm.input.$error = {{myForm.input.$error}}
                  + myForm.$valid = {{myForm.$valid}}
                  + myForm.$error.required = {{!!myForm.$error.required}}
                  +
                  +
                  + + it('should initialize to model', function() { + expect(binding('text')).toEqual('guest'); + expect(binding('myForm.input.$valid')).toEqual('true'); + }); + + it('should be invalid if empty', function() { + input('text').enter(''); + expect(binding('text')).toEqual(''); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + + it('should be invalid if multi word', function() { + input('text').enter('hello world'); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + + it('should not be trimmed', function() { + input('text').enter('untrimmed '); + expect(binding('text')).toEqual('untrimmed '); + expect(binding('myForm.input.$valid')).toEqual('true'); + }); + +
                  + */ + 'text': textInputType, + + + /** + * @ngdoc inputType + * @name ng.directive:input.number + * + * @description + * Text input with number validation and transformation. Sets the `number` validation + * error if not a valid number. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for + * patterns defined as scope expressions. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
                  + Number: + + Required! + + Not valid number! + value = {{value}}
                  + myForm.input.$valid = {{myForm.input.$valid}}
                  + myForm.input.$error = {{myForm.input.$error}}
                  + myForm.$valid = {{myForm.$valid}}
                  + myForm.$error.required = {{!!myForm.$error.required}}
                  +
                  +
                  + + it('should initialize to model', function() { + expect(binding('value')).toEqual('12'); + expect(binding('myForm.input.$valid')).toEqual('true'); + }); + + it('should be invalid if empty', function() { + input('value').enter(''); + expect(binding('value')).toEqual(''); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + + it('should be invalid if over max', function() { + input('value').enter('123'); + expect(binding('value')).toEqual(''); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + +
                  + */ + 'number': numberInputType, + + + /** + * @ngdoc inputType + * @name ng.directive:input.url + * + * @description + * Text input with URL validation. Sets the `url` validation error key if the content is not a + * valid URL. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for + * patterns defined as scope expressions. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
                  + URL: + + Required! + + Not valid url! + text = {{text}}
                  + myForm.input.$valid = {{myForm.input.$valid}}
                  + myForm.input.$error = {{myForm.input.$error}}
                  + myForm.$valid = {{myForm.$valid}}
                  + myForm.$error.required = {{!!myForm.$error.required}}
                  + myForm.$error.url = {{!!myForm.$error.url}}
                  +
                  +
                  + + it('should initialize to model', function() { + expect(binding('text')).toEqual('http://google.com'); + expect(binding('myForm.input.$valid')).toEqual('true'); + }); + + it('should be invalid if empty', function() { + input('text').enter(''); + expect(binding('text')).toEqual(''); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + + it('should be invalid if not url', function() { + input('text').enter('xxx'); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + +
                  + */ + 'url': urlInputType, + + + /** + * @ngdoc inputType + * @name ng.directive:input.email + * + * @description + * Text input with email validation. Sets the `email` validation error key if not a valid email + * address. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for + * patterns defined as scope expressions. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
                  + Email: + + Required! + + Not valid email! + text = {{text}}
                  + myForm.input.$valid = {{myForm.input.$valid}}
                  + myForm.input.$error = {{myForm.input.$error}}
                  + myForm.$valid = {{myForm.$valid}}
                  + myForm.$error.required = {{!!myForm.$error.required}}
                  + myForm.$error.email = {{!!myForm.$error.email}}
                  +
                  +
                  + + it('should initialize to model', function() { + expect(binding('text')).toEqual('me@example.com'); + expect(binding('myForm.input.$valid')).toEqual('true'); + }); + + it('should be invalid if empty', function() { + input('text').enter(''); + expect(binding('text')).toEqual(''); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + + it('should be invalid if not email', function() { + input('text').enter('xxx'); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + +
                  + */ + 'email': emailInputType, + + + /** + * @ngdoc inputType + * @name ng.directive:input.radio + * + * @description + * HTML radio button. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string} value The value to which the expression should be set when selected. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
                  + Red
                  + Green
                  + Blue
                  + color = {{color}}
                  +
                  +
                  + + it('should change state', function() { + expect(binding('color')).toEqual('blue'); + + input('color').select('red'); + expect(binding('color')).toEqual('red'); + }); + +
                  + */ + 'radio': radioInputType, + + + /** + * @ngdoc inputType + * @name ng.directive:input.checkbox + * + * @description + * HTML checkbox. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} ngTrueValue The value to which the expression should be set when selected. + * @param {string=} ngFalseValue The value to which the expression should be set when not selected. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
                  + Value1:
                  + Value2:
                  + value1 = {{value1}}
                  + value2 = {{value2}}
                  +
                  +
                  + + it('should change state', function() { + expect(binding('value1')).toEqual('true'); + expect(binding('value2')).toEqual('YES'); + + input('value1').check(); + input('value2').check(); + expect(binding('value1')).toEqual('false'); + expect(binding('value2')).toEqual('NO'); + }); + +
                  + */ + 'checkbox': checkboxInputType, + + 'hidden': noop, + 'button': noop, + 'submit': noop, + 'reset': noop +}; + +// A helper function to call $setValidity and return the value / undefined, +// a pattern that is repeated a lot in the input validation logic. +function validate(ctrl, validatorName, validity, value){ + ctrl.$setValidity(validatorName, validity); + return validity ? value : undefined; +} + +function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { + // In composition mode, users are still inputing intermediate text buffer, + // hold the listener until composition is done. + // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent + if (!$sniffer.android) { + var composing = false; + + element.on('compositionstart', function(data) { + composing = true; + }); + + element.on('compositionend', function() { + composing = false; + }); + } + + var listener = function() { + if (composing) return; + var value = element.val(); + + // By default we will trim the value + // If the attribute ng-trim exists we will avoid trimming + // e.g. + if (toBoolean(attr.ngTrim || 'T')) { + value = trim(value); + } + + if (ctrl.$viewValue !== value) { + if (scope.$$phase) { + ctrl.$setViewValue(value); + } else { + scope.$apply(function() { + ctrl.$setViewValue(value); + }); + } + } + }; + + // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the + // input event on backspace, delete or cut + if ($sniffer.hasEvent('input')) { + element.on('input', listener); + } else { + var timeout; + + var deferListener = function() { + if (!timeout) { + timeout = $browser.defer(function() { + listener(); + timeout = null; + }); + } + }; + + element.on('keydown', function(event) { + var key = event.keyCode; + + // ignore + // command modifiers arrows + if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return; + + deferListener(); + }); + + // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it + if ($sniffer.hasEvent('paste')) { + element.on('paste cut', deferListener); + } + } + + // if user paste into input using mouse on older browser + // or form autocomplete on newer browser, we need "change" event to catch it + element.on('change', listener); + + ctrl.$render = function() { + element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue); + }; + + // pattern validator + var pattern = attr.ngPattern, + patternValidator, + match; + + if (pattern) { + var validateRegex = function(regexp, value) { + return validate(ctrl, 'pattern', ctrl.$isEmpty(value) || regexp.test(value), value); + }; + match = pattern.match(/^\/(.*)\/([gim]*)$/); + if (match) { + pattern = new RegExp(match[1], match[2]); + patternValidator = function(value) { + return validateRegex(pattern, value); + }; + } else { + patternValidator = function(value) { + var patternObj = scope.$eval(pattern); + + if (!patternObj || !patternObj.test) { + throw minErr('ngPattern')('noregexp', + 'Expected {0} to be a RegExp but was {1}. Element: {2}', pattern, + patternObj, startingTag(element)); + } + return validateRegex(patternObj, value); + }; + } + + ctrl.$formatters.push(patternValidator); + ctrl.$parsers.push(patternValidator); + } + + // min length validator + if (attr.ngMinlength) { + var minlength = int(attr.ngMinlength); + var minLengthValidator = function(value) { + return validate(ctrl, 'minlength', ctrl.$isEmpty(value) || value.length >= minlength, value); + }; + + ctrl.$parsers.push(minLengthValidator); + ctrl.$formatters.push(minLengthValidator); + } + + // max length validator + if (attr.ngMaxlength) { + var maxlength = int(attr.ngMaxlength); + var maxLengthValidator = function(value) { + return validate(ctrl, 'maxlength', ctrl.$isEmpty(value) || value.length <= maxlength, value); + }; + + ctrl.$parsers.push(maxLengthValidator); + ctrl.$formatters.push(maxLengthValidator); + } +} + +function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { + textInputType(scope, element, attr, ctrl, $sniffer, $browser); + + ctrl.$parsers.push(function(value) { + var empty = ctrl.$isEmpty(value); + if (empty || NUMBER_REGEXP.test(value)) { + ctrl.$setValidity('number', true); + return value === '' ? null : (empty ? value : parseFloat(value)); + } else { + ctrl.$setValidity('number', false); + return undefined; + } + }); + + ctrl.$formatters.push(function(value) { + return ctrl.$isEmpty(value) ? '' : '' + value; + }); + + if (attr.min) { + var minValidator = function(value) { + var min = parseFloat(attr.min); + return validate(ctrl, 'min', ctrl.$isEmpty(value) || value >= min, value); + }; + + ctrl.$parsers.push(minValidator); + ctrl.$formatters.push(minValidator); + } + + if (attr.max) { + var maxValidator = function(value) { + var max = parseFloat(attr.max); + return validate(ctrl, 'max', ctrl.$isEmpty(value) || value <= max, value); + }; + + ctrl.$parsers.push(maxValidator); + ctrl.$formatters.push(maxValidator); + } + + ctrl.$formatters.push(function(value) { + return validate(ctrl, 'number', ctrl.$isEmpty(value) || isNumber(value), value); + }); +} + +function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { + textInputType(scope, element, attr, ctrl, $sniffer, $browser); + + var urlValidator = function(value) { + return validate(ctrl, 'url', ctrl.$isEmpty(value) || URL_REGEXP.test(value), value); + }; + + ctrl.$formatters.push(urlValidator); + ctrl.$parsers.push(urlValidator); +} + +function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) { + textInputType(scope, element, attr, ctrl, $sniffer, $browser); + + var emailValidator = function(value) { + return validate(ctrl, 'email', ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value), value); + }; + + ctrl.$formatters.push(emailValidator); + ctrl.$parsers.push(emailValidator); +} + +function radioInputType(scope, element, attr, ctrl) { + // make the name unique, if not defined + if (isUndefined(attr.name)) { + element.attr('name', nextUid()); + } + + element.on('click', function() { + if (element[0].checked) { + scope.$apply(function() { + ctrl.$setViewValue(attr.value); + }); + } + }); + + ctrl.$render = function() { + var value = attr.value; + element[0].checked = (value == ctrl.$viewValue); + }; + + attr.$observe('value', ctrl.$render); +} + +function checkboxInputType(scope, element, attr, ctrl) { + var trueValue = attr.ngTrueValue, + falseValue = attr.ngFalseValue; + + if (!isString(trueValue)) trueValue = true; + if (!isString(falseValue)) falseValue = false; + + element.on('click', function() { + scope.$apply(function() { + ctrl.$setViewValue(element[0].checked); + }); + }); + + ctrl.$render = function() { + element[0].checked = ctrl.$viewValue; + }; + + // Override the standard `$isEmpty` because a value of `false` means empty in a checkbox. + ctrl.$isEmpty = function(value) { + return value !== trueValue; + }; + + ctrl.$formatters.push(function(value) { + return value === trueValue; + }); + + ctrl.$parsers.push(function(value) { + return value ? trueValue : falseValue; + }); +} + + +/** + * @ngdoc directive + * @name ng.directive:textarea + * @restrict E + * + * @description + * HTML textarea element control with angular data-binding. The data-binding and validation + * properties of this element are exactly the same as those of the + * {@link ng.directive:input input element}. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for + * patterns defined as scope expressions. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + */ + + +/** + * @ngdoc directive + * @name ng.directive:input + * @restrict E + * + * @description + * HTML input element control with angular data-binding. Input control follows HTML5 input types + * and polyfills the HTML5 validation behavior for older browsers. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {boolean=} ngRequired Sets `required` attribute if set to true + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for + * patterns defined as scope expressions. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
                  +
                  + User name: + + Required!
                  + Last name: + + Too short! + + Too long!
                  +
                  +
                  + user = {{user}}
                  + myForm.userName.$valid = {{myForm.userName.$valid}}
                  + myForm.userName.$error = {{myForm.userName.$error}}
                  + myForm.lastName.$valid = {{myForm.lastName.$valid}}
                  + myForm.lastName.$error = {{myForm.lastName.$error}}
                  + myForm.$valid = {{myForm.$valid}}
                  + myForm.$error.required = {{!!myForm.$error.required}}
                  + myForm.$error.minlength = {{!!myForm.$error.minlength}}
                  + myForm.$error.maxlength = {{!!myForm.$error.maxlength}}
                  +
                  +
                  + + it('should initialize to model', function() { + expect(binding('user')).toEqual('{"name":"guest","last":"visitor"}'); + expect(binding('myForm.userName.$valid')).toEqual('true'); + expect(binding('myForm.$valid')).toEqual('true'); + }); + + it('should be invalid if empty when required', function() { + input('user.name').enter(''); + expect(binding('user')).toEqual('{"last":"visitor"}'); + expect(binding('myForm.userName.$valid')).toEqual('false'); + expect(binding('myForm.$valid')).toEqual('false'); + }); + + it('should be valid if empty when min length is set', function() { + input('user.last').enter(''); + expect(binding('user')).toEqual('{"name":"guest","last":""}'); + expect(binding('myForm.lastName.$valid')).toEqual('true'); + expect(binding('myForm.$valid')).toEqual('true'); + }); + + it('should be invalid if less than required min length', function() { + input('user.last').enter('xx'); + expect(binding('user')).toEqual('{"name":"guest"}'); + expect(binding('myForm.lastName.$valid')).toEqual('false'); + expect(binding('myForm.lastName.$error')).toMatch(/minlength/); + expect(binding('myForm.$valid')).toEqual('false'); + }); + + it('should be invalid if longer than max length', function() { + input('user.last').enter('some ridiculously long name'); + expect(binding('user')) + .toEqual('{"name":"guest"}'); + expect(binding('myForm.lastName.$valid')).toEqual('false'); + expect(binding('myForm.lastName.$error')).toMatch(/maxlength/); + expect(binding('myForm.$valid')).toEqual('false'); + }); + +
                  + */ +var inputDirective = ['$browser', '$sniffer', function($browser, $sniffer) { + return { + restrict: 'E', + require: '?ngModel', + link: function(scope, element, attr, ctrl) { + if (ctrl) { + (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrl, $sniffer, + $browser); + } + } + }; +}]; + +var VALID_CLASS = 'ng-valid', + INVALID_CLASS = 'ng-invalid', + PRISTINE_CLASS = 'ng-pristine', + DIRTY_CLASS = 'ng-dirty'; + +/** + * @ngdoc object + * @name ng.directive:ngModel.NgModelController + * + * @property {string} $viewValue Actual string value in the view. + * @property {*} $modelValue The value in the model, that the control is bound to. + * @property {Array.} $parsers Array of functions to execute, as a pipeline, whenever + the control reads value from the DOM. Each function is called, in turn, passing the value + through to the next. Used to sanitize / convert the value as well as validation. + For validation, the parsers should update the validity state using + {@link ng.directive:ngModel.NgModelController#methods_$setValidity $setValidity()}, + and return `undefined` for invalid values. + + * + * @property {Array.} $formatters Array of functions to execute, as a pipeline, whenever + the model value changes. Each function is called, in turn, passing the value through to the + next. Used to format / convert values for display in the control and validation. + *
                  + *      function formatter(value) {
                  + *        if (value) {
                  + *          return value.toUpperCase();
                  + *        }
                  + *      }
                  + *      ngModel.$formatters.push(formatter);
                  + *      
                  + * + * @property {Array.} $viewChangeListeners Array of functions to execute whenever the + * view value has changed. It is called with no arguments, and its return value is ignored. + * This can be used in place of additional $watches against the model value. + * + * @property {Object} $error An object hash with all errors as keys. + * + * @property {boolean} $pristine True if user has not interacted with the control yet. + * @property {boolean} $dirty True if user has already interacted with the control. + * @property {boolean} $valid True if there is no error. + * @property {boolean} $invalid True if at least one error on the control. + * + * @description + * + * `NgModelController` provides API for the `ng-model` directive. The controller contains + * services for data-binding, validation, CSS updates, and value formatting and parsing. It + * purposefully does not contain any logic which deals with DOM rendering or listening to + * DOM events. Such DOM related logic should be provided by other directives which make use of + * `NgModelController` for data-binding. + * + * ## Custom Control Example + * This example shows how to use `NgModelController` with a custom control to achieve + * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`) + * collaborate together to achieve the desired result. + * + * Note that `contenteditable` is an HTML5 attribute, which tells the browser to let the element + * contents be edited in place by the user. This will not work on older browsers. + * + * + + [contenteditable] { + border: 1px solid black; + background-color: white; + min-height: 20px; + } + + .ng-invalid { + border: 1px solid red; + } + + + + angular.module('customControl', []). + directive('contenteditable', function() { + return { + restrict: 'A', // only activate on element attribute + require: '?ngModel', // get a hold of NgModelController + link: function(scope, element, attrs, ngModel) { + if(!ngModel) return; // do nothing if no ng-model + + // Specify how UI should be updated + ngModel.$render = function() { + element.html(ngModel.$viewValue || ''); + }; + + // Listen for change events to enable binding + element.on('blur keyup change', function() { + scope.$apply(read); + }); + read(); // initialize + + // Write data to the model + function read() { + var html = element.html(); + // When we clear the content editable the browser leaves a
                  behind + // If strip-br attribute is provided then we strip this out + if( attrs.stripBr && html == '
                  ' ) { + html = ''; + } + ngModel.$setViewValue(html); + } + } + }; + }); +
                  + +
                  +
                  Change me!
                  + Required! +
                  + +
                  +
                  + + it('should data-bind and become invalid', function() { + var contentEditable = element('[contenteditable]'); + + expect(contentEditable.text()).toEqual('Change me!'); + input('userContent').enter(''); + expect(contentEditable.text()).toEqual(''); + expect(contentEditable.prop('className')).toMatch(/ng-invalid-required/); + }); + + *
                  + * + * + */ +var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', + function($scope, $exceptionHandler, $attr, $element, $parse) { + this.$viewValue = Number.NaN; + this.$modelValue = Number.NaN; + this.$parsers = []; + this.$formatters = []; + this.$viewChangeListeners = []; + this.$pristine = true; + this.$dirty = false; + this.$valid = true; + this.$invalid = false; + this.$name = $attr.name; + + var ngModelGet = $parse($attr.ngModel), + ngModelSet = ngModelGet.assign; + + if (!ngModelSet) { + throw minErr('ngModel')('nonassign', "Expression '{0}' is non-assignable. Element: {1}", + $attr.ngModel, startingTag($element)); + } + + /** + * @ngdoc function + * @name ng.directive:ngModel.NgModelController#$render + * @methodOf ng.directive:ngModel.NgModelController + * + * @description + * Called when the view needs to be updated. It is expected that the user of the ng-model + * directive will implement this method. + */ + this.$render = noop; + + /** + * @ngdoc function + * @name { ng.directive:ngModel.NgModelController#$isEmpty + * @methodOf ng.directive:ngModel.NgModelController + * + * @description + * This is called when we need to determine if the value of the input is empty. + * + * For instance, the required directive does this to work out if the input has data or not. + * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`. + * + * You can override this for input directives whose concept of being empty is different to the + * default. The `checkboxInputType` directive does this because in its case a value of `false` + * implies empty. + */ + this.$isEmpty = function(value) { + return isUndefined(value) || value === '' || value === null || value !== value; + }; + + var parentForm = $element.inheritedData('$formController') || nullFormCtrl, + invalidCount = 0, // used to easily determine if we are valid + $error = this.$error = {}; // keep invalid keys here + + + // Setup initial state of the control + $element.addClass(PRISTINE_CLASS); + toggleValidCss(true); + + // convenience method for easy toggling of classes + function toggleValidCss(isValid, validationErrorKey) { + validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : ''; + $element. + removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey). + addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey); + } + + /** + * @ngdoc function + * @name ng.directive:ngModel.NgModelController#$setValidity + * @methodOf ng.directive:ngModel.NgModelController + * + * @description + * Change the validity state, and notifies the form when the control changes validity. (i.e. it + * does not notify form if given validator is already marked as invalid). + * + * This method should be called by validators - i.e. the parser or formatter functions. + * + * @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign + * to `$error[validationErrorKey]=isValid` so that it is available for data-binding. + * The `validationErrorKey` should be in camelCase and will get converted into dash-case + * for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error` + * class and can be bound to as `{{someForm.someControl.$error.myError}}` . + * @param {boolean} isValid Whether the current state is valid (true) or invalid (false). + */ + this.$setValidity = function(validationErrorKey, isValid) { + // Purposeful use of ! here to cast isValid to boolean in case it is undefined + // jshint -W018 + if ($error[validationErrorKey] === !isValid) return; + // jshint +W018 + + if (isValid) { + if ($error[validationErrorKey]) invalidCount--; + if (!invalidCount) { + toggleValidCss(true); + this.$valid = true; + this.$invalid = false; + } + } else { + toggleValidCss(false); + this.$invalid = true; + this.$valid = false; + invalidCount++; + } + + $error[validationErrorKey] = !isValid; + toggleValidCss(isValid, validationErrorKey); + + parentForm.$setValidity(validationErrorKey, isValid, this); + }; + + /** + * @ngdoc function + * @name ng.directive:ngModel.NgModelController#$setPristine + * @methodOf ng.directive:ngModel.NgModelController + * + * @description + * Sets the control to its pristine state. + * + * This method can be called to remove the 'ng-dirty' class and set the control to its pristine + * state (ng-pristine class). + */ + this.$setPristine = function () { + this.$dirty = false; + this.$pristine = true; + $element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS); + }; + + /** + * @ngdoc function + * @name ng.directive:ngModel.NgModelController#$setViewValue + * @methodOf ng.directive:ngModel.NgModelController + * + * @description + * Update the view value. + * + * This method should be called when the view value changes, typically from within a DOM event handler. + * For example {@link ng.directive:input input} and + * {@link ng.directive:select select} directives call it. + * + * It will update the $viewValue, then pass this value through each of the functions in `$parsers`, + * which includes any validators. The value that comes out of this `$parsers` pipeline, be applied to + * `$modelValue` and the **expression** specified in the `ng-model` attribute. + * + * Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called. + * + * Note that calling this function does not trigger a `$digest`. + * + * @param {string} value Value from the view. + */ + this.$setViewValue = function(value) { + this.$viewValue = value; + + // change to dirty + if (this.$pristine) { + this.$dirty = true; + this.$pristine = false; + $element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS); + parentForm.$setDirty(); + } + + forEach(this.$parsers, function(fn) { + value = fn(value); + }); + + if (this.$modelValue !== value) { + this.$modelValue = value; + ngModelSet($scope, value); + forEach(this.$viewChangeListeners, function(listener) { + try { + listener(); + } catch(e) { + $exceptionHandler(e); + } + }); + } + }; + + // model -> value + var ctrl = this; + + $scope.$watch(function ngModelWatch() { + var value = ngModelGet($scope); + + // if scope model value and ngModel value are out of sync + if (ctrl.$modelValue !== value) { + + var formatters = ctrl.$formatters, + idx = formatters.length; + + ctrl.$modelValue = value; + while(idx--) { + value = formatters[idx](value); + } + + if (ctrl.$viewValue !== value) { + ctrl.$viewValue = value; + ctrl.$render(); + } + } + + return value; + }); +}]; + + +/** + * @ngdoc directive + * @name ng.directive:ngModel + * + * @element input + * + * @description + * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a + * property on the scope using {@link ng.directive:ngModel.NgModelController NgModelController}, + * which is created and exposed by this directive. + * + * `ngModel` is responsible for: + * + * - Binding the view into the model, which other directives such as `input`, `textarea` or `select` + * require. + * - Providing validation behavior (i.e. required, number, email, url). + * - Keeping the state of the control (valid/invalid, dirty/pristine, validation errors). + * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`). + * - Registering the control with its parent {@link ng.directive:form form}. + * + * Note: `ngModel` will try to bind to the property given by evaluating the expression on the + * current scope. If the property doesn't already exist on this scope, it will be created + * implicitly and added to the scope. + * + * For best practices on using `ngModel`, see: + * + * - {@link https://github.com/angular/angular.js/wiki/Understanding-Scopes} + * + * For basic examples, how to use `ngModel`, see: + * + * - {@link ng.directive:input input} + * - {@link ng.directive:input.text text} + * - {@link ng.directive:input.checkbox checkbox} + * - {@link ng.directive:input.radio radio} + * - {@link ng.directive:input.number number} + * - {@link ng.directive:input.email email} + * - {@link ng.directive:input.url url} + * - {@link ng.directive:select select} + * - {@link ng.directive:textarea textarea} + * + */ +var ngModelDirective = function() { + return { + require: ['ngModel', '^?form'], + controller: NgModelController, + link: function(scope, element, attr, ctrls) { + // notify others, especially parent forms + + var modelCtrl = ctrls[0], + formCtrl = ctrls[1] || nullFormCtrl; + + formCtrl.$addControl(modelCtrl); + + scope.$on('$destroy', function() { + formCtrl.$removeControl(modelCtrl); + }); + } + }; +}; + + +/** + * @ngdoc directive + * @name ng.directive:ngChange + * + * @description + * Evaluate given expression when user changes the input. + * The expression is not evaluated when the value change is coming from the model. + * + * Note, this directive requires `ngModel` to be present. + * + * @element input + * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change + * in input value. + * + * @example + * + * + * + *
                  + * + * + *
                  + * debug = {{confirmed}}
                  + * counter = {{counter}} + *
                  + *
                  + * + * it('should evaluate the expression if changing from view', function() { + * expect(binding('counter')).toEqual('0'); + * element('#ng-change-example1').click(); + * expect(binding('counter')).toEqual('1'); + * expect(binding('confirmed')).toEqual('true'); + * }); + * + * it('should not evaluate the expression if changing from model', function() { + * element('#ng-change-example2').click(); + * expect(binding('counter')).toEqual('0'); + * expect(binding('confirmed')).toEqual('true'); + * }); + * + *
                  + */ +var ngChangeDirective = valueFn({ + require: 'ngModel', + link: function(scope, element, attr, ctrl) { + ctrl.$viewChangeListeners.push(function() { + scope.$eval(attr.ngChange); + }); + } +}); + + +var requiredDirective = function() { + return { + require: '?ngModel', + link: function(scope, elm, attr, ctrl) { + if (!ctrl) return; + attr.required = true; // force truthy in case we are on non input element + + var validator = function(value) { + if (attr.required && ctrl.$isEmpty(value)) { + ctrl.$setValidity('required', false); + return; + } else { + ctrl.$setValidity('required', true); + return value; + } + }; + + ctrl.$formatters.push(validator); + ctrl.$parsers.unshift(validator); + + attr.$observe('required', function() { + validator(ctrl.$viewValue); + }); + } + }; +}; + + +/** + * @ngdoc directive + * @name ng.directive:ngList + * + * @description + * Text input that converts between a delimited string and an array of strings. The delimiter + * can be a fixed string (by default a comma) or a regular expression. + * + * @element input + * @param {string=} ngList optional delimiter that should be used to split the value. If + * specified in form `/something/` then the value will be converted into a regular expression. + * + * @example + + + +
                  + List: + + Required! +
                  + names = {{names}}
                  + myForm.namesInput.$valid = {{myForm.namesInput.$valid}}
                  + myForm.namesInput.$error = {{myForm.namesInput.$error}}
                  + myForm.$valid = {{myForm.$valid}}
                  + myForm.$error.required = {{!!myForm.$error.required}}
                  +
                  +
                  + + it('should initialize to model', function() { + expect(binding('names')).toEqual('["igor","misko","vojta"]'); + expect(binding('myForm.namesInput.$valid')).toEqual('true'); + expect(element('span.error').css('display')).toBe('none'); + }); + + it('should be invalid if empty', function() { + input('names').enter(''); + expect(binding('names')).toEqual(''); + expect(binding('myForm.namesInput.$valid')).toEqual('false'); + expect(element('span.error').css('display')).not().toBe('none'); + }); + +
                  + */ +var ngListDirective = function() { + return { + require: 'ngModel', + link: function(scope, element, attr, ctrl) { + var match = /\/(.*)\//.exec(attr.ngList), + separator = match && new RegExp(match[1]) || attr.ngList || ','; + + var parse = function(viewValue) { + // If the viewValue is invalid (say required but empty) it will be `undefined` + if (isUndefined(viewValue)) return; + + var list = []; + + if (viewValue) { + forEach(viewValue.split(separator), function(value) { + if (value) list.push(trim(value)); + }); + } + + return list; + }; + + ctrl.$parsers.push(parse); + ctrl.$formatters.push(function(value) { + if (isArray(value)) { + return value.join(', '); + } + + return undefined; + }); + + // Override the standard $isEmpty because an empty array means the input is empty. + ctrl.$isEmpty = function(value) { + return !value || !value.length; + }; + } + }; +}; + + +var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; +/** + * @ngdoc directive + * @name ng.directive:ngValue + * + * @description + * Binds the given expression to the value of `input[select]` or `input[radio]`, so + * that when the element is selected, the `ngModel` of that element is set to the + * bound value. + * + * `ngValue` is useful when dynamically generating lists of radio buttons using `ng-repeat`, as + * shown below. + * + * @element input + * @param {string=} ngValue angular expression, whose value will be bound to the `value` attribute + * of the `input` element + * + * @example + + + +
                  +

                  Which is your favorite?

                  + +
                  You chose {{my.favorite}}
                  +
                  +
                  + + it('should initialize to model', function() { + expect(binding('my.favorite')).toEqual('unicorns'); + }); + it('should bind the values to the inputs', function() { + input('my.favorite').select('pizza'); + expect(binding('my.favorite')).toEqual('pizza'); + }); + +
                  + */ +var ngValueDirective = function() { + return { + priority: 100, + compile: function(tpl, tplAttr) { + if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) { + return function ngValueConstantLink(scope, elm, attr) { + attr.$set('value', scope.$eval(attr.ngValue)); + }; + } else { + return function ngValueLink(scope, elm, attr) { + scope.$watch(attr.ngValue, function valueWatchAction(value) { + attr.$set('value', value); + }); + }; + } + } + }; +}; + +/** + * @ngdoc directive + * @name ng.directive:ngBind + * @restrict AC + * + * @description + * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element + * with the value of a given expression, and to update the text content when the value of that + * expression changes. + * + * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like + * `{{ expression }}` which is similar but less verbose. + * + * It is preferrable to use `ngBind` instead of `{{ expression }}` when a template is momentarily + * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an + * element attribute, it makes the bindings invisible to the user while the page is loading. + * + * An alternative solution to this problem would be using the + * {@link ng.directive:ngCloak ngCloak} directive. + * + * + * @element ANY + * @param {expression} ngBind {@link guide/expression Expression} to evaluate. + * + * @example + * Enter a name in the Live Preview text box; the greeting below the text box changes instantly. + + + +
                  + Enter name:
                  + Hello ! +
                  +
                  + + it('should check ng-bind', function() { + expect(using('.doc-example-live').binding('name')).toBe('Whirled'); + using('.doc-example-live').input('name').enter('world'); + expect(using('.doc-example-live').binding('name')).toBe('world'); + }); + +
                  + */ +var ngBindDirective = ngDirective(function(scope, element, attr) { + element.addClass('ng-binding').data('$binding', attr.ngBind); + scope.$watch(attr.ngBind, function ngBindWatchAction(value) { + // We are purposefully using == here rather than === because we want to + // catch when value is "null or undefined" + // jshint -W041 + element.text(value == undefined ? '' : value); + }); +}); + + +/** + * @ngdoc directive + * @name ng.directive:ngBindTemplate + * + * @description + * The `ngBindTemplate` directive specifies that the element + * text content should be replaced with the interpolation of the template + * in the `ngBindTemplate` attribute. + * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}` + * expressions. This directive is needed since some HTML elements + * (such as TITLE and OPTION) cannot contain SPAN elements. + * + * @element ANY + * @param {string} ngBindTemplate template of form + * {{ expression }} to eval. + * + * @example + * Try it here: enter text in text box and watch the greeting change. + + + +
                  + Salutation:
                  + Name:
                  +
                  
                  +       
                  +
                  + + it('should check ng-bind', function() { + expect(using('.doc-example-live').binding('salutation')). + toBe('Hello'); + expect(using('.doc-example-live').binding('name')). + toBe('World'); + using('.doc-example-live').input('salutation').enter('Greetings'); + using('.doc-example-live').input('name').enter('user'); + expect(using('.doc-example-live').binding('salutation')). + toBe('Greetings'); + expect(using('.doc-example-live').binding('name')). + toBe('user'); + }); + +
                  + */ +var ngBindTemplateDirective = ['$interpolate', function($interpolate) { + return function(scope, element, attr) { + // TODO: move this to scenario runner + var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate)); + element.addClass('ng-binding').data('$binding', interpolateFn); + attr.$observe('ngBindTemplate', function(value) { + element.text(value); + }); + }; +}]; + + +/** + * @ngdoc directive + * @name ng.directive:ngBindHtml + * + * @description + * Creates a binding that will innerHTML the result of evaluating the `expression` into the current + * element in a secure way. By default, the innerHTML-ed content will be sanitized using the {@link + * ngSanitize.$sanitize $sanitize} service. To utilize this functionality, ensure that `$sanitize` + * is available, for example, by including {@link ngSanitize} in your module's dependencies (not in + * core Angular.) You may also bypass sanitization for values you know are safe. To do so, bind to + * an explicitly trusted value via {@link ng.$sce#methods_trustAsHtml $sce.trustAsHtml}. See the example + * under {@link ng.$sce#Example Strict Contextual Escaping (SCE)}. + * + * Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you + * will have an exception (instead of an exploit.) + * + * @element ANY + * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate. + * + * @example + Try it here: enter text in text box and watch the greeting change. + + + +
                  +

                  +
                  +
                  + + + angular.module('ngBindHtmlExample', ['ngSanitize']) + + .controller('ngBindHtmlCtrl', ['$scope', function ngBindHtmlCtrl($scope) { + $scope.myHTML = + 'I am an HTMLstring with links! and other stuff'; + }]); + + + + it('should check ng-bind-html', function() { + expect(using('.doc-example-live').binding('myHTML')). + toBe( + 'I am an HTMLstring with links! and other stuff' + ); + }); + +
                  + */ +var ngBindHtmlDirective = ['$sce', '$parse', function($sce, $parse) { + return function(scope, element, attr) { + element.addClass('ng-binding').data('$binding', attr.ngBindHtml); + + var parsed = $parse(attr.ngBindHtml); + function getStringValue() { return (parsed(scope) || '').toString(); } + + scope.$watch(getStringValue, function ngBindHtmlWatchAction(value) { + element.html($sce.getTrustedHtml(parsed(scope)) || ''); + }); + }; +}]; + +function classDirective(name, selector) { + name = 'ngClass' + name; + return function() { + return { + restrict: 'AC', + link: function(scope, element, attr) { + var oldVal; + + scope.$watch(attr[name], ngClassWatchAction, true); + + attr.$observe('class', function(value) { + ngClassWatchAction(scope.$eval(attr[name])); + }); + + + if (name !== 'ngClass') { + scope.$watch('$index', function($index, old$index) { + // jshint bitwise: false + var mod = $index & 1; + if (mod !== old$index & 1) { + var classes = flattenClasses(scope.$eval(attr[name])); + mod === selector ? + attr.$addClass(classes) : + attr.$removeClass(classes); + } + }); + } + + + function ngClassWatchAction(newVal) { + if (selector === true || scope.$index % 2 === selector) { + var newClasses = flattenClasses(newVal || ''); + if(!oldVal) { + attr.$addClass(newClasses); + } else if(!equals(newVal,oldVal)) { + attr.$updateClass(newClasses, flattenClasses(oldVal)); + } + } + oldVal = copy(newVal); + } + + + function flattenClasses(classVal) { + if(isArray(classVal)) { + return classVal.join(' '); + } else if (isObject(classVal)) { + var classes = [], i = 0; + forEach(classVal, function(v, k) { + if (v) { + classes.push(k); + } + }); + return classes.join(' '); + } + + return classVal; + } + } + }; + }; +} + +/** + * @ngdoc directive + * @name ng.directive:ngClass + * @restrict AC + * + * @description + * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding + * an expression that represents all classes to be added. + * + * The directive won't add duplicate classes if a particular class was already set. + * + * When the expression changes, the previously added classes are removed and only then the + * new classes are added. + * + * @animations + * add - happens just before the class is applied to the element + * remove - happens just before the class is removed from the element + * + * @element ANY + * @param {expression} ngClass {@link guide/expression Expression} to eval. The result + * of the evaluation can be a string representing space delimited class + * names, an array, or a map of class names to boolean values. In the case of a map, the + * names of the properties whose values are truthy will be added as css classes to the + * element. + * + * @example Example that demonstrates basic bindings via ngClass directive. + + +

                  Map Syntax Example

                  + deleted (apply "strike" class)
                  + important (apply "bold" class)
                  + error (apply "red" class) +
                  +

                  Using String Syntax

                  + +
                  +

                  Using Array Syntax

                  +
                  +
                  +
                  +
                  + + .strike { + text-decoration: line-through; + } + .bold { + font-weight: bold; + } + .red { + color: red; + } + + + it('should let you toggle the class', function() { + + expect(element('.doc-example-live p:first').prop('className')).not().toMatch(/bold/); + expect(element('.doc-example-live p:first').prop('className')).not().toMatch(/red/); + + input('important').check(); + expect(element('.doc-example-live p:first').prop('className')).toMatch(/bold/); + + input('error').check(); + expect(element('.doc-example-live p:first').prop('className')).toMatch(/red/); + }); + + it('should let you toggle string example', function() { + expect(element('.doc-example-live p:nth-of-type(2)').prop('className')).toBe(''); + input('style').enter('red'); + expect(element('.doc-example-live p:nth-of-type(2)').prop('className')).toBe('red'); + }); + + it('array example should have 3 classes', function() { + expect(element('.doc-example-live p:last').prop('className')).toBe(''); + input('style1').enter('bold'); + input('style2').enter('strike'); + input('style3').enter('red'); + expect(element('.doc-example-live p:last').prop('className')).toBe('bold strike red'); + }); + +
                  + + ## Animations + + The example below demonstrates how to perform animations using ngClass. + + + + + +
                  + Sample Text +
                  + + .base-class { + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + } + + .base-class.my-class { + color: red; + font-size:3em; + } + + + it('should check ng-class', function() { + expect(element('.doc-example-live span').prop('className')).not(). + toMatch(/my-class/); + + using('.doc-example-live').element(':button:first').click(); + + expect(element('.doc-example-live span').prop('className')). + toMatch(/my-class/); + + using('.doc-example-live').element(':button:last').click(); + + expect(element('.doc-example-live span').prop('className')).not(). + toMatch(/my-class/); + }); + +
                  + + + ## ngClass and pre-existing CSS3 Transitions/Animations + The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure. + Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder + any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure + to view the step by step details of {@link ngAnimate.$animate#methods_addclass $animate.addClass} and + {@link ngAnimate.$animate#methods_removeclass $animate.removeClass}. + */ +var ngClassDirective = classDirective('', true); + +/** + * @ngdoc directive + * @name ng.directive:ngClassOdd + * @restrict AC + * + * @description + * The `ngClassOdd` and `ngClassEven` directives work exactly as + * {@link ng.directive:ngClass ngClass}, except they work in + * conjunction with `ngRepeat` and take effect only on odd (even) rows. + * + * This directive can be applied only within the scope of an + * {@link ng.directive:ngRepeat ngRepeat}. + * + * @element ANY + * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result + * of the evaluation can be a string representing space delimited class names or an array. + * + * @example + + +
                    +
                  1. + + {{name}} + +
                  2. +
                  +
                  + + .odd { + color: red; + } + .even { + color: blue; + } + + + it('should check ng-class-odd and ng-class-even', function() { + expect(element('.doc-example-live li:first span').prop('className')). + toMatch(/odd/); + expect(element('.doc-example-live li:last span').prop('className')). + toMatch(/even/); + }); + +
                  + */ +var ngClassOddDirective = classDirective('Odd', 0); + +/** + * @ngdoc directive + * @name ng.directive:ngClassEven + * @restrict AC + * + * @description + * The `ngClassOdd` and `ngClassEven` directives work exactly as + * {@link ng.directive:ngClass ngClass}, except they work in + * conjunction with `ngRepeat` and take effect only on odd (even) rows. + * + * This directive can be applied only within the scope of an + * {@link ng.directive:ngRepeat ngRepeat}. + * + * @element ANY + * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The + * result of the evaluation can be a string representing space delimited class names or an array. + * + * @example + + +
                    +
                  1. + + {{name}}       + +
                  2. +
                  +
                  + + .odd { + color: red; + } + .even { + color: blue; + } + + + it('should check ng-class-odd and ng-class-even', function() { + expect(element('.doc-example-live li:first span').prop('className')). + toMatch(/odd/); + expect(element('.doc-example-live li:last span').prop('className')). + toMatch(/even/); + }); + +
                  + */ +var ngClassEvenDirective = classDirective('Even', 1); + +/** + * @ngdoc directive + * @name ng.directive:ngCloak + * @restrict AC + * + * @description + * The `ngCloak` directive is used to prevent the Angular html template from being briefly + * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this + * directive to avoid the undesirable flicker effect caused by the html template display. + * + * The directive can be applied to the `` element, but the preferred usage is to apply + * multiple `ngCloak` directives to small portions of the page to permit progressive rendering + * of the browser view. + * + * `ngCloak` works in cooperation with the following css rule embedded within `angular.js` and + * `angular.min.js`. + * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}). + * + *
                  + * [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
                  + *   display: none !important;
                  + * }
                  + * 
                  + * + * When this css rule is loaded by the browser, all html elements (including their children) that + * are tagged with the `ngCloak` directive are hidden. When Angular encounters this directive + * during the compilation of the template it deletes the `ngCloak` element attribute, making + * the compiled element visible. + * + * For the best result, the `angular.js` script must be loaded in the head section of the html + * document; alternatively, the css rule above must be included in the external stylesheet of the + * application. + * + * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they + * cannot match the `[ng\:cloak]` selector. To work around this limitation, you must add the css + * class `ng-cloak` in addition to the `ngCloak` directive as shown in the example below. + * + * @element ANY + * + * @example + + +
                  {{ 'hello' }}
                  +
                  {{ 'hello IE7' }}
                  +
                  + + it('should remove the template directive and css class', function() { + expect(element('.doc-example-live #template1').attr('ng-cloak')). + not().toBeDefined(); + expect(element('.doc-example-live #template2').attr('ng-cloak')). + not().toBeDefined(); + }); + +
                  + * + */ +var ngCloakDirective = ngDirective({ + compile: function(element, attr) { + attr.$set('ngCloak', undefined); + element.removeClass('ng-cloak'); + } +}); + +/** + * @ngdoc directive + * @name ng.directive:ngController + * + * @description + * The `ngController` directive attaches a controller class to the view. This is a key aspect of how angular + * supports the principles behind the Model-View-Controller design pattern. + * + * MVC components in angular: + * + * * Model — The Model is scope properties; scopes are attached to the DOM where scope properties + * are accessed through bindings. + * * View — The template (HTML with data bindings) that is rendered into the View. + * * Controller — The `ngController` directive specifies a Controller class; the class contains business + * logic behind the application to decorate the scope with functions and values + * + * Note that you can also attach controllers to the DOM by declaring it in a route definition + * via the {@link ngRoute.$route $route} service. A common mistake is to declare the controller + * again using `ng-controller` in the template itself. This will cause the controller to be attached + * and executed twice. + * + * @element ANY + * @scope + * @param {expression} ngController Name of a globally accessible constructor function or an + * {@link guide/expression expression} that on the current scope evaluates to a + * constructor function. The controller instance can be published into a scope property + * by specifying `as propertyName`. + * + * @example + * Here is a simple form for editing user contact information. Adding, removing, clearing, and + * greeting are methods declared on the controller (see source tab). These methods can + * easily be called from the angular markup. Notice that the scope becomes the `this` for the + * controller's instance. This allows for easy access to the view data from the controller. Also + * notice that any changes to the data are automatically reflected in the View without the need + * for a manual update. The example is shown in two different declaration styles you may use + * according to preference. + + + +
                  + Name: + [ greet ]
                  + Contact: +
                    +
                  • + + + [ clear + | X ] +
                  • +
                  • [ add ]
                  • +
                  +
                  +
                  + + it('should check controller as', function() { + expect(element('#ctrl-as-exmpl>:input').val()).toBe('John Smith'); + expect(element('#ctrl-as-exmpl li:nth-child(1) input').val()) + .toBe('408 555 1212'); + expect(element('#ctrl-as-exmpl li:nth-child(2) input').val()) + .toBe('john.smith@example.org'); + + element('#ctrl-as-exmpl li:first a:contains("clear")').click(); + expect(element('#ctrl-as-exmpl li:first input').val()).toBe(''); + + element('#ctrl-as-exmpl li:last a:contains("add")').click(); + expect(element('#ctrl-as-exmpl li:nth-child(3) input').val()) + .toBe('yourname@example.org'); + }); + +
                  + + + +
                  + Name: + [ greet ]
                  + Contact: +
                    +
                  • + + + [ clear + | X ] +
                  • +
                  • [ add ]
                  • +
                  +
                  +
                  + + it('should check controller', function() { + expect(element('#ctrl-exmpl>:input').val()).toBe('John Smith'); + expect(element('#ctrl-exmpl li:nth-child(1) input').val()) + .toBe('408 555 1212'); + expect(element('#ctrl-exmpl li:nth-child(2) input').val()) + .toBe('john.smith@example.org'); + + element('#ctrl-exmpl li:first a:contains("clear")').click(); + expect(element('#ctrl-exmpl li:first input').val()).toBe(''); + + element('#ctrl-exmpl li:last a:contains("add")').click(); + expect(element('#ctrl-exmpl li:nth-child(3) input').val()) + .toBe('yourname@example.org'); + }); + +
                  + + */ +var ngControllerDirective = [function() { + return { + scope: true, + controller: '@', + priority: 500 + }; +}]; + +/** + * @ngdoc directive + * @name ng.directive:ngCsp + * + * @element html + * @description + * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support. + * + * This is necessary when developing things like Google Chrome Extensions. + * + * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things). + * For us to be compatible, we just need to implement the "getterFn" in $parse without violating + * any of these restrictions. + * + * AngularJS uses `Function(string)` generated functions as a speed optimization. Applying the `ngCsp` + * directive will cause Angular to use CSP compatibility mode. When this mode is on AngularJS will + * evaluate all expressions up to 30% slower than in non-CSP mode, but no security violations will + * be raised. + * + * CSP forbids JavaScript to inline stylesheet rules. In non CSP mode Angular automatically + * includes some CSS rules (e.g. {@link ng.directive:ngCloak ngCloak}). + * To make those directives work in CSP mode, include the `angular-csp.css` manually. + * + * In order to use this feature put the `ngCsp` directive on the root element of the application. + * + * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.* + * + * @example + * This example shows how to apply the `ngCsp` directive to the `html` tag. +
                  +     
                  +     
                  +     ...
                  +     ...
                  +     
                  +   
                  + */ + +// ngCsp is not implemented as a proper directive any more, because we need it be processed while we bootstrap +// the system (before $parse is instantiated), for this reason we just have a csp() fn that looks for ng-csp attribute +// anywhere in the current doc + +/** + * @ngdoc directive + * @name ng.directive:ngClick + * + * @description + * The ngClick directive allows you to specify custom behavior when + * an element is clicked. + * + * @element ANY + * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon + * click. (Event object is available as `$event`) + * + * @example + + + + count: {{count}} + + + it('should check ng-click', function() { + expect(element(by.binding('count')).getText()).toMatch('0'); + element(by.css('.doc-example-live button')).click(); + expect(element(by.binding('count')).getText()).toMatch('1'); + }); + + + */ +/* + * A directive that allows creation of custom onclick handlers that are defined as angular + * expressions and are compiled and executed within the current scope. + * + * Events that are handled via these handler are always configured not to propagate further. + */ +var ngEventDirectives = {}; +forEach( + 'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '), + function(name) { + var directiveName = directiveNormalize('ng-' + name); + ngEventDirectives[directiveName] = ['$parse', function($parse) { + return { + compile: function($element, attr) { + var fn = $parse(attr[directiveName]); + return function(scope, element, attr) { + element.on(lowercase(name), function(event) { + scope.$apply(function() { + fn(scope, {$event:event}); + }); + }); + }; + } + }; + }]; + } +); + +/** + * @ngdoc directive + * @name ng.directive:ngDblclick + * + * @description + * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event. + * + * @element ANY + * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon + * a dblclick. (The Event object is available as `$event`) + * + * @example + + + + count: {{count}} + + + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngMousedown + * + * @description + * The ngMousedown directive allows you to specify custom behavior on mousedown event. + * + * @element ANY + * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon + * mousedown. (Event object is available as `$event`) + * + * @example + + + + count: {{count}} + + + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngMouseup + * + * @description + * Specify custom behavior on mouseup event. + * + * @element ANY + * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon + * mouseup. (Event object is available as `$event`) + * + * @example + + + + count: {{count}} + + + */ + +/** + * @ngdoc directive + * @name ng.directive:ngMouseover + * + * @description + * Specify custom behavior on mouseover event. + * + * @element ANY + * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon + * mouseover. (Event object is available as `$event`) + * + * @example + + + + count: {{count}} + + + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngMouseenter + * + * @description + * Specify custom behavior on mouseenter event. + * + * @element ANY + * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon + * mouseenter. (Event object is available as `$event`) + * + * @example + + + + count: {{count}} + + + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngMouseleave + * + * @description + * Specify custom behavior on mouseleave event. + * + * @element ANY + * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon + * mouseleave. (Event object is available as `$event`) + * + * @example + + + + count: {{count}} + + + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngMousemove + * + * @description + * Specify custom behavior on mousemove event. + * + * @element ANY + * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon + * mousemove. (Event object is available as `$event`) + * + * @example + + + + count: {{count}} + + + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngKeydown + * + * @description + * Specify custom behavior on keydown event. + * + * @element ANY + * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon + * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.) + * + * @example + + + + key down count: {{count}} + + + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngKeyup + * + * @description + * Specify custom behavior on keyup event. + * + * @element ANY + * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon + * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.) + * + * @example + + + + key up count: {{count}} + + + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngKeypress + * + * @description + * Specify custom behavior on keypress event. + * + * @element ANY + * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon + * keypress. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.) + * + * @example + + + + key press count: {{count}} + + + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngSubmit + * + * @description + * Enables binding angular expressions to onsubmit events. + * + * Additionally it prevents the default action (which for form means sending the request to the + * server and reloading the current page) **but only if the form does not contain an `action` + * attribute**. + * + * @element form + * @param {expression} ngSubmit {@link guide/expression Expression} to eval. (Event object is available as `$event`) + * + * @example + + + +
                  + Enter text and hit enter: + + +
                  list={{list}}
                  +
                  +
                  + + it('should check ng-submit', function() { + expect(binding('list')).toBe('[]'); + element('.doc-example-live #submit').click(); + expect(binding('list')).toBe('["hello"]'); + expect(input('text').val()).toBe(''); + }); + it('should ignore empty strings', function() { + expect(binding('list')).toBe('[]'); + element('.doc-example-live #submit').click(); + element('.doc-example-live #submit').click(); + expect(binding('list')).toBe('["hello"]'); + }); + +
                  + */ + +/** + * @ngdoc directive + * @name ng.directive:ngFocus + * + * @description + * Specify custom behavior on focus event. + * + * @element window, input, select, textarea, a + * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon + * focus. (Event object is available as `$event`) + * + * @example + * See {@link ng.directive:ngClick ngClick} + */ + +/** + * @ngdoc directive + * @name ng.directive:ngBlur + * + * @description + * Specify custom behavior on blur event. + * + * @element window, input, select, textarea, a + * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon + * blur. (Event object is available as `$event`) + * + * @example + * See {@link ng.directive:ngClick ngClick} + */ + +/** + * @ngdoc directive + * @name ng.directive:ngCopy + * + * @description + * Specify custom behavior on copy event. + * + * @element window, input, select, textarea, a + * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon + * copy. (Event object is available as `$event`) + * + * @example + + + + copied: {{copied}} + + + */ + +/** + * @ngdoc directive + * @name ng.directive:ngCut + * + * @description + * Specify custom behavior on cut event. + * + * @element window, input, select, textarea, a + * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon + * cut. (Event object is available as `$event`) + * + * @example + + + + cut: {{cut}} + + + */ + +/** + * @ngdoc directive + * @name ng.directive:ngPaste + * + * @description + * Specify custom behavior on paste event. + * + * @element window, input, select, textarea, a + * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon + * paste. (Event object is available as `$event`) + * + * @example + + + + pasted: {{paste}} + + + */ + +/** + * @ngdoc directive + * @name ng.directive:ngIf + * @restrict A + * + * @description + * The `ngIf` directive removes or recreates a portion of the DOM tree based on an + * {expression}. If the expression assigned to `ngIf` evaluates to a false + * value then the element is removed from the DOM, otherwise a clone of the + * element is reinserted into the DOM. + * + * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the + * element in the DOM rather than changing its visibility via the `display` css property. A common + * case when this difference is significant is when using css selectors that rely on an element's + * position within the DOM, such as the `:first-child` or `:last-child` pseudo-classes. + * + * Note that when an element is removed using `ngIf` its scope is destroyed and a new scope + * is created when the element is restored. The scope created within `ngIf` inherits from + * its parent scope using + * {@link https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance prototypal inheritance}. + * An important implication of this is if `ngModel` is used within `ngIf` to bind to + * a javascript primitive defined in the parent scope. In this case any modifications made to the + * variable within the child scope will override (hide) the value in the parent scope. + * + * Also, `ngIf` recreates elements using their compiled state. An example of this behavior + * is if an element's class attribute is directly modified after it's compiled, using something like + * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element + * the added class will be lost because the original compiled state is used to regenerate the element. + * + * Additionally, you can provide animations via the `ngAnimate` module to animate the `enter` + * and `leave` effects. + * + * @animations + * enter - happens just after the ngIf contents change and a new DOM element is created and injected into the ngIf container + * leave - happens just before the ngIf contents are removed from the DOM + * + * @element ANY + * @scope + * @priority 600 + * @param {expression} ngIf If the {@link guide/expression expression} is falsy then + * the element is removed from the DOM tree. If it is truthy a copy of the compiled + * element is added to the DOM tree. + * + * @example + + + Click me:
                  + Show when checked: + + I'm removed when the checkbox is unchecked. + +
                  + + .animate-if { + background:white; + border:1px solid black; + padding:10px; + } + + .animate-if.ng-enter, .animate-if.ng-leave { + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + } + + .animate-if.ng-enter, + .animate-if.ng-leave.ng-leave-active { + opacity:0; + } + + .animate-if.ng-leave, + .animate-if.ng-enter.ng-enter-active { + opacity:1; + } + +
                  + */ +var ngIfDirective = ['$animate', function($animate) { + return { + transclude: 'element', + priority: 600, + terminal: true, + restrict: 'A', + $$tlb: true, + link: function ($scope, $element, $attr, ctrl, $transclude) { + var block, childScope; + $scope.$watch($attr.ngIf, function ngIfWatchAction(value) { + + if (toBoolean(value)) { + if (!childScope) { + childScope = $scope.$new(); + $transclude(childScope, function (clone) { + clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' '); + // Note: We only need the first/last node of the cloned nodes. + // However, we need to keep the reference to the jqlite wrapper as it might be changed later + // by a directive with templateUrl when it's template arrives. + block = { + clone: clone + }; + $animate.enter(clone, $element.parent(), $element); + }); + } + } else { + + if (childScope) { + childScope.$destroy(); + childScope = null; + } + + if (block) { + $animate.leave(getBlockElements(block.clone)); + block = null; + } + } + }); + } + }; +}]; + +/** + * @ngdoc directive + * @name ng.directive:ngInclude + * @restrict ECA + * + * @description + * Fetches, compiles and includes an external HTML fragment. + * + * By default, the template URL is restricted to the same domain and protocol as the + * application document. This is done by calling {@link ng.$sce#methods_getTrustedResourceUrl + * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols + * you may either {@link ng.$sceDelegateProvider#methods_resourceUrlWhitelist whitelist them} or + * {@link ng.$sce#methods_trustAsResourceUrl wrap them} as trusted values. Refer to Angular's {@link + * ng.$sce Strict Contextual Escaping}. + * + * In addition, the browser's + * {@link https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest + * Same Origin Policy} and {@link http://www.w3.org/TR/cors/ Cross-Origin Resource Sharing + * (CORS)} policy may further restrict whether the template is successfully loaded. + * For example, `ngInclude` won't work for cross-domain requests on all browsers and for `file://` + * access on some browsers. + * + * @animations + * enter - animation is used to bring new content into the browser. + * leave - animation is used to animate existing content away. + * + * The enter and leave animation occur concurrently. + * + * @scope + * @priority 400 + * + * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant, + * make sure you wrap it in quotes, e.g. `src="'myPartialTemplate.html'"`. + * @param {string=} onload Expression to evaluate when a new partial is loaded. + * + * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll + * $anchorScroll} to scroll the viewport after the content is loaded. + * + * - If the attribute is not set, disable scrolling. + * - If the attribute is set without value, enable scrolling. + * - Otherwise enable scrolling only if the expression evaluates to truthy value. + * + * @example + + +
                  + + url of the template: {{template.url}} +
                  +
                  +
                  +
                  +
                  +
                  + + function Ctrl($scope) { + $scope.templates = + [ { name: 'template1.html', url: 'template1.html'} + , { name: 'template2.html', url: 'template2.html'} ]; + $scope.template = $scope.templates[0]; + } + + + Content of template1.html + + + Content of template2.html + + + .slide-animate-container { + position:relative; + background:white; + border:1px solid black; + height:40px; + overflow:hidden; + } + + .slide-animate { + padding:10px; + } + + .slide-animate.ng-enter, .slide-animate.ng-leave { + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + + position:absolute; + top:0; + left:0; + right:0; + bottom:0; + display:block; + padding:10px; + } + + .slide-animate.ng-enter { + top:-50px; + } + .slide-animate.ng-enter.ng-enter-active { + top:0; + } + + .slide-animate.ng-leave { + top:0; + } + .slide-animate.ng-leave.ng-leave-active { + top:50px; + } + + + it('should load template1.html', function() { + expect(element('.doc-example-live [ng-include]').text()). + toMatch(/Content of template1.html/); + }); + it('should load template2.html', function() { + select('template').option('1'); + expect(element('.doc-example-live [ng-include]').text()). + toMatch(/Content of template2.html/); + }); + it('should change to blank', function() { + select('template').option(''); + expect(element('.doc-example-live [ng-include]')).toBe(undefined); + }); + +
                  + */ + + +/** + * @ngdoc event + * @name ng.directive:ngInclude#$includeContentRequested + * @eventOf ng.directive:ngInclude + * @eventType emit on the scope ngInclude was declared in + * @description + * Emitted every time the ngInclude content is requested. + */ + + +/** + * @ngdoc event + * @name ng.directive:ngInclude#$includeContentLoaded + * @eventOf ng.directive:ngInclude + * @eventType emit on the current ngInclude scope + * @description + * Emitted every time the ngInclude content is reloaded. + */ +var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$animate', '$sce', + function($http, $templateCache, $anchorScroll, $animate, $sce) { + return { + restrict: 'ECA', + priority: 400, + terminal: true, + transclude: 'element', + controller: angular.noop, + compile: function(element, attr) { + var srcExp = attr.ngInclude || attr.src, + onloadExp = attr.onload || '', + autoScrollExp = attr.autoscroll; + + return function(scope, $element, $attr, ctrl, $transclude) { + var changeCounter = 0, + currentScope, + currentElement; + + var cleanupLastIncludeContent = function() { + if (currentScope) { + currentScope.$destroy(); + currentScope = null; + } + if(currentElement) { + $animate.leave(currentElement); + currentElement = null; + } + }; + + scope.$watch($sce.parseAsResourceUrl(srcExp), function ngIncludeWatchAction(src) { + var afterAnimation = function() { + if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) { + $anchorScroll(); + } + }; + var thisChangeId = ++changeCounter; + + if (src) { + $http.get(src, {cache: $templateCache}).success(function(response) { + if (thisChangeId !== changeCounter) return; + var newScope = scope.$new(); + ctrl.template = response; + + // Note: This will also link all children of ng-include that were contained in the original + // html. If that content contains controllers, ... they could pollute/change the scope. + // However, using ng-include on an element with additional content does not make sense... + // Note: We can't remove them in the cloneAttchFn of $transclude as that + // function is called before linking the content, which would apply child + // directives to non existing elements. + var clone = $transclude(newScope, function(clone) { + cleanupLastIncludeContent(); + $animate.enter(clone, null, $element, afterAnimation); + }); + + currentScope = newScope; + currentElement = clone; + + currentScope.$emit('$includeContentLoaded'); + scope.$eval(onloadExp); + }).error(function() { + if (thisChangeId === changeCounter) cleanupLastIncludeContent(); + }); + scope.$emit('$includeContentRequested'); + } else { + cleanupLastIncludeContent(); + ctrl.template = null; + } + }); + }; + } + }; +}]; + +// This directive is called during the $transclude call of the first `ngInclude` directive. +// It will replace and compile the content of the element with the loaded template. +// We need this directive so that the element content is already filled when +// the link function of another directive on the same element as ngInclude +// is called. +var ngIncludeFillContentDirective = ['$compile', + function($compile) { + return { + restrict: 'ECA', + priority: -400, + require: 'ngInclude', + link: function(scope, $element, $attr, ctrl) { + $element.html(ctrl.template); + $compile($element.contents())(scope); + } + }; + }]; + +/** + * @ngdoc directive + * @name ng.directive:ngInit + * @restrict AC + * + * @description + * The `ngInit` directive allows you to evaluate an expression in the + * current scope. + * + *
                  + * The only appropriate use of `ngInit` is for aliasing special properties of + * {@link api/ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below. Besides this case, you + * should use {@link guide/controller controllers} rather than `ngInit` + * to initialize values on a scope. + *
                  + * + * @priority 450 + * + * @element ANY + * @param {expression} ngInit {@link guide/expression Expression} to eval. + * + * @example + + + +
                  +
                  +
                  + list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}}; +
                  +
                  +
                  +
                  + + it('should alias index positions', function() { + expect(element('.example-init').text()) + .toBe('list[ 0 ][ 0 ] = a;' + + 'list[ 0 ][ 1 ] = b;' + + 'list[ 1 ][ 0 ] = c;' + + 'list[ 1 ][ 1 ] = d;'); + }); + +
                  + */ +var ngInitDirective = ngDirective({ + priority: 450, + compile: function() { + return { + pre: function(scope, element, attrs) { + scope.$eval(attrs.ngInit); + } + }; + } +}); + +/** + * @ngdoc directive + * @name ng.directive:ngNonBindable + * @restrict AC + * @priority 1000 + * + * @description + * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current + * DOM element. This is useful if the element contains what appears to be Angular directives and + * bindings but which should be ignored by Angular. This could be the case if you have a site that + * displays snippets of code, for instance. + * + * @element ANY + * + * @example + * In this example there are two locations where a simple interpolation binding (`{{}}`) is present, + * but the one wrapped in `ngNonBindable` is left alone. + * + * @example + + +
                  Normal: {{1 + 2}}
                  +
                  Ignored: {{1 + 2}}
                  +
                  + + it('should check ng-non-bindable', function() { + expect(using('.doc-example-live').binding('1 + 2')).toBe('3'); + expect(using('.doc-example-live').element('div:last').text()). + toMatch(/1 \+ 2/); + }); + +
                  + */ +var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 }); + +/** + * @ngdoc directive + * @name ng.directive:ngPluralize + * @restrict EA + * + * @description + * # Overview + * `ngPluralize` is a directive that displays messages according to en-US localization rules. + * These rules are bundled with angular.js, but can be overridden + * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive + * by specifying the mappings between + * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html + * plural categories} and the strings to be displayed. + * + * # Plural categories and explicit number rules + * There are two + * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html + * plural categories} in Angular's default en-US locale: "one" and "other". + * + * While a plural category may match many numbers (for example, in en-US locale, "other" can match + * any number that is not 1), an explicit number rule can only match one number. For example, the + * explicit number rule for "3" matches the number 3. There are examples of plural categories + * and explicit number rules throughout the rest of this documentation. + * + * # Configuring ngPluralize + * You configure ngPluralize by providing 2 attributes: `count` and `when`. + * You can also provide an optional attribute, `offset`. + * + * The value of the `count` attribute can be either a string or an {@link guide/expression + * Angular expression}; these are evaluated on the current scope for its bound value. + * + * The `when` attribute specifies the mappings between plural categories and the actual + * string to be displayed. The value of the attribute should be a JSON object. + * + * The following example shows how to configure ngPluralize: + * + *
                  + * 
                  + * 
                  + *
                  + * + * In the example, `"0: Nobody is viewing."` is an explicit number rule. If you did not + * specify this rule, 0 would be matched to the "other" category and "0 people are viewing" + * would be shown instead of "Nobody is viewing". You can specify an explicit number rule for + * other numbers, for example 12, so that instead of showing "12 people are viewing", you can + * show "a dozen people are viewing". + * + * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted + * into pluralized strings. In the previous example, Angular will replace `{}` with + * `{{personCount}}`. The closed braces `{}` is a placeholder + * for {{numberExpression}}. + * + * # Configuring ngPluralize with offset + * The `offset` attribute allows further customization of pluralized text, which can result in + * a better user experience. For example, instead of the message "4 people are viewing this document", + * you might display "John, Kate and 2 others are viewing this document". + * The offset attribute allows you to offset a number by any desired value. + * Let's take a look at an example: + * + *
                  + * 
                  + * 
                  + * 
                  + * + * Notice that we are still using two plural categories(one, other), but we added + * three explicit number rules 0, 1 and 2. + * When one person, perhaps John, views the document, "John is viewing" will be shown. + * When three people view the document, no explicit number rule is found, so + * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category. + * In this case, plural category 'one' is matched and "John, Marry and one other person are viewing" + * is shown. + * + * Note that when you specify offsets, you must provide explicit number rules for + * numbers from 0 up to and including the offset. If you use an offset of 3, for example, + * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for + * plural categories "one" and "other". + * + * @param {string|expression} count The variable to be bounded to. + * @param {string} when The mapping between plural category to its corresponding strings. + * @param {number=} offset Offset to deduct from the total number. + * + * @example + + + +
                  + Person 1:
                  + Person 2:
                  + Number of People:
                  + + + Without Offset: + +
                  + + + With Offset(2): + + +
                  +
                  + + it('should show correct pluralized string', function() { + expect(element('.doc-example-live ng-pluralize:first').text()). + toBe('1 person is viewing.'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Igor is viewing.'); + + using('.doc-example-live').input('personCount').enter('0'); + expect(element('.doc-example-live ng-pluralize:first').text()). + toBe('Nobody is viewing.'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Nobody is viewing.'); + + using('.doc-example-live').input('personCount').enter('2'); + expect(element('.doc-example-live ng-pluralize:first').text()). + toBe('2 people are viewing.'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Igor and Misko are viewing.'); + + using('.doc-example-live').input('personCount').enter('3'); + expect(element('.doc-example-live ng-pluralize:first').text()). + toBe('3 people are viewing.'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Igor, Misko and one other person are viewing.'); + + using('.doc-example-live').input('personCount').enter('4'); + expect(element('.doc-example-live ng-pluralize:first').text()). + toBe('4 people are viewing.'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Igor, Misko and 2 other people are viewing.'); + }); + + it('should show data-binded names', function() { + using('.doc-example-live').input('personCount').enter('4'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Igor, Misko and 2 other people are viewing.'); + + using('.doc-example-live').input('person1').enter('Di'); + using('.doc-example-live').input('person2').enter('Vojta'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Di, Vojta and 2 other people are viewing.'); + }); + +
                  + */ +var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) { + var BRACE = /{}/g; + return { + restrict: 'EA', + link: function(scope, element, attr) { + var numberExp = attr.count, + whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs + offset = attr.offset || 0, + whens = scope.$eval(whenExp) || {}, + whensExpFns = {}, + startSymbol = $interpolate.startSymbol(), + endSymbol = $interpolate.endSymbol(), + isWhen = /^when(Minus)?(.+)$/; + + forEach(attr, function(expression, attributeName) { + if (isWhen.test(attributeName)) { + whens[lowercase(attributeName.replace('when', '').replace('Minus', '-'))] = + element.attr(attr.$attr[attributeName]); + } + }); + forEach(whens, function(expression, key) { + whensExpFns[key] = + $interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' + + offset + endSymbol)); + }); + + scope.$watch(function ngPluralizeWatch() { + var value = parseFloat(scope.$eval(numberExp)); + + if (!isNaN(value)) { + //if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise, + //check it against pluralization rules in $locale service + if (!(value in whens)) value = $locale.pluralCat(value - offset); + return whensExpFns[value](scope, element, true); + } else { + return ''; + } + }, function ngPluralizeWatchAction(newVal) { + element.text(newVal); + }); + } + }; +}]; + +/** + * @ngdoc directive + * @name ng.directive:ngRepeat + * + * @description + * The `ngRepeat` directive instantiates a template once per item from a collection. Each template + * instance gets its own scope, where the given loop variable is set to the current collection item, + * and `$index` is set to the item index or key. + * + * Special properties are exposed on the local scope of each template instance, including: + * + * | Variable | Type | Details | + * |-----------|-----------------|-----------------------------------------------------------------------------| + * | `$index` | {@type number} | iterator offset of the repeated element (0..length-1) | + * | `$first` | {@type boolean} | true if the repeated element is first in the iterator. | + * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. | + * | `$last` | {@type boolean} | true if the repeated element is last in the iterator. | + * | `$even` | {@type boolean} | true if the iterator position `$index` is even (otherwise false). | + * | `$odd` | {@type boolean} | true if the iterator position `$index` is odd (otherwise false). | + * + * Creating aliases for these properties is possible with {@link api/ng.directive:ngInit `ngInit`}. + * This may be useful when, for instance, nesting ngRepeats. + * + * # Special repeat start and end points + * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending + * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively. + * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on) + * up to and including the ending HTML tag where **ng-repeat-end** is placed. + * + * The example below makes use of this feature: + *
                  + *   
                  + * Header {{ item }} + *
                  + *
                  + * Body {{ item }} + *
                  + *
                  + * Footer {{ item }} + *
                  + *
                  + * + * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to: + *
                  + *   
                  + * Header A + *
                  + *
                  + * Body A + *
                  + *
                  + * Footer A + *
                  + *
                  + * Header B + *
                  + *
                  + * Body B + *
                  + *
                  + * Footer B + *
                  + *
                  + * + * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such + * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**). + * + * @animations + * enter - when a new item is added to the list or when an item is revealed after a filter + * leave - when an item is removed from the list or when an item is filtered out + * move - when an adjacent item is filtered out causing a reorder or when the item contents are reordered + * + * @element ANY + * @scope + * @priority 1000 + * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These + * formats are currently supported: + * + * * `variable in expression` – where variable is the user defined loop variable and `expression` + * is a scope expression giving the collection to enumerate. + * + * For example: `album in artist.albums`. + * + * * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers, + * and `expression` is the scope expression giving the collection to enumerate. + * + * For example: `(name, age) in {'adam':10, 'amalie':12}`. + * + * * `variable in expression track by tracking_expression` – You can also provide an optional tracking function + * which can be used to associate the objects in the collection with the DOM elements. If no tracking function + * is specified the ng-repeat associates elements by identity in the collection. It is an error to have + * more than one tracking function to resolve to the same key. (This would mean that two distinct objects are + * mapped to the same DOM element, which is not possible.) Filters should be applied to the expression, + * before specifying a tracking expression. + * + * For example: `item in items` is equivalent to `item in items track by $id(item)'. This implies that the DOM elements + * will be associated by item identity in the array. + * + * For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique + * `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements + * with the corresponding item in the array by identity. Moving the same object in array would move the DOM + * element in the same way in the DOM. + * + * For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this + * case the object identity does not matter. Two objects are considered equivalent as long as their `id` + * property is same. + * + * For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter + * to items in conjunction with a tracking expression. + * + * @example + * This example initializes the scope to a list of names and + * then uses `ngRepeat` to display every person: + + +
                  + I have {{friends.length}} friends. They are: + +
                    +
                  • + [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old. +
                  • +
                  +
                  +
                  + + .example-animate-container { + background:white; + border:1px solid black; + list-style:none; + margin:0; + padding:0 10px; + } + + .animate-repeat { + line-height:40px; + list-style:none; + box-sizing:border-box; + } + + .animate-repeat.ng-move, + .animate-repeat.ng-enter, + .animate-repeat.ng-leave { + -webkit-transition:all linear 0.5s; + transition:all linear 0.5s; + } + + .animate-repeat.ng-leave.ng-leave-active, + .animate-repeat.ng-move, + .animate-repeat.ng-enter { + opacity:0; + max-height:0; + } + + .animate-repeat.ng-leave, + .animate-repeat.ng-move.ng-move-active, + .animate-repeat.ng-enter.ng-enter-active { + opacity:1; + max-height:40px; + } + + + it('should render initial data set', function() { + var r = using('.doc-example-live').repeater('ul li'); + expect(r.count()).toBe(10); + expect(r.row(0)).toEqual(["1","John","25"]); + expect(r.row(1)).toEqual(["2","Jessie","30"]); + expect(r.row(9)).toEqual(["10","Samantha","60"]); + expect(binding('friends.length')).toBe("10"); + }); + + it('should update repeater when filter predicate changes', function() { + var r = using('.doc-example-live').repeater('ul li'); + expect(r.count()).toBe(10); + + input('q').enter('ma'); + + expect(r.count()).toBe(2); + expect(r.row(0)).toEqual(["1","Mary","28"]); + expect(r.row(1)).toEqual(["2","Samantha","60"]); + }); + +
                  + */ +var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) { + var NG_REMOVED = '$$NG_REMOVED'; + var ngRepeatMinErr = minErr('ngRepeat'); + return { + transclude: 'element', + priority: 1000, + terminal: true, + $$tlb: true, + link: function($scope, $element, $attr, ctrl, $transclude){ + var expression = $attr.ngRepeat; + var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/), + trackByExp, trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn, + lhs, rhs, valueIdentifier, keyIdentifier, + hashFnLocals = {$id: hashKey}; + + if (!match) { + throw ngRepeatMinErr('iexp', "Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.", + expression); + } + + lhs = match[1]; + rhs = match[2]; + trackByExp = match[3]; + + if (trackByExp) { + trackByExpGetter = $parse(trackByExp); + trackByIdExpFn = function(key, value, index) { + // assign key, value, and $index to the locals so that they can be used in hash functions + if (keyIdentifier) hashFnLocals[keyIdentifier] = key; + hashFnLocals[valueIdentifier] = value; + hashFnLocals.$index = index; + return trackByExpGetter($scope, hashFnLocals); + }; + } else { + trackByIdArrayFn = function(key, value) { + return hashKey(value); + }; + trackByIdObjFn = function(key) { + return key; + }; + } + + match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/); + if (!match) { + throw ngRepeatMinErr('iidexp', "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.", + lhs); + } + valueIdentifier = match[3] || match[1]; + keyIdentifier = match[2]; + + // Store a list of elements from previous run. This is a hash where key is the item from the + // iterator, and the value is objects with following properties. + // - scope: bound scope + // - element: previous element. + // - index: position + var lastBlockMap = {}; + + //watch props + $scope.$watchCollection(rhs, function ngRepeatAction(collection){ + var index, length, + previousNode = $element[0], // current position of the node + nextNode, + // Same as lastBlockMap but it has the current state. It will become the + // lastBlockMap on the next iteration. + nextBlockMap = {}, + arrayLength, + childScope, + key, value, // key/value of iteration + trackById, + trackByIdFn, + collectionKeys, + block, // last object information {scope, element, id} + nextBlockOrder = [], + elementsToRemove; + + + if (isArrayLike(collection)) { + collectionKeys = collection; + trackByIdFn = trackByIdExpFn || trackByIdArrayFn; + } else { + trackByIdFn = trackByIdExpFn || trackByIdObjFn; + // if object, extract keys, sort them and use to determine order of iteration over obj props + collectionKeys = []; + for (key in collection) { + if (collection.hasOwnProperty(key) && key.charAt(0) != '$') { + collectionKeys.push(key); + } + } + collectionKeys.sort(); + } + + arrayLength = collectionKeys.length; + + // locate existing items + length = nextBlockOrder.length = collectionKeys.length; + for(index = 0; index < length; index++) { + key = (collection === collectionKeys) ? index : collectionKeys[index]; + value = collection[key]; + trackById = trackByIdFn(key, value, index); + assertNotHasOwnProperty(trackById, '`track by` id'); + if(lastBlockMap.hasOwnProperty(trackById)) { + block = lastBlockMap[trackById]; + delete lastBlockMap[trackById]; + nextBlockMap[trackById] = block; + nextBlockOrder[index] = block; + } else if (nextBlockMap.hasOwnProperty(trackById)) { + // restore lastBlockMap + forEach(nextBlockOrder, function(block) { + if (block && block.scope) lastBlockMap[block.id] = block; + }); + // This is a duplicate and we need to throw an error + throw ngRepeatMinErr('dupes', "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}", + expression, trackById); + } else { + // new never before seen block + nextBlockOrder[index] = { id: trackById }; + nextBlockMap[trackById] = false; + } + } + + // remove existing items + for (key in lastBlockMap) { + // lastBlockMap is our own object so we don't need to use special hasOwnPropertyFn + if (lastBlockMap.hasOwnProperty(key)) { + block = lastBlockMap[key]; + elementsToRemove = getBlockElements(block.clone); + $animate.leave(elementsToRemove); + forEach(elementsToRemove, function(element) { element[NG_REMOVED] = true; }); + block.scope.$destroy(); + } + } + + // we are not using forEach for perf reasons (trying to avoid #call) + for (index = 0, length = collectionKeys.length; index < length; index++) { + key = (collection === collectionKeys) ? index : collectionKeys[index]; + value = collection[key]; + block = nextBlockOrder[index]; + if (nextBlockOrder[index - 1]) previousNode = getBlockEnd(nextBlockOrder[index - 1]); + + if (block.scope) { + // if we have already seen this object, then we need to reuse the + // associated scope/element + childScope = block.scope; + + nextNode = previousNode; + do { + nextNode = nextNode.nextSibling; + } while(nextNode && nextNode[NG_REMOVED]); + + if (getBlockStart(block) != nextNode) { + // existing item which got moved + $animate.move(getBlockElements(block.clone), null, jqLite(previousNode)); + } + previousNode = getBlockEnd(block); + } else { + // new item which we don't know about + childScope = $scope.$new(); + } + + childScope[valueIdentifier] = value; + if (keyIdentifier) childScope[keyIdentifier] = key; + childScope.$index = index; + childScope.$first = (index === 0); + childScope.$last = (index === (arrayLength - 1)); + childScope.$middle = !(childScope.$first || childScope.$last); + // jshint bitwise: false + childScope.$odd = !(childScope.$even = (index&1) === 0); + // jshint bitwise: true + + if (!block.scope) { + $transclude(childScope, function(clone) { + clone[clone.length++] = document.createComment(' end ngRepeat: ' + expression + ' '); + $animate.enter(clone, null, jqLite(previousNode)); + previousNode = clone; + block.scope = childScope; + // Note: We only need the first/last node of the cloned nodes. + // However, we need to keep the reference to the jqlite wrapper as it might be changed later + // by a directive with templateUrl when it's template arrives. + block.clone = clone; + nextBlockMap[block.id] = block; + }); + } + } + lastBlockMap = nextBlockMap; + }); + } + }; + + function getBlockStart(block) { + return block.clone[0]; + } + + function getBlockEnd(block) { + return block.clone[block.clone.length - 1]; + } +}]; + +/** + * @ngdoc directive + * @name ng.directive:ngShow + * + * @description + * The `ngShow` directive shows or hides the given HTML element based on the expression + * provided to the ngShow attribute. The element is shown or hidden by removing or adding + * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined + * in AngularJS and sets the display style to none (using an !important flag). + * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}). + * + *
                  + * 
                  + * 
                  + * + * + *
                  + *
                  + * + * When the ngShow expression evaluates to false then the ng-hide CSS class is added to the class attribute + * on the element causing it to become hidden. When true, the ng-hide CSS class is removed + * from the element causing the element not to appear hidden. + * + * ## Why is !important used? + * + * You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector + * can be easily overridden by heavier selectors. For example, something as simple + * as changing the display style on a HTML list item would make hidden elements appear visible. + * This also becomes a bigger issue when dealing with CSS frameworks. + * + * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector + * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the + * styling to change how to hide an element then it is just a matter of using !important in their own CSS code. + * + * ### Overriding .ng-hide + * + * If you wish to change the hide behavior with ngShow/ngHide then this can be achieved by + * restating the styles for the .ng-hide class in CSS: + *
                  + * .ng-hide {
                  + *   //!annotate CSS Specificity|Not to worry, this will override the AngularJS default...
                  + *   display:block!important;
                  + *
                  + *   //this is just another form of hiding an element
                  + *   position:absolute;
                  + *   top:-9999px;
                  + *   left:-9999px;
                  + * }
                  + * 
                  + * + * Just remember to include the important flag so the CSS override will function. + * + * ## A note about animations with ngShow + * + * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression + * is true and false. This system works like the animation system present with ngClass except that + * you must also include the !important flag to override the display property + * so that you can perform an animation when the element is hidden during the time of the animation. + * + *
                  + * //
                  + * //a working example can be found at the bottom of this page
                  + * //
                  + * .my-element.ng-hide-add, .my-element.ng-hide-remove {
                  + *   transition:0.5s linear all;
                  + *   display:block!important;
                  + * }
                  + *
                  + * .my-element.ng-hide-add { ... }
                  + * .my-element.ng-hide-add.ng-hide-add-active { ... }
                  + * .my-element.ng-hide-remove { ... }
                  + * .my-element.ng-hide-remove.ng-hide-remove-active { ... }
                  + * 
                  + * + * @animations + * addClass: .ng-hide - happens after the ngShow expression evaluates to a truthy value and the just before contents are set to visible + * removeClass: .ng-hide - happens after the ngShow expression evaluates to a non truthy value and just before the contents are set to hidden + * + * @element ANY + * @param {expression} ngShow If the {@link guide/expression expression} is truthy + * then the element is shown or hidden respectively. + * + * @example + + + Click me:
                  +
                  + Show: +
                  + I show up when your checkbox is checked. +
                  +
                  +
                  + Hide: +
                  + I hide when your checkbox is checked. +
                  +
                  +
                  + + .animate-show { + -webkit-transition:all linear 0.5s; + transition:all linear 0.5s; + line-height:20px; + opacity:1; + padding:10px; + border:1px solid black; + background:white; + } + + .animate-show.ng-hide-add, + .animate-show.ng-hide-remove { + display:block!important; + } + + .animate-show.ng-hide { + line-height:0; + opacity:0; + padding:0 10px; + } + + .check-element { + padding:10px; + border:1px solid black; + background:white; + } + + + it('should check ng-show / ng-hide', function() { + expect(element('.doc-example-live span:first:hidden').count()).toEqual(1); + expect(element('.doc-example-live span:last:visible').count()).toEqual(1); + + input('checked').check(); + + expect(element('.doc-example-live span:first:visible').count()).toEqual(1); + expect(element('.doc-example-live span:last:hidden').count()).toEqual(1); + }); + +
                  + */ +var ngShowDirective = ['$animate', function($animate) { + return function(scope, element, attr) { + scope.$watch(attr.ngShow, function ngShowWatchAction(value){ + $animate[toBoolean(value) ? 'removeClass' : 'addClass'](element, 'ng-hide'); + }); + }; +}]; + + +/** + * @ngdoc directive + * @name ng.directive:ngHide + * + * @description + * The `ngHide` directive shows or hides the given HTML element based on the expression + * provided to the ngHide attribute. The element is shown or hidden by removing or adding + * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined + * in AngularJS and sets the display style to none (using an !important flag). + * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}). + * + *
                  + * 
                  + * 
                  + * + * + *
                  + *
                  + * + * When the ngHide expression evaluates to true then the .ng-hide CSS class is added to the class attribute + * on the element causing it to become hidden. When false, the ng-hide CSS class is removed + * from the element causing the element not to appear hidden. + * + * ## Why is !important used? + * + * You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector + * can be easily overridden by heavier selectors. For example, something as simple + * as changing the display style on a HTML list item would make hidden elements appear visible. + * This also becomes a bigger issue when dealing with CSS frameworks. + * + * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector + * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the + * styling to change how to hide an element then it is just a matter of using !important in their own CSS code. + * + * ### Overriding .ng-hide + * + * If you wish to change the hide behavior with ngShow/ngHide then this can be achieved by + * restating the styles for the .ng-hide class in CSS: + *
                  + * .ng-hide {
                  + *   //!annotate CSS Specificity|Not to worry, this will override the AngularJS default...
                  + *   display:block!important;
                  + *
                  + *   //this is just another form of hiding an element
                  + *   position:absolute;
                  + *   top:-9999px;
                  + *   left:-9999px;
                  + * }
                  + * 
                  + * + * Just remember to include the important flag so the CSS override will function. + * + * ## A note about animations with ngHide + * + * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression + * is true and false. This system works like the animation system present with ngClass, except that + * you must also include the !important flag to override the display property so + * that you can perform an animation when the element is hidden during the time of the animation. + * + *
                  + * //
                  + * //a working example can be found at the bottom of this page
                  + * //
                  + * .my-element.ng-hide-add, .my-element.ng-hide-remove {
                  + *   transition:0.5s linear all;
                  + *   display:block!important;
                  + * }
                  + *
                  + * .my-element.ng-hide-add { ... }
                  + * .my-element.ng-hide-add.ng-hide-add-active { ... }
                  + * .my-element.ng-hide-remove { ... }
                  + * .my-element.ng-hide-remove.ng-hide-remove-active { ... }
                  + * 
                  + * + * @animations + * removeClass: .ng-hide - happens after the ngHide expression evaluates to a truthy value and just before the contents are set to hidden + * addClass: .ng-hide - happens after the ngHide expression evaluates to a non truthy value and just before the contents are set to visible + * + * @element ANY + * @param {expression} ngHide If the {@link guide/expression expression} is truthy then + * the element is shown or hidden respectively. + * + * @example + + + Click me:
                  +
                  + Show: +
                  + I show up when your checkbox is checked. +
                  +
                  +
                  + Hide: +
                  + I hide when your checkbox is checked. +
                  +
                  +
                  + + .animate-hide { + -webkit-transition:all linear 0.5s; + transition:all linear 0.5s; + line-height:20px; + opacity:1; + padding:10px; + border:1px solid black; + background:white; + } + + .animate-hide.ng-hide-add, + .animate-hide.ng-hide-remove { + display:block!important; + } + + .animate-hide.ng-hide { + line-height:0; + opacity:0; + padding:0 10px; + } + + .check-element { + padding:10px; + border:1px solid black; + background:white; + } + + + it('should check ng-show / ng-hide', function() { + expect(element('.doc-example-live .check-element:first:hidden').count()).toEqual(1); + expect(element('.doc-example-live .check-element:last:visible').count()).toEqual(1); + + input('checked').check(); + + expect(element('.doc-example-live .check-element:first:visible').count()).toEqual(1); + expect(element('.doc-example-live .check-element:last:hidden').count()).toEqual(1); + }); + +
                  + */ +var ngHideDirective = ['$animate', function($animate) { + return function(scope, element, attr) { + scope.$watch(attr.ngHide, function ngHideWatchAction(value){ + $animate[toBoolean(value) ? 'addClass' : 'removeClass'](element, 'ng-hide'); + }); + }; +}]; + +/** + * @ngdoc directive + * @name ng.directive:ngStyle + * @restrict AC + * + * @description + * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally. + * + * @element ANY + * @param {expression} ngStyle {@link guide/expression Expression} which evals to an + * object whose keys are CSS style names and values are corresponding values for those CSS + * keys. + * + * @example + + + + +
                  + Sample Text +
                  myStyle={{myStyle}}
                  +
                  + + span { + color: black; + } + + + it('should check ng-style', function() { + expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)'); + element('.doc-example-live :button[value=set]').click(); + expect(element('.doc-example-live span').css('color')).toBe('rgb(255, 0, 0)'); + element('.doc-example-live :button[value=clear]').click(); + expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)'); + }); + +
                  + */ +var ngStyleDirective = ngDirective(function(scope, element, attr) { + scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) { + if (oldStyles && (newStyles !== oldStyles)) { + forEach(oldStyles, function(val, style) { element.css(style, '');}); + } + if (newStyles) element.css(newStyles); + }, true); +}); + +/** + * @ngdoc directive + * @name ng.directive:ngSwitch + * @restrict EA + * + * @description + * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression. + * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location + * as specified in the template. + * + * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it + * from the template cache), `ngSwitch` simply choses one of the nested elements and makes it visible based on which element + * matches the value obtained from the evaluated expression. In other words, you define a container element + * (where you place the directive), place an expression on the **`on="..."` attribute** + * (or the **`ng-switch="..."` attribute**), define any inner elements inside of the directive and place + * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on + * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default + * attribute is displayed. + * + *
                  + * Be aware that the attribute values to match against cannot be expressions. They are interpreted + * as literal string values to match against. + * For example, **`ng-switch-when="someVal"`** will match against the string `"someVal"` not against the + * value of the expression `$scope.someVal`. + *
                  + + * @animations + * enter - happens after the ngSwitch contents change and the matched child element is placed inside the container + * leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM + * + * @usage + * + * ... + * ... + * ... + * + * + * + * @scope + * @priority 800 + * @param {*} ngSwitch|on expression to match against ng-switch-when. + * @paramDescription + * On child elements add: + * + * * `ngSwitchWhen`: the case statement to match against. If match then this + * case will be displayed. If the same match appears multiple times, all the + * elements will be displayed. + * * `ngSwitchDefault`: the default case when no other case match. If there + * are multiple default cases, all of them will be displayed when no other + * case match. + * + * + * @example + + +
                  + + selection={{selection}} +
                  +
                  +
                  Settings Div
                  +
                  Home Span
                  +
                  default
                  +
                  +
                  +
                  + + function Ctrl($scope) { + $scope.items = ['settings', 'home', 'other']; + $scope.selection = $scope.items[0]; + } + + + .animate-switch-container { + position:relative; + background:white; + border:1px solid black; + height:40px; + overflow:hidden; + } + + .animate-switch { + padding:10px; + } + + .animate-switch.ng-animate { + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + + position:absolute; + top:0; + left:0; + right:0; + bottom:0; + } + + .animate-switch.ng-leave.ng-leave-active, + .animate-switch.ng-enter { + top:-50px; + } + .animate-switch.ng-leave, + .animate-switch.ng-enter.ng-enter-active { + top:0; + } + + + it('should start in settings', function() { + expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Settings Div/); + }); + it('should change to home', function() { + select('selection').option('home'); + expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Home Span/); + }); + it('should select default', function() { + select('selection').option('other'); + expect(element('.doc-example-live [ng-switch]').text()).toMatch(/default/); + }); + +
                  + */ +var ngSwitchDirective = ['$animate', function($animate) { + return { + restrict: 'EA', + require: 'ngSwitch', + + // asks for $scope to fool the BC controller module + controller: ['$scope', function ngSwitchController() { + this.cases = {}; + }], + link: function(scope, element, attr, ngSwitchController) { + var watchExpr = attr.ngSwitch || attr.on, + selectedTranscludes, + selectedElements, + selectedScopes = []; + + scope.$watch(watchExpr, function ngSwitchWatchAction(value) { + for (var i= 0, ii=selectedScopes.length; i + + +
                  +
                  +
                  + {{text}} +
                  +
                  + + it('should have transcluded', function() { + input('title').enter('TITLE'); + input('text').enter('TEXT'); + expect(binding('title')).toEqual('TITLE'); + expect(binding('text')).toEqual('TEXT'); + }); + + + * + */ +var ngTranscludeDirective = ngDirective({ + controller: ['$element', '$transclude', function($element, $transclude) { + if (!$transclude) { + throw minErr('ngTransclude')('orphan', + 'Illegal use of ngTransclude directive in the template! ' + + 'No parent directive that requires a transclusion found. ' + + 'Element: {0}', + startingTag($element)); + } + + // remember the transclusion fn but call it during linking so that we don't process transclusion before directives on + // the parent element even when the transclusion replaces the current element. (we can't use priority here because + // that applies only to compile fns and not controllers + this.$transclude = $transclude; + }], + + link: function($scope, $element, $attrs, controller) { + controller.$transclude(function(clone) { + $element.empty(); + $element.append(clone); + }); + } +}); + +/** + * @ngdoc directive + * @name ng.directive:script + * @restrict E + * + * @description + * Load the content of a ` + + Load inlined template +
                  + + + it('should load template defined inside script tag', function() { + element('#tpl-link').click(); + expect(element('#tpl-content').text()).toMatch(/Content of the template/); + }); + + + */ +var scriptDirective = ['$templateCache', function($templateCache) { + return { + restrict: 'E', + terminal: true, + compile: function(element, attr) { + if (attr.type == 'text/ng-template') { + var templateUrl = attr.id, + // IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent + text = element[0].text; + + $templateCache.put(templateUrl, text); + } + } + }; +}]; + +var ngOptionsMinErr = minErr('ngOptions'); +/** + * @ngdoc directive + * @name ng.directive:select + * @restrict E + * + * @description + * HTML `SELECT` element with angular data-binding. + * + * # `ngOptions` + * + * The `ngOptions` attribute can be used to dynamically generate a list of `` + * DOM element. + * * `trackexpr`: Used when working with an array of objects. The result of this expression will be + * used to identify the objects in the array. The `trackexpr` will most likely refer to the + * `value` variable (e.g. `value.propertyName`). + * + * @example + + + +
                  +
                    +
                  • + Name: + [X] +
                  • +
                  • + [add] +
                  • +
                  +
                  + Color (null not allowed): +
                  + + Color (null allowed): + + +
                  + + Color grouped by shade: +
                  + + + Select bogus.
                  +
                  + Currently selected: {{ {selected_color:color} }} +
                  +
                  +
                  +
                  + + it('should check ng-options', function() { + expect(binding('{selected_color:color}')).toMatch('red'); + select('color').option('0'); + expect(binding('{selected_color:color}')).toMatch('black'); + using('.nullable').select('color').option(''); + expect(binding('{selected_color:color}')).toMatch('null'); + }); + +
                  + */ + +var ngOptionsDirective = valueFn({ terminal: true }); +// jshint maxlen: false +var selectDirective = ['$compile', '$parse', function($compile, $parse) { + //000011111111110000000000022222222220000000000000000000003333333333000000000000004444444444444440000000005555555555555550000000666666666666666000000000000000777777777700000000000000000008888888888 + var NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/, + nullModelCtrl = {$setViewValue: noop}; +// jshint maxlen: 100 + + return { + restrict: 'E', + require: ['select', '?ngModel'], + controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) { + var self = this, + optionsMap = {}, + ngModelCtrl = nullModelCtrl, + nullOption, + unknownOption; + + + self.databound = $attrs.ngModel; + + + self.init = function(ngModelCtrl_, nullOption_, unknownOption_) { + ngModelCtrl = ngModelCtrl_; + nullOption = nullOption_; + unknownOption = unknownOption_; + }; + + + self.addOption = function(value) { + assertNotHasOwnProperty(value, '"option value"'); + optionsMap[value] = true; + + if (ngModelCtrl.$viewValue == value) { + $element.val(value); + if (unknownOption.parent()) unknownOption.remove(); + } + }; + + + self.removeOption = function(value) { + if (this.hasOption(value)) { + delete optionsMap[value]; + if (ngModelCtrl.$viewValue == value) { + this.renderUnknownOption(value); + } + } + }; + + + self.renderUnknownOption = function(val) { + var unknownVal = '? ' + hashKey(val) + ' ?'; + unknownOption.val(unknownVal); + $element.prepend(unknownOption); + $element.val(unknownVal); + unknownOption.prop('selected', true); // needed for IE + }; + + + self.hasOption = function(value) { + return optionsMap.hasOwnProperty(value); + }; + + $scope.$on('$destroy', function() { + // disable unknown option so that we don't do work when the whole select is being destroyed + self.renderUnknownOption = noop; + }); + }], + + link: function(scope, element, attr, ctrls) { + // if ngModel is not defined, we don't need to do anything + if (!ctrls[1]) return; + + var selectCtrl = ctrls[0], + ngModelCtrl = ctrls[1], + multiple = attr.multiple, + optionsExp = attr.ngOptions, + nullOption = false, // if false, user will not be able to select it (used by ngOptions) + emptyOption, + // we can't just jqLite('