From 125b1dfd2d0cf9efa9b1e11422387ce652593ded Mon Sep 17 00:00:00 2001 From: RizviR Date: Tue, 1 Mar 2016 09:50:03 +0600 Subject: [PATCH] Initial commit --- .gitignore | 1 + README.md | 28 + create_db.mysql | 35 + permissions.sh | 20 + questions.yaml | 69 + requirements.txt | 10 + screenshot.png | Bin 0 -> 49797 bytes settings.cfg.example | 16 + static/app.css | 108 + static/check-animate-once-delay.gif | Bin 0 -> 22847 bytes static/check-animate-once-small-static.png | Bin 0 -> 6477 bytes static/check-animate-once-small.gif | Bin 0 -> 22847 bytes static/check-animate-once.gif | Bin 0 -> 21016 bytes static/jquery-1.11.3.min.js | 5 + static/jquery-ui.min.css | 6 + static/jquery-ui.min.js | 7 + static/jquery-ui.structure.min.css | 5 + static/logo-right.png | Bin 0 -> 8758 bytes static/logo.png | Bin 0 -> 5017 bytes static/slidr.min.js | 48 + static/webix/codebase/fonts/PTS-bold.eot | Bin 0 -> 56208 bytes static/webix/codebase/fonts/PTS-bold.ttf | Bin 0 -> 115048 bytes static/webix/codebase/fonts/PTS-bold.woff | Bin 0 -> 61976 bytes static/webix/codebase/fonts/PTS-webfont.eot | Bin 0 -> 56010 bytes static/webix/codebase/fonts/PTS-webfont.ttf | Bin 0 -> 113024 bytes static/webix/codebase/fonts/PTS-webfont.woff | Bin 0 -> 56820 bytes static/webix/codebase/fonts/font-license.txt | 14 + .../codebase/fonts/fontawesome-webfont.eot | Bin 0 -> 60767 bytes .../codebase/fonts/fontawesome-webfont.svg | 565 + .../codebase/fonts/fontawesome-webfont.ttf | Bin 0 -> 122092 bytes .../codebase/fonts/fontawesome-webfont.woff | Bin 0 -> 71508 bytes static/webix/codebase/i18n/be.js | 35 + static/webix/codebase/i18n/de.js | 35 + static/webix/codebase/i18n/en.js | 36 + static/webix/codebase/i18n/es.js | 35 + static/webix/codebase/i18n/fr.js | 30 + static/webix/codebase/i18n/it.js | 35 + static/webix/codebase/i18n/ja.js | 35 + static/webix/codebase/i18n/ru.js | 30 + static/webix/codebase/i18n/zh.js | 35 + .../codebase/legacy/excanvas/AUTHORS.txt | 10 + .../codebase/legacy/excanvas/COPYING.txt | 202 + .../webix/codebase/legacy/excanvas/README.txt | 22 + .../codebase/legacy/excanvas/excanvas.js | 924 + static/webix/codebase/legacy/swfobject.js | 777 + static/webix/codebase/legacy/uploader.swf | Bin 0 -> 2545 bytes static/webix/codebase/skins/air.css | 1097 + static/webix/codebase/skins/aircompact.css | 1097 + static/webix/codebase/skins/clouds.css | 1130 + static/webix/codebase/skins/compact.css | 1428 + static/webix/codebase/skins/flat.css | 1427 + static/webix/codebase/skins/glamour.css | 1220 + static/webix/codebase/skins/light.css | 1179 + static/webix/codebase/skins/metro.css | 1152 + static/webix/codebase/skins/terrace.css | 1097 + static/webix/codebase/skins/touch.css | 1284 + static/webix/codebase/skins/web.css | 1099 + static/webix/codebase/webix.css | 1427 + static/webix/codebase/webix.js | 1200 + static/webix/codebase/webix.js.map | 1 + static/webix/codebase/webix_debug.js | 31050 ++++++++++++++++ static/webix/license.txt | 674 + static/webix/readme.txt | 17 + static/webix/whatsnew.txt | 389 + templates/animate-exit.js | 1 + templates/basic_questions.html | 50 + .../basic_questions_check_animation.html | 27 + templates/customize.html | 40 + templates/cv_upload.html | 82 + templates/extra_questions.html | 28 + templates/finished.html | 24 + templates/information.html | 22 + templates/intro.html | 36 + templates/nontech_questions.html | 24 + templates/not_first_step.html | 3 + templates/render_question_form.html | 25 + templates/topleft_stopwatch.html | 23 + templates/webix.html | 50 + upload_sievee.py | 413 + upload_sievee.wsgi | 4 + 80 files changed, 51998 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 create_db.mysql create mode 100644 permissions.sh create mode 100644 questions.yaml create mode 100644 requirements.txt create mode 100644 screenshot.png create mode 100644 settings.cfg.example create mode 100644 static/app.css create mode 100644 static/check-animate-once-delay.gif create mode 100644 static/check-animate-once-small-static.png create mode 100644 static/check-animate-once-small.gif create mode 100644 static/check-animate-once.gif create mode 100644 static/jquery-1.11.3.min.js create mode 100644 static/jquery-ui.min.css create mode 100644 static/jquery-ui.min.js create mode 100644 static/jquery-ui.structure.min.css create mode 100644 static/logo-right.png create mode 100644 static/logo.png create mode 100644 static/slidr.min.js create mode 100644 static/webix/codebase/fonts/PTS-bold.eot create mode 100644 static/webix/codebase/fonts/PTS-bold.ttf create mode 100644 static/webix/codebase/fonts/PTS-bold.woff create mode 100644 static/webix/codebase/fonts/PTS-webfont.eot create mode 100644 static/webix/codebase/fonts/PTS-webfont.ttf create mode 100644 static/webix/codebase/fonts/PTS-webfont.woff create mode 100644 static/webix/codebase/fonts/font-license.txt create mode 100644 static/webix/codebase/fonts/fontawesome-webfont.eot create mode 100644 static/webix/codebase/fonts/fontawesome-webfont.svg create mode 100644 static/webix/codebase/fonts/fontawesome-webfont.ttf create mode 100644 static/webix/codebase/fonts/fontawesome-webfont.woff create mode 100644 static/webix/codebase/i18n/be.js create mode 100644 static/webix/codebase/i18n/de.js create mode 100644 static/webix/codebase/i18n/en.js create mode 100644 static/webix/codebase/i18n/es.js create mode 100644 static/webix/codebase/i18n/fr.js create mode 100644 static/webix/codebase/i18n/it.js create mode 100644 static/webix/codebase/i18n/ja.js create mode 100644 static/webix/codebase/i18n/ru.js create mode 100644 static/webix/codebase/i18n/zh.js create mode 100644 static/webix/codebase/legacy/excanvas/AUTHORS.txt create mode 100644 static/webix/codebase/legacy/excanvas/COPYING.txt create mode 100644 static/webix/codebase/legacy/excanvas/README.txt create mode 100644 static/webix/codebase/legacy/excanvas/excanvas.js create mode 100644 static/webix/codebase/legacy/swfobject.js create mode 100644 static/webix/codebase/legacy/uploader.swf create mode 100644 static/webix/codebase/skins/air.css create mode 100644 static/webix/codebase/skins/aircompact.css create mode 100644 static/webix/codebase/skins/clouds.css create mode 100644 static/webix/codebase/skins/compact.css create mode 100644 static/webix/codebase/skins/flat.css create mode 100644 static/webix/codebase/skins/glamour.css create mode 100644 static/webix/codebase/skins/light.css create mode 100644 static/webix/codebase/skins/metro.css create mode 100644 static/webix/codebase/skins/terrace.css create mode 100644 static/webix/codebase/skins/touch.css create mode 100644 static/webix/codebase/skins/web.css create mode 100644 static/webix/codebase/webix.css create mode 100644 static/webix/codebase/webix.js create mode 100644 static/webix/codebase/webix.js.map create mode 100644 static/webix/codebase/webix_debug.js create mode 100644 static/webix/license.txt create mode 100644 static/webix/readme.txt create mode 100644 static/webix/whatsnew.txt create mode 100644 templates/animate-exit.js create mode 100644 templates/basic_questions.html create mode 100644 templates/basic_questions_check_animation.html create mode 100644 templates/customize.html create mode 100644 templates/cv_upload.html create mode 100644 templates/extra_questions.html create mode 100644 templates/finished.html create mode 100644 templates/information.html create mode 100644 templates/intro.html create mode 100644 templates/nontech_questions.html create mode 100644 templates/not_first_step.html create mode 100644 templates/render_question_form.html create mode 100644 templates/topleft_stopwatch.html create mode 100644 templates/webix.html create mode 100755 upload_sievee.py create mode 100755 upload_sievee.wsgi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bdaab25 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +env/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..131caad --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +Ever put up a technical job posting and be inundated with CVs from people who claim to know a lot but actually could hardly even spell what they profess to be good at? + +Upload Sievee (pronounced "Upload CV") is a simple open source job application/CV uploading site, designed to sift candidates by asking them a set of compulsory questions (which they have to answer in order to continue). It's not unduly strict, in that it allows for an unlimited amount of retries as well as feedback of which particular question was answered wrong, but each incorrect attempt is noted in the final report. It's divided into three sections: +- Timed compulsory questions with fixed answers +- Timed optional free-form questions with no particular answers +- Untimed optional free-form or radio-selection questions with no answers +before finally allowing the candidate to upload their CV or any additional files. You then get their report and CV via email (there is no admin web interface to view previous applicants, it's email only) +It has some basic anti-cheating measures in the sense that it could try to guess if the candidate looked at the questions before, but it's far from perfect. + + +#### Installation: + +``` +git clone ... +sudo yum install mysql-devel # or mariadb-devel +virtualenv env +source env/bin/activate +pip install -r requirements.txt +# Then create a MySQL/MariaDB database according to create_db.mysql +mv settings.cfg.example settings.cfg +# Edit settings.cfg with your details. +python upload_sievee.py # Test +# Go to a web browser and check http://yourserver:5000 +# or deploy to your webserver via the wsgi file. +``` + +Customize the text and links on the site by editing `templates/customize.html`, and change the questions by editing the `questions.yaml` file. + diff --git a/create_db.mysql b/create_db.mysql new file mode 100644 index 0000000..8b2769e --- /dev/null +++ b/create_db.mysql @@ -0,0 +1,35 @@ +CREATE DATABASE upload_cv; + +CREATE USER 'upload_cv_user'@'localhost' IDENTIFIED BY 'yourpassword'; +GRANT ALL ON upload_cv.* TO 'upload_cv_user'@'localhost'; + +USE upload_cv; + +CREATE TABLE candidates ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + entry_date DATETIME, + name VARCHAR(254), + email VARCHAR(254), + phone VARCHAR(50), + ip VARCHAR(15), + useragent VARCHAR(254), + read_intro BOOLEAN, + basic_questions_start DATETIME, + basic_questions_end DATETIME, + basic_questions_timeaway INT DEFAULT 0, + basic_questions_incorrect INT DEFAULT 0, + extra_questions_start DATETIME, + extra_questions_end DATETIME, + extra_questions_timeaway INT DEFAULT 0, + cv_uploaded BOOLEAN DEFAULT FALSE +); + +CREATE INDEX idx_c_id ON candidates(id); + +CREATE INDEX idx_c_uploaded ON candidates(cv_uploaded); +CREATE INDEX idx_c_email ON candidates(email); +CREATE INDEX idx_c_phone ON candidates(phone); +CREATE INDEX idx_c_ip ON candidates(ip); + + + diff --git a/permissions.sh b/permissions.sh new file mode 100644 index 0000000..56d9f10 --- /dev/null +++ b/permissions.sh @@ -0,0 +1,20 @@ +#!/bin/bash +set -u + +ROOTDIR="/the/dir/with/upload_sievee" +READ_WRITE_DIRS="repo" + +# Set everything to root/read-only by default +chown -v -R root:root $ROOTDIR +chmod -v -R 644 $ROOTDIR + +# Set all the directory permissions +find $ROOTDIR -type d -exec chmod 755 {} \; + +# Set permissions for writing +for i in $READ_WRITE_DIRS; do + chown -v -R www-upload-cv:www-upload-cv $ROOTDIR/$i + find $ROOTDIR/$i -type f -exec chmod -v 664 {} \; + find $ROOTDIR/$i -type d -exec chmod -v 775 {} \; +done + diff --git a/questions.yaml b/questions.yaml new file mode 100644 index 0000000..4494a5a --- /dev/null +++ b/questions.yaml @@ -0,0 +1,69 @@ +basic-questions: + - question: "What is the right answer to this question?" + id: "question01" + type: "radio" + options: + - "The incorrect answer" + - "Another wrong answer" + - "The right answer" + - "One more incorrect answer" + answer: "The right answer" + + + - question: "The answer to the following question is /etc/fstab" + id: "question02" + type: "line" + hint: "/etc" + answer: "/etc/fstab" + + - question: "You can include some HTML in the YAML file. Do you want to continue?" + id: "question03" + type: "radio" + options: + - "Not really" + - "I prefer sticking to this page" + - "Mesmerized by the stopwatch" + - "Yes!" + answer: "Yes!" + + +extra-questions: + - question: "Just a free-form question, you don't have to fill this up" + id: "question01" + type: "multiline" + height: 100 + width: 400 + + - question: "Another question that could be answered." + id: "question02" + type: "multiline" + height: 100 + width: 400 + + - question: "The height and width of the textbox can be customized in the YAML, what do you think of that?" + id: "question03" + type: "multiline" + height: 200 + width: 600 + + +nontech-questions: + - question: "This is similar to the questions on the previous page (but not timed)" + id: "question01" + type: "multiline" + height: 100 + width: 600 + + - question: "Did you know you could have a one line answer box?" + id: "question02" + type: "line" + + - question: "You could even have a radio selection" + id: "question03" + type: "radio" + options: + - "Really?" + - "I knew that." + - "You could have a what selection?" + + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..cdd723a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,10 @@ +Flask==0.10.1 +Jinja2==2.7.3 +MarkupSafe==0.23 +PyYAML==3.11 +MySQL-python +SQLAlchemy==1.0.5 +Werkzeug==0.10.4 +itsdangerous==0.24 +mailer==0.8.1 +wsgiref==0.1.2 diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..c6399daf0a8407b45bed5681f1b7f6bbdf3bee26 GIT binary patch literal 49797 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 nbcE#t2UYS+e*|giqD1CfCEPe2 literal 0 HcmV?d00001 diff --git a/settings.cfg.example b/settings.cfg.example new file mode 100644 index 0000000..e4e5c93 --- /dev/null +++ b/settings.cfg.example @@ -0,0 +1,16 @@ +SQL_DB = 'upload_cv' +SQL_IP = "127.0.0.1" +SQL_USER = "upload_cv_user" +SQL_PASSWORD = "yourpassword" +REPO_DIR = "/tmp/repo" +SECRET_KEY = '1234abcd' + +DEMO_MODE = True + +# It's mandatory that you have a working mail server, unless demo_mode is set to True +# No need for authentication if you point it to the recipient MX record +MAIL_FROM = "opensievee@yourdomain.com" +MAIL_TO = [ "careers@yourdomain.com" ] +MAIL_SERVER = "127.0.0.1" + + diff --git a/static/app.css b/static/app.css new file mode 100644 index 0000000..e93e26e --- /dev/null +++ b/static/app.css @@ -0,0 +1,108 @@ +.redhighlight{ + background-color: #fbd6d6; +} + + +/* CV upload progress bar */ + +.overall{ height:100%; line-height: 26px;} +.name{ height:100%; float:left; overflow: hidden;} +.size{ padding: 0 10px; width: 100px; text-align: right; float: right;} +.remove_file{ float:right; width:15px; padding-left: 10px;} +.status{ + float: right; + position: relative; + margin-top: 4px; + width: 80px; + height: 16px; + line-height: 16px; + border: 1px solid #A4BED4; + border-radius: 2px; -moz-border-radius: 2px; -webkit-border-radius: 2px; +} +.progress{ height: 100%; position: absolute; background-color: #b8e6ff;} +.message{ z-index: 1; width:100%; text-align:center; position: absolute;} +.message.error{ color: #e83b3b;} + + + +/* Stopwatch - http://www.htmlbestcodes.com/beautiful_stopwatch_by_html__javascript_and_css3.htm */ +.stopwatch-container { + padding: 10px; + text-align: center; +} + +.stopwatch-timer { + padding: 10px; + background: #ffffff; + overflow: hidden; + display: inline-block; + position: relative; +} + +.stopwatch-cell { + /*Should only display 1 digit. Hence height = line height of .numbers + * and width = width of .numbers*/ + width: 0.60em; + height: 40px; + font-size: 24px; + overflow: hidden; + position: relative; + float: left; +} + +.stopwatch-numbers { + width: 0.6em; + line-height: 40px; + font-family: digital, arial, verdana; + text-align: center; + color: #000000; + + position: absolute; + top: 0; + left: 0; + + /*Glow to the text*/ + text-shadow: 0 0 5px rgba(150, 150, 150, 1); +} + +.stopwatch-moveten { + /*The digits move but dont look good. We will use steps now + * 10 digits = 10 steps. You can now see the digits swapping instead of + * moving pixel-by-pixel*/ + animation: stopwatch-moveten 1s steps(10, end) infinite; + /*By default animation should be paused*/ + animation-play-state: running; +} +.stopwatch-movesix { + animation: stopwatch-movesix 1s steps(6, end) infinite; + animation-play-state: running; +} + +/*Now we need to sync the animation speed with time speed*/ +/*One second per digit. 10 digits. Hence 10s*/ +.second {animation-duration: 10s;} +.tensecond {animation-duration: 60s;} /*60 times .second*/ + +.milisecond {animation-duration: 1s;} /*1/10th of .second*/ +.tenmilisecond {animation-duration: 0.1s;} + +.minute {animation-duration: 600s;} /*60 times .second*/ +.tenminute {animation-duration: 3600s;} /*60 times .minute*/ + +.hour {animation-duration: 36000s;} /*60 times .minute*/ +.tenhour {animation-duration: 360000s;} /*10 times .hour*/ + +@keyframes stopwatch-moveten { + 0% {top: 0;} + 100% {top: -400px;} + /*height = 40. digits = 10. hence -400 to move it completely to the top*/ +} + +@keyframes stopwatch-movesix { + 0% {top: 0;} + 100% {top: -240px;} + /*height = 40. digits = 6. hence -240 to move it completely to the top*/ +} + + + diff --git a/static/check-animate-once-delay.gif b/static/check-animate-once-delay.gif new file mode 100644 index 0000000000000000000000000000000000000000..447a939eba80544f1fe2b1c3f22a9a29f6a3a77a GIT binary patch literal 22847 zcmeFYcTiK&|Mz)s3P}hh^eTqlF(6eCL+=tgNDEa&(156*prJ{ZUPTQ>x=52QhAv>C zNe4p}u>n#oasB>w=b2}BpMUnB-PxJn`TNe?Ip^GS=kxl!U&qMAP+h~L31|X7(t%G~ zTjN_JB&x&Pjlrd*rMbDegM)+P=VL^l-`Ab52}9R&hVLz| z&Ih#Gec%6j^y|Rqxy6s;ou-NE)Ysv$gF&TlawiwYGKL~E-jGuU!rv_pQ&*b(n{9sm z`FW|6(D1JE+u`R)+F1Hvq-T@qjc)g?{g2+wrc+j+Y?}2h`pdV^Gs{yS zzpT?%X*dq=UE{5}@9udvn|QaGdbOJT`SZuW)yAvEq~%@R zyQ$Zn&y9V%%zWF;eLKy(+f6TanWw+IGdnj!nN0I&Hd**E@7rbW`P_s&czJz&-S>rg zK!@GR%CdK>sZYDv?ELK7+Szsev>a&8OYetJ%ck zxv@{D+0@k3;^N}pzx1i8_gRCnzAfh$78b$>e5R+TFE(3_eC(N>o%L(8{QC9l;?g4h z-}prg@sp(v3sM@#ZEKYGHrc*ZFO~JZGCNXb8~HN{r&s*voka6YisYP-hcS; zVP$poFa7W0;?mUA^y0#z&%Y&lZtBxvy1udQ*fQ106{a4~O}yJpre>yA z*8WYGwy-$w*<$R|YD#P}4(POu^)$L^+|v^r7kVs`u57jsAedZYz9eo z(F`?y35j~xtP|>T$=iCHrgCO?bj*`8vcCp4_r`O`8vf34F0=xAzU+52a2DFcax~7F zS6{nmMbW$ctuxK4g`(MJm55dy(7nd} z<^oZdJMe8Qx-UVr+D;Y%Yrpj2?TL=-P7`SQ0{e@$R=LwgSzb+%%s~tDEfwz5cNnuG zeiiM0{&4pLUHU7m39=O0!mDP^VVfkAQ)xBMU;NEqI4xACX#%PG}u$mZY9>+x3X2XFCFZflpeC zlaSftMAe`KcK4K{l;UOabH0`9Ia*haJfsYo*#|>Sd?ze|%@1OAPd|U-=&EM75igz_ zGId;%s~_dMM~~BJNLOqcxj)Q)^C0vRZboGTQ!_=S>0@;6pCzwmOZTRc93e) zt(JP+!)IC>Qh@CSh0?LzPS=a)-&8euPYhSPm|z*ziskeiB1)!EWSCgm+SSI8;)2=> zUlMnF?MVTK&*Tm^94{&`RCwbRLJow*@}MV&Ow|kA_R+u(?orc-_n{r@=-rYVq9KoYPjvivQRyGOtN_@{^9H~^U-{^`!~r6^VpiB$&_D6>fE^#ma?4|F+a|8FsVC?s~3LmhFgziUTNEb*?LThH!X~Z zeLfrYC<`2~zMXXXJLkUc&xU~S$En|B;V+M3I^gpD+?<@rk}RaT$EiPCvi>q#T3&90 z7u;cIyk!!|`K2-Xu#{bU?u3PWvHHUK8WoI_B5SnsPay>KW6H`2)J<)TsLL*FFYrEoX+WfM%5-)hHr<5|P>@ zcDJcQqNwiuL75-f!=oSI>x^0V4nkXOt_cwIu~M9`L^(+Pff_Mb`Lwu9n+nTB=O`C@ zV@zvFu8uGu3Z&F*(j_xMnc5Ud6z#fVioGY101d{-e9fqZEJmZ)s* z#nlo_R<5<;bS+Fcp{`+c;M#NFLorhR?AUXNx|M_x#!JdpI>){%Fr{U?$ee~ZJL4w8 zlQq<@a62C;Uby>H!vm-9k7UPu9xylEG2&c8-r6%f|+Idn(-iQmS& zEpJwYP?zD)pC=16c7djl zJfURi^TwExlJVHaLD*c?wEf4usJou}S6!?8AYEhZ znj!2Nn`;R$#v2v=9%*$#ilF0Nv8mG)dt!gvK0Y+`cwe|CQhoJl(FxNBY^d#QqwLT0 z0qF}pslQ)Lu^8IOT9CMToV!th)$k$k%4OxA{Hx-sGqS&AE;>H=vcf*M`;^n9|3bQw>~dX0 zByXKX8GIv;0@lo|3eTu<9@#xT!6cZ$gP9I~sh@D-{0{9;*IL(2vn@KWAUle3y{R04 znuUhV53h4bti2)q*y5$7@)Ele9*UaXxA!D$HrGeKC#?cFhjc+&$Lv`Fvo9rh;mDq9 z#pUuut_8cSG)m4X3m&tr#wFgvBk^+AU3z%rS~_N>vo3qrw1VlKY>Pf*-BppEdgXWe zsp-&W+4QT~L7I%}&eJg08}Z;=@mcu%a-V2X-Q9k^i@X!FZ+ZEys$TI}juE6xF7IeCMPNFb(CntX1IMr8LD5ek%2PiYp#B zhk~ci$D_8L#WjgDc``P7hl(p`Vw}t1x~KA6p4)Pou^0-#TL<%1f0k+YSxd` z=N@VAzkn{RRAd~aKlk#4m|aulyhe*Pby;54;JI1Br$~X<=ZywFzn@YT>%a9J-0Kh*CPj7?leP{eIRB0hgluM|8~i1Au+`$24?7dX8J(+ zp*^Rf*)-<5>5ZV^w^5L1Qe$A&kD0`>b1|?k?3LlKdM9x|UTuG6@J|m5TgaX%8h~L# z4Uj=8BP^%%lZPoA4n1$4Pt3CH$?f1d-ln?()E_t5*}KARck+*P-wMInOry4m>=E8P zQ9Irbu~##`jLr+#I3%!bx?XgO(G+3fzVqGR6PO>EgC_f+glp)qclKF@qGum_=CrzS zaO|DkDw#oJ>>y-~>Xys#2l1Dmd>4%?kFhRuc=pYq=a&u-?U-FSWbe@AN;x}%0JPqe ze1+h6f_Hgy7;(Y_a2^!zyU6|qynZ3Z8dv1DIDJEO%(Mp)$>V$C{-LqLGJowh{4$KS(Ym}LSurT>7zv|I3-3eA3qTvl8R%9gskTonXgIW{myyo1v;*zYOSEBCiu^? z!6vs=o%Pet??52AhG;^H+78;AV632@Vdg>4sOE^yO#@^SI0Ue!uuErZNNGChS0gq| zuGN8`B{`p9(luupzjz|HX4Dc&w9&_+8`N|YHrNJ$H~l18UYBzDIwOuJ`=&KGdz146 zhGEA`tA+r)+hk`T06)2J+!#fGPMq=y*-8_c`1Gq+rNdEFwAv?*PC{<)Y3Z$0tlPP1Do?ze$MdYf{L+%(hB~G@p18|=>5Y|!svoCCmZa< z?_H3*282ef7@Q-Q%AFAt2|ig~S5-4t^~XxsUg@^WIO}nkRf#|593|60^mh92)n7rP z*bHGoPs#lm)|a8xsAY&8IqL?y*js+FvT-Ifw(3khL5 z`RV+H+Q(UdD^Sa~44{dS5@^{*d%ABLV2FLRRe+H%hMubf1dFf=V(y))qoRdRMKozc5YO?-DuB-`7bi`{=bsp-~TtsF!6+0bIoj{-$a$`Nb}SA z7SihQL$j9J#g5P)TZN!b|J5<{po_e! z#!e?(>^-QlUe?KB6{fGX=^iq>wukM8Q_>8&Q)Q5UDkGeP&EnfaSf#c1;(}HOlX*_I zKakYVfu9*?IX{Fp%Q=_8^_TDL&t8OnIa{TD#M~ZYJVkOMHm$$kH}hqWvCfwxOaJ!^ z`eXbG!$PI22ivH-+42JI@1L2B*o*Y{eoZVu@9L)e)cSp>8lwkYn>MlUhx9xy5t7%m z(4RA|0g77GC8phFzpeE)k3&s4mCFp4)I^0u(c~K8%lvi$LM$mdw z{%-5WunQGWc$sc!!G@AErL7FpVP~i!BAb0hW|pE|s(diR0ErnjRxENUJ50TQ=9bw z*WuI1tP?P{ZAz&VaXpnY?~(7)xf12~C=oVmVzw-O|M=e99O(X-t@ft=k&cs1|IbKG z7~zRosRN!idFo<>UibYYm-o!|!h4mrHSx3wX8U(tHw=&;)D5;y#`{&-HB;JT(wcN# zw*<5&{Knra_pyx1Ti41Fw)nThpA1RgJa72P$}lVOeuu}7fCsOU9k_|ubeYe73j4I8 z?-dq6oJ1tQG2JF+*0q1_)Jac}7Rhvpdvh+t?^nMiU%RJXW%QD23J0&dhcf{qxEska z;o@ka#&Oc~%XxaKokVN-g1YG-1rF?u5^s zw&gwNhrgg@*6QZia%foZ9v9d4u!;rdNcA~=26{=iany2pE%n7+^>pPAPzw>b-`^#% zX@t0_HbF)DWX9m)>1Apjhk%*(!Aj;zmfG4QR(61o3wKN@<)WhS%Yw=Qp!j<5T^7TRi%GSHi-h!%RKaKI#AYTQPTT0KqTt$Lp@h zGNZ#VCHF<_)v&*mfp4W$*_>7pg&(p=SZwYKE#B%VnV{&un+SYVAsB)+A5xP^lSJeY zuy3m0K}O3mRxNbNr8dBw^vl?eBsM@1s&LY{!{VsYdxAVem(u`kvt0=CS1E& z@XNR$tRnVtzx@g*9!_Q{pT`1cmt!zekv9I8{=$hUi6G6pYXzne1b-OUjv zNa4UzU^$^{AK5t(sFKlcf+l123yp4;hZ5gfJAXCxnwNcw$&?xFh+TpKWHk;if zf79iRKyxuTw+6dg76`GXV|#=jqz`H_k;Pd@leEA4-Pe-ozH~`{h;>itiROh>`4BG? zu1?2$zDicP!mT|F#k?6;@l>UcohzDELl!yIe$++4_s{E~m#O2KVmZTl+ICf4QFGrO z%U6=|m-w}DyqpLHt2}wVpFQaXR#>E*2~w99!>b&f@JaBZ8E>AY#N6a#U#kQ(@0__} z&iR~^gdSEme|EQu)9CG*OJ-*6?C4{!96R}CJL$B^45?A5i~O?YQgICUo=fdyV3mVe z%al+<-y}?L`h@Y&T^EQsZms5{#wK0_+43*eLw8{AKG1|cc?+rIIM05KT(n$u z4_!+arjVCdyjONA$zQb`{iXfF=cfqj`mc*pZ<1XY%f`gMGkCiROLzbU$=3%)NZU8b zIwzG*#cR}n_fC@+Q0mW`5eNdKY3|#TLfFbZ+){7~$3vvPdaq_O%e{u&h%e`_hVnH~ zwkqQAA2Ad>eBi`z)bC<6lziRIIFMiZXz}}bVh4@q&tXNcL30=Z@||HDTAiDA8TCq2 z`iIDiRQrYu-gn_Hn8&$EtYqDgXTS6YUPLm63x6jSb*^w(9%Be(i1kqqL~i3qZ^;5z zYkZ@{?-#QJ#bpmBedV2sNH|Sz?Qp=dYd81Z?+wkr$D^rTd*zmYww(X|oO#!EkO1NQ z-zoY3mY@E=L3>ks<@@Eb>Fyo7Oz89)#{w5bnVsfnP0zE-@95$9<$DYmb6=F-*vdpX zHw5NFgy{A%GqSF2gxHBwnWcE{9Y6d>$v!W874U64u`w&TbQyij_+i7RiCkx70wMD2 z$8BN*B|V;Ei>mD8gB z>=#F}!5H^O&Iu!_v{>E@Nj&nedEO(0E|9kzFBU8rgP1wi(?N^hPr_U$P zE5;(VHixU91;15Vl^nWqMz6whr&y=`uEOWi{CC4LPx+@9w)=S)Y2;oMfMBY7$@nGd zsl0#qNOVa?`>_~LchAU2Nq$=cMhV`FH9G@*haxkb$fjik)7W{BuU&s15p;MQiOans zr+$FfMqESKNZm6Ma#6L+=XP;Pf){_AkLIPVWSzUTV+|cM_Zo-rU|V#0k>ihQ0IJ+C z>L7#NCIxz`Hk|7K-`QHE#}&S<^8=;MnY_)3o}g7@HdrQ<$5gf<*>ncI4^Qg{8+rM6 zC+$9?Nh9GQPh0eBw~Kq(l;)Frd1iW;qfe%{@;!+iCN5|UL|prw%y2(_e)hh;THkNNo}l;N0E22zUrQ1?goY+15TxroCbp5k zjIUJm9EQi$Jw&BmfovLV;e6r0IM-#l{33rAOra~}g}udkr+NHyTeG)4p&uRyZV%*Y zU@-5l?2b61WoW|1f*=yjIY}(w>bL|45M0}le_eKUne^G3jqBPh|1fmqE&-Xm4!NV_-OaJnSFN99ve>j zEXpDBLthJgf=DLDDC?RGTPqdAdXX-I1|)ewymgXFP&7}ZvFJ59_U!)VdgK zZd+3ilPCyftMG_+oB`wld(hh9ihw__`|*9GxywCrhN5B;^aA0H^_eKNwOE;AdV+Yg z9EZfsa9`z11bs6kjc-xR2Q7%j)Dj!T-RZ}%3@d!Y?D(&2p_Fd*XO8e9!R7pXeE_-F zL$+2`&gDNcI2CC93Xw&AoQxrhD;P%`GLR_>`W3uvc(p6LjWAZf59auxcib*`r0@?Z zmO8>{v7jw@JD`_Wbrzj`KzoGaqq5lROcwKJSA2-^5-=nx3AR!S4KDfekYxId^DF@- z^(y;>E$RbDV)cdho196P&~Utxbf>W{ybGg$L!k*yJX-}PH6($3&nq;^B1p{Wn3p{k z^^r4?MUVvXyH92H!a%U!O>M7-WJ~Z-VP22Hw~BJ_(NQ*-zTcDoByd`RsEdB96H4spV+*yU}aecNf-?pNf_A_hiU-i=gVh(QP za_|rp%t`nUXGmb#3Hi%BegfH|q2#ApqtYBO{D-qNY==ZX7~xDzkiK^aGXeaqLugPO zqg7G+lkZHPE368mJcR@6k?|&S*`mK4k{!+}C7Uz=KQDN2W2sOk-f+lCShF;S9&pQK zIQC5IO}3{_D7r%{dt`8{LrIRo6`tW)-O3|1z=l^xEC-i#3rBsyHd=4|dklJ>_vdK* zMxTiGYlqo0L>|Y=9^1h5m4~(1vAm5wg=rDL`6RO=Olj2~01s`7Y^d2M3m%e0SYKXXsNYTj4p#QCJ@16(Qb%}wQR zP$UuHWivH0_jxgtM+%@iJZx@#5)titGv=%%Z%b=}EKL3Z|9dB^=Xrm~8}X9 zqbHo}Y9H1v7^~nZ)vpH=Y=yk_Cy-u9!(FvX@+*0bD7+AerGoNbxnift7?7+ zp2MrR6@>ZF*xEfm)<C*)~ElKAhp*>dv&5N!~GTZ*ozeQW1TK? z&9nt%#8(Wi`A{>4(4On^Jlz1PCeJmLn@W2&xWe~0G$mk#e)R6|9|t11TJ`wPLL6MZ zAIb~d$*0^!wxZ;Op{TsOzdzoEQUc#flDpNy5i{gNN$7qq+od#!&`~5d4-!BGM-GEI z)UWj*U`m)MIpYY~ZU#BtDA9`BrUSPVi=Z}Ku01zFS>EWAe&Mp+p!QMZJ`v2#4Ri!9 zT@=3bhzHdci`LtWY-(ZW!y&Dtpmz^1=S%VkeGL129sEUPvdRN%5bRc%SZORY5aH%e zv?ob&*VchtxSQT(5UZI`|1vPTE-ri~F1n7DC(Q?%>(cE@3MV+y&m9;=(c+RTz=s2D zbP_aqGj5RT=gbW_O7c{1Tqmj}+zExs>45ieiKUK-CGmG4&+o8IaeX^<(xM>m+; z=yt5kXmW`olT)#;ASLA<^+uFBeCWBmWBqjy=bPA{Jf|Kjw*#Y9K(r+x%maxZ_Y+l! zpe%6zUfNY@Hf}lw{JojfksEWNJLZgf_&zn2ZIt~b1&AC?{zyc=YlV@GNE^mnwPeV( z&`@0x*h)=hq{PT}vkF(H)NfmZ{XQmXTyJBcP#j&`y#?}RCb<>hIEzb@b4Z&o<|_Oc z2A4`|sz~YBV`ocaG|tb8Ov^HMg56b%&kyC=+)T#~W!dLvF`HlnLfN$gA5y=^7V)utUyi%E#Dt$qmdRQ zM0#kNZhwt8{DH}%v{{OKzO{2Yn2jkGIa4fri&YkYSrYu&HX*ToHkqovRsbv?U#!eu zT+)&)q6ny%miP?8RLJ0aX}1Cg&K^`|{{if$F^i^YF_c^q?aOF(rr3Z4T2UQd?K^a) zCF$&-uiza)Jjgc6pfU;-B%`flipyxFqKZJmXxWvYWr0C7$79U#A| zG67rBN(JQ*p*EOER}w5$o#WCvXbXpiVv+<2Ohqyk1zT{TDh@gYq->R~(Xw;_#mZX73%mrVIic*uTv;|j(f@Vr1<>~iRYqy$xX2oH6}Vbm z&DrhpcXMS1qqip*xrOU$XWJoVbq;K%H9};_${f4a4U^k3;BFY0k7wB(7Cxurx0?w2 zJ^hr8RK-XGO>m{BJh<&>z~xxCIqAoED#IbJA{$>}5LPEdKvog{lb=df|FagJnXAwN zhmU}!w~-MIA|j>_%tHkpFiLeaN;o4Q?bS-?fVXf>`p!*;)pcbUI2i}E^+F4*LBfH; zQ^ICKfZkVH&FRCk#n@I#7C!iwrlSwTf85rD%|Iwk?{`AV2Uxkbr!k z*?tQTzkZB|Qd_#J5q$(?5+kH%&gwW?uXa9DSh%AJt)C^U=0v~DC`&*WYqqZuD=u+@ zx9VQRpqZZIpXuTmL(`xQ#X4`3Ac~*aItXyL5R(-s^fVdByA1{q(ES2keV9ik%dDqI zU+S5$lsy24lfbHK1}I5Sb`@&0t-{atQi=w=;LvU+wuq)dL(`sfQ$Yhf(lO+GAL5YRd#ok%v+X$MF;jRQQ^EALGs36FMG)rsy^`Ixl zj4A9RXD1E@(`qs%z>?;m1fX}z*?_6$+}{;Yfd-h6U@j$Ruh1Ae2m`)0aJxECiU!qo z0Rw($>ge~Sr*)`zKn&{OxA3g6LW)&Any!ayHLXF21~gGI=zzKk-R++AG$;-O9tO+* z&QKDffvz-&!l;rXdB~M8L|RZ?&OA-(H8SXgsgHp9WSE=tD?c>T9XYOVy05IlS)Zr9 z;vR*X;b5T@sv2HpAm$Wv&8gqTK%dKNxSj?S+lPXxu>nvGaz`luDKA9L3H0mD_gOEq zcH*d00iDlZgLpF45@@yK&O=RT3y$`^{jqBiUf$s%rCaybZBOENubwcedsNo6=NE;PQn-L^|;_~kk zEv5~K)5e$?hd;xQb->dWvu-cohh&&B0d0$i#}bf5uINV*tf5b59W3C)5dq^L(6glX z(NE`^T<0MVK@ZZ&TO1Gr;(XVid6+9q7-w}DsjN*xM4p|eGA|rr5!%Ea%Vj~n)w+er zukZQNu2m;;T^hBG4w&w-_xlg01=9q#pR%drpspvFPo&WpyJ$>HG!{Ay^%gw6?fEn11R%|SmJCB* znZPV9v)qTBrSe1F*u}QtY7}_X=Vc*nP>=#Iw1Ts#tw^w~hIsH;5ysP>E}tO7Z1Mdj zmwDrbSM~2HUv9>HVO!PJZbpD!D;JhcYB3xuYnIyUwr=b8ch(&rtzYO`cUf9@qpuT% zHaxXAyxlf@?`#DBA1=uMCta@paZBKTot0kEH~NnYQa%06q>BuN9?V<)b3tySoJ;%u z4;SQ44e!d@KNm!^wubP}1qlR`TF!k|F((5G z+owqR@W)BNxO;D%)wDbzSMnENkfM=c^ueXuJg+?y#Lbb*SR{*KD>mZblf%C*7yZ!g zo*+Z((rrdYu!lW0Ig*-?j!j!hKx*y2V%Noapdui9*1B=(H)2KO-ZkMKi|e+=148Ld zV+_nVu}U!}h5H*@k+i@@+mzasxq6A7j}O_5YyEG|eVcB=?q|Ca(3iv_ z6%rH$!TkV&+IgC&`-`DQv4`{}r`yc1nV*T3!e?}aBX+*+4e9R_X(r#|A0a!-?wioiig`% zPC$O+nt?(*SwWE|)AS4%a7CAx`a2`y;zufnTNRF!* zVZc18PjpkQU&&Na+SgoEa!V0S?#UfC~ zhBdUrK;C&CEv$aQb}vE_SVf8`zU0R2W<+b5imDC`oxhcl$p!-7<|Ltamteg7mp6gKIEpP8n`gl9FKu>#eIoN0P4}xG73y4WnB+u&rPt6hP2ak3k8cH z?sTLV?kVl9MRVihl)4odJPvvipD9s08i_6&idIdw0s#3$tc2-U;)RgnAh*;-f*%kY+XU77ebiEXRWgvn#y^eA}|zk zWW6*Meg-RYzKUQ}whY2}>L3K0Gg+1PAsmo8fcrrL6d^b%Q3YEP%LQPS7qW}bovp^Q zppfSPge%(Qj}?a z>bKdgotuK0avUSw4lmd}SJ2HT?@Oph=)O&7v20BK`o-y7^_be7#&oSn`kJv>;@l*I z4@c{pr&n%vBzTck8=i>=Y8cSsCUy^6+r=4!(?2_>Kn`J#=M!X2=S}gBMEHn-f|WIO z@!PG#4rvU`+kn_Tv|HMc`y3FUj<|il((>ZVBFy=&I+=s%;N-K>A%#(A2lOPg>uba* z^2-j$Q|rronpUiSvYVf&)cjl6td!5*| zm$yC=)6D-K8qhVwu(j#Igw0_tP`FlR6NoGtu#M$`DO(JLt%-^LtB%x_AKIjF+9&bx zybRpXsvh0Q380{qY~}OQeIwRFNx0 zP5zs%$mixqcz>SWKJ@o0mi2g$Zqt45<-R2hns+h8sRzwTn`mIn zauL=)e=YrH=Y~3~z8p)!)vFD4WilE)GM9}v#Ve*U8qYLrGTg55jlP`_J3Y_fD6$u< z#0(wT(3Q(O|Kkbi;f9!6TY>yc52XV@fD|e+7(fmU(LSrXpIJEPmJB)79haE((y?;-O*ayE_HRRM!q^cHCkdF#=1PCkErEtExh+wVYW&qk$jG9jOj?`IXzwx0@9G#S@x%Eni-0TfN3;x&1lm4#e+{ts5g z`t0wr6e&rO;X)YMiV5XXEG(ECy^@PWNRjOnqZk~~;?vMlGN3UkC&r;X9tHo0CU!Ii z#B(&_8jNvORiWfofG(7m0-8}_f>Z`$VieSoE1@pNd?x1nQH=Q}Jf8}30}vH5LjDyr zS_vrscVXZ^Gy<^Dpx&EM7BXC66wZZHV75{C6NezsA_cL~HEK*Y5F5G~W1s%7%N4Vh zM&_xzLng<1dP>Cf#M0f#GIb5{^&+w$4ro$>YhgfqJVFJ4a1&x=NO2J}aSrLozoQ8c zrDFdzD9!?^p`&C^Ynd2psb(M{d0Z-BMM8rNB1s8+Bv2L)e~nFi)Ee`6Gb!8=Rga6s zkBSp;@w_yIG6^b*lkm2d7*mI+QN=Vcs2tunZc0)t4c_xA&Jj$6?4(3EGUeAnc!(e$ z03i^ddKrnlY0x_~ga#prmkb6)0i}Q_-@hYN2T`J>ti{K1G6bedT$Zg0b*soU9}8advdvc0Wx{PJ`B+j88)xC4%JNPM|Y`P{)yxi@BW{DX3D zUCIrt&%M)@6SR{XrI8b?n0K!-`$kaS-DB2UG@it;+~V%MR8(%d1}3vICp!$oQI}sh zoB!xIpTbvAl%HRqfhi6vsE{rwMX^=R7F4wruqlF&<$_AogA+Or8ZJF(Z+p-=`=IOi z0hO7|CR@;VZ zFZ@q#_|M?=ssD1rH4eVfdg)1j6}mdZw!9B3{wFuwJ>uuj|8m3W+JFD?z@|GH#;yK= z%pieuN9CADg3u%33gT^X$FU?X?hBwt#QK+RIFn;5JHT;bT(T&NtC-yMDqp&cJoYy@D=yTt!if_4WQ{!Yc zza7P5w(``cVs1MMQ{g$t`aV%47BlqV>PjSlO(g^CS>iQ=!2L5fKBdYEBokxvJf&Ze z6E8LJnFuITfnH?VeE`aQr%CuDyRNZD1%OkheJp1rlf=WlgFLq?E6S>5s;<|NA`9q9 z;;0m>h`C}ce`}S8EUOlkW+X+XY_SJZcx-)Udb6R0k`;NLh}Cn@&=`nGwOYwEgivY|8yPLImk_{?Yr;IO^e*!J{^Dq(`q>L{0vZAdOr}QjH^V3Z zi=^$S0gq6KRX0jKT=*O3i$ok1%GFAW>2SRvJ+ z5Dg_mMy(9_7%`F22$R-jR+d!c>BEW84=F7}6_ed?4lkHi>}%KU`Vm?M6w4^KW3CHh zGdQ=s&%h`bq_L5o`aEpd@e~`1$wij%bEe`~W74Uncy=Q#{X#aq`9KE@fNc4`6u&W* zyInORQc*-kgkw^FD&&f}ljRmeIrNxNn6U$ZV0-nfQ_J+#zhC7YX_~Ly3u(Qd`bFoZ zUdMG2LW^0i<>^6$Z~#*cmGMFAW7sL9mnc&b+vC+o@+2Ch8(wGD!Ap^PJIxGr>*4vc zY4l43C#UL2isEW|ye{S!i_r}>#de;$mmcpe=5-E&h49O5A&nRgL&G^%$O0OECF-dK><>w$L31KwUa5YNAsk$KvS6V?dq(D?@^*03IBzGXiJQD_^giz_Jv# z8VJ%Vhw!Epvv74Cpp5h`TnI|RGFP4(5*fdHe;Hm*FZh`!-!hTjVx)P|8ighr3p@TXJWbd9}qc?l2zL!k~lI|q3jz54fZ39uNkEZG>Eg}`O9zf7DQ9Mt- zvY#`xiad~idv|o-Nb^IR^HKq|p?0*}{iP|?J$RXSP({{>p?m3|`4Hltwoo1#8Ff;Q z5>a=$m+iL>B%YgCtg;^He%BeajIz$!Cq0Ye`LeXHl=s3VuP3mh2^6*Ed6^mC4W4Hk zQy=B5erPbo&<@N5G_dioo>#m*fI&s|Ugh?BsppLxT`_J2yD2)~fr z7q2Dh3Y6ErlBrML$mf8}do$uc?=APB96#_Wvn77pooeJ9=s{^Y8LvPhnN9DV&V0P! z>qmn?6^>#OK?v|lda@v|?f*D52$*gaBs!7NYxKhmJJ%~{CaS9diTaTK;UP(c zfG2j!3gTd?ecQPe7~ceke`c?m7UYP#0xR6XCj*+Bvgk(fHCHUN?f$TL0+v$qu*g zPoH&u@1Xn19VPH+z0zL``}?aC@$%T^f9vMl|B}ArJ^tm3AOa#<0;x+R^B#h=Bxi}2 zM9mhNC6y*#rsk~FwPNOsn?Q=G<%QG?%?p*5mKm89Vk(*~a;}`Kd8=ivHk2&1MaTBT zd7Q`j?fiDm`6phV*ZcE&zFx`KO*@287y75gqxPtGca3Cb$y|WRz?gCV-0>fWZ6_7h zfY8voE$4OMJ_MHq(Lecg>}ura)cdaS{liaToZFuO0v8-P{?3~VmmQBj%0()<@1wYA z0~br+EiiCP@EwlBBgl9*N}k;aZz=V*4&f1Ld`A}FiNhmt_-;zRhm7xG;8Uh~WP)HF zOK^fBST7T}O9Vb60>=>CMXWG@CJbT;gE_(wnJ`Q#^bf&h>4Z!|ZUikil9juQlgpCj zZqpE=M{@TWa@hn?JWZ6i#3*w_DKb&2Qj|6#I%p836U3P`@nM$u2uIA3iL;cSQ|}yu zm`jlGX%ZnzBH~C;5}71VDUr%>{})~1e`^eWygd4!jlqps;-?$`OJnfd$$uMz*AD&p zd-GS`e~)$k*_P5e>aCk<+l#R55^z$dH0Q5e{thBS?Q>pvK}3$p%4Z;t7#H+W-{k2x zKD`CKvNm5_IIG(R#B+UaXFWp?`7SQ8R{yxA(vru1yiQfY%vpv;HViS0$2((#T_%Lf zcco0^TJDKEVPoquZST2B3e-ds%2FmzRIwnr;AIZNUgFzSgm%uXiJvN<{h^pT>HCf& z1r8|3C-cdwqTYhcFKeHl3Sa-~`DtcAzZrg&j{2O_$(Au!e2o?aY17)VQkEeD-FnOB z+c&Md(la0{A%}S|`-6t}sO(TF5qk4Q#Ie6x_osIS*|v{!17R_8>=iykqJrO9P+vcE zCEs9sVhu7<+HFQYJZ;Z)AI@vKX>ldBry~{JL4gEKEP>bFp3z?aG_O4@HFA#u!vk{MM)gU;Z4eOIP<8r{%%gz`j58 zvZKnMwMFk@48c4*r@7sP_Z2bM(G-rh=P@$7=7w>=MS>@j!yAc5f61(8bC7D)Vzb{Z z9kmB0W{`hC_9=ce!8unkTR~_7&&l3*_&X)_ba@VELM$Gg%lE0`GMpM3b3o67I^Jg3 znR84Cj`3QZZxh)^&PFP1uiZ1-?5@0T+0IIrz6!{Gbk&w&;O5@i^!DJop>9-R7Lq9$ zO?wh!XjMO_k3_V&w?$3dvHkc1mqC4Y%>K!Qn+LD^#$d;w!4d-SkP#Hg^7J^Q%?|8u zcS=nN8hU2krLk9&UJ@i`lJIEnv!cV?T+8%0?7ZSs?XZb2szN7p395v|2$k`=mdZzL1&pcGO%Eb|gdCXr94YJMna*?hSumioJfLGA4+ zNNb6++1SP-ziTbbC?T!$nh=u>jmM38tS6`vI#*8>vBRI^*IJ%nnGe~=NQBF%3&C4+ zw!@!B$o+_B_TCaUtnT@F*KIdRb`7BrVoHL?Gnev6!(6!vo#d7d;d?qB3UQG`$in`? zB%ig`nP$RujiC=x!*;-q@+V5+Y)BGIUpbCWCf2(CL=UO0aBJbNkt&EDY&z_PG?~`F z`)ew52Ri6k9UT`_2ghji=N{K3`wINGI!4n?LUmX{C!iID?T};U10MgbuZ{8RWP! z74uCgTQBW-GVr*)W4<}P;8OI?w2pe<1d2E2HagUQ4cBZ9>^UyE`7`=pz^B9-gZt6Pum}vnIg;@C0F1<#%JqE6v2lD<`=l zohT!Di~>Wv-&odQ&{DOf^D)l!l3TYG_hbNr<8b&z?`GSf8^27MVr(6sTR2#cJE*AT z8JSqOXz92=$8@0qAkJr(oun54R2Z(`;q4adSZQ1jm0!{>#(vV(*asNXbUjvTvs1On zt375P!i@x_Kd|NXDs92p-PB&ZgPIcr5Iwvci_bs|wWsJlhQfmC>s$bXTDVqsGB782 z)GTHIkxQ>cJB0_U6GIvTsBTPXMHw}vs1m)C2L<~EPbVe0j;6qf&W4{80y?WyFa3_E zCQXqN##Q+>VmI$1KXMQsbza!KyO^>b3HIP`F;f-(M#l+;r~phok2OLf<7O^AJ^*wh ztFmU?mbL3>?#;JvZvTzi3_mi6+%hbf4C1HP!0j74;%DkpS@M9^;}7%?VWe@n2&-h@ z*CI&<%Kk%lYcGv9h+Jfry^jYJ%Qd$f@%U{tAv%rMUh)J|XA=x6{ZZau1V!(sf3G*6=g3p@9L^P?apOn-dV~3>K4ja< z5}~l|a^kU>+dDZzgc6yE_-1NbvG6r!b`FM^3~S)uViEFaZ;hO4PRF=u@BUsCp5Twy z{DI90pV)AgYGRrqzY%DrC0z63y5~%+HYMZ z_gm80_df>bf{5b`Yy^&g5;D60h<8`5fMx1L703wcxc0plrftg%^FS(9T8S}o(@_{SWR4Z zD$C#PEe*Q~mjGJ_;2lgOPS7P?s5Dg%5x=2`&GI6Y4Awb$e~tv_PRr5tE{rAcy<)CJ z5nk^W)jzPSW3IGCTJMn@dVkO8T$ysPo_w_b{=UV}V&6a!hYrTu=w%vo5*_%w+W`6B z$T<8D_AbJ&+m$oQ!qP>GzhY4itM2H=y%v`Q4RJ>|D~3V@kI{Qs6`8_vzvH&U2vsu^ zs3u=t8i;)JxA4Fu{2XXiow<8 zLYr`eKCz@cM$+dOA~Ni=YDYL|o%j>`i!(mGKILfN?vb&oro=2h*?+0*n#>#V&v2-# zbd?DF6ZS;qf)&Q@3rQb*ebtLkNa5+Ng%nlr;R(M`mKbZlBc12bIQT~?pPr!c?nPFz ze$$dZ>Bh0=amz*d*jT$(9=MK04D7V{;u>ha$;D;@9!szBTn34p{ml=ffb<|;n?5}3 zu(7`f2Qe>vLzlPW%0$>yWmj~-&cijmR!X#&#!rym1;yp451fT^S|C3> zIBrgYF540E+M>;Lb&U!^N1qDVNZ}AO3-4Qcf%rL$C?7_0oIMiYqm;vm?(B3>7&^C% z3w!I<0OCn(f6atsO4V(4Fj!M)xtL%)HYl3%A z2Do|buyDzaJNzO4(J`9_a4-=xvHW2EYPl8ZIGYF8-$Ji__f7t@fY9X+#W)#=V>zjLY3w8SAOU(=O3}v&uG##z4>r&!pgrLyzEJ_f<3p;f z4G@@_uVhR~6utSU8|5w$LWM3^Xo3H+gV|F^tQO`pWBOH^j!)-L1beo`p@#+4s4}M7 z7jqBm#Vj>1O+c+6bQgnWLZ^i70zf|QZLQ!rQO|^K&4M7?L)4aOT_So>Cb0q?M54># zFgCm7id`aw--Sj2e5i2n1^q~9cpNFQyf?hTtNgQj)t}Ky8~$~#d-N3}gAMC%^glS5 t_1V2P()vPw%B;{=O@}x7Jn8@GNQeHcPTJ`EGW22AsJ=Q2G(!Mi{RgJPurvSw literal 0 HcmV?d00001 diff --git a/static/check-animate-once-small-static.png b/static/check-animate-once-small-static.png new file mode 100644 index 0000000000000000000000000000000000000000..da6342ed33ebd2ae890eedfd4c8844510f7e5250 GIT binary patch literal 6477 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 NvVxj?m8@y#{{rIOVuSzy literal 0 HcmV?d00001 diff --git a/static/check-animate-once-small.gif b/static/check-animate-once-small.gif new file mode 100644 index 0000000000000000000000000000000000000000..7f109ae1d460053172ca44601674b5c2546b6708 GIT binary patch literal 22847 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
Q~W4Y1#eLPvq=hDFVW3wLU=FXq12YHYD6Ca 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 QKFk``S7(7{2;i�yUbi)&Kwi literal 0 HcmV?d00001 diff --git a/static/check-animate-once.gif b/static/check-animate-once.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ca6d834642df5349571f85b208422707959487e GIT binary patch literal 21016 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 HVAH<=ERJZt literal 0 HcmV?d00001 diff --git a/static/jquery-1.11.3.min.js b/static/jquery-1.11.3.min.js new file mode 100644 index 0000000..0f60b7b --- /dev/null +++ b/static/jquery-1.11.3.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; + +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("" +},load:function(t){this.src_setter(t)},src_setter:function(t){return this.getIframe().src=t,this.callEvent("onBeforeLoad",[]),t},getIframe:function(){return this.w.getElementsByTagName("iframe")[0]},getWindow:function(){return this.getIframe().contentWindow}},webix.ui.view,webix.EventSystem),webix.OverlayBox={showOverlay:function(t){this.mg?this.mg.innerHTML=t:(this.mg=webix.html.create("DIV",{"class":"webix_overlay"},t||""),webix.html.insertBefore(this.mg,this.x.firstChild,this.x),this.x.style.position="relative") +},hideOverlay:function(){this.mg&&(webix.html.remove(this.mg),this.mg=null)}},webix.protoUI({name:"scrollview",defaults:{scroll:"y",scrollSpeed:"0ms"},$init:function(){this.x.className+=" webix_scrollview"},body_setter:function(t){t.borderless=!0,this.gd=webix.ui.A(t),this.gd.Xb=this,this.y.appendChild(this.gd.x) +},getChildViews:function(){return[this.gd]},getBody:function(){return this.gd},resizeChildren:function(){this.ng=this.gd.$getSize(0,0),this.og()},og:function(){var t=(this.Mw||webix.ui.scrollSize,Math.max(this.bc,this.ng[0])),e=Math.max(this.dc,this.ng[2]);if(this.gd.$setSize(t,e),this.y.style.width=this.gd.bc+"px",this.y.style.height=this.gd.dc+"px",webix.env.touch){var i=this.getScrollState(),s=this.gd.dc-this.dc; +s"+this.pg(t); +return t.open&&(e+=this.rg(t.id)),e+=""},rg:function(t){var e="",i=this.data.branch[t];if(i){e+="
";for(var s=i.length-1,n=0;s>=n;n++){var r=this.getItem(i[n]);this.type.sg[r.$level]=n==s,e+=this.jb(r)}e+="
"}return e},render:function(t,e,i){if(webix.TreeRenderStack.tg=this,this.isVisible(this.s.id)&&!this.$blockRender){if(t){var s,n=this.getItem(t); +if("add"!=i&&(s=this.getItemNode(t),!s))return;switch(i){case"branch":var r=s.parentNode,a=this.Ne(n);webix.html.insertBefore(a,r),webix.html.remove(r),this.t=null;break;case"paint":case"update":var a=this.t[t]=this.qg(n);webix.html.insertBefore(a,s),webix.html.remove(s);break;case"delete":webix.html.remove(s.parentNode); +break;case"add":var h;if(0==n.$parent?h=this.y.firstChild:(h=this.getItemNode(n.$parent),h&&(h=h.nextSibling)),h){var o=this.data.getNextSiblingId(t);o=this.getItemNode(o),o&&(o=o.parentNode);var a=this.Ne(n);this.t[t]=a.firstChild,webix.html.insertBefore(a,o,h)}break;default:return!1}this.callEvent("onPartialRender",[t,e,i]) +}else this.callEvent("onBeforeRender",[this.data])&&(this.type.sg=[],this.y.innerHTML=this.rg(0),this.t=null,this.callEvent("onAfterRender",[]));return this.type.sg=0,webix.TreeRenderStack.tg=null,!0}},getItemNode:function(t){if(this.t)return this.t[t];this.t={};for(var e=this.y.getElementsByTagName("DIV"),i=0;i=0;i--)this.wg[i]==t&&(this.wg[i]=e)},zg:function(){for(var t=this.wg.length-1;t>=0;t--)if(this.data.getIndexById(this.wg[t])<0){var e=this.wg[t]; +this.removeCss(e,"webix_selected",!0),this.wg.splice(t,1),this.callEvent("onSelectChange",[e])}},xg:function(t,e,i){if("delete"==i)if(this.loadBranch)for(var s=this.wg.length-1;s>=0;s--)this.exists(this.wg[s])||this.wg.splice(s,1);else this.wg.remove(t);else t||this.data.count()||this.data.jf||(this.wg=webix.toArray()) +},yg:function(){this.s.select&&this.data.each(function(t){t&&t.$selected&&this.select(t.id)},this)},Bg:function(t,e,i){return i||this.callEvent("onBeforeSelect",[t,e])?(e?this.addCss(t,"webix_selected",!0):this.removeCss(t,"webix_selected",!0),i?i.push(t):(e?this.wg.push(t):this.wg.remove(t),this.Cg(t)),!0):!1 +},select:function(t,e){var i=arguments[2],s=arguments[3];if(!t)return this.selectAll();if(!webix.isArray(t))return s&&this.wg.length?this.selectAll(this.wg[this.wg.length-1],t):(i||e||1==this.wg.length&&this.wg[0]==t||(this.Dg=!0,this.unselectAll(),this.Dg=!1),this.isSelected(t)?void(i&&this.unselect(t)):void(this.Bg(t,!0)&&this.callEvent("onAfterSelect",[t]))); +for(var n=0;n1||t){for(var i=e.length-1;i>=0;i--)e[i]=this.getItem(e[i]);return e}return e.length?this.getItem(e[0]):void 0},Eg:function(t){return t.length>100||t.length>this.data.count/2},Cg:function(t){if("object"!=typeof t&&(t=[t]),t.length){if(this.Eg(t))this.data.refresh(); +else for(var e=0;ee&&(e=Math.max(l.length-1,0)),c===l&&e===u)return; +if(webix.PowerArray.removeAt.call(c,u),webix.PowerArray.insertAt.call(l,t,Math.min(l.length,e)),c=this.data.branch[o.$parent],o.$parent&&"0"!=o.$parent&&this.getItem(o.$parent).$count--,r&&"0"!=r){var d=i.getItem(r);d.$count++,this.Fg(o,d.$level+1)}else this.Fg(o,1);o.$parent=r,i.data.callEvent("onDataMove",[t,e,r]) +}return this.refresh(),n}for(var f=0;f=0?e[i]:null},getNextSiblingId:function(t){var e=this.branch[this.getItem(t).$parent],i=webix.PowerArray.find.call(e,t)+1;return i0)for(var i=this.branch[t],s=0;s"; +return e},icon:function(t){return t.$count?t.open?"
":"
":"
"},checkbox:function(t){return t.nocheckbox?"":"" +},folder:function(t){return t.icon?"
":t.$count?t.open?"
":"
":"
"}},webix.TreeAPI={open:function(t){if(t){var e=this.getItem(t);e.$count&&!e.open&&this.callEvent("onBeforeOpen",[t])&&(e.open=!0,this.data.callEvent("onStoreUpdated",[t,0,"branch"]),this.callEvent("onAfterOpen",[t])) +}},close:function(t){if(t){var e=this.getItem(t);e.open&&this.callEvent("onBeforeClose",[t])&&(e.open=!1,this.data.callEvent("onStoreUpdated",[t,0,"branch"]),this.callEvent("onAfterClose",[t]))}},openAll:function(t){this.data.eachSubItem(t||0,function(t,e){e&&(t.open=!0)}),this.data.refresh()},closeAll:function(t){this.data.eachSubItem(t||0,function(t,e){e&&(t.open=!1) +}),this.data.refresh()},Sg:function(t,e,i){if(this.s.threeState)return this.Tg(t,null!==e?e:"");var s=this.getItem(t);s.checked=null!==e?e:!s.checked,this.callEvent("onItemCheck",[t,s.checked,i])},isBranchOpen:function(t){if("0"==t)return!0;var e=this.getItem(t);return e.open?this.isBranchOpen(e.$parent):!1 +},getOpenItems:function(){var t=[];for(var e in this.data.branch)this.exists(e)&&this.getItem(e).open&&t.push(e);return t},getState:function(){return{open:this.getOpenItems(),select:this.getSelectedId(!0)}},Ug:function(t,e){var i=this.data.attachEvent("onStoreLoad",function(){t.setState.call(t,e),t.data.detachEvent(i),t=null +})},setState:function(t){if(t.open){this.closeAll();for(var e=t.open,i=0;iu&&(t.y=u)}webix.DragControl.Ed=!0},$dragIn:function(){return!1},$drop:function(t,e,i){var s=webix.DragControl.getContext(),n=s.start;this.removeCss(n,"webix_transparent"); +var r=this.getIndexById(n);this.callEvent("onAfterDropOrder",[n,r,i]),s.fragile&&this.refresh()}},webix.DragItem={_g:function(t,e,i){e||webix.DragControl.addDrop(t.w,t,!0),i||webix.DragControl.addDrag(t.w,t),this.attachEvent("onDragOut",function(t,e){this.$dragMark(t,e)})},drag_setter:function(t){return t&&("order"==t&&webix.extend(this,webix.DragOrder,!0),"inner"==t&&(this.ah=!0),this._g(this,"source"==t,"target"==t),delete this.drag_setter),t +},$dragIn:function(t,e,i){var s=this.locate(i)||null,n=webix.DragControl.Gd;if((this.ah||n.from.ah)&&n.from!==this)return!1;var r=webix.DragControl.getMaster(e),a=this.getItemNode(s,i)||this.y;return a==webix.DragControl.Dd?a:(n.target=s,n.to=r,this.bh&&(this.bh=window.clearTimeout(this.bh)),this.bh=webix.delay(this.ch,this,[webix.html.pos(i),s],250),this.$dropAllow(n,i)&&this.callEvent("onBeforeDragIn",[n,i])?(this.$dragMark(n,i),a):(n.to=n.target=null,null)) +},$dropAllow:function(){return!0},Gg:function(){},ch:function(t,e){var i=1,s=0,n=this.s.dragscroll;"string"==typeof n&&(s=-1!=n.indexOf("x"),i=-1!=n.indexOf("y"));var r=this.Vf||this.$view,a=webix.html.offset(r),h=a.y,o=h+r.offsetHeight,l=a.x,c=l+r.offsetWidth,n=this.getScrollState(),u=!1,d=40,f=webix.DragControl.getContext(); +this.Gg(e),i&&(t.yo-d&&(this.scrollTo(n.x,n.y+2*d),u=!0)),s&&(t.xc-d&&(this.scrollTo(n.x+2*d,n.y),u=!0)),u&&webix.DragControl.sd&&f&&f.to===this&&(this.bh=webix.delay(this.ch,this,[t],100))},$dragOut:function(t,e,i,s){var n=this.locate(s)||null,r=webix.DragControl.Gd; +return(r.target||"").toString()==(n||"").toString()?null:(this.bh&&(this.bh=window.clearTimeout(this.bh)),r.target=r.to=null,this.callEvent("onDragOut",[r,s]),null)},$drop:function(t,e,i){this.bh&&(this.bh=window.clearTimeout(this.bh));var s=webix.DragControl.Gd;s.to=this;var n=this.Zg?this.Zg(s.target):s.target; +this.getBranchIndex?n&&(s.parent=this.getParentId(n),s.index=this.getBranchIndex(n)):s.index=n?this.getIndexById(n):this.count(),this.$dragMark({},i),s.from&&s.from!=s.to&&s.from.callEvent&&s.from.callEvent("onBeforeDropOut",[s,i]),this.callEvent("onBeforeDrop",[s,i])&&(this.dh(s,i),this.callEvent("onAfterDrop",[s,i])) +},dh:function(t){if(t.from){var e={parent:t.parent,mode:t.pos};t.from.move(t.source,t.index,t.to,e)}},$drag:function(t,e){var i=this.locate(e);if(this.Zg&&(i=this.Zg(i,!0)),i){var s=[i];if(this.getSelectedId&&!this.Vg){var n=this.getSelectedId(!0,!0);if(n&&n.length>1&&-1!=webix.PowerArray.find.call(n,i)){for(var r={},s=[],a=0;ai&&(i=1*t(e[s]));return 1*i},count:function(t,e){return e.length},any:function(t,e){return t(e[0]) +},string:function(t){return t.$name}},webix.GroupStore={ungroup:function(t){return this.getBranchIndex?this.hh.apply(this,arguments):(this.nf&&(this.order=this.nf,this.pull=this.fh,this.fh=this.nf=null),void(t||this.callEvent("onStoreUpdated",[])))},mf:function(t){this.blockEvent(),this.group(t),this.unblockEvent() +},ih:function(t){if("function"==typeof t)return t;var e=function(e){return e[t]};return e.$name=t,e},group:function(t){if(this.getBranchIndex)return this.jh.apply(this,arguments);var e=this.ih(t.by);t.map[e]||(t.map[e]=[e,this.kh]);var i={},s=[];this.each(function(n){var r=e(n);i[r]||(s.push({id:r,$group:!0,$row:t.row}),i[r]=webix.toArray()),i[r].push(n) +});for(var n in t.map){var r=t.map[n][1]||"any",a=this.ih(t.map[n][0]);"function"!=typeof r&&(r=webix.GroupMethods[r]);for(var h=0;h=0;r--)this.pull[s[r]].$footer&&s.splice(r,1);this.mh(s,0,1),t||this.callEvent("onStoreUpdated",[])}},mh:function(t,e,i){e&&(this.getItem(e).$count=t.length); +for(var s=0;s"+this.type.template(t,this.type)+""},type:webix.extend({template:function(t,e){var i=e["template"+t.level]||e.templateCommon; +return i.apply(this,arguments)},classname:function(t,e,i){var s="webix_tree_item";return t.$css&&("object"==typeof t.$css&&(t.$css=webix.html.createCss(t.$css)),s+=" "+t.$css),i&&i.$css&&(s+=" "+i.$css),s},templateCommon:webix.template("{common.icon()} {common.folder()} #value#"),templateStart:webix.template('
'),templateEnd:webix.template("
"),templateCopy:webix.template("#value#")},webix.TreeType)},webix.AutoTooltip,webix.Group,webix.TreeAPI,webix.DragItem,webix.TreeDataMove,webix.SelectionModel,webix.KeysNavigation,webix.MouseEvents,webix.Scrollable,webix.TreeDataLoader,webix.ui.proto,webix.TreeRenderStack,webix.CopyPaste,webix.EventSystem),webix.TreeStateCheckbox={uh:function(){if(this.vg){var t=this.render; +this.render=function(e,i){var s=t.apply(this,arguments);this.s.threeState&&s&&"checkbox"!=i&&this.vh.apply(this,arguments)},this.uh=function(){}}},threeState_setter:function(t){return t&&this.uh(),t},vh:function(t){var e,i,s,n,r;if(s=[],r=this,t&&!r.data.pull[t]&&(t=0),!t||r.data.pull[t].$count)for(i=this.wh(t),i.sort(function(t,e){return r.data.pull[e].$level-r.data.pull[t].$level +}),e=0;e0||h>0)&&(s=!0),(s||s!=l.indeterminate)&&(o=!0),l.indeterminate=s,l.checked!=e&&(o=!0),l.checked=e,o?(r.push(n),n=this.getParentId(n)):n=0 +}return r},getChecked:function(){var t=[],e=this;return this.data.eachSubItem(0,function(i){e.isChecked(i.id)&&t.push(i.id)}),t},Tg:function(t,e){var i=this.getItem(t);if(i&&(""===e&&(e=!i.checked),i.checked!=e||i.indeterminate)){i.checked=e,this.zh(t);var s=this.xh(t);if(this.vg&&s.length<5)for(var n=0;n")}return i},Bh:function(t,e,i){var s=e.sg,n=webix.TreeRenderStack.tg;if(0===s&&n){var r=t.$level,a=t.id;for(s=[];r;){var h=n.getParentId(a),o=n.data.branch[h];o[o.length-1]==a&&(s[r]=!0),a=h,r--}e.sg=s}if(!s)return 0; +if(i==t.$level){var l=3;return t.$parent||0===t.$index&&(l=4),s[t.$level]&&(l=2),t.$count?t.open?"minus"+l:"plus"+l:"line"+l}return s[i]?"blank":"line1"}}),webix.NavigationButtons={Ch:function(){webix.html.remove(this.Dh),this.Dh=webix.html.create("DIV",{"class":"webix_nav_panel webix_nav_panel_"+this.s.navigation.type,style:"z-index:"+webix.ui.zIndex()+";"},""),this.x.appendChild(this.Dh),this.Eh(),this.Fh(),this.Gh() +},Gh:function(){var t=[];this.Dh&&(t[0]=webix.event(this.Dh,"click",webix.bind(function(t){for(var e=t.srcElement||t.target,i=!1;e!=this.Dh&&!i;){var s=e.getAttribute(this.Hh);s&&(i=!0,this.Ih(s)),e=e.parentNode}},this))),this.Jh&&(t[1]=webix.event(this.Jh,"click",webix.bind(function(){this.Kh(-1)},this))),this.Lh&&(t[1]=webix.event(this.Lh,"click",webix.bind(function(){this.Kh(1) +},this))),this.attachEvent("onDestruct",function(){for(var e=0;e=this.q.length||0>e)&&(e=0>e?this.q.length-1:0),this.setActiveIndex(e)}},Ih:function(t){this.q&&webix.$$(t).show()},Eh:function(){var t,e;if(e=this.s.navigation,e.items){this.Hh=e.linkAttr||"bind_id",this.Dh?this.Nh():this.Ch(); +var i=this.q?this.q:this.data.order;if(i.length>1)for(var s=0;s");var n=this.q?this.q[s].s.id:i[s];n&&t.setAttribute(this.Hh,n),this.Dh.appendChild(t)}}},Nh:function(){if(this.Dh)for(var t=this.Dh.childNodes,e=t.length-1;e>=0;e--)webix.html.remove(t[e]) +},Fh:function(){var t;if(t=this.s.navigation,t.buttons){this.Jh&&webix.html.remove(this.Jh),this.Jh&&webix.html.remove(this.Lh);var e=webix.ui.zIndex();this.Jh=webix.html.create("DIV",{"class":"webix_nav_button_"+t.type+" webix_nav_button_prev ",style:"z-index:"+e+";"},'
'),this.x.appendChild(this.Jh),this.Lh=webix.html.create("DIV",{"class":"webix_nav_button_"+t.type+" webix_nav_button_next ",style:"z-index:"+e+";"},'
'),this.x.appendChild(this.Lh) +}}},webix.protoUI({name:"list",Oh:"webix_list",$init:function(t){webix.html.addCss(this.x,this.Oh+("x"==(t.layout||this.defaults.layout)?"-x":"")),this.data.provideApi(this,!0),this.Ph=webix.bind(this.Ph,this),this.data.attachEvent("onStoreLoad",this.Ph),this.data.attachEvent("onStoreUpdated",this.Ph),this.data.attachEvent("onSyncApply",this.Ph),this.attachEvent("onAfterRender",this.hg) +},$dragHTML:function(t){if("y"==this.s.layout&&"auto"==this.type.width){this.type.width=this.bc;var e=this.jb(t);return this.type.width="auto",e}return this.jb(t)},defaults:{select:!1,scroll:!0,layout:"y"},ad:"webix_l_id",on_click:{webix_list_item:function(t,e){this.s.select&&(this.Qh=!0,"multiselect"==this.s.select||this.s.multiselect?this.select(e,!1,t.ctrlKey||t.metaKey||"touch"==this.s.multiselect,t.shiftKey):this.select(e),this.Qh=!1) +}},on_dblclick:{},getVisibleCount:function(){return Math.floor(this.dc/this.type.height)},Ph:function(){(this.s.autoheight||this.s.autowidth)&&this.resize()},Rh:function(t){var e=this.data.$pagesize||this.count();return this.Lf(t&&e>t),this.s.autoheight&&(t||1/0)>e&&(t=e),Math.max(this.type.height*t,this.s.minHeight||0) +},Sh:function(t){var e=this.data.$pagesize||this.count();return this.Lf(t&&e>t),this.s.autowidth&&(t||1/0)>e&&(t=e),this.type.width*t},hg:function(){"x"==this.s.layout&&(this.y.style.width="auto"!=this.type.width?this.type.width*this.count()+"px":"auto")},$getSize:function(t,e){return"y"==this.s.layout?("auto"!=this.type.width&&(this.s.width=this.type.width+(this.cc?webix.ui.scrollSize:0)),(this.s.yCount||this.s.autoheight)&&(this.s.height=this.Rh(this.s.yCount)||1)):("auto"!=this.type.height&&(this.s.height=this.type.height+(this.ec?webix.ui.scrollSize:0)),(this.s.xCount||this.s.autowidth)&&(this.s.width=this.Sh(this.s.xCount)||1)),webix.ui.view.prototype.$getSize.call(this,t,e) +},$setSize:function(){webix.ui.view.prototype.$setSize.apply(this,arguments)},type:{css:"",widthSize:function(t,e){return e.width+(e.width>-1?"px":"")},heightSize:function(t,e){return e.height+(e.height>-1?"px":"")},classname:function(t,e,i){var s="webix_list_item";return t.$css&&("object"==typeof t.$css&&(t.$css=webix.html.createCss(t.$css)),s+=" "+t.$css),i&&i.$css&&(s+=" "+i.$css),s +},template:function(t){return(t.icon?" ":"")+t.value+(t.badge?"
"+t.badge+"
":"")},width:"auto",templateStart:webix.template('
'),templateEnd:webix.template("
")},$skin:function(){this.type.height=webix.skin.$active.listItemHeight +}},webix.KeysNavigation,webix.DataMove,webix.DragItem,webix.MouseEvents,webix.SelectionModel,webix.Scrollable,webix.ui.proto,webix.CopyPaste),webix.protoUI({name:"grouplist",defaults:{animate:{}},Oh:"webix_grouplist",$init:function(){webix.extend(this.data,webix.TreeStore,!0),this.data.count=function(){return this.order.length +},this.data.provideApi(this,!0),this.data.attachEvent("onClearAll",webix.bind(this.Th,this)),this.Th()},Th:function(){this.Uh=[],this.Vh=[]},$setSize:function(){webix.ui.view.prototype.$setSize.apply(this,arguments)&&(this.y.style.width=this.bc)},on_click:{webix_list_item:function(t,e){if(this.Wh)return!1; +for(var i=0;i'),templateBack:webix.template("#value#"),templateItem:webix.template("#value#"),templateGroup:webix.template("#value#"),templateEnd:function(t){var e=""; +return t.$count&&(e+="
"),e+=""}},showItem:function(t){var e,i;for(t&&(e=this.getItem(t),i=e.$parent,e.$count&&(i=e.id)),this.Uh=this.data.branch[i||0],this.Vh=[];i;)this.getItem(i).$template="Back",this.Vh.unshift(i),i=this.getItem(i).$parent;this.Qh=!0,this.render(),this.Qh=!1,webix.RenderStack.showItem.call(this,t) +}},webix.Group,webix.ui.list),webix.type(webix.ui.grouplist,{}),webix.protoUI({name:"unitlist",ad:"webix_item_id",uniteBy_setter:webix.template,sort_setter:function(t){return"object"!=typeof t&&(t={}),this.E(t,{dir:"asc",as:"string"}),t},render:function(t,e,i){var s=this.s;if(this.isVisible(s.id)){if(!s.uniteBy)return!1; +if(t){var n=this.getItemNode(t);if(n&&"update"==i&&this.s.uniteBy.call(this,e)==this.getItem(t).$unitValue){var r=this.t[t]=this.Ne(e);return webix.html.insertBefore(r,n),void webix.html.remove(n)}}this.callEvent("onBeforeRender",[this.data])&&(this.units=null,this.$h(),this.units&&(this.y.innerHTML=this._h().map(this.jb,this).join(""),this.t=null),this.callEvent("onAfterRender",[])) +}},getUnits:function(){var t=[];if(this.units)for(var e in this.units)t.push(e);return t},getUnitList:function(t){return this.units?this.units[t]:null},jb:function(t){var e=this.data.Me[t.id];return this.callEvent("onItemRender",[t]),t.$unit?this.type.templateStartHeader(t,this.type)+this.type.templateHeader.call(this,t.$unit)+this.type.templateEnd(t,this.type):this.type.templateStart(t,this.type,e)+(t.$template?this.type["template"+t.$template]:this.type.template)(t,this.type)+this.type.templateEnd(t,this.type) +},_h:function(){var t,e,i,s;t=[];var n=this.data.$min||0,r=this.data.$max||1/0,a=0;for(i in this.units)for(t.push({$unit:i}),s=this.units[i],e=0;e"+t+""},templateStart:function(t,e,i){if(t.$unit)return e.templateStartHeader.apply(this,arguments);var s="webix_list_item webix_list_"+e.css+"_item"+(i&&i.webix_selected?" webix_selected":"")+e.classname(t,e,i),n="width:"+e.width+"px; height:"+e.height+"px; padding:"+e.padding+"px; margin:"+e.margin+"px; overflow:hidden;"+(e.layout&&"x"==e.layout?"float:left;":""); +return'
'},templateStartHeader:function(t,e){var i="webix_unit_header webix_unit_"+e.css+"_header"+(t.$selected?"_selected":""),s="width:"+e.width+"px; height:"+e.headerHeight+"px; overflow:hidden;";return'
' +}},$skin:function(){this.type.headerHeight=webix.skin.$active.unitHeaderHeight||20}},webix.ui.list),webix.EditAbility={defaults:{editaction:"click"},$init:function(t){this.ai={},this.Eb=0,this.bi=0,this.w.style.position="relative",t&&(t.onDblClick=t.onDblClick||{}),this.attachEvent("onAfterRender",this.$s),this.s.editable&&this.ci() +},Ux:function(t){try{if("number"==typeof t.selectionStart)t.selectionStart=t.selectionEnd=t.value.length;else if("undefined"!=typeof t.createTextRange){var e=t.createTextRange();e.collapse(!1),e.select()}}catch(i){}},$s:function(){var t=this.getEditor();if(t&&t.$inline&&!t.getPopup){var e=this.mi(t); +if(e&&e!=t.node){var i=t.node.value;t.node=e,e.value=i,e.focus(),this.Ux(e)}else this.editStop()}},editable_setter:function(t){return t&&this.ci(),t},ci:function(){webix.attachEvent("onEditEnd",webix.bind(function(){this.Eb&&this.editStop()},this)),webix.attachEvent("onClick",webix.bind(function(t){this.Eb&&new Date-this.bi>200&&(this.di&&!this.di.popupType&&t&&this.di.node==t.target||this.editStop()) +},this)),this.data.attachEvent&&this.data.attachEvent("onIdChange",webix.bind(function(t,e){this.ei(t,e)},this)),this.attachEvent("onItemClick",function(t){this.s.editable&&"click"==this.s.editaction&&this.edit(t)}),this.attachEvent("onItemDblClick",function(t){this.s.editable&&"dblclick"==this.s.editaction&&this.edit(t) +}),this.fi=webix.bind(function(){this.bi=new Date},this),this.ci=function(){},this.gi&&this.gi()},Vs:function(){webix.delay(function(){var t=this.getEditor();if(t&&t.config.liveEdit){var e={value:t.getValue(),old:t.value};if(e.value==e.old)return;t.value=e.value,this.ti(t,e.value),this.callEvent("onLiveEdit",[e,t]) +}},this)},hi:function(t){var e=this.s.form;"string"!=typeof e&&(this.s.form=e=webix.ui(e).config.id);var e=webix.$$(e),i=e.setValues?e:e.getChildViews()[0];i.setValues(this.getItem(t.row||t)),e.config.master=this.config.id,e.show(this.getItemNode(t));var s=i.getChildViews()[0];s.focus()&&s.focus()},edit:function(t,e,i){if(this.callEvent("onBeforeEditStart",[t])){if(this.s.form)return this.hi(t); +var s=this.ii(t);if(s){if(this.getEditor(t))return;e||this.editStop(),this.bi=new Date;var n=webix.extend({},webix.editors[s]),r=this.ji(t,n,i);n.config.liveEdit&&(this.Ws=this.attachEvent("onKeyPress",this.Vs));var a=n.getPopup?n.getPopup(r).x:r;return a&&webix.event(a,"click",this.fi),r&&webix.event(r,"change",this.ki,{view:this,id:t}),i!==!1&&n.focus(),webix.UIManager.setFocus(this,!0),this.callEvent("onAfterEditStart",[t]),n +}return null}},getEditor:function(t){return t?this.ai[t]:this.di},ei:function(t,e){var i=this.ai[t];i&&(this.ai[e]=i,i.id=e,delete this.ai[t])},ki:function(){this.view.hasEvent("onEditorChange")&&this.view.callEvent("onEditorChange",[this.id,this.view.getEditorValue(this.id)])},li:function(){return this.s +},ji:function(t,e,i){var s=(e.config=this.li(t),e.render());e.$inline&&(s=this.mi(t)),e.node=s;var n=this.getItem(t),r=n[this.s.editValue||"value"];return webix.isUndefined(r)&&(r=""),e.setValue(r,n),e.value=r,this.ni(t,e),i!==!1&&this.showItem(t),e.$inline||this.oi(t,s,!0),e.afterRender&&e.afterRender(),s +},pi:function(t){return this.getItemNode(t)},mi:function(t){var e=this.pi(t);return e&&(e=e.getElementsByTagName("input")[0]||e),e},ii:function(){return this.s.editor},ni:function(t,e){e.id=t,this.ai[t]=this.di=e,this.Eb++},qi:function(t){this.di==t&&(this.di=0),t.destroy&&t.destroy(),delete t.popup,delete t.node,delete this.ai[t.id],this.Eb-- +},focusEditor:function(){var t=this.getEditor.apply(this,arguments);t&&t.focus&&t.focus()},editCancel:function(){this.editStop(null,null,!0)},editStop:function(t){if(!this.Zx){this.Zx=1;var e=arguments[2],i=1;return t?i=this.ri(this.ai[t],e):this.si(function(t){i*=this.ri(t,e)}),this.Zx=0,i}},ug:function(t){var e=this.getItemNode(t); +return{left:e.offsetLeft,top:e.offsetTop,height:e.offsetHeight,width:e.offsetWidth,parent:this.w}},oi:function(t,e,i){if(e.style){var s=this.ug(t);e.style.top=s.top+"px",e.style.left=s.left+"px",e.style.width=s.width-1+"px",e.style.height=s.height-1+"px",e.top=s.top,i&&s.parent.appendChild(e)}},si:function(t){for(var e in this.ai)t.call(this,this.ai[e]) +},ri:function(t,e){if(t){var i={value:t.getValue(),old:t.value};if(this.callEvent("onBeforeEditStop",[i,t,e])){e||(i.value!=i.old||t.config.liveEdit)&&this.updateItem(this.ti(t,i.value)),t.$inline?t.node=null:webix.html.remove(t.node);var s=t.config.suggest;return s&&"string"==typeof s&&webix.$$(s).hide(),this.qi(t),this.Ws&&this.detachEvent(this.Ws),this.callEvent("onAfterEditStop",[i,t,e]),1 +}return 0}},validateEditor:function(t){var e=!0;if(this.s.rules){var i=this.getEditor(t),s=i.column||this.s.editValue||"value",n=this.s.rules[s],r=this.s.rules.$all;if(n||r){var a=this.data.getItem(i.row||i.id),h=i.getValue(),o=i.getInputNode();n&&(e=n.call(this,h,a,s)),r&&(e=r.call(this,h,a,s)&&e),e?webix.html.removeCss(o,"webix_invalid"):webix.html.addCss(o,"webix_invalid"),webix.callEvent("onLiveValidation",[i,e,a,h]) +}}return e},getEditorValue:function(t){var e;return e=0===arguments.length?this.di:this.getEditor(t),e?e.getValue():void 0},getEditState:function(){return this.di||!1},editNext:function(t,e){if(t=t!==!1,1==this.Eb||e){var i=this.ui(this.di||e,function(t){return this.ii(t)?!0:!1},t);if(this.editStop())return i&&(this.edit(i),this.vi(i)),!1 +}},vi:function(){},ui:function(t,e,i){var s=this.getIndexById(t.id),n=this.data.order;if(i){for(var r=s+1;r=0;r--)if(e.call(this,n[r]))return n[r];return null},ti:function(t,e){return this.getItem(t.id)[this.s.editValue||"value"]=e,t.id +}},function(){function t(t,i){var s=t.config.suggest;if(s){var n=t.config.suggest=e(s),r=webix.$$(n);r&&i&&r.linkInput(i)}}function e(t){if("string"==typeof t)return t;if(t.linkInput)return t.s.id;"object"==typeof t?(webix.isArray(t)&&(t={data:t}),t.view=t.view||"suggest"):t===!0&&(t={view:"suggest"}); +var e=webix.ui(t);return e.config.id}webix.editors={text:{focus:function(){this.getInputNode(this.node).focus(),this.getInputNode(this.node).select()},getValue:function(){return this.getInputNode(this.node).value},setValue:function(e){var i=this.getInputNode(this.node);i.value=e,t(this,i)},getInputNode:function(){return this.node.firstChild +},render:function(){return webix.html.create("div",{"class":"webix_dt_editor"},"")}},"inline-checkbox":{render:function(){return{}},getValue:function(){return this.node.checked},setValue:function(){},focus:function(){this.node.focus()},getInputNode:function(){},$inline:!0},"inline-text":{render:function(){return{} +},getValue:function(){return this.node.value},setValue:function(){},focus:function(){this.node.select(),this.node.focus()},getInputNode:function(){},$inline:!0},checkbox:{focus:function(){this.getInputNode().focus()},getValue:function(){return this.getInputNode().checked},setValue:function(t){this.getInputNode().checked=!!t +},getInputNode:function(){return this.node.firstChild.firstChild},render:function(){return webix.html.create("div",{"class":"webix_dt_editor"},"
")}},select:{focus:function(){this.getInputNode().focus()},getValue:function(){return this.getInputNode().value},setValue:function(t){this.getInputNode().value=t +},getInputNode:function(){return this.node.firstChild},render:function(){var t="",e=this.config.options||this.config.collection;if(e.data&&e.data.each)e.data.each(function(e){t+=""});else if(webix.isArray(e))for(var i=0;i"+e[i]+""; +else for(var s in e)t+="";return webix.html.create("div",{"class":"webix_dt_editor"},"")}},popup:{focus:function(){this.getInputNode().focus()},destroy:function(){this.getPopup().hide()},getValue:function(){return this.getInputNode().getValue()||"" +},setValue:function(t){this.getPopup().show(this.node),this.getInputNode().setValue(t)},getInputNode:function(){return this.getPopup().getChildViews()[0]},getPopup:function(){return this.config.popup||(this.config.popup=this.createPopup()),webix.$$(this.config.popup)},createPopup:function(){var t=this.config.popup||this.config.suggest; +if(t){var e;return"object"!=typeof t||t.name?e=webix.$$(t):(t.view=t.view||"suggest",e=webix.ui(t)),e.linkInput&&e.linkInput(document.body),e}var i=webix.editors.$popup[this.popupType];return"string"!=typeof i&&(i=webix.editors.$popup[this.popupType]=webix.ui(i),this.popupInit(i)),i.s.id},popupInit:function(){},popupType:"text",render:function(){return{} +},$inline:!0}},webix.editors.color=webix.extend({focus:function(){},popupType:"color",popupInit:function(t){t.getChildViews()[0].attachEvent("onSelect",function(t){webix.callEvent("onEditEnd",[t])})}},webix.editors.popup),webix.editors.date=webix.extend({focus:function(){},popupType:"date",setValue:function(t){this.wi=this.config.stringResult||t&&"string"==typeof t,webix.editors.popup.setValue.call(this,t) +},getValue:function(){return this.getInputNode().getValue(this.wi?webix.i18n.parseFormatStr:"")||""},popupInit:function(t){t.getChildViews()[0].attachEvent("onDateSelect",function(t){webix.callEvent("onEditEnd",[t])})}},webix.editors.popup),webix.editors.combo=webix.extend({xi:function(t){return this.config.popup?this.config.popup.config.id:t?e(t):this.rt(t) +},rt:function(){var t=webix.editors.combo;return t.st=t.st||this.xi(!0)},render:function(){var t=webix.html.create("div",{"class":"webix_dt_editor"},""),e=this.config.suggest=this.xi(this.config.suggest);return e&&(webix.$$(e).linkInput(t.firstChild,!0),webix.event(t.firstChild,"click",webix.bind(this.showPopup,this))),t +},getPopup:function(){return webix.$$(this.config.suggest)},showPopup:function(){var t=this.getPopup(),e=t.getList(),i=this.getInputNode(),s=this.getValue();t.show(i),s?e.exists(s)&&(e.select(s),e.showItem(s)):(e.unselect(),e.showItem(e.getFirstId())),t.ae=i},afterRender:function(){this.showPopup()},setValue:function(t){if(this.yi=t,this.config.suggest){var e=webix.$$(this.config.suggest),i=this.config.collection||this.config.options; +i&&e.getList().data.importData(i),this.zi=this.getInputNode(this.node).value=e.getItemText(t)}},getValue:function(){var t=this.getInputNode().value;return this.config.suggest?t==this.zi?this.yi:webix.$$(this.config.suggest).getSuggestion():t}},webix.editors.text),webix.editors.richselect=webix.extend({focus:function(){},getValue:function(){return this.getPopup().getValue() +},setValue:function(t){{var e=this.config.collection||this.config.options;this.getInputNode()}e&&this.getPopup().getList().data.importData(e),this.getPopup().show(this.node),this.getPopup().setValue(t)},getInputNode:function(){return this.getPopup().getList()},popupInit:function(t){t.linkInput(document.body) +},popupType:"richselect"},webix.editors.popup),webix.editors.password=webix.extend({render:function(){return webix.html.create("div",{"class":"webix_dt_editor"},"")}},webix.editors.text),webix.editors.$popup={text:{view:"popup",width:250,height:150,body:{view:"textarea"}},color:{view:"popup",body:{view:"colorboard"}},date:{view:"popup",width:250,height:250,padding:0,body:{view:"calendar",icons:!0,borderless:!0}},richselect:{view:"suggest",body:{view:"list",select:!0}}} +}(),webix.VirtualRenderStack={$init:function(){this.t={},webix.event(this.x,"scroll",webix.bind(this.Ai,this)),webix.env.touch&&this.attachEvent("onAfterScroll",webix.bind(this.Ai,this)),this.Bi=[]},getItemNode:function(t){return this.t[t]},showItem:function(t){var e=this.Ci(),i=this.data.getIndexById(t),s=Math.floor(i/e.Di)*e.Ei,n=this.getScrollState(); +(s=n.y+this.dc)&&this.scrollTo(0,s)},render:function(t,e,i){if(this.isVisible(this.s.id)&&!this.$blockRender)if(t){var s=this.getItemNode(t);switch(i){case"update":if(!s)return;var n=this.t[t]=this.Ne(e);webix.html.insertBefore(n,s),webix.html.remove(s);break;default:this.Fi()}}else this.callEvent("onBeforeRender",[this.data])&&(this.t={},this.Ai(null,!0),this.Gi=!1,this.callEvent("onAfterRender",[])) +},Fi:function(){this.Gi||(this.Gi=!0,window.setTimeout(webix.bind(function(){this.render()},this),1))},Hi:function(t){var e=document.createElement("DIV");return e.style.cssText="height:"+t+"px; width:100%; overflow:hidden;",e},Ai:function(t,e){this.Bi=[];var i=this.Ci();(!this.y.firstChild||e)&&(this.y.innerHTML="",this.y.appendChild(this.Hi(i.Ii)),this.u=[this.y.firstChild]); +for(var s=i.R;s<=i.Ji;){for(;this.u[s]&&this.u[s].Ki&&s<=i.Ji;)s++;if(s>i.Ji)break;for(var n=s;!this.u[n];)n--;var r=this.u[n],a=s*i.Di+(this.data.$min||0);if(a>(this.data.$max||1/0))break;var h=Math.min(a+i.Di-1,this.data.$max||1/0),o=this.Hi(i.Ei),l=this.data.getIndexRange(a,h);if(!l.length)break;for(var c={$template:"Loading"},u=0;u=f&&b>0)r.style.height=b+"px",this.u[s+1]=r;else if(0>f?webix.html.remove(r):r.style.height=f+"px",b>0){var x=this.u[s+1]=this.Hi(b); +webix.html.insertBefore(x,o.nextSibling,this.y)}s++}if(this.Bi.length){var p=this.Bi[0],v=this.Bi.pop()+1;if(v>p){var w=v-p;if(this.cf(w,p))return;w=Math.max(w,this.s.datafetch||this.s.loadahead||0),this.loadNext(w,p)}}},Ci:function(){var t=this.getScrollState(),e=t.y,i=this.bc,s=this.dc,n=this.type,r=Math.floor(i/n.width)||1,a=Math.floor(e/n.height),h=Math.ceil((s+e)/n.height)-1,o=this.data.$max?this.data.$max-this.data.$min:this.data.count(),l=Math.ceil(o/r)*n.height; +return{R:a,Ji:h,Li:e,Ii:l,Ei:n.height,Di:r}},ug:function(t){var e=this.getItemNode(t);return e||(this.showItem(t),this.Ai(),e=this.getItemNode(t)),{left:e.offsetLeft,top:e.offsetTop,height:e.offsetHeight,width:e.offsetWidth,parent:this.w}}},webix.protoUI({name:"dataview",$init:function(t){t.sizeToContent&&this.$ready.unshift(this.Mi); +var e=t.prerender||this.defaults.prerender;(e===!1||e!==!0&&"auto"!==t.height&&!t.autoheight)&&webix.extend(this,webix.VirtualRenderStack,!0),t.autoheight&&(t.scroll=!1),this.w.className+=" webix_dataview"},Mi:function(){var t=webix.html.create("DIV",0,this.type.template({}));t.style.position="absolute",document.body.appendChild(t),this.type.width=t.offsetWidth,this.type.height=t.offsetHeight,webix.html.remove(t) +},defaults:{scroll:!0,datafetch:50},ad:"webix_f_id",on_click:{webix_dataview_item:function(t,e){this.s.select&&("multiselect"==this.s.select||this.s.multiselect?this.select(e,!1,"touch"==this.s.multiselect||t.ctrlKey||t.metaKey,t.shiftKey):this.select(e))}},on_dblclick:{},on_mouse_move:{},type:{template:webix.template("#value#"),templateLoading:webix.template("Loading..."),width:160,height:50,classname:function(t,e,i){var s="webix_dataview_item "; +return e.css&&(s+=e.css+" "),t.$css&&("object"==typeof t.$css&&(t.$css=webix.html.createCss(t.$css)),s+=t.$css+" "),i&&i.$css&&(s+=i.$css+" "),s},templateStart:webix.template('
'),templateEnd:webix.template("
")},Ni:function(t){return this.s.height=this.type.height*Math.ceil(this.data.count()/Math.floor(t/this.type.width)) +},autoheight_setter:function(t){return t&&(this.data.attachEvent("onStoreLoad",webix.bind(this.resize,this)),this.w.style.overflowY="hidden"),t},$getSize:function(t,e){this.s.xCount>0&&"auto"!=this.type.width&&!this.Nw&&(this.s.width=this.type.width*this.s.xCount+(this.cc?webix.ui.scrollSize:0)),this.s.yCount&&"auto"!=this.type.height&&(this.s.height=this.type.height*this.s.yCount); +var i=this.s.width||this.bc;return this.s.autoheight&&i&&(this.Ni(i),this.scroll_setter(!1)),webix.ui.view.prototype.$getSize.call(this,t,e)},$setSize:function(t,e){if(webix.ui.view.prototype.$setSize.call(this,t,e)){if(this.s.autoheight&&this.Ni()!=this.dc)return webix.delay(this.resize,this);var i=!1; +this.s.yCount&&"auto"==this.type.height&&(this.type.height=Math.floor(this.dc/this.s.yCount),i=!0),this.s.xCount&&("auto"==this.type.width||this.Nw)&&(this.Nw=!0,this.type.width=Math.floor(this.bc/this.s.xCount),i=!0),(i||this.Ai)&&this.render()}}},webix.DataMove,webix.DragItem,webix.MouseEvents,webix.KeysNavigation,webix.SelectionModel,webix.Scrollable,webix.ui.proto),webix.DataDriver.htmltable={toObject:function(t){t=webix.toNode(t); +var e=t.rows;return webix.html.remove(t),e},getRecords:function(t){for(var e=[],i=t[0]&&t[0].Oi?1:0;i15e5?(this.s.zoom=Math.floor(t/15e5)+1,this.Ui=t-this.Si,t=Math.floor(t/this.s.zoom)+this.Si):(this.s.zoom=1,this.Ui=1/0),t},scrollWidth_setter:function(t){return t=this.Ti(t),this.x.firstChild.style.width=t+"px",t},scrollHeight_setter:function(t){return t=this.Ti(t),this.x.firstChild.style.height=t+"px",t +},sizeTo:function(t,e,i){t=t-(e||0)-(i||0);var s=this.s.scrollSize;webix.env.isIE&&s&&(s+=1),s||!this.s.scrollVisible||webix.env.$customScroll||(this.x.style.pointerEvents="none",s=14),s?(e&&(this.x.style.marginTop=e+"px"),this.x.style["x"==this.s.scroll?"width":"height"]=Math.max(0,t)+"px",this.x.style["x"==this.s.scroll?"height":"width"]=s+"px"):this.x.style.display="none",this.Si=t +},getScroll:function(){return this.s.scrollPos*this.s.zoom},getSize:function(){return(this.s.scrollWidth||this.s.scrollHeight)*this.s.zoom},scrollTo:function(t){0>t&&(t=0);var e=this.s;t=Math.min(((e.scrollWidth||e.scrollHeight)-this.Si)*e.zoom,t),0>t&&(t=0);var i=t/e.zoom;return this.Wi!=i?(this.x["x"==e.scroll?"scrollLeft":"scrollTop"]=i,this.Vi(i),!0):void 0 +},Ri:function(){var t=this.x["x"==this.s.scroll?"scrollLeft":"scrollTop"];t!=this.Wi&&this.Vi(t)},Vi:function(t){this.Wi=t,this.s.scrollPos=Math.min(this.Ui,t*this.s.zoom)||0,this.callEvent("onScroll",[this.s.scrollPos])},activeArea:function(t,e){this.Xi=e,webix.event(t,"mousewheel",this.Yi,this),webix.event(t,"DOMMouseScroll",this.Yi,this) +},Yi:function(t){var e=0;return t.wheelDeltaX&&Math.abs(t.wheelDeltaX)>Math.abs(t.wheelDeltaY)?this.Xi&&(e=t.wheelDeltaX/-40):this.Xi||(e=webix.isUndefined(t.wheelDelta)?t.detail:t.wheelDelta/-40),e&&this.scrollTo(this.s.scrollPos+e*this.s.scrollStep)?webix.html.preventEvent(t):void 0}},webix.EventSystem,webix.Settings),webix.Number={format:function(t,e){if(""===t||"undefined"==typeof t)return t; +e=e||webix.i18n,t=parseFloat(t);var i=0>t?"-":"";t=Math.abs(t);var s=t.toFixed(e.decimalSize).toString();s=s.split(".");var n="";if(e.groupSize){var r=e.groupSize,a=s[0].length;do{a-=r;var h=a>0?s[0].substr(a,r):s[0].substr(0,r+a);n=h+(n?e.groupDelimiter+n:"")}while(a>0)}else n=s[0];return e.decimalSize?i+n+e.decimalDelimiter+s[1]:i+n +},numToStr:function(t){return function(e){return webix.Number.format(e,t)}}},webix.Date={startOnMonday:!1,toFixed:function(t){return 10>t?"0"+t:t},weekStart:function(t){t=this.copy(t);var e=t.getDay();return this.startOnMonday&&(0===e?e=6:e--),this.datePart(this.add(t,-1*e,"day"))},monthStart:function(t){return t=this.copy(t),t.setDate(1),this.datePart(t) +},yearStart:function(t){return t=this.copy(t),t.setMonth(0),this.monthStart(t)},dayStart:function(t){return this.datePart(t,!0)},dateToStr:function(t,e){return"function"==typeof t?t:webix.env.strict?function(e){var i="",s=0;return t.replace(/%[a-zA-Z]/g,function(n,r){i+=t.slice(s,r);var a=function(t){return"%d"==n?webix.Date.toFixed(t.getDate()):"%m"==n?webix.Date.toFixed(t.getMonth()+1):"%j"==n?t.getDate():"%n"==n?t.getMonth()+1:"%y"==n?webix.Date.toFixed(t.getFullYear()%100):"%Y"==n?t.getFullYear():"%D"==n?webix.i18n.calendar.dayShort[t.getDay()]:"%l"==n?webix.i18n.calendar.dayFull[t.getDay()]:"%M"==n?webix.i18n.calendar.monthShort[t.getMonth()]:"%F"==n?webix.i18n.calendar.monthFull[t.getMonth()]:"%h"==n?webix.Date.toFixed((t.getHours()+11)%12+1):"%g"==n?(t.getHours()+11)%12+1:"%G"==n?t.getHours():"%H"==n?webix.Date.toFixed(t.getHours()):"%i"==n?webix.Date.toFixed(t.getMinutes()):"%a"==n?t.getHours()>11?"pm":"am":"%A"==n?t.getHours()>11?"PM":"AM":"%s"==n?webix.Date.toFixed(t.getSeconds()):"%W"==n?webix.Date.toFixed(webix.Date.getISOWeek(t)):n +};i+=a(e),s=r+2}),i+=t.slice(s,t.length)}:(t=t.replace(/%[a-zA-Z]/g,function(t){switch(t){case"%d":return'"+webix.Date.toFixed(date.getDate())+"';case"%m":return'"+webix.Date.toFixed((date.getMonth()+1))+"';case"%j":return'"+date.getDate()+"';case"%n":return'"+(date.getMonth()+1)+"';case"%y":return'"+webix.Date.toFixed(date.getFullYear()%100)+"'; +case"%Y":return'"+date.getFullYear()+"';case"%D":return'"+webix.i18n.calendar.dayShort[date.getDay()]+"';case"%l":return'"+webix.i18n.calendar.dayFull[date.getDay()]+"';case"%M":return'"+webix.i18n.calendar.monthShort[date.getMonth()]+"';case"%F":return'"+webix.i18n.calendar.monthFull[date.getMonth()]+"'; +case"%h":return'"+webix.Date.toFixed((date.getHours()+11)%12+1)+"';case"%g":return'"+((date.getHours()+11)%12+1)+"';case"%G":return'"+date.getHours()+"';case"%H":return'"+webix.Date.toFixed(date.getHours())+"';case"%i":return'"+webix.Date.toFixed(date.getMinutes())+"';case"%a":return'"+(date.getHours()>11?"pm":"am")+"'; +case"%A":return'"+(date.getHours()>11?"PM":"AM")+"';case"%s":return'"+webix.Date.toFixed(date.getSeconds())+"';case"%W":return'"+webix.Date.toFixed(webix.Date.getISOWeek(date))+"';default:return t}}),e===!0&&(t=t.replace(/date\.get/g,"date.getUTC")),new Function("date","if (!date) return ''; if (!date.getMonth) date=webix.i18n.parseFormatDate(date); return \""+t+'";')) +},strToDate:function(t,e){if("function"==typeof t)return t;var i,s,n,r=t.match(/%[a-zA-Z]/g),a="var temp=date.split(/[^0-9a-zA-Z]+/g);";if(!webix.i18n.calendar.monthShort_hash){for(n=webix.i18n.calendar.monthShort,s=webix.i18n.calendar.monthShort_hash={},i=0;i50?1900:2e3):"%Y"==a?n[0]=s[i]||0:"%n"==a||"%m"==a?n[1]=(s[i]||1)-1:"%M"==a?n[1]=webix.i18n.calendar.monthShort_hash[s[i]]||0:"%F"==a?n[1]=webix.i18n.calendar.monthFull_hash[s[i]]||0:"%j"==a||"%d"==a?n[2]=s[i]||1:"%g"==a||"%G"==a||"%h"==a||"%H"==a?n[3]=s[i]||0:"%a"==a||"%A"==a?n[3]=n[3]%12+("am"==(s[i]||"").toLowerCase()?0:12):"%i"==a?n[4]=s[i]||0:"%s"==a&&(n[5]=s[i]||0) +}return e?new Date(Date.UTC(n[0],n[1],n[2],n[3],n[4],n[5])):new Date(n[0],n[1],n[2],n[3],n[4],n[5])};for(i=0;i50?1900:2000);"; +break;case"%g":case"%G":case"%h":case"%H":a+="set[3]=temp["+i+"]||0;";break;case"%i":a+="set[4]=temp["+i+"]||0;";break;case"%Y":a+="set[0]=temp["+i+"]||0;";break;case"%a":case"%A":a+="set[3]=set[3]%12+((temp["+i+"]||'').toLowerCase()=='am'?0:12);";break;case"%s":a+="set[5]=temp["+i+"]||0;";break;case"%M":a+="set[1]=webix.i18n.calendar.monthShort_hash[temp["+i+"]]||0;"; +break;case"%F":a+="set[1]=webix.i18n.calendar.monthFull_hash[temp["+i+"]]||0;"}var h="set[0],set[1],set[2],set[3],set[4],set[5]";return e&&(h=" Date.UTC("+h+")"),new Function("date","if (!date) return ''; if (typeof date == 'object') return date; var set=[0,0,1,0,0,0]; "+a+" return new Date("+h+");") +},getISOWeek:function(t){if(!t)return!1;var e=t.getDay();0===e&&(e=7);var i=new Date(t.valueOf());i.setDate(t.getDate()+(4-e));var s=i.getFullYear(),n=Math.floor((i.getTime()-new Date(s,0,1).getTime())/864e5),r=1+Math.floor(n/7);return r},getUTCISOWeek:function(t){return this.getISOWeek(t)},Jv:function(t,e,i,s){if(i){var n=s(t,e); +if(n)for(var r=i>0?1:-1;n;)t.setHours(t.getHours()+r),n=s(t,e),r+=i>0?1:-1}},add:function(t,e,i,s){s&&(t=this.copy(t));var n=webix.Date.copy(t);switch(i){case"day":t.setDate(t.getDate()+e),this.Jv(t,n,e,function(t,e){return webix.Date.datePart(e,!0)==webix.Date.datePart(t,!0)});break;case"week":t.setDate(t.getDate()+7*e),this.Jv(t,n,7*e,function(t,e){return webix.Date.datePart(e,!0)==webix.Date.datePart(t,!0) +});break;case"month":t.setMonth(t.getMonth()+e),this.Jv(t,n,e,function(t,e){return e.getMonth()==t.getMonth()&&e.getYear()==t.getYear()});break;case"year":t.setYear(t.getFullYear()+e),this.Jv(t,n,e,function(t,e){return e.getFullYear()==t.getFullYear()});break;case"hour":t.setHours(t.getHours()+e),this.Jv(t,n,e,function(t,e){return e.getHours()==t.getHours()&&webix.Date.datePart(e,!0)==webix.Date.datePart(t,!0) +});break;case"minute":t.setMinutes(t.getMinutes()+e);break;default:webix.Date.add[i](t,e,i)}return t},datePart:function(t,e){e&&(t=this.copy(t));var i=this.copy(t);return i.setHours(0),t.setHours(i.getDate()!=t.getDate()?1:0),t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0),t},timePart:function(t,e){return e&&(t=this.copy(t)),(t.valueOf()/1e3-60*t.getTimezoneOffset())%86400 +},copy:function(t){return new Date(t.valueOf())},equal:function(t,e){return t&&e?t.valueOf()===e.valueOf():!1},isHoliday:function(t){return t=t.getDay(),0===t||6==t?"webix_cal_event":void 0}},webix.i18n={Zi:["fullDateFormat","timeFormat","dateFormat","longDateFormat","parseFormat","parseTimeFormat"],parseFormat:"%Y-%m-%d %H:%i",parseTimeFormat:"%H:%i",numberFormat:webix.Number.format,priceFormat:function(t){return webix.i18n.$i(webix.i18n.numberFormat(t,webix.i18n._i)) +},setLocale:function(t){var e=function(t,i){for(var s in i)"object"!=typeof i[s]||webix.isArray(i[s])?t[s]=i[s]:(t[s]||(t[s]={}),e(t[s],i[s]))};"string"==typeof t&&(t=this.locales[t]),t&&e(this,t);for(var i=webix.i18n.Zi,s=0;s=this.s.leftSplit&&t=0;s--)e[s]=e[s]||this.s.headerRowHeight,e.Ot+=1*e[s];for(var s=0;sr;r++)n[r]=null}}return i},Pj:function(t,e){for(var i=t.getElementsByTagName("TD"),s=0;se;e++)s+=t[e]+1;return s},Qj:function(t,e,i,s,n){if(t==e)return"";for(var r="
",a=t;e>a;a++){r+=""; +for(var a=t;e>a;a++)r+="";r+=""}for(var h=this.fj[0][s].length,o=0;h>o;o++){r+="";for(var a=t;e>a;a++){var l=this.fj[a][s][o];if(null!==l){l.content&&(l.contentId=l.contentId||webix.uid(),l.columnId=this.fj[a].id,l.format=this.fj[a].format,l.text=webix.ui.datafilter[l.content].render(this,l),this.hj[l.contentId]=l,this.Rj=!0),r+="" +}}r+=""}return r+="
=e-1&&(c+=" webix_last"),c&&(r+=' class="'+c+'"');var d=n[o],f="";l.contentId&&(r+=" active_id='"+l.contentId+"'"),l.colspan&&(r+=" colspan='"+l.colspan+"'"),l.rowspan&&(r+=" rowspan='"+l.rowspan+"'",d=this.Pt(this.Mt,o,l.rowspan)),d!=this.s.headerRowHeight&&(f=" style='line-height:"+d+"px; height:"+d+"px;'"); +var b="webix_hcell",x=l.css;x&&("object"==typeof x&&(l.css=x=webix.html.createCss(x)),b+=" "+x),this.fj[a].$selected&&(b+=" webix_sel_hcell"),r+=">
";var p=""===l.text?" ":l.text;l.rotate&&(p="
"+p+"
"),r+=p+"
"},showItemByIndex:function(t,e){var i=this.s.pager;if(i){var s=Math.floor(t/i.size);s!=i.page&&webix.$$(i.id).select(s)}if(-1!=t){var n=this.Sj();if(t=n[1]-1){var r=this.Tj(0,t);t0&&(r+=this.Uj(t-1)-1)),this.Wj.scrollTo(r) +}}if(-1!=e){if(e=this.Fj)return;var n=this.Xj();if(e=n[1]-1){for(var r=0,a=this.s.leftSplit;e>a;a++)r+=this.fj[a].width;e=this.s.leftSplit&&tt;t++)i+=this.Uj(t);return i},ug:function(t,e){1==arguments.length&&(e=t.column,t=t.row);for(var i=this.getItem(t),s=this.getColumnConfig(e),n=0,r=0,a=0;a=this.Fj?2:1;r=this.Vf.childNodes[o].firstChild;break}n+=h.width}var l=(this.data.order.length,this.Tj(this.ak||0,this.getIndexById(t)));return{parent:r,top:l+(this.ck||0),left:n,width:s.width,height:i.$height||this.s.rowHeight}},xj:function(){var t=this.s.pager,e=0,i=this.data.order.length; +return t&&(e=t.size*t.page,i=Math.min(i,e+t.size),t.level&&(e=this.data.$min,i=this.data.$max)),this.Tj(e,i)},setRowHeight:function(t,e){if(!isNaN(e)){e0;)e-=this.fj[i].width,i++;var s=i;for(e&&i--,e+=this.Yj;e>0&&s0;)e-=this.Uj(r),r++;var o=r>0&&e?-(this.Uj(r-1)+e):0,l=r; +if(e&&r--,e+=this.Vj||this.dc,a){var h=Math.ceil(e/a);e-=h*a,l+=h,l>s&&(l=s)}else for(;e>0&&s>l;)e-=this.Uj(l),l++;return[r,l,o]},Kv:function(t){var e=this.getItem(t),i=this.getIndexById(t),s=this.Sj();if(!(i=s[1]))for(var n=this.Xj(),r=0;r=this.s.leftSplit&&(rn[1])&&(a.qk=-999),a.attached&&a.node){var h=a.node.childNodes[i-s[0]],o=this.Ek(e,this.fj[r],0); +h.innerHTML=o,h.className=this.Mv(this.fj[r],o,e,t)}}},vj:function(t,e){if(this.fj.length){e&&this.uk();var i=this.Xj(this.s.prerender),s=this.Sj(this.s.prerender===!0);if(t){for(var n=this.s.leftSplit;n=this.Fk;if(this.Fk=t[0],this.Gk){if(e&&(!i||i>=e.size)&&this.Hk([0,e.size*e.page],Math.max(i,e.size),!0))return this.Gk=null;this.Ik(this.Gk,s),this.Gk=null}else if(this.s.loadahead){this.Hk(t,this.s.loadahead,s)}},Hk:function(t,e,i){var s=t[1],n=s+e; +i||(s=t[0]-e,n=t[0]),0>s&&(s=0),n=Math.min(n,this.data.order.length-1);for(var r=!1,a=s;n>a;a++)this.data.order[a]||(r?(r.last=a,r.count=a-s):r={start:a,count:n-s});return r?(this.Ik(r,i),!0):void 0},Ik:function(t,e){var i=Math.max(t.count,this.s.datafetch||this.s.loadahead||0),s=e?t.start:t.last-i+1; +this.cf(t.count,t.start)||this.loadNext(i,s)},vk:function(t){var e=this.fj[t];webix.html.remove(e.node),e.attached=!1},uk:function(){for(var t=0;t"},radio:function(t,e,i,s){var n=i==s.checkValue?'checked="true"':"";return""},editIcon:function(){return"" +},trashIcon:function(){return""}},type_setter:function(t){return this.types&&this.types[t]?(this.type=webix.clone(this.types[t]),this.type.css&&(this.w.className+=" "+this.type.css)):webix.type(this,t),this.type.on_click&&webix.extend(this.on_click,this.type.on_click),t +},xk:function(t,e,i,s){var n=this.fj[t];if(!n.attached){var r=t=this.Fj?2:1;this.Vf.childNodes[r].firstChild.appendChild(n.node),n.attached=!0,n.split=r}this.ak=e[0],this.ck=0;var a=0;if(this.s.scrollAlignY?e[1]==this.data.order.length||this.data.$pagesize&&e[1]%this.data.$pagesize===0?(a=this.ck=e[2],n.node.style.top=a+"px"):n.Jk&&(n.node.style.top="0px"):(this.ck=e[2],e[2]!=n.Jk&&(a=e[2],n.node.style.top=a+"px")),!i&&n.qk==e[0]&&n.Kk==e[1])return 0; +for(var h="",o=this.s.columns[t],l=this.s.rowHeight,c=e[0];c",a+=l;continue}var u=this.Ek(f,o,c),b=this.Mv(o,u,f,d);f.$height?(h+="
"+u+"
",a+=f.$height-l):h+="
"+u+"
" +}else h+="
",this.Gk?this.Gk.last=c:this.Gk={start:c,count:e[1]-c};a+=l}return n.node.innerHTML=h,n.qk=e[0],n.Kk=e[1],n.Jk=e[2],1},yj:function(){if(this.fj.length&&!isNaN(1*this.dc)){var t=this.wj+(this.nj?this.nj:0);if(!this.s.autoheight&&!this.s.yCount||!this.resize()){this.Wj.sizeTo(this.dc,this.$g,this.jj),this.Wj.define("scrollHeight",t),this.Vj=Math.max(0,this.dc-this.nj-this.$g-this.jj); +for(var e=0;3>e;e++)this.Vf.childNodes[e].style.height=this.Vj+"px",this.Vf.childNodes[e].firstChild.style.height=this.s.prerender?this.wj+"px":this.Vj+"px"}}},Jj:function(){if(this.fj.length){var t=0;for(this.dk=0,this.ek=0,this.Yj=0;t=this.Fj;)this.ek+=this.fj[t].width,t--; +if(this.bc&&(!this.s.autowidth||!this.resize())){this.Yj=this.bc-this.ek-this.dk-this.oj,this.Vf.childNodes[1].firstChild.style.width=this.Gj+"px",this.Vf.childNodes[0].style.width=this.dk+"px",this.Vf.childNodes[1].style.width=this.Yj+"px",this.Vf.childNodes[2].style.width=this.ek+"px",this.I.childNodes[0].style.width=this.dk+"px",this.I.childNodes[1].style.width=this.Yj+"px",this.I.childNodes[2].style.width=this.ek+"px",this.cj.childNodes[0].style.width=this.dk+"px",this.cj.childNodes[1].style.width=this.Yj+"px",this.cj.childNodes[2].style.width=this.ek+"px"; +var e=this.Yj-this.Gj;if(0>e&&(e=0),e!=this.Lj&&(this.Lj=e,this.Oj()),webix.env.isWebKit){var i=this.Vf.childNodes[0].offsetWidth;i=this.Vf.childNodes[1].offsetWidth,i=this.Vf.childNodes[2].offsetWidth}this.Zj.sizeTo(this.bc-this.oj),this.Zj.define("scrollWidth",this.Gj+this.dk+this.ek)}}},$getSize:function(t,e){if((this.s.autoheight||this.s.yCount)&&this.s.columns){var i=(this.s.yCount||0)*this.s.rowHeight; +i||(i=this.isVisible()?this.wj:this.count()*this.s.rowHeight),this.s.height=Math.max(i+(this.nj?this.nj:0)-1,this.s.minHeight||0)+this.$g+this.jj}this.s.autowidth&&this.s.columns&&(this.s.width=Math.max(this.Gj+this.dk+this.ek+this.oj,this.s.minWidth||0));var s=this.dk+this.ek+this.oj,n=webix.ui.view.prototype.$getSize.call(this,t,e); +return n[0]=Math.max(n[0]||s),n},Ow:function(){if(this.Zj){var t=this.getScrollState();this.Zj.Wi=this.Wj.Wi=-1,this.scrollTo(t.x,t.y)}},$setSize:function(){webix.ui.view.prototype.$setSize.apply(this,arguments)&&(this.tj&&(this.callEvent("onResize",[this.bc,this.dc]),this.Jj(),this.yj()),this.render()) +},Mk:function(t){var e=this.getColumnConfig(t);if(e.sort){var i="asc";e.id==this.Nk&&(i="asc"==this.Ok?"desc":"asc"),this.zf(e.id,i,e.sort)}},markSorting:function(t,e){if(this.Pk||(this.Pk=webix.html.create("DIV")),webix.html.remove(this.Pk),e){var i=this.Qk(this.getColumnIndex(t));i&&(this.Pk.className="webix_ss_sort_"+e,i.style.position="relative",i.appendChild(this.Pk)),this.Nk=t,this.Ok=e +}else this.Nk=this.Ok=null},scroll_setter:function(t){return"string"==typeof t?(this.s.scrollX=-1!=t.indexOf("x"),this.s.scrollY=-1!=t.indexOf("y"),t):this.s.scrollX=this.s.scrollY=t},Qk:function(t){for(var e=this.I.getElementsByTagName("TD"),i=null,s=0;s=0;l--)e[a[l]]&&r.push(e[a[l]])}if(n.parentNode.getAttribute){var c=n.parentNode.getAttribute("column")||n.getAttribute("column"); +if(c){var u="DIV"==n.parentNode.tagName;if(o=!0,u){var d=n.parentNode.getAttribute("row")||n.getAttribute("row")||webix.html.index(n)+this.fj[c].qk;this.Qc=h={row:this.data.order[d],column:this.fj[c].id},h.toString=this.ok}else this.Qc=h={column:this.fj[c].id};if(r.length)for(var l=0;l0&&(t=this.data.order[0]),null===e&&(e=this.columnId(0)),null===i&&(i=this.data.order.length),null===s&&(s=this.s.columns.length),this.exists(t)&&(t=this.getIndexById(t),e=this.getColumnIndex(e),null!==e))for(var r=0;i>r&&t+rl&&e+l"}},textFilter:{getInputNode:function(t){return t.firstChild.firstChild},getValue:function(t){return this.getInputNode(t).value},setValue:function(t,e){this.getInputNode(t).value=e},refresh:function(t,e,i){e.component=t.s.id,t.registerFilter(e,i,this),e.Sk=t.s.id,i.value&&this.getValue(e)!=i.value&&this.setValue(e,i.value),e.onclick=webix.html.preventEvent,webix.event(e,"keydown",this.Tk) +},render:function(t,e){return this.init&&this.init(e),e.css="webix_ss_filter",""},Tk:function(t){var e=this.Sk;9!=(t.which||t.keyCode)&&(this.Uk&&window.clearTimeout(this.Uk),this.Uk=window.setTimeout(function(){webix.$$(e).filterByAll() +},webix.ui.datafilter.textWaitDelay))}},selectFilter:{getInputNode:function(t){return t.firstChild.firstChild},getValue:function(t){return this.getInputNode(t).value},setValue:function(t,e){this.getInputNode(t).value=e},refresh:function(t,e,i){i.compare=i.compare||function(t,e){return t==e},e.component=t.s.id,t.registerFilter(e,i,this); +var s;s=i.options?i.options:t.collectValues(i.columnId);for(var n=document.createElement("select"),r=0;r=33&&40>=i||(this.Uk&&window.clearTimeout(this.Uk),this.Uk=window.setTimeout(function(){webix.$$(e).loadNext(-1,0,{before:function(){var t=this.data.url; +this.editStop&&this.editStop(),this.clearAll(),this.data.url=t},success:function(){this.callEvent("onAfterFilter",[])}},0,1)},webix.ui.datafilter.textWaitDelay))}},webix.ui.datafilter.textFilter),webix.ui.datafilter.serverSelectFilter=webix.extend({Vk:function(){var t=this.Sk;webix.$$(t).loadNext(-1,0,{before:function(){var t=this.data.url; +this.editStop&&this.editStop(),this.clearAll(),this.data.url=t},success:function(){this.callEvent("onAfterFilter",[])}},0,1)}},webix.ui.datafilter.selectFilter),webix.ui.datafilter.numberFilter=webix.extend({init:function(t){t.prepare=function(e){var i=-1!=e.indexOf("=")?1:0,s=this.format(e);return""===s?"":(-1!=e.indexOf(">")?t.compare=this.Wk:-1!=e.indexOf("<")?(t.compare=this.Xk,i*=-1):(t.compare=this.Yk,i=0),s-i) +}},format:function(t){return t.replace(/[^0-9]/g,"")},Wk:function(t,e){return 1*t>e},Xk:function(t,e){return e>1*t},Yk:function(t,e){return 1*t==e}},webix.ui.datafilter.textFilter),webix.ui.datafilter.dateFilter=webix.extend({format:function(t){if(""===t)return"";var e=new Date;if(-1!=t.indexOf("today"))e=webix.Date.dayStart(e); +else if(-1==t.indexOf("now")){var i=t.match(/[0-9]+/g);if(!i||!i.length)return"";i.length<3?(i.reverse(),e=new Date(i[0],(i[1]||1)-1,1)):e=webix.i18n.dateFormatDate(t.replace(/^[>< =]+/,""))}return e.valueOf()}},webix.ui.datafilter.numberFilter),webix.extend(webix.ui.datatable,{find:function(t,e){for(var i=[],s=this.data.count(),n=0;s>n;n++){var r=this.getItem(this.data.order[n]),a=!0; +if("object"==typeof t){for(var h in t)if(r[h]!=t[h]){a=!1;break}}else t(r)||(a=!1);if(a&&i.push(r),e&&i.length)return i[0]}return i},filterByAll:function(){this.data.silent(function(){this.filter();var t=!1;for(var e in this.ij){var i=this.ij[e],s=i[2].getValue(i[0]),n=s;i[1].prepare&&(n=i[1].prepare.call(i[2],n,i[1],this)),i[1].value=s; +var r=i[1].compare;this.callEvent("onBeforeFilter",[e,n,i[1]])&&""!==n&&(r?this.filter(function(t,i){if(!t)return!1;var s=t[e];return r(s,i,t)},n,t):this.filter(e,n,t),t=!0)}},this),this.refresh(),this.callEvent("onAfterFilter",[])},filterMode_setter:function(t){return webix.extend(this.data.Cf,t,!0) +},getFilter:function(t){var e=this.ij[t];return e&&e[2].getInputNode?e[2].getInputNode(e[0]):null},registerFilter:function(t,e,i){this.ij[e.columnId]=[t,e,i]},collectValues:function(t){var e=[{id:"",value:""}],i={"":!0},s=this.getColumnConfig(t),n=s.options||s.collection;if(n){if("object"==typeof n&&!n.loadNext){if(webix.isArray(n))for(var r=0;re.value?1:-1 +})}}),webix.extend(webix.ui.datatable,{hover_setter:function(t){return t&&!this.Yw&&(this.Vc(),this.config.experimental=!0,this.attachEvent("onMouseMoving",function(){var t=this.locate(arguments[0]);t=t?t.row:null,this.Zw!=t&&(this.Zw&&this.removeRowCss(this.Zw,this.s.hover),this.$w(),this.Zw=t)}),this.attachEvent("onMouseOut",function(){this.Zw&&(this.removeRowCss(this.Zw,this.s.hover),this.Zw=null) +}),this.Yw=1),t},$w:function(){webix.delay(function(){this.Zw&&this.addRowCss(this.Zw,this.s.hover)},this,[],5)},select_setter:function(t){return!this.select&&t&&(webix.extend(this,this._k.$k,!0),t===!0?t="row":"multiselect"==t&&(t="row",this.s.multiselect=!0),webix.extend(this,this._k[t],!0)),t},getSelectedId:function(t){return t?[]:"" +},getSelectedItem:function(t){return webix.SelectionModel.getSelectedItem.call(this,t)},_k:{$k:{Lk:" webix_cell_select",$init:function(){this.al(),this.on_click.webix_cell=webix.bind(this.bl,this),this.cl=this.zg=function(){this.unselect()},this.data.attachEvent("onStoreUpdated",webix.bind(this.xg,this)),this.data.attachEvent("onClearAll",webix.bind(this.cl,this)),this.data.attachEvent("onAfterFilter",webix.bind(this.zg,this)),this.data.attachEvent("onIdChange",webix.bind(this.Ag,this)),this.$ready.push(webix.SelectionModel.uy) +},Ag:function(t,e){for(var i=0;i1||t){if(i=[].concat(this.el),e)for(var s=0;ss){var n=i;i=s,s=n}this.Dg=!0;for(var r=i;s>=r;r++)this.select(this.getIdByIndex(r),!0);this.Dg=!1,this.jl()}},cell:{fl:function(t){return t.column?t.row+"_"+t.column:null +},select:function(t,e,i){this.hl({row:t,column:e},i)},kl:function(t){var e=this.nl(t.row);return e.$count++,e[t.column]=!0,t.row},unselect:function(t,e){this.ll({row:t,column:e})},ml:function(t){var e=this.nl(t.row);return e.$count--,e[t.column]=!1,e.$count<=0&&this.data.removeMark(t.row,"webix_selected"),t.row +},mapSelection:function(t){return this.pl(t,!1,!1)},ol:function(t,e){return this.selectRange(t.row,t.column,e.row,e.column)},selectRange:function(t,e,i,s){var n=this.getIndexById(t),r=this.getIndexById(i),a=this.getColumnIndex(e),h=this.getColumnIndex(s);if(n>r){var o=n;n=r,r=o}if(a>h){var o=a;a=h,h=o +}this.Dg=!0;for(var l=n;r>=l;l++)for(var c=a;h>=c;c++)this.select(this.getIdByIndex(l),this.columnId(c),!0);this.Dg=!1,this.jl()}},column:{Lk:" webix_column_select",fl:function(t){return t.column},ok:function(){return this.column},select:function(t,e){this.hl({column:t},e)},kl:function(t){this.s.columns[this.getColumnIndex(t.column)].$selected=!0,this.Dg||this.Kj() +},unselect:function(t){this.ll({column:t})},ml:function(t){this.s.columns[this.getColumnIndex(t.column)].$selected=null,this.Kj()},mapSelection:function(t){return this.pl(t,!0,!1)},ol:function(t,e){return this.selectRange(t.column,e.column)},selectRange:function(t,e){var i=this.getColumnIndex(t),s=this.getColumnIndex(e); +if(i>s){var n=i;i=s,s=n}this.Dg=!0;for(var r=i;s>=r;r++)this.select(this.columnId(r),!0);this.Dg=!1,this.Kj(),this.jl()}}}}),webix.extend(webix.ui.datatable,{blockselect_setter:function(t){return t&&this.ql&&(webix.event(this.x,"mousemove",this.rl,this),webix.event(this.x,"mousedown",this.sl,this),webix.event(document.body,"mouseup",this.tl,this),this.ql=this.ul=this.vl=!1),t +},ql:!0,wl:function(t,e){for(var i=t.target||t.srcElement;i;){if(i.getAttribute&&i.getAttribute("webixignore"))return!1;if(i==e)return!0;i=i.parentNode}return!1},sl:function(t){if(this.wl(t,this.Vf)){this.xl=webix.html.offset(this.Vf);var e=webix.html.pos(t);this.ul=[e.x-this.xl.x,e.y-this.xl.y]}},tl:function(){if(this.yl){var t=this.zl.apply(this,this.ul),e=this.zl.apply(this,this.vl); +t.row&&e.row&&this.ol(t,e),this.yl=webix.html.remove(this.yl)}this.ul=this.vl=!1},Al:function(){this.clearSelection(),this.yl=webix.html.create("div",{"class":"webix_block_selection"},""),this.Vf.appendChild(this.yl)},rl:function(t){if(this.ul!==!1){var e=webix.html.pos(t),i=[e.x-this.xl.x,e.y-this.xl.y]; +if(Math.abs(this.ul[0]-i[0])<5&&Math.abs(this.ul[1]-i[1])<5)return;this.vl===!1&&this.Al(t),this.vl=i,this.Bl(this.ul[0],this.ul[1],this.vl[0],this.vl[1])}},Bl:function(t,e,i,s){var n=this.yl.style,r=Math.min(t,i),a=Math.max(t,i),h=Math.min(e,s),o=Math.max(e,s);n.left=r+"px",n.top=h+"px",n.width=a-r+"px",n.height=o-h+"px" +},zl:function(t,e){this.ek&&t>this.dk+this.Yj?t+=this.Zj.getSize()-this.Yj-this.dk-this.ek:(!this.dk||t>this.dk)&&(t+=this.Zj.getScroll()),e+=this.getScrollState().y;var i=null,s=null;0>t&&(t=0),0>e&&(e=0);for(var n=this.s.columns,r=this.data.order,a=0,h=0;h=t){s=n[h].id; +break}if(s||(s=n[n.length-1].id),a=0,this.s.fixedRowHeight)i=r[Math.floor(e/this.s.rowHeight)];else for(var h=0;h=e){i=r[h];break}return i||(i=r[r.length-1]),{row:i,column:s}}}),webix.protoUI({name:"resizearea",defaults:{dir:"x"},$init:function(t){var e=t.dir||"x",i=webix.toNode(t.container),s="x"==e?"width":"height",n=t.margin?t.margin+"px":0; +this.Cl="x"==e?"left":"top",this.x=webix.html.create("DIV",{"class":"webix_resize_area webix_dir_"+e}),webix.event(this.x,webix.env.mouse.down,webix.html.stopEvent),n&&(n="x"==e?n+" 0 "+n:"0 "+n+" 0 "+n),this.Dl=webix.html.create("DIV",{"class":"webix_resize_handle_"+e,style:n?"padding:"+n:""},"
"),this.El=webix.html.create("DIV",{"class":"webix_resize_origin_"+e}),t[s]&&(this.El.style[s]=t[s]+(t.border?1:0)+"px",this.Dl.style[s]=t[s]+"px"),t.cursor&&(this.Dl.style.cursor=this.El.style.cursor=this.x.style.cursor=t.cursor),this.Fl=webix.event(i,webix.env.mouse.move,this.Gl,this),this.Hl=webix.event(document.body,webix.env.mouse.up,this.Il,this),this.Dl.style[this.Cl]=this.El.style[this.Cl]=t.start+"px",i.appendChild(this.x),i.appendChild(this.Dl),i.appendChild(this.El) +},Il:function(){this.callEvent("onResizeEnd",[this.Jl]),webix.eventRemove(this.Fl),webix.eventRemove(this.Hl),webix.html.remove(this.x),webix.html.remove(this.Dl),webix.html.remove(this.El),this.x=this.Dl=this.El=null},Gl:function(t){var e=webix.html.pos(t);this.Jl=("x"==this.s.dir?e.x:e.y)+this.s.start-this.s.eventPos,this.Dl.style[this.Cl]=this.Jl+"px",this.callEvent("onResize",[this.Jl]) +}},webix.EventSystem,webix.Settings),webix.extend(webix.ui.datatable,{resizeRow_setter:function(t){return this.s.scrollAlignY=!1,this.s.fixedRowHeight=!1,this.resizeColumn_setter(t)},resizeColumn_setter:function(t){return t&&this.Kl&&(webix.event(this.x,"mousemove",this.Ll,this),webix.event(this.x,"mousedown",this.Ml,this),webix.event(this.x,"mouseup",this.Nl,this),this.Kl=!1),t +},Kl:!0,Ml:function(t){this.Ol&&(this.Pl=[webix.html.pos(t),this.Ol[2]],webix.html.denySelect())},Nl:function(){this.Pl=!1,webix.html.allowSelect()},Ql:function(t){if(t=t||event,!this.Rl){var e=this.Ol[0],i=this.Pl[1],s=this.pk(i);if(s){var n,r=this.Pl[0];if("x"==e?(n=webix.html.offset(i).x+this.Ol[1]-webix.html.offset(this.Vf).x,r=r.x,this.Ol[1]||(s.cind-=i.parentNode.colSpan||1)):(n=webix.html.offset(i).y+this.Ol[1]-webix.html.offset(this.Vf).y+this.$g,r=r.y,this.Ol[1]||s.rind--),s.cind>=0&&s.rind>=0){this.Rl=[e,s,n]; +var a=new webix.ui.resizearea({container:this.x,dir:e,eventPos:r,start:n,cursor:("x"==e?"e":"n")+"-resize"});a.attachEvent("onResizeEnd",webix.bind(this.Sl,this))}this.Ml=this.Ol=!1}}},Sl:function(t){if(this.Rl){var e=this.Rl[0],i=this.Rl[1],s=t-this.Rl[2];if("x"==e){this.s.rightSplit&&i.cind+1>=this.Fj&&i.cind!==this.fj.length-1&&(i.cind++,s*=-1); +var n=this.fj[i.cind].width;this.Xs(i.cind,n+s)}else{var r=this.getIdByIndex(i.rind),a=this.getItem(r).$height||this.s.rowHeight;this.setRowHeight(r,a+s)}this.Nl()}this.Rl=null},Ll:function(t){if(this.Ol&&this.Pl)return this.Ql(t);t=t||event;var e=t.target||t.srcElement,i=!1;if("TD"!=e.tagName&&"TABLE"!=e.tagName){var s=e.className||"",n=-1!=s.indexOf("webix_cell"); +if(!n||!this.config.drag){var r=-1!=s.indexOf("webix_hcell");if(this.Ol=!1,n||r){var a=e.offsetWidth,h=e.offsetHeight,o=webix.html.posRelative(t);n&&this.s.resizeRow&&(o.y<3?(this.Ol=["y",0,e],i="n-resize"):h-o.y<4&&(this.Ol=["y",h,e],i="n-resize")),this.s.resizeColumn&&(o.x<3?(this.Ol=["x",0,e],i="e-resize"):a-o.x<4&&(this.Ol=["x",a,e],i="e-resize")) +}this.Tl&&window.clearTimeout(this.Tl),this.Tl=webix.delay(this.Ul,this,[i],i?100:0)}}},Ul:function(t){this.Vl!=t&&(this.Vl=t,this.x.style.cursor=t||"default")}}),webix.extend(webix.ui.datatable,webix.PagingAbility),webix.csv={escape:!0,delimiter:{rows:"\n",cols:" "},parse:function(t,e){if(e=e||this.delimiter,!this.escape)return this.Wl(t,e); +for(var i=t.replace(/\n$/,"").split(e.rows),s=0;sr?t[n][r]:e}),this.render())},selection:function(t){this.mapSelection(function(e,i,s,n,r){return t[n]&&t[n].length>r?t[n][r]:e +}),this.render()},repeat:function(t){this.mapSelection(function(e,i,s,n,r){return i=t[n%t.length],e=i[r%i.length]}),this.render()},custom:function(){}}},webix.extend(webix.ui.datatable,webix.TablePaste),function(){function t(t,n){var r=i(t,n),a='';return a+=e("header","head",t,r),t.config.footer&&(a+=e("footer","foot",t,r)),a+=s(t,r,n),a+="" +}function e(t,e,i,s){for(var n="<"+e+">",r=1,a=0;ar&&(r=s[a][t].length);for(var a=0;r>a;a++){n+="";for(var h=0;h]*>/g," "),n+="]]>" +}n+=""}return n+=""}function i(t,e){function i(t,e){var i=t?webix.clone(t):{};"object"==typeof e&&webix.extend(i,e,!0),s.push(i)}var s=[],n=e.columns;if(e.id&&s.push({id:"id",width:50,header:[{text:"ID"}],footer:[""]}),n)for(var r in n)i(t.getColumnConfig(r),n[r]);else for(var a=t.s.columns,h=0;h";for(var l=0;l]*>/g,""):"")+"]]>" +}s+=""}}return s}function n(t,e){webix.send(t,{grid_xml:encodeURI(e)},null,"_blank")}webix.extend(webix.ui.datatable,{exportToPDF:function(e,i){var s=t(this,i||{});e=e||"http://webix-export.appspot.com/export/pdf",n(e,s)},exportToExcel:function(e,i){var s=t(this,i||{});e=e||"http://webix-export.appspot.com/export/excel",n(e,s) +}})}(),webix.storage||(webix.storage={}),webix.storage.local={put:function(t,e){t&&window.JSON&&window.localStorage&&window.localStorage.setItem(t,window.JSON.stringify(e))},get:function(t){if(t&&window.JSON&&window.localStorage){var e=window.localStorage.getItem(t);return e?webix.DataDriver.json.toObject(e):null +}return null},remove:function(t){t&&window.JSON&&window.localStorage&&window.localStorage.removeItem(t)},clear:function(){window.localStorage.clear()}},webix.storage.session={put:function(t,e){t&&window.JSON&&window.sessionStorage&&window.sessionStorage.setItem(t,window.JSON.stringify(e))},get:function(t){if(t&&window.JSON&&window.sessionStorage){var e=window.sessionStorage.getItem(t); +return e?webix.DataDriver.json.toObject(e):null}return null},remove:function(t){t&&window.JSON&&window.sessionStorage&&window.sessionStorage.removeItem(t)},clear:function(){window.sessionStorage.clear()}},webix.storage.cookie={put:function(t,e,i,s){t&&window.JSON&&(document.cookie=t+"="+window.JSON.stringify(e)+(s&&s instanceof Date?";expires="+s.toUTCString():"")+(i?";domain="+i:"")) +},_l:function(t){for(var e=document.cookie.split(";"),i="",s="",n="",r=!1,a=0;a1&&(n=unescape(i[1].replace(/^\s+|\s+$/g,""))),n;i=null,s=""}return null},get:function(t){if(t&&window.JSON){var e=this._l(t);return e?webix.DataDriver.json.toObject(e):null +}return null},remove:function(t,e){t&&this._l(t)&&(document.cookie=t+"="+(e?";domain="+e:"")+";expires=Thu, 01-Jan-1970 00:00:01 GMT")},clear:function(t){for(var e=document.cookie.split(";"),i=0;is;s++)i.ids.push(e[s].id),i.size.push(e[s].width);if(this.Nk&&(i.sort={id:this.Nk,dir:this.Ok}),this.ij){var n={},r=0; +for(var a in this.ij)if(!this.am[a]){var h=this.ij[a];h[1].value=n[a]=h[2].getValue(h[0]),r=1}r&&(i.filter=n)}i.hidden=[];for(var a in this.am)i.hidden.push(a);return i},setState:function(t){var e=this.config.columns;if(t){if(this.Nk=null,this.blockEvent(),t.hidden){for(var i={},s=0;ss;s++)e[s]&&e[s].width!=t.size[s]&&this.Xs(s,t.size[s],!0);if(t.filter)for(var o in this.ij){var l=this.ij[o];l[2].setValue(l[0],"")}if(this.unblockEvent(),this.rk(!0),this.callEvent("onStructureUpdate",[]),t.sort){var c=e[this.getColumnIndex(t.sort.id)]; +c&&this.zf(t.sort.id,t.sort.dir,c.sort)}if(t.filter){for(var o in t.filter){var u=t.filter[o];if(u&&this.ij[o]){var l=this.ij[o];l[2].setValue(l[0],u);var d=l[1].contentId;d&&(this.hj[d].value=u)}}this.filterByAll()}if(t.select&&this.select){var f=t.select;this.unselect();for(var s=0;sf&&(r=r*f/150),(u!=s||d!=n)&&(r=Math.round(r*Math.max((u-s)/(l-s),(d-n)/(c-n))));var b={e:u,f:d},h=webix.$$(t.om);h&&h.adjustScroll&&h.adjustScroll(b),r=Math.max(100,r),s!=b.e||n!=b.f?(t.Nf(t.om,b.e,b.f,r+"ms"),t.Dm&&t.Dm.Em(b.e,b.f,r+"ms"),t.Fm(b.e,b.f,r+"ms")):t.Pf()}else t.Pf()}else if(!this.qm)if(t.zm&&!t.ym)t.Gm("onSwipeX"); +else if(t.ym&&!t.zm)t.Gm("onSwipeY");else if(webix.env.isSafari&&t.im){t.im=!1;var x=t.km.target;webix.delay(function(){var t=document.createEvent("MouseEvents");t.initEvent("click",!0,!0),x.dispatchEvent(t)})}t.Gm("onTouchEnd"),t.Of()}},em:function(e){if(t.km){var i=t.Bm(e);if(t.Gm("onTouchMove"),t.nm)t.Hm(i); +else if(t.ym=t.Im(i.Jm,"x",t.ym),t.zm=t.Im(i.Ei,"y",t.zm),t.nm){var s=t.Km("onBeforeScroll");if(s){var n={};s.callEvent("onBeforeScroll",[n]),n.update&&(t.config.speed=n.speed,t.config.scale=n.scale)}t.Lm(i)}return webix.html.preventEvent(e)}},Hm:function(){if(t.om){var e=t.Mf(t.om),i=(e.e,e.f,t.mm||t.km),s=webix.$$(t.om),n=s&&s.$scroll?s.$scroll.ellastic:t.config.ellastic; +t.jm[0]&&(e.e=t.Cm(e.e-i.x+t.lm.x,n,e.e,t.pm.dx,t.pm.px)),t.jm[1]&&(e.f=t.Cm(e.f-i.y+t.lm.y,n,e.f,t.pm.dy,t.pm.py)),t.Nf(t.om,e.e,e.f,"0ms"),t.Dm&&t.Dm.Em(e.e,e.f,"0ms"),t.Fm(e.e,e.f,"0ms")}},Fm:function(e,i,s){var n=t.pm.px/t.pm.dx*-e,r=t.pm.py/t.pm.dy*-i;t.jm[0]&&t.Nf(t.jm[0],n,0,s),t.jm[1]&&t.Nf(t.jm[1],0,r,s) +},scrollTo:function(e,i,s,n){t.Nf(e,i,s,n)},Nf:function(e,i,s,n){if(!t.tt&&window.setAnimationFrame&&window.setAnimationFrame(function(){return t.tt=!0,t.Nf(e,i,s,n)}),t.tt=null,t.Am=!0,e){var r=t.config.translate||webix.env.translate;e.style[webix.env.transform]=r+"("+Math.round(i)+"px, "+Math.round(s)+"px"+("translate3d"==r?", 0":"")+")",e.style[webix.env.transitionDuration]=n +}},Mf:function(e){var i,s=window.getComputedStyle(e)[webix.env.transform];if("none"==s)i={e:0,f:0};else if(window.WebKitCSSMatrix)i=new WebKitCSSMatrix(s);else if(window.MSCSSMatrix)i=new MSCSSMatrix(s);else{var n=s.replace(/(matrix\()(.*)(\))/gi,"$2");n=n.replace(/\s/gi,""),n=n.split(",");for(var i={},r=["a","b","c","d","e","f"],a=0;a0)return e?i+a*Math.sqrt(r):0;var h=s-n;return 0>h+t?e?i-Math.sqrt(-(t-i)):-h:t},Nm:function(e){if(!e.scroll_enabled){e.scroll_enabled=!0,e.parentNode.style.position="relative";var i=webix.env.cssPrefix; +e.style.cssText+=i+"transition: "+i+"transform; "+i+"user-select:none; "+i+"transform-style:flat;",e.addEventListener(webix.env.transitionEnd,t.Pf,!1)}},Lm:function(){-1!=t.nm.indexOf("x")&&(t.jm[0]=t.Om("x",t.pm.dx,t.pm.px,"width")),-1!=t.nm.indexOf("y")&&(t.jm[1]=t.Om("y",t.pm.dy,t.pm.py,"height")),t.Nm(t.om),window.setTimeout(t.Hm,1) +},Om:function(e,i,s,n){if(2>i-s){var r=t.Mf(t.om),a="y"==e?r.e:0,h="y"==e?0:r.f;return t.Dm||t.Nf(t.om,a,h,"0ms"),t.nm=t.nm.replace(e,""),""}var o=webix.html.create("DIV",{"class":"webix_scroll_"+e},"");return o.style[n]=Math.max(s*s/i-7,10)+"px",t.om.parentNode.appendChild(o),o},Im:function(e,i,s){return e>t.config.deltaStep?(t.xm&&(t.Pm(i),t.pk(i),-1==(t.nm||"").indexOf(i)&&(t.nm="")),!1):s +},Pf:function(){var e,i,s;s=webix.$$(t.om||this),s&&(t.om?e=t.Mf(t.om):s.getScrollState&&(i=s.getScrollState(),e={e:i.x,f:i.y}),webix.callEvent("onAfterScroll",[e]),s.callEvent&&s.callEvent("onAfterScroll",[e])),t.nm||(webix.html.remove(t.jm),t.jm=[null,null]),t.Am=!1},Pm:function(){window.clearTimeout(t.wm),t.xm=!1 +},Qm:function(e){return t.jm[0]||t.jm[1]?void t.Rm(e,t.jm[0]?"x":"y"):!0},dm:function(i){var s=i.target||event.srcElement;if(!(t.Xf||s.tagName&&"textarea"==s.tagName.toLowerCase()&&s.offsetHeight0)for(var r=0;r=0){var s=this.dn(t,e);return this.Xs(t,s,i)}},adjustColumn:function(t,e){this.bn(this.getColumnIndex(t),e)},adjustRowHeight:function(t,e){var i=this.getColumnConfig(t),s=(this.data.count(),webix.html.create("DIV",{"class":"webix_table_cell webix_measure_size webix_cell"},"")); +s.style.cssText="width:"+i.width+"px; height:1px; visibility:hidden; position:absolute; top:0px; left:0px; overflow:hidden;",this.$view.appendChild(s),this.data.each(function(t){t&&(s.innerHTML=this.Ek(t,i,0),t.$height=Math.max(s.scrollHeight,this.s.rowHeight))},this),s=webix.html.remove(s),e||this.refresh() +}}),webix.extend(webix.ui.datatable,{math_setter:function(t){return t&&this.en(),t},fn:"$",en:function(){webix.env.strict||(this.data.attachEvent("onStoreUpdated",webix.bind(this.gn,this)),this.data.attachEvent("onStoreLoad",webix.bind(this.hn,this)),this.attachEvent("onStructureLoad",this.hn))},gn:function(t,e,i){if(t&&"delete"!=i&&"paint"!=i){"add"==i&&this.pn(e); +for(var s=0;s0&&"="===s.substr(0,1)?(("undefined"==typeof n[this.fn+e]||i!==!0)&&(n[this.fn+e]=n[e]),n[e]=this.ln(s,t,e)):("undefined"!=typeof n[this.fn+e]&&delete n[this.fn+e],this.mn(t,e)),"undefined"!=typeof n.depends&&"undefined"!=typeof n.depends[e]))for(var r in n.depends[e]){var a=n.depends[e][r][0]+"__"+n.depends[e][r][1]; +"undefined"==typeof this.kn[a]&&(this.kn[a]=!0,this.jn(n.depends[e][r][0],n.depends[e][r][1],!0))}},nn:function(t,e){var i=this.getItem(t);"undefined"!=typeof i[this.fn+e]&&(i[e]=i[this.fn+e])},hn:function(){if(this.fj&&this.count()){this.pn();for(var t=0;t0?i[0]:!1}}),webix.extend(webix.ui.datatable,{ii:function(t){return this.getColumnConfig(t.column).editor +},getEditor:function(t,e){return t?(1==arguments.length&&(e=t.column,t=t.row),(this.ai[t]||{})[e]):this.di},si:function(t){for(var e in this.ai){var i=this.ai[e];for(var s in i)"$count"!=s&&t.call(this,i[s])}},ji:function(t,e,i){var s=t.row,n=t.column,r=e.config=this.getColumnConfig(n);i!==!1&&this.showCell(s,n); +var a=e.render();e.$inline&&(a=this.mi(t)),e.node=a;var h,o=this.getItem(s),l=r.editFormat;return this.s.editMath&&(h=o["$"+n]),h=h||o[n],webix.isUndefined(h)&&(h=""),e.setValue(l?l(h):h,o),e.value=o[n],this.ni(t,e),e.$inline||this.oi(t,a,!0),e.afterRender&&e.afterRender(),this.s.liveValidation&&(webix.event(e.node,"keyup",this.Gn(t,this)),this.validateEditor(t)),a +},Gn:function(t,e){return function(){e.validateEditor(t)}},ti:function(t,e){var i=this.getColumnConfig(t.column).editParse,s=this.getItem(t.row);return s[t.column]=i?i(e):e,this.s.editMath&&delete s["$"+t.column],t.row},ni:function(t,e){var i=this.ai[t.row]=this.ai[t.row]||{};i.$count=(i.$count||0)+1,e.row=t.row,e.column=t.column,this.di=i[t.column]=e,this.Eb++,this.Hn=this.getScrollState() +},qi:function(t){this.di==t&&(this.di=0),t.destroy&&t.destroy();var e=this.ai[t.row];delete e[t.column],e.$count--,e.$count||delete this.ai[t.row],this.Eb--},ei:function(t,e){var i=this.ai[t];if(i){this.ai[e]=i,delete this.ai[t];for(var s in i)i[s].row=e}},pi:function(t){var e=this.getColumnConfig(t.column); +if(e&&e.node&&e.attached){var i=this.getIndexById(t.row);if(i>=e.qk&&i=0;h--){for(var o=n-1;o>=0;o--){var l={row:r[h],column:a[o].id}; +if(e.call(this,l))return l}n=a.length}return null},In:function(){this.Eb&&(this.Jn?this.Jn=!1:(this.Wj.scrollTo(this.getScrollState().y+this.Vf.childNodes[1].firstChild.scrollTop),this.Vf.childNodes[1].firstChild.scrollTop=0,this.Jn=!0))},Kn:function(){this.Eb&&this.Zj.scrollTo(this.Vf.childNodes[1].scrollLeft) +},gi:function(){this.attachEvent("onScrollY",this.Ln),this.attachEvent("onScrollX",this.Ln),this.attachEvent("onScrollY",this.$s),this.attachEvent("onColumnResize",function(){this.editStop()}),this.attachEvent("onAfterFilter",function(){this.editStop()}),this.attachEvent("onRowResize",function(){this.editStop() +}),this.Vf.childNodes[1].firstChild.onscroll=webix.bind(this.In,this),this.Vf.childNodes[1].onscroll=webix.bind(this.Kn,this)},Ln:function(){if(this.Eb){var t=this.Hn;this.Hn=this.getScrollState();var e=this.Hn.y-t.y;this.si(function(t){if(t.getPopup){var i=this.getItemNode(t);t.getPopup().show(i?i:{x:-1e4,y:-1e4}) +}else t.$inline||(t.node.top-=e,t.node.style.top=t.node.top+"px")})}}}),webix.extend(webix.ui.datatable,webix.EditAbility),webix.extend(webix.ui.datatable,{$init:function(){this.am={},this.bm=[],this.Mn=[0,0],this.attachEvent("onStructureLoad",this.Nn)},Nn:function(){for(var t=this.fj,e=t.length-1;e>=0;e--)t[e].hidden?this.hideColumn(t[e].id,!0,!0):t[e].batch&&this.config.visibleBatch&&t[e].batch!=this.config.visibleBatch&&this.hideColumn(t[e].id,!0,!0) +},moveColumn:function(t,e){var i=this.getColumnIndex(t);if(i!=e){var s=this.s.columns,n=s.splice(i,1),r=e-(e>i?1:0);webix.PowerArray.insertAt.call(s,n[0],r),this.On()}},isColumnVisible:function(t){return!this.am[t]},hideColumn:function(t,e,i){var s=this.s.columns,n=this.bm,r=this.am;if(e!==!1){var a=this.getColumnIndex(t); +if(-1==a)return;if(!n.length){for(var h=0;h=this.Fj?this.s.rightSplit--:this.Fj--,this.xt(a,s[a],0),this.vk(a);var o=r[t]=s.splice(a,1)[0];o.qk=-1,delete this.Aj[t]}else{var o=r[t];if(!o)return;for(var l=null,h=0;h=this.Mn[1]?this.s.rightSplit++:this.Fj++,delete r[t],this.Aj[t]=o}i||this.On()},xt:function(t,e,i){for(var s=e.header.length-1;s>=0;s--)if(null===e.header[s])for(var n=t;n>=0;n--){var r=this.fj[n]; +if(null!==r.header[s]){r.header[s].colspan+i>t-n&&(r.header[s].colspan-=i?-1:1);break}}else e.header[s].colspan&&0===i&&(e.header[s].colspan=1)},refreshColumns:function(t){this.Aj={};for(var e=0;ee;e++)this.Vf.childNodes[e].firstChild.innerHTML=""; +this.fj=this.config.columns=t||this.config.columns,this.tj=0,this.callEvent("onStructureUpdate"),this.rj(),this.sk(),this.render()},On:function(){this.tj=0,this.callEvent("onStructureUpdate"),this.uj(),this.render()},showColumn:function(t){return this.hideColumn(t,!1)},showColumnBatch:function(t){this.eachColumn(function(e,i){i.batch&&(i.batch==t&&this.am[i.id]?this.hideColumn(i.id,!1,!0):i.batch==t||this.am[i.id]||this.hideColumn(i.id,!0,!0)) +},!0),this.On()}}),webix.extend(webix.ui.datatable,{moveSelection:function(t,e){var i=this.getSelectedId(!0),s=i.length-1;if(s>=0){var n=i[s].row,r=i[s].column,a=this.s.multiselect?e:!1;if("top"==t||"bottom"==t){if(n&&("top"==t?n=this.data.getFirstId():"bottom"==t&&(n=this.data.getLastId())),r){var s=0; +"bottom"==t&&(s=this.config.columns.length-1),r=this.columnId(s)}}else if("up"==t||"down"==t||"pgup"==t||"pgdown"==t){if(n){var s=this.getIndexById(n),h="pgup"==t||"pgdown"==t?Math.round(this.Vj/this.s.rowHeight):1;"up"==t||"pgup"==t?s-=h:("down"==t||"pgdown"==t)&&(s+=h),0>s&&(s=0),s>=this.data.order.length&&(s=this.data.order.length-1),n=this.getIdByIndex(s) +}}else{if("right"!=t&&"left"!=t)return;if(r&&"row"!=this.config.select){var s=this.getColumnIndex(r);if("right"==t?s++:"left"==t&&s--,0>s||s>=this.config.columns.length)return;r=this.columnId(s)}else{if(this.open&&"right"==t)return this.open(n);if(this.close&&"left"==t)return this.close(n)}}this.showCell(n,r),this.hl({row:n,column:r},a) +}return!1}}),webix.extend(webix.ui.datatable,webix.KeysNavigation),webix.extend(webix.ui.datatable,webix.DataMove),webix.extend(webix.ui.datatable,{$dragHTML:function(t){for(var e=this.bc-this.oj,i="
",s=this.s.columns,n=0;n"+r+"
"}return i+""},getHeaderNode:function(t,e){var i=this.getColumnIndex(t);e=e||0;for(var s=this.I.childNodes[1].getElementsByTagName("TR")[e+1].childNodes,n=0;ns[1])return;var n=this.Xj(),r=this.s.leftSplit?0:n[0];if(t.column&&(r=this.getColumnIndex(t.column),r=this.s.leftSplit&&(rn[1])))return;var a=this.s.columns[r];if(a.attached&&a.node)return a.node.childNodes[i-s[0]]}},Zg:function(t,e){return!t||t.header&&e?0:this.data.order[t.rind] +},dragColumn_setter:function(t){var e;"order"==t?e={$drag:webix.bind(function(t,i){var s=this.locate(i);if(!s||!this.callEvent("onBeforeColumnDrag",[s.column,i]))return!1;webix.DragControl.Gd={from:e,start:s,custom:"column_dnd"};var n=this.getColumnConfig(s.column);return this.Qn=webix.html.posRelative(i),this.Rn=n.width,"
"+(n.header[0].text||" ")+"
" +},this),$dragPos:webix.bind(function(t,e,i){var s=webix.DragControl.getContext(),n=webix.html.offset(this.$view);i.style.display="none";var r=document.elementFromPoint(t.x,n.y+1),a=r?this.locate(r):null,h=webix.DragControl.getContext().start.column;if(a&&a.column!=h&&(!this.Sn||a.column!=this.Yg)&&"column_dnd"==s.custom&&webix.$$(r)==this){if(!this.callEvent("onBeforeColumnDropOrder",[h,a.column,e]))return; +var o=this.getColumnIndex(h),l=this.getColumnIndex(a.column);e.touches&&(this.wy=e.target,this.wy.style.display="none",this.$view.parentNode.appendChild(this.wy)),this.moveColumn(h,l+(l>o?1:0)),this.Yg=a.column,this.Sn=!0}if(a&&a.column==h&&(this.Sn=!1),i.style.display="block",t.x=t.x-this.Qn.x,t.y=n.y,t.xc&&(t.x=c)}webix.DragControl.Ed=!0},this),$dragDestroy:webix.bind(function(t,e){webix.html.remove(e),this.wy&&webix.html.remove(this.wy);var i=webix.DragControl.getContext().start;this.callEvent("onAfterColumnDropOrder",[i.column,this.Yg,t])},this)}:t&&(e={ah:!0,$drag:webix.bind(function(t,i){var s=this.locate(i); +if(!s||!this.callEvent("onBeforeColumnDrag",[s.column,i]))return!1;webix.DragControl.Gd={from:e,start:s,custom:"column_dnd"};for(var n=this.getColumnConfig(s.column).header,r=" ",a=0;a"+r+""},this),$drop:webix.bind(function(t,e,i){var s=i; +i.touches&&this.Tn&&(s=this.Tn);var n=this.locate(s);if(!n)return!1;var r=webix.DragControl.getContext().start.column;if(r!=n.column){if(!this.callEvent("onBeforeColumnDrop",[r,n.column,i]))return;var a=this.getColumnIndex(r),h=this.getColumnIndex(n.column);this.moveColumn(r,h+(h>a?1:0)),this.callEvent("onAfterColumnDrop",[r,n.column,i]) +}},this),$dragIn:webix.bind(function(t,i,s){var n=webix.DragControl.getContext();if("column_dnd"!=n.custom||n.from!=e)return!1;for(var r=s.target||s.srcElement;-1==(r.className||"").indexOf("webix_hcell");)if(r=r.parentNode,!r)return;return r!=this.Tn&&(this.Tn&&webix.html.removeCss(this.Tn,"webix_dd_over_column"),webix.html.addCss(r,"webix_dd_over_column")),this.Tn=r +},this),$dragDestroy:webix.bind(function(t,e){this.Tn&&webix.html.removeCss(this.Tn,"webix_dd_over_column"),webix.html.remove(e)},this)}),t&&(webix.DragControl.addDrag(this.I,e),webix.DragControl.addDrop(this.I,e,!0))}}),webix.extend(webix.ui.datatable,webix.DragItem),webix.extend(webix.ui.datatable,{Te:function(t,e){this.Un(t); +for(var i in e)this.addCellCss(t,i,"webix_invalid_cell");this.addCss(t,"webix_invalid")},Qe:function(t){this.Un(t),this.removeCss(t,"webix_invalid")},Un:function(t){var e=(this.getItem(t),this.data.getMark(t,"$cellCss"));if(e)for(var i in e)e[i]=e[i].replace("webix_invalid_cell","").replace(" "," ") +},addRowCss:function(t,e,i){this.addCss(t,e,i)},removeRowCss:function(t,e,i){this.removeCss(t,e,i)},addCellCss:function(t,e,i,s){var n=this.data.getMark(t,"$cellCss"),r=n||{},a=r[e]||"";r[e]=a.replace(i,"").replace(" "," ")+" "+i,n||this.data.addMark(t,"$cellCss",!1,r,!0),s||this.refresh(t)},removeCellCss:function(t,e,i,s){var n=this.data.getMark(t,"$cellCss"); +if(n){var r=n[e]||"";r&&(n[e]=r.replace(i,"").replace(" "," ")),s||this.refresh(t)}}}),webix.extend(webix.ui.datatable,webix.ValidateCollection),webix.TreeTableClick={},webix.TreeTablePaste={insert:function(t){for(var e=this.getSelectedId(!0,!0),i=0;i":webix.TreeType.checkbox.apply(this,arguments)},this.data.provideApi(this,!0)},Xg:!1,Vn:function(t){return function(e,i){return i=i.row,t.call(this,e,i) +}},getState:function(){var t=webix.DataState.getState.call(this);return webix.extend(t,webix.TreeAPI.getState.call(this)),t},setState:function(t){webix.TreeAPI.setState.call(this,t)&&webix.DataState.setState.call(this,t)},clipboard_setter:function(t){return webix.extend(this.rh,webix.TreeTablePaste),webix.TablePaste.clipboard_setter.call(this,t) +}},webix.TreeAPI,webix.TreeStateCheckbox,webix.TreeDataLoader,webix.ui.datatable),webix.Canvas=webix.proto({$init:function(t){this.Wn=[],this.Xn=t.name,this.tg=webix.toNode(t.container||t);var e=t.width*(window.devicePixelRatio||1),i=t.height*(window.devicePixelRatio||1),s=t.style||"";s+=";width:"+t.width+"px;height:"+t.height+"px;",this.Yn(t.name,s,e,i) +},Yn:function(t,e,i,s){return this.Zn=webix.html.create("canvas",{width:i,height:s,canvas_id:t,style:e||""}),this.tg.appendChild(this.Zn),this.Zn.getContext||webix.env.isIE&&(webix.require("legacy/excanvas/excanvas.js"),G_vmlCanvasManager.init_(document),G_vmlCanvasManager.initElement(this.Zn)),this.Zn +},getCanvas:function(t){var e=(this.Zn||this.Yn(this.w)).getContext(t||"2d");return this.$n||(this.$n=!0,e.scale(window.devicePixelRatio||1,window.devicePixelRatio||1)),e},_n:function(t,e){this.Zn&&(this.Zn.setAttribute("width",t*(window.devicePixelRatio||1)),this.Zn.setAttribute("height",e*(window.devicePixelRatio||1)),this.Zn.style.width=t+"px",this.Zn.style.height=e+"px",this.$n=!1) +},renderText:function(t,e,i,s,n){if(i){n&&(n=Math.max(n,0)),e&&(e=Math.max(e,0));var r=webix.html.create("DIV",{"class":"webix_canvas_text"+(s?" "+s:""),style:"left:"+t+"px; top:"+e+"px;"},i);return this.tg.appendChild(r),this.Wn.push(r),n&&(r.style.width=n+"px"),r}},renderTextAt:function(t,e,i,s,n,r,a){var h=this.renderText.call(this,i,s,n,r,a); +return h&&(t&&(h.style.top="middle"==t?parseInt(s-h.offsetHeight/2,10)+"px":s-h.offsetHeight+"px"),e&&(h.style.left="left"==e?i-h.offsetWidth+"px":parseInt(i-h.offsetWidth/2,10)+"px")),h},clearCanvas:function(t){var e,i=[];for(e=0;e0;)i=this.co[t%16]+i,t=Math.floor(t/16);for(;i.lengthe||e>255)&&(e=0),(0>i||i>255)&&(i=0),(0>s||s>255)&&(s=0),[e,i,s] +},hsvToRgb:function(t,e,i){var s,n,r,a,h,o,l,c;switch(s=Math.floor(t/60)%6,n=t/60-s,r=i*(1-e),a=i*(1-n*e),h=i*(1-(1-n)*e),o=0,l=0,c=0,s){case 0:o=i,l=h,c=r;break;case 1:o=a,l=i,c=r;break;case 2:o=r,l=i,c=h;break;case 3:o=r,l=a,c=i;break;case 4:o=h,l=r,c=i;break;case 5:o=i,l=r,c=a}return o=Math.floor(255*o),l=Math.floor(255*l),c=Math.floor(255*c),[o,l,c] +},rgbToHsv:function(t,e,i){var s,n,r,a,h,o,l,c;return s=t/255,n=e/255,r=i/255,a=Math.min(s,n,r),h=Math.max(s,n,r),l=0,o=0===h?0:1-a/h,c=h,h==a?l=0:h==s&&n>=r?l=60*(n-r)/(h-a)+0:h==s&&r>n?l=60*(n-r)/(h-a)+360:h==n?l=60*(r-s)/(h-a)+120:h==r&&(l=60*(s-n)/(h-a)+240),[l,o,c]}},webix.HtmlMap=webix.proto({$init:function(t){this.ad="map_"+webix.uid(),this.U=t,this.eo=[] +},addRect:function(t,e,i){this.fo(t,"RECT",e,i)},addPoly:function(t,e,i){this.fo(t,"POLY",e,i)},fo:function(t,e,i,s){var n="";4==arguments.length&&(n="userdata='"+s+"'"),this.eo.push("")},addSector:function(t,e,i,s,n,r,a,h){var o=[]; +o.push(s),o.push(Math.floor(n*a));for(var l=e;i>l;l+=Math.PI/18)o.push(Math.floor(s+r*Math.cos(l))),o.push(Math.floor((n+r*Math.sin(l))*a));return o.push(Math.floor(s+r*Math.cos(i))),o.push(Math.floor((n+r*Math.sin(i))*a)),o.push(s),o.push(Math.floor(n*a)),this.addPoly(t,o,h)},render:function(t){var e=webix.html.create("DIV"); +e.style.cssText="position:absolute; width:100%; height:100%; top:0px; left:0px;",t.appendChild(e);var i=webix.env.isIE?"":"src='data:image/gif;base64,R0lGODlhEgASAIAAAP///////yH5BAUUAAEALAAAAAASABIAAAIPjI+py+0Po5y02ouz3pwXADs='";e.innerHTML=""+this.eo.join("\n")+"",t.t=e,this.eo=[] +}}),webix.protoUI({name:"chart",$init:function(t){this.go=[this.s],this.ho=[],this.w.className+=" webix_chart",this.$ready.push(this.Mi),t.preset&&this.io(t),this.attachEvent("onMouseMove",this.jo),this.data.provideApi(this,!0)},Mi:function(){this.data.attachEvent("onStoreUpdated",webix.bind(function(){this.render() +},this))},defaults:{color:"RAINBOW",alpha:"1",label:!1,value:"{obj.value}",padding:{},type:"pie",lineColor:"#ffffff",cant:.5,barWidth:30,line:{width:2,color:"#1293f8"},item:{radius:3,borderColor:"#636363",borderWidth:1,color:"#ffffff",alpha:1,type:"r",shadow:!1},shadow:!0,gradient:!1,border:!0,labelOffset:20,origin:"auto",scale:"linear"},ad:"webix_area_id",on_click:{webix_chart_legend_item:function(t,e,i){var s=i.getAttribute("series_id"); +if(this.callEvent("onLegendClick",[t,s,i])){var n=this.s,r=n.legend.values,a=r&&r[s].toggle||n.legend.toggle;"undefined"!=typeof s&&this.go.length>1&&a&&(-1!=i.className.indexOf("hidden")?this.showSeries(s):this.hideSeries(s))}}},on_dblclick:{},on_mouse_move:{},locate:function(t){return webix.html.locate(t,this.ad) +},$setSize:function(t,e){if(webix.ui.view.prototype.$setSize.call(this,t,e)){for(var i in this.canvases)this.canvases[i]._n(this.bc,this.dc);this.render()}},type_setter:function(t){return"undefined"==typeof this.s.offset&&(this.s.offset=!("area"==t||"stackedArea"==t)),"radar"!=t||this.s.yAxis||this.define("yAxis",{}),"scatter"==t&&(this.s.yAxis||this.define("yAxis",{}),this.s.xAxis||this.define("xAxis",{})),t +},removeAllSeries:function(){this.clearCanvas(),this.ko&&(this.ko.innerHTML="",this.ko.parentNode.removeChild(this.ko),this.ko=null),this.canvases&&(this.canvases={}),this.w.innerHTML="";for(var t=0;t=b;b+=a){var x=this.Bo?Math.pow(10,b):b;h.fixNum&&(x=parseFloat(x).toFixed(h.fixNum));var p=Math.floor(l-f*d)+.5;if(b==n&&"auto"==this.s.origin||!this.s.yAxis.lines.call(this,b)||this.zo(t,o,p,s.x,p,this.s.yAxis.lineColor.call(this,b),1),b==this.s.origin&&(u=p),1>a&&!this.Bo){var v=Math.min(Math.floor(this.Do(a)),0>=n?0:Math.floor(this.Do(n))),w=Math.pow(10,-v); +x=Math.round(x*w)/w,b=x}this.canvases.y.renderText(0,p-5,this.s.yAxis.template(x.toString()),"webix_axis_item_y",i.x-5),f++}return this.zo(t,o,l+1,o,c,this.s.yAxis.color,1),u}}},Co:function(t,e){var i="webix_axis_title_y"+(webix.Eo&&9!=webix.Eo?" webix_ie_filter":""),s=this.canvases.y.renderTextAt("middle",!1,0,parseInt((e.y-t.y)/2+t.y,10),this.s.yAxis.title,i); +s&&(s.style.left=(webix.env.transform?(s.offsetHeight-s.offsetWidth)/2:0)+"px")},Fo:function(t,e){var i=Math.floor(this.Do(t)),s=Math.ceil(this.Do(e));return{start:i,step:1,end:s}},Ao:function(t,e){if(this.Bo=!1,"logarithmic"==this.s.scale){var i=Math.floor(this.Do(t)),s=Math.ceil(this.Do(e));if(t>0&&e>0&&s-i>1)return this.Bo=!0,this.Fo(t,e) +}"auto"!=this.s.origin&&this.s.origin5?10:5,n=parseInt(l,10)*o,n>Math.abs(t))r=0>t?-n:0;else{var c=Math.abs(t),u=Math.floor(this.Do(c)),d=c/Math.pow(10,u);for(r=Math.ceil(10*d)/10*Math.pow(10,u)-n,c>1&&n>.1&&(r=Math.ceil(r));0>t?t>=r:r>=t;)r-=n; +0>t&&(r=-r-2*n)}for(a=r;e>a;)a+=n,a=parseFloat((1*a).toFixed(Math.abs(h)));return{start:r,end:a,step:n,fixNum:0>h?Math.abs(h):0}},Go:function(t,e){var i,s,n=this.data.Df(),r=arguments.length&&"h"==t?this.so:this.to;if(e=e||"value",r&&"undefined"!=typeof r.end&&"undefined"!=typeof r.start&&r.step)i=parseFloat(r.end),s=parseFloat(r.start); +else if(i=webix.GroupMethods.max(this.go[0][e],n),s=r&&"undefined"!=typeof r.start?parseFloat(r.start):webix.GroupMethods.min(this.go[0][e],n),this.go.length>1)for(var a=1;ai&&(i=h),s>o&&(s=o) +}return{max:i,min:s}},Do:function(t){var e="log";return Math[e](t)/Math.LN10},xo:function(t,e,i,s,n){if(this.s.xAxis){var r=this.canvases.x.renderTextAt(n,s,t,e-(n?2:0),this.s.xAxis.template(i));r&&(r.className+=" webix_axis_item_x")}},yo:function(t,e,i,s,n){this.s.xAxis&&this.s.xAxis.lines&&this.zo(t,e,i,e,s,this.s.xAxis.lineColor.call(this,n),1) +},zo:function(t,e,i,s,n,r,a){t.strokeStyle=r,t.lineWidth=a,t.beginPath(),t.moveTo(e,i),t.lineTo(s,n),t.stroke(),t.lineWidth=1},Ho:function(t,e){var i,s=1;return i=e!=t?e-t:t,[i,s]},qo:[function(t){return"#FF"+webix.color.toHex(t/2,2)+"00"},function(t){return"#FF"+webix.color.toHex(t/2+128,2)+"00"},function(t){return"#"+webix.color.toHex(255-t,2)+"FF00" +},function(t){return"#00FF"+webix.color.toHex(t,2)},function(t){return"#00"+webix.color.toHex(255-t,2)+"FF"},function(t){return"#"+webix.color.toHex(t,2)+"00FF"}],addSeries:function(t){var e=webix.extend({},this.s);this.s=webix.extend({},e),this.e(t,{}),this.go.push(this.s),this.s=e},jo:function(t,e,i){var s; +if(i.getAttribute("userdata")&&(this.Io=i.getAttribute("userdata"),this.go[this.Io])){for(var n=0;nh&&("x"==s.layout&&"center"==s.align&&(f=(e-h)/2),"right"==s.align&&(f=e-h),s.margin&&"center"!=s.align&&(f+=("left"==s.align?1:-1)*s.margin)),r2&&r.setAttribute("series_id",i),t.appendChild(r),r +},Ko:function(t,e,i,s,n,r,a){var h=[],o=this.s.legend.marker,l=this.s.legend.values,c=l&&l[a].markerType?l[a].markerType:o.type;if(s&&(t.strokeStyle=t.fillStyle=s),"round"!=c&&o.radius)if("item"==c){if(this.s.line&&"scatter"!=this.s.type&&!this.s.disableLines){t.beginPath(),t.lineWidth=this.go[a].line.width,t.strokeStyle=r?s:this.go[a].line.color.call(this,{}); +var u=e+5,d=i+n/2;t.moveTo(u,d);var f=u+o.width;t.lineTo(f,d),t.stroke()}var b=this.go[a].item,x=parseInt(b.radius.call(this,{}),10)||0;x&&(t.beginPath(),r?(t.lineWidth=b.borderWidth,t.strokeStyle=s,t.fillStyle=s):(t.lineWidth=b.borderWidth,t.fillStyle=b.color.call(this,{}),t.strokeStyle=b.borderColor.call(this,{}),t.globalAlpha=b.alpha.call(this,{})),t.beginPath(),e+=o.width/2+5,i+=n/2,this.Lo(t,e,i,x+1,b.type),t.fill(),t.stroke()),t.globalAlpha=1 +}else t.beginPath(),t.lineWidth=1,e+=5,i+=n/2-o.height/2,h=[[e+o.radius,i+o.radius,o.radius,Math.PI,3*Math.PI/2,!1],[e+o.width-o.radius,i],[e+o.width-o.radius,i+o.radius,o.radius,-Math.PI/2,0,!1],[e+o.width,i+o.height-o.radius],[e+o.width-o.radius,i+o.height-o.radius,o.radius,0,Math.PI/2,!1],[e+o.radius,i+o.height],[e+o.radius,i+o.height-o.radius,o.radius,Math.PI/2,Math.PI,!1],[e,i+o.radius]],this.Mo(t,h),t.stroke(),t.fill(); +else{t.beginPath(),t.lineWidth=o.height,t.lineCap=o.type,e+=t.lineWidth/2+5,i+=n/2,t.moveTo(e,i);var f=e+o.width-o.height+1;t.lineTo(f,i),t.stroke(),t.fill()}},no:function(t,e){var i,s,n,r;if(i=this.s.padding.left,s=this.s.padding.top,n=t-this.s.padding.right,r=e-this.s.padding.bottom,this.s.legend){var a=this.s.legend,h=this.s.legend.width,o=this.s.legend.height; +"x"==a.layout?"center"==a.valign?"right"==a.align?n-=h:"left"==a.align&&(i+=h):"bottom"==a.valign?r-=o:s+=o:"right"==a.align?n-=h:"left"==a.align&&(i+=h)}return{start:{x:i,y:s},end:{x:n,y:r}}},No:function(t){var e,i,s,n,r;if(this.s.yAxis&&"undefined"!=typeof this.s.yAxis.end&&"undefined"!=typeof this.s.yAxis.start&&this.s.yAxis.step)s=parseFloat(this.s.yAxis.end),n=parseFloat(this.s.yAxis.start); +else{for(e=0;es&&(s=t[e].$sum),t[e].$min0&&(n=0)}return{max:s,min:n}},Oo:function(t,e,i,s,n,r,a,h){var o,l,c,u,d,f;return"light"==r?(o="x"==h?t.createLinearGradient(e,i,s,i):t.createLinearGradient(e,i,e,n),f=[[0,"#FFFFFF"],[.9,a],[1,a]],l=2):"falling"==r||"rising"==r?(o="x"==h?t.createLinearGradient(e,i,s,i):t.createLinearGradient(e,i,e,n),c=webix.color.toRgb(a),u=webix.color.rgbToHsv(c[0],c[1],c[2]),u[1]*=.5,d="rgb("+webix.color.hsvToRgb(u[0],u[1],u[2])+")","falling"==r?f=[[0,d],[.7,a],[1,a]]:"rising"==r&&(f=[[0,a],[.3,a],[1,d]]),l=0):(t.globalAlpha=.37,l=0,o="x"==h?t.createLinearGradient(e,n,e,i):t.createLinearGradient(e,i,s,i),f=[[0,"#9d9d9d"],[.3,"#e8e8e8"],[.45,"#ffffff"],[.55,"#ffffff"],[.7,"#e8e8e8"],[1,"#9d9d9d"]]),this.Po(o,f),{gradient:o,offset:l} +},Qo:function(t,e,i,s){return t*=-1,e+=Math.cos(t)*s,i-=Math.sin(t)*s,{x:e,y:i}},Po:function(t,e){for(var i=0;i2&&(s="arc"),t[s].apply(t,e[i])},Ro:function(t,e,i,s,n){t.addRect(e,[i[0].x-s.x,i[0].y-s.y,i[1].x-s.x,i[1].y-s.y],n) +}},webix.Group,webix.AutoTooltip,webix.DataLoader,webix.MouseEvents,webix.EventSystem,webix.ui.view),webix.extend(webix.ui.chart,{$render_pie:function(t,e,i,s,n,r){this.So(t,e,i,s,1,r,n)},So:function(t,e,i,s,n,r,a){if(e.length){var h=this.To(i,s),o=this.s.radius?this.s.radius:h.radius;if(!(0>o)){var l=this.Uo(e),c=this.Vo(l),u=this.Wo(l,c),d=this.s.x?this.s.x:h.x,f=this.s.y?this.s.y:h.y; +1==n&&this.s.shadow&&this.Xo(t,d,f,o),f/=n;var b=-Math.PI/2,x=[];if(t.scale(1,n),this.s.gradient){var p=1!=n?d+o/3:d,v=1!=n?f+o/3:f;this.Yo(t,d,f,o,p,v)}for(var w=0;w=s&&n>=0||s>=0&&n<=Math.PI||Math.abs(s-Math.PI)>.003&&s<=Math.PI&&n>=Math.PI){0>=s&&n>=0&&(s=0,a=!1,this._o(t,e,i,r,s,n)),s<=Math.PI&&n>=Math.PI&&(n=Math.PI,a=!1,this._o(t,e,i,r,s,n));var h=(this.s.pieHeight||Math.floor(r/4))/this.s.cant;t.beginPath(),t.arc(e,i,r,s,n,!1),t.lineTo(e+r*Math.cos(n),i+r*Math.sin(n)+h),t.arc(e,i+h,r,n,s,!0),t.lineTo(e+r*Math.cos(s),i+r*Math.sin(s)),t.fill(),a&&t.stroke() +}},_o:function(t,e,i,s,n,r){t.beginPath(),t.arc(e,i,s,n,r,!1),t.stroke()},Xo:function(t,e,i,s){t.globalAlpha=.5;for(var n=["#c4c4c4","#c6c6c6","#cacaca","#dcdcdc","#dddddd","#e0e0e0","#eeeeee","#f5f5f5","#f8f8f8"],r=n.length-1;r>-1;r--)t.beginPath(),t.fillStyle=n[r],t.arc(e+1,i+1,s+r,0,2*Math.PI,!0),t.fill(); +t.globalAlpha=1},ap:function(t){return t.addColorStop(0,"#ffffff"),t.addColorStop(.7,"#7a7a7a"),t.addColorStop(1,"#000000"),t},Yo:function(t,e,i,s,n,r){t.beginPath();var a;"function"!=typeof this.s.gradient?(a=t.createRadialGradient(n,r,s/4,e,i,s),a=this.ap(a)):a=this.s.gradient(a),t.fillStyle=a,t.arc(e,i,s,0,2*Math.PI,!0),t.fill(),t.globalAlpha=.7 +},Zo:function(t,e,i,s,n,r,a,h){var o=this.canvases[0].renderText(0,0,a,0,1);if(o){var l=o.scrollWidth;o.style.width=l+"px",l>t&&(l=t);var c=.2>n-s?4:8;h&&(c=l/1.8);var u=s+(n-s)/2;i-=(c-8)/2;var d=-c,f=-8,b="right";(u>=Math.PI/2&&u=Math.PI)&&(d=-l-d+1,b="left");var x=0;!h&&1>r&&u>0&&u=Math.PI/2&&u=Math.PI)&&(v+=l/3):v=Math.min(v,t-l),o.style.top=p+"px",o.style.left=v+"px",o.style.width=l+"px",o.style.textAlign=b,o.style.whiteSpace="nowrap" +}},$render_pie3D:function(t,e,i,s,n,r){this.So(t,e,i,s,this.s.cant,r)},$render_donut:function(t,e,i,s,n,r){if(e.length){this.So(t,e,i,s,1,r,n);var a=this.s,h=this.To(i,s),o=a.radius?a.radius:h.radius,l=a.innerRadius&&a.innerRadiusu&&this.wo(t,e,i,s,h,s.y-p*(this.s.origin-u)),a=parseInt(this.s.barWidth,10); +var m=0,y=0;for(o=0;oh&&(a=parseInt(h/m-4,10));var _=(h-a*m)/2,$="undefined"!=typeof this.s.radius?parseInt(this.s.radius,10):Math.round(a/5),k=!1,I=this.s.gradient;for(I&&"function"!=typeof I?(k=I,I=!1):I&&(I=t.createLinearGradient(0,s.y,0,i.y),this.s.gradient(I)),v||this.zo(t,i.x,s.y+.5,s.x,s.y+.5,"#000000",1),o=0;oc&&(S=c),S-=u,S*=f;var C=i.x+_+o*h+(a+1)*y,E=s.y;if(0>S||this.s.yAxis&&0===S&&!("auto"!=this.s.origin&&this.s.origin>u))this.canvases[n].renderTextAt(!0,!0,C+Math.floor(a/2),E,this.s.label(e[o]));else{w||"auto"!=this.s.origin&&v||(S+=x/p);var M=I||this.s.color.call(this,e[o]); +t.globalAlpha=this.s.alpha.call(this,e[o]);var j=this.bp(t,i,C,E,a,u,$,p,S,M,I,k);k&&this.cp(t,C,E,a,u,$,p,S,M,k),this.s.border&&this.dp(t,C,E,a,u,$,p,S,M),t.globalAlpha=1,j[0]!=C?this.canvases[n].renderTextAt(!1,!0,C+Math.floor(a/2),j[1],this.s.label(e[o])):this.canvases[n].renderTextAt(!0,!0,C+Math.floor(a/2),j[3],this.s.label(e[o])),r.addRect(e[o].id,[C-i.x,j[3]-i.y,j[2]-i.x,j[1]-i.y],n) +}}}},ep:function(t,e,i,s,n,r,a){var h=this.s.xAxis,o=i;return h&&"auto"!=this.s.origin&&this.s.origin>a&&(i-=(this.s.origin-a)*n,o=i,s-=this.s.origin-a,0>s&&(s*=-1,t.translate(e+r,i),t.rotate(Math.PI),e=0,i=0),i-=.5),{value:s,x0:e,y0:i,start:o}},bp:function(t,e,i,s,n,r,a,h,o,l,c,u){t.save(),t.fillStyle=l; +var d=this.ep(t,i,s,o,h,n,r),f=this.fp(t,d.x0,d.y0,n,a,h,d.value,this.s.border?1:0);c&&!u&&t.lineTo(d.x0+(this.s.border?1:0),e.y),t.fill(),t.restore();var b=d.x0,x=d.x0!=i?i+f[0]:f[0],p=d.x0!=i?d.start-f[1]-d.y0:d.y0,v=d.x0!=i?d.start-d.y0:f[1];return[b,p,x,v]},gp:function(t,e){var i,s;s=webix.color.toRgb(e),i=webix.color.rgbToHsv(s[0],s[1],s[2]),i[2]/=1.4,e="rgb("+webix.color.hsvToRgb(i[0],i[1],i[2])+")",t.strokeStyle=e,1==t.globalAlpha&&(t.globalAlpha=.9) +},dp:function(t,e,i,s,n,r,a,h,o){var l;t.save(),l=this.ep(t,e,i,h,a,s,n),this.gp(t,o),this.fp(t,l.x0,l.y0,s,r,a,l.value,t.lineWidth/2,1),t.stroke(),t.restore()},cp:function(t,e,i,s,n,r,a,h,o,l){t.save();var c=this.ep(t,e,i,h,a,s,n),u=this.Oo(t,c.x0,c.y0,c.x0+s,c.y0-a*c.value+2,l,o,"y"),d=this.s.border?1:0; +t.fillStyle=u.gradient,this.fp(t,c.x0+u.offset,c.y0,s-2*u.offset,r,a,c.value,u.offset+d),t.fill(),t.restore()},fp:function(t,e,i,s,n,r,a,h,o){t.beginPath();var l=0;if(n>r*a){var c=(n-r*a)/n;1>=c&&c>=-1&&(l=-Math.acos(c)+Math.PI/2)}t.moveTo(e+h,i);var u=i-Math.floor(r*a)+n+(n?0:h);r*a>n&&t.lineTo(e+h,u); +var d=e+n;n&&n>0&&t.arc(d,u,n-h,-Math.PI+l,-Math.PI/2,!1);var f=e+s-n-h,b=u-n+(n?h:0);t.lineTo(f,b),n&&n>0&&t.arc(f+h,u,n-h,-Math.PI/2,0-l,!1);var x=e+s-h;return t.lineTo(x,i),o||t.lineTo(e+h,i),[x,b]}}),webix.extend(webix.ui.chart,{$render_line:function(t,e,i,s,n,r){var a,h,o,l,c,u,d,f,b,x,p,v;if(l=this.hp(t,e,i,s,n),a=this.s,e.length){for(c=a.offset?i.x+.5*l.cellWidth:i.x,o=[],h=0;h=0;u--)t.globalAlpha=c[u],t.strokeStyle="#d0d0d0",t.beginPath(),this.Lo(t,e,i+2*o/3,o+u+1,h.type),t.stroke(); +t.beginPath(),t.globalAlpha=.3,t.fillStyle="#bdbdbd",this.Lo(t,e,i+2*o/3,o+1,h.type),t.fill()}t.restore(),t.lineWidth=h.borderWidth,t.fillStyle=h.color.call(this,s),t.strokeStyle=h.borderColor.call(this,s),t.globalAlpha=h.alpha.call(this,s),t.beginPath(),this.Lo(t,e,i,o+1,h.type),t.fill(),t.stroke(),t.globalAlpha=1 +}if(n&&this.canvases[r].renderTextAt(!1,!0,e,i-o-this.s.labelOffset,this.s.label.call(this,s)),a){var d=this.s.eventRadius||o+1;a.addRect(s.id,[e-d-l.x,i-d-l.y,e+d-l.x,i+d-l.y],r)}},Lo:function(t,e,i,s,n){var r=[];if(!n||"square"!=n&&"s"!=n)if(!n||"diamond"!=n&&"d"!=n)r=!n||"triangle"!=n&&"t"!=n?[[e,i,s,0,2*Math.PI,!0]]:[[e,i-s],[e+Math.sqrt(3)*s/2,i+s/2],[e-Math.sqrt(3)*s/2,i+s/2],[e,i-s]]; +else{var a=t.lineWidth>1?t.lineWidth*Math.sqrt(2)/4:0;r=[[e,i-s],[e+s,i],[e,i+s],[e-s,i],[e+a,i-s-a]]}else s*=Math.sqrt(2)/2,r=[[e-s-t.lineWidth/2,i-s],[e+s,i-s],[e+s,i+s],[e-s,i+s],[e-s,i-s]];this.Mo(t,r)},ip:function(t,e,i,s){var n=s.minValue,r=s.maxValue,a=s.unit,h=s.valueFactor,o=this.s.value(t); +this.Bo&&(o=this.Do(o));var l=(parseFloat(o||0)-n)*h;this.s.yAxis||(l+=s.startValue/a);var c=i.y-a*l;return!this.s.fixOverflow||"line"!=this.s.type&&"area"!=this.s.type?(o>r&&(c=e.y),(0>l||n>o)&&(c=i.y)):o>r?c={y:e.y,y0:c,out:"max"}:(0>l||n>o)&&(c={y:i.y,y0:c,out:"min"}),c},hp:function(t,e,i,s,n){var r,a={}; +a.totalHeight=s.y-i.y,a.cellWidth=(s.x-i.x)/(this.s.offset?e.length:e.length-1);var h=!!this.s.yAxis,o=-1!=this.s.type.indexOf("stacked")?this.No(e):this.Go();a.maxValue=o.max,a.minValue=o.min,n||this.uo(e,i,s,a.minValue,a.maxValue,a.cellWidth),h&&(a.maxValue=parseFloat(this.s.yAxis.end),a.minValue=parseFloat(this.s.yAxis.start)); +var l=this.Ho(a.minValue,a.maxValue);return r=l[0],a.valueFactor=l[1],a.unit=r?a.totalHeight/r:10,a.startValue=0,h||(a.startValue=10,a.unit!=a.totalHeight&&(a.unit=r?(a.totalHeight-a.startValue)/r:10)),a}}),webix.extend(webix.ui.chart,{$render_barH:function(t,e,i,s,n,r){var a,h,o,l,c,u,d,f,b,x,p,v,w,g,m,y,_,$,k,I,S; +for(o=(s.y-i.y)/e.length,d=this.Go("h"),f=d.max,b=d.min,y=s.x-i.x,S=!!this.s.yAxis,n||this.mp(t,e,i,s,b,f,o),S&&(f=parseFloat(this.s.xAxis.end),b=parseFloat(this.s.xAxis.start)),g=this.Ho(b,f),v=g[0],p=g[1],$=v?y/v:10,S||(m=10,$=v?(y-m)/v:10),h=parseInt(this.s.barWidth,10),h*this.go.length+4>o&&(h=o/this.go.length-4),a=Math.floor((o-h*this.go.length)/2),w="undefined"!=typeof this.s.radius?parseInt(this.s.radius,10):Math.round(h/5),x=!1,c=this.s.gradient,c&&"function"!=typeof c?(x=c,c=!1):c&&(c=t.createLinearGradient(i.x,i.y,s.x,i.y),this.s.gradient(c)),S||this.zo(t,i.x-.5,i.y,i.x-.5,s.y,"#000000",1),u=0;uf&&(_=f),_-=b,_*=p,k=i.x,I=i.y+a+u*o+(h+1)*n,0>_&&"auto"==this.s.origin||this.s.xAxis&&0===_&&!("auto"!=this.s.origin&&this.s.origin>b))this.canvases[n].renderTextAt("middle","right",k+10,I+h/2+a,this.s.label(e[u])); +else{0>_&&"auto"!=this.s.origin&&this.s.origin>b&&(_=0),S||(_+=m/$),l=c||this.s.color.call(this,e[u]),this.s.border&&this.np(t,k,I,h,b,w,$,_,l),t.globalAlpha=this.s.alpha.call(this,e[u]);var C=this.op(t,s,k,I,h,b,w,$,_,l,c,x);x&&this.pp(t,k,I,h,b,w,$,_,l,x),t.globalAlpha=1,C[3]==I?(this.canvases[n].renderTextAt("middle","left",C[0]-5,C[3]+Math.floor(h/2),this.s.label(e[u])),r.addRect(e[u].id,[C[0]-i.x,C[3]-i.y,C[2]-i.x,C[3]+h-i.y],n)):(this.canvases[n].renderTextAt("middle",!1,C[2]+5,C[1]+Math.floor(h/2),this.s.label(e[u])),r.addRect(e[u].id,[C[0]-i.x,I-i.y,C[2]-i.x,C[3]-i.y],n)) +}},qp:function(t,e,i,s,n,r,a,h,o){var l=0;if(n>r*a){var c=(n-r*a)/n;l=-Math.asin(c)+Math.PI/2}t.moveTo(e,i+h);var u=e+r*a-n-(n?0:h);r*a>n&&t.lineTo(u,i+h);var d=i+n;n&&n>0&&t.arc(u,d,n-h,-Math.PI/2+l,0,!1);var f=i+s-n-(n?0:h),b=u+n-(n?h:0);t.lineTo(b,f),n&&n>0&&t.arc(u,f,n-h,0,Math.PI/2-l,!1);var x=i+s-h; +return t.lineTo(e,x),o||t.lineTo(e,i+h),[b,x]},mp:function(t,e,i,s,n,r,a){var h=0;this.s.xAxis&&(this.canvases.x||(this.canvases.x=this.lo("axis_x")),h=this.rp(this.canvases.x.getCanvas(),e,i,s,n,r)),this.s.yAxis&&(this.canvases.y||(this.canvases.y=this.lo("axis_y")),this.sp(this.canvases.y.getCanvas(),e,i,s,a,h)) +},sp:function(t,e,i,s,n,r){if(this.s.yAxis){var a,h=parseInt(r?r:i.x,10)-.5,o=s.y+.5,l=i.y;this.zo(t,h,o,h,l,this.s.yAxis.color,1);for(var c=0;c=x;x+=a){var p=this.Bo?Math.pow(10,x):x; +h.fixNum&&(p=parseFloat(p).toFixed(h.fixNum));var v=Math.floor(c+b*f)+.5;if(x==n&&"auto"==this.s.origin||!o.lines.call(this,x)||this.zo(t,v,l,v,i.y,this.s.xAxis.lineColor.call(this,x),1),x==this.s.origin&&(d=v+1),1>a&&!this.Bo){var w=Math.min(Math.floor(this.Do(a)),0>=n?0:Math.floor(this.Do(n))),g=Math.pow(10,-w); +p=Math.round(p*g)/g,x=p}this.canvases.x.renderTextAt(!1,!0,v,l+2,o.template(p.toString()),"webix_axis_item_x"),b++}return this.canvases.x.renderTextAt(!0,!1,c,s.y+this.s.padding.bottom-3,this.s.xAxis.title,"webix_axis_title_x",s.x-i.x),o.lines.call(this,{})||this.zo(t,c,i.y-.5,u,i.y-.5,this.s.xAxis.color,.2),d +}}},tp:function(t,e,i,s,n,r,a){var h=this.s.yAxis,o=e;return h&&"auto"!=this.s.origin&&this.s.origin>a&&(e+=(this.s.origin-a)*n,o=e,s-=this.s.origin-a,0>s&&(s*=-1,t.translate(e,i+r),t.rotate(Math.PI),e=.5,i=0),e+=.5),{value:s,x0:e,y0:i,start:o}},op:function(t,e,i,s,n,r,a,h,o,l,c,u){t.save();var d=this.tp(t,i,s,o,h,n,r); +t.fillStyle=l,t.beginPath();var f=this.qp(t,d.x0,d.y0,n,a,h,d.value,this.s.border?1:0);c&&!u&&t.lineTo(e.x,d.y0+(this.s.border?1:0)),t.fill(),t.restore();var b=d.y0,x=d.y0!=s?s:f[1],p=d.y0!=s?d.start-f[0]:d.start,v=d.y0!=s?d.start:f[0];return[p,b,v,x]},np:function(t,e,i,s,n,r,a,h,o){t.save();var l=this.tp(t,e,i,h,a,s,n); +t.beginPath(),this.gp(t,o),t.globalAlpha=.9,this.qp(t,l.x0,l.y0,s,r,a,l.value,t.lineWidth/2,1),t.stroke(),t.restore()},pp:function(t,e,i,s,n,r,a,h,o,l){t.save();var c=this.tp(t,e,i,h,a,s,n),u=this.Oo(t,c.x0,c.y0+s,c.x0+a*c.value,c.y0,l,o,"x");t.fillStyle=u.gradient,t.beginPath(),this.qp(t,c.x0,c.y0+u.offset,s-2*u.offset,r,a,c.value,u.offset),t.fill(),t.globalAlpha=1,t.restore() +}}),webix.extend(webix.ui.chart,{$render_stackedBar:function(t,e,i,s,n,r){var a,h,o,l,c=s.y-i.y,u=!!this.s.yAxis,d=!!this.s.xAxis,f=this.No(e);a=f.max,h=f.min;var b=Math.floor((s.x-i.x)/e.length);n||this.uo(e,i,s,h,a,b),u&&(a=parseFloat(this.s.yAxis.end),h=parseFloat(this.s.yAxis.start));var x=this.Ho(h,a); +l=x[0],o=x[1];var p=l?c/l:10,v=parseInt(this.s.barWidth,10);v+4>b&&(v=b-4);var w=Math.floor((b-v)/2),g=this.s.gradient?this.s.gradient:!1;d||this.zo(t,i.x,s.y+.5,s.x,s.y+.5,"#000000",1);for(var m=0;my||this.s.yAxis&&0===y)this.canvases.y.renderTextAt(!0,!0,_+Math.floor(v/2),$,this.s.label(e[m]));else{var k=this.s.color.call(this,e[m]);t.globalAlpha=this.s.alpha.call(this,e[m]),t.fillStyle=this.s.color.call(this,e[m]),t.beginPath();var I=this.up(t,_-(this.s.border?.5:0),$,v+(this.s.border?.5:0),p,y,0,i.y); +if(t.fill(),g){t.save();var S=this.Oo(t,_,$,_+v,I[1],g,k,"y");t.fillStyle=S.gradient,t.beginPath(),I=this.up(t,_+S.offset,$,v-2*S.offset,p,y,this.s.border?1:0,i.y),t.fill(),t.restore()}this.s.border&&(t.save(),this.gp(t,k),t.beginPath(),this.up(t,_-.5,$,v+1,p,y,0,i.y,1),t.stroke(),t.restore()),t.globalAlpha=1,this.canvases[n].renderTextAt(!1,!0,_+Math.floor(v/2),I[1]+($-I[1])/2-7,this.s.label(e[m])),r.addRect(e[m].id,[_-i.x,I[1]-i.y,I[0]-i.x,(e[m].$startY||$)-i.y],n),e[m].$startY=this.s.border?I[1]+1:I[1] +}}else n&&e[m].$startY||(e[m].$startY=s.y)}},up:function(t,e,i,s,n,r,a,h,o){t.moveTo(e,i);var l=i-n*r+a;h>l&&(l=h),t.lineTo(e,l);var c=e+s,u=l;t.lineTo(c,u);var d=e+s;return t.lineTo(d,i),o||t.lineTo(e,i),[d,u-2*a]}}),webix.extend(webix.ui.chart,{$render_stackedBarH:function(t,e,i,s,n,r){var a,h,o,l,c=s.x-i.x,u=!!this.s.yAxis,d=this.No(e); +a=d.max,h=d.min;var f=Math.floor((s.y-i.y)/e.length);n||this.mp(t,e,i,s,h,a,f),u&&(a=parseFloat(this.s.xAxis.end),h=parseFloat(this.s.xAxis.start));var b=this.Ho(h,a);l=b[0],o=b[1];var x=l?c/l:10,p=0;u||(p=10,x=l?(c-p)/l:10);var v=parseInt(this.s.barWidth,10);v+4>f&&(v=f-4);var w=(f-v)/2,g=0,m=!1,y=this.s.gradient; +y&&(m=!0),u||this.zo(t,i.x-.5,i.y,i.x-.5,s.y,"#000000",1);var _=0,$=0;for(k=0;ka&&(I=a),I-=h,I*=o;var S=i.x,C=i.y+w+k*f;if($?S=e[k].$startX:e[k].$startX=S,0>I||this.s.yAxis&&0===I)this.canvases.y.renderTextAt("middle",!0,S+10,C+v/2,this.s.label(e[k])); +else{u||(I+=p/x);var E=this.s.color.call(this,e[k]);t.globalAlpha=this.s.alpha.call(this,e[k]),t.fillStyle=this.s.color.call(this,e[k]),t.beginPath();var M=this.qp(t,S,C,v,g,x,I,this.s.border?1:0);if(y&&!m&&t.lineTo(i.x+c,C+(this.s.border?1:0)),t.fill(),m){var j=this.Oo(t,S,C+v,S,C,m,E,"x");t.fillStyle=j.gradient,t.beginPath(),M=this.qp(t,S,C,v,g,x,I,0),t.fill() +}this.s.border&&this.np(t,S,C,v,h,g,x,I,E),t.globalAlpha=1,this.canvases[n].renderTextAt("middle",!0,e[k].$startX+(M[0]-e[k].$startX)/2-1,C+(M[1]-C)/2,this.s.label(e[k])),r.addRect(e[k].id,[e[k].$startX-i.x,C-i.y,M[0]-i.x,M[1]-i.y],n),e[k].$startX=M[0]}}}}),webix.extend(webix.ui.chart,{$render_spline:function(t,e,i,s,n,r){var a,h,o,l,c,u,d,f,b,x,p,v,w; +if(c=this.hp(t,e,i,s,n),a=this.s,this.kp=i,o=[],e.length){for(f=a.offset?i.x+.5*c.cellWidth:i.x,h=0;hl;l++){var g=this.wp(l,b,h,u.a,u.b,u.c,u.d); +gs.y&&(g=s.y);var m=this.wp(l+1,b,h,u.a,u.b,u.c,u.d);ms.y&&(m=s.y),this.zo(t,l,g,l+1,m,a.line.color(e[h]),a.line.width)}this.zo(t,x-1,this.wp(l,b,h,u.a,u.b,u.c,u.d),x,w,a.line.color(e[h]),a.line.width)}this.lp(t,b,v,e[o[h].index],a.label(e[o[h].index]),n,r)}}},vp:function(t){var e,i,s,n,r,a,h,o,l=[],c=[],u=t.length; +for(r=0;u-1>r;r++)l[r]=t[r+1].x-t[r].x,c[r]=(t[r+1].y-t[r].y)/l[r];for(h=[],o=[],h[0]=0,h[1]=2*(l[0]+l[1]),o[0]=0,o[1]=6*(c[1]-c[0]),r=2;u-1>r;r++)h[r]=2*(l[r-1]+l[r])-l[r-1]*l[r-1]/h[r-1],o[r]=6*(c[r]-c[r-1])-l[r-1]*o[r-1]/h[r-1];for(a=[],a[u-1]=a[0]=0,r=u-2;r>=1;r--)a[r]=(o[r]-l[r]*a[r+1])/h[r];for(e=[],i=[],s=[],n=[],r=0;u-1>r;r++)e[r]=t[r].y,i[r]=-l[r]*a[r+1]/6-l[r]*a[r]/3+(t[r+1].y-t[r].y)/l[r],s[r]=a[r]/2,n[r]=(a[r+1]-a[r])/(6*l[r]); +return{a:e,b:i,c:s,d:n}},wp:function(t,e,i,s,n,r,a){return s[i]+(t-e)*(n[i]+(t-e)*(r[i]+(t-e)*a[i]))}}),webix.extend(webix.ui.chart,{$render_area:function(t,e,i,s,n,r){var a,h,o,l,c,u,d,f,b,x,p,v,w,g,m;if(u=this.hp(t,e,i,s,n),h=this.s,l=h.eventRadius||Math.floor(u.cellWidth/2),e.length){for(d=[],x=h.offset?i.x+.5*u.cellWidth:i.x,o=0;o0;c--)v-=x.cellWidth,w=e[c].$startY,w&&p.push([v,w]);for(p.push([p[0][0],p[0][1]]),t.globalAlpha=this.s.alpha.call(this,e[0]),t.fillStyle=this.s.color.call(this,e[0]),t.beginPath(),this.Mo(t,p),t.fill(),c=0;c2&&this.Bp(t,p,r),(!c.disableItems||r.length<3)&&this.Cp(t,p,r,a,h),p=null},Cp:function(t,e,i,s,n){for(var r=0;rl&&(p=Math.min(this.Do(l),0>=h?0:this.Do(h)),v=Math.pow(10,-p));var y=[];this.canvases.scale||(this.canvases.scale=this.lo("radar_scale"));var _=this.canvases.scale.getCanvas();for(f=o;f>=h;f-=l){var $=this.Bo?Math.pow(10,f):f;c.fixNum&&($=parseFloat(f).toFixed(c.fixNum)),w.push(Math.floor(g*m)+.5),v&&!this.Bo&&($=Math.round($*v)/v,f=$); +var k=i-s+w[w.length-1];if(this.canvases.scale.renderTextAt("middle","left",e,k,r.template($.toString()),"webix_axis_item_y webix_radar"),t.length<2)return void this.Dp(_,"arc",e,i,s-w[w.length-1],-Math.PI/2,3*Math.PI/2,f);var I,S=-Math.PI/2,C=S;for(b=0;b2?u.lineShape||"line":"arc",e,i,s-w[w.length-1],C,I,f,b,n[f]),C=I; +g++}for(f=0;fn)return!1;l=this.Qo(r,i,s,n),c=this.Qo(a,i,s,n);var u=this.s.yAxis; +u.bg&&(t.beginPath(),t.moveTo(i,s),"arc"==e?t.arc(i,s,n,r,a,!1):(t.lineTo(l.x,l.y),t.lineTo(c.x,c.y)),t.fillStyle=u.bg(h,o),t.moveTo(i,s),t.fill(),t.closePath()),u.lines.call(this,h)&&(t.lineWidth=1,t.beginPath(),"arc"==e?t.arc(i,s,n,r,a,!1):(t.moveTo(l.x,l.y),t.lineTo(c.x,c.y)),t.strokeStyle=u.lineColor.call(this,h),t.stroke()) +},Ep:function(t,e,i,s,n,r){var a=this.canvases.scale.renderText(0,0,r,"webix_axis_radar_title",1),h=a.scrollWidth,o=a.offsetHeight,l=.001,c=this.Qo(n,e,i,s+5),u=0,d=0;(0>n||n>Math.PI)&&(d=-o),n>Math.PI/2&&(u=-h),Math.abs(n+Math.PI/2)o&&(c=i[r.toLowerCase()]),a>s.max&&(c=e[r.toLowerCase()]),ao;o++)n[o]=Math.ceil(r/(h-o)),r-=n[o];for(var l=e.Sp,c=0;l>c;c++)s[c]=Math.ceil(a/(l-c)),a-=s[c];return[n,s]},icons_setter:function(t){this.ax=t?"object"==typeof t?t:this.Sx:null +},ax:[],Sx:[{template:function(){return""+webix.i18n.calendar.today+""},on_click:{webix_cal_icon_today:function(){this.setValue(new Date),this.callEvent("onTodaySet",[this.getSelectedDate()])}}},{template:function(){return""+webix.i18n.calendar.clear+"" +},on_click:{webix_cal_icon_clear:function(){this.setValue(""),this.callEvent("onDateClear",[this.getSelectedDate()])}}}],refresh:function(){this.render()},render:function(){this.Np=0,this.Up=!1;var t=this.s;if(this.isVisible(t.id)){this.Vp=webix.Date.datePart(new Date),this.callEvent("onBeforeRender",[]); +var e=this.s.date,i=this.Op(e,!0),s=this.Tp(e),n=s[0],r=s[1],a="
"+t.calendarHeader(e)+"";if(t.navigation&&(a+="
"),a+="
",t.weekHeader&&(a+="
"+this.Wp(n)+"
"),a+="
"+this.Xp(n,r,i)+"
",(this.s.timepicker||this.ax)&&(a+=""),this.w.innerHTML=a,"time"==this.s.type){var h=this.s.date; +h&&("string"==typeof h?e=webix.i18n.parseTimeFormatDate(h):webix.isArray(h)&&(e.setHours(h[0]),e.setMinutes(h[1]))),this.yt(-1,e)}this.callEvent("onAfterRender",[])}},bx:function(t){for(var e="
",i=this.ax,s=0;s "+e(t)+"
"},Wp:function(t){var e=this.s,i="",s=0; +e.weekNumber&&(s=1,i+="
"+e.calendarWeekHeader()+"
");for(var n=webix.Date.startOnMonday?1:0,r=0;7>r;r++){var a=(n+r)%7,h=webix.i18n.calendar.dayShort[a];i+="
"+h+"
"}return i},blockDates_setter:function(t){return webix.toFunctor(t,this.$scope) +},Zp:function(t,e){var i="webix_cal_day";return webix.Date.equal(t,this.Vp)&&(i+=" webix_cal_today"),webix.Date.equal(t,this.Lp)&&(i+=" webix_cal_select"),t.getMonth()!=e.Qp&&(i+=" webix_cal_outside"),(this.s.blockDates&&this.s.blockDates.call(this,t)||tthis.s.maxDate)&&(i+=" webix_cal_day_disabled"),this.s.events&&(i+=" "+this.s.events(t)),i +},Xp:function(t,e,i){for(var s=this.s,n="",r=webix.Date.datePart(webix.Date.copy(i.Rp)),a=s.weekNumber?1:0,h=webix.Date.getISOWeek(webix.Date.add(r,2,"day",!0)),o=(this.s.minDate||new Date(1,1,1),this.s.maxDate||new Date(9999,1,1),0);o",a&&(n+="
"+h+"
"); +for(var l=a;l"+u+"",r=webix.Date.add(r,1,"day"),r.getHours()&&(r=webix.Date.datePart(r))}n+="",h++}return n},$p:function(t,e){var i=this.s.date; +e||(e=this.aq[this.Np]._p),this.Np||(i=webix.Date.copy(i),i.setDate(1));var s=webix.Date.add(i,t*e,"month",!0);this.bq(i,s)},bq:function(t,e){this.callEvent("onBeforeMonthChange",[t,e])&&(this.Np?this.cq(e):this.showCalendar(e),this.callEvent("onAfterMonthChange",[e,t]))},aq:{"-2":{dq:function(t,e){t.setMinutes(e) +}},"-1":{dq:function(t,e){t.setHours(e)}},0:{_p:1},1:{eq:function(t){return t.getFullYear()},fq:function(t){return webix.i18n.calendar.monthShort[t]},dq:function(t,e){e!=t.getMonth()&&t.setDate(1),t.setMonth(e)},_p:12},2:{eq:function(t){var e=t.getFullYear();return this.gq=e=e-e%10-1,e+" - "+(e+10)},fq:function(t){return this.gq+t +},dq:function(t,e){t.setFullYear(this.gq+e)},_p:120}},cq:function(t){var e,i,s,n,r,a="",h=this.s.weekHeader?2:1,o=this.aq[this.Np],l=this.w.childNodes;if(t&&(this.s.date=t),this.Up||(this.hq=this.w.offsetHeight-this.s.headerHeight-this.s.timepickerHeight,this.iq=l[h].offsetWidth,this.Up=1),this.jq){i=this.hq/6; +var c=6,u=this._w||webix.i18n.timeFormat,d=u.match(/%([a,A])/);for(d&&c++,r=parseInt((this.iq-3)/c,10),a+="
"+this.kq(r,d)+"
",a+="
",a+="
",n=this.s.date.getHours(),s=0;24>s;s++){if(e="",d&&((n>11&&11>=s||11>=n&&s>11)&&(e=" webix_cal_blurred_hours"),s%4===0)){var f=4==s?"AM":16==s?"PM":""; +a+="
"+f+"
"}e+=n==s?" webix_selected":"";var b=webix.Date.toFixed(d&&s>12?s-12:s);a+="
"+b+"
"}for(a+="
",a+="
",n=this.s.date.getMinutes(),s=0;60>s;s+=this.s.minuteStep)e=n==s?" webix_selected":"",a+="
"+webix.Date.toFixed(s)+"
"; +a+="
",a+="
",a+="",this.w.innerHTML=a}else{for(l[0].firstChild.innerHTML=o.eq(this.s.date),i=this.hq/3,r=this.iq/4,n=1==this.Np?this.s.date.getMonth():this.s.date.getFullYear(),s=0;12>s;s++)e=n==(1==this.Np?s:o.fq(s))?" webix_selected":"",a+="
"+o.fq(s)+"
"; +h-1&&(l[h-1].style.display="none"),l[h].innerHTML=a,l[h+1]?l[h+1].innerHTML=this.mq():this.w.innerHTML+="",l[h].style.height=this.hq+"px"}},lq:function(t,e){return"width:"+t+"px; height:"+e+"px; line-height:"+e+"px;"},mq:function(){return"" +},kq:function(t,e){var i=t*(e?5:4),s=2*t;return"
"+webix.i18n.calendar.hours+"
"+webix.i18n.calendar.minutes+"
"},yt:function(t,e){this.callEvent("onBeforeZoom",[t])&&(this.Np=t,t?this.cq(e):this.showCalendar(e),this.callEvent("onAfterZoom",[t])) +},nq:function(t){var e=this.s.date,i=webix.Date.copy(e);this.aq[this.Np].dq(i,t);var s=this.Np-1;this.yt(s,i)},zt:function(t){this.callEvent("onBeforeDateSelect",[t])&&(this.selectDate(t,!0),this.callEvent("onDateSelect",[t]),this.callEvent("onAfterDateSelect",[t]))},on_click:{webix_cal_prev_button:function(){this.$p(-1) +},webix_cal_next_button:function(){this.$p(1)},webix_cal_day:function(t,e,i){if(-1!==i.className.indexOf("webix_cal_day_disabled"))return!1;var s=webix.html.index(i)-(this.s.weekNumber?1:0),n=webix.html.index(i.parentNode),r=webix.Date.add(this.Op().Rp,s+7*n,"day",!0);this.s.timepicker&&(r.setHours(this.s.date.getHours()),r.setMinutes(this.s.date.getMinutes())),this.zt(r) +},webix_cal_time:function(){if(this.aq[this.Np-1]){this.jq=!0;var t=this.Np-1;this.yt(t)}},webix_cal_done:function(){this.zt(this.s.date)},webix_cal_month_name:function(){if(this.jq=!1,2!=this.Np&&this.s.monthSelect){var t=Math.max(this.Np,0)+1;this.yt(t)}},webix_cal_block:function(t,e,i){if(this.jq){var s=-1!=i.className.indexOf("webix_cal_block_min")?this.Np-1:this.Np,n=this.s.date,r=webix.Date.copy(n); +this.aq[s].dq(r,1*i.getAttribute("data-value")),this.cq(r)}else this.nq(1*i.getAttribute("data-value"))}},Jp:function(t,e){return t?("string"==typeof t&&(t=e?webix.Date.strToDate(e)(t):webix.i18n.parseFormatDate(t)),t):webix.Date.datePart(new Date)},showCalendar:function(t){t=this.Jp(t),this.s.date=t,this.render(),this.resize() +},getSelectedDate:function(){return this.Mp?webix.Date.copy(this.Mp):this.Mp},getVisibleDate:function(){return webix.Date.copy(this.s.date)},setValue:function(t){this.selectDate(t,!0)},getValue:function(t){var e=this.getSelectedDate();return t&&(e=webix.Date.dateToStr(t)(e)),e},selectDate:function(t,e){t?(t=this.Jp(t),this.Mp=t,this.Lp=webix.Date.datePart(webix.Date.copy(t))):(this.Mp=null,this.Lp=null,this.s.date&&webix.Date.datePart(this.s.date)),e?this.showCalendar(t):this.render(),this.callEvent("onChange",[t]) +},locate:function(){return null}},webix.MouseEvents,webix.ui.view,webix.EventSystem),webix.protoUI({name:"property",$init:function(){this.w.className+=" webix_property",this.Ns=[]},defaults:{nameWidth:100,editable:!0},on_render:{checkbox:function(t){return"" +},color:function(t){return'
'+t+"
"}},on_edit:{label:!1},ad:"webix_f_id",on_click:{webix_property_check:function(t){var e=this.locate(t);return this.getItem(e).value=!this.getItem(e).value,this.callEvent("onCheck",[e,this.getItem(e).value]),!1 +}},on_dblclick:{},registerType:function(t,e){if(e.template&&(this.on_render[t]=e.template),e.editor&&(this.on_edit[t]=e.editor),e.click)for(var i in e.click)this.on_click[i]=e.click[i]},elements_setter:function(t){this.oq={};for(var e=0;e=0;r--)if(e.call(this,n[r].id))return n[r].id;return null},updateItem:function(){this.refresh() +},ug:function(t){var e=this.getItemNode(t);return{left:e.offsetLeft+this.s.nameWidth,top:e.offsetTop,height:e.firstChild.offsetHeight,width:this.pq,parent:this.w}},setValues:function(t,e){e||this.qq();for(var i in t){var s=this.getItem(i);s&&(s.value=t[i])}this.rq=t,this.refresh()},M:function(){return webix.Values.M.apply(this,arguments) +},qq:function(){for(var t=this.s.elements,e=0;e';if("label"==s.type)t[i]=n+"
"+s.label+"
";else{var r,a=this.on_render[s.type],h="
"+s.label+"
"; +r=s.collection||s.options?s.template(s,s.value):s.format?s.format(s.value):s.value,a&&(r=a.call(this,s.value,s)),t[i]=n+h+r+"
"}}return t.join("")},type:{height:24,templateStart:webix.template(""),templateEnd:webix.template("")},$skin:function(){this.type.height=webix.skin.$active.propertyItemHeight||24 +}},webix.EditAbility,webix.MapCollection,webix.MouseEvents,webix.Scrollable,webix.SingleRender,webix.AtomDataLoader,webix.EventSystem,webix.ui.view),webix.protoUI({name:"colorboard",defaults:{template:'
',palette:null,height:220,width:220,cols:12,rows:10,minLightness:.15,maxLightness:1},$init:function(){webix.event(this.x,"click",webix.bind(function(t){var e=webix.html.locate(t,"webix_val"); +this.setValue(e),this.callEvent("onSelect",[this.s.value,t])},this))},sq:function(t){var e=this.s.palette;t=t.toUpperCase();for(var i=0,s=e.length;s>i;i++)for(var n=0,r=e[i].length;r>n;n++)if(e[i][n].toUpperCase()==t)return{row:i,col:n};return null},$setSize:function(t,e){webix.ui.view.prototype.$setSize.call(this,t,e)&&this.render() +},getValue:function(){return this.s.value},re:function(){return this.x.firstChild},setValue:function(t){return t?("#"!=t.charAt(0)&&(t="#"+t),this.s.value=t,this.tq(t),t):void 0},uq:null,vq:function(){if(this.uq&&this.uq.parentNode)return this.uq;var t=this.uq=document.createElement("div");return t.className="webix_color_selector",this.x.lastChild.appendChild(t),t +},tq:function(t,e){if(this.isVisible()){var i=0,s=0;if(!e){var n=this.sq(t);n&&(e=this.x.lastChild.childNodes[n.row].childNodes[n.col])}if(!(e&&e.parentNode&&e.parentNode.parentNode))return void(this.uq&&(this.uq.style.left="-100px"));var r=e.parentNode;i=e.offsetLeft-r.offsetLeft,s=-(this.$height-(e.offsetTop-r.parentNode.offsetTop)); +var a=this.vq(),h=["left:"+i+"px","top:"+s+"px","width:"+e.style.width,"height:"+e.style.height].join(";");"undefined"!=typeof a.style.cssText?a.style.cssText=h:a.setAttribute("style",h)}},wq:function(t){function e(t){return webix.color.toHex(t,2)}function i(t,i,s){return"#"+e(Math.floor(t))+e(Math.floor(i))+e(Math.floor(s)) +}function s(t,e,i){var s,r,a;if(e){var h=.5>i?i*(1+e):i+e-i*e,o=2*i-h;s=n(o,h,t+1/3),r=n(o,h,t),a=n(o,h,t-1/3)}else s=r=a=i;return{r:255*s,g:255*r,b:255*a}}function n(t,e,i){return 0>i&&(i+=1),i>1&&(i-=1),1/6>i?t+6*(e-t)*i:.5>=i?e:2/3>i?t+(e-t)*(2/3-i)*6:t}function r(t){for(var e=[],s=255,n=s/t,r=0;t>r;r++)s=Math.round(s>0?s:0),e.push(i(s,s,s)),s-=n; +return e[e.length-1]="#000000",e}var a=[],h=t.rows-1,o=1/t.cols,l=(t.maxLightness-t.minLightness)/h,c=null;a.push(r(t.cols));for(var u=0,d=t.minLightness;h>u;u++){c=[];for(var f=0,b=0;f'+(i.template||"")+""),n={width:0,height:0,val:0},r=this.$width,a=this.$height,h=[],o='
',l="object"==typeof e[0]?e[0]:e,c=0;c",this.x.innerHTML=o,this.uq=null,this.callEvent("onAfterRender",[])}},refresh:function(){this.render()}},webix.ui.view,webix.EventSystem),webix.protoUI({name:"resizer",defaults:{width:7,height:7},$init:function(t){var e=this.getParentView().Cc; +webix.event(this.x,webix.env.mouse.down,this.xq,this),webix.event(document.body,webix.env.mouse.up,this.yq,this);var i=this.zq();this.Aq=!1,this.Bq=i,this.Cq="x"==i?"width":"height","x"==i?t.height=0:t.width=0,e>0?(this.x.className+=" webix_resizer_v"+i,this.x.style.marginRight="-"+e+"px","x"==i?t.width=e:t.height=e,this.$nospace=!0):this.x.className+=" webix_resizer_"+i,this.x.innerHTML="
","y"==i&&e>0&&(this.x.style.marginBottom="-"+(t.height||this.defaults.height)+"px") +},xq:function(t){var e=this.Dq();e&&(t=t||event,this.Aq=!0,this.Pl=webix.html.pos(t),this.Eq=[],this.Fq(t,e[0]))},yq:function(){this.Aq=!1,this.Pl=!1},Fq:function(t,e){var i,s,n,r,a;t=t||event,i=this.Bq,this.getParentView().x.style.position="relative",n=webix.html.offset(this.x),r=webix.html.offset(this.getParentView().x),a=n[i]-r[i],s=webix.html.offset(e.$view)[i]-webix.html.offset(this.getParentView().$view)[i],this.Rl=[i,e,a,s],this.Gq=new webix.ui.resizearea({container:this.getParentView().x,dir:i,eventPos:this.Pl[i],start:a-1,height:this.$height,width:this.$width,border:1,margin:this.getParentView()["_padding"+i.toUpperCase()]}),this.Gq.attachEvent("onResizeEnd",webix.bind(this.Hq,this)),this.Gq.attachEvent("onResize",webix.bind(this.Iq,this)),webix.html.addCss(document.body,"webix_noselect",1) +},zq:function(){return this.getParentView().mc?"y":"x"},Iq:function(){var t,e,i,s,n,r,a,h,o,l;if(this.Rl)for(t=this.Dq(),n=this.Rl[0],s=this.Gq.Jl-this.Rl[2],o=this.Jq(t,n,s),l=t[0]["$"+this.Cq]+t[1]["$"+this.Cq],a="y"==n?["minHeight","maxHeight"]:["minWidth","maxWidth"],r=0;2>r;r++){e=t[r].s,i=r?-s:s; +var c=e[a[0]],u=e[a[1]];if(i>0&&u&&u<=o[r]||0>i&&(c||3)>=o[r])return this.Eq[r]=i>0?u:c||3,h=this.Kq(t,n),void(this.Gq.Dl.style["y"==n?"top":"left"]=this.Rl[3]+h[0]+"px");o[r]<3?this.Gq.Dl.style["y"==n?"top":"left"]=this.Rl[3]+r*l+1+"px":this.Eq[r]=null}},Dq:function(){var t,e;for(t=this.getParentView().q,e=0;en;n++){var h=e[n].$getSize(0,0);if(a?h[2]==h[3]:Math.abs(h[1]-h[0])<3)e[n].s[this.Cq]=r[n],e[n].tc&&e[n].tc(this.Cq,r[n],a); +else{var o=e[n].$view[a?"offsetHeight":"offsetWidth"];e[n].s.gravity=r[n]/o*e[n].s.gravity}}e[0].resize();for(var n=0;2>n;n++)e[n].callEvent&&e[n].callEvent("onViewResize",[]);webix.callEvent("onLayoutResize",[e])}this.Rl=!1}this.Rl=!1,this.Aq=!1,this.Eq=null,webix.html.removeCss(document.body,"webix_noselect") +}},Kq:function(t){var e,i,s;return s=t[0]["$"+this.Cq]+t[1]["$"+this.Cq],this.Eq[0]?(e=this.Eq[0],i=s-e):this.Eq[1]&&(i=this.Eq[1],e=s-i),[e,i]},Jq:function(t,e,i){for(var s=[],n=0;2>n;n++)s[n]=t[n]["$"+this.Cq]+(n?-1:1)*i;return s},Mq:function(t,e,i){var s,n,r;if(this.Eq[0]||this.Eq[1])n=this.Kq(t,e); +else for(n=this.Jq(t,e,i),s=0;2>s;s++)n[s]<0&&(r=n[0]+n[1],n[s]=1,n[1-s]=r-1);return n}},webix.MouseEvents,webix.ui.view),webix.protoUI({name:"multiview",defaults:{animate:{}},setValue:function(t){webix.$$(t).show()},getValue:function(){return this.getActiveId()},$init:function(){this.Mh=0,this.mc=1,this.x.style.position="relative",this.x.className+=" webix_multiview",this.Nq=[] +},Oq:function(t,e){var i=webix.$$(t);i.Pq||(i.Qq=[],i.Pq={}),i.Pq[e]||(i.Pq[e]=!0,i.Qq.push(e))},Rq:function(t){var e=webix.$$(t);if(this.s.keepViews&&(e.x.style.display=""),this.Nq[this.Nq.length-2]!=t?(10==this.Nq.length&&this.Nq.splice(0,1),this.Nq.push(t)):this.Nq.splice(this.Nq.length-1,1),e.Pq){for(var i=0;it?s?"bottom":"right":s?"top":"left"},fc:function(t,e){var i=this.getParentView();if(i&&i.getTabbar&&i.getTabbar().setValue(t.s.$id||t.s.id),this.Wh)return webix.delay(this.fc,this,[t,e],100);for(var s=-1,n=0;ns||s==this.Mh)){{var r=this.q[this.Mh],a=this.q[s]; +r.$getSize(0,0)}if((e||"undefined"==typeof e)&&webix.animate.isSupported()&&this.s.animate){var h=webix.extend({},this.s.animate);this.s.keepViews&&(h.keepViews=!0),h.direction=this.Sq(s,this.Mh),h=webix.Settings.E(e||{},h);var o=webix.animate.formLine(a.x,r.x,h);a.$getSize(0,0),a.$setSize(this.bc,this.dc); +var l=h.callback;h.callback=function(){webix.animate.breakLine(o,this.s.keepViews),this.Wh=!1,l&&l.call(this),l=h.master=h.callback=null,this.resize()},h.master=this,this.Mh=s,this.Rq(this.getActiveId()),webix.animate(o,h),this.Wh=!0}else this.s.keepViews?r.x.style.display="none":(webix.html.remove(r.x),this.x.appendChild(this.q[n].x)),this.Mh=s,r.resize(),this.Rq(this.getActiveId()); +a.callEvent&&(a.callEvent("onViewShow",[]),webix.ui.each(a,this.Lw)),this.callEvent("onViewChange",[r.s.id,a.s.id])}},$getSize:function(t,e){var i=this.q[this.Mh].$getSize(0,0);if(this.s.fitBiggest)for(var s=0;sr;r++)i[r]=Math.max(i[r],n[r]); +var a=webix.ui.baseview.prototype.$getSize.call(this,0,0);return a[1]>=1e5&&(a[1]=0),a[3]>=1e5&&(a[3]=0),a[0]=(a[0]||i[0])+t,a[1]=(a[1]||i[1])+t,a[2]=(a[2]||i[2])+e,a[3]=(a[3]||i[3])+e,a},$setSize:function(t,e){this.lc=[t,e],webix.ui.baseview.prototype.$setSize.call(this,t,e),this.q[this.Mh].$setSize(t,e) +},isVisible:function(t,e){return e&&e!=this.getActiveId()?(t&&this.Oq(e,t),!1):webix.ui.view.prototype.isVisible.call(this,t,this.s.id)},getActiveId:function(){return this.q.length?this.q[this.Mh].s.id:null},back:function(t){if(t=t||1,this.callEvent("onBeforeBack",[this.getActiveId(),t])){if(this.Nq.length>t){var e=this.Nq[this.Nq.length-t-1]; +return webix.$$(e).show(),e}return null}return null}},webix.ui.baselayout),webix.protoUI({name:"form",defaults:{type:"form",autoheight:!0},Tq:-1,_f:"webix_form",ag:!0,$getSize:function(t,e){this.cc&&!this.s.width&&(t+=webix.ui.scrollSize);var i=webix.ui.layout.prototype.$getSize.call(this,t,e);return(this.s.scroll||!this.s.autoheight)&&(i[2]=this.s.height||this.s.minHeight||0,i[3]+=1e5),i +}},webix.ui.toolbar),webix.protoUI({name:"multiselect",$cssName:"richselect",defaults:{separator:","},Kt:function(t){var e=!webix.isArray(t)&&"object"==typeof t&&!t.name,i={view:"checksuggest",separator:this.config.separator,buttonText:this.config.buttonText,button:this.config.button};this.s.optionWidth?i.width=this.s.optionWidth:i.fitMaster=!0,e&&webix.extend(i,t,!0); +var s=webix.ui(i),n=s.getList();return"string"==typeof t?n.load(t):e||n.parse(t),s.attachEvent("onBeforeShow",function(){this.setValue(webix.$$(this.s.master).config.value)}),s},$setValue:function(t){if(this.se){var e=this.getPopup();this.getInputNode().innerHTML=e?e.setValue(t):""}},getValue:function(){return this.s.value||"" +}},webix.ui.richselect),webix.editors.multiselect=webix.extend({popupType:"multiselect"},webix.editors.richselect),webix.type(webix.ui.list,{name:"multilist",templateStart:webix.template('
')},"default"),webix.type(webix.ui.list,{name:"checklist",templateStart:webix.template('
{common.checkbox()}'),checkbox:function(t){var e=t.$checked?"fa-check-square":"fa-square-o"; +return""},template:webix.template("#value#")},"default"),webix.protoUI({name:"multisuggest",defaults:{separator:",",type:"layout",button:!0,width:0,filter:function(t,e){var i=this.getItemText(t.id);return i.toString().toLowerCase().indexOf(e.toLowerCase())>-1},body:{rows:[{view:"list",type:"multilist",borderless:!0,autoheight:!0,yCount:5,multiselect:"touch",select:!0,on:{onItemClick:function(){var t=this.getParentView().getParentView(); +webix.delay(function(){webix.$$(t.s.master).setValue(t.getValue())})}}},{view:"button",click:function(){var t=this.getParentView().getParentView();t.setMasterValue({id:t.getValue()}),t.hide()}}]}},Jt:function(t){return t.rows[0]},_d:function(){var t=this.getButton(),e=this.s.button?this.s.buttonText||webix.i18n.controls.select:0; +t&&(e?(t.s.value=e,t.refresh()):t.hide())},getButton:function(){return this.getBody().getChildViews()[1]},getList:function(){return this.getBody().getChildViews()[0]},setValue:function(t){var e=[],i=this.getList();if(i.unselect(),t&&("string"==typeof t&&(t=t.split(this.config.separator)),t[0]))for(var s=0;s"),h="",o="
"+a+h+"
",n=t.inputAlign||"left"; +i=i||t.name||webix.uid();var l=e.$renderLabel(t,i);return o+="
",top?l+"
"+o+"
":"
"+l+o+"
"},Cy:function(){return this.re().getElementsByTagName("UL")[0] +},oe:function(){var t=this.getPopup();if(t){var e=t?t.setValue(this.s.value):"",i="",s=this.Cy();if(e)for(var n=this.s.value.split(this.s.separator),r=e.split(this.s.separator),a=this.zy-2*webix.skin.$active.inputPadding-8,h=0;hx"; +i+="
  • "+o+"
  • "}s.innerHTML=i}this.Dy()},Ey:function(t){if(t&&t.value.length){if(t.createTextRange){var e=t.createTextRange();e.moveStart("character",t.value.length),e.collapse(),e.select()}else if(t.selectionStart||"0"==t.selectionStart){var i=t.value.length; +t.selectionStart=i,t.selectionEnd=i,t.focus()}}else t.focus()},Dy:function(){var t="top"==this.s.labelPosition,e=Math.max(this.re().firstChild.offsetHeight+2*webix.skin.$active.inputPadding,this.zy)+(t?this.le:0),i=this.$getSize(0,0);if(e!=i[2]){this.Fy=this.re().firstChild.offsetHeight+(t?this.le:0); +var s=this.getTopParentView();clearTimeout(s.kg),s.kg=webix.delay(function(){this.config.height=this.Fy+2*webix.skin.$active.inputPadding,this.resize(),this.Hy&&(this.Ey(this.getInputNode()),this.Hy=!1),(this.getPopup().isVisible()||this.Hy)&&this.getPopup().show(this.re().firstChild)},this)}},getInputNode:function(){return this.re().getElementsByTagName("INPUT")[0] +},$setValue:function(){this.oe()},getValue:function(){return this.s.value},Iy:function(t){var e=document.createElement("span");e.className="webix_multicombo_input",e.style.visibility="visible",e.style.height="0px",e.innerHTML=t.replace(/&/g,"&").replace(//g,">"),document.body.appendChild(e); +var i=e.offsetWidth+10;return document.body.removeChild(e),i},De:function(){webix.event(this.re(),"click",function(){this.getInputNode().focus()},this),webix.event(this.getInputNode(),"focus",function(){-1==this.re().className.indexOf("webix_focused")&&(this.re().className+=" webix_focused")},this),webix.event(this.getInputNode(),"blur",function(){this.re().className=this.re().className.replace(" webix_focused","") +},this),webix.event(this.getInputNode(),"input",function(){!this.getInputNode().value&&this.xy&&(this.getInputNode().style.width="20px",this.By=20,this.xy="",this.Hy=!0,this.getPopup().show(this.re().firstChild),this.Dy())},this),webix.event(this.getInputNode(),"keyup",function(){var t=this.getInputNode(),e=this.Iy(t.value)+10; +t.style.width=e+"px",e!=this.By&&(this.By=e,this.xy=t.value,this.Hy=!0,this.getPopup().show(this.re().firstChild),this.Dy())},this),webix.event(this.getInputNode(),"keydown",function(t){if(this.isVisible()){t=t||event;var e=this.Cy().lastChild;8==t.keyCode&&e&&(!this.getInputNode().value&&(new Date).valueOf()-(this.Jy||0)>500?(this.Hy=!0,this.Ay(e.getAttribute("value"))):this.Jy=(new Date).valueOf()) +}},this),webix.$$(this.s.suggest).linkInput(this)}},webix.ui.richselect),webix.protoUI({name:"menu",Oh:"webix_menu",$init:function(){this.data.attachEvent("onStoreUpdated",webix.bind(function(){this.Uq()},this)),this.attachEvent("onMouseMove",this.Vq),this.attachEvent("onMouseOut",function(){this.Wq()&&"click"==this.s.openAction||this.Xq||this.Uq() +}),this.attachEvent("onItemClick",function(t,e,i){var s=this.getItem(t);if(s){if(s.$template)return;var n=this.getTopMenu();if(!this.data.getMark(t,"webix_disabled")){if(!n.callEvent("onMenuItemClick",[t,e,i]))return void(e.showpopup=!0);this!=n&&n.Le(t,e,i),s.submenu?(this!==n&&!webix.env.touch||"click"!=n.s.openAction||this.Yq(t,i),e.showpopup=!0):(n.Uq(!0),n.$q&&n.hide()) +}}}),this.data.attachEvent("onClearAll",function(){this._q=[]}),this.data._q=[]},getTopMenu:function(){for(var t=this;t.ar;)t=webix.$$(t.ar);return t},Rh:function(t){this.s.autoheight&&(t=this.count());for(var e=0,i=0;t>i;i++){var s=this.data.pull[this.data.order[i]];e+=s&&"Separator"==s.$template?4:this.type.height +}return e},on_mouse_move:{},type:{css:"menu",width:"auto",templateStart:function(t,e,i){if("Separator"===t.$template||"Spacer"===t.$template)return'
    ';var s=(t.href?" href='"+t.href+"' ":"")+(t.target?" target='"+t.target+"' ":""); +return webix.ui.list.prototype.type.templateStart(t,e,i).replace(/^
    ":"")},templateEnd:function(t){return"Separator"===t.$template||"Spacer"===t.$template?"
    ":""},templateSeparator:webix.template("
    "),templateSpacer:webix.template("
    ")},getMenu:function(t){if(this.data.pull[t])return this; +for(var e in this.data.pull){var i=this.getItem(e);if(i.submenu){var s=this.br(i).getMenu(t);if(s)return s}}},getSubMenu:function(t){var e=this.getMenu(t),i=e.getItem(t);return i.submenu?e.br(i):null},getMenuItem:function(t){return this.getMenu(t).getItem(t)},br:function(t){var e=webix.$$(t.submenu); +return e||(t.submenu=this.cr(t),e=webix.$$(t.submenu)),e},Vq:function(t,e,i){this.Wq()&&this.Yq(t,i)},Wq:function(){var t=this.getTopMenu();if("click"==t.s.openAction){if(webix.env.touch)return!1;var e=t.dr;return e&&webix.$$(e).isVisible()?!0:!1}return!0},Yq:function(t,e){var i=this.getItem(t);if(i&&(this.Xq=null,this.dr&&i.submenu!=this.dr&&this.Uq(!0),i.submenu&&!this.config.hidden)){var s=this.br(i); +if(this.data.getMark(t,"webix_disabled"))return;s.show(e,{pos:this.s.subMenuPos}),s.ar=this.s.id,this.dr=i.submenu}},disableItem:function(t){this.getMenu(t).addCss(t,"webix_disabled")},enableItem:function(t){this.getMenu(t).removeCss(t,"webix_disabled")},er:function(t,e){var i=this.data;i._q[t]!=e&&(i._q[t]=e,i.filter(function(t){return!i._q[t.id] +}),this.resize())},hideItem:function(t){var e=this.getMenu(t);e&&e.er(t,!0)},showItem:function(t){var e=this.getMenu(t);return e?(e.er(t,!1),webix.ui.list.prototype.showItem.call(e,t)):void 0},Uq:function(t){if(this.dr){var e=webix.$$(this.dr);e.Uq&&e.Uq(t),(t||!e.gr)&&(e.hide(),this.dr=null)}},cr:function(t){var e={view:"submenu",data:t.submenu},i=this.getTopMenu().s.submenuConfig; +i&&webix.extend(e,i,!0);var s=this.getMenuItem(t.id);s&&s.config&&webix.extend(e,s.config,!0);var n=webix.ui(e);return n.s.id},$skin:function(){webix.ui.list.prototype.$skin.call(this),this.type.height=webix.skin.$active.menuHeight},defaults:{scroll:"",layout:"x",mouseEventDelay:100,subMenuPos:"bottom"}},webix.ui.list),webix.protoUI({name:"submenu",$init:function(){this.gd=webix.clone(this.hr),this.gd.A=this,this.attachEvent("onMouseOut",function(){"click"!=this.getTopMenu().s.openAction&&(this.Xq||this.gr||this.hide()) +}),this.attachEvent("onMouseMoving",function(){this.ar&&(webix.$$(this.ar).Xq=!0)})},$skin:function(){webix.ui.menu.prototype.$skin.call(this),webix.ui.popup.prototype.$skin.call(this),this.type.height=webix.skin.$active.menuHeight},hr:{$getSize:function(t,e){var i=1*this.A.s.height,s=1*this.A.s.width,n=webix.ui.menu.prototype.$getSize.call(this.A,t,e); +return this.A.s.height=i,this.A.s.width=s,n},$setSize:function(t,e){this.A.s.scroll&&(this.A.ed.style.height=e+"px")},destructor:function(){this.A=null}},body_setter:function(){},defaults:{width:150,subMenuPos:"right",layout:"y",autoheight:!0},type:{height:webix.skin.menuHeight,subsign:!0}},webix.ui.menu,webix.ui.popup),webix.ContextHelper={defaults:{padding:"4",hidden:!0},body_setter:function(t){return t=webix.ui.window.prototype.body_setter.call(this,t),this.gd.x.style.borderWidth="0px",t +},attachTo:function(t){t.on_context?t.attachEvent("onAfterContextMenu",webix.bind(this.ir,this)):webix.event(t,"contextmenu",this.jr,this)},getContext:function(){return this.nh},jr:function(t){return this.nh=webix.toNode(t||event),this.kr(t)},ir:function(t,e){return this.nh={obj:webix.$$(e),id:t},this.kr(e) +},kr:function(t){var e=this.show(t,null,!0);return webix.callEvent("onClick",[t]),e===!1?!1:webix.html.preventEvent(t)},gr:!0,master_setter:function(t){return this.attachTo(t),null}},webix.protoUI({name:"context"},webix.ContextHelper,webix.ui.popup),webix.protoUI({name:"contextmenu",$q:!0,$init:function(t){t.submenuConfig&&webix.extend(t,t.submenuConfig) +}},webix.ContextHelper,webix.ui.submenu),webix.protoUI({name:"tabbar",$skin:function(){var t=webix.skin.$active,e=this.defaults;e.topOffset=t.tabTopOffset||0,e.tabOffset="undefined"!=typeof t.tabOffset?t.tabOffset:10,e.bottomOffset=t.tabBottomOffset||0,e.height=t.tabbarHeight,e.tabMargin=t.tabMargin,e.inputPadding=t.inputPadding,e.tabMinWidth=t.tabMinWidth||100,e.tabMoreWidth=t.tabMoreWidth||40 +},ut:function(){var t,e=this.config,i=e.options.length,s=this.we-2*e.tabOffset,n=e.optionWidth||e.tabMinWidth;if(n>s/i)return{max:parseInt(s/n,10)||1};if(!e.optionWidth)for(t=0;t',template:function(t,e){var i,s,n,r,a,h,o,l,c,u=t.options; +if(u.length){e.Be(u),!t.value&&u.length&&(t.value=u[0].id),u=webix.copy(u),s="",t.tabOffset&&(s+="
     
    "),i=e.we-2*t.tabOffset-(t.type?0:t.tabMargin*(u.length-1)),l=t.topOffset+t.bottomOffset;var d=e.ut();if(d.max&&d.maxd.max)){var p=u.splice(n+1-d.max,d.max);u=p.concat(u)}b.clearAll(),b.parse(u.slice(d.max))}else b.clearAll()}else e.s.tabbarPopup&&webix.$$(e.s.tabbarPopup).hide();o=t.tabOffset;var v=!1; +for(n=0;n1?t.tabMargin*(d.max-1):0),c=(i-t.tabMoreWidth)/d.max):c=d.width,c=u[n].width||t.optionWidth||c,o+=c+(n&&!t.type?t.tabMargin:0),t.tabMargin>0&&n&&!t.type&&(s+="
    "),s+=e.vt(u[n],c),v){{e.dc-(t.type?0:l) +}s+='
    '+t.moreTemplate(t,e)+"
    ",o+=t.tabMoreWidth}r=e.bc-o,r>0&&!t.type&&(s+="
     
    ")}else s="
    "; +return a="",h=l&&!t.type?"height:"+(e.dc-l)+"px":"",t.topOffset&&!t.type&&(a+="
    "),a+="
    "+s+"
    ",t.bottomOffset&&!t.type&&(a+="
    "),a +}},vt:function(t,e){var i,s="",n=this.config;if(t.id==n.value&&(s=" webix_selected"),t.css&&(s+=" "+t.css),e=t.width||e,i='
    ',this.lr){var r=this.dc-2*n.inputPadding-2,a=this.dc-2,h=webix.extend({cheight:r,aheight:a},t);i+=this.lr(h) +}else{var o=t.icon?" ":"";i+=o+t.value}return(t.close||n.close)&&(i+=""),i+="
    "},ne:{image:"
    #value#
    ",icon:"
    #value#
    ",iconTop:"
    #value#
    "},type_setter:function(t){return this.s.tabOffset=0,this.ne[t]&&(this.lr=webix.template(this.ne[t])),t +}},webix.ui.segmented),webix.protoUI({name:"tabview",defaults:{type:"clean"},setValue:function(t){this.q[0].setValue(t)},getValue:function(){return this.q[0].getValue()},getTabbar:function(){return this.q[0]},getMultiview:function(){return this.q[1]},addView:function(t){var e=t.body.id=t.body.id||webix.uid(); +this.getMultiview().addView(t.body),t.id=t.body.id,t.value=t.header,delete t.body,delete t.header;var i=this.getTabbar();return i.addOption(t),i.refresh(),e},removeView:function(t){var e=this.getTabbar();e.removeOption(t),e.refresh()},$init:function(t){this.$ready.push(this.Nv);for(var e=t.cells,i=[],s=e.length-1;s>=0;s--){var n=e[s].body||e[s]; +n.id||(n.id="view"+webix.uid()),i[s]={value:e[s].header,id:n.id,close:e[s].close,width:e[s].width},e[s]=n}var r={view:"tabbar",multiview:!0},a={view:"multiview",cells:e,animate:!!t.animate};t.value&&(r.value=t.value),t.tabbar&&webix.extend(r,t.tabbar,!0),t.multiview&&webix.extend(a,t.multiview,!0),r.options=r.options||i,t.rows=[r,a],delete t.cells,delete t.tabs +},Nv:function(){this.getTabbar().attachEvent("onOptionRemove",function(t){var e=webix.$$(t);e&&e.destructor()})}},webix.ui.layout),webix.protoUI({name:"htmlform",mr:null,$init:function(t){this.elements=null,t.content&&(t.container==t.content||!t.container&&t.content==document.body)&&(this.nr=!0)},content_setter:function(t){if(t=webix.toNode(t),this.nr)for(;t.childNodes.length>1;)this.x.childNodes[0].appendChild(t.childNodes[0]); +else this.x.childNodes[0].appendChild(t);return!0},render:function(){this.mr||(webix.ui.template.prototype.render.apply(this,arguments),this.mr=this.getValues())},pc:function(){return this.elements||(this.elements=this.x.querySelectorAll("[name]")),this.elements},getValues:function(){for(var t=this.$f?webix.clone(this.$f):{},e=this.pc(),i=0;i"); +i.length>1&&(t=i[1],e=i[0])}else t&&t.mode&&(e=t.mode,t=t.url);return e?webix.proxy(e,t):t},master_setter:function(t){var e=t;return"DataStore"!=t.name&&(e=t.data),this.s.store=e,t},Mi:function(){this.s.store.attachEvent("onStoreUpdated",webix.bind(this.Ar,this)),this.s.store.attachEvent("onDataMove",webix.bind(this.Br,this)) +},ignore:function(t,e){var i=this.vr;this.vr=!0,t.call(e||this),this.vr=i},off:function(){this.vr=!0},on:function(){this.vr=!1},Cr:function(t){var e={};for(var i in t)0!==i.indexOf("$")&&(e[i]=t[i]);return e},save:function(t,e,i){e=e||"update",this.Dr(t,i||this.s.store.getItem(t),e)},Dr:function(t,e,i){if("object"==typeof t&&(t=t.toString()),!t||this.vr===!0||!i||"paint"==i)return!0; +var s=this.s.store;s&&s.vf&&(e=s.vf(e));var n={id:t,data:this.Cr(e),operation:i};if(webix.isUndefined(e.$parent)||(n.data.parent=e.$parent),"delete"!=n.operation){var r=this.s.master;r&&r.data&&r.data.getMark&&r.data.getMark(t,"webix_invalid")&&(n.Er=!0),this.validate(n.data)||(n.Er=!0)}return this.Fr(n)&&this.zr.push(n),this.s.autoupdate&&this.send(),!0 +},Br:function(t,e,i){if(this.s.trackMove){var s=webix.copy(this.s.store.getItem(t)),n=this.s.store.order;s.webix_move_index=e,s.webix_move_id=n[e+1]||"",s.webix_move_parent=i,this.Dr(t,s,"update")}},Ar:function(t,e,i){switch(i){case"save":i="update";break;case"update":i="update";break;case"add":i="insert"; +break;case"delete":i="delete";break;default:return!0}return this.Dr(t,e,i)},Fr:function(t){for(var e=0;e=0;t--)if(this.zr[t].Hr)return"saving";return!0},getItemState:function(t){var e=this.bt(t);return this.zr[e]||null},setItemState:function(t,e){if(e)this.save(t,e);else{var i=this.bt(t);i>-1&&this.zr.splice(i,1)}},bt:function(t){for(var e=-1,i=0;i=0;h--)s[h]=n[h];for(var h=0;h0?!1:!0},$r:{body:1,head:1,data:1,rows:1,cols:1,cells:1,elements:1,ui:1,column:1,config:1},Vr:function(t,e,i){var s=this.Xr(t,{}); +s.name?(e[s.name]=s,delete s.name):s.stack?e[s.stack]=[]:e=s;for(var n=t.childNodes,r=0;r
    "+t+"
    " +}function n(t){f.area||(f.area=document.createElement("DIV"),f.area.className="webix_message_area",f.area.style[f.position]="5px",document.body.appendChild(f.area)),f.hide(t.id);var e=document.createElement("DIV");return e.innerHTML="
    "+t.text+"
    ",e.className="webix_info webix_"+t.type,e.onclick=function(){f.hide(t.id),t=null +},webix.$testmode&&(e.className+=" webix_no_transition"),"bottom"==f.position&&f.area.firstChild?f.area.insertBefore(e,f.area.firstChild):f.area.appendChild(e),t.expire>0&&(f.timers[t.id]=window.setTimeout(function(){f.hide(t.id)},t.expire)),e.style.height=e.offsetHeight-2+"px",f.pull[t.id]=e,e=null,t.id +}function r(e,i,n){var r=document.createElement("DIV");r.className=" webix_modal_box webix_"+e.type,r.setAttribute("webixbox",1);var a="";if(e.width&&(r.style.width=e.width+(webix.rules.isNumber(e.width)?"px":"")),e.height&&(r.style.height=e.height+(webix.rules.isNumber(e.height)?"px":"")),e.title&&(a+='
    '+e.title+"
    "),a+='
    '+(e.content?"":e.text)+'
    ',(i||e.ok)&&(a+=s(e.ok||"OK",!0,"confirm")),(n||e.cancel)&&(a+=s(e.cancel||"Cancel",!1)),e.buttons)for(var h=0;hs||s==this.Mh||(this.Mh=s,n=i.mc?this.dc:this.bc,r=-(i.mc?0:s*n),a=-(i.mc?s*n:0),this.scrollTo(r,a),this.callEvent("onShow",[i.q[this.Mh].s.id]),this.s.navigation&&this.Ch()) +},scrollTo:function(t,e){webix.Touch&&webix.animate.isSupported()?webix.Touch.Nf(this.w,t,e,this.s.scrollSpeed||"100ms"):(this.w.style.marginLeft=t+"px",this.w.style.marginTop=e+"px")},navigation_setter:function(t){return this.E(t,{type:"corner",buttons:!0,items:!0}),t},showNext:function(){this.Mh0&&this.setActiveIndex(this.Mh-1)},setActiveIndex:function(t){var e=this.Ft.q[t].s.id;webix.$$(e).show()},getActiveIndex:function(){return this.Mh},$getSize:function(t,e){var i=this.Ft.$getSize(0,0),s=webix.ui.view.prototype.$getSize.call(this,t,e);return this.Ft.mc?(s[0]=Math.max(s[0],i[0]),s[1]=Math.min(s[1],i[1])):(s[2]=Math.max(s[2],i[2]),s[3]=Math.min(s[3],i[3])),s +},$setSize:function(t,e){var i=this.Ft,s=i.q.length,n=webix.ui.view.prototype.$setSize.call(this,t,e),r=this.dc*(i.mc?s:1),a=this.bc*(i.mc?1:s);n?(this.w.style.height=r+"px",this.w.style.width=a+"px",i.$setSize(a,r),this.Ht()):i.$setSize(a,r)},Ht:function(){var t=this.Ft,e=this.Mh||0,i=t.mc?this.dc:this.bc,s=-(t.mc?0:e*i),n=-(t.mc?e*i:0); +this.scrollTo(s,n),this.s.navigation&&this.Ch()},getActiveId:function(){var t=this.Ft.q[this.Mh];return t?t.s.id:null},setActive:function(t){webix.$$(t).show()}},webix.EventSystem,webix.NavigationButtons,webix.ui.view),webix.type(webix.ui.list,{name:"uploader",template:"#name# {common.removeIcon()}{common.percent()}
    #sizetext#
    ",percent:function(t){return"transfer"==t.status?"
    "+t.percent+"%
    ":"
    " +},removeIcon:function(){return"
    "},on_click:{webix_remove_upload:function(t,e){webix.$$(this.config.uploader).files.remove(e)}}}),webix.UploadDriver={flash:{$render:function(){window.swfobject||webix.require("legacy/swfobject.js"); +var t=this.s;t.swfId=t.swfId||"webix_swf_"+webix.uid(),this.re().innerHTML+="
    ",this._r=this.re().lastChild,swfobject.embedSWF(webix.codebase+"/legacy/uploader.swf",t.swfId,"100%","100%","9",null,{uploaderId:t.id,ID:t.swfId,enableLogs:t.enableLogs?"1":"",paramName:t.paramName||"upload",multiple:t.multiple?"Y":""},{wmode:"transparent"}); +swfobject.getFlashPlayerVersion();webix.event(this.x,"click",webix.bind(function(){var t=new Date;t-(this.ds||0)>250&&this.fileDialog()},this)),this.files.attachEvent("onBeforeDelete",webix.bind(this.as,this))},$applyFlash:function(t,e){return this[t].apply(this,e)},getSwfObject:function(){return swfobject.getObjectById(this.s.swfId) +},fileDialog:function(){this.getSwfObject()&&this.getSwfObject().showDialog()},send:function(t){if("function"==typeof t&&(this.fs=t,t=0),!t){var e=this.files.data.order,i=!0;if(e.length)for(var s=0;s250&&this.fileDialog()},this)),webix.event(this.x,"dragenter",webix.html.preventEvent),webix.event(this.x,"dragexit",webix.html.preventEvent),webix.event(this.x,"dragover",webix.html.preventEvent) +},bs:function(t){var e=t.dataTransfer.files;this.callEvent("onBeforeFileDrop",[e,t])&&this.cs(e),this.callEvent("onAfterFileDrop",[e,t])},fileDialog:function(t){this.ds=new Date,this.es=t;var e=this.x.getElementsByTagName("INPUT");e[e.length-1].click()},send:function(t,e){if("function"==typeof t&&(this.fs=t,t=0),!t){var i=this.files.data.order,s=!0; +if(i.length)for(var n=0;n1024;)e++,t/=1024;return Math.round(100*t)/100+" "+webix.i18n.fileSize[e] +},js:function(t,e){if("server"===e.status){var i=this.files.getItem(t);i.status="server",i.progress=100,webix.extend(i,e,!0),this.callEvent("onFileUpload",[i,e]),this.callEvent("onChange",[]),this.files.updateItem(t)}this.isUploaded()&&this.gs(e)},gs:function(t){this.callEvent("onUploadComplete",[t]),this.fs&&(this.fs.call(this,t),this.fs=0) +},isUploaded:function(){for(var t=this.files.data.order,e=0;e=7,r=i&&(356==e||208==e||306==e||158==e||444==e),a=568==window.screen.height,h=function(){var t=0,e=0; +if(i&&!n)webix.ui.orientation?(t=a?568:480,e=r?268:300):(t=320,e=a?r?504:548:r?416:460);else if(webix.env.isAndroid){if(!webix.env.isFF){document.body.style.width=document.body.style.height="1px",document.body.style.overflow="hidden";var s=window.outerWidth/window.innerWidth;t=window.outerWidth/s,e=window.outerHeight/s +}}else webix.env.isIEMobile||(t=window.innerWidth,e=window.innerHeight);e&&(document.body.style.height=e+"px",document.body.style.width=t+"px"),webix.ui.$freeze=!1,webix.ui.resize()},o=function(){webix.ui.$freeze=!0,webix.env.isSafari?h():webix.delay(h,null,[],500)};webix.attachEvent("onRotate",o),t(),webix.delay(o) +}}}(),function(){if(window.jQuery){var t=jQuery,e=[],i=function(t){return t&&t.getAttribute?t.getAttribute("view_id"):void 0},s=function(s){return function(n){if("string"!=typeof n){var r=[];return this.each(function(){var t,e,e=i(this)||i(this.firstChild);if(e&&(t=webix.$$(e)),!t){var a=n?n.data:0;a&&(n.data=null); +var h=webix.copy(n||{autoheight:!0,autowidth:!0});if(h.view=s,a&&(n.data=h.data=a),"table"===this.tagName.toLowerCase()){var o=webix.html.create("div",{id:this.getAttribute("id")||"","class":this.getAttribute("class")||""},"");this.parentNode.insertBefore(o,this),h.container=o,t=webix.ui(h),t.parse(this,"htmltable") +}else h.container=this,t=webix.ui(h)}r.push(t)}),1===r.length?r[0]:r}return e[n]?e[n].apply(this,[]):void t.error("Method "+n+" does not exist on jQuery.".name)}},n=function(){for(var e in webix.ui){var i="webix_"+e;t.fn[i]||(t.fn[i]=s(e))}};n(),t(n)}}(),webix.history={track:function(t,e){this.ls(t,e); +var i=webix.$$(t),s=function(){webix.history.ms||i.getValue&&webix.history.push(t,i.getValue())};i.getActiveId?i.attachEvent("onViewChange",s):i.attachEvent("onChange",s)},ns:function(t,e){webix.history.ms=1,t=webix.$$(t),t.callEvent("onBeforeHistoryNav",[e])&&t.setValue&&t.setValue(e),webix.history.ms=0 +},push:function(t,e,i){t=webix.$$(t);var s="";e&&(s="#!/"+e),webix.isUndefined(i)&&(i=t.getValue?t.getValue():e),window.history.pushState({webix:!0,id:t.s.id,value:i},"",s)},ls:function(t,e){webix.event(window,"popstate",function(t){t.state&&t.state.webix&&webix.history.ns(t.state.id,t.state.value)}); +var i=window.location.hash;webix.noanimate=!0,i&&0===i.indexOf("#!/")?webix.history.ns(t,i.replace("#!/","")):e&&(webix.history.push(t,e),webix.history.ns(t,e)),webix.noanimate=!1,this.ls=function(){}}},webix.protoUI({name:"fieldset",defaults:{borderless:!0},$init:function(t){this.x.className+=" webix_fieldset",this.x.innerHTML="
    " +},label_setter:function(t){return this.x.firstChild.childNodes[0].innerHTML=t,t},getChildViews:function(){return[this.os]},body_setter:function(t){return this.os=webix.ui(t,this.x.firstChild.childNodes[1]),this.os.Xb=this,t},getBody:function(){return this.os},$getSize:function(t,e){t+=18,e+=45;var i=this.ps=this.os.$getSize(t,e); +return i},$setSize:function(t,e){webix.ui.view.prototype.$setSize.call(this,t,e)&&(e=Math.min(this.ps[3],e),t=Math.min(this.ps[1],t),this.os.$setSize(t-18,e-45))}},webix.ui.view),webix.protoUI({name:"slider",$touchCapture:!0,defaults:{min:0,max:100,value:50,step:1,title:!1,template:function(t,e){var i=e.qs="x"+(t.id||webix.uid()),s="
     
     
    "; +return e.$renderInput(t,s,i)}},type_setter:function(t){this.x.className+=" webix_slider_"+t},title_setter:function(t){return"string"==typeof t?webix.template(t):t},rs:function(){return document.getElementById(this.qs)},oe:function(){var t=this.rs(),e=this.s;if(t){var i=this.Ee(e),s=e.value%e.step?Math.round(e.value/e.step)*e.step:e.value; +s=Math.max(Math.min(s,e.max),e.min);var n=e.max-e.min,r=Math.ceil((i-20)*(s-e.min)/n),a=i-20-r;t.style.left=10+r-8+"px",t.parentNode.style.width=i+"px",a=Math.min(Math.max(a,2),i-22),r=Math.min(Math.max(r,2),i-22);var h=t.previousSibling;h.style.width=a+"px";var o=h.previousSibling;o.style.width=r+"px",this.s.title&&(t.parentNode.previousSibling.innerHTML=this.s.title(this.s,this)) +}},refresh:function(){this.oe()},$setValue:function(){this.refresh()},$getValue:function(){return this.s.value},$init:function(){webix.env.touch?this.attachEvent("onTouchStart",webix.bind(this.ss,this)):webix.event(this.x,"mousedown",webix.bind(this.ss,this))},ss:function(t){var e=t.target||t.srcElement; +this.Ky&&this.Ky(t);var i=this.s.value;return webix.isArray(i)&&(i=webix.copy(i)),-1!=e.className.indexOf("webix_slider_handle")?(this.$x=i,this.ts.apply(this,arguments)):void(-1!=e.className.indexOf("webix_slider")&&(this.$x=i,this.s.value=this.us.apply(this,arguments),this.ts(t)))},ts:function(){this.vs=webix.env.touch?[this.attachEvent("onTouchMove",webix.bind(this.ws,this)),this.attachEvent("onTouchEnd",webix.bind(this.xs,this))]:[webix.event(document.body,"mousemove",webix.bind(this.ws,this)),webix.event(document.body,"mouseup",webix.bind(this.xs,this))],webix.html.addCss(document.body,"webix_noselect") +},xs:function(){this.vs&&(webix.env.touch?(webix.detachEvent(this.vs[0]),webix.detachEvent(this.vs[1])):(webix.eventRemove(this.vs[0]),webix.eventRemove(this.vs[1])),this.vs=[]),webix.html.removeCss(document.body,"webix_noselect");var t=this.s.value;webix.isArray(t)&&(t=webix.copy(t)),this.s.value=this.$x,this.setValue(t) +},ws:function(){this.s.value=this.us.apply(this,arguments),this.refresh(),this.callEvent("onSliderDrag",[])},us:function(t,e){var i=0;return i=webix.env.touch?e?e.x:t.x:webix.html.pos(t).x,this.ys(i)},ys:function(t){var e=this.s,i=e.max-e.min,s=webix.html.offset(this.rs().parentNode).x,n=Math.ceil((t-s)*i/this.Ee(e)); +return n=Math.round((n+e.min)/e.step)*e.step,Math.max(Math.min(n,e.max),e.min)},De:function(){}},webix.ui.text),webix.proxy.offline={$proxy:!0,storage:webix.storage.local,cache:!1,data:"",zs:function(){this.cache||webix.env.offline||(webix.call("onOfflineMode",[]),webix.env.offline=!0)},As:function(){!this.cache&&webix.env.offline&&(webix.env.offline=!1,webix.call("onOnlineMode",[])) +},load:function(t,e){var i={error:function(){var i=this.getCache()||this.data,s={responseText:i},n=webix.ajax.prototype.J(s);this.zs(),webix.ajax.$callback(t,e,i,n,s)},success:function(i,s,n){this.As(),webix.ajax.$callback(t,e,i,s,n),this.setCache(i)}};this.cache&&this.getCache()?i.error.call(this):this.source.$proxy?this.source.load(this,i):webix.ajax(this.source,i,this) +},getCache:function(){return this.storage.get(this.Bs())},clearCache:function(){this.storage.remove(this.Bs())},setCache:function(t){this.storage.put(this.Bs(),t)},Bs:function(){return this.source.$proxy?this.source.source+"_$proxy$_data":this.source+"_$proxy$_data"},saveAll:function(t,e,i,s){this.setCache(t.serialize()),webix.ajax.$callback(t,s,"",e) +},result:function(t,e,i,s,n){for(var r=0;r
    "),this.x.style.position="relative",webix.html.insertBefore(this.cu,this.x.firstChild,this.x),!webix.Touch.$active&&this.getScrollState){var i=this.getScrollState(); +this.x.scrollWidth!=this.$width&&(this.cu.style.left=i.x+"px"),this.x.scrollHeight!=this.$height&&(this.cu.style.top="bottom"!=t.type?i.y+"px":i.y+this.$height-this.cu.offsetHeight+"px")}this.du=1}t&&"icon"!=t.type&&webix.delay(function(){if(this.cu){var e=t.position||1;if(this.cu.style[webix.env.transitionDuration]===webix.undefined&&t.delay){var i=0,s=0,n=e/t.delay*30,r=this; +this.Oy&&(window.clearInterval(this.Oy),s=this.cu.firstChild.offsetWidth/this.cu.offsetWidth*100),this.Oy=window.setInterval(function(){30*i==t.delay?window.clearInterval(r.Oy):(r.cu.firstChild.style.width=s+i*n*e*100+"%",i++)},30)}else this.cu.firstChild.style.width=100*e+"%",t.delay&&(this.cu.firstChild.style[webix.env.transitionDuration]=t.delay+"ms"); +t.hide&&webix.delay(this.hideProgress,this,[1],t.delay)}this.du=0},this)},hideProgress:function(t){this.du&&(t=!0),this.cu&&(t?(this.Oy&&window.clearInterval(this.Oy),webix.html.remove(this.cu),this.cu=null):this.showProgress({position:1.1,delay:300,hide:!0}))}},webix.protoUI({name:"video",$init:function(t){t.id||(t.id=webix.uid()),this.$ready.push(this.Ms) +},Ms:function(){var t=this.s;if(this.w=webix.html.create("video",{"class":"webix_view_video",style:"width:100%;height:100%;",autobuffer:"autobuffer"},""),t.poster&&(this.w.poster=t.poster),t.src){"object"!=typeof t.src&&(t.src=[t.src]);for(var e=0;e' +}t.controls&&(this.w.controls=!0),t.autoplay&&(this.w.autoplay=!0),this.x.appendChild(this.w)},getVideo:function(){return this.w},defaults:{src:"",controls:!0}},webix.ui.view); +//# sourceMappingURL=./webix.js.map \ No newline at end of file diff --git a/static/webix/codebase/webix.js.map b/static/webix/codebase/webix.js.map new file mode 100644 index 0000000..d11fedb --- /dev/null +++ b/static/webix/codebase/webix.js.map @@ -0,0 +1 @@ +{"version":3,"file":"webix_debug.js","sources":["webix_debug.js"],"names":["window","webix","version","codebase","name","clone","source","f","_function","prototype","extend","base","force","_webix_proto_wait","PowerArray","insertAt","call","method","defaults","$init","copy","target","arguments","length","isArray","isDate","single","instance","t","_reinit","apply","protoUI","origins","selfname","data","ui","params","i","proto","_webix_type_wait","type","this","Array","slice","compilation","has_constructor","construct","push","def","isUndefined","key","$skin","result","config","$ready","_parseSettings","bind","functor","object","require","module","callback","master","disabled","_modules","substr","link","html","create","rel","href","document","head","appendChild","ajax","text","exec","calls","sync","get","responseText","count","callback_origin","file","code","execScript","eval","wrap","a","delay","obj","setTimeout","$destructed","ret","once","flag","uid","_seed","Date","valueOf","toNode","node","getElementById","toArray","array","toFunctor","str","scope","replace","Object","toString","_events","event","handler","id","addEventListener","attachEvent","eventRemove","ev","removeEventListener","detachEvent","EventSystem","_evs_events","_evs_handlers","_evs_map","blockEvent","_block","unblockEvent","mapEvent","map","on_setter","$scope","sub","indexOf","callEvent","toLowerCase","event_stack","return_value","$eventSource","unshift","remove","hasEvent","stack","removeAt","pos","len","splice","value","find","b","each","filter","env","strict","webix_strict","navigator","userAgent","mobile","touch","isOpera","isIE","all","parseFloat","appVersion","split","isIE8","isFF","isWebKit","isSafari","isAndroid","isIEMobile","transform","transition","found_index","js_list","css_list","d","createElement","j","style","cssPrefix","jp","jsPrefix","transitionDuration","translate","transitionEnd","svg","implementation","hasFeature","m","denySelect","_native_on_selectstart","onselectstart","stopEvent","allowSelect","index","k","previousSibling","n","createCss","rule","_style_cache","addStyle","_style_element","setAttribute","getElementsByTagName","styleSheet","cssText","createTextNode","attrs","attr_name","className","innerHTML","getValue","parentNode","removeChild","insertBefore","before","rescue","locate","e","trg","tagName","srcElement","getAttribute","test","offset","elem","getBoundingClientRect","box","body","docElem","documentElement","scrollTop","pageYOffset","scrollLeft","pageXOffset","clientTop","clientLeft","top","left","y","Math","round","x","width","offsetWidth","height","offsetHeight","parseInt","offsetTop","offsetLeft","offsetParent","posRelative","offsetX","layerX","layerY","offsetY","touches","pageX","pageY","compatMode","clientX","clientY","preventEvent","preventDefault","returnValue","cancelBubble","addCss","check","removeCss","RegExp","ready","_ready","_ready_code","temp","join","doit","webix_ready","concat","readyState","locale","editStop","self","promise","fn","er","state","val","next","now","setImmediate","cb","resolve","v","fire","reject","then","p","fail","finish","assert","thennable","ref","ec","cn","cnt","undefined","TypeError","done","nodeify","spread","list","l","promiz","defer","fcall","args","shift","nfcall","err","call_remote","url","pack","token","queue","nexttimer","next_timer_call","call_remote_sync","megapack","megaqueue","megaurl","multicall","call_remote_async","stringify","post","parse_responce","DataDriver","json","toObject","timeout","parseDates","remote","api","prefix","scripts","src","$key","api_helper","flush","skin","air","topLayout","barHeight","tabbarHeight","rowHeight","toolbarHeight","listItemHeight","inputHeight","inputPadding","menuHeight","menuMargin","labelTopHeight","layoutMargin","space","wide","clean","line","toolbar","form","layoutPadding","tabMargin","calendarHeight","padding","optionHeight","web","accordion","tabTopOffset","clouds","tabOffset","tabBottomOffset","terrace","metro","buttonHeight","light","glamour","unitHeaderHeight","calendar","headerHeight","timepickerHeight","customCheckbox","customRadio","flat","propertyItemHeight","accordionType","compact","material","set","$active","$name","view","webix_skin","Destruction","destructors","destructor","_settings","_last_editor","editCancel","getChildViews","cells","_destroy_with_me","views","_htmlmap","_htmlrows","_html","_contentobj","_viewobj","unbind","$view","_dataobj","UIManager","_view","$proxy","release","_final_destruction","_popups","_cache","_csp_cache","newlines","quotes","slashes","escape","&","<",">","\"","'","`","badChars","escapeChar","chr","template","teststr","temp_res","search","s1","s2","s3","s","common","charAt","sort","lastPos","addStr","n0","n1","Function","empty","types","default","baseType","Settings","define","property","_parseSeetingColl","_define","D","setter","C","coll","initial","settings","E","_mergeSettings","proxy","init","load","connector","connectorName","saveAll","updates","dp","ids","action","operation","webix_security","securityKey","loader","xml","_processError","actions","hash","status","sid","newid","tid","processResult","rest","save","update","mode","put","del","faye","clientId","selfid","client","subscribe","ignore","add","item","getItem","refresh","publish","indexdb","db","_get_db","store","createObjectStore","keyPath","autoIncrement","F","upgrade","parts","_index","indexedDB","webkitIndexedDB","mozIndexedDB","open","onupgradeneeded","onerror","onblocked","onsuccess","transaction","objectStore","openCursor","parse","$callback","req","getXHR","ActiveXObject","XMLHttpRequest","origin","toJSON","i18n","parseFormatStr","JSON","G","success","error","headers","_header","encodeURIComponent","_sync","_response","responseType","setRequestHeader","onreadystatechange","aborted","_xhr_aborted","owner","is_error","_data","response","send","_ajax_queue","J","tagToObject","rawxml","responseXML","_send","header","values","field","display","submit","AtomDataLoader","waitData","datatype","_load_when_ready","K","_ready_for_data","url_setter","data_setter","details","driver","_onLoad","_onLoadError","M","getDetails","getRecords","N","xhttp","O","dataFeed","_ignore_feed","setValues","isodate","getOptions","collections","getInfo","Q","total_count","R","S","parent","T","U","child","firstChild","tag","jsarray","idColumn","csv","row","stringToArray","cell","V","_isValidXML","fromString","xpath","records","assignTypes","path","XPathResult","nodeName","ownerDocument","res","col","evaluate","ANY_TYPE","iterateNext","selectNodes","pop","z","nodeType","hasSubTags","childNodes","attributes","nodeValue","wholeText","xmlString","DOMParser","parseFromString","loadXML","BaseBind","format","$$","_initBindSource","getBindData","BindSource","_bind_ready","addBind","_bind_source","target_id","_bind_refresh_handler","touchable","isVisible","removeBind","X","_on_sync","_bind_updated","old_render","render","_in_bind_processing","getValues","validate","setBindData","setDirty","loadNext","_bind_hash","_ignore_binds","_bind_specific_rules","saveBatch","_do_not_update_binds","_update_binds","setValue","getCursor","updateItem","_bind_update","CollectionBind","ValueBind","RecordBind","fb","hb","silent","clear","_check_data_feed","DataValue","DataRecord","gb","pod","_bind_update_common","_cursor","sel","getSelectedId","setCursor","oldid","refreshCursor","getBranch","importData","defaultData","AtomRender","jb","$empty","content","_toHTML","_backbone_sync","pull","template_setter","SingleRender","templateStart","templateEnd","customize","A","lb","mb","nb","enter","tab","esc","up","down","right","pgdown","pagedown","pgup","pageup","end","home","delete","backspace","meta","win","mac","ob","_focus_click","_keypress","_focus_tab","getFocus","sb","_focus_was_there","setFocus","only_api","_focus_time","blur","focus","hasFocus","ub","dont_clear","canFocus","pb","_focus","rb","isEnabled","vb","check_view","_is_child_of","_focus_logic","getPrev","wb","getParentView","yb","qb","which","keyCode","ctrl","ctrlKey","shiftKey","alt","altKey","metaKey","codeid","_keycode","clearTimeout","_key_press_timeout","_keypress_timed","keyPressTimeout","tabControl","String","fromCharCode","is_any","_check_keycode","xb","dir","start","marker","tabFocus","$fmarker","getTop","getNext","_inner_call","p_cells","addHotKey","keys","_parse_keys","letter","_hotkeys","removeHotKey","func","zb","Bb","_process_calls","Db","temp_result","Cb","controls","_controls","toUpperCase","_enable","_in_edit_mode","getTopParentView","setPosition","_hide","_custom_tab_handler","editNext","activeElement","IdSpace","_elements","_translate_ids","_run_inner_init_logic","_run_after_inner_init_logic","innerId","Jb","_prev_global_col","_global_collection","Kb","input","onitemclick","resize","_ui_creation","top_node","container","body_child","$topView","_inner","_fixHeight","_hidden","_container","$apiOnly","fullscreen","position","skipResize","adjust","_replace","_remove","animate","pobj","aniset","direction","cloneNode","formLine","breakLine","_detectScrollSize","div","clientWidth",110,120,130,140,150,160,170,180,190,200,210,220,"floor","skinobj","$customScroll","scrollSize","size","_uid","_namecount","$freeze","logic","include","children","_delays","hasMethod","zIndex","zIndexBase","rows","cols","headerlayout","layout","multiview","spacer","UIExtension","webix_view","_parent_cell","class","gravity","getNode","getFormView","base_id","hidden","_hidden_render","_hidden_hash","_disable_cover","disable","getComputedStyle","_disabled_view_pos","getPropertyValue","_moveChildFocus","enable","disabled_setter","container_setter","css_setter","id_setter","oldvalue","$id","$setSize","last","_last_size","$width","_content_width","_scroll_y","$height","_content_height","_scroll_x","$getSize","dx","dy","minWidth","maxWidth","minHeight","maxHeight","show","animate_settings","_show","_render_hidden_views","Qd","ui_to_render","hidden_setter","hide","sizes","_child_sizing_active","resizeChildren","_set_inner","hc","border_not_set","borderless","bottom","borderWidth","_borders","baseview","_parse_cells","_layout_sizes","_responsive","isolate","rows_setter","_vertical_orientation","_collection","cols_setter","whiteSpace","Rb","_cells","Qb","new_view","prev_node","_fix_vertical_layout","elements","_recollect_elements","oc","verticalAlign","addView","removeView","_beforeRemoveView","getCleanValues","reconstruct","Fb","_hiddencells","Lw","nx","ny","_set_child_size","fc","_signal_hidden_cells","showBatch","visibleBatch","batch","kc","collection","$nospace","_parse_cells_ext_end","tc","prop","vertical","_bubble_size","fixed","fixed_count","_sizes","_master_size","_desired_size","self_size","max","responsive","wc","min","ps","_set_size_delta","_set_size_gravity","it","_responsive_width","_responsive_height","_responsive_marker","autoheight","mt","nt","_responsive_tinkery","_responsive_hide","px","_paddingX","_responsive_show","rc","_responsive_cells","auto","_set_child_size_a","zc","Ac","_parse_cells_ext","_parse_once","margin","_margin","_paddingY","paddingX","paddingY","_padding","_hasBorders","_render_borders","_beforeResetBorders","baselayout","_afterResetBorders","correction","scroll","structure_changed","borderTopWidth","borderBottomWidth","borderLeftWidth","borderRightWidth","Wx","_cleanlayout","Hc","maxlength","Jc","inner","Ic","s_inner","s_next","_fix_container_borders","contrstyle","contrpadding","type_setter","_margin_set","_padding_set","html_element","animation","subtype","animation_copy","_has_animation","_wait_animate","isSupported","$testmode","noanimate","current","defAniPos","keepViews","nextSibling","duration","timing","skew_options","scale_type","css_general","css_transition","css_transform","transitionEnded","MouseEvents","_clickstamp","_dbl_sensetive","_item_clicked","_mouse_action_extend","onClick","onContext","onDblClick","onMouseMove","on_click","_onClick","on_dblclick","_onDblClick","on_context","_onContext","on_mouse_move","_enable_mouse_move","Vc","_mouse_move_enabled","_onMouse","Rc","step","Sc","_focus_action","stamp","_mouseEvent","Tc","Uc","Xc","createEventObject","webkitMovementY","webkitMovementX","_mouse_move_timer","_onMouseMove","_onMouseOut","mouseEventDelay","$c","_c","Yc","pair","processed","vid","wid","w_view","css","found","_id","_headobj","_headlabel","_headbutton","_bodyobj","_head_cell","_body_cell","ad","body_setter","border","header_setter","headerAlt_setter","collapsed","_getHeaderSize","webix_accordionitem_header","_toggle","webix_accordionitem_header_v","collapsed_setter","_canCollapse","_collapse","expand","_expand","_afterOpen","$noresize","collapse","ld","kd","headerAlt","hd","headerAltHeight","headerSize","_last_size_y","borderlessAccordion","panelClass","multi","panel","_skin_render_collapse","_accLastChild","md","jd","DragControl","pd","addDrop","master_mode","webix_drop","_getCtrl","webix_master","qd","_drag_masters","addDrag","webix_drag","mouse","_preStart","rd","_active","_saved_event","_preStartFalse","destroyDrag","evobj","context","_start_pos","_webix_drag_mm","move","_startDrag","_webix_drag_mu","ud","_clean_dom_after_drag","xd","abs","createDrag","sendSignal","_moveDrag","_stopDrag","Bd","_last","$drop","$dragOut","zd","still_drag","Ad","$dragPos","_skip","elementFromPoint","touch_event","_checkLand","Fd","_landing","$dragIn","signal","active","getMaster","getContext","_drag_context","drag_container","$dragCreate","$drag","_skipDropH","_skip_mark","from","Id","$dragDestroy","DataMove","tindex","tobj","new_id","newId","_externalData","Kd","nid","new_index","getIndexById","$blockRender","_next_move_index","order","moveUp","moveDown","moveTop","moveBottom","Jd","newdata","$template","externalData","Movable","move_setter","_move_admin","Ld","drag","Modality","Md","_modal_cover","_previous_modality","_modality","topmost","_ignore_clicks","modal","_modal","Vw","popups","click_view","zIndex_setter","point","_modal_set","relative","innerWidth","innerHeight","fin_x","fin_y","point_y","point_x","autofit","delta_x","delta_y","delta_point","deltax","deltay","_set_point","_hide_point","_setPosition","_hide_timer","autofocus","_prev_focus","showpopup","myindex","_hide_callback","_hide_sub_popups","Wd","close","Xd","_inner_body_set","head_setter","getBody","getHead","Td","_topPositionCallback","Yd","head_size","headHeight","clientHeight","_point_element","Rd","Sd","yCount","select","navigation","filter_setter","etemp","_get_extendable_cell","_set_on_popup_click","_old_text","Jt","Rs","options_setter","getInputNode","getItemText","setMasterValue","setValueHere","_last_input_target","getMasterValue","getList","textValue","getSuggestion","_d","_suggest_after_filter","fitMaster","date","input_setter","linkInput","webix_master_id","_suggestions","_non_ui_mode","ce","_key_timer","_tab_key","_escape_key","_enter_key","_navigate","_last_delay","_resolve_popup","be","_dont_unfilter","_show_selection","$customWidth","_zoom_level","popup","ke","exists","unselect","showItem","getFirstId","ge","fe","ee","he","moveSelection","_preselectMasterOption","getSelectedItem","visible","selected","element","click","readonly","_labelTopHeight","_inputTemplate","badge","awidth","aheight","label","me","$cssName","hotkey_setter","control","_addElementHotKey","dispatchEvent","clickEvent","createEvent","initEvent","Bt","tooltip_setter","_getBox","title","_types","_set_inner_size","_set_inner_size_next","ne","htmlbutton","prev","imageButton","imageButtonTop","image","imageTop","icon","iconButton","iconTop","iconButtonTop","qe","tagNames","inputs","_findAllInputs","labelPosition","removeAttribute","_rendered_input","$setValue","$getValue","re","ue","sqrt","pe","arrow","button","arrowEdge","_sqrt_2","ve","_input_width","inputWidth","_input_height","_calck_input_size","bheight","cheight","dheight","align","handle","cssFloat","textAlign","marginTop","$render","tooltip","_init_once","Ae","webix_all_segments","_handle_tab_click","webix_all_tabs","webix_inp_counter_next","webix_inp_counter_prev","webix_inp_combo","webix_inp_checkbox_border","toggle","webix_inp_checkbox_label","webix_inp_radio_border","webix_inp_radio_label","webix_tab_more_icon","getPopup","webix_tab_close","removeOption","Be","opts","Yx","placeholder","setHTML","oe","Ce","De","_allowsClear","newvalue","suggest","_setSubmitEvent","_init_onchange","$renderIcon","Ct","_skipSubmit","relatedView_setter","relatedAction","viewid","relatedView","validateEvent_setter","required","rules","isNotEmpty","_validate","bottomLabel_setter","bottomPadding","py","invalidMessage","qy","bottomLabel","message","invalid","_restorePadding","heightInc","labelWidth","Ee","iconWidth","Fe","_get_input_width","inputAlign","_get_div_placeholder","$renderInput","qt","$renderLabel","labelAlign","labelTop","labelHeight","div_start","_baseInputHTML","suggest_setter","attempt","_check_options","options","optionWidth","optionIndex","pages","addOption","next_index","webix_input_icon","onLabel","offLabel","onIcon","offIcon","optview","option","DataCollection","Dt","Infinity","new_value","checkValue","uncheckValue","rightlabel","labelRight","checked","ch","isChecked","eachid","newline","Ie","inp","_getInputNode","_render_div_block","popupWidth","_suggest_config","_reset_value","Ss","getText","editable","richselect","_init_popup","timeIcon","stringResult","timepicker","icons","Je","Tx","timeMode","formatDate","parseTimeFormatDate","parseFormatDate","time","setHours","setMinutes","isNaN","getTime","_parse_value","selectDate","formatStr","_formatStr","timeFormatStr","fullDateFormatStr","dateFormatStr","format_setter","dateToStr","_formatDate","strToDate","timeFormatDate","fullDateFormatDate","dateFormatDate","parseTimeFormatStr","datepicker","RenderStack","_render_change_id","_call_onclick","mark","_marks","Ne","Ke","old","getItemNode","Le","search_id","scrollTo","txmin","txmax","tymin","tymax","getScrollState","_setItemActive","cont","_toHTMLObject","getNextId","_renderobj","getRange","ValidateData","clearValidation","_clear_invalid","failed","_validate_details","isHidden","$obj","$all","subresult","subview","validator","Se","_mark_invalid","ValidateCollection","Ue","_validate_init_once","rules_setter","clearMark","Qe","removeMark","Te","addMark","isEmail","isNumber","DataLoader","DataStore","_call_onclearall","_call_on_config","feed","_feed","Ye","_load_count","_feed_last","_feed_common","_e","final_callback","_feed_callback","getState","finalurl","af","datathrottle","_throttle_request","datafetch","cf","_parse","_call_onready","removeMissed_setter","_removeMissed","gf","save_setter","_init_dataprocessor","scheme_setter","scheme","dataFeed_setter","filtervalue","clearAll","filterobj","urldata","ef","_ready_was_used","We","xhr","abort","Xe","DataMarks","addRowCss","hasCss","getMark","clearCss","setDriver","df","_filter_order","info","_key","_config","recs","_inner_parse","_scheme_group","_group_processing","_not_grouped_order","_scheme_sort","kf","_from","subload","marks","_scheme_update","_scheme_init","delid","_size","changeId","_skip_refresh","to","$min","startOffset","$max","endOffset","getIndexRange","sindex","getIdByIndex","_move_inner","sf","_scheme","_scheme_save","$save","$change","$update","_scheme_serialize","$serialize","$group","$sort","serialize","branch","_filter_branch","_sync_source","sync_logic","_skip_next_sync","_sync_events","_back_sync_handler","unsync","data_size","original_index","getLastId","getPrevId","by","as","parameters","_sort_core","xf","sorter","_sort","_create","neworder","Af","preserve","Bf","_filter_reset","_filter_core","_filterMode","Df","Ef","provideApi","eventable","onbeforesort","onaftersort","onbeforeadd","onafteradd","onbeforedelete","onafterdelete","ondataupdate","_methodPush","old_css","current_css","$css","el","zf","yf","_dir","_by","Hf","server","int","string_strict","string","Gf","_as","Ff","Scrollable","_one_time_scroll","scroll_setter","Touch","_refresh_scroll","_touch_scroll","CustomScroll","overflowX","overflowY","Lf","_get_matrix","_set_matrix","scrollSpeed","Jf","scrollWidth","_clear_artefacts","_scroll_end","page","group","webix_pager_item","_remove_master","wt","$master","limit","_animate","first","pager","_clone","_refresh_clone","ceil","old_page","old_limit","apiOnly_setter","Sf","Qf","_pgInAnimation","_pgAnimateTimeout","flip","snode","_body","onode","backgroundColor","PagingAbility","pager_setter","check_pager_sizes","repeat","autosize","getVisibleCount","_count_pager_index","$pagesize","ui_pager","_count_pager_total","level","_pager","ty","$level","sy","setPage","getPage","getPager","_disabled","AutoTooltip","col_mode","handlers","getColumnConfig","column","Values","_is_form_dirty","_inner_setValues","Zf","_values","isDirty","getDirtyValues","defaultValue","_showBottomText","Gc","_f","ag","_form_classname","Qs","onbeforetabclick","onaftertabclick","onchange","sc","Bc","_form_vertical","elementsConfig","_rec_apply_settings","eg","nextsettings","_template_types","_render_me","_correct_width_scroll","section","fg","onClick_setter","gg","_not_render_me","_probably_render_me","jg","src_setter","hg","content_setter","setContent","_template_resize_timer","_get_auto_height","lg","scrollHeight","If","getIframe","getWindow","contentWindow","OverlayBox","showOverlay","_overlay","hideOverlay","_resizeChildren","og","cx","_native_scroll","cy","desired_size","self_sizes","scroll_size","custom","showView","topPos","TreeRenderStack","pg","qg","_toHTMLItem","_toHTMLLevel","rg","leaves","_tree_branch_render_state","_obj","_toHTMLItemObject","$parent","getNextSiblingId","vg","SelectionModel","_selected","_data_updated","_data_loaded","_data_filtered","_id_changed","_set_noselect","uy","multiselect","_noselect_element","Ag","zg","xg","loadBranch","yg","$selected","Bg","_refresh_selection","selectAll","_silent_selection","unselectAll","isSelected","_select_mark","range","as_array","Eg","Cg","_is_mass_selection","TreeDataMove","getBranchIndex","Lt","_check_branch_child","target_parent","$child","copy_data","tbranch","sbranch","$count","_set_level_rec","Fg","Gg","$dropAllow","new_data","TreeDataLoader","_sync_hierarchy","_feed_commonA","_loadNextA","Ig","some","Jg","Hg","_sync_to_order","TreeStore","showSubItems","_set_child_scheme","_parent","filterMode_setter","filterMode","_filter_branch_rec","Ng","allow","child_run","openParents","parentId","getParentId","newsub","eachOpen","getPrevSiblingId","getFirstChildId","isBranch","Lg","parse_name","_datadriver_child","_extraParser","Pg","webix_kids","Kg","_sync_each_child","Qg","getTopRange","eachChild","eachSubItem","bset","pid","refresh_parent","Rg","_rec_remove","Wy","_filter_removed","out","items","TreeType","checkbox","nocheckbox","folder","TreeAPI","openAll","closeAll","Sg","threeState","_tree_check_uncheck_3","isBranchOpen","getOpenItems","Ug","tree","setState","_repeat_set_state","TreeClick","webix_tree_open","webix_tree_close","webix_tree_checkbox","_tree_check_uncheck","TreeCollection","DragOrder","Vg","DragItem","_drag_order_stored_left","_drag_order_complex","fragile","_last_sort_dnd_node","_translate_id","start_id","_header_height","_g","$dragMark","drag_setter","_inner_drag_only","_initHandlers","_auto_scroll_delay","_auto_scroll","yscroll","xscroll","dragscroll","reset","sense","_drag_pause","_context_to_move","dh","_do_not_drag_selection","selection","hash_id","_start_context","$dragHTML","_marked","Group","GroupStore","_not_grouped_pull","_group_level_count","ungroup","skipRender","GroupMethods","sum","summ","any","_ungroup_tree","mf","ih","acc","stats","_group_tree","_group_prop_accessor","_any","groups","labels","$row","jh","topbranch","current_id","ancestor","newitem","_formath","footer","$footer","_fix_group_levels","hh","toporder","mh","clipbuffer","nh","oh","ph","_area","_paste","rh","last_active","CopyPaste","clipboard_setter","templateCopy","clipboard","insert","modify","templateCopy_setter","KeysNavigation","sh","navigation_setter","_global_nav_grid_hotkeys","_navigation_helper","webix_tree_item","activeTitle","Xg","templateCommon","classname","TreeStateCheckbox","uh","_branch_render_supported","updated","_setThirdState","_init_render_tree_state","threeState_setter","vh","parents","checkedParents","_getAllLeaves","_setParentThirdState","_setCheckboxIndeterminate","yh","chElem","indeterminate","xh","itemId","checkedCount","unsureCount","needrender","getChecked","Tg","_correctThreeState","checkItem","uncheckItem","Ah","checkAll","_checkUncheckAll","uncheckAll","zh","wh","_icon_src","Bh","lines","lines_level","branch_id","parent_id","pbranch","$index","NavigationButtons","Ch","_navPanel","_renderNavItems","_renderNavButtons","_setLinkEventHandler","Gh","h","bindId","_linkAttr","_showPanelBind","_prevNavButton","_showNavItem","_nextNavButton","Kh","inc","_active_cell","setActiveIndex","Ih","Eh","linkAttr","_clearPanel","_renderPanel","Nh","Fh","buttons","Oh","_listClassName","_auto_resize","webix_list_item","_no_animation","Ph","autowidth","Rh","_onoff_scroll","Sh","_auto_height_calc","xCount","_auto_width_calc","widthSize","heightSize","_onClear","Th","_nested_cursor","_nested_chain","_in_animation","_is_level_down","getOpenState","lastChain","_prev_nested_chain_length","_back_scroll_states","next_div","animArr","templateBack_setter","templateBack","templateItem_setter","templateItem","templateGroup_setter","templateGroup","webix_selected","grouplist","uniteBy_setter","sort_setter","uniteBy","$unitValue","units","_setUnits","_getUnitRange","getUnits","getUnitList","$unit","templateStartHeader","templateHeader","_h","u","unit","$h","EditAbility","editaction","_editors","_edit_open_time","_refocus_inline_editor","_init_edit_events_once","Ux","newnode","selectionStart","selectionEnd","createTextRange","$s","editor","getEditor","$inline","_locateInput","_refocus_try","editable_setter","ci","popupType","_changeEditorId","edit","_reset_active_editor","_component_specific_edit_init","Vs","liveEdit","_set_new_value","hi","realform","_show_editor_form","_get_editor_type","editors","_init_editor","_live_edits_handler","_handle_live_edits","area","_on_editor_change","ei","ki","getEditorValue","li","ji","_get_edit_config","editValue","_addEditor","_sizeToCell","afterRender","pi","mi","_locate_cell","ii","ni","qi","destroy","focusEditor","_edit_stop","cancel","_editStop","_for_each_editor","ug","oi","inline","_cellPosition","si","ri","_removeEditor","validateEditor","getEditState","editor_next","_find_cell_next","_after_edit_next","vi","ti","init_suggest","create_suggest","boxobj","inline-checkbox","inline-text","createPopup","$popup","popupInit","color","_is_string","combo","xi","_shared_suggest","rt","_suggest","_create_suggest","showPopup","_initial_value","sobj","_initial_text","password","VirtualRenderStack","_render_visible_rows","_unrendered_area","_getVisibleRange","ind","_dx","_y","_render_delayed","_wait_for_render","Fi","Hi","Ai","viewport","_create_placeholder","_max","_height","_filled","holder","holder_row","nextpoint","loading","delta","delta2","new_space","_maybe_loading_already","loadahead","Ci","Ji","Li","Ii","Ei","Di","sizeToContent","_after_init_call","prerender","Mi","webix_dataview_item","templateLoading","Ni","autoheight_setter","_autowidth","_calck_autoheight","htmltable","tr","_webix_skip","td","getConfig","columns","_de_json","_get_attrs","Pi","Qi","attr","scrollStep","scrollPos","scrollVisible","zoom","_onscroll","_last_set_size","_last_scroll_pos","Ti","_zoom_limit","scrollWidth_setter","_check_quantum","scrollHeight_setter","sizeTo","pointerEvents","getScroll","getSize","svalue","_onscroll_inner","Ri","Vi","activeArea","x_mode","_x_scroll_mode","_on_wheel","Yi","wheelDeltaX","wheelDeltaY","wheelDelta","detail","Number","sign","toFixed","decimalSize","int_value","groupSize","chunk","groupDelimiter","decimalDelimiter","numToStr","startOnMonday","num","weekStart","getDay","datePart","monthStart","setDate","yearStart","setMonth","dayStart","utc","getDate","getMonth","getFullYear","dayShort","dayFull","monthShort","monthFull","getHours","getMinutes","getSeconds","getISOWeek","mask","match","splt","monthShort_hash","monthFull_hash","UTC","ndate","nday","first_thursday","year_number","ordinal_date","weekNumber","getUTCISOWeek","Jv","d0","checkFunc","incorrect","_correctDate","getYear","setYear","setSeconds","setMilliseconds","timePart","getTimezoneOffset","equal","isHoliday","day","Zi","parseFormat","parseTimeFormat","numberFormat","priceFormat","_price_format","_price_settings","setLocale","locales","helpers","_dateMethods","price","priceSettings","intFormat","dateFormat","timeFormat","longDateFormat","fullDateFormat","fileSize","hours","minutes","today","MapCollection","zj","_map_options","Et","options_view","_bind_collection","ij","_collection_accesser","optionslist","Bj","_bind_accesser","Ej","Dj","leftSplit","rightSplit","columnWidth","minColumnWidth","minColumnHeight","fixedRowHeight","scrollAlignY","headerRowHeight","webix_richfilter","webix_table_checkbox","checkboxRefresh","webix_table_radio","eachRow","rowid","_top_id","_footer","_call_onparse","_first_render","_columns","_headers","_footers","_rows_cache","_active_headers","_filter_elements","_footer_height","_config_table_from_file","_config_options_from_file","_restore_scroll_state","mj","_scrollSizeX","_scrollSizeY","rowLineHeight","_render_initial","ej","refreshHeaderContent","_refresh_tracking_header_content","autoConfig","_dtable_fully_ready","_autoDetectConfig","_define_structure","_render_timer","_apply_headers","experimental","_repaint_single_row","_check_rendered_cols","_dtable_height","_get_total_height","_set_split_sizes_y","_render_timer_id","columns_setter","_build_data_map","_columns_pull","_hidden_column_hash","lj","colls","kj","refreshColumns","rj","cssFormat","_normalize_headers","Cj","uj","_rightSplit","_dtable_width","nr","nl","last_index","_create_scrolls","_set_columns_positions","_set_split_sizes_x","_render_header_and_footer","Ij","attached","Kj","_header_fix_width","_refreshHeaderContent","_summ","_render_header_section","_size_header_footer_fix","_last_sorted","markSorting","_last_order","Mj","heights","rowspan","colspan","Pj","sec","alltd","getHeaderContent","_find_header_content","datafilter","getHelper","Pt","Qj","contentId","columnId","_has_active_headers","hcss","column_pos","cell_height","sheight","_summ_next","header_css","rotate","showItemByIndex","row_ind","column_ind","_get_y_range","_getHeightByIndexSumm","_getHeightByIndex","_dtable_offset_height","_y_scroll","_get_x_range","_center_width","_x_scroll","showCell","getColumnIndex","_scrollTo_touch","_getScrollState_touch","_render_scroll_top","_scrollLeft","_render_scroll_shift","Nj","_render_subheader","_left_width","onscroll","_scroll_with_header","_right_width","_s","pj","cellTrackOnly","refreshFilter","fk","getOnly","byId","trackCells","headerContent","gk","hdx","Oj","_set_size_scroll_area","_header_scroll","_footer_scroll","sk","scrollY","scrollX","Hj","_scrollTop","scrx","scry","vscroll","_onscroll_x","vscroll_view","_onscroll_y","nk","rid","cid","xs","xe","ye","ys","zone","ok","cs","_locate","rind","cind","_id_to_string","pk","cdiv","_yr0","rk","setColumnWidth","skip_update","_setColumnWidth","Xs","_updateColsSizeSettings","Uj","Tj","index1","index2","leftcolumn","split_column","xj","setRowHeight","rowId","old_height","lk","conts","_update_scroll","kk","_minimize_dom_changes","Xj","full","xind","xend","Sj","dep","xdef","Kv","rowindex","x_range","_getValue","_getCss","vj","x_scroll","_clearColumnCache","xr","yr","_hideColumn","_render_full_rows","rendered","_renderColumn","_check_and_render_full_rows","_check_load_next","Ak","_rows_cache_start","_rows_cache_end","yk","_delete_full_rows","_render_full_row_some","zk","paging","fetch","_last_valid_render_pos","_data_request_flag","_check_rows","_run_load_next","Hk","Ik","conf","vk","uk","row_id","column_id","Mv","per_css","row_css","$cellCss","mark_marker","css_marker","_select_css","Ek","radio","editIcon","trashIcon","xk","total","_yr2","_yr1","yj","wanted_height","Jj","w","desired","minwidth","Ow","Mk","_sort_sign","_get_header_cell","Qk","maybe","colSpan","col_id","$text","css_call","isBody","isHeader","_on_header_click","_datatable_overlay","mapCells","startrow","startcol","numrows","numcols","col_ind","dj","qj","fillspace","textWaitDelay","summColumn","masterCheckbox","onclick","uncheck","textFilter","component","registerFilter","_comp_id","_on_key_down","Tk","_filter_timer","filterByAll","selectFilter","compare","collectValues","_on_change","Vk","serverFilter","serverSelectFilter","numberFilter","prepare","equality","intvalue","_greater","_lesser","_equal","Wk","Xk","Yk","dateFilter","reverse","datatable","record","originvalue","inputvalue","getFilter","checks","_collectValues","Zk","hover_setter","_hover_initialized","_last_hover","removeRowCss","hover","_delayed_hover_set","$w","select_setter","_selections","_commonselect","_k","$k","Lk","_reinit_selection","webix_cell","_click_before_select","_data_cleared","_selected_rows","_selected_areas","_select_key","_selected_pull","al","asArray","plain","hl","_clear_selection","_finalize_select","_post_select","il","clearSelection","ll","_post_unselect","jl","bl","_selectRange","_unselect","_select","pl","fl","kl","_add_item_select","ml","mapSelection","_mapSelection","ol","selectRange","end_row_id","row_start_ind","row_end_ind","end_column_id","col_start_ind","col_end_ind","column_start_ind","column_end_ind","blockselect_setter","_block_sel_flag","_bs_move","_bs_down","_bs_up","_bs_ready","_bs_progress","ql","wl","sl","_childOf","_bs_position","tl","_block_panel","_locate_cell_xy","Al","rl","progress","_bs_start","_setBlockPosition","Bl","x1","y1","x2","y2","startx","endx","starty","endy","zl","_key_property","_dragobj","_originobj","cursor","_moveev","_onmove","_upev","_onup","Il","_last_result","Gl","eventPos","resizeRow_setter","resizeColumn_setter","_rs_init_flag","_rs_move","_rs_down","_rs_up","Kl","Ml","_rs_ready","_rs_process","Nl","Ql","_rs_progress","resizearea","_rs_end","Sl","newsize","oldwidth","oldheight","Ll","_rs_start","element_class","in_body","in_header","resizeRow","resizeColumn","_cursor_timer","_mark_resize_ready","Ul","_last_cursor_mode","delimiter","sep","_split_clip_data","_substr_count","Wl","Xl","substring","arr","reg","TablePaste","_sel_to_clip","_clip_to_sel","Yl","_get_sel_text","$l","Zl","block","leftTop","_get_export_xml","grid","_get_export_scheme","_get_export_abstract","_get_export_data","add_column","allowed","_send_export","grid_xml","encodeURI","exportToPDF","exportToExcel","storage","local","localStorage","setItem","removeItem","session","sessionStorage","cookie","domain","expires","toUTCString","_l","check_name","a_all_cookies","a_temp_cookie","cookie_name","cookie_value","b_cookie_found","unescape","_get_cookie","cookies","DataState","cols_n","any_filter","hihash","_hidden_column_order","hideColumn","hikey","reorder","contentid","longTouchDelay","scrollDelay","deltaStep","speed","ellastic","_limited","_touchstart","_touchmove","_touchend","_fire_fast_event","_scroll","Of","_current_context","_prev_context","_scroll_mode","_scroll_node","_scroll_stat","_long_touched","_delta","sm","tm","um","_css_button_remove","_long_touch_timer","_was_not_moved","_axis_x","_axis_y","_active_transion","fm","_get_delta","$scroll","_time","_x_moment","_y_moment","cnx","_correct_minmax","cny","adjustScroll","_scroll_master","_sync_scroll","_set_scroll","_translate_event","click_event","em","_set_scroll_pos","_axis_check","_x","_get_event_view","scale","_init_scroller","Hm","Fm","edx","edy","Nf","xv","yv","_in_anim_frame","setAnimationFrame","trans","Mf","tmatrix","matrix","WebKitCSSMatrix","MSCSSMatrix","_tmatrix","tkey","_sync_pos","Cm","Nm","scroll_enabled","Lm","_create_scroll","_init_scroll_node","Om","dim","Im","_long_move","Pf","Pm","Qm","_stop_scroll","dm","_is_scroll","$touchCapture","_stop_old_scroll","_long_touch","Tm","Rm","stop_mode","Bm","Um","Sm","locate_mode","_get_sizes","Gm","Km","gm","hm","_get_context_m","pointerEnabled","msPointerEnabled","_get_context","table","_touchNative","_touch","scrollMode","Vm","$j","_j","Em","Mm","Wm","elastic","_fix_f","_adjustColumns","_resizeColumns","_m","_adjustColumn","an","fill","colfil","_fillColumnSize","request","dn","bn","_getColumnConfigSize","adjustColumn","adjustRowHeight","math_setter","_math_init","en","_parse_row_math","_parse_math","gn","_exprs_by_columns","_parse_cell_math","jn","_math_pref","_math_recalc","_calculate","_remove_old_triggers","depends","nn","hn","pn","math","_parse_relative_expr","qn","expr","$r","rn","ln","_in_math_trace","_start_math_trace","_to_math_trace","operations","_get_operations","triggers","_get_refs","_replace_refs","_parse_args","exc","_math_exception","_from_math_trace","_add_trigger","_compute","vn","splitter","wn","tmp","_trim","xn","dell","delr","cell_value","_get_calc_value","yn","op","_split_by","arg","Cn","temp_value","ex","En","after","Dn","tn","_math_trace","un","An","sn","Bn","mn","depend","zn","row_editors","col_settings","editFormat","editMath","liveValidation","_bind_live_validation","Gn","that","parser","editParse","_last_editor_scroll","editCell","editRow","eachColumn","editColumn","Gb","In","_ignore_after_focus_scroll","Kn","gi","_update_editor_y_pos","_correct_after_focus_y","_correct_after_focus_x","Ln","diff","_hidden_split","_hideInitialColumns","Nn","moveColumn","start_index","_refresh_columns","isColumnVisible","horder","hhash","_fixColspansHidden","xt","mod","On","showColumn","showColumnBatch","getHeaderNode","row_index","nodes","colindex","Zg","dragColumn_setter","_relative_column_drag","_limit_column_drag","_column_dnd_temp_block","end_index","_dragTarget","ah","_drag_column_last","_clear_invalid_css","addCellCss","Un","newmark","removeCellCss","TreeTableClick","TreeTablePaste","_unwrap_id","treetable","treecheckbox","Vn","original","Canvas","_canvas_labels","_canvas_name","devicePixelRatio","_prepareCanvas","Yn","_canvas","canvas_id","G_vmlCanvasManager","init_","initElement","getCanvas","ctx","_webixDevicePixelRatio","_n","renderText","renderTextAt","valign","c","clearCanvas","skipMap","areas","_getMapAreas","clearRect","toggleCanvas","_toggleCanvas","showCanvas","hideCanvas","bo","ao","co","toHex","number","_toHex","hexToDec","hex","toRgb","rgb","r","g","rgbArr","lastIndexOf","hsvToRgb","q","rgbToHsv","r0","g0","b0","min0","max0","HtmlMap","_map","addRect","points","userdata","_createMapArea","addPoly","fo","shape","coords","extra_data","addSector","alpha0","alpha1","ky","PI","cos","sin","_series","_legend_labels","preset","_definePreset","_switchSerie","alpha","lineColor","cant","barWidth","radius","borderColor","shadow","gradient","labelOffset","webix_chart_legend_item","series","legend","showSeries","hideSeries","canvases","_resizeCanvas","yAxis","xAxis","removeAllSeries","_legendObj","bounds","_createCanvas","_drawLegend","_getChartBounds","_getChartData","lastChild","_applyBounds","po","oo","axis","axisConfig","newData","valuesHash","series_setter","addSeries","value_setter","xValue_setter","yValue_setter","alpha_setter","label_setter","lineColor_setter","borderColor_setter","pieInnerText_setter","gradient_setter","colormap","RAINBOW","_rainbow","color_setter","fill_setter","io","preset_setter","presets","legend_setter","legendObj","item_setter","_converToTemplate","line_setter","padding_setter","xAxis_setter","templates","_configXAxis","yAxis_setter","bg","_configYAxis","ro","lo","uo","point0","point1","cellWidth","_drawYAxis","_drawXAxis","wo","unitPos","x0","y0","center","_drawXAxisLabel","_drawXAxisLine","_drawLine","vo","scaleParam","lineX","_calculateScale","_logScaleCalc","_setYAxisTitle","stepHeight","pow","fixNum","yi","power","_log10","corr","Co","_isIE","Fo","nmin","nmax","startPower","endPower","Ao","logMin","logMax","_calculateLogScale","calculStep","stepVal","absNmin","powerStart","nminVal","Go","orientation","maxValue","minValue","_obj_array","maxI","minI","Do","method_name","LN10","xo","yo","zo","strokeStyle","lineWidth","beginPath","moveTo","lineTo","stroke","Ho","relValue","valueFactor","qo","jo","tip","_active_serie","$hidden","mo","legendContainer","legendHeight","legendItems","legendWidth","itemColor","_drawLegendText","disableColor","_drawLegendMarker","restore","Jo","Ko","markerType","fillStyle","disableLines","globalAlpha","_strokeChartItem","_path","lineCap","no","chartX0","chartY0","chartX1","chartY1","No","$sum","Oo","hsv","color0","stops","createLinearGradient","_gradient","Qo","Po","addColorStop","Mo","Ro","sIndex","chart","$render_pie","_renderPie","So","coord","_getPieParameters","_getValues","totalValue","_getTotalValue","ratios","_getRatios","_addShadow","angles","_showRadialGradient","arc","pieInnerText","_drawSectorLabel","_createLowerSector","_getPositionByAngle","Uo","Vo","Wo","prevSum","To","$o","a1","a2","_drawSectorLine","pieHeight","_o","Xo","shadows","ap","Yo","createRadialGradient","_getGrayGradient","Zo","alpha2","in_width","corr_x","corr_y","left_end","left_start","$render_pie3D","$render_donut","pieRadius","innerRadius","$render_bar","limits","relativeValues","startValue","xax","yax","totalHeight","_getLimits","_drawScales","_getRelativeValue","seriesNumber","seriesIndex","barOffset","inner_gradient","_drawBar","_drawBarGradient","_drawBarBorder","ep","axisStart","bp","_correctBarParams","_setBarPoints","gp","_setBorderStyles","cp","gradParam","_setBarGradient","borderOffset","fp","skipBottom","angle_corr","cosA","acos","x3","y3","x5","$render_line","res1","res2","_calculateLineParams","_getPointY","fixOverflow","_calcOverflowX","_mapStart","_drawItem","lp","mapStart","alphas","areaPos","eventRadius","Lo","ip","hp","_getStackedLimits","$render_barH","innerGradient","totalWidth","_drawHScales","_drawBarHBorder","_drawBarH","_drawBarHGradient","qp","skipLeft","sinA","asin","y5","mp","_drawHXAxis","_drawHYAxis","sp","yAxisX","rp","yAxisStart","tp","_correctBarHParams","_setBarHPoints","np","pp","$render_stackedBar","total_height","$startY","_setStakedBarPoints","minY","$render_stackedBarH","total_width","$startX","$render_spline","sparam","_getSplineParameters","sY1","_getSplineYPoint","sY2","vp","wp","$render_area","mapRect","$render_stackedArea","a0","lastItem","yPos","setOffset","solveEquation","p0","p1","$render_radar","_renderRadarChart","xp","ratioUnits","_drawRadarAxises","_drawRadarData","zp","pos0","pos1","posArr","r1","startAlpha","value0","value1","unitArr","_fillRadarChart","_strokeRadarChart","disableItems","_drawRadarItemMarkers","Cp","Ap","Bp","yp","configY","configX","unitY","_drawScaleSector","lineShape","_drawRadarScaleLabel","Dp","pos2","closePath","Ep","$render_scatter","xValue","limitsY","limitsX","_getScatterParams","_drawScatterItem","Fp","_calcScatterUnit","Gp","_calculateScatterItemPosition","Ip","Hp","simple","plot","diamond","square","stick","monthSelect","weekHeader","skipEmptyWeeks","calendarHeader","calendarWeekHeader","events","minuteStep","dayTemplate","dayTemplate_setter","calendarHeader_setter","calendarWeekHeader_setter","calendarTime_setter","_calendarTime","date_setter","_string_to_date","maxDate_setter","minDate_setter","_special_dates","_selected_date_part","_selected_date","_zoom_in","cellHeight","_getDateBoundaries","_rows","Op","_set_date_bounds","month","year","days","Qp","Rp","Sp","Tp","_columnsHeight","_columnsWidth","containerWidth","containerHeight","_icons","columnsNumber","rowsNumber","icons_setter","_icons2","ax","Sx","webix_cal_icon_today","getSelectedDate","webix_cal_icon_clear","_zoom_size","_current_time","_getColumnConfigSizes","_week_template","_body_template","_timepicker_template","_icons_template","_changeZoomLevel","bx","Yp","calendarTime","Wp","widths","week_template","day_index","blockDates_setter","Zp","_month","blockDates","minDate","maxDate","Xp","_start","_day_css","$p","_zoom_logic","_changeStep","_changeDateInternal","bq","_update_zoom_level","showCalendar","aq","-2","dq","-1","0","_p","1","eq","fq","2","_zoom_start_date","setFullYear","cq","zlogic","sections","_reserve_box_height","_reserve_box_width","timeColNum","enLocale","_timeHeaderTemplate","_getCalSizesString","_timeButtonsTemplate","_getTitle","_getContent","lq","mq","kq","w1","w2","yt","nq","_setContent","zt","webix_cal_prev_button","_changeDate","webix_cal_next_button","webix_cal_day","_selectDate","webix_cal_time","webix_cal_done","webix_cal_month_name","webix_cal_block","_mode_selected","Jp","getVisibleDate","nameWidth","on_render","on_edit","webix_property_check","registerType","elements_setter","_idToLine","alter_type","_data_width","_clear","_props_dataset","qq","els","pre","palette","minLightness","maxLightness","sq","pal","_drawSelection","uq","vq","_selectBox","tq","_findIndex","_getSelectBox","wq","numToHex","rgbToHex","hslToRgb","hue2rgb","renderGrayBar","colCount","gray","colors","colorRows","colorStep","lightStep","colorRange","lt","renderRow","rowHtml","itemTpl","_initPalette","firstRow","_rsDown","_rsUp","_getResizeDir","_rs_started","_resizer_dir","_resizer_dim","marginRight","marginBottom","xq","_getResizerCells","_rsLimit","_rsStart","yq","Fq","posParent","_resizeStick","_rsEnd","_rsResizeHandler","zq","Iq","cDiff","limitSizes","totalSize","_rsGetDiffCellSizes","_rsGetLimitCellSizes","Dq","Hq","_resizerStick","_rsGetCellSizes","cell_size","actualSize","Kq","size1","size2","Jq","Mq","getActiveId","_back_queue","Oq","cell_id","view_id","_render_hash","_render_queue","Rq","Vx","_render_activation","cells_setter","Sq","vx","animation_options","getTabbar","_next_cell","_getDirection","callback_original","fitBiggest","other","_ask_render","back","viewId","Tq","separator","Kt","isobj","buttonText","$checked","itemText","on","onItemClick","getButton","_inputValue","changed","multisuggest","_render_value_block","_inputHeight","webix_multicombo_delete","_removeValue","Ay","isObj","yy","_inputWidth","Cy","listbox","_getValueListBox","textArr","_resizeToContent","Ey","inputEl","FieldRange","moveStart","elemLen","Dy","_calcHeight","topView","_typing","_focusAtEnd","Iy","visibility","_calcInputWidth","_backspaceTime","_hide_sub_menu","_mouse_move_menu","_menu_was_activated","openAction","_child_menu_active","getTopMenu","submenu","_mouse_move_activation","_hide_on_item_click","_hidden_items","_parent_menu","subsign","templateSeparator","templateSpacer","getMenu","subid","_get_submenu","getSubMenu","menu","getMenuItem","br","_create_sub_menu","Vq","Wq","_open_sub_menu","Yq","subMenuPos","disableItem","enableItem","hideItem","_set_item_hidden","Uq","_show_on_mouse_out","cr","listConfig","submenuConfig","parentData","_dummy_cell_interface","hr","ContextHelper","attachTo","_show_at_ui","_show_at_node","jr","_show_at","ir","kr","gr","master_setter","$q","topOffset","bottomOffset","tabMinWidth","tabMoreWidth","ut","limitWidth","tabbarPopup","popupConfig","popupTemplate","moreTemplate_setter","popupTemplate_setter","moreTemplate","contentWidth","leafWidth","resultHTML","verticalOffset","tabs","_getTabbarSizes","displayTabs","lastTab","_getTabHTML","vt","_tabTemplate","calcHeight","segmented","getMultiview","_init_tabview_handlers","tabbar","mview","Nv","mr","_copy_inner_content","_default_values","pc","querySelectorAll","_parse_inputs","_tagname","_attribute","_get_html_value","_set_html_value","querySelector","cleared","or","pr","qr","tagname","_get_value","sr","textarea","selectedIndex","rr","_set_value","firstElementChild","_pull","DataProcessor","masterId","autoupdate","updateFromResponse","operationName","trackMove","_ignore","_updates","_onStoreUpdated","_onDataMove","off","Cr","_save_inner","Dr","_copy_data","_invalid","_check_unique","Br","webix_move_index","webix_move_id","webix_move_parent","Ar","Fr","one","_sendData","Gr","marked","to_send","tosave","_in_progress","precise_url","_updatesData","_send_callback","Ir","at","_processResult","attachProgress","_innerProcessResult","Jr","getItemState","setItemState","_get_stack_index","bt","jsonp","script","vals","markup","namespace","attribute","dataTag","Ys","Zs","Lr","Mr","_get_core_els","_sub_markup","_initComponent","Pr","_view_has_method","Nr","_full_prefix","_full_prefix_top","_get_html_tops","Sr","tags","Or","_get_name","childs","is_layout","subs","has_tags","allow_sub_tags","_handle_data","_get_config_html","confignode","_tag_to_json","_dash","_after_dash","_attrs_to_json","_content","Zr","Vr","Tr","scopeName","_markup_names","Ur","rec","Yr","Wr","Xr","_parse_int","usercall","modality","_webix_msg_cfg","modal_key","keyboard","cover","onkeydown","expire","timers","_boxStructure","_createBox","modalbox","alertPopup","confirmPopup","boxPopup","box_params","alert","confirm","seed","hideAll","_layout","_initLayout","Gt","layoutConfig","carousel","_setScroll","getLayout","_nextCell","marginLeft","showNext","showPrev","getActiveIndex","layoutSizes","selfSizes","yc","xc","Ht","activeCell","setActive","percent","removeIcon","webix_remove_upload","uploader","files","UploadDriver","flash","swfobject","swfId","_upload_area","embedSWF","uploaderId","ID","enableLogs","paramName","multiple","wmode","getFlashPlayerVersion","now_date","_upload_timer_click","fileDialog","_stop_file","$applyFlash","getSwfObject","getObjectById","showDialog","_last_assigned_upload_callback","complete","_upload_complete","upload","formData","$beforeAddFileToQueue","_format_size","sizetext","$addFileToQueue","file_struct","autosend","stopUpload","uploadStop","$onUploadSuccess","$onUploadFail","html5","input_config","tabindex","accept","_drop","_add_files","bs","dataTransfer","_last_file_context","FormData","append","$updateProgress","loaded","onload","_file_complete","is","_complete","addFile","link_setter","addDropZone","ks","js","isUploaded","gs","addMeta","new_orientation","matchMedia","addListener","fullScreen","iphone","iOS7","iphone_safari","iphone5","screen","fix","overflow","dmod","outerWidth","outerHeight","onrotate","jQuery","$","methods","get_id","get_helper","temp_data","run","history","track","_init_state","_ignored","ns","new_url","pushState","ls","_set_state","location","_body_view","_last_body_size","_handle_id","title_setter","rs","_get_slider_handle","part","_on_mouse_down_start","ss","_mouse_down_process","_start_value","_start_handle_dnd","_get_value_from_event","ts","_handle_drag_events","_handle_move_process","_handle_move_stop","ws","us","touchContext","_get_value_from_pos","offline","cache","zs","As","mycallback","getCache","_is_offline","_is_online","setCache","_data_name","clearCache","Bs","angular","id_helper","$element","directive","$parse","restrict","$attrs","dataname","wxRoot","watcher","root","$watch","tmp_a","wrap_helper","eventobj","trim","$watchCollection","Backbone","_start_ext_load","cal","_backbone_loading","_finish_ext_load","cfg","use_id","wData","bData","whandlers","_sync_backbone_events","sanitize","_get_id","model","datareset","copymodel","Collection","trigger","upd","WebixView","View","initialize","beforeRender","getRoot","getChild","ActiveContent","activeContent","_init_active_content_list","_active_holders","_active_holders_item","_active_holders_values","_active_references","_bind_active_content","earlyInit","Ds","_locate_active_content_by_id","masterUI","Js","button_id","Ks","$masterId","Ls","outerHTML","XMLSerializer","serializeToString","Is","_get_active_node","_set_new_active_value","ProgressBar","_progress","showProgress","hideProgress","incss","_progress_delay","_progressTimer","clearInterval","setInterval","_init_video","Ms","autobuffer","poster","autoplay","getVideo"],"mappings":"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"} \ No newline at end of file diff --git a/static/webix/codebase/webix_debug.js b/static/webix/codebase/webix_debug.js new file mode 100644 index 0000000..7edfb26 --- /dev/null +++ b/static/webix/codebase/webix_debug.js @@ -0,0 +1,31050 @@ +/* +@license +webix UI v.2.4.5 +This software is allowed to use under GPL or you need to obtain Commercial License + to use it in non-GPL project. Please contact sales@webix.com for details +*/ +if (!window.webix) + webix={}; + +//check some rule, show message as error if rule is not correct +webix.assert = function(test, message){ + if (!test){ + webix.assert_error(message); + } +}; + +webix.assert_config = function(obj){ + var coll = obj.cells || obj.rows || obj.elements || obj.cols; + if (coll) + for (var i=0; i1){ + target = arguments[0]; + source = arguments[1]; + } else + target = (webix.isArray(source)?[]:{}); + + for (var method in source){ + if(source[method] && typeof source[method] == "object" && !webix.isDate(source[method])){ + target[method] = (webix.isArray(source[method])?[]:{}); + webix.copy(target[method],source[method]); + }else{ + target[method] = source[method]; + } + } + + webix.assert_level_out(); + return target; +}; + + +webix.single = function(source){ + var instance = null; + var t = function(config){ + if (!instance) + instance = new source({}); + + if (instance._reinit) + instance._reinit.apply(instance, arguments); + return instance; + }; + return t; +}; + +webix.protoUI = function(){ + if (webix.debug_proto) + webix.log("UI registered: "+arguments[0].name); + + var origins = arguments; + var selfname = origins[0].name; + + var t = function(data){ + if (!t) + return webix.ui[selfname].prototype; + + var origins = t._webix_proto_wait; + if (origins){ + var params = [origins[0]]; + + for (var i=1; i < origins.length; i++){ + params[i] = origins[i]; + + if (params[i]._webix_proto_wait) + params[i] = params[i].call(webix, params[i].name); + + if (params[i].prototype && params[i].prototype.name) + webix.ui[params[i].prototype.name] = params[i]; + } + webix.ui[selfname] = webix.proto.apply(webix, params); + + if (t._webix_type_wait) + for (var i=0; i < t._webix_type_wait.length; i++) + webix.type(webix.ui[selfname], t._webix_type_wait[i]); + + t = origins = null; + } + + if (this != webix) + return new webix.ui[selfname](data); + else + return webix.ui[selfname]; + }; + t._webix_proto_wait = Array.prototype.slice.call(arguments, 0); + return (webix.ui[selfname]=t); +}; + +webix.proto = function(){ + + if (webix.debug_proto) + webix.log("Proto chain:"+arguments[0].name+"["+arguments.length+"]"); + + var origins = arguments; + var compilation = origins[0]; + var has_constructor = !!compilation.$init; + var construct = []; + + webix.assert(compilation,"Invalid mixing target"); + + for (var i=origins.length-1; i>0; i--) { + webix.assert(origins[i],"Invalid mixing source"); + if (typeof origins[i]== "function") + origins[i]=origins[i].prototype; + if (origins[i].$init) + construct.push(origins[i].$init); + if (origins[i].defaults){ + var defaults = origins[i].defaults; + if (!compilation.defaults) + compilation.defaults = {}; + for (var def in defaults) + if (webix.isUndefined(compilation.defaults[def])) + compilation.defaults[def] = defaults[def]; + } + if (origins[i].type && compilation.type){ + for (var def in origins[i].type) + if (!compilation.type[def]) + compilation.type[def] = origins[i].type[def]; + } + + for (var key in origins[i]){ + if (!compilation[key] && compilation[key] !== false) + compilation[key] = origins[i][key]; + } + } + + if (has_constructor) + construct.push(compilation.$init); + + + compilation.$init = function(){ + for (var i=0; i handler + this._evs_handlers = {}; //hash of event handlers, ID => handler + this._evs_map = {}; + } + }, + //temporary block event triggering + blockEvent : function(){ + this._evs_events._block = true; + }, + //re-enable event triggering + unblockEvent : function(){ + this._evs_events._block = false; + }, + mapEvent:function(map){ + webix.extend(this._evs_map, map, true); + }, + on_setter:function(config){ + if(config){ + for(var i in config){ + var method = webix.toFunctor(config[i], this.$scope); + var sub = i.indexOf("->"); + if (sub !== -1){ + this[i.substr(0,sub)].attachEvent(i.substr(sub+2), webix.bind(method, this)); + } else + this.attachEvent(i, method); + } + } + }, + //trigger event + callEvent:function(type,params){ + if (this._evs_events._block) return true; + + type = type.toLowerCase(); + var event_stack =this._evs_events[type.toLowerCase()]; //all events for provided name + var return_value = true; + + if (webix.log) + if ((webix.debug || this.debug) && !webix.debug_blacklist[type]) //can slowdown a lot + webix.log("info","["+this.name+"@"+((this._settings||{}).id)+"] event:"+type,params); + + if (event_stack) + for(var i=0; i=0) this.splice(pos,(len||1)); + }, + //find element in collection and remove it + remove:function(value){ + this.removeAt(this.find(value)); + }, + //add element to collection at specific position + insertAt:function(data,pos){ + if (!pos && pos!==0) //add to the end by default + this.push(data); + else { + var b = this.splice(pos,(this.length-pos)); + this[pos] = data; + this.push.apply(this,b); //reconstruct array without loosing this pointer + } + }, + //return index of element, -1 if it doesn't exists + find:function(data){ + for (var i=0; i -1){ + webix.env.cssPrefix = css_list[found_index]; + var jp = webix.env.jsPrefix = js_list[found_index]; + + webix.env.transform = jp ? jp+"Transform" : "transform"; + webix.env.transition = jp ? jp+"Transition" : "transition"; + webix.env.transitionDuration = jp ? jp+"TransitionDuration" : "transitionDuration"; + + d.style[webix.env.transform] = "translate3d(0,0,0)"; + webix.env.translate = (d.style[webix.env.transform])?"translate3d":"translate"; + webix.env.transitionEnd = ((webix.env.cssPrefix == '-Moz-')?"transitionend":(jp ? jp+"TransitionEnd" : "transitionend")); + } + +})(); + + +webix.env.svg = (function(){ + return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"); +})(); + + +//html helpers +webix.html={ + _native_on_selectstart:0, + denySelect:function(){ + if (!webix._native_on_selectstart) + webix._native_on_selectstart = document.onselectstart; + document.onselectstart = webix.html.stopEvent; + }, + allowSelect:function(){ + if (webix._native_on_selectstart !== 0){ + document.onselectstart = webix._native_on_selectstart||null; + } + webix._native_on_selectstart = 0; + + }, + index:function(node){ + var k=0; + //must be =, it is not a comparation! + while ((node = node.previousSibling)) k++; + return k; + }, + _style_cache:{}, + createCss:function(rule){ + var text = ""; + for (var key in rule) + text+= key+":"+rule[key]+";"; + + var name = this._style_cache[text]; + if (!name){ + name = "s"+webix.uid(); + this.addStyle("."+name+"{"+text+"}"); + this._style_cache[text] = name; + } + return name; + }, + addStyle:function(rule){ + var style = this._style_element; + if(!style){ + style = this._style_element = document.createElement("style"); + style.setAttribute("type", "text/css"); + style.setAttribute("media", "screen"); + document.getElementsByTagName("head")[0].appendChild(style); + } + /*IE8*/ + if (style.styleSheet) + style.styleSheet.cssText += rule; + else + style.appendChild(document.createTextNode(rule)); + }, + create:function(name,attrs,html){ + attrs = attrs || {}; + var node = document.createElement(name); + for (var attr_name in attrs) + node.setAttribute(attr_name, attrs[attr_name]); + if (attrs.style) + node.style.cssText = attrs.style; + if (attrs["class"]) + node.className = attrs["class"]; + if (html) + node.innerHTML=html; + return node; + }, + //return node value, different logic for different html elements + getValue:function(node){ + node = webix.toNode(node); + if (!node) return ""; + return webix.isUndefined(node.value)?node.innerHTML:node.value; + }, + //remove html node, can process an array of nodes at once + remove:function(node){ + if (node instanceof Array) + for (var i=0; i < node.length; i++) + this.remove(node[i]); + else if (node && node.parentNode) + node.parentNode.removeChild(node); + }, + //insert new node before sibling, or at the end if sibling doesn't exist + insertBefore: function(node,before,rescue){ + if (!node) return; + if (before && before.parentNode) + before.parentNode.insertBefore(node, before); + else + rescue.appendChild(node); + }, + //return custom ID from html element + //will check all parents starting from event's target + locate:function(e,id){ + var trg; + if (e.tagName) + trg = e; + else { + e=e||event; + trg=e.target||e.srcElement; + } + + while (trg){ + if (trg.getAttribute){ //text nodes has not getAttribute + var test = trg.getAttribute(id); + if (test) return test; + } + trg=trg.parentNode; + } + return null; + }, + //returns position of html element on the page + offset:function(elem) { + if (elem.getBoundingClientRect) { //HTML5 method + var box = elem.getBoundingClientRect(); + var body = document.body; + var docElem = document.documentElement; + var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop; + var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft; + var clientTop = docElem.clientTop || body.clientTop || 0; + var clientLeft = docElem.clientLeft || body.clientLeft || 0; + var top = box.top + scrollTop - clientTop; + var left = box.left + scrollLeft - clientLeft; + return { y: Math.round(top), x: Math.round(left), width:elem.offsetWidth, height:elem.offsetHeight }; + } else { //fallback to naive approach + var top=0, left=0; + while(elem) { + top = top + parseInt(elem.offsetTop,10); + left = left + parseInt(elem.offsetLeft,10); + elem = elem.offsetParent; + } + return { y: top, x: left, width:elem.offsetHeight, height:elem.offsetWidth }; + } + }, + //returns relative position of event + posRelative:function(ev){ + ev = ev || event; + if (!webix.isUndefined(ev.offsetX)) + return { x:ev.offsetX, y:ev.offsetY }; //ie, webkit + else + return { x:ev.layerX, y:ev.layerY }; //firefox + }, + //returns position of event + pos:function(ev){ + ev = ev || event; + if (ev.touches && ev.touches[0]) + ev = ev.touches[0]; + + if(ev.pageX || ev.pageY) //FF, KHTML + return {x:ev.pageX, y:ev.pageY}; + //IE + var d = ((webix.env.isIE)&&(document.compatMode != "BackCompat"))?document.documentElement:document.body; + return { + x:ev.clientX + d.scrollLeft - d.clientLeft, + y:ev.clientY + d.scrollTop - d.clientTop + }; + }, + //prevent event action + preventEvent:function(e){ + if (e && e.preventDefault) e.preventDefault(); + if(e) e.returnValue = false; + return webix.html.stopEvent(e); + }, + //stop event bubbling + stopEvent:function(e){ + (e||event).cancelBubble=true; + return false; + }, + //add css class to the node + addCss:function(node,name,check){ + if (!check || node.className.indexOf(name) === -1) + node.className+=" "+name; + }, + //remove css class from the node + removeCss:function(node,name){ + node.className=node.className.replace(RegExp(" "+name,"g"),""); + } +}; + +webix.ready = function(code){ + if (this._ready) code.call(); + else this._ready_code.push(code); +}; +webix.debug_ready = webix.ready; //same command but will work only in dev. build +webix._ready_code = []; + +//autodetect codebase folder +(function(){ + var temp = document.getElementsByTagName("SCRIPT"); //current script, most probably + webix.assert(temp.length,"Can't locate codebase"); + if (temp.length){ + //full path to script + temp = (temp[temp.length-1].getAttribute("src")||"").split("/"); + //get folder name + temp.splice(temp.length-1, 1); + webix.codebase = temp.slice(0, temp.length).join("/")+"/"; + } + + var ready = function(){ + if(webix.env.isIE) + document.body.className += " webix_ie"; + webix.callEvent("onReady",[]); + }; + + var doit = function(){ + webix._ready = true; + + //global plugins + if (window.webix_ready && webix.isArray(webix_ready)) + webix._ready_code = webix_ready.concat(webix._ready_code); + + for (var i=0; i < webix._ready_code.length; i++) + webix._ready_code[i].call(); + webix._ready_code=[]; + }; + + webix.attachEvent("onReady", function(force){ + if (force) + doit(); + else + webix.delay(doit); + }); + + if (document.readyState == "complete") ready(); + else webix.event(window, "load", ready); + +})(); + +webix.locale=webix.locale||{}; + + +webix.assert_core_ready(); + + +webix.ready(function(){ + webix.event(document.body,"click", function(e){ + webix.callEvent("onClick",[e||event]); + }); +}); +webix.editStop = function(){ + webix.callEvent("onEditEnd", []); +}; + + +webix.debug_blacklist={ + onmousemoving:1 +}; +//Bazed on Promiz +//A fast Promises/A+ library +//Author: https://github.com/Zolmeister/promiz +//License: MIT + +/* jshint ignore:start */ +(function (self) { + var now = typeof setImmediate !== 'undefined' ? setImmediate : function(cb) { + setTimeout(cb, 0) + } + + /** + * @constructor + */ + function promise(fn, er) { + var self = this + + self.promise = self + self.state = 'pending' + self.val = null + self.fn = fn || null + self.er = er || null + self.next = []; + } + + promise.prototype.resolve = function (v) { + var self = this + if (self.state === 'pending') { + self.val = v + self.state = 'resolving' + + now(function () { + self.fire() + }) + } + } + + promise.prototype.reject = function (v) { + var self = this + if (self.state === 'pending') { + self.val = v + self.state = 'rejecting' + + now(function () { + self.fire() + }) + } + } + + promise.prototype.then = function (fn, er) { + var self = this + var p = new promise(fn, er) + self.next.push(p) + if (self.state === 'resolved') { + p.resolve(self.val) + } + if (self.state === 'rejected') { + p.reject(self.val) + } + return p + } + promise.prototype.fail = function (er) { + return this.then(null, er) + } + promise.prototype.finish = function (type) { + var self = this + self.state = type + + if (self.state === 'resolved') { + for (var i = 0; i < self.next.length; i++) + self.next[i].resolve(self.val); + } + + if (self.state === 'rejected') { + for (var i = 0; i < self.next.length; i++) + self.next[i].reject(self.val); + + if (webix.assert && !self.next.length) + throw(self.val); + } + } + + // ref : reference to 'then' function + // cb, ec, cn : successCallback, failureCallback, notThennableCallback + promise.prototype.thennable = function (ref, cb, ec, cn, val) { + var self = this + val = val || self.val + if (typeof val === 'object' && typeof ref === 'function') { + try { + // cnt protects against abuse calls from spec checker + var cnt = 0 + ref.call(val, function(v) { + if (cnt++ !== 0) return + cb(v) + }, function (v) { + if (cnt++ !== 0) return + ec(v) + }) + } catch (e) { + ec(e) + } + } else { + cn(val) + } + } + + promise.prototype.fire = function () { + var self = this + // check if it's a thenable + var ref; + try { + ref = self.val && self.val.then + } catch (e) { + self.val = e + self.state = 'rejecting' + return self.fire() + } + + self.thennable(ref, function (v) { + self.val = v + self.state = 'resolving' + self.fire() + }, function (v) { + self.val = v + self.state = 'rejecting' + self.fire() + }, function (v) { + self.val = v + + if (self.state === 'resolving' && typeof self.fn === 'function') { + try { + self.val = self.fn.call(undefined, self.val) + } catch (e) { + self.val = e + return self.finish('rejected') + } + } + + if (self.state === 'rejecting' && typeof self.er === 'function') { + try { + self.val = self.er.call(undefined, self.val) + self.state = 'resolving' + } catch (e) { + self.val = e + return self.finish('rejected') + } + } + + if (self.val === self) { + self.val = TypeError() + return self.finish('rejected') + } + + self.thennable(ref, function (v) { + self.val = v + self.finish('resolved') + }, function (v) { + self.val = v + self.finish('rejected') + }, function (v) { + self.val = v + self.state === 'resolving' ? self.finish('resolved') : self.finish('rejected') + }) + + }) + } + + promise.prototype.done = function () { + if (this.state = 'rejected' && !this.next) { + throw this.val + } + return null + } + + promise.prototype.nodeify = function (cb) { + if (typeof cb === 'function') return this.then(function (val) { + try { + cb(null, val) + } catch (e) { + setImmediate(function () { + throw e + }) + } + + return val + }, function (val) { + try { + cb(val) + } catch (e) { + setImmediate(function () { + throw e + }) + } + + return val + }) + + return this + } + + promise.prototype.spread = function (fn, er) { + return this.all().then(function (list) { + return typeof fn === 'function' && fn.apply(null, list) + }, er) + } + + promise.prototype.all = function() { + var self = this + return this.then(function(list){ + var p = new promise() + if(!(list instanceof Array)) { + p.reject(TypeError) + return p + } + + var cnt = 0 + var target = list.length + + function done() { + if (++cnt === target) p.resolve(list) + } + + for(var i=0, l=list.length; i": ">", + '"': """, + "'": "'", + "`": "`" +}; +var badChars = /[&<>"'`]/g; +var escapeChar = function(chr) { + return escape[chr] || "&"; +}; + + +webix.template = function(str){ + if (typeof str == "function") return str; + if (_cache[str]) + return _cache[str]; + + str=(str||"").toString(); + if (str.indexOf("->")!=-1){ + var teststr = str.split("->"); + switch(teststr[0]){ + case "html": //load from some container on the page + str = webix.html.getValue(teststr[1]); + break; + case "http": //load from external file + str = new webix.ajax().sync().get(teststr[1],{uid:webix.uid()}).responseText; + break; + default: + //do nothing, will use template as is + break; + } + } + + //supported idioms + // {obj.attr} => named attribute or value of sub-tag in case of xml + str=(str||"").toString(); + + // Content Security Policy enabled + if(webix.env.strict){ + if (!_csp_cache[str]){ + _csp_cache[str] = []; + + // get an array of objects (not sorted by position) + var temp_res = []; + str.replace(/\{obj\.([^}?]+)\?([^:]*):([^}]*)\}/g,function(search,s1,s2,s3,pos){ + temp_res.push({pos: pos, str: search, fn: function(obj,common){ + return obj[s1]?s2:s3; + }}); + }); + str.replace(/\{common\.([^}\(]*)\}/g,function(search,s,pos){ + temp_res.push({pos: pos, str: search, fn: function(obj,common){ + return common[s]||''; + }}); + }); + str.replace(/\{common\.([^\}\(]*)\(\)\}/g,function(search,s,pos){ + temp_res.push({pos: pos, str: search, fn: function(obj,common){ + return (common[s]?common[s].apply(this, arguments):""); + }}); + }); + str.replace(/\{obj\.([^:}]*)\}/g,function(search,s,pos){ + temp_res.push({pos: pos, str: search, fn: function(obj,common){ + return obj[s]; + }}); + }); + str.replace("{obj}",function(search,s,pos){ + temp_res.push({pos: pos, str: search, fn: function(obj,common){ + return obj; + }}); + }); + str.replace(/#([^#'";, ]+)#/gi,function(search,s,pos){ + if(s.charAt(0)=="!"){ + temp_res.push({pos: pos, str: search, fn: function(obj,common){ + return webix.template.escape(obj[s.substr(1)]); + }}); + } + else{ + temp_res.push({pos: pos, str: search, fn: function(obj,common){ + return obj[s]; + }}); + } + + }); + + // sort template parts by position + temp_res.sort(function(a,b){ + return (a.pos > b.pos)?1:-1; + }); + + // create an array of functions that return parts of html string + if(temp_res.length){ + var lastPos = 0; + var addStr = function(str,n0,n1){ + _csp_cache[str].push(function(){ + return str.slice(n0,n1); + }); + }; + for(var i = 0; i< temp_res.length; i++){ + var pos = temp_res[i].pos; + addStr(str,lastPos,pos); + _csp_cache[str].push(temp_res[i].fn); + lastPos = pos + temp_res[i].str.length; + } + addStr(str,lastPos,str.length); + } + else + _csp_cache[str].push(function(){return str;}); + } + return function(){ + var s = ""; + for(var i=0; i < _csp_cache[str].length;i++){ + s += _csp_cache[str][i].apply(this,arguments); + } + return s; + }; + } + + str=str.replace(slashes,"\\\\"); + str=str.replace(newlines,"\\n"); + str=str.replace(quotes,"\\\""); + + str=str.replace(/\{obj\.([^}?]+)\?([^:]*):([^}]*)\}/g,"\"+(obj.$1?\"$2\":\"$3\")+\""); + str=str.replace(/\{common\.([^}\(]*)\}/g,"\"+(common.$1||'')+\""); + str=str.replace(/\{common\.([^\}\(]*)\(\)\}/g,"\"+(common.$1?common.$1.apply(this, arguments):\"\")+\""); + str=str.replace(/\{obj\.([^}]*)\}/g,"\"+(obj.$1)+\""); + str=str.replace("{obj}","\"+obj+\""); + str=str.replace(/#([^#'";, ]+)#/gi,function(str, key){ + if (key.charAt(0)=="!") + return "\"+webix.template.escape(obj."+key.substr(1)+")+\""; + else + return "\"+(obj."+key+")+\""; + }); + + try { + _cache[str] = Function("obj","common","return \""+str+"\";"); + } catch(e){ + webix.assert_error("Invalid template:"+str); + } + + return _cache[str]; +}; + + + +webix.template.escape = function(str){ + if (str === webix.undefined || str === null) return ""; + return (str.toString() || "" ).replace(badChars, escapeChar); +}; +webix.template.empty=function(){ return ""; }; +webix.template.bind =function(value){ return webix.bind(webix.template(value),this); }; + + + /* + adds new template-type + obj - object to which template will be added + data - properties of template + */ +webix.type=function(obj, data){ + if (obj._webix_proto_wait){ + if (!obj._webix_type_wait) + obj._webix_type_wait = []; + obj._webix_type_wait.push(data); + return; + } + + //auto switch to prototype, if name of class was provided + if (typeof obj == "function") + obj = obj.prototype; + if (!obj.types){ + obj.types = { "default" : obj.type }; + obj.type.name = "default"; + } + + var name = data.name; + var type = obj.type; + if (name) + type = obj.types[name] = webix.clone(data.baseType?obj.types[data.baseType]:obj.type); + + for(var key in data){ + if (key.indexOf("template")===0) + type[key] = webix.template(data[key]); + else + type[key]=data[key]; + } + + return name; +}; + +})(); + + +webix.Settings={ + $init:function(){ + /* + property can be accessed as this.config.some + in same time for inner call it have sense to use _settings + because it will be minified in final version + */ + this._settings = this.config= {}; + }, + define:function(property, value){ + if (typeof property == "object") + return this._parseSeetingColl(property); + return this._define(property, value); + }, + _define:function(property,value){ + //method with name {prop}_setter will be used as property setter + //setter is optional + var setter = this[property+"_setter"]; + return (this._settings[property]=setter?setter.call(this,value,property):value); + }, + //process configuration object + _parseSeetingColl:function(coll){ + if (coll){ + for (var a in coll) //for each setting + this._define(a,coll[a]); //set value through config + } + }, + //helper for object initialization + _parseSettings:function(obj,initial){ + //initial - set of default values + var settings = {}; + if (initial) + settings = webix.extend(settings,initial); + + //code below will copy all properties over default one + if (typeof obj == "object" && !obj.tagName) + webix.extend(settings,obj, true); + //call config for each setting + this._parseSeetingColl(settings); + }, + _mergeSettings:function(config, defaults){ + for (var key in defaults) + switch(typeof config[key]){ + case "object": + config[key] = this._mergeSettings((config[key]||{}), defaults[key]); + break; + case "undefined": + config[key] = defaults[key]; + break; + default: //do nothing + break; + } + return config; + } +}; +/* + ajax operations + + can be used for direct loading as + webix.ajax(ulr, callback) + or + webix.ajax().getItem(url) + webix.ajax().post(url) + +*/ + + + + + +webix.proxy = function(name, source){ + webix.assert(webix.proxy[name], "Invalid proxy name: "+name); + + var copy = webix.copy(webix.proxy[name]); + copy.source = source; + if (copy.init) copy.init(); + return copy; +}; + +webix.proxy.post = { + $proxy:true, + load:function(view, callback){ + webix.ajax().bind(view).post(this.source, this.params || {}, callback); + } +}; + +webix.proxy.sync = { + $proxy:true, + load:function(view, callback){ + webix.ajax().sync().bind(view).get(this.source, null, callback); + } +}; + +webix.proxy.connector = { + $proxy:true, + + connectorName:"!nativeeditor_status", + load:function(view, callback){ + webix.ajax(this.source, callback, view); + }, + saveAll:function(view, updates, dp, callback){ + var url = this.source; + + var data = {}; + var ids = []; + for (var i = 0; i < updates.length; i++) { + var action = updates[i]; + ids.push(action.id); + + for (var j in action.data) + if (j.indexOf("$")!==0) + data[action.id+"_"+j] = action.data[j]; + data[action.id+"_"+this.connectorName] = action.operation; + } + + data.ids = ids.join(","); + data.webix_security = webix.securityKey; + + url += (url.indexOf("?") == -1) ? "?" : "&"; + url += "editing=true"; + + webix.ajax().post(url, data, callback); + }, + result:function(state, view, dp, text, data, loader){ + data = data.xml(); + if (!data) + return dp._processError(null, text, data, loader); + + + var actions = data.data.action; + if (!actions.length) + actions = [actions]; + + + var hash = []; + + for (var i = 0; i < actions.length; i++) { + var obj = actions[i]; + hash.push(obj); + + obj.status = obj.type; + obj.id = obj.sid; + obj.newid = obj.tid; + + dp.processResult(obj, obj, {text:text, data:data, loader:loader}); + } + + return hash; + } +}; + +webix.proxy.debug = { + $proxy:true, + load:function(){}, + save:function(v,u,d,c){ + webix.delay(function(){ + window.console.log("[DP] "+u.id+" -> "+u.operation, u.data); + var data = { + id:u.data.id, + newid:u.data.id, + status:u.data.operation + }; + d.processResult(data, data); + }); + } +}; + +webix.proxy.rest = { + $proxy:true, + load:function(view, callback){ + webix.ajax(this.source, callback, view); + }, + save:function(view, update, dp, callback){ + var url = this.source; + url += url.charAt(url.length-1) == "/" ? "" : "/"; + var mode = update.operation; + + var data = update.data; + if (mode == "insert") delete data.id; + + //call rest URI + if (mode == "update"){ + webix.ajax().put(url + data.id, data, callback); + } else if (mode == "delete") { + webix.ajax().del(url + data.id, data, callback); + } else { + webix.ajax().post(url, data, callback); + } + } +}; + + +webix.proxy.faye = { + $proxy:true, + init:function(){ + this.clientId = this.clientId || webix.uid(); + }, + load:function(view){ + var selfid = this.clientId; + + this.client.subscribe(this.source, function(update){ + if (update.clientId == selfid) return; + + webix.dp(view).ignore(function(){ + if (update.operation == "delete") + view.remove(update.data.id); + else if (update.operation == "insert") + view.add(update.data); + else if (update.operation == "update"){ + var item = view.getItem(update.data.id); + if (item){ + webix.extend(item, update.data, true); + view.refresh(item.id); + } + } + }); + }); + }, + save:function(view, update, dp, callback){ + update.clientId = this.clientId; + this.client.publish(this.source, update); + } +}; + +//indexdb->database/collection +webix.proxy.indexdb = { + $proxy:true, + create:function(db, config, version, callback){ + this.source = db + "/"; + this._get_db(callback, version, function(e){ + var db = e.target.result; + for (var key in config){ + var data = config[key]; + var store = db.createObjectStore(key, { keyPath: "id", autoIncrement:true }); + for (var i = 0; i < data.length; i++) + store.put(data[i]); + } + }); + }, + _get_db:function(callback, version, upgrade){ + if (this.source.indexOf("/") != -1){ + var parts = this.source.split("/"); + this.source = parts[1]; + version = version || parts[2]; + + var _index = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB; + + var db; + if (version) + db = _index.open(parts[0], version); + else + db = _index.open(parts[0]); + + if (upgrade) + db.onupgradeneeded = upgrade; + db.onerror = function(){ }; + db.onblocked = function(){ }; + db.onsuccess = webix.bind(function(e){ + this.db = e.target.result; + if (callback) + callback.call(this); + },this); + } else if (this.db) + callback.call(this); + else + webix.delay(this._get_db, this, [callback], 50); + }, + + load:function(view, callback){ + this._get_db(function(){ + var store = this.db.transaction(this.source).objectStore(this.source); + var data = []; + + store.openCursor().onsuccess = function(e) { + var result = e.target.result; + if(result){ + data.push(result.value); + result["continue"](); + } else { + view.parse(data); + webix.ajax.$callback(view, callback, "[]", data); + } + }; + }); + }, + save:function(view, update, dp, callback){ + this._get_db(function(){ + var mode = update.operation; + var data = update.data; + var id = update.id; + + var store = this.db.transaction([this.source], "readwrite").objectStore(this.source); + + var req; + if (mode == "delete") + req = store["delete"](id); + else if (mode == "update") + req = store.put(data); + else if (mode == "insert"){ + delete data.id; + req = store.add(data); + } + + req.onsuccess = function(e) { + var result = { status: mode, id:update.id }; + if (mode == "insert") + result.newid = e.target.result; + dp.processResult(result, result); + }; + }); + } +}; + +webix.ajax = function(url,params,call,master){ + //if parameters was provided - made fast call + if (arguments.length!==0) + return (new webix.ajax()).get(url,params,call,master); + + if (!this.getXHR) return new webix.ajax(); //allow to create new instance without direct new declaration + + return this; +}; +webix.ajax.count = 0; +webix.ajax.prototype={ + master:null, + //creates xmlHTTP object + getXHR:function(){ + if (webix.env.isIE){ + return new ActiveXObject("Microsoft.xmlHTTP"); + } + else + return new XMLHttpRequest(); + }, + stringify:function(obj){ + var origin = Date.prototype.toJSON; + Date.prototype.toJSON = function(){ + return webix.i18n.parseFormatStr(this); + }; + + var result; + if (obj instanceof Date) + result = obj.toJSON(); + else + result = JSON.stringify(obj); + + Date.prototype.toJSON = origin; + return result; + }, + /* + send data to the server + params - hash of properties which will be added to the url + call - callback, can be an array of functions + */ + _send:function(url,params,call, master, mode){ + if (params && (webix.isArray(params) || (typeof (params.success || params.error || params) == "function"))){ + master = call; + call = params; + params = null; + } + + var defer = webix.promise.defer(); + + var x=this.getXHR(); + if (!webix.isArray(call)) + call = [call]; + + call.push({ success: function(t, d){ defer.resolve(d); }, + error: function(t, d){ defer.reject(x); }}); + + var headers = this._header || {}; + if (mode !== 'GET') + headers['Content-type'] = 'application/x-www-form-urlencoded'; + + if (!webix.callEvent("onBeforeAjax", [mode, url, params, x, headers])) return; + + //add extra params to the url + if (typeof params == "object"){ + var t=[]; + for (var a in params){ + var value = params[a]; + if (value === null || value === webix.undefined) + value = ""; + if(typeof value==="object") + value = this.stringify(value); + t.push(a+"="+encodeURIComponent(value));// utf-8 escaping + } + params=t.join("&"); + } + + if (params && mode==='GET'){ + url=url+(url.indexOf("?")!=-1 ? "&" : "?")+params; + params = null; + } + + x.open(mode, url, !this._sync); + + var type = this._response; + if (type) x.responseType = type; + + //if header was provided - use it + for (var key in headers) + x.setRequestHeader(key, headers[key]); + + //async mode, define loading callback + var self=this; + this.master = this.master || master; + x.onreadystatechange = function(){ + if (!x.readyState || x.readyState == 4){ + if (webix.debug_time) webix.log_full_time("data_loading"); //log rendering time + + webix.ajax.count++; + if (call && self && !x.aborted){ + //IE8 and IE9, handling .abort call + if (webix._xhr_aborted.find(x) != -1) + return webix._xhr_aborted.remove(x); + + var owner = self.master||self; + + var is_error = x.status >= 400; + var text, data; + if (x.responseType != "blob"){ + text = x.responseText||""; + data = self._data(x); + } else { + text = ""; + data = x.response; + } + + webix.ajax.$callback(owner, call, text, data, x, is_error); + } + if (self) self.master=null; + call=self=master=null; //anti-leak + } + }; + + //IE can use sync mode sometimes, fix it + if (!this._sync) + setTimeout(function(){ + if (!x.aborted){ + //abort handling in IE9 + if (webix._xhr_aborted.find(x) != -1) + webix._xhr_aborted.remove(x); + else + x.send(params||null); + } + }, 1); + else + x.send(params||null); + + if (this.master && this.master._ajax_queue) + this.master._ajax_queue.push(x); + + return this._sync?x:defer; //return XHR, which can be used in case of sync. mode + }, + _data:function(x){ + return { + xml:function(){ try{ return webix.DataDriver.xml.tagToObject(webix.DataDriver.xml.toObject(x.responseText, this)); } + catch(e){ + webix.log(x.responseText); + webix.log(e.toString()); webix.assert_error("Invalid xml data for parsing"); + } + }, + rawxml:function(){ return x.responseXML; }, + text:function(){ return x.responseText; }, + json:function(){ + try{ + if(webix.env.strict){ + return JSON.parse(x.responseText); + } + else{ + eval("webix.temp = "+x.responseText); var t = webix.temp; webix.temp = null; return t; + } + + } + catch(e){ + webix.log(x.responseText); + webix.log(e.toString()); webix.assert_error("Invalid json data for parsing"); + } + } + }; + }, + //GET request + get:function(url,params,call){ + return this._send(url,params,call, 0, "GET"); + }, + //POST request + post:function(url,params,call){ + return this._send(url,params,call, 0, "POST"); + }, + //PUT request + put:function(url,params,call){ + return this._send(url,params,call, 0, "PUT"); + }, + //POST request + del:function(url,params,call){ + return this._send(url,params,call, 0, "DELETE"); + }, + + sync:function(){ + this._sync = true; + return this; + }, + response:function(value){ + this._response = value; + return this; + }, + //deprecated, remove in 3.0 + //[DEPRECATED] + header:function(header){ + webix.assert(false, "ajax.header is deprecated in favor of ajax.headers"); + this._header = header; + return this; + }, + headers:function(header){ + this._header = webix.extend(this._header||{},header); + return this; + }, + bind:function(master){ + this.master = master; + return this; + } +}; +webix.ajax.$callback = function(owner, call, text, data, x, is_error){ + if (owner.$destructed) return; + if (x === -1 && data && typeof data.json == "function") + data = data.json(); + + if (is_error) + webix.callEvent("onAjaxError", [x]); + + if (!webix.isArray(call)) + call = [call]; + + if (!is_error) + for (var i=0; i < call.length; i++){ + if (call[i]){ + var before = call[i].before; + if (before) + before.call(owner, text, data, x); + } + } + + for (var i=0; i < call.length; i++) //there can be multiple callbacks + if (call[i]){ + var method = (call[i].success||call[i]); + if (is_error) + method = call[i].error; + if (method && method.call) + method.call(owner,text,data,x); + } +}; + +/*submits values*/ +webix.send = function(url, values, method, target){ + var form = webix.html.create("FORM",{ + "target":(target||"_self"), + "action":url, + "method":(method||"POST") + },""); + for (var k in values) { + var field = webix.html.create("INPUT",{"type":"hidden","name": k,"value": values[k]},""); + form.appendChild(field); + } + form.style.display = "none"; + document.body.appendChild(form); + form.submit(); + document.body.removeChild(form); +}; + + +webix.AtomDataLoader={ + $init:function(config){ + //prepare data store + this.data = {}; + this.waitData = webix.promise.defer(); + + if (config){ + this._settings.datatype = config.datatype||"json"; + this.$ready.push(this._load_when_ready); + } + }, + _load_when_ready:function(){ + this._ready_for_data = true; + + if (this._settings.url) + this.url_setter(this._settings.url); + if (this._settings.data) + this.data_setter(this._settings.data); + }, + url_setter:function(value){ + if (typeof value == "string" && value.indexOf("->") != -1){ + var parts = value.split("->"); + value = webix.proxy(parts[0], parts[1]); + } + + if (!this._ready_for_data) return value; + this.load(value, this._settings.datatype); + return value; + }, + data_setter:function(value){ + if (!this._ready_for_data) return value; + this.parse(value, this._settings.datatype); + return true; + }, + //loads data from external URL + load:function(url,call){ + var details = arguments[2] || null; + + this.callEvent("onBeforeLoad",[]); + if (typeof call == "string"){ //second parameter can be a loading type or callback + //we are not using setDriver as data may be a non-datastore here + this.data.driver = webix.DataDriver[call]; + call = arguments[2]; + } else if (!this.data.driver) + this.data.driver = webix.DataDriver.json; + + //load data by async ajax call + //loading_key - can be set by component, to ignore data from old async requests + var callback = [{ + success: this._onLoad, + error: this._onLoadError + }]; + + if (call){ + if (webix.isArray(call)) + callback.push.apply(callback,call); + else + callback.push(call); + } + + //proxy + if (typeof url == "string" && url.indexOf("->") != -1){ + var parts = url.split("->"); + url = webix.proxy(parts[0], parts[1]); + } + if (url.$proxy && url.load) + return url.load(this, callback, details); + + //promize + if (typeof url === "function"){ + return url(details).then( + webix.bind(function(data){ + webix.ajax.$callback(this, callback, "", data, -1); + }, this), + webix.bind(function(x){ + webix.ajax.$callback(this, callback, "", null, x, true); + }, this) + ); + } + + //normal url + return webix.ajax(url,callback,this); + }, + //loads data from object + parse:function(data,type){ + //[webix.remote] + if (data && data.then && typeof data.then == "function"){ + return data.then(webix.bind(function(data){ + if (data && typeof data.json == "function") + data = data.json(); + this.parse(data, type); + }, this)); + } + + //loading data from other component + if (data && data.sync && this.sync) + return this.sync(data); + + this.callEvent("onBeforeLoad",[]); + this.data.driver = webix.DataDriver[type||"json"]; + this._onLoad(data,null); + }, + //default after loading callback + _onLoad:function(text, response, loader){ + var driver = this.data.driver; + var data; + if (loader === -1) + data = response; + else + data = driver.toObject(text, response); + + if (data) + this.data = driver.getDetails(driver.getRecords(data)[0]); + else + this._onLoadError(text,response,loader); + + this.callEvent("onAfterLoad",[]); + this.waitData.resolve(); + }, + _onLoadError:function(text, xml, xhttp){ + this.callEvent("onAfterLoad",[]); + this.callEvent("onLoadError",arguments); + webix.callEvent("onLoadError", [text, xml, xhttp, this]); + }, + _check_data_feed:function(data){ + if (!this._settings.dataFeed || this._ignore_feed || !data) return true; + var url = this._settings.dataFeed; + if (typeof url == "function") + return url.call(this, (data.id||data), data); + url = url+(url.indexOf("?")==-1?"?":"&")+"action=get&id="+encodeURIComponent(data.id||data); + this.callEvent("onBeforeLoad",[]); + webix.ajax(url, function(text,xml,loader){ + this._ignore_feed=true; + var driver = webix.DataDriver.json; + var data = driver.toObject(text, xml); + if (data) + this.setValues(driver.getDetails(driver.getRecords(data)[0])); + else + this._onLoadError(text,xml,loader); + this._ignore_feed=false; + this.callEvent("onAfterLoad",[]); + }, this); + return false; + } +}; + +/* + Abstraction layer for different data types +*/ + +webix.DataDriver={}; +webix.DataDriver.json={ + //convert json string to json object if necessary + toObject:function(data){ + if (!data) return null; + if (typeof data == "string"){ + try{ + if (this.parseDates){ + var isodate = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/; + data = JSON.parse(data, function(key, value){ + if (typeof value == "string"){ + if (isodate.test(value)) + return new Date(value); + } + return value; + }); + } else { + if(webix.env.strict){ + data =JSON.parse(data); + } + else{ + eval("webix.temp="+data); + data = webix.temp; + } + + } + } catch(e){ + webix.assert_error(e); + return null; + } + } + + return data; + }, + //get array of records + getRecords:function(data){ + if (data && data.data) + data = data.data; + + if (data && !webix.isArray(data)) + return [data]; + return data; + }, + //get hash of properties for single record + getDetails:function(data){ + if (typeof data == "string") + return { id:(data||webix.uid()), value:data }; + return data; + }, + getOptions:function(data){ + return data.collections; + }, + //get count of data and position at which new data need to be inserted + getInfo:function(data){ + return { + _size:(data.total_count||0), + _from:(data.pos||0), + _parent:(data.parent||0), + _config:(data.config), + _key:(data.webix_security) + }; + }, + child:"data", + parseDates:false +}; + +webix.DataDriver.html={ + /* + incoming data can be + - ID of parent container + - HTML text + */ + toObject:function(data){ + if (typeof data == "string"){ + var t=null; + if (data.indexOf("<")==-1) //if no tags inside - probably its an ID + t = webix.toNode(data); + if (!t){ + t=document.createElement("DIV"); + t.innerHTML = data; + } + + return t.firstChild; + } + return data; + }, + //get array of records + getRecords:function(node){ + return node.getElementsByTagName(this.tag); + }, + //get hash of properties for single record + getDetails:function(data){ + return webix.DataDriver.xml.tagToObject(data); + }, + getOptions:function(){ + return false; + }, + //dyn loading is not supported by HTML data source + getInfo:function(data){ + return { + _size:0, + _from:0 + }; + }, + tag: "LI" +}; + +webix.DataDriver.jsarray={ + //eval jsarray string to jsarray object if necessary + toObject:function(data){ + if (typeof data == "string"){ + if(webix.env.strict){ + return JSON.parse(data); + } + else{ + eval ("webix.temp="+data); + return webix.temp; + } + + } + return data; + }, + //get array of records + getRecords:function(data){ + return data; + }, + //get hash of properties for single record, in case of array they will have names as "data{index}" + getDetails:function(data){ + var result = {}; + for (var i=0; i < data.length; i++) + result["data"+i]=data[i]; + if (this.idColumn !== null) + result.id = data[this.idColumn]; + + return result; + }, + getOptions:function(){ return false; }, + //dyn loading is not supported by js-array data source + getInfo:function(data){ + return { + _size:0, + _from:0 + }; + }, + idColumn:null +}; + +webix.DataDriver.csv={ + //incoming data always a string + toObject:function(data){ + return data; + }, + //get array of records + getRecords:function(data){ + return data.split(this.row); + }, + //get hash of properties for single record, data named as "data{index}" + getDetails:function(data){ + data = this.stringToArray(data); + var result = {}; + for (var i=0; i < data.length; i++) + result["data"+i]=data[i]; + + if (this.idColumn !== null) + result.id = data[this.idColumn]; + + return result; + }, + getOptions:function(){ return false; }, + //dyn loading is not supported by csv data source + getInfo:function(data){ + return { + _size:0, + _from:0 + }; + }, + //split string in array, takes string surrounding quotes in account + stringToArray:function(data){ + data = data.split(this.cell); + for (var i=0; i < data.length; i++) + data[i] = data[i].replace(/^[ \t\n\r]*(\"|)/g,"").replace(/(\"|)[ \t\n\r]*$/g,""); + return data; + }, + idColumn:null, + row:"\n", //default row separator + cell:"," //default cell separator +}; + +webix.DataDriver.xml={ + _isValidXML:function(data){ + if (!data || !data.documentElement) + return null; + if (data.getElementsByTagName("parsererror").length) + return null; + return data; + }, + //convert xml string to xml object if necessary + toObject:function(text, response){ + var data = response ? (response.rawxml ? response.rawxml() : response) :null; + if (this._isValidXML(data)) + return data; + if (typeof text == "string") + data = this.fromString(text.replace(/^[\s]+/,"")); + else + data = text; + + if (this._isValidXML(data)) + return data; + return null; + }, + //get array of records + getRecords:function(data){ + return this.xpath(data,this.records); + }, + records:"/*/item", + child:"item", + config:"/*/config", + //get hash of properties for single record + getDetails:function(data){ + return this.tagToObject(data,{}); + }, + getOptions:function(){ + return false; + }, + //get count of data and position at which new data_loading need to be inserted + getInfo:function(data){ + + var config = this.xpath(data, this.config); + if (config.length) + config = this.assignTypes(this.tagToObject(config[0],{})); + else + config = null; + + return { + _size:(data.documentElement.getAttribute("total_count")||0), + _from:(data.documentElement.getAttribute("pos")||0), + _parent:(data.documentElement.getAttribute("parent")||0), + _config:config, + _key:(data.documentElement.getAttribute("webix_security")||null) + }; + }, + //xpath helper + xpath:function(xml,path){ + if (window.XPathResult){ //FF, KHTML, Opera + var node=xml; + if(xml.nodeName.indexOf("document")==-1) + xml=xml.ownerDocument; + var res = []; + var col = xml.evaluate(path, node, null, XPathResult.ANY_TYPE, null); + var temp = col.iterateNext(); + while (temp){ + res.push(temp); + temp = col.iterateNext(); + } + return res; + } + else { + var test = true; + try { + if (typeof(xml.selectNodes)=="undefined") + test = false; + } catch(e){ /*IE7 and below can't operate with xml object*/ } + //IE + if (test) + return xml.selectNodes(path); + else { + //there is no interface to do XPath + //use naive approach + var name = path.split("/").pop(); + + return xml.getElementsByTagName(name); + } + } + }, + assignTypes:function(obj){ + for (var k in obj){ + var test = obj[k]; + if (typeof test == "object") + this.assignTypes(test); + else if (typeof test == "string"){ + if (test === "") + continue; + if (test == "true") + obj[k] = true; + else if (test == "false") + obj[k] = false; + else if (test == test*1) + obj[k] = obj[k]*1; + } + } + return obj; + }, + //convert xml tag to js object, all subtags and attributes are mapped to the properties of result object + tagToObject:function(tag,z){ + var isArray = tag.nodeType == 1 && tag.getAttribute("stack"); + var hasSubTags = 0; + + if (!isArray){ + z=z||{}; + + + //map attributes + var a=tag.attributes; + if(a && a.length) + for (var i=0; inot as file://", + expire:-1 + }); + else + window.alert("Please open sample by http, not as file://"); + } + }); + +}); + + +//UI interface +webix.BaseBind = { + bind:function(target, rule, format){ + if (!this.attachEvent) + webix.extend(this, webix.EventSystem); + + if (typeof target == 'string') + target = webix.$$(target); + + if (target._initBindSource) target._initBindSource(); + if (this._initBindSource) this._initBindSource(); + + + + if (!target.getBindData) + webix.extend(target, webix.BindSource); + + this._bind_ready(); + + target.addBind(this._settings.id, rule, format); + this._bind_source = target._settings.id; + + if (webix.debug_bind) + webix.log("[bind] "+this.name+"@"+this._settings.id+" <= "+target.name+"@"+target._settings.id); + + var target_id = this._settings.id; + //FIXME - check for touchable is not the best solution, to detect necessary event + this._bind_refresh_handler = this.attachEvent(this.touchable?"onAfterRender":"onBindRequest", function(){ + return target.getBindData(target_id); + }); + + if (this.refresh && this.isVisible(this._settings.id)) + this.refresh(); + }, + unbind:function(){ + if (this._bind_source){ + var target = webix.$$(this._bind_source); + if (target) + target.removeBind(this._settings.id); + this.detachEvent(this._bind_refresh_handler); + this._bind_source = null; + } + }, + _bind_ready:function(){ + var config = this._settings; + if (this.filter){ + var key = config.id; + this.data._on_sync = webix.bind(function(){ + webix.$$(this._bind_source)._bind_updated[key] = false; + }, this); + } + + var old_render = this.render; + this.render = function(){ + if (this._in_bind_processing) return; + + this._in_bind_processing = true; + var result = this.callEvent("onBindRequest"); + this._in_bind_processing = false; + + return old_render.apply(this, ((result === false)?arguments:[])); + }; + + if (this.getValue||this.getValues) + this.save = function(){ + if (this.validate && !this.validate()) return false; + webix.$$(this._bind_source).setBindData((this.getValue?this.getValue:this.getValues()),this._settings.id); + //reset form, so it will be counted as saved + if (this.setDirty) + this.setDirty(false); + }; + + //we want to refresh list after data loading if it has master link + //in same time we do not want such operation for dataFeed components + //as they are reloading data as response to the master link + if (!config.dataFeed && this.loadNext) + this.data.attachEvent("onStoreLoad", webix.bind(function(){ + if (this._bind_source) + webix.$$(this._bind_source)._bind_updated[this._settings.id] = false; + }, this)); + + this._bind_ready = function(){}; + } +}; + +//bind interface +webix.BindSource = { + $init:function(){ + this._bind_hash = {}; //rules per target + this._bind_updated = {}; //update flags + this._ignore_binds = {}; + + //apply specific bind extension + this._bind_specific_rules(this); + }, + saveBatch:function(code){ + this._do_not_update_binds = true; + code.call(this); + this._do_not_update_binds = false; + this._update_binds(); + }, + setBindData:function(data, key){ + //save called, updating master data + if (key) + this._ignore_binds[key] = true; + + if (webix.debug_bind) + webix.log("[bind:save] "+this.name+"@"+this._settings.id+" <= "+"@"+key); + if (this.setValue) + this.setValue(data); + else if (this.setValues) + this.setValues(data); + else { + var id = this.getCursor(); + if (id) + this.updateItem(id, data); + else + this.add(data); + } + this.callEvent("onBindUpdate", [data, key]); + if (this.save) + this.save(); + + if (key) + this._ignore_binds[key] = false; + }, + //fill target with data + getBindData:function(key, update){ + //fire only if we have data updates from the last time + if (this._bind_updated[key]) return false; + var target = webix.$$(key); + //fill target only when it visible + if (target.isVisible(target._settings.id)){ + this._bind_updated[key] = true; + if (webix.debug_bind) + webix.log("[bind:request] "+this.name+"@"+this._settings.id+" => "+target.name+"@"+target._settings.id); + this._bind_update(target, this._bind_hash[key][0], this._bind_hash[key][1]); //trigger component specific updating logic + if (update && target.filter) + target.refresh(); + } + }, + //add one more bind target + addBind:function(source, rule, format){ + this._bind_hash[source] = [rule, format]; + }, + removeBind:function(source){ + delete this._bind_hash[source]; + delete this._bind_updated[source]; + delete this._ignore_binds[source]; + }, + //returns true if object belong to "collection" type + _bind_specific_rules:function(obj){ + if (obj.filter) + webix.extend(this, webix.CollectionBind); + else if (obj.setValue) + webix.extend(this, webix.ValueBind); + else + webix.extend(this, webix.RecordBind); + }, + //inform all binded objects, that source data was updated + _update_binds:function(){ + if (!this._do_not_update_binds) + for (var key in this._bind_hash){ + if (this._ignore_binds[key]) continue; + this._bind_updated[key] = false; + this.getBindData(key, true); + } + }, + //copy data from source to the target + _bind_update_common:function(target, rule, data){ + if (target.setValue) + target.setValue((data&&rule)?data[rule]:data); + else if (!target.filter){ + if (!data && target.clear) + target.clear(); + else { + if (target._check_data_feed(data)) + target.setValues(webix.clone(data)); + } + } else { + target.data.silent(function(){ + this.filter(rule,data); + }); + } + target.callEvent("onBindApply", [data,rule,this]); + } +}; + + +//pure data objects +webix.DataValue = webix.proto({ + name:"DataValue", + isVisible:function(){ return true; }, + $init:function(config){ + if (!config || webix.isUndefined(config.value)) + this.data = config||""; + + var id = (config&&config.id)?config.id:webix.uid(); + this._settings = { id:id }; + webix.ui.views[id] = this; + }, + setValue:function(value){ + this.data = value; + this.callEvent("onChange", [value]); + }, + getValue:function(){ + return this.data; + }, + refresh:function(){ this.callEvent("onBindRequest"); } +}, webix.EventSystem, webix.BaseBind); + +webix.DataRecord = webix.proto({ + name:"DataRecord", + isVisible:function(){ return true; }, + $init:function(config){ + this.data = config||{}; + var id = (config&&config.id)?config.id:webix.uid(); + this._settings = { id:id }; + webix.ui.views[id] = this; + }, + getValues:function(){ + return this.data; + }, + setValues:function(data, update){ + this.data = update?webix.extend(this.data, data, true):data; + this.callEvent("onChange", [data]); + }, + refresh:function(){ this.callEvent("onBindRequest"); } +}, webix.EventSystem, webix.BaseBind, webix.AtomDataLoader, webix.Settings); + + +webix.ValueBind={ + $init:function(){ + this.attachEvent("onChange", this._update_binds); + }, + _bind_update:function(target, rule, format){ + rule = rule || "value"; + var data = this.getValue()||""; + if (format) data = format(data); + + if (target.setValue) + target.setValue(data); + else if (!target.filter){ + var pod = {}; pod[rule] = data; + if (target._check_data_feed(data)) + target.setValues(pod); + } else{ + target.data.silent(function(){ + this.filter(rule,data); + }); + } + target.callEvent("onBindApply", [data,rule,this]); + } +}; + +webix.RecordBind={ + $init:function(){ + this.attachEvent("onChange", this._update_binds); + }, + _bind_update:function(target, rule, format){ + var data = this.getValues()||null; + if (format) + data = format(data); + this._bind_update_common(target, rule, data); + } +}; + +webix.CollectionBind={ + $init:function(){ + this._cursor = null; + this.attachEvent("onSelectChange", function(data){ + var sel = this.getSelectedId(); + this.setCursor(sel?(sel.id||sel):null); + }); + this.attachEvent("onAfterCursorChange", this._update_binds); + this.attachEvent("onAfterDelete", function(id){ + if (id == this.getCursor()) + this.setCursor(null); + }); + this.data.attachEvent("onStoreUpdated", webix.bind(function(id, data, mode){ + //paint - ignored + //delete - handled by onAfterDelete above + if (id && id == this.getCursor() && mode != "paint" && mode != "delete") + this._update_binds(); + + },this)); + this.data.attachEvent("onClearAll", webix.bind(function(){ + this._cursor = null; + },this)); + this.data.attachEvent("onIdChange", webix.bind(function(oldid, newid){ + if (this._cursor == oldid){ + this._cursor = newid; + this._update_binds(); + } + },this)); + }, + refreshCursor:function(){ + if (this._cursor) + this.callEvent("onAfterCursorChange",[this._cursor]); + }, + setCursor:function(id){ + if (id == this._cursor || (id !== null && !this.getItem(id))) return; + + this.callEvent("onBeforeCursorChange", [this._cursor]); + this._cursor = id; + this.callEvent("onAfterCursorChange",[id]); + }, + getCursor:function(){ + return this._cursor; + }, + _bind_update:function(target, rule, format){ + if (rule == "$level" && this.data.getBranch) + return (target.data || target).importData(this.data.getBranch(this.getCursor())); + + var data = this.getItem(this.getCursor())|| this._settings.defaultData || null; + if (rule == "$data"){ + if (typeof format === "function") + return format.call(target, data, this); + else + return target.data.importData(data?data[format]:[]); + } + + if (format) + data = format(data); + this._bind_update_common(target, rule, data); + } +}; + + + +/* + REnders single item. + Can be used for elements without datastore, or with complex custom rendering logic + + @export + render +*/ + + + +webix.AtomRender={ + //convert item to the HTML text + _toHTML:function(obj){ + if (obj.$empty ) + return ""; + return this._settings.template(obj, this); + }, + //render self, by templating data object + render:function(){ + if (this.isVisible(this._settings.id)){ + if (webix.debug_render) + webix.log("Render: "+this.name+"@"+this._settings.id); + if (!this.callEvent || this.callEvent("onBeforeRender",[this.data])){ + if (this.data && !this._settings.content) + this._dataobj.innerHTML = this._toHTML(this.data); + if (this.callEvent) this.callEvent("onAfterRender",[]); + } + return true; + } + return false; + }, + sync:function(source){ + this._backbone_sync = false; + if (source.name != "DataStore"){ + if (source.data && source.name == "DataStore"){ + source = source.data; + } else { + this._backbone_sync = true; + } + } + + + if (this._backbone_sync) + source.bind("change", webix.bind(function(data){ + if (data.id == this.data.id){ + this.data = data.attributes; + this.refresh(); + } + }, this)); + else + source.attachEvent("onStoreUpdated", webix.bind(function(id){ + if (!id || id == this.data.id){ + this.data = source.pull[id]; + this.refresh(); + } + }, this)); + }, + template_setter:webix.template +}; + +webix.SingleRender=webix.proto({ + template_setter:function(value){ + this.type.template=webix.template(value); + }, + //convert item to the HTML text + _toHTML:function(obj){ + var type = this.type; + return (type.templateStart?type.templateStart(obj,type):"") + type.template(obj,type) + (type.templateEnd?type.templateEnd(obj,type):""); + }, + customize:function(obj){ + webix.type(this,obj); + } +}, webix.AtomRender); + +webix.UIManager = { + _view: null, + _hotkeys: {}, + _focus_time:0, + _controls: { + 'enter': 13, + 'tab': 9, + 'esc': 27, + 'escape': 27, + 'up': 38, + 'down': 40, + 'left': 37, + 'right': 39, + 'pgdown': 34, + 'pagedown': 34, + 'pgup': 33, + 'pageup': 33, + 'end': 35, + 'home': 36, + 'delete': 46, + 'backspace': 8, + 'space': 32, + 'meta': 91, + 'win': 91, + 'mac': 91 + }, + _enable: function() { + // attaching events here + webix.event(document.body, "click", webix.bind(this._focus_click, this)); + webix.event(document, "keydown", webix.bind(this._keypress, this)); + if (document.body.addEventListener) + document.body.addEventListener("focus", webix.bind(this._focus_tab, this), true); + + webix.destructors.push(this); + }, + destructor:function(){ + webix.UIManager._view = null; + }, + getFocus: function() { + return this._view; + }, + _focus_action:function(view){ + this._focus_was_there = this._focus_was_there || view._settings.id; + }, + setFocus: function(view, only_api){ + //view can be empty + view = webix.$$(view); + //unfocus if view is hidden + if (view && !view.$view) view = null; + this._focus_time = new Date(); + + if (this._view === view) return true; + if (this._view && this._view.callEvent) + this._view.callEvent("onBlur", [this._view]); + + if (view && view.callEvent) + view.callEvent("onFocus", [view, this._view]); + webix.callEvent("onFocusChange", [view, this._view]); + + if (this._view && this._view.blur && !only_api) this._view.blur(); + this._view = view; + if (view && view.focus && !only_api) view.focus(); + return true; + }, + hasFocus: function(view) { + return (view === this._view) ? true : false; + }, + _focus: function(e, dont_clear) { + var view = webix.html.locate(e, "view_id") || this._focus_was_there; + + //if html was repainted we can miss the view, so checking last processed one + view = webix.$$(view); + this._focus_was_there = null; + + if (view == this._view) return; + + if (!dont_clear) + this._focus_was_there = null; + + if (view){ + view = webix.$$(view); + if (this.canFocus(view)) + this.setFocus(view); + } else if (!dont_clear) + this.setFocus(null); + + return true; + }, + _focus_click:function(e){ + // if it was onfocus/onclick less then 100ms behore then we ignore it + if ((new Date())-this._focus_time < 100) return false; + return this._focus(e); + }, + _focus_tab: function(e) { + return this._focus(e, true); + }, + canFocus:function(view){ + return view.isVisible() && view.isEnabled(); + }, + + _moveChildFocus: function(check_view){ + var focus = this.getFocus(); + //we have not focus inside of closing item + if (check_view && !this._is_child_of(check_view, focus)) + return false; + + if (!this._focus_logic("getPrev", check_view)) + this.setFocus(this.getPrev(check_view)); + else + this._view = null; + }, + + _is_child_of: function(parent, child) { + if (!parent) return false; + if (!child) return false; + while (child) { + if (child === parent) return true; + child = child.getParentView(); + } + return false; + }, + _keypress_timed:function(){ + if (this && this.callEvent) + this.callEvent("onTimedKeyPress",[]); + }, + _keypress: function(e) { + var code = e.which || e.keyCode; + if(code>95 && code< 112) + code -= 48; //numpad support + var ctrl = e.ctrlKey; + var shift = e.shiftKey; + var alt = e.altKey; + var meta = e.metaKey; + var codeid = this._keycode(code, ctrl, shift, alt, meta); + var view = this.getFocus(); + if (view && view.callEvent) { + if (view.callEvent("onKeyPress", [code,e]) === false) + webix.html.preventEvent(e); + if (view.hasEvent("onTimedKeyPress")){ + clearTimeout(view._key_press_timeout); + view._key_press_timeout = webix.delay(this._keypress_timed, view, [], (view._settings.keyPressTimeout||250)); + } + } + + if (this.tabControl){ + // tab pressed + if (code === 9 && !ctrl && !alt && !meta) { + this._focus_logic(!shift ? "getNext" : "getPrev"); + webix.html.preventEvent(e); + } + } + + codeid = this._keycode(String.fromCharCode(code), ctrl, shift, alt, meta); + //flag, that some non-special key was pressed + var is_any = !ctrl && !alt && !meta && (code!=9)&&(code!=27)&&(code!=13); + + if (this._check_keycode(codeid, is_any, e) === false) { + webix.html.preventEvent(e); + return false; + } + }, + + // dir - getNext or getPrev + _focus_logic: function(dir) { + if (!this.getFocus()) return null; + + dir = dir || "getNext"; + var next = this.getFocus(); + var start = next; + var marker = webix.uid(); + + while (true) { + next = this[dir](next); + // view with focus ability + if (next && next._settings.tabFocus && this.canFocus(next)) + return this.setFocus(next); + + // elements with focus ability not found + if (next === start || next.$fmarker == marker) + return null; + + //prevents infinity loop + next.$fmarker = marker; + } + }, + + getTop: function(id) { + var next, view = webix.$$(id); + + while (view && (next = view.getParentView())) + view = next; + return view; + }, + + getNext: function(view, _inner_call) { + var cells = view.getChildViews(); + //tab to first children + if (cells.length && !_inner_call) return cells[0]; + + //unique case - single view without child and parent + var parent = view.getParentView(); + if (!parent) + return view; + + var p_cells = parent.getChildViews(); + if (p_cells.length){ + var index = webix.PowerArray.find.call(p_cells, view)+1; + while (index < p_cells.length) { + //next visible child + if (this.canFocus(p_cells[index])) + return p_cells[index]; + + index++; + } + } + + //sibling of parent + return this.getNext(parent, true); + }, + + getPrev: function(view, _inner_call) { + var cells = view.getChildViews(); + //last child of last child + if (cells.length && _inner_call) + return this.getPrev(cells[cells.length - 1], true); + if (_inner_call) return view; + + //fallback from top to bottom + var parent = view.getParentView(); + if (!parent) return this.getPrev(view, true); + + + var p_cells = parent.getChildViews(); + if (p_cells) { + var index = webix.PowerArray.find.call(p_cells, view)-1; + while (index >= 0) { + if (this.canFocus(p_cells[index])) + return this.getPrev(p_cells[index], true); + index--; + } + } + + return parent; + }, + + addHotKey: function(keys, handler, view) { + webix.assert(handler, "Hot key handler is not defined"); + var pack = this._parse_keys(keys); + webix.assert(pack.letter, "Unknown key code"); + if (!view) view = null; + pack.handler = handler; + pack.view = view; + + + var code = this._keycode(pack.letter, pack.ctrl, pack.shift, pack.alt, pack.meta); + if (!this._hotkeys[code]) this._hotkeys[code] = []; + this._hotkeys[code].push(pack); + + return keys; + }, + removeHotKey: function(keys, func, view){ + var pack = this._parse_keys(keys); + var code = this._keycode(pack.letter, pack.ctrl, pack.shift, pack.alt, pack.meta); + if (!func && !view) + delete this._hotkeys[code]; + else { + var t = this._hotkeys[code]; + if (t){ + for (var i = t.length - 1; i >= 0; i--) { + if (view && t[i].view !== view) continue; + if (func && t[i].handler !== func) continue; + t.splice(i,1); + } + if (!t.length) + delete this._hotkeys[code]; + } + + } + }, + _keycode: function(code, ctrl, shift, alt, meta) { + return code+"_"+["", (ctrl ? '1' : '0'), (shift ? '1' : '0'), (alt ? '1' : '0'), (meta ? '1' : '0')].join(''); + }, + + _check_keycode: function(code, is_any, e){ + var focus = this.getFocus(); + if (this._hotkeys[code]) + return this._process_calls(this._hotkeys[code], focus, e); + else if (is_any && this._hotkeys["ANY_0000"]) + return this._process_calls(this._hotkeys["ANY_0000"], focus, e); + + return true; + }, + _process_calls:function(calls, focus, e){ + for (var i = 0; i < calls.length; i++) { + var key = calls[i]; + var call = false; + if ((key.view !== null) && //common hot-key + (focus !== key.view) && //hot-key for current view + //hotkey for current type of view + (typeof(key.view) !== 'string' || !focus || focus.name !== key.view)) continue; + + var temp_result = key.handler(focus, e); + if (!!temp_result === temp_result) return temp_result; + } + return true; + }, + _parse_keys: function(keys) { + var controls = this._controls; + var parts = keys.toLowerCase().split(/[\+\-_]/); + var ctrl, shift, alt, meta; + ctrl = shift = alt = meta = 0; + var letter = ""; + for (var i = 0; i < parts.length; i++) { + if (parts[i] === 'ctrl') ctrl = 1; + else if (parts[i] === 'shift') shift = 1; + else if (parts[i] === 'alt') alt = 1; + else if (parts[i] === 'command') meta = 1; + else { + if (controls[parts[i]]) { + letter = String.fromCharCode(controls[parts[i]]); + } else { + letter = parts[i]; + } + } + } + + return { + letter: letter.toUpperCase(), + ctrl: ctrl, + shift: shift, + alt: alt, + meta: meta, + debug:keys + }; + } +}; + +webix.ready(function() { + webix.UIManager._enable(); + + webix.UIManager.addHotKey("enter", function(view){ + if (view && view.editStop && view._in_edit_mode){ + view.editStop(); + return true; + } + }); + webix.UIManager.addHotKey("esc", function(view){ + if (view){ + if (view.editCancel && view._in_edit_mode){ + view.editCancel(); + return true; + } + var top = view.getTopParentView(); + if (top && top.setPosition) + top._hide(); + } + }); + webix.UIManager.addHotKey("shift+tab", function(view, e){ + if (view && view._custom_tab_handler && !view._custom_tab_handler(false, e)) + return false; + + if (view && view._in_edit_mode){ + if (view.editNext) + return view.editNext(false); + else if (view.editStop){ + view.editStop(); + return true; + } + } + + }); + webix.UIManager.addHotKey("tab", function(view, e){ + if (view && view._custom_tab_handler && !view._custom_tab_handler(true, e)) + return false; + + if (view && view._in_edit_mode){ + if (view.editNext) + return view.editNext(true); + else if (view.editStop){ + view.editStop(); + return true; + } + } else + webix.delay(function(){ + webix.UIManager.setFocus(webix.$$(document.activeElement), true); + },1); + }); +}); + +webix.IdSpace = { + $init:function(){ + this._elements = {}; + this._translate_ids = {}; + this.getTopParentView = webix.bind(function(){ return this;}, this); + + this._run_inner_init_logic(); + this.$ready.push(this._run_after_inner_init_logic); + }, + $$:function(id){ + return this._elements[id]; + }, + innerId:function(id){ + return this._translate_ids[id]; + }, + _run_inner_init_logic:function(callback){ + this._prev_global_col = webix._global_collection; + webix._global_collection = this; + }, + _run_after_inner_init_logic:function(temp){ + for (var name in this._elements){ + var input = this._elements[name]; + if (this.callEvent && input.mapEvent && !input._evs_map.onitemclick) + input.mapEvent({ + onitemclick:this + }); + input.getTopParentView = this.getTopParentView; + } + + webix._global_collection = this._prev_global_col; + this._prev_global_col = 0; + }, + ui:function(){ + this._run_inner_init_logic(); + var temp = webix.ui.apply(webix, arguments); + this._run_after_inner_init_logic(); + return temp; + } +}; + + +(function(){ + +var resize = []; +var ui = webix.ui; + +if (!webix.ui){ + ui = webix.ui = function(config, parent, id){ + webix._ui_creation = true; + var node = webix.toNode((config.container||parent)||document.body); + + var top_node; + var body_child = (node == document.body); + if (config._settings || (node && webix.isArray(config))){ + top_node = config; + } else { + if (node && body_child) + config.$topView = true; + if (!config._inner) + config._inner = {}; + top_node = ui._view(config); + } + + if (body_child && !top_node.setPosition) + webix.ui._fixHeight(); + + if (top_node._settings && top_node._settings._hidden && !node.$view){ + top_node._settings._container = node; + } else if (!top_node.$apiOnly){ + if (node.appendChild){ + node.appendChild(top_node._viewobj); + //resize window with position center or top + //do not resize other windows and elements + // which are attached to custom html containers + if (((!top_node.setPosition || top_node._settings.fullscreen) && node == document.body) || top_node._settings.position ) + resize.push(top_node); + if (!config.skipResize) + top_node.adjust(); + } else if (node.destructor){ + //addView or view moving with target id + if (!id && id!==0 && !webix.isArray(top_node)){ + id = node; + node = node.getParentView(); + } + //if target supports view adding + if (node && node._replace){ + //if source supports view removing + if (top_node.getParentView && top_node.getParentView()) + top_node.getParentView()._remove(top_node); + + node._replace(top_node, id); + } + } else + webix.assert_error("Not existing parent:"+config.container); + } + + webix._ui_creation = false; + return top_node; + }; +} + +webix.ui.animate = function(ui, parent, config){ + var pobj = webix.$$(parent); + if (pobj){ + var aniset = config || { type:"slide", direction:"left" }; + var d = pobj._viewobj.cloneNode(true); + var view = webix.ui(ui, parent); + + view._viewobj.parentNode.appendChild(d); + var line = webix.animate.formLine( + view._viewobj, + d, + aniset + ); + + aniset.callback = function(){ + webix.animate.breakLine(line); + }; + webix.animate(line, aniset); + + return view; + } +}; + +/*called in baseview $init for calculate scrollSize*/ +webix.ui._detectScrollSize = function(){ + var div = webix.html.create("div"); + div.className = "webix_skin_mark"; + div.style.cssText="position:absolute;left:-1000px;width:100px;padding:0px;margin:0px;min-height:100px;overflow-y:scroll;"; + + document.body.appendChild(div); + var width = div.offsetWidth-div.clientWidth; + var skin = { 110:"air", 120:"aircompact", 130:"clouds", 140:"web", 150:"terrace", 160:"metro", 170:"light", 180:"glamour", 190:"touch", 200:"flat" , 210:"compact", 220:"material" }[Math.floor(div.offsetHeight/10)*10]; + document.body.removeChild(div); + + if (skin){ + var skinobj = webix.skin[skin]; + if (skinobj && skinobj != webix.skin.$active) + webix.skin.set(skin); + } + + if (webix.env.$customScroll) return 0; + return width; +}; +webix.ui.scrollSize = ((webix.env.touch||webix.env.$customScroll)?0:17); +webix.ready(function(){ + var size = webix.ui._detectScrollSize(); + webix.ui.scrollSize = webix.env.touch ? 0 : size; +}); + +webix.ui._uid = function(name){ + return "$"+name+(this._namecount[name] = (this._namecount[name]||0)+1); +}; +webix.ui._namecount = {}; + +webix.ui._fixHeight = function (){ + webix.html.addStyle("html, body{ height:100%; }"); + document.body.className+=" webix_full_screen"; + webix.ui._fixHeight = function(){}; +}; +webix.ui.resize = function(){ + if (!webix.ui.$freeze) + for (var i=resize.length - 1; i>=0; i--){ + //remove destroyed views from resize list + if (resize[i].$destructed) + resize.splice(i,1); + else + resize[i].adjust(); + } +}; +webix.ui.each = function(parent, logic, master, include){ + if (parent){ + var children = include ? [parent] : parent.getChildViews(); + for (var i = 0; i < children.length; i++){ + if (logic.call((master || webix), children[i]) !== false) + webix.ui.each(children[i], logic, master); + } + } +}; +webix.event(window, "resize", webix.ui.resize); + +ui._delays = {}; +ui.delay = function(config){ + webix.ui._delays[config.id] = config; +}; +ui.hasMethod = function(view, method){ + var obj = webix.ui[view]; + if (!obj) return false; + + if (obj._webix_proto_wait) + obj = obj.call(webix); + + return !!webix.ui[view].prototype[method]; +}; +webix.ui.zIndex = function(){ + return webix.ui.zIndexBase++; +}; +webix.ui.zIndexBase = 100; + +ui._view = function(config){ + webix.assert_config(config); + if (config.view){ + var view = config.view; + webix.assert(ui[view], "unknown view:"+view); + return new ui[view](config); + } else if (config.rows || config.cols){ + var cells = config.rows||config.cols; + var accordion = false; + for (var i=0; ix) x = sizes[0]; + //minHeight + if (sizes[2]>y) y = sizes[2]; + + //maxWidth rule + if (x>sizes[1]) x = sizes[1]; + //maxHeight rule + if (y>sizes[3]) y = sizes[3]; + + this.$setSize(x,y); + }, + resize:function(force){ + if (webix._child_sizing_active || webix.ui.$freeze) return; + + var parent = this.getParentView(); + if (parent){ + if (parent.resizeChildren) + parent.resizeChildren(); + else + parent.resize(); + } else { + this.adjust(); + } + } +}, webix.Settings, webix.Destruction, webix.BaseBind, webix.UIExtension); + + + +/* + don't render borders itself , but aware of layout , which can set some borders +*/ +webix.protoUI({ + name:"view", + $init:function(config){ + this._set_inner(config); + }, + + //deside, will component use borders or not + _set_inner:function(config){ + var border_not_set = webix.isUndefined(config.borderless); + if (border_not_set && !this.setPosition && config.$topView){ + config.borderless = true; + border_not_set = false; + } + + if ((border_not_set && this.defaults.borderless) || config.borderless){ + //button and custom borderless + config._inner = { top:true, left:true, bottom:true, right:true }; + } else { + //default borders + if (!config._inner) + config._inner = {}; + this._contentobj.style.borderWidth="1px"; + } + }, + + $getSize:function(dx, dy){ + + var _borders = this._settings._inner; + if (_borders){ + dx += (_borders.left?0:1)+(_borders.right?0:1); + dy += (_borders.top?0:1)+(_borders.bottom?0:1); + } + + var size = webix.ui.baseview.prototype.$getSize.call(this, dx, dy); + + webix.debug_size_box(this, size, true); + return size; + }, + $setSize:function(x,y){ + webix.debug_size_box(this, [x,y]); + + var _borders = this._settings._inner; + if (_borders){ + x -= (_borders.left?0:1)+(_borders.right?0:1); + y -= (_borders.top?0:1)+(_borders.bottom?0:1); + } + + return webix.ui.baseview.prototype.$setSize.call(this,x,y); + }/*, + resize:function(x,y){ + var _borders = this._settings._inner; + if (_borders){ + if (x>=0) + x += (_borders.left?0:1)+(_borders.right?0:1); + if (y>=0) + y += (_borders.top?0:1)+(_borders.bottom?0:1); + } + return webix.ui.baseview.prototype.resize.call(this,x,y); + }*/ +}, webix.ui.baseview); + +})(); + +webix.ui.view.call(webix); + +webix.debug_size_indent = 0; +webix.debug_size_step = function(){ + var str = ""; + for (var i=0; i this._cells.length) + target_id = this._cells.length; + var prev_node = (this._cells[target_id]||{})._viewobj; + webix.PowerArray.insertAt.call(this._cells, new_view, target_id); + if (!new_view._settings.hidden) + webix.html.insertBefore(new_view._viewobj, prev_node, this._dataobj); + } else { + source = webix.$$(target_id); + target_id = webix.PowerArray.find.call(this._cells, source); + webix.assert(target_id!=-1, "Attempt to replace the non-existing view"); + var parent = source._viewobj.parentNode; + if (parent && !new_view._settings.hidden) + parent.insertBefore(new_view._viewobj, source._viewobj); + + source.destructor(); + this._cells[target_id] = new_view; + } + + if (!this._vertical_orientation) + this._fix_vertical_layout(new_view); + + this._cells[target_id]._parent_cell = this; + } + this.resizeChildren(true); + + var form = this.elements ? this : this.getFormView(); + if (form) form._recollect_elements(); + + webix.callEvent("onReconstruct",[this]); + }, + _fix_vertical_layout:function(cell){ + cell._viewobj.style.display = "inline-block"; + cell._viewobj.style.verticalAlign = "top"; + }, + addView:function(view, index){ + if (webix.isUndefined(index)) + index = this._cells.length; + return webix.ui(view, this, index)._settings.id; + }, + removeView:function(id){ + var view; + if (typeof id != "object") + view = webix.$$(id); + else + view = id; + + var target = webix.PowerArray.find.call(this._cells, view); + if (target >= 0){ + if (this._beforeRemoveView) + this._beforeRemoveView(target, view); + + var form = this.elements ? this : this.getFormView(); + + this._cells.splice(target, 1); + if (form) + webix.ui.each(view, function(sub){ + if (sub.name) + delete form.getCleanValues()[sub.config.name]; + }, form, true); + + view.destructor(); + this.resizeChildren(true); + + if (form) + form._recollect_elements(); + } else + webix.assert(false, "Attemp to remove not existing view: "+id); + + webix.callEvent("onReconstruct",[this]); + }, + reconstruct:function(){ + this._replace(this._collection); + }, + _hide:function(obj, settings, silent){ + if (obj._settings.hidden) return; + obj._settings.hidden = true; + webix.html.remove(obj._viewobj); + this._hiddencells++; + if (!silent && !webix._ui_creation) + this.resizeChildren(true); + }, + _signal_hidden_cells:function(view){ + if (view.callEvent) + view.callEvent("onViewShow",[]); + }, + resizeChildren:function(){ + if (webix.ui.$freeze) return; + + if (this._layout_sizes){ + var parent = this.getParentView(); + if (parent){ + if (parent.resizeChildren) + return parent.resizeChildren(); + else + return parent.resize(); + } + + var sizes = this.$getSize(0,0); + + var x,y,nx,ny; + nx = x = this._layout_sizes[0] || 0; + ny = y = this._layout_sizes[1] || 0; + + if (!parent){ + //minWidth + if (sizes[0]>x) nx = sizes[0]; + //minHeight + if (sizes[2]>y) ny = sizes[2]; + + //maxWidth rule + if (x>sizes[1]) nx = sizes[1]; + //maxHeight rule + if (y>sizes[3]) ny = sizes[3]; + + this.$setSize(nx,ny); + } else + this._set_child_size(x,y); + } + }, + getChildViews:function(){ + return this._cells; + }, + index:function(obj){ + if (obj._settings) + obj = obj._settings.id; + for (var i=0; i < this._cells.length; i++) + if (this._cells[i]._settings.id == obj) + return i; + return -1; + }, + _show:function(obj, settings, silent){ + + if (!obj._settings.hidden) return; + obj._settings.hidden = false; + + //index of sibling cell, next to which new item will appear + var index = this.index(obj)+1; + //locate nearest visible cell + while (this._cells[index] && this._cells[index]._settings.hidden) index++; + var view = this._cells[index] ? this._cells[index]._viewobj : null; + + webix.html.insertBefore(obj._viewobj, view, (this._dataobj||this._viewobj)); + this._hiddencells--; + + if (!silent){ + this.resizeChildren(true); + if (obj.refresh) + obj.refresh(); + } + + if (obj.callEvent){ + obj.callEvent("onViewShow", []); + webix.ui.each(obj, this._signal_hidden_cells); + } + }, + showBatch:function(name){ + if (this._settings.visibleBatch == name) return; + this._settings.visibleBatch = name; + + var show = []; + for (var i=0; i < this._cells.length; i++){ + if (!this._cells[i]._settings.batch) + show.push(this._cells[i]); + else if (this._cells[i]._settings.batch == name) + show.push(this._cells[i]); + else + this._hide(this._cells[i], null, true); + } + for (var i=0; i < show.length; i++) + this._show(show[i], null, true); + + this.resizeChildren(true); + }, + _parse_cells:function(collection){ + this._cells=[]; + + webix.assert(collection,this.name+" was incorrectly defined.

    You have missed rows|cols|cells|elements collection"); + for (var i=0; i
    "; + + this._contentobj = this._viewobj; + this._headobj = this._contentobj.childNodes[0]; + if(!config.header) + this._headobj.style.display = "none"; + this._headlabel = this._contentobj.childNodes[0].childNodes[1]; + this._headbutton = this._contentobj.childNodes[0].childNodes[0]; + this._bodyobj = this._contentobj.childNodes[1]; + this._viewobj.className +=" webix_accordionitem"; + this._head_cell = this._body_cell = null; + this._cells = true; + }, + _remove:function(){ + this._body_cell = { destructor:function(){} }; + }, + _replace:function(new_view){ + this._body_cell.destructor(); + this._body_cell = new_view; + this._body_cell._parent_cell = this; + + this._bodyobj.appendChild(this._body_cell._viewobj); + this.resize(); + }, + _id:"webix_ai_id", + getChildViews:function(){ + return [this._body_cell]; + }, + body_setter:function(value){ + if (typeof value != "object") + value = {template:value }; + + value._inner = { top:true, left:true, right:true, bottom:true}; + this._body_cell = webix.ui._view(value); + this._body_cell.$view.style.border = "0px solid red"; + this._body_cell._parent_cell = this; + + this._bodyobj.appendChild(this._body_cell._viewobj); + return value; + }, + header_setter:function(value){ + if(value) + value = webix.template(value); + return value; + }, + headerAlt_setter:function(value){ + if(value) + value = webix.template(value); + return value; + }, + $getSize:function(dx, dy){ + var size = this._body_cell.$getSize(0, 0); + + //apply external border to inner content sizes + var _borders = this._settings._inner; + if (_borders){ + dx += (_borders.left?0:1)+(_borders.right?0:1); + dy += (_borders.top?0:1)+(_borders.bottom?0:1); + } + + var header = 0; + var self_size = webix.ui.baseview.prototype.$getSize.call(this, 0, 0); + //use child settings if layout's one was not defined + self_size[0] = (self_size[0] || size[0] ) +dx; + if (self_size[1] >= 100000) + self_size[1] = size[1]; + self_size[1] += dx; + + self_size[2] = (self_size[2] || size[2] ) +dy; + if (self_size[3] >= 100000) + self_size[3] = size[3]; + self_size[3] += dy; + + if(this.getParentView()._vertical_orientation){ + if (this._settings.collapsed){ + self_size[2] = self_size[3] = this._getHeaderSize(); + } else if(this._settings.header) + header = this._settings.headerHeight; + } else { + if (this._settings.collapsed) + self_size[0] = self_size[1] = this._getHeaderSize(); + if(this._settings.header) + header = this._settings.headerHeight; + } + + //include header in total height calculation + self_size[2] += header; + self_size[3] += header; + webix.debug_size_box(this, self_size, true); + return self_size; + }, + on_click:{ + webix_accordionitem_header:function(e, id){ + this._toggle(e); + return false; + }, + webix_accordionitem_header_v:function(e, id){ + this._toggle(e); + return false; + } + }, + _toggle:function(e){ + this.define("collapsed", !this._settings.collapsed); + }, + collapsed_setter:function(value){ + if (this._settings.header === false) return; + //use last layout element if parent is not known yet + var parent = this.getParentView(); + if(!value) + this._expand(); + else + if (!parent || parent._canCollapse(this)) + this._collapse(); + else{ + if(parent._cells.length > 1) + for (var i=0; i < parent._cells.length; i++) + if (this != parent._cells[i]){ + parent._cells[i].expand(); + this._collapse(); + //return false + } + } + + + this._settings.collapsed = value; + if (!value) this.getParentView()._afterOpen(this); + + this.refresh(); + if (!webix._ui_creation) + this.resize(); + + parent.callEvent("onAfter"+(value?"Collapse":"Expand"), [this._settings.id]); + + this._settings.$noresize = value; + + return value; + }, + collapse:function(){ + this.define("collapsed", true); + webix.UIManager._moveChildFocus(this); + }, + expand:function(){ + this.define("collapsed", false); + }, + _show: function() { + this.show(); + }, + _hide: function() { + this.hide(); + }, + _expand:function(){ + this._bodyobj.style.display = ""; + webix.html.removeCss(this.$view, "collapsed"); + webix.html.removeCss(this._headobj, "collapsed"); + }, + _collapse:function(){ + var vertical = this.getParentView()._vertical_orientation; + //this._original_size = (vertical?this._settings.height:this._settings.width)||-1; + + if(this._settings.headerAlt) + this._headlabel.innerHTML = this._settings.headerAlt(); + this._bodyobj.style.display = "none"; + webix.html.addCss(this.$view, "collapsed"); + webix.html.addCss(this._headobj, "collapsed"); + }, + refresh:function(){ + var template = this._settings[this._settings.collapsed?"headerAlt":"header"] ||this._settings.header; + if (template) + this._headlabel.innerHTML = template(); + var css = this.getParentView()._vertical_orientation?"vertical":"horizontal"; + if(this._viewobj.className.indexOf(" "+css) < 0 ){ + webix.html.addCss(this._viewobj, css); + } + + }, + _getHeaderSize:function(){ + return (this._settings.collapsed?this._settings.headerAltHeight:this._settings.headerHeight); + }, + $setSize:function(x,y){ + if (webix.ui.view.prototype.$setSize.call(this,x,y)){ + x = this._content_width; + y = this._content_height; + + var headerSize = this._getHeaderSize();//-(this._settings._inner.top?0:1); + if (this._settings.header){ + + this._headobj.style.height=headerSize+"px"; + this._headobj.style.width="auto"; + this._headobj.style[webix.env.transform]=""; + + + this._headobj.style.borderBottomWidth = (this._settings.collapsed?0:1)+"px"; + + if(this.getParentView()._vertical_orientation||!this._settings.collapsed){ + y-=this._getHeaderSize(); + } else if (this._settings.collapsed){ + //-2 - borders + if (webix.animate.isSupported()){ + this._headobj.style.width = y + "px"; + this._headobj.style.height = x + 3 + "px"; + var d = Math.floor(y/2-x/2)+(x-this._settings.headerAltHeight)/2; + this._headobj.style[webix.env.transform]="rotate(90deg) translate("+d+"px, "+(d+1)+"px)"; + } + else { //IE8 fix + this._headobj.style.width = x + "px"; + this._headobj.style.height = y + 3 + "px"; + this._headlabel.innerHTML = ""; + } + + } + } + if(!this._settings.collapsed){ + this._body_cell.$setSize(x,y); + this._last_size_y = y; + } + } else if (!this._settings.collapsed){ + var body = this._body_cell; + if (this._last_size_y) + body.$setSize(this._content_width, this._last_size_y); + } + }, + $skin:function(){ + var defaults = this.defaults; + defaults.headerAltHeight = defaults.headerHeight = webix.skin.$active.barHeight; + if(webix.skin.$active.borderlessAccordion) + defaults.borderless = true; + }, + defaults:{ + header:false, + headerAlt:false, + body:"" + } +}, webix.MouseEvents, webix.EventSystem, webix.ui.view); + +webix.protoUI({ + name:"accordion", + defaults:{ + panelClass:"accordionitem", + multi:false, + collapsed:false + }, + addView:function(view){ + //adding view to the accordion + var id = webix.ui.layout.prototype.addView.apply(this, arguments); + var child = webix.$$(id); + //repainting sub-panels in the accordion + if (child.collapsed_setter && child.refresh) child.refresh(); + return id; + }, + _parse_cells:function(){ + var panel = this._settings.panelClass; + var cells = this._collection; + + for (var i=0; i=0 &&!found; i--){ + if(!this._cells[i]._settings.hidden){ + this._cells[i]._accLastChild = true; + found = true; + } + } + + }, + _afterOpen:function(view){ + if (this._settings.multi === false && this._skin_render_collapse !== true){ + for (var i=0; i < this._cells.length; i++) { + if (view != this._cells[i] && !this._cells[i]._settings.collapsed && this._cells[i].collapse) + this._cells[i].collapse(); + } + } + }, + _canCollapse:function(view){ + if (this._settings.multi === true || this._skin_render_collapse) return true; + //can collapse only if you have other item to open + for (var i=0; i < this._cells.length; i++) + if (view != this._cells[i] && !this._cells[i]._settings.collapsed) + return true; + return false; + }, + $skin:function(){ + var defaults = this.defaults; + if(webix.skin.$active.accordionType) + defaults.type = webix.skin.$active.accordionType; + } +}, webix.ui.layout); + +webix.protoUI({ + name:"headerlayout", + defaults:{ + type: "accordion", + multi:"mixed", + collapsed:false + } +}, webix.ui.accordion); + + + + + +/* + Behavior:DND - low-level dnd handling + @export + getContext + addDrop + addDrag + + DND master can define next handlers + onCreateDrag + onDragIng + onDragOut + onDrag + onDrop + all are optional +*/ + + + +webix.DragControl={ + //has of known dnd masters + _drag_masters : webix.toArray(["dummy"]), + /* + register drop area + @param node html node or ID + @param ctrl options dnd master + @param master_mode true if you have complex drag-area rules + */ + addDrop:function(node,ctrl,master_mode){ + node = webix.toNode(node); + node.webix_drop=this._getCtrl(ctrl); + if (master_mode) node.webix_master=true; + }, + //return index of master in collection + //it done in such way to prevent dnd master duplication + //probably useless, used only by addDrop and addDrag methods + _getCtrl:function(ctrl){ + ctrl = ctrl||webix.DragControl; + var index = this._drag_masters.find(ctrl); + if (index<0){ + index = this._drag_masters.length; + this._drag_masters.push(ctrl); + } + return index; + }, + /* + register drag area + @param node html node or ID + @param ctrl options dnd master + */ + addDrag:function(node,ctrl){ + node = webix.toNode(node); + node.webix_drag=this._getCtrl(ctrl); + webix.event(node,webix.env.mouse.down,this._preStart,node); + webix.event(node,"dragstart",webix.html.preventEvent); + }, + //logic of drag - start, we are not creating drag immediately, instead of that we hears mouse moving + _preStart:function(e){ + if (webix.DragControl._active){ + //if we have nested drag areas, use the top one and ignore the inner one + if (webix.DragControl._saved_event == e) return; + webix.DragControl._preStartFalse(); + webix.DragControl.destroyDrag(e); + } + webix.DragControl._active=this; + + var evobj = webix.env.mouse.context(e); + webix.DragControl._start_pos=evobj; + + webix.DragControl._saved_event = e; + webix.DragControl._webix_drag_mm = webix.event(document.body,webix.env.mouse.move,webix.DragControl._startDrag); + webix.DragControl._webix_drag_mu = webix.event(document.body,webix.env.mouse.up,webix.DragControl._preStartFalse); + + //need to run here, or will not work in IE + webix.html.addCss(document.body,"webix_noselect", 1); + }, + //if mouse was released before moving - this is not a dnd, remove event handlers + _preStartFalse:function(e){ + webix.DragControl._clean_dom_after_drag(); + }, + //mouse was moved without button released - dnd started, update event handlers + _startDrag:function(e){ + //prevent unwanted dnd + var pos = webix.env.mouse.context(e); + if (Math.abs(pos.x-webix.DragControl._start_pos.x)<5 && Math.abs(pos.y-webix.DragControl._start_pos.y)<5) + return; + + webix.DragControl._clean_dom_after_drag(true); + + if (!webix.DragControl.createDrag(webix.DragControl._saved_event)) return; + + webix.DragControl.sendSignal("start"); //useless for now + webix.DragControl._webix_drag_mm = webix.event(document.body,webix.env.mouse.move,webix.DragControl._moveDrag); + webix.DragControl._webix_drag_mu = webix.event(document.body,webix.env.mouse.up,webix.DragControl._stopDrag); + webix.DragControl._moveDrag(e); + + if (webix.env.touch) + return webix.html.preventEvent(e); + }, + //mouse was released while dnd is active - process target + _stopDrag:function(e){ + webix.DragControl._clean_dom_after_drag(); + webix.DragControl._saved_event = null; + + if (webix.DragControl._last){ //if some drop target was confirmed + webix.DragControl.$drop(webix.DragControl._active, webix.DragControl._last, e); + webix.DragControl.$dragOut(webix.DragControl._active,webix.DragControl._last,null,e); + } + webix.DragControl.destroyDrag(e); + webix.DragControl.sendSignal("stop"); //useless for now + }, + _clean_dom_after_drag:function(still_drag){ + this._webix_drag_mm = webix.eventRemove(this._webix_drag_mm); + this._webix_drag_mu = webix.eventRemove(this._webix_drag_mu); + if (!still_drag) + webix.html.removeCss(document.body,"webix_noselect"); + }, + //dnd is active and mouse position was changed + _moveDrag:function(e){ + var pos = webix.html.pos(e); + var evobj = webix.env.mouse.context(e); + + //give possibility to customize drag position + webix.DragControl.$dragPos(pos, e); + + //adjust drag marker position + webix.DragControl._html.style.top=pos.y+webix.DragControl.top +"px"; + webix.DragControl._html.style.left=pos.x+webix.DragControl.left+"px"; + + if (webix.DragControl._skip) + webix.DragControl._skip=false; + else { + var target = evobj.target = webix.env.touch ? document.elementFromPoint(evobj.x, evobj.y) : evobj.target; + var touch_event = webix.env.touch ? evobj : e; + webix.DragControl._checkLand(target, touch_event); + } + + return webix.html.preventEvent(e); + }, + //check if item under mouse can be used as drop landing + _checkLand:function(node,e){ + while (node && node.tagName!="BODY"){ + if (node.webix_drop){ //if drop area registered + if (this._last && (this._last!=node || node.webix_master)) //if this area with complex dnd master + this.$dragOut(this._active,this._last,node,e); //inform master about possible mouse-out + if (!this._last || this._last!=node || node.webix_master){ //if this is new are or area with complex dnd master + this._last=null; //inform master about possible mouse-in + this._landing=this.$dragIn(webix.DragControl._active,node,e); + if (this._landing) //landing was rejected + this._last=node; + return; + } + return; + } + node=node.parentNode; + } + if (this._last) //mouse was moved out of previous landing, and without finding new one + this._last = this._landing = this.$dragOut(this._active,this._last,null,e); + }, + //mostly useless for now, can be used to add cross-frame dnd + sendSignal:function(signal){ + webix.DragControl.active=(signal=="start"); + }, + + //return master for html area + getMaster:function(t){ + return this._drag_masters[t.webix_drag||t.webix_drop]; + }, + //return dhd-context object + getContext:function(){ + return this._drag_context; + }, + getNode:function(){ + return this._html; + }, + //called when dnd is initiated, must create drag representation + createDrag:function(e){ + var a=webix.DragControl._active; + webix.DragControl._drag_context = {}; + var master = this._drag_masters[a.webix_drag]; + var drag_container; + + //if custom method is defined - use it + if (master.$dragCreate){ + drag_container=master.$dragCreate(a,e); + if (!drag_container) return false; + drag_container.style.position = 'absolute'; + } else { + //overvise use default one + var text = webix.DragControl.$drag(a,e); + if (!text) return false; + drag_container = document.createElement("DIV"); + drag_container.innerHTML=text; + drag_container.className="webix_drag_zone"; + document.body.appendChild(drag_container); + } + /* + dragged item must have topmost z-index + in some cases item already have z-index + so we will preserve it if possible + */ + drag_container.style.zIndex = Math.max(drag_container.style.zIndex,webix.ui.zIndex()); + + webix.DragControl._skipDropH = webix.event(drag_container,webix.env.mouse.move,webix.DragControl._skip_mark); + + if (!webix.DragControl._drag_context.from) + webix.DragControl._drag_context = {source:a, from:a}; + + webix.DragControl._html=drag_container; + return true; + }, + //helper, prevents unwanted mouse-out events + _skip_mark:function(){ + webix.DragControl._skip=true; + }, + //after dnd end, remove all traces and used html elements + destroyDrag:function(e){ + var a=webix.DragControl._active; + var master = this._drag_masters[a.webix_drag]; + + if (master && master.$dragDestroy){ + webix.DragControl._skipDropH = webix.eventRemove(webix.DragControl._skipDropH); + if(webix.DragControl._html) + master.$dragDestroy(a,webix.DragControl._html,e); + } + else{ + webix.html.remove(webix.DragControl._html); + } + webix.DragControl._landing=webix.DragControl._active=webix.DragControl._last=webix.DragControl._html=null; + }, + top:5, //relative position of drag marker to mouse cursor + left:5, + + $dragPos:function(pos, e){ + var m=this._drag_masters[webix.DragControl._active.webix_drag]; + if (m.$dragPos && m!=this) + m.$dragPos(pos, e, webix.DragControl._html); + }, + //called when mouse was moved in drop area + $dragIn:function(s,t,e){ + var m=this._drag_masters[t.webix_drop]; + if (m.$dragIn && m!=this) return m.$dragIn(s,t,e); + t.className=t.className+" webix_drop_zone"; + return t; + }, + //called when mouse was moved out drop area + $dragOut:function(s,t,n,e){ + var m=this._drag_masters[t.webix_drop]; + if (m.$dragOut && m!=this) return m.$dragOut(s,t,n,e); + t.className=t.className.replace("webix_drop_zone",""); + return null; + }, + //called when mouse was released over drop area + $drop:function(s,t,e){ + var m=this._drag_masters[t.webix_drop]; + webix.DragControl._drag_context.from = webix.DragControl.getMaster(s); + if (m.$drop && m!=this) return m.$drop(s,t,e); + t.appendChild(s); + }, + //called when dnd just started + $drag:function(s,e){ + var m=this._drag_masters[s.webix_drag]; + if (m.$drag && m!=this) return m.$drag(s,e); + return "
    "+s.innerHTML+"
    "; + } +}; +/* + Behavior:DataMove - allows to move and copy elements, heavily relays on DataStore.move + @export + copy + move +*/ +webix.DataMove={ + //creates a copy of the item + copy:function(sid,tindex,tobj, details){ + details = details || {}; + var new_id = details.newId || sid; + tobj = tobj||this; + + var data = this.getItem(sid); + webix.assert(data,"Incorrect ID in DataMove::copy"); + + //make data conversion between objects + if (tobj) + data = tobj._externalData(data); + + //adds new element same as original + return tobj.data.add(tobj._externalData(data,new_id),tindex); + }, + _next_move_index:function(nid, next, source){ + if (next && nid){ + var new_index = this.getIndexById(nid); + return new_index+(source == this && source.getIndexById(next) 3) //heuristic value, duplicated below + this.$blockRender = tobj.$blockRender = true; + + for (var i=0; i < sid.length; i++) { + //increase index for each next item in the set, so order of insertion will be equal to order in the array + var nid = this.move(sid[i], tindex, tobj, details); + tindex = tobj._next_move_index(nid, sid[i+1], this); + } + + this.$blockRender = tobj.$blockRender = false; + if (sid.length > 3){ + //repaint whole component + this.refresh(); + if (tobj != this) + tobj.refresh(); + } + return; + } + + var nid = sid; //id after moving + + var data = this.getItem(sid); + webix.assert(data,"Incorrect ID in DataMove::move"); + + if (!tobj || tobj == this){ + if (tindex < 0) tindex = this.data.order.length - 1; + this.data.move(this.getIndexById(sid),tindex); //move inside the same object + this.data.callEvent("onDataMove", [sid, tindex]); + } else { + //copy to the new object + nid = tobj.data.add(tobj._externalData(data,new_id),tindex, (details.parent || 0)); + this.data.remove(sid);//delete in old object + } + return nid; //return ID of item after moving + }, + //move item on one position up + moveUp:function(id,step){ + return this.move(id,this.getIndexById(id)-(step||1)); + }, + //move item on one position down + moveDown:function(id,step){ + return this.moveUp(id, (step||1)*-1); + }, + //move item to the first position + moveTop:function(id){ + return this.move(id,0); + }, + //move item to the last position + moveBottom:function(id){ + return this.move(id,this.data.count()-1); + }, + /* + this is a stub for future functionality + currently it just makes a copy of data object, which is enough for current situation + */ + _externalData:function(data,id){ + var newdata = webix.extend({},data); + newdata.id = (!id || this.data.pull[id])?webix.uid():id; + + + newdata.$template=null; + + if (this._settings.externalData) + newdata = this._settings.externalData.call(this, newdata, id); + return newdata; + } +}; + + +webix.Movable = { + move_setter: function (value) { + if (value){ + this._move_admin = webix.clone(this._move_admin); + this._move_admin.master = this; + + webix.DragControl.addDrag(this._headobj, this._move_admin); + } + return value; + }, + _move_admin: { + $dragCreate:function(object, e){ + var offset = webix.html.offset(object); + var pos = webix.html.pos(e); + webix.DragControl.top = offset.y - pos.y; + webix.DragControl.left = offset.x - pos.x; + + return webix.toNode(this.master._viewobj); + }, + $dragDestroy:function(node, drag){ + var view = this.master; + if (view._settings){ + view._settings.top = parseInt(drag.style.top,10); + view._settings.left = parseInt(drag.style.left,10); + } + + webix.DragControl.top = webix.DragControl.left = 5; + this.master.callEvent("onViewMoveEnd", []); + return; + }, + $dragPos:function(pos, e){ + this.master.callEvent("onViewMove", [pos, e]); + } + } +}; + + + +webix.Modality = { + _modal_set:function(value){ + if (value){ + if (!this._modal_cover){ + this._modal_cover = webix.html.create('div',{ + "class":"webix_modal" + }); + + /* with below code we will have the same zIndex for modal layer as for the previous + abs positioned element, but because of attaching order modal layer will be on top anyway + */ + var zIndex = this._settings.zIndex||webix.ui.zIndex(); + + //set topmost modal layer + this._previous_modality = webix._modality; + webix._modality = zIndex; + + + this._modal_cover.style.zIndex = zIndex-1; + this._viewobj.style.zIndex = zIndex; + document.body.appendChild(this._modal_cover); + } + } + else { + if (this._modal_cover){ + webix.html.remove(this._modal_cover); + + //restore topmost modal layer + //set delay, as current window closing may have not finished click event + //need to wait while it is not fully processed + var topmost = this._previous_modality; + setTimeout(function(){ webix._modality = topmost; }, 1); + + this._modal_cover = null; + } + } + return value; + } +}; + + +webix.protoUI({ + name:"window", + + $init:function(config){ + this._viewobj.innerHTML = "
    "; + + this._contentobj = this._viewobj.firstChild; + this._headobj = this._contentobj.childNodes[0]; + this._dataobj = this._bodyobj = this._contentobj.childNodes[1]; + this._viewobj.className +=" webix_window"; + + this._head_cell = this._body_cell = null; + this._settings._inner = {top:false, left:false, right:false, bottom:false }; //set border flags + if (!config.id) config.id = webix.uid(); + + webix.event(this._contentobj, "click", webix.bind(this._ignore_clicks, this)); + + // hidden_setter handling + if(config.modal) + this._modal = true; + }, + _ignore_clicks:function(e){ + var popups = webix.ui._popups; + var index = popups.find(this); + if (index == -1) + index = popups.length - 1; + + e.click_view = index; + if (webix.env.isIE8) + e.srcElement.click_view = index; + }, + getChildViews:function(){ + if (this._head_cell) + return [this._head_cell, this._body_cell]; + else + return [this._body_cell]; + }, + zIndex_setter:function(value){ + this._viewobj.style.zIndex = value; + return value; + }, + _remove:function(){ + this._body_cell = { destructor:function(){} }; + }, + _replace:function(new_view){ + this._body_cell.destructor(); + this._body_cell = new_view; + this._body_cell._parent_cell = this; + + this._bodyobj.appendChild(this._body_cell._viewobj); + + var cell = this._body_cell._viewobj.style; + cell.borderTopWidth = cell.borderBottomWidth = cell.borderLeftWidth = cell.borderRightWidth = "1px"; + this._body_cell._settings._inner = webix.clone(this._settings._inner); + + this.resize(true); + }, + show:function(node, mode, point){ + if(!this.callEvent("onBeforeShow",arguments)) + return false; + + this._settings.hidden = false; + this._viewobj.style.zIndex = (this._settings.zIndex||webix.ui.zIndex()); + if (this._settings.modal || this._modal){ + this._modal_set(true); + this._modal = null; // hidden_setter handling + } + + var pos, dx, dy; + mode = mode || {}; + if (!mode.pos) + mode.pos = this._settings.relative; + + //get position of source html node + //we need to show popup which pointing to that node + if (node){ + //if event was provided - get node info from it + if (typeof node == "object" && !node.tagName){ + /*below logic is far from ideal*/ + if (node.target || node.srcElement){ + pos = webix.html.pos(node); + dx = 20; + dy = 5; + } else + pos = node; + + + } else { + node = webix.toNode(node); + webix.assert(node,"Not existing target for window:show"); + pos = webix.html.offset(node); + } + + //size of body, we need to fit popup inside + var x = Math.max(window.innerWidth || 0, document.body.offsetWidth); + var y = Math.max(window.innerHeight || 0, document.body.offsetHeight); + + //size of node, near which popup will be rendered + dx = dx || node.offsetWidth || 0; + dy = dy || node.offsetHeight || 0; + //size of popup element + var size = this._last_size; + + var fin_x = pos.x; + var fin_y = pos.y; + var point_y=0; + var point_x = 0; + + if (this._settings.autofit){ + var delta_x = 6; var delta_y=6; var delta_point = 6; + + //default pointer position - top + point = "top"; + fin_y=0; fin_x = 0; + //if we want to place menu at righ, but there is no place move it to left instead + if (x - pos.x - dx < size[0] && mode.pos == "right") + mode.pos = "left"; + + if (mode.pos == "right"){ + fin_x = pos.x+delta_x+dx; + delta_y = -dy; + point = "left"; + point_y = Math.round(pos.y+dy/2); + point_x = fin_x - delta_point; + } else if (mode.pos == "left"){ + fin_x = pos.x-delta_x-size[0]-1; + delta_y = -dy; + point = "right"; + point_y = Math.round(pos.y+dy/2); + point_x = fin_x + size[0]+1; + } else { + //left border of screen + if (pos.x < 0){ + fin_x = 0; + //popup exceed the right border of screen + } else if (x-pos.x > size[0]){ + fin_x = pos.x; //aligned + } else{ + fin_x = x-delta_x-size[0]; //not aligned + } + + point_x = Math.round(pos.x+dx/2); + //when we have a small popup, point need to be rendered at center of popup + if (point_x > fin_x + size[0]) + point_x = fin_x + size[0]/2; + } + + //if height is not fixed - use default position + if ((!size[1] || (y-dy-pos.y-delta_y > size[1])) && mode.pos != "top"){ + //bottom + fin_y = dy+pos.y+delta_y - 4; + if (!point_y){ + point = "top"; + point_y = fin_y-delta_point; + } + } else { + //top + fin_y = pos.y-delta_y - size[1]; + if (fin_y < 0){ + fin_y = 0; + //left|right point can be used, but there is no place for top point + if (point == "top") point = false; + } else if (!point_y){ + point = "bottom"; + fin_y --; + point_y = fin_y+size[1]+1; + } + } + } + + var deltax = (mode.x || 0); + var deltay = (mode.y || 0); + this.setPosition(fin_x+deltax, fin_y+deltay); + if (this._set_point){ + if (point) + this._set_point(point,point_x+deltax, point_y+deltay); + else + this._hide_point(); + } + } else if (this._settings.position) + this._setPosition(); + + this._viewobj.style.display = "block"; + this._hide_timer = 1; + webix.delay(function(){ this._hide_timer = 0; }, this, [], (webix.env.touch ? 400 : 100 )); + + this._render_hidden_views(); + + + if (this.config.autofocus){ + this._prev_focus = webix.UIManager.getFocus(); + webix.UIManager.setFocus(this); + } + + if (-1 == webix.ui._popups.find(this)) + webix.ui._popups.push(this); + + this.callEvent("onShow",[]); + }, + _hide:function(e){ + //do not hide modal windows + if (this._settings.hidden || this._settings.modal || this._hide_timer || (e && e.showpopup)) return; + //do not hide popup, when we have modal layer above the popup + if (webix._modality && this._settings.zIndex <= webix._modality) return; + + //ignore inside clicks and clicks in child-popups + + if (e){ + var index = webix.env.isIE8 ? e.srcElement.click_view : e.click_view; + if (!index && index !== 0) index = -1; + + var myindex = webix.ui._popups.find(this); + if (myindex <= index) return; + } + + this.hide(); + }, + hidden_setter:function(value){ + if(value) + this.hide(); + else + this.show(); + return !!value; + }, + hide:function(force){ + if (!force) + if(this._settings.hidden) return; + + if (this._settings.modal) + this._modal_set(false); + + if (this._settings.position == "top"){ + webix.animate(this._viewobj, {type: 'slide', x:0, y:-(this._content_height+20), duration: 300, + callback:this._hide_callback, master:this}); + } + else + this._hide_callback(); + + if (this._settings.autofocus){ + webix.UIManager.setFocus(this._prev_focus); + this._prev_focus = null; + } + + this._hide_sub_popups(); + }, + //hide all child-popups + _hide_sub_popups:function(){ + var order = webix.ui._popups; + var index = order.find(this); + var size = order.length - 1; + + if (index > -1) + for (var i = size; i > index; i--) + if (order[i]._hide_point) //hide only popups, skip windows + order[i].hide(); + + order.removeAt(index); + }, + destructor: function() { + if (this._settings.autofocus){ + if (!webix._final_destruction) + webix.UIManager.setFocus(this._prev_focus); + this._prev_focus = null; + } + + this._hide_sub_popups(); + webix.Destruction.destructor.apply(this, []); + }, + _hide_callback:function(){ + if (!this.$destructed){ + this._viewobj.style.display = "none"; + this._settings.hidden = true; + this.callEvent("onHide",[]); + } + }, + close:function(){ + this._modal_set(false); + + webix.html.remove(this._viewobj); + this.destructor(); + }, + _inner_body_set:function(value){ + value.borderless = true; + }, + body_setter:function(value){ + if (typeof value != "object") + value = {template:value }; + this._inner_body_set(value); + + webix._parent_cell = this; + this._body_cell = webix.ui._view(value); + this._body_cell._parent_cell = this; + + this._bodyobj.appendChild(this._body_cell._viewobj); + return value; + }, + head_setter:function(value){ + if (value === false) return value; + if (typeof value != "object") + value = { template:value, padding:0 }; + + value.borderless = true; + + webix._parent_cell = this; + this._head_cell = webix.ui._view(value); + this._head_cell._parent_cell = this; + + this._headobj.appendChild(this._head_cell._viewobj); + return value; + }, + getBody:function(){ + return this._body_cell; + }, + getHead:function(){ + return this._head_cell; + }, + adjust:function(){ return this.resize(); }, + resizeChildren:function(){ + if (this._body_cell) + this.resize(); + }, + resize:function(){ + webix.ui.baseview.prototype.adjust.call(this); + this._setPosition(this._settings.left, this._settings.top); + }, + _setPosition:function(x,y){ + if (this._settings.position){ + this.$view.style.position = "fixed"; + + var width = this._content_width; + var height = this._content_height; + webix.assert(width && height, "Attempt to show not rendered window"); + + var maxWidth = (window.innerWidth||document.documentElement.offsetWidth); + var maxHeight = (window.innerHeight||document.documentElement.offsetHeight); + var left = Math.round((maxWidth-width)/2); + var top = Math.round((maxHeight-height)/2); + + if (typeof this._settings.position == "function"){ + var state = { left:left, top:top, + width:width, height:height, + maxWidth:maxWidth, maxHeight:maxHeight }; + this._settings.position.call(this, state); + if (state.width != width || state.height != height) + this.$setSize(state.width, state.height); + + this.setPosition(state.left, state.top); + } else { + if (this._settings.position == "top"){ + if (webix.animate.isSupported()) + top = -1*height; + else + top = 10; + } + this.setPosition(left, top); + } + + if (this._settings.position == "top") + webix.animate(this._viewobj, {type: 'slide', x:0, y:height-((this._settings.padding||0)*2), duration: 300 ,callback:this._topPositionCallback, master:this}); + } else + this.setPosition(x,y); + }, + _topPositionCallback:function(node){ + webix.animate.clear(node); + this._settings.top=-((this._settings.padding||0)*2); + this.setPosition(this._settings.left, this._settings.top); + }, + setPosition:function(x,y){ + this._viewobj.style.top = y+"px"; + this._viewobj.style.left = x+"px"; + this._settings.left = x; this._settings.top=y; + }, + $getSize:function(dx, dy){ + var _borders = this._settings._inner; + if (_borders){ + dx += (_borders.left?0:1)+(_borders.right?0:1); + dy += (_borders.top?0:1)+(_borders.bottom?0:1); + } + //line between head and body + if (this._settings.head) + dy += 1; + + var size = this._body_cell.$getSize(0,0); + if (this._head_cell){ + var head_size = this._head_cell.$getSize(0,0); + if (head_size[3]==head_size[2]) + this._settings.headHeight = head_size[3]; + dy += this._settings.headHeight; + } + + if (this._settings.fullscreen){ + var width = window.innerWidth || document.body.clientWidth; + var height = window.innerHeight || document.body.clientHeight; + return [width, width, height, height]; + } + + //get layout sizes + var self_size = webix.ui.view.prototype.$getSize.call(this, 0, 0); + + //use child settings if layout's one was not defined + self_size[1] = Math.min(self_size[1],(size[1]>=100000&&self_size[1]>=100000?Math.max(size[0], 300):size[1])+dx); + self_size[3] = Math.min(self_size[3],(size[3]>=100000&&self_size[3]>=100000?Math.max(size[2], 200):size[3])+dy); + + self_size[0] = Math.min(Math.max(self_size[0],size[0] + dx), self_size[1]); + self_size[2] = Math.min(Math.max(self_size[2],size[2] + dy), self_size[3]); + + return self_size; + }, + $setSize:function(x,y){ + webix.ui.view.prototype.$setSize.call(this,x,y); + x = this._content_width; + y = this._content_height; + if (this._settings.head === false) { + this._headobj.style.display="none"; + this._body_cell.$setSize(x,y); + } else { + this._head_cell.$setSize(x,this._settings.headHeight); + this._body_cell.$setSize(x,y-this._settings.headHeight); + } + }, + $skin:function(){ + this.defaults.headHeight = webix.skin.$active.barHeight; + }, + defaults:{ + top:0, + left:0, + autofit:true, + relative:"bottom", + body:"", + head:"", + hidden: true, + autofocus:true + } +}, webix.ui.view, webix.Movable, webix.Modality, webix.EventSystem); + +webix.protoUI({ + name:"popup", + $init:function(){ + this._settings.head = false; + this.$view.className += " webix_popup"; + webix.attachEvent("onClick", webix.bind(this._hide, this)); + this.attachEvent("onHide", this._hide_point); + }, + close:function(){ + webix.html.remove(this._point_element); + webix.ui.window.prototype.close.call(this); + }, + $getSize:function(x,y){ + return webix.ui.window.prototype.$getSize.call(this, x+this._settings.padding*2,y+this._settings.padding*2); + }, + $setSize:function(x,y){ + webix.ui.view.prototype.$setSize.call(this,x,y); + x = this._content_width-this._settings.padding*2; + y = this._content_height-this._settings.padding*2; + this._contentobj.style.padding = this._settings.padding+"px"; + this._headobj.style.display="none"; + this._body_cell.$setSize(x,y); + }, + //redefine to preserve inner borders + _inner_body_set:function(){}, + defaults:{ + padding:8 + }, + head_setter:function(){ + }, + _set_point:function(mode, left, top){ + this._hide_point(); + document.body.appendChild(this._point_element = webix.html.create("DIV",{ "class":"webix_point_"+mode },"")); + this._point_element.style.zIndex = webix.ui.zIndex(); + this._point_element.style.top = top+"px"; + this._point_element.style.left = left+"px"; + }, + _hide_point:function(){ + this._point_element = webix.html.remove(this._point_element); + } +}, webix.ui.window); + +webix.ui._popups = webix.toArray(); + +webix.protoUI({ + name:"suggest", + defaults:{ + autofocus:false, + type:"list", + keyPressTimeout:1, + body:{ + yCount:10, + autoheight:true, + body:true, + select:true, + borderless:true, + navigation:true + }, + filter:function(item,value){ + if (item.value.toString().toLowerCase().indexOf(value.toLowerCase())===0) return true; + return false; + } + }, + template_setter:webix.template, + filter_setter:function(value){ + return webix.toFunctor(value, this.$scope); + }, + $init:function(obj){ + var temp = {}; + webix.extend(temp, webix.copy(this.defaults.body)); + temp.view = obj.type || this.defaults.type; + + var etemp = this._get_extendable_cell(temp); + if (obj.body) + webix.extend(etemp, obj.body, true); + + if (obj.data) + etemp.data = obj.data; + if (obj.url) + etemp.url = obj.url; + if (obj.datatype) + etemp.datatype = obj.datatype; + + if (obj.id) + temp.id = temp.id || (obj.id+"_"+temp.view); + + obj.body = temp; + this.$ready.push(this._set_on_popup_click); + + this._old_text = {}; + }, + _get_extendable_cell:function(obj){ + return obj; + }, + _preselectMasterOption: function(data){ + if (data){ + var master, node, text; + if (this._settings.master){ + master = webix.$$(this._settings.master); + if (master.options_setter && (node = master.getInputNode())){ + text = this.getItemText(data.id); + if (webix.isUndefined(node.value)) + node.innerHTML = text; + else + node.value = text.replace(/<[^>]*>/g,""); + } + } + } + }, + setMasterValue:function(data, refresh){ + if (this._settings.master){ + var master = webix.$$(this._settings.master); + if (refresh && data.id) + master.refresh(); + else if (master.options_setter) + master.setValue(data.id); + else if(master.setValueHere) + master.setValueHere(data.text||data.value); + else + master.setValue(data.text||data.value); + } else if (this._last_input_target){ + this._last_input_target.value = data.text||data.value; + } + + if (!refresh){ + this.hide(true); + if (this._last_input_target) + this._last_input_target.focus(); + } + this.callEvent("onValueSuggest", [data]); + webix.delay(function(){ + webix.callEvent("onEditEnd",[]); + }); + }, + getMasterValue:function(){ + if (this._settings.master) + return webix.$$(this._settings.master).getValue(); + return null; + }, + getItemText:function(id){ + var item = this.getList().getItem(id); + + if (!item) + return this._old_text[id] || ""; + + if (this._settings.template) + return this._settings.template.call(this, item, this.type); + + if (this._settings.textValue) + return item[this._settings.textValue]; + + var type = this.getList().type; + var text = type.template.call(type, item, type); + + return (this._old_text[id] = text); + }, + getSuggestion:function(){ + var list = this.getList(); + var id; + + if (list.getSelectedId) + id = list.getSelectedId(); + if (!id && list.data.order.length) + id = list.data.order[0]; + + //complex id in datatable + if (id && typeof id == "object") id = id+""; + return id; + }, + getList:function(){ + return this._body_cell; + }, + _set_on_popup_click:function(){ + var list = this.getList(); + var type = this._settings.type; + if (list.count){ + list.attachEvent("onItemClick", webix.bind(function(item){ + this.setMasterValue(list.getItem(item)); + }, this)); + list.data.attachEvent("onstoreupdated",webix.bind(function(id, obj, mode){ + if (mode == "delete" && id == this.getMasterValue()) + this.setMasterValue({ id:"", text:"" }, 1); + else if (mode == "update" && id == this.getMasterValue()){ + this.setMasterValue(obj, 1); + } + }, this)); + list.data.attachEvent("onAfterFilter", webix.bind(this._suggest_after_filter, this)); + list.data.attachEvent("onStoreLoad", webix.bind(this._suggest_after_filter, this)); + if (webix.isUndefined(this._settings.fitMaster)) + this._settings.fitMaster = true; + } else if (type == "calendar"){ + list.attachEvent("onDateSelect", function(date){ + this.getParentView().setMasterValue({ value:date}); + }); + list.attachEvent("onTodaySet", function(date){ + this.getParentView().setMasterValue({ value:date}); + }); + list.attachEvent("onDateClear", function(date){ + this.getParentView().setMasterValue({ value:date}); + }); + } else if (type == "colorboard"){ + list.attachEvent("onSelect", function(value){ + this.getParentView().setMasterValue({ value:value }); + }); + } + }, + input_setter: function(value) { + this.linkInput(value); + return 0; + }, + linkInput: function(input){ + var node; + if (input.getInputNode){ + node = input.getInputNode(); + node.webix_master_id = input._settings.id; + } else + node = webix.toNode(input); + + webix.event(node,"keydown",function(e){ + if (node != document.body || this.isVisible()) + this._suggestions(e); + },this); + + this._non_ui_mode = true; + }, + _suggestions: function(e){ + e = (e||event); + var list = this.getList(); + + var trg = e.target||e.srcElement; + + this._last_input_target = trg; + this._settings.master = trg.webix_master_id; + + window.clearTimeout(this._key_timer); + + var code = e.keyCode; + //shift and ctrl + if (code == 16 || code == 17) return; + + // tab - hide popup and do nothing + if (code == 9) + return this._tab_key(this,list); + + // escape - hide popup + if (code == 27) + return this._escape_key(this,list); + + // enter + if (code == 13) + return this._enter_key(this,list); + + // up/down are used for navigation + if (this._navigate(e)) { + webix.html.preventEvent(e); + return false; + } + + if (webix.isUndefined(trg.value)) return; + + clearTimeout(this._last_delay); + this._last_delay = webix.delay(function(){ + //focus moved to the different control, suggest is not necessary + if (!this._non_ui_mode && + webix.UIManager.getFocus() != webix.$$(this._settings.master)) return; + + this._resolve_popup = true; + //for multicombo + var val = trg.value; + + // used to prevent showing popup when it was initialized + if (list.config.dataFeed) + list.filter("value", val); + else if (list.filter){ + list.filter(webix.bind(function(item){ + return this._settings.filter.call(this,item,val); + }, this)); + } + },this, [], this._settings.keyPressTimeout); + }, + _suggest_after_filter: function() { + if (!this._resolve_popup) return true; + this._resolve_popup = false; + + var list = this.getList(); + + // filtering is complete + // if there are as min 1 variant it must be shown, hidden otherwise + if (list.count() >0){ + this.adjust(); + this._dont_unfilter = true; + this.show(this._last_input_target,null,true); + } else { + this.hide(true); + this._last_input_target = null; + } + }, + + show:function(node){ + if (!this.isVisible()){ + var list = this.getList(); + if (list.filter && !this._dont_unfilter){ + list.filter(""); + if (list.select) + this._show_selection(list); + } else + this._dont_unfilter = false; + + if(this.$customWidth){ + this.$customWidth(node); + } + if (node.tagName && this._settings.fitMaster){ + this._settings.width = node.offsetWidth -2 ; //2 - borders + } + if (list._zoom_level) + list.render(); + + this.adjust(); + } + webix.ui.popup.prototype.show.apply(this, arguments); + }, + _show_selection:function(list){ + var value = this.getMasterValue(); + if (value && list.exists && list.exists(value)) + list.select(value); + else{ + list.unselect(); + list.showItem(list.getFirstId()); + } + }, + _enter_key: function(popup,list) { + if (list.count && list.count()){ + if (popup.isVisible()) { + var value = list.getSelectedId(false, true); + if (value) + this.setMasterValue(list.getItem(value)); + + popup.hide(true); + } else { + popup.show(this._last_input_target); + } + } else { + if (popup.isVisible()) + popup.hide(true); + + } + }, + _escape_key: function(popup, list) { + return popup.hide(true); + }, + _tab_key: function(popup, list) { + return popup.hide(true); + }, + + + /*! suggestions navigation: up/down buttons move selection + * @param e + * event object + **/ + _navigate: function(e) { + var list = this.getList(); + var code = e.keyCode; + + if(list.count && list.moveSelection) { + // up arrow + if (code === 38 && !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey) { + + list.moveSelection("up"); + this._preselectMasterOption(list.getSelectedItem()); + return true; + } + + // down arrow + if (code === 40 && !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey) { + var visible = this.isVisible(); + if (!visible){ + if (list.count()) + this.show(this._last_input_target); + else return false; + } + + + var selected = list.getSelectedId(); + if (!selected && list.count) + list.select(list.getFirstId()); + else if (visible) + list.moveSelection("down"); + this._preselectMasterOption(list.getSelectedItem()); + return true; + } + } + return false; + }, + getValue:function(){ + var value = this.getList().getSelectedId() || ""; + return value.id || value; + + }, + setValue:function(value){ + var list = this.getList(); + if(value){ + if(list.exists(value)){ + list.select(value); + list.showItem(value); + } + }else{ + list.unselect(); + list.showItem(list.getFirstId()); + } + } +}, webix.ui.popup); + + +webix.attachEvent("onClick", function(e){ + var element = webix.$$(e); + if (element && element.touchable){ + //for inline elements - restore pointer to the master element + element.getNode(e); + //reaction on custom css elements in buttons + var trg=e.target||e.srcElement; + if (trg.className == "webix_disabled") + return; + + var css = ""; + var id = null; + var found = false; + if (trg.className && trg.className.toString().indexOf("webix_view")===0) return; + //loop through all parents + while (trg && trg.parentNode){ + if (trg.getAttribute){ + if (trg.getAttribute("view_id")) + break; + + css=trg.className; + if (css){ + css = css.toString().split(" "); + for (var i =0; i", ""+obj.badge+""); + return "
    "+ text + "
    "; + }, + label:"", + tabFocus:true, + borderless:true + }, + _inputTemplate:function(obj){ + var css = "class='webixtype_"+(obj.type||"base")+"' "; + return ""; + }, + $init:function(config){ + this._viewobj.className += " webix_control webix_el_"+(this.$cssName||this.name); + + this.data = this._settings; + this._dataobj = this._viewobj; + }, + hotkey_setter: function(key){ + var control = this; + this._addElementHotKey(key, function(view,ev){ + var elem = control.$view.firstChild; + if(elem.dispatchEvent){ + var clickEvent = document.createEvent('MouseEvents'); + clickEvent.initEvent('click', true, true); + ev.preventDefault(); + elem.dispatchEvent(clickEvent); + } + }); + }, + _addElementHotKey: function(key, func, view){ + var keyCode = webix.UIManager.addHotKey(key, func, view); + this.attachEvent("onDestruct", function(){ + webix.UIManager.removeHotKey(keyCode, func, view); + }); + }, + tooltip_setter: function(value){ + var box = this._getBox() || this.$view.firstChild; + if(box) + box.title = value; + return value; + }, + type_setter:function(value){ + if (this._types[value]) + this._inputTemplate = webix.template(this._types[value]); + if (value == 'prev' || value == 'next') + this._set_inner_size = this._set_inner_size_next; + else + this._set_inner_size = false; + return value; + }, + _types:{ + htmlbutton: "", + + prev:"
    ", + next:"
    ", + + imageButton:"", + imageButtonTop:"", + + image:"", + imageTop:"", + + icon:"", + iconButton:"", + iconTop:"", + iconButtonTop:"" + + }, + _findAllInputs: function(){ + var result = []; + var tagNames = ["input","select","textarea"]; + for(var i=0; i< tagNames.length; i++){ + var inputs = this.$view.getElementsByTagName(tagNames[i]); + for(var j = 0; j< inputs.length; j++){ + result.push(inputs[j]); + } + } + return result; + }, + disable: function(){ + var i, + elem = this._getBox(); + webix.ui.baseview.prototype.disable.apply(this, arguments); + if(elem && elem.className.indexOf(" webix_disabled_box")== -1){ + elem.className += " webix_disabled_box"; + var inputs = this._findAllInputs(); + for(i=0; i< inputs.length; i++) + inputs[i].setAttribute("disabled",true); + + if(this._settings.labelPosition == "top"){ + var label = this._dataobj.firstChild; + if(label) + label.className += " webix_disabled_top_label"; + } + } + }, + enable: function(){ + webix.ui.baseview.prototype.enable.apply(this, arguments); + var elem = this._getBox(); + if(elem){ + elem.className = elem.className.replace(" webix_disabled_box",""); + var inputs = this._findAllInputs(); + for(var i=0; i< inputs.length; i++) + inputs[i].removeAttribute("disabled"); + + if(this._settings.labelPosition == "top"){ + var label = this._dataobj.firstChild; + if(label) + label.className = label.className.replace(" webix_disabled_top_label",""); + } + } + }, + $setSize:function(x,y){ + if(webix.ui.view.prototype.$setSize.call(this,x,y)){ + this.render(); + } + }, + setValue:function(value){ + var oldvalue = this._settings.value; + if (oldvalue == value) return false; + + this._settings.value = value; + + if (this._rendered_input) + this.$setValue(value); + + this.callEvent("onChange", [value, oldvalue]); + }, + //visual part of setValue + $setValue:function(value){ +// this._settings.label = value; + (this.getInputNode()||{}).value = value; + }, + getValue:function(){ + //if button was rendered - returning actual value + //otherwise - returning last set value + var value = this._rendered_input? this.$getValue() : this._settings.value; + return (typeof value == "undefined") ? "" : value; + }, + $getValue:function(){ + return this._settings.value||""; + }, + focus:function(){ + var input = this.getInputNode(); + if (input && input.focus) input.focus(); + }, + blur:function() { + var input = this.getInputNode(); + if (input && input.blur) input.blur(); + }, + //get input element + getInputNode: function() { + return this._dataobj.getElementsByTagName('input')[0]||this._dataobj.getElementsByTagName('button')[0]; + }, + //get top-level sub-container + _getBox:function(){ + for(var i=0;i< this._dataobj.childNodes.length;i++){ + if(this._dataobj.childNodes[i].className.indexOf("webix_el_box")>=0) + return this._dataobj.childNodes[i]; + } + return null; + }, + _sqrt_2:Math.sqrt(2), + _set_inner_size_next:function(){ + var arrow = this._getBox().childNodes[1]; + var button = arrow.previousSibling; + var style = this._settings.type == "next"?"right":"left"; + var height = this._settings.aheight-webix.skin.$active.inputPadding*2-2; //-2 - borders + + /* var ax = Math.round((height)/this._sqrt_2); + var ay = Math.round(Math.sqrt(height*height-ax*ax)); + + arrow.style.width = ax-2+"px"; + arrow.style.height = ay-2+"px"; + arrow.style.top = Math.round(ax/4) -1 + "px"; + arrow.style[style] = Math.floor(ax/4)+ "px"; + + button.style.width = this._settings.awidth - 3*ax/4 -2 + "px"; + button.style.height = height + "px"; + button.style[style] = 3*ax/4 + "px";*/ + + var arrowEdge = height*this._sqrt_2/2; + arrow.style.width = arrowEdge+"px"; + arrow.style.height = arrowEdge+"px"; + arrow.style.top = (height - arrowEdge)/2 + webix.skin.$active.inputPadding+ "px"; + arrow.style[style] = (height - arrowEdge)/2 +this._sqrt_2/2+ "px"; + button.style.width = this._settings.awidth - height/2 -2 + "px"; + button.style.height = height + 2 + "px"; + button.style[style] = height/2 + 2 + "px"; + button.style.top = webix.skin.$active.inputPadding+ "px"; + + }, + _calck_input_size:function(){ + //use width for both width and inputWidth settings in clever way + //in form, we can define width for some element smaller than for siblings + //it will use inputWidth to render the desired view + this._input_width = this._settings.inputWidth || + ((this._content_width - this._settings.width > 2)?this._settings.width:0) || this._content_width; + this._input_height = this._settings.inputHeight; + }, + render:function(){ + this._calck_input_size(); + this._settings.awidth = this._input_width||this._content_width; + this._settings.aheight = this._input_height||this._content_height; + + //image button - image width + this._settings.bheight = this._settings.aheight+2; + this._settings.cheight = this._settings.aheight- 2*webix.skin.$active.inputPadding; + this._settings.dheight = this._settings.cheight - 2; // - borders + + if(webix.AtomRender.render.call(this)){ + this._rendered_input = true; + if (this._set_inner_size) this._set_inner_size(); + if (this._settings.align){ + var handle = this._dataobj.firstChild; + if (this._settings.labelPosition == "top" && handle.nextSibling) + handle = handle.nextSibling; + + switch(this._settings.align){ + case "right": + handle.style.cssFloat = "right"; + break; + case "center": + handle.style.display = "inline-block"; + handle.parentNode.style.textAlign = "center"; + break; + case "middle": + handle.style.marginTop = Math.round((this._content_height-this._input_height)/2)+"px"; + break; + case "bottom": + handle.style.marginTop = (this._content_height-this._input_height)+"px"; + break; + case "left": + handle.style.cssFloat = "left"; + break; + default: + webix.assert(false, "Unknown align mode: "+this._settings.align); + break; + } + } + + if (this.$render) + this.$render(this.data); + + if (this._settings.disabled) + this.disable(); + + // set tooltip after render + if (this._settings.tooltip) + this.define("tooltip",this._settings.tooltip ); + + if (this._init_once){ + this._init_once(this.data); + this._init_once = 0; + } + } + }, + + refresh:function(){ this.render(); }, + + on_click:{ + _handle_tab_click: function(ev, button){ + var id = webix.html.locate(ev, "button_id"); + if (id && this.callEvent("onBeforeTabClick", [id, ev])){ + this.setValue(id); + this.callEvent("onAfterTabClick", [id, ev]); + } + }, + webix_all_segments:function(ev, button){ + this.on_click._handle_tab_click.call(this, ev, button); + }, + webix_all_tabs:function(ev, button) { + this.on_click._handle_tab_click.call(this, ev, button); + }, + webix_inp_counter_next:function(e, obj, node){ + this.next(); + }, + webix_inp_counter_prev:function(e, obj, node){ + this.prev(); + }, + webix_inp_combo:function(e, obj, node){ + node.focus(); + }, + webix_inp_checkbox_border: function(e, obj, node) { + if ((e.target||e.srcElement).tagName != "DIV" && !this._settings.readonly) + this.toggle(); + }, + webix_inp_checkbox_label: function(e, obj, node) { + if (!this._settings.readonly) + this.toggle(); + }, + webix_inp_radio_border: function(e, obj, node) { + var value = webix.html.locate(e, "radio_id"); + this.setValue(value); + }, + webix_inp_radio_label: function(e, obj, node) { + node = node.parentNode.getElementsByTagName('input')[0]; + return this.on_click.webix_inp_radio_border.call(this, node, obj, node); + }, + webix_tab_more_icon: function(ev,obj, node){ + this.getPopup().resize(); + this.getPopup().show(node,null,true); + }, + webix_tab_close:function(ev, obj, node){ + var id = webix.html.locate(ev, "button_id"); + if (id && this.callEvent("onBeforeTabClose", [id, ev])) + this.removeOption(id); + } + }, + + //method do not used by button, but used by other child-views + _check_options:function(opts){ + webix.assert(opts, this.name+": options not defined"); + for(var i=0;i"+placeholder+"":""); + } +}, webix.ui.view, webix.AtomRender, webix.Settings, webix.EventSystem); + +webix.protoUI({ + name:"label", + defaults:{ + template:"
    #label#
    " + }, + $skin:function(){ + this.defaults.height = webix.skin.$active.inputHeight; + }, + focus:function(){ return false; }, + _getBox:function(){ + return this._dataobj.firstChild; + }, + setHTML:function(html){ + this._settings.template = function(){ return html; }; + this.refresh(); + }, + setValue: function(value){ + this._settings.label = value; + webix.ui.button.prototype.setValue.apply(this,arguments); + }, + $setValue:function(value){ + this._dataobj.firstChild.innerHTML = value; + }, + _set_inner_size:function(){} +}, webix.ui.button); + +webix.protoUI({ + name:"icon", + $skin:function(){ + this.defaults.height = webix.skin.$active.inputHeight; + }, + defaults:{ + template:function(obj){ + return ""; + }, + width:33 + }, + _set_inner_size:function(){ + + } +}, webix.ui.button); + + + +webix.protoUI({ + name:"text", + _allowsClear:true, + _init_onchange:function(){ + if (this._allowsClear){ + + webix.event(this.getInputNode(),"change",function(){ + var newvalue = this.getValue(); + + if (newvalue != this._settings.value) + this.setValue(this.getValue(), true); + },this); + + if (this._settings.suggest) + webix.$$(this._settings.suggest).linkInput(this); + } + }, + $skin:function(){ + this.defaults.height = webix.skin.$active.inputHeight; + this.defaults.inputPadding = webix.skin.$active.inputPadding; + }, + $init:function(config){ + if (config.labelPosition == "top") + if (webix.isUndefined(config.height) && this.defaults.height) // textarea + config.height = this.defaults.height + this._labelTopHeight; + + //suggest reference for destructor + this._destroy_with_me = []; + + this._setSubmitEvent(); + this.attachEvent("onAfterRender", this._init_onchange); + }, + $renderIcon:function(){ + var config = this._settings; + if (config.icon){ + var height = config.aheight - 2*config.inputPadding, + padding = (height - 18)/2 -1; + return ""; + } + return ""; + }, + _setSubmitEvent: function(config){ + if(!this._skipSubmit){ + var form = this.getFormView(); + if(form){ + this._addElementHotKey("enter", function(view,ev){ + form.callEvent("onSubmit",[view,ev]); + },this); + } + } + }, + relatedView_setter:function(value){ + this.attachEvent("onChange", function(){ + var value = this.getValue(); + var mode = this._settings.relatedAction; + var viewid = this._settings.relatedView; + var view = webix.$$(viewid); + if (!view){ + var top = this.getTopParentView(); + if (top && top.$$) + view = top.$$(viewid); + } + + webix.assert(view, "Invalid relatedView: "+viewid); + + if (mode == "enable"){ + if (value) view.enable(); else view.disable(); + } else { + if (value) view.show(); else view.hide(); + } + }); + return value; + }, + validateEvent_setter:function(value){ + if (value == "blur") + this.attachEvent("onBlur", this.validate); + + if (value == "key") + this.attachEvent("onTimedKeyPress", this.validate); + + return value; + }, + validate:function(){ + var rule = this._settings.validate; + if (!rule && this._settings.required) + rule = webix.rules.isNotEmpty; + + var form =this.getFormView(); + var name = this._settings.name; + var value = this.getValue(); + var data = {}; data[name] = value; + + webix.assert(form, "Validation works only for fields in the form"); + webix.assert(name, "Validation works only for fields with name"); + + if (rule && !this.getFormView()._validate(rule, value, data, name)) + return false; + return true; + }, + bottomLabel_setter: function(value){ + if(!this._settings.bottomPadding) + this._settings.bottomPadding = 18; + return value; + }, + _getInvalidText: function(){ + var text = this._settings.invalidMessage; + if(typeof text == "function"){ + text.call(this); + } + return text; + }, + _showBottomText: function(text){ + var config = this._settings; + if (typeof text != "undefined") + config.bottomLabel = text; + + var message = (config.invalid ? config.invalidMessage : "" ) || config.bottomLabel || config.bottomPadding; + if (!message) config.inputHeight = 0; + + if (message && !config.bottomPadding){ + this._restorePadding = 1; + config.bottomPadding = config.bottomPadding || 18; + //textarea + if (!config.height) + this.render(); + this.resize(); + } else if (!message && this._restorePadding){ + config.bottomPadding = this._restorePadding = 0; + //textarea + if (!config.height) + this.render(); + this.resize(); + } else + this.render(); + }, + $getSize: function(){ + var sizes = webix.ui.view.prototype.$getSize.apply(this,arguments); + var heightInc = this.config.bottomPadding; + if(heightInc){ + sizes[2] += heightInc; + sizes[3] += heightInc; + } + return sizes; + }, + $setSize:function(x,y){ + var config = this._settings; + + if(webix.ui.view.prototype.$setSize.call(this,x,y)){ + if (!x || !y) return; + + if (config.labelPosition == "top"){ + if (!config.inputHeight) + config.inputHeight = this._content_height - this._labelTopHeight - (this.config.bottomPadding||0); + config.labelWidth = 0; + } else if (config.bottomPadding){ + config.inputHeight = this._content_height - this.config.bottomPadding; + } + this.render(); + } + }, + _get_input_width: function(config){ + var width = (this._input_width||0)-(config.label?this._settings.labelWidth:0)- 4 - (config.iconWidth || 0); + + //prevent js error in IE + return (width < 0)?0:width; + }, + _render_div_block:function(obj, common){ + var id = obj.id || webix.uid(); + var width = common._get_input_width(obj); + var inputAlign = obj.inputAlign || "left"; + var icon = this.$renderIcon?this.$renderIcon(obj):""; + var height = this._settings.aheight - 2*webix.skin.$active.inputPadding -2; + var text = (obj.text||obj.value||this._get_div_placeholder(obj)); + var html = "
    "+ text +"
    "; + return common.$renderInput(obj, html, id); + }, + _baseInputHTML:function(tag){ + var html = "<"+tag+(this._settings.placeholder?" placeholder='"+this._settings.placeholder+"' ":" "); + if (this._settings.readonly) + html += "readonly='true' "; + + var attrs = this._settings.attributes; + if (attrs) + for(var prop in attrs) + html += prop+"='"+attrs[prop]+"' "; + return html; + }, + $renderLabel: function(config, id){ + var labelAlign = (config.labelAlign||"left"); + var top = this._settings.labelPosition == "top"; + var labelTop = top?"display:block;":("width: " + this._settings.labelWidth + "px;"); + var label = ""; + var labelHeight = top?this._labelTopHeight-2:( this._settings.aheight - 2*this._settings.inputPadding); + if (config.label) + label = ""; + return label; + }, + $renderInput: function(config, div_start, id) { + var inputAlign = (config.inputAlign||"left"); + var top = (config.labelPosition == "top"); + var inputWidth = this._get_input_width(config); + + id = id || config.name || webix.uid(); + + var label = this.$renderLabel(config,id); + + var html = ""; + if(div_start){ + html += div_start; + } else { + html += this._baseInputHTML("input")+"id='" + id + "' type='"+(config.type||this.name)+"' value='" + webix.template.escape(config.value||"") + "' style='width: " + inputWidth + "px; text-align: " + inputAlign + ";'"; + var attrs = config.attributes; + if (attrs) + for(var prop in attrs) + html += " "+prop+"='"+attrs[prop]+"'"; + html += " />"; + } + var icon = this.$renderIcon?this.$renderIcon(config):""; + html += icon; + + var result = ""; + //label position, top or left + if (top) + result = label+"
    "+html+"
    "; + else + result = "
    "+label+html+"
    "; + + + //bottom message width + var padding = config.awidth-inputWidth-webix.skin.$active.inputPadding*2; + //bottom message text + var message = (config.invalid ? config.invalidMessage : "") || config.bottomLabel; + if (message) + result += "
    "+message+"
    "; + + return result; + }, + defaults:{ + template:function(obj, common){ + return common.$renderInput(obj); + }, + label:"", + labelWidth:80 + }, + type_setter:function(value){ return value; }, + _set_inner_size:false, + $setValue:function(value){ + this.getInputNode().value = value; + }, + $getValue:function(){ + return this.getInputNode().value; + }, + suggest_setter:function(value){ + if (value){ + webix.assert(value !== true, "suggest options can't be set as true, data need to be provided instead"); + + if (typeof value == "string"){ + var attempt = webix.$$(value); + if (attempt) + return webix.$$(value)._settings.id; + + value = { body: { url:value , dataFeed :value } }; + } else if (webix.isArray(value)) + value = { body: { data: this._check_options(value) } }; + else if (!value.body) + value.body = {}; + + webix.extend(value, { view:"suggest" }); + + var view = webix.ui(value); + this._destroy_with_me.push(view); + return view._settings.id; + } + return false; + } +}, webix.ui.button); + +webix.protoUI({ + name:"segmented", + _allowsClear:false, + $init:function(){ + this.attachEvent("onChange", function(value){ + if (this._settings.multiview){ + var top = this.getTopParentView(); + var view = null; + + //get from local isolate + if (top && top.$$) + view = top.$$(value); + //or check globally + if (!view) + view = webix.$$(value); + + if(view && view.show) + view.show(); + } + }); + }, + defaults:{ + template:function(obj, common){ + if(!obj.options) + webix.assert(false, "segmented: options undefined"); + var options = obj.options; + common._check_options(options); + var width = common._get_input_width(obj); + + var id = webix.uid(); + var html = "
    "; + var optionWidth = obj.optionWidth || Math.floor(width/options.length); + if(!obj.value) + obj.value = options[0].id; + + for(var i=0; i0?1:0))+"' button_id='"+options[i].id+"' >"; + html+= options[i].value+""; + } + + return common.$renderInput(obj, html+"
    ", id); + } + }, + $setValue:function(value){ + this.refresh(); + }, + getValue:function(){ + return this._settings.value; + }, + getInputNode:function(){ + return null; + }, + optionIndex:function(id){ + var pages = this._settings.options; + for (var i=0; i= 0) + webix.PowerArray.removeAt.call(options, index); + + // if we remove a selected option + if(this._settings.value == id){ + var next_index = Math.min(index, options.length-1); + if (next_index >= 0){ + this.setValue(options[next_index].id); + //return options[next_index].id; + } else { + this._settings.value = -1; + } + } + this.callEvent("onOptionRemove", [id, this._settings.value]); + this.refresh(); + + }, + _set_inner_size:false +}, webix.ui.text); + +webix.protoUI({ + name:"search", + $skin:function(){ + this.defaults.inputPadding = webix.skin.$active.inputPadding; + }, + on_click:{ + "webix_input_icon":function(e){ + return this.callEvent("onSearchIconClick", [e]); + } + }, + defaults:{ + type:"text", + icon:"search" + } +}, webix.ui.text); + +webix.protoUI({ + name:"toggle", + _allowsClear:true, + $init:function(){ + this.attachEvent("onItemClick", function(){ + this.toggle(); + }); + }, + $setValue:function(value){ + this.render(); + }, + toggle:function(){ + this.setValue(!this.getValue()); + }, + getValue:function(){ + var value = this._settings.value; + return (!value||value=="0")?0:1; + }, + defaults:{ + template:function(obj, common){ + var css = obj.value ? " webix_pressed" : ""; + obj.label = (obj.value ? obj.onLabel : obj.offLabel) || obj.label; + obj.icon = (obj.value ? obj.onIcon : obj.offIcon) || obj.icon; + return "
    "+common._inputTemplate(obj, common)+"
    "; + } + }, + _set_inner_size:false +}, webix.ui.button); + +webix.protoUI({ + name:"select", + defaults:{ + template:function(obj,common) { + var options = common._check_options(obj.options); + var id = obj.name || ("x"+webix.uid()); + var html = common._baseInputHTML("select")+"id='"+id+"' style='width:"+common._get_input_width(obj)+"px;'>"; + + var optview = webix.$$(options); + if(optview && optview.data && optview.data.each){ + optview.data.each(function(option){ + html+=""+option.value+""; + }); + }else + for(var i=0; i"+options[i].value+""; + } + html += ""; + return common.$renderInput(obj, html, id); + } + }, + options_setter:function(value){ + if(value){ + if(typeof value =="string"){ + var collection = new webix.DataCollection({url:value}); + collection.data.attachEvent("onStoreLoad", webix.bind(this.refresh, this)); + return collection; + } + else + return value; + } + }, + //get input element + getInputNode: function() { + return this._dataobj.getElementsByTagName('select')[0]; + } +}, webix.ui.text); + +webix.protoUI({ + name:"textarea", + $skin:function(){}, + defaults:{ + template:function(obj, common){ + var name = obj.name || obj.id; + var id = "x"+webix.uid(); + + var html = common._baseInputHTML("textarea")+"style='width:"+common._get_input_width(obj)+"px;'"; + html +=" id='"+id+"' name='"+name+"' class='webix_inp_textarea'>"+(obj.value||"")+""; + + return common.$renderInput(obj, html, id); + }, + height:0, + minHeight:60 + }, + _skipSubmit: true, + $renderLabel: function(config, id){ + var labelAlign = (config.labelAlign||"left"); + var top = this._settings.labelPosition == "top"; + var labelTop = top?"display:block;":("width: " + this._settings.labelWidth + "px;"); + var label = ""; + var labelHeight = top?this._labelTopHeight-2:( (webix.skin.$active.inputHeight||this._settings.aheight) - 2*this._settings.inputPadding); + if (config.label) + label = ""; + return label; + }, + //get input element + getInputNode: function() { + return this._dataobj.getElementsByTagName('textarea')[0]; + } +}, webix.ui.text); + +webix.protoUI({ + name:"counter", + defaults:{ + template:function(config, common){ + var value = (config.value||0); + + var id = config.name || ("x"+webix.uid()); + var html = "
    "; + html += ""; + html += common._baseInputHTML("input")+"type='text' class='webix_inp_counter_value' value='"+value+"'>"; + html += "
    "; + return common.$renderInput(config, html, id); + }, + min:0, + max:Infinity, + step:1 + }, + $setValue:function(value){ + this.getInputNode().value = value; + }, + getInputNode:function(){ + return this._dataobj.getElementsByTagName("input")[1]; + }, + getValue:function(obj){ + return webix.ui.button.prototype.getValue.apply(this,arguments)*1; + }, + next:function(step){ + step = this._settings.step; + this.shift(step); + }, + prev:function(step){ + step = (-1)*this._settings.step; + this.shift(step); + }, + shift:function(step){ + var min = this._settings.min; + var max = this._settings.max; + + var new_value = this.getValue() + step; + if (new_value >= min && new_value <= max) + this.setValue(new_value); + } +}, webix.ui.text); + + +webix.protoUI({ + name:"checkbox", + defaults:{ + checkValue:1, + uncheckValue:0, + template:function(config, common) { + var id = config.name || "x"+webix.uid(); + var rightlabel = ""; + if (config.labelRight){ + rightlabel = ""; + //user clearly attempts to hide the label, help him + if (config.labelWidth) + config.label = config.label || " "; + } + var checked = (config.checkValue == config.value); + var margin = Math.floor((common._settings.aheight-16)/2); + var ch = common._baseInputHTML("input")+"style='margin-top:"+margin+"px;"+(config.customCheckbox?"display:none":"")+"' id='"+id+"' type='checkbox' "+(checked?"checked='1'":"")+"/>"; + var className = "webix_inp_checkbox_border webix_el_group webix_checkbox_"+(checked?"1":"0"); + var html = "
    "+ch+(config.customCheckbox||"")+rightlabel+"
    "; + return common.$renderInput(config, html, id); + } + }, + _init_onchange: function(){}, + $setValue:function(value){ + var isChecked = (value == this._settings.checkValue); + var parentNode = this.getInputNode()?this.getInputNode().parentNode:null; + if(parentNode){ + parentNode.className = parentNode.className.replace(/(webix_checkbox_)\d/,"$1"+(isChecked?1:0)); + } + this.getInputNode().checked = isChecked; + }, + toggle:function(){ + var value = (this.getValue() != this._settings.checkValue)?this._settings.checkValue:this._settings.uncheckValue; + this.setValue(value); + }, + getValue:function(){ + var value = this._settings.value; + return (value == this._settings.checkValue)?this._settings.checkValue:this._settings.uncheckValue; + }, + $skin:function(){ + if(webix.skin.$active.customCheckbox) + this.defaults.customCheckbox = ""; + } +}, webix.ui.text); + +webix.protoUI({ + name:"radio", + defaults:{ + template: function(config,common) { + var options = common._check_options(config.options); + var html = []; + var id; + + for (var i=0; i < options.length; i++) { + var eachid = "x"+webix.uid(); + id = id || eachid; + + if (i && (options[i].newline || config.vertical)) + html.push("
    "); + var isChecked = (options[i].id == config.value); + var rd = common._baseInputHTML("input")+"name='"+config.name+"' type='radio' "+(isChecked?"checked='1'":"")+" value='"+options[i].id+"' id='"+eachid+"' style='"+(config.customRadio?"display:none":"")+"' />"; + var input = "
    "+rd+(config.customRadio||"")+"
    "; + var label = options[i].value || ""; + if (label) + label = ""; + + html.push("
    "+input + label+"
    "); + + } + html = "
    "+html.join("")+"
    "; + + return common.$renderInput(config, html, id); + } + }, + $getSize:function(dx, dy){ + var size = webix.ui.button.prototype.$getSize.call(this, dx, dy); + if (this._settings.options){ + var count = 1; + for (var i=0; i < this._settings.options.length; i++) + if (this._settings.vertical || this._settings.options[i].newline) + count++; + size[3] = size[2] = Math.max(size[2], (this._settings.optionHeight||25) * count); + } + return size; + }, + _getInputNode: function(){ + return this._dataobj.getElementsByTagName('input'); + }, + $setValue:function(value){ + var inp = this._getInputNode(); + + for (var i=0; i < inp.length; i++){ + if (inp[i].parentNode.getAttribute("radio_id")==value){ + inp[i].className = "webix_inp_radio_on"; + inp[i].checked = true; + } else{ + inp[i].className = "webix_inp_radio_on webix_hidden"; + inp[i].checked = false; + } + var parentNode = inp[i]?inp[i].parentNode:null; + if(parentNode){ + parentNode.className = parentNode.className.replace(/(webix_radio_)\d/,"$1"+(inp[i].checked?1:0)); + } + + } + }, + getValue:function(obj){ + return this._settings.value; + }, + $skin:function(){ + if(webix.skin.$active.customRadio) + this.defaults.customRadio = ""; + if(webix.skin.$active.optionHeight) + this.defaults.optionHeight = webix.skin.$active.optionHeight; + } +}, webix.ui.text); + +webix.protoUI({ + name:"richselect", + defaults:{ + template:function(obj,common){ + return common._render_div_block(obj, common); + }, + popupWidth:200, + icon: "angle-down" + }, + suggest_setter:function(value){ + return this.options_setter(value); + }, + options_setter:function(value){ + value = this._suggest_config ? this._suggest_config(value) : value; + var suggest = (this._settings.popup = this._settings.suggest = webix.ui.text.prototype.suggest_setter.call(this, value)); + var list = webix.$$(suggest).getList(); + if (list) + list.attachEvent("onAfterLoad", webix.bind(this._reset_value, this)); + + return suggest; + }, + _reset_value:function(){ + var value = this._settings.value; + if(!webix.isUndefined(value) && !this.getPopup().isVisible() && !this._settings.text) + this.$setValue(value); + }, + + $skin:function(){ + this.defaults.inputPadding = webix.skin.$active.inputPadding; + }, + + $render:function(obj){ + if (webix.isUndefined(obj.value)) return; + this.$setValue(obj.value); + }, + getInputNode: function(){ + return this._dataobj.getElementsByTagName("DIV")[1]; + }, + getPopup: function(){ + return webix.$$(this._settings.popup); + }, + getText:function(){ + var node = this.getInputNode(); + return typeof node.value == "undefined" ? node.innerHTML : node.value; + }, + $setValue:function(value){ + if (!this._rendered_input) return; + + var text = value; + var popup = this.getPopup(); + + if (popup) + var text = this.getPopup().getItemText(value); + + if (!text && typeof value == "object" && value.id){ + this.getPopup().getList().add(value); + text = this.getPopup().getItemText(value.id); + this._settings.value = value.id; + } + + this._settings.text = text; + + var node = this.getInputNode(); + + if (webix.isUndefined(node.value)) + node.innerHTML = text || this._get_div_placeholder(); + else + node.value = text.replace(/<[^>]*>/g,""); + }, + getValue:function(){ + return this._settings.value||""; + } +}, webix.ui.text); + + +webix.protoUI({ + name:"combo", + $init:function(){ + this.attachEvent("onBlur", webix.bind(function(e){ + if (this._settings.text == this.getText()) + return; + var data = this.getPopup().getSuggestion(); + if (data && !(this.getInputNode().value==="" && webix.$$(this._settings.suggest).getItemText(data)!=="")){ + this.setValue(data); + } else if(!this._settings.editable){ + var value = this.getValue(); + this.$setValue(webix.isUndefined(value)?"":value); + } + + },this)); + }, + getInputNode:function(){ + return this._dataobj.getElementsByTagName('input')[0]; + }, + $render:function(obj){ + if (webix.isUndefined(obj.value)) return; + this.$setValue(obj.value); + }, + _init_onchange:function(){ + webix.event(this.getInputNode(),"change",function(){ + var input = this.getInputNode(); + var newvalue = ""; + if (input.value) + newvalue = webix.$$(this._settings.suggest).getSuggestion() || this._settings.value; + if (newvalue != this._settings.value) + this.setValue(newvalue, true); + else + this.$setValue(newvalue); + },this); + webix.$$(this._settings.suggest).linkInput(this); + }, + defaults:{ + template:function(config, common){ + return common.$renderInput(config); + }, + icon: "angle-down" + } +}, webix.ui.richselect); + + +webix.protoUI({ + name:"datepicker", + $init:function(){ + this.$ready.push(this._init_popup); + }, + defaults:{ + template:function(obj, common){ + if(common._settings.type == "time"){ + common._settings.icon = common._settings.timeIcon; + } + return obj.editable?common.$renderInput(obj):common._render_div_block(obj, common); + }, + stringResult:false, + timepicker:false, + icon:"calendar", + icons: true, + timeIcon: "clock-o" + }, + $skin:function(){ + this.defaults.inputPadding = webix.skin.$active.inputPadding; + }, + getPopup: function(){ + return webix.$$(this._settings.popup); + }, + _init_popup:function(){ + var obj = this._settings; + if (obj.suggest) + obj.popup = obj.suggest; + else if (!obj.popup){ + var timepicker = this._settings.timepicker; + obj.popup = obj.suggest = this.suggest_setter({ + type:"calendar", height:240+(timepicker?30:0), width:250, padding:0, + body: { timepicker:timepicker, type: this._settings.type, icons: this._settings.icons } + }); + } + + + this._init_once = function(){}; + }, + $render:function(obj){ + if (webix.isUndefined(obj.value)) return; + this.$setValue(obj.value); + }, + _parse_value:function(value){ + var timeMode = this._settings.type == "time"; + + //setValue("1980-12-25") + if (typeof value=="string" && value){ + var formatDate = (timeMode?webix.i18n.parseTimeFormatDate:webix.i18n.parseFormatDate); + value = formatDate(value); + } + + if (value){ + //time mode + if(timeMode){ + //setValue([16,24]) + if(webix.isArray(value)){ + var time = new Date(); + time.setHours(value[0]); + time.setMinutes(value[1]); + value = time; + } + } + //setValue(invalid date) + if(isNaN(value.getTime())) + value = ""; + } + + return value; + }, + $setValue:function(value){ + var popup = webix.$$(this._settings.popup.toString()); + var calendar = popup._body_cell; + + //convert string or array to date + value = this._parse_value(value); + + //select date in calendar-popup + calendar.selectDate(value,true); + + //save value + this._settings.value = (value)?calendar.config.date:""; + + //set visible date + var timeMode = this._settings.type == "time"; + var timepicker = this.config.timepicker; + var formatStr = this._formatStr||(timeMode?webix.i18n.timeFormatStr:(timepicker?webix.i18n.fullDateFormatStr:webix.i18n.dateFormatStr)); + this._settings.text = (value?formatStr(this._settings.value):""); + + var node = this.getInputNode(); + if(node.value == webix.undefined){ + node.innerHTML = this._settings.text || this._get_div_placeholder(); + } + else{ + node.value = this._settings.text || ""; + } + }, + format_setter:function(value){ + this._formatStr = webix.Date.dateToStr(value); + this._formatDate = webix.Date.strToDate(value); + return value; + }, + getInputNode: function(){ + return this._settings.editable?this._dataobj.getElementsByTagName('input')[0]:this._dataobj.getElementsByTagName("DIV")[1]; + }, + getValue:function(){ + //time mode + var timeMode = this._settings.type == "time"; + //date and time mode + var timepicker = this.config.timepicker; + + var value = this._settings.value; + + //input was not rendered, we need to parse value from setValue method + if (!this._rendered_input) + value = this._parse_value(value) || null; + //rendere and in edit mode + else if (this._settings.editable){ + var formatDate = this._formatDate||(timeMode?webix.i18n.timeFormatDate:(timepicker?webix.i18n.fullDateFormatDate:webix.i18n.dateFormatDate)); + value = formatDate(this.getInputNode().value); + } + + //return string from getValue + if(this._settings.stringResult){ + var formatStr = (timeMode?webix.i18n.parseTimeFormatStr:webix.i18n.parseFormatStr); + return (value?formatStr(value):""); + } + + return value||null; + }, + getText:function(){ + var node = this.getInputNode(); + return (node?(typeof node.value == "undefined" ? node.innerHTML : node.value):""); + } +}, webix.ui.text); + +webix.protoUI({ + name:"colorpicker", + $init:function(){ + this.$ready.push(this._init_popup); + }, + defaults:{ + template:function(obj, common){ + return common._render_div_block(obj, common); + }, + icon:false + }, + _init_popup:function(){ + var obj = this._settings; + if (obj.suggest) + obj.popup = obj.suggest; + else if (!obj.popup) + obj.popup = obj.suggest = this.suggest_setter({ + type:"colorboard", height:200 + }); + this._init_once = function(){}; + }, + $render:function(obj){ + if (webix.isUndefined(obj.value)) return; + this.$setValue(obj.value); + }, + getValue:function(){ + if (this._rendered_input && this._settings.editable) + return this.getInputNode().value; + else + return this._settings.value; + }, + $setValue:function(value){ + var popup = webix.$$(this._settings.popup)._body_cell.setValue(value); + var text = this._settings.icon?"":("
     
    "+value); + this.getInputNode().innerHTML = text; + } +}, webix.ui.datepicker); + + +/* + Renders collection of items + Behavior uses plain strategy which suits only for relative small datasets + +*/ + + +webix.RenderStack={ + $init:function(){ + webix.assert(this.data,"RenderStack :: Component doesn't have DataStore"); + webix.assert(webix.template,"webix.template :: webix.template is not accessible"); + + //used for temporary HTML elements + //automatically nulified during destruction + this._html = document.createElement("DIV"); + + this.data.attachEvent("onIdChange", webix.bind(this._render_change_id, this)); + this.attachEvent("onItemClick", this._call_onclick); + + //create copy of default type, and set it as active one + if (!this.types){ + this.types = { "default" : this.type }; + this.type.name = "default"; + } + + this.type = webix.clone(this.type); + }, + + customize:function(obj){ + webix.type(this,obj); + }, + type_setter:function(value){ + if(!this.types[value]) + this.customize(value); + else { + this.type = webix.clone(this.types[value]); + if (this.type.css) + this._contentobj.className+=" "+this.type.css; + } + if (this.type.on_click) + webix.extend(this.on_click, this.type.on_click); + + return value; + }, + + template_setter:function(value){ + this.type.template=webix.template(value); + }, + //convert single item to HTML text (templating) + _toHTML:function(obj){ + var mark = this.data._marks[obj.id]; + //check if related template exist + webix.assert((!obj.$template || this.type["template"+obj.$template]),"RenderStack :: Unknown template: "+obj.$template); + this.callEvent("onItemRender",[obj]); + return this.type.templateStart(obj,this.type, mark)+(obj.$template?this.type["template"+obj.$template]:this.type.template)(obj,this.type,mark)+this.type.templateEnd(obj, this.type,mark); + }, + //convert item to HTML object (templating) + _toHTMLObject:function(obj){ + this._html.innerHTML = this._toHTML(obj); + return this._html.firstChild; + }, + _render_change_id:function(old, newid){ + var obj = this.getItemNode(old); + if (obj) { + obj.setAttribute(this._id, newid); + this._htmlmap[newid] = this._htmlmap[old]; + delete this._htmlmap[old]; + } + }, + //calls function that is set in onclick property + _call_onclick:function(){ + if (this._settings.click){ + var code = webix.toFunctor(this._settings.click, this.$scope); + if (code && code.call) code.apply(this,arguments); + } + }, + //return html container by its ID + //can return undefined if container doesn't exists + getItemNode:function(search_id){ + if (this._htmlmap) + return this._htmlmap[search_id]; + + //fill map if it doesn't created yet + this._htmlmap={}; + + var t = this._dataobj.childNodes; + for (var i=0; i < t.length; i++){ + var id = t[i].getAttribute(this._id); //get item's + if (id) + this._htmlmap[id]=t[i]; + } + //call locator again, when map is filled + return this.getItemNode(search_id); + }, + //return id of item from html event + locate:function(e){ return webix.html.locate(e,this._id); }, + /*change scrolling state of top level container, so related item will be in visible part*/ + showItem:function(id){ + var html = this.getItemNode(id); + if (html&&this.scrollTo){ + var txmin = html.offsetLeft; + var txmax = txmin + html.offsetWidth; + var tymin = html.offsetTop; + var tymax = tymin + html.offsetHeight; + var state = this.getScrollState(); + + var x = state.x; + if (x > txmin || x + this._content_width < txmax ) + x = txmin; + var y = state.y; + if (y > tymin || y + this._content_height < tymax ) + y = tymin - 5; + + this.scrollTo(x,y); + if(this._setItemActive) + this._setItemActive(id); + } + }, + //update view after data update + //method calls low-level rendering for related items + //when called without parameters - all view refreshed + render:function(id,data,type){ + if (!this.isVisible(this._settings.id) || this.$blockRender) + return; + + if (webix.debug_render) + webix.log("Render: "+this.name+"@"+this._settings.id+", mode:"+(type||"#")+", item:"+(id||"#")); + + if (id){ + var cont = this.getItemNode(id); //get html element of updated item + switch(type){ + case "paint": + case "update": + //in case of update - replace existing html with updated one + if (!cont) return; + var t = this._htmlmap[id] = this._toHTMLObject(data); + webix.html.insertBefore(t, cont); + webix.html.remove(cont); + break; + case "delete": + //in case of delete - remove related html + if (!cont) return; + webix.html.remove(cont); + delete this._htmlmap[id]; + break; + case "add": + //in case of add - put new html at necessary position + var t = this._htmlmap[id] = this._toHTMLObject(data); + webix.html.insertBefore(t, this.getItemNode(this.data.getNextId(id)), this._dataobj); + break; + case "move": + //moving without repainting the item + webix.html.insertBefore(this.getItemNode(id), this.getItemNode(this.data.getNextId(id)), this._dataobj); + break; + default: + webix.assert_error("Unknown render command: "+type); + break; + } + } else { + //full reset + if (this.callEvent("onBeforeRender",[this.data])){ + /*if (this.getScrollState) + var scroll = this.getScrollState();*/ + + //getRange - returns all elements + (this._renderobj||this._dataobj).innerHTML = this.data.getRange().map(this._toHTML,this).join(""); + this._htmlmap = null; //clear map, it will be filled at first getItemNode + this.callEvent("onAfterRender",[]); + var t = this._dataobj.offsetHeight; + + /*if (this.getScrollState) + this.scrollTo(scroll.x, scroll.y);*/ + } + } + } +}; + + + + + + + +webix.ValidateData = { + $init:function(){ + if(this._events) + this.attachEvent("onChange",this.clearValidation); + }, + clearValidation:function(){ + if(this.elements){ + for(var id in this.elements){ + this._clear_invalid(id); + } + } + }, + validate:function(obj) { + webix.assert(this.callEvent, "using validate for eventless object"); + + this.callEvent("onBeforeValidate", []); + var failed = this._validate_details = {}; + + //optimistic by default :) + var result =true; + var rules = this._settings.rules; + var isHidden = this.isVisible && !this.isVisible(); + + //prevent validation of hidden elements + var elements = {}, hidden = []; + for(var i in this.elements){ + var name = this.elements[i].config.name; + //we are ignoring hidden fields during validation + //if form itself is hidden, we can't separate hidden fiels, + //so we will vaidate all fields + if(isHidden || this.elements[i].isVisible()) + elements[name] = this.elements[i]; + else + hidden.push(name); + } + + if (rules || elements) + if(!obj && this.getValues) + obj = this.getValues(); + + if (rules){ + //complex rule, which may chcek all properties of object + if (rules.$obj) + result = this._validate(rules.$obj, obj, obj, "") && result; + + //all - applied to all fields + var all = rules.$all; + if (all) + for (var key in obj){ + if(hidden.indexOf(key)!==-1) continue; + var subresult = this._validate(all, obj[key], obj, key); + if (!subresult) + failed[key] = true; + result = subresult && result; + } + + + //per-field rules + for (var key in rules){ + if(hidden.indexOf(key)!==-1) continue; + if (key.indexOf("$")!==0 && !failed[key]){ + webix.assert(rules[key], "Invalid rule for:"+key); + var subresult = this._validate(rules[key], obj[key], obj, key); + if (!subresult) + failed[key] = true; + result = subresult && result; + } + } + } + + //check personal validation rules + if (elements){ + for (var key in elements){ + if (failed[key]) continue; + + var subview = elements[key]; + if (subview.validate){ + var subresult = subview.validate(); + result = subresult && result; + if (!subresult) + failed[key] = true; + } else { + var input = subview._settings; + if (input){ //ignore non webix inputs + var validator = input.validate; + if (!validator && input.required) + validator = webix.rules.isNotEmpty; + + if (validator){ + var subresult = this._validate(validator, obj[key], obj, key); + if (!subresult) + failed[key] = true; + result = subresult && result; + } + } + } + } + } + + this.callEvent("onAfterValidation", [result, this._validate_details]); + return result; + }, + _validate:function(rule, data, obj, key){ + if (typeof rule == "string") + rule = webix.rules[rule]; + if (rule.call(this, data, obj, key)){ + if(this.callEvent("onValidationSuccess",[key, obj]) && this._clear_invalid) + this._clear_invalid(key, obj); + return true; + } + else { + if(this.callEvent("onValidationError",[key, obj]) && this._mark_invalid) + this._mark_invalid(key, obj); + } + return false; + } +}; + + +webix.ValidateCollection = { + _validate_init_once:function(){ + this.data.attachEvent("onStoreUpdated",webix.bind(function(id, data, mode){ + if (id && (mode == "add" || mode == "update")) + this.validate(id); + }, this)); + this.attachEvent("onClearAll",this.clearValidation); + + this._validate_init_once = function(){}; + }, + rules_setter:function(value){ + if (value){ + this._validate_init_once(); + } + return value; + }, + clearValidation:function(){ + this.data.clearMark("webix_invalid", true); + }, + validate:function(id){ + var result = true; + if (!id) + for (var key in this.data.pull) + var result = this.validate(key) && result; + else { + this._validate_details = {}; + var obj = this.getItem(id); + result = webix.ValidateData.validate.call(this, obj); + if (result){ + if (this.callEvent("onValidationSuccess",[id, obj])) + this._clear_invalid(id); + } else { + if (this.callEvent("onValidationError",[id, obj, this._validate_details])) + this._mark_invalid(id, this._validate_details); + } + } + return result; + }, + _validate:function(rule, data, obj, key){ + if (typeof rule == "string") + rule = webix.rules[rule]; + + var res = rule.call(this, data, obj, key); + if (!res){ + this._validate_details[key] = true; + } + return res; + }, + _clear_invalid:function(id){ + this.data.removeMark(id, "webix_invalid", true); + }, + _mark_invalid:function(id, details){ + this.data.addMark(id, "webix_invalid", true); + } +}; + + +webix.rules = { + isEmail: function(value){ + return (/^[^@]+@[^@]+\.[^@]+$/).test((value || "").toString()); + }, + isNumber: function(value){ + return (parseFloat(value) == value); + }, + isChecked: function(value){ + return (!!value) || value === "0"; + }, + isNotEmpty: function(value){ + return (value === 0 || value); + } +}; + +/* + Behavior:DataLoader - load data in the component + + @export + load + parse +*/ +webix.DataLoader=webix.proto({ + $init:function(config){ + //prepare data store + config = config || ""; + + //list of all active ajax requests + this._ajax_queue = webix.toArray(); + + this.data = new webix.DataStore(); + this.data.attachEvent("onClearAll",webix.bind(this._call_onclearall,this)); + this.data.attachEvent("onServerConfig", webix.bind(this._call_on_config, this)); + this.data.feed = this._feed; + this.data.owner = config.id; + }, + _feed:function(from,count,callback){ + //allow only single request at same time + if (this._load_count) + return (this._load_count=[from,count,callback]); //save last ignored request + else + this._load_count=true; + this._feed_last = [from, count]; + this._feed_common.call(this, from, count, callback); + }, + _feed_common:function(from, count, callback){ + var url = this.data.url; + if (from<0) from = 0; + var final_callback = [ + this._feed_callback, + callback + ]; + if (url && typeof url != "string"){ + var details = { from:from, count:count }; + if (this.getState){ + var state = this.getState(); + details.sort = state.sort; + details.filter = state.filter; + } + + this.load(url, final_callback, details); + } else { + var finalurl = url+((url.indexOf("?")==-1)?"?":"&")+(this.count()?("continue=true"):""); + if (count != -1) + finalurl += "&count="+count; + if (from) + finalurl += "&start="+from; + + if (this.getState){ + var state = this.getState(); + if (state.sort) + finalurl += "&sort["+state.sort.id+"]="+state.sort.dir; + if (state.filter) + for (var key in state.filter) + finalurl +="&filter["+key+"]="+state.filter[key]; + } + this.load(finalurl, final_callback); + } + }, + _feed_callback:function(){ + //after loading check if we have some ignored requests + var temp = this._load_count; + var last = this._feed_last; + this._load_count = false; + if (typeof temp =="object" && (temp[0]!=last[0] || temp[1]!=last[1])) + this.data.feed.apply(this, temp); //load last ignored request + }, + //loads data from external URL + load:function(url,call){ + var ajax = webix.AtomDataLoader.load.apply(this, arguments); + + //prepare data feed for dyn. loading + if (!this.data.url) + this.data.url = url; + + return ajax; + }, + //load next set of data rows + loadNext:function(count, start, callback, url, now){ + var config = this._settings; + if (config.datathrottle && !now){ + if (this._throttle_request) + window.clearTimeout(this._throttle_request); + this._throttle_request = webix.delay(function(){ + this.loadNext(count, start, callback, url, true); + },this, 0, config.datathrottle); + return; + } + + if (!start && start !== 0) start = this.count(); + if (!count) + count = config.datafetch || this.count(); + + this.data.url = this.data.url || url; + if (this.callEvent("onDataRequest", [start,count,callback,url]) && this.data.url) + this.data.feed.call(this, start, count, callback); + }, + _maybe_loading_already:function(count, from){ + var last = this._feed_last; + if(this._load_count && last){ + if (last[0]<=from && (last[1]+last[0] >= count + from )) return true; + } + return false; + }, + //default after loading callback + _onLoad:function(text,xml,loader){ + var data; + if (loader === -1) + data = xml; + else { + //ignore data loading command if data was reloaded + this._ajax_queue.remove(loader); + data = this.data.driver.toObject(text,xml); + } + + if (data) + this.data._parse(data); + else + return this._onLoadError(text, xml, loader); + + //data loaded, view rendered, call onready handler + this._call_onready(); + + this.callEvent("onAfterLoad",[]); + this.waitData.resolve(); + }, + removeMissed_setter:function(value){ + return (this.data._removeMissed = value); + }, + //init of dataprocessor delayed after all settings processing + //because it need to be the last in the event processing chain + //to get valid validation state + _init_dataprocessor:function(){ + var url = this._settings.save; + + if (url === true) + url = this._settings.save = this._settings.url; + + var obj = { master: this }; + + if (url && url.url) + webix.extend(obj, url); + else + obj.url = url; + + webix.dp(obj); + }, + save_setter:function(value){ + if (value) + this.$ready.push(this._init_dataprocessor); + return value; + }, + scheme_setter:function(value){ + this.data.scheme(value); + }, + dataFeed_setter:function(value){ + if (typeof value == "string" && value.indexOf("->") != -1){ + var parts = value.split("->"); + value = webix.proxy(parts[0], parts[1]); + } + + this.data.attachEvent("onBeforeFilter", webix.bind(function(text, filtervalue){ + //complex filtering, can't be routed to dataFeed + if (typeof text == "function") return true; + + //we have dataFeed and some text + if (this._settings.dataFeed && (text || filtervalue)){ + text = text || "id"; + if (filtervalue && typeof filtervalue == "object") + filtervalue = filtervalue.id; + + this.clearAll(); + var url = this._settings.dataFeed; + + //js data feed + if (typeof url == "function"){ + var filter = {}; + filter[text] = filtervalue; + url.call(this, filtervalue, filter); + } else if (url.$proxy) { + if (url.load){ + var filterobj = {}; filterobj[text] = filtervalue; + url.load(this, null, filterobj); + } + } else { + //url data feed + var urldata = "filter["+text+"]="+encodeURIComponent(filtervalue); + this.load(url+(url.indexOf("?")<0?"?":"&")+urldata, this._settings.datatype); + } + return false; + } + },this)); + return value; + }, + _call_onready:function(){ + if (this._settings.ready && !this._ready_was_used){ + var code = webix.toFunctor(this._settings.ready, this.$scope); + if (code) + webix.delay(code, this, arguments); + this._ready_was_used = true; + } + }, + _call_onclearall:function(){ + for (var i = 0; i < this._ajax_queue.length; i++){ + var xhr = this._ajax_queue[i]; + + //IE9 and IE8 deny extending of ActiveX wrappers + try { xhr.aborted = true; } catch(e){ + webix._xhr_aborted.push(xhr); + } + xhr.abort(); + } + + this._ajax_queue = webix.toArray(); + this.waitData = webix.promise.defer(); + }, + _call_on_config:function(config){ + this._parseSeetingColl(config); + } +},webix.AtomDataLoader); + +//ie8 compatibility +webix._xhr_aborted = webix.toArray(); + +webix.DataMarks = { + addCss:function(id, css, silent){ + if (!this.addRowCss && !silent){ + if (!this.hasCss(id, css)){ + var node = this.getItemNode(id); + if (node){ + node.className += " "+css; + silent = true; + } + } + } + return this.data.addMark(id, css, 1, 1, silent); + }, + removeCss:function(id, css, silent){ + if (!this.addRowCss && !silent){ + if (this.hasCss(id, css)){ + var node = this.getItemNode(id); + if (node){ + node.className = node.className.replace(css,"").replace(" "," "); + silent = true; + } + } + } + return this.data.removeMark(id, css, 1, silent); + }, + hasCss:function(id, mark){ + return this.data.getMark(id, mark); + }, + clearCss:function(css, silent){ + return this.data.clearMark(css, 1, silent); + } +}; + +/* + DataStore is not a behavior, it standalone object, which represents collection of data. + Call provideAPI to map data API + + @export + exists + getIdByIndex + getIndexById + get + set + refresh + count + sort + filter + next + previous + clearAll + first + last +*/ +webix.DataStore = function(){ + this.name = "DataStore"; + + webix.extend(this, webix.EventSystem); + + this.setDriver("json"); //default data source is an + this.pull = {}; //hash of IDs + this.order = webix.toArray(); //order of IDs + this._marks = {}; +}; + +webix.DataStore.prototype={ + //defines type of used data driver + //data driver is an abstraction other different data formats - xml, json, csv, etc. + setDriver:function(type){ + webix.assert(webix.DataDriver[type],"incorrect DataDriver"); + this.driver = webix.DataDriver[type]; + }, + //process incoming raw data + _parse:function(data,master){ + this.callEvent("onParse", [this.driver, data]); + + if (this._filter_order) + this.filter(); + + //get size and position of data + var info = this.driver.getInfo(data); + + //generated by connectors only + if (info._key) + webix.securityKey = info._key; + + if (info._config) + this.callEvent("onServerConfig",[info._config]); + + var options = this.driver.getOptions(data); + if (options) + this.callEvent("onServerOptions", [options]); + + //get array of records + var recs = this.driver.getRecords(data); + + this._inner_parse(info, recs); + + //in case of tree store we may want to group data + if (this._scheme_group && this._group_processing && !this._not_grouped_order) + this._group_processing(this._scheme_group); + + //optional data sorting + if (this._scheme_sort){ + this.blockEvent(); + this.sort(this._scheme_sort); + this.unblockEvent(); + } + + this.callEvent("onStoreLoad",[this.driver, data]); + //repaint self after data loading + this.refresh(); + }, + _inner_parse:function(info, recs){ + var from = (info._from||0)*1; + var subload = true; + var marks = false; + + if (from === 0 && this.order[0] && this.order[this.order.length-1]){ //update mode + if (this._removeMissed){ + //update mode, create kill list + marks = {}; + for (var i=0; ito){ //can be in case of backward shift-selection + var a=to; to=from; from=a; + } + + return this.getIndexRange(from,to); + }, + //converts range of indexes to array of all IDs between them + getIndexRange:function(from,to){ + to=Math.min((to === 0 ? 0 :(to||Infinity)),this.count()-1); + + var ret=webix.toArray(); //result of method is rich-array + for (var i=(from||0); i <= to; i++) + ret.push(this.getItem(this.order[i])); + return ret; + }, + //returns total count of elements + count:function(){ + return this.order.length; + }, + //returns truy if item with such ID exists + exists:function(id){ + return !!(this.pull[id]); + }, + //nextmethod is not visible on component level, check DataMove.move + //moves item from source index to the target index + move:function(sindex,tindex){ + webix.assert(sindex>=0 && tindex>=0, "DataStore::move","Incorrect indexes"); + if (sindex == tindex) return; + + var id = this.getIdByIndex(sindex); + var obj = this.getItem(id); + + if (this._filter_order) + this._move_inner(this._filter_order, 0, 0, this.getIdByIndex(sindex), this.getIdByIndex(tindex)); + + this._move_inner(this.order, sindex, tindex); + + + //repaint signal + this.callEvent("onStoreUpdated",[id,obj,"move"]); + }, + _move_inner:function(col, sindex, tindex, sid, tid){ + if (sid||tid){ + sindex = tindex = -1; + for (var i=0; i data_size){ + webix.log("Warning","DataStore:add","Index of out of bounds"); + index = Math.min(order.length,index); + } + if (this.callEvent("onBeforeAdd", [id, obj, index]) === false) return false; + + webix.assert(!this.exists(id), "Not unique ID"); + + this.pull[id]=obj; + order.insertAt(id,index); + if (this._filter_order){ //adding during filtering + //we can't know the location of new item in full dataset, making suggestion + //put at end by default + var original_index = this._filter_order.length; + //put at start only if adding to the start and some data exists + if (!index && this.order.length) + original_index = 0; + + this._filter_order.insertAt(id,original_index); + } + this.callEvent("onAfterAdd",[id,index]); + //repaint signal + this.callEvent("onStoreUpdated",[id,obj,"add"]); + return id; + }, + + //removes element from datastore + remove:function(id){ + //id can be an array of IDs - result of getSelect, for example + if (webix.isArray(id)){ + for (var i=0; i < id.length; i++) + this.remove(id[i]); + return; + } + if (this.callEvent("onBeforeDelete",[id]) === false) return false; + + webix.assert(this.exists(id), "Not existing ID in remove command"+id); + + var obj = this.getItem(id); //save for later event + //clear from collections + this.order.remove(id); + if (this._filter_order) + this._filter_order.remove(id); + + delete this.pull[id]; + if (this._marks[id]) + delete this._marks[id]; + + this.callEvent("onAfterDelete",[id]); + //repaint signal + this.callEvent("onStoreUpdated",[id,obj,"delete"]); + }, + //deletes all records in datastore + clearAll:function(){ + //instead of deleting one by one - just reset inner collections + this.pull = {}; + this._marks = {}; + this.order = webix.toArray(); + //this.feed = null; + this._filter_order = this.url = null; + this.callEvent("onClearAll",[]); + this.refresh(); + }, + //converts id to index + getIdByIndex:function(index){ + webix.assert(index >= 0,"DataStore::getIdByIndex Incorrect index"); + return this.order[index]; + }, + //converts index to id + getIndexById:function(id){ + var res = this.order.find(id); //slower than getIdByIndex + if (!this.pull[id]) + return -1; + + return res; + }, + //returns ID of next element + getNextId:function(id,step){ + return this.order[this.getIndexById(id)+(step||1)]; + }, + //returns ID of first element + getFirstId:function(){ + return this.order[0]; + }, + //returns ID of last element + getLastId:function(){ + return this.order[this.order.length-1]; + }, + //returns ID of previous element + getPrevId:function(id,step){ + return this.order[this.getIndexById(id)-(step||1)]; + }, + /* + sort data in collection + by - settings of sorting + + or + + by - sorting function + dir - "asc" or "desc" + + or + + by - property + dir - "asc" or "desc" + as - type of sortings + + Sorting function will accept 2 parameters and must return 1,0,-1, based on desired order + */ + sort:function(by, dir, as){ + var sort = by; + if (typeof by == "function") + sort = {as:by, dir:dir}; + else if (typeof by == "string") + sort = {by:by.replace(/#/g,""), dir:dir, as:as}; + + + var parameters = [sort.by, sort.dir, sort.as, sort]; + if (!this.callEvent("onBeforeSort",parameters)) return; + + this.order = this._sort_core(sort, this.order); + if (this._filter_order && this._filter_order.length != this.order.length) + this._filter_order = this._sort_core(sort, this._filter_order); + + //repaint self + this.refresh(); + + this.callEvent("onAfterSort",parameters); + }, + _sort_core:function(sort, order){ + var sorter = this._sort._create(sort); + if (this.order.length){ + //get array of IDs + var neworder = webix.toArray(); + for (var i=order.length-1; i>=0; i--) + neworder[i] = this.pull[order[i]]; + + neworder.sort(sorter); + return webix.toArray(neworder.map(function(obj){ + webix.assert(obj, "Client sorting can't be used with dynamic loading"); + return this.id(obj); + },this)); + } + return order; + }, + /* + Filter datasource + + text - property, by which filter + value - filter mask + + or + + text - filter method + + Filter method will receive data object and must return true or false + */ + _filter_reset:function(preserve){ + //remove previous filtering , if any + if (this._filter_order && !preserve){ + this.order = this._filter_order; + delete this._filter_order; + } + }, + _filter_core:function(filter, value, preserve){ + var neworder = webix.toArray(); + for (var i=0; i < this.order.length; i++){ + var id = this.order[i]; + if (filter(this.getItem(id),value)) + neworder.push(id); + } + //set new order of items, store original + if (!preserve || !this._filter_order) + this._filter_order = this.order; + this.order = neworder; + }, + filter:function(text,value,preserve){ + //unfilter call but we already in not-filtered state + if (!text && !this._filter_order && !this._filter_branch) return; + if (!this.callEvent("onBeforeFilter", [text, value])) return; + + this._filter_reset(preserve); + if (!this.order.length) return; + + //if text not define -just unfilter previous state and exit + if (text){ + var filter = text; + value = value||""; + if (typeof text == "string"){ + text = text.replace(/#/g,""); + if (typeof value == "function") + filter = function(obj){ + return value(obj[text]); + }; + else{ + value = value.toString().toLowerCase(); + filter = function(obj,value){ //default filter - string start from, case in-sensitive + webix.assert(obj, "Client side filtering can't be used with dynamic loading"); + return (obj[text]||"").toString().toLowerCase().indexOf(value)!=-1; + }; + } + } + + this._filter_core(filter, value, preserve, this._filterMode); + } + //repaint self + this.refresh(); + + this.callEvent("onAfterFilter", []); + }, + /* + Iterate through collection + */ + _obj_array:function(){ + var data = []; + for (var i = this.order.length - 1; i >= 0; i--) + data[i]=this.pull[this.order[i]]; + + return data; + }, + each:function(method, master, all){ + var order = this.order; + if (all) + order = this._filter_order || order; + + for (var i=0; ib?1:(ab?1:(ab?1:(ab?1:(a=this.data.limit) id=this.data.limit-1; + + var old = this.data.page; + this.data.page = id*1; //must be int + + if (this.refresh()){ + if (!this._settings.animate || !this._animate(old, id*1, this._settings.animate)) + this.$master.refresh(); + } + }, + _id:"webix_p_id", + template_setter:webix.template, + type:{ + template:function(a,b){ return a.template.call(this, a,b); }, + //list of page numbers + pages:function(obj){ + var html=""; + //skip rendering if paging is not fully initialized + if (obj.page == -1) return ""; + //current page taken as center of view, calculate bounds of group + obj.$min = obj.page-Math.round((obj.group-1)/2); + obj.$max = obj.$min + obj.group*1 - 1; + if (obj.$min<0){ + obj.$max+=obj.$min*(-1); + obj.$min=0; + } + if (obj.$max>=obj.limit){ + obj.$min -= Math.min(obj.$min,obj.$max-obj.limit+1); + obj.$max = obj.limit-1; + } + //generate HTML code of buttons + for (var i=(obj.$min||0); i<=obj.$max; i++) + html+=this.button({id:i, index:(i+1), selected:(i == obj.page ?"_selected":"")}); + return html; + }, + page:function(obj){ + return obj.page+1; + }, + //go-to-first page button + first:function(){ + return this.button({ id:"first", index:webix.locale.pager.first, selected:""}); + }, + //go-to-last page button + last:function(){ + return this.button({ id:"last", index:webix.locale.pager.last, selected:""}); + }, + //go-to-prev page button + prev:function(){ + return this.button({ id:"prev", index:webix.locale.pager.prev, selected:""}); + }, + //go-to-next page button + next:function(){ + return this.button({ id:"next", index:webix.locale.pager.next, selected:""}); + }, + button:webix.template("") + }, + clone:function(pager){ + if (!pager.$view){ + pager.view = "pager"; + pager = webix.ui(pager); + } + + this._clone = pager; + pager.$master = this; + this._refresh_clone(); + }, + refresh:function(){ + var s = this._settings; + if (!s.count) return; + + //max page number + s.limit = Math.ceil(s.count/s.size); + s.page = Math.min(s.limit-1, s.page); + + var id = s.page; + if (id>=0 && (id!=s.old_page) || (s.limit != s.old_limit)){ + //refresh self only if current page or total limit was changed + this.render(); + this._refresh_clone(); + s.old_limit = s.limit; //save for onchange check in next iteration + s.old_page = s.page; + return true; + } + }, + apiOnly_setter:function(value){ + return (this.$apiOnly=value); + }, + _refresh_clone:function(){ + if (this._clone){ + this._clone._settings.count = this._settings.count; + this._clone._settings.page = this._settings.page; + this._clone.refresh(); + } + }, + _animate:function(old, id, config){ + if (old == id) return false; + if (this._pgInAnimation){ + if(this._pgAnimateTimeout){ + window.clearTimeout(this._pgAnimateTimeout); + } + return (this._pgAnimateTimeout = webix.delay(this._animate, this,[old, id, config],100)); + } + var direction = id > old ? "left" : "right"; + if (config.direction == "top" || config.direction == "bottom") + direction = id > old ? "top" : "bottom"; + if (config.flip) + direction = ""; + + + + //make copy of existing view + var top = 0; + var snode = this.$master._dataobj; + if (this.$master._body){ //datatable + snode = this.$master._body; + top = snode.offsetTop; + webix.html.addCss(this.$master.$view, "webix_animation"); + } + + var onode = snode.cloneNode(true); + onode.style.width = snode.style.width = "100%"; + onode.style.backgroundColor = snode.style.backgroundColor = "white"; + + //redraw page + this.$master.refresh(); + //append copy next to original + webix.html.insertBefore(onode, snode.nextSibling, snode.parentNode); + + //animation config + var line; + var base = config !== true ? config : {}; + var aniset = webix.extend({ + direction:direction, + callback:webix.bind(function(){ + aniset.callback = null; + webix.animate.breakLine(line); + this._pgInAnimation = false; + if (this.$master._body) + webix.html.removeCss(this.$master.$view, "webix_animation"); + },this), + top:top + }, base); + + //run animation + line = webix.animate.formLine(snode, onode, aniset); + webix.animate([ snode, onode ], aniset ); + this._pgInAnimation = true; + } +}, webix.MouseEvents, webix.SingleRender, webix.ui.view, webix.EventSystem); + +webix.locale.pager = { + first: " << ", + last: " >> ", + next: " > ", + prev: " < " +}; + + +webix.PagingAbility = { + pager_setter:function(pager){ + if (typeof pager == "string"){ + var ui_pager = webix.$$(pager); + if (!ui_pager){ + this.$blockRender = true; + webix.delay(function(){ + var obj = webix.$$(pager); + + this._settings.pager = this.pager_setter(obj); + var s = obj._settings; + s.count = this.data._count_pager_total(s.level); + obj.refresh(); + + this.$blockRender = false; + this.render(); + }, this); + return null; + } + pager = ui_pager; + } + + function check_pager_sizes(repeat){ + if (pager.config.autosize && this.getVisibleCount){ + var count = this.getVisibleCount(); + if (isNaN(count)){ + pager.config.size = 1; + webix.delay(check_pager_sizes, this, [true]); + } else if (count != pager.config.size){ + pager.config.size = count; + pager.refresh(); + if (repeat === true) + this.refresh(); + } + } + + var s = this._settings.pager; + //initial value of pager = -1, waiting for real value + if (s.page == -1) return false; + + this.data.$min = this._count_pager_index(0, s.page*s.size); //affect data.getRange + this.data.$max = this._count_pager_index(this.data.$min, s.size); + this.data.$pagesize = this.data.$max - this.data.$min; + + return true; + } + + this.attachEvent("onBeforeRender",check_pager_sizes); + + if (!pager.$view){ + pager.view = "pager"; + pager = webix.ui(pager); + } + this._pager = pager; + pager.$master = this; + + this.data.attachEvent("onStoreUpdated", function(){ + var s = pager._settings; + s.count = this._count_pager_total(s.level); + pager.refresh(); + }); + this.data._count_pager_total = this._count_pager_total; + + return pager._settings; + }, + _count_pager_total:function(level){ + if (level && level !== 0){ + var count = 0; + this.each(function(obj){ + if (obj.$level == level) count++; + }); + return count; + } else + return this.count(); + }, + _count_pager_index:function(start, count){ + var s = this._settings.pager; + + if (s.level && s.level !== 0){ + var end = start; + var max = this.data.order.length; + + if (count) + while (end < max){ + if (this.data.getItem(this.data.order[end]).$level == s.level){ + if (count === 0) + break; + else + count--; + } + end++; + } + + return end; + } else + return start+count; + }, + setPage:function(value){ + if (this._pager) + this._pager.select(value); + }, + getPage:function(){ + return this._pager._settings.page; + }, + getPager:function(){ + return this._pager; + } +}; +/* + Behavior: AutoTooltip - links tooltip to data driven item +*/ + +/* + UI: Tooltip + + @export + show + hide +*/ + + + + +webix.protoUI({ + name:"tooltip", + defaults:{ + dy:0, + dx:20 + }, + $init:function(container){ + if (typeof container == "string"){ + container = { template:container }; + } + + this.type = webix.extend({}, this.type); + + //create container for future tooltip + this._viewobj = this._contentobj = this._dataobj = document.createElement("DIV"); + this._contentobj.className = "webix_tooltip"; + webix.html.insertBefore(this._contentobj,document.body.firstChild); + }, + adjust:function(){ }, + //show tooptip + //pos - object, pos.x - left, pox.y - top + isVisible:function(){ + return true; + }, + show:function(data,pos){ + if (this._disabled) return; + //render sefl only if new data was provided + if (this.data!=data){ + this.data=webix.extend({},data); + this.render(data); + } + + if (this._dataobj.firstChild){ + //show at specified position + this._contentobj.style.top = pos.y+this._settings.dy+"px"; + this._contentobj.style.left = pos.x+this._settings.dx+"px"; + this._contentobj.style.display="block"; + } + }, + //hide tooltip + hide:function(){ + this.data=null; //nulify, to be sure that on next show it will be fresh-rendered + this._contentobj.style.display="none"; + }, + disable:function(){ + this._disabled = true; + }, + enable:function(){ + this._disabled = false; + }, + type:{ + template:webix.template("{obj.id}"), + templateStart:webix.template.empty, + templateEnd:webix.template.empty + } + +}, webix.SingleRender, webix.Settings, webix.EventSystem, webix.ui.view); + + + +webix.AutoTooltip = { + tooltip_setter:function(value){ + if (value){ + if (typeof value == "function") + value = { template:value }; + + var col_mode = !value.template; + var handlers = []; + var t = new webix.ui.tooltip(value); + this._enable_mouse_move(); + handlers[0] = this.attachEvent("onMouseMove",function(id,e){ //show tooltip on mousemove + if (this.getColumnConfig){ + var config = t.type.column = this.getColumnConfig(id.column); + if (col_mode){ + + //empty tooltip - ignoring + if (!config.tooltip && config.tooltip != webix.undefined) + return; + if (config.tooltip) + t.type.template = config.tooltip = webix.template(config.tooltip); + else { + var text = this.getText(id.row, id.column); + t.type.template = function(){ return text; }; + } + } + } + + if (!webix.DragControl.active) + t.show(this.getItem(id),webix.html.pos(e)); + }); + handlers[1] = this.attachEvent("onMouseOut",function(id,e){ //hide tooltip on mouseout + t.hide(); + }); + handlers[2] = this.attachEvent("onMouseMoving",function(id,e){ //hide tooltip just after moving start + t.hide(); + }); + this.attachEvent("onDestruct",function(){ + if(this.config.tooltip) + this.config.tooltip.destructor(); + }); + t.attachEvent("onDestruct",webix.bind(function(){ + for(var i = 0; i < handlers.length;i++) + this.detachEvent(handlers[i]); + },this)); + return t; + } + } +}; + +webix.protoUI({ + name:"proto", + $init:function(){ + this.data.provideApi(this, true); + this._dataobj = this._dataobj || this._contentobj; + + //render self , each time when data is updated + this.data.attachEvent("onStoreUpdated",webix.bind(function(){ + this.render.apply(this,arguments); + },this)); + }, + $setSize:function(){ + if (webix.ui.view.prototype.$setSize.apply(this, arguments)) + this.render(); + }, + _id:"webix_item", + on_mouse_move:{ + }, + type:{} +}, webix.PagingAbility, webix.DataMarks, webix.AutoTooltip,webix.ValidateCollection,webix.RenderStack, webix.DataLoader, webix.ui.view, webix.EventSystem, webix.Settings); + +webix.Values = { + $init:function(){ + this.elements = {}; + }, + focus:function(name){ + var target; + if (name){ + webix.assert(this.elements[name],"unknown input name: "+name); + target = this.elements[name]; + } else if (this._cells){ + var index = 0; + do { + target = this._cells[index]; + index++; + } while (target && !target.focus); + } + + if (target && target.focus) + target.focus(); + }, + setValues:function(data, update){ + this._is_form_dirty = update; + + //prevent onChange calls from separate controls + this.blockEvent(); + this._inner_setValues(data, update); + this.unblockEvent(); + this.callEvent("onValues",[]); + }, + _inner_setValues:function(data, update){ + if (update) + this._values = webix.extend(this.getValues(), data, true); + else + this._values = webix.copy(data); + if (webix.debug_render) + webix.log("Render: "+this.name+"@"+this._settings.id); + + for (var name in this.elements){ + var input = this.elements[name]; + if (input){ + if (!webix.isUndefined(this._values[name])) + input.setValue(data[name] || this._values[name]); + else { + if (input._allowsClear) + input.setValue(""); + this._values[name] = input.getValue(); + } + } + } + }, + isDirty:function(){ + if (this._is_form_dirty) return true; + if (this.getDirtyValues(1) === 1) + return true; + + return false; + }, + setDirty:function(flag){ + this._is_form_dirty = flag; + if (!flag) + this._values = this.getValues(); + }, + getDirtyValues:function(){ + var result = {}; + if (this._values){ + for (var name in this.elements){ + var value = this.elements[name].getValue(); + if (this._values[name] != value){ + result[name] = value; + //FIXME - used by isDirty + if (arguments[0]) + return 1; + } + } + } + return result; + }, + getCleanValues:function(){ + return this._values; + }, + getValues:function(filter){ + //get original data + var success, + elem = null, + data = (this._values?webix.copy(this._values):{}); + + //update properties from linked controls + for (var name in this.elements){ + elem = this.elements[name]; + success = true; + if(filter){ + if(typeof filter == "object"){ + if(filter.hidden === false) + success = elem.isVisible(); + if(success && filter.disabled === false) + success = elem.isEnabled(); + } + else + success = filter.call(this,elem); + } + if(success) + data[name] = elem.getValue(); + else + delete data[name]; //in case of this._values[name] + } + return data; + }, + clear:function(){ + this._is_form_dirty = false; + var data = {}; + for (var name in this.elements) + if (this.elements[name]._allowsClear) + data[name] = this.elements[name]._settings.defaultValue||""; + + this.setValues(data); + }, + _onLoad:function(text,xml,loader){ + var driver = this.data.driver; + var data; + if (loader === -1){ + data = xml; + } else { + data = driver.toObject(text,xml); + } + + if (data){ + var top = driver.getRecords(data)[0]; + this.setValues(driver?driver.getDetails(top):text); + } else + this._onLoadError(text,xml,loader); + this.callEvent("onAfterLoad",[]); + this.waitData.resolve(); + }, + _mark_invalid:function(id,obj,silent){ + var input = this.elements[id]; + if (id && input){ + this._clear_invalid(id,obj,true); + webix.html.addCss(input._viewobj, "webix_invalid"); + input._settings.invalid = true; + if(input._settings.invalidMessage && input._showBottomText) + input._showBottomText(); + } + }, + _clear_invalid:function(id,obj,silent){ + var input = this.elements[id]; + if(id && input && input.$view && input._settings.invalid){ + webix.html.removeCss(input._viewobj, "webix_invalid"); + input._settings.invalid = false; + if(input._settings.invalidMessage && !silent && input._showBottomText) + input._showBottomText(); + } + } +}; + + + +webix.protoUI({ + name:"toolbar", + defaults:{ + type:'toolbar' + }, + _render_borders:true, + _form_classname:"webix_toolbar", + _form_vertical:false, + $init:function(config){ + if (!config.borderless) + this._contentobj.style.borderWidth="1px"; + + this._contentobj.className+=" "+this._form_classname; + }, + _recollect_elements:function(){ + var form = this; + form.elements = {}; + webix.ui.each(this, function(view){ + if (view._settings.name && view.getValue && view.setValue){ + form.elements[view._settings.name] = view; + if (view.mapEvent) + view.mapEvent({ + onbeforetabclick:form, + onaftertabclick:form, + onitemclick:form, + onchange:form + }); + } + + if (view.setValues) return false; + }); + this.setDirty(false); + }, + _parse_cells_ext_end:function(){ + this._recollect_elements(); + }, + _parse_cells_ext:function(collection){ + var config = this._settings; + if (config.elements && !collection){ + this._collection = collection = config.elements; + this._vertical_orientation = this._form_vertical; + delete config.elements; + } + + if (this._settings.elementsConfig) + this._rec_apply_settings(this._collection, config.elementsConfig); + + return collection; + }, + _rec_apply_settings:function(col, settings){ + for (var i=0; i"; + }, + load:function(value){ + this.src_setter(value); + }, + src_setter:function(value){ + this.getIframe().src = value; + this.callEvent("onBeforeLoad",[]); + return value; + }, + getIframe:function(){ + return this._contentobj.getElementsByTagName("iframe")[0]; + }, + getWindow:function(){ + return this.getIframe().contentWindow; + } +}, webix.ui.view, webix.EventSystem); + +webix.OverlayBox = { + showOverlay:function(message){ + if (!this._overlay){ + this._overlay = webix.html.create("DIV",{ "class":"webix_overlay" },(message||"")); + webix.html.insertBefore(this._overlay, this._viewobj.firstChild, this._viewobj); + this._viewobj.style.position = "relative"; + } else + this._overlay.innerHTML = message; + }, + hideOverlay:function(){ + if (this._overlay){ + webix.html.remove(this._overlay); + this._overlay = null; + } + } +}; + +/*scrollable view with another view insize*/ +webix.protoUI({ + name:"scrollview", + defaults:{ + scroll:"y", + scrollSpeed:"0ms" + }, + $init:function(){ + this._viewobj.className += " webix_scrollview"; + }, + body_setter:function(config){ + config.borderless = true; + this._body_cell = webix.ui._view(config); + this._body_cell._parent_cell = this; + this._dataobj.appendChild(this._body_cell._viewobj); + }, + getChildViews:function(){ + return [this._body_cell]; + }, + getBody:function(){ + return this._body_cell; + }, + resizeChildren:function(){ + this._desired_size = this._body_cell.$getSize(0, 0); + this._resizeChildren(); + }, + _resizeChildren:function(){ + var scroll_size = this._native_scroll || webix.ui.scrollSize; + var cx = Math.max(this._content_width, this._desired_size[0]); + var cy = Math.max(this._content_height, this._desired_size[2]); + this._body_cell.$setSize(cx, cy); + this._dataobj.style.width = this._body_cell._content_width+"px"; + this._dataobj.style.height = this._body_cell._content_height+"px"; + if (webix.env.touch){ + var state = this.getScrollState(); + var top = this._body_cell._content_height - this._content_height; + if (top < state.y) + this.scrollTo(null, top); + } + }, + $getSize:function(dx, dy){ + var desired_size = this._desired_size = this._body_cell.$getSize(0, 0); + var self_sizes = webix.ui.view.prototype.$getSize.call(this, dx, dy); + var scroll_size = this._native_scroll || webix.ui.scrollSize; + + if(this._settings.scroll=="x"){ + self_sizes[2] = Math.max(self_sizes[2], desired_size[2]) + scroll_size; + self_sizes[3] = Math.min(self_sizes[3], desired_size[3]) + scroll_size; + } else if(this._settings.scroll=="y"){ + self_sizes[0] = Math.max(self_sizes[0], desired_size[0]) + scroll_size; + self_sizes[1] = Math.min(self_sizes[1], desired_size[1]) + scroll_size; + } + return self_sizes; + }, + $setSize:function(x,y){ + var temp = webix.ui.scrollSize; + webix.ui.scrollSize = this._native_scroll || temp; + + if (webix.ui.view.prototype.$setSize.call(this,x,y)) + this._resizeChildren(); + + webix.ui.scrollSize = temp; + }, + scroll_setter:function(value){ + var custom = webix.env.$customScroll; + if (typeof value == "string" && value.indexOf("native-") === 0){ + this._native_scroll = 17; + value = value.replace("native-"); + webix.env.$customScroll = false; + } + + value = webix.Scrollable.scroll_setter.call(this, value); + + webix.env.$customScroll = custom; + return value; + }, + _replace:function(new_view){ + this._body_cell.destructor(); + this._body_cell = new_view; + this._body_cell._parent_cell = this; + + this._bodyobj.appendChild(this._body_cell._viewobj); + this.resize(); + }, + showView: function(id){ + var topPos = webix.$$(id).$view.offsetTop-webix.$$(id).$view.parentNode.offsetTop; + this.scrollTo(0, topPos); + } +}, webix.Scrollable, webix.ui.view); +/* + UI:TreeMenu +*/ + + + + + +webix.TreeRenderStack={ + $init:function(){ + webix.assert(this.render,"TreeRenderStack :: Object must use RenderStack first"); + }, + _toHTMLItem:function(obj){ + var mark = this.data._marks[obj.id]; + this.callEvent("onItemRender",[obj]); + return this.type.templateStart(obj,this.type,mark)+(obj.$template?this.type["template"+obj.$template](obj,this.type,mark):this.type.template(obj,this.type,mark))+this.type.templateEnd(); + }, + _toHTMLItemObject:function(obj){ + this._html.innerHTML = this._toHTMLItem(obj); + return this._html.firstChild; + }, + //convert single item to HTML text (templating) + _toHTML:function(obj){ + //check if related template exist + webix.assert((!obj.$template || this.type["template"+obj.$template]),"RenderStack :: Unknown template: "+obj.$template); + var html="
    "+this._toHTMLItem(obj); + + if (obj.open) + html+=this._toHTMLLevel(obj.id); + + html+="
    "; + + return html; + }, + _toHTMLLevel:function(id){ + var html = ""; + var leaves = this.data.branch[id]; + if (leaves){ + html+="
    "; + var last = leaves.length-1; + for (var i=0; i <= last; i++){ + var obj = this.getItem(leaves[i]); + this.type._tree_branch_render_state[obj.$level] = (i == last); + html+=this._toHTML(obj); + } + html+="
    "; + } + return html; + }, + //return true when some actual rendering done + render:function(id,data,type){ + webix.TreeRenderStack._obj = this; //can be used from complex render + + if (!this.isVisible(this._settings.id) || this.$blockRender) + return; + + if (webix.debug_render) + webix.log("Render: "+this.name+"@"+this._settings.id); + + if (id){ + var cont; + var item = this.getItem(id); + if (type!="add"){ + cont = this.getItemNode(id); + if (!cont) return; + } + + switch(type){ + case "branch": + var branch = cont.parentNode; + var node = this._toHTMLObject(item); + + webix.html.insertBefore(node, branch); + webix.html.remove(branch); + this._htmlmap = null; + break; + case "paint": + case "update": + var node = this._htmlmap[id] = this._toHTMLItemObject(item); + webix.html.insertBefore(node, cont); + webix.html.remove(cont); + break; + case "delete": + //deleting not item , but full branch + webix.html.remove(cont.parentNode); + break; + case "add": + var parent; + //we want process both empty value and 0 as string + //jshint -W041:true + if (item.$parent == 0){ + parent = this._dataobj.firstChild; + } else { + parent = this.getItemNode(item.$parent); + if (parent) + parent = parent.nextSibling; + } + + if (parent){ + var next = this.data.getNextSiblingId(id); + next = this.getItemNode(next); + if (next) + next = next.parentNode; + + var node = this._toHTMLObject(item); + this._htmlmap[id] = node.firstChild; + webix.html.insertBefore(node, next, parent); + } + break; + default: + return false; + } + this.callEvent("onPartialRender", [id,data,type]); + } else + //full reset + if (this.callEvent("onBeforeRender",[this.data])){ + //will be used for lines management + this.type._tree_branch_render_state = []; + //getTopRange - returns all elements on top level + this._dataobj.innerHTML = this._toHTMLLevel(0); + + this._htmlmap = null; //clear map, it will be filled at first getItemNode + this.callEvent("onAfterRender",[]); + } + + //clear after usage + this.type._tree_branch_render_state = 0; + webix.TreeRenderStack._obj = null; + return true; + }, + getItemNode:function(search_id){ + if (this._htmlmap) + return this._htmlmap[search_id]; + + //fill map if it doesn't created yet + this._htmlmap={}; + + var t = this._dataobj.getElementsByTagName("DIV"); + for (var i=0; i < t.length; i++){ + var id = t[i].getAttribute(this._id); //get item's + if (id) + this._htmlmap[id]=t[i]; + } + //call locator again, when map is filled + return this.getItemNode(search_id); + }, + _branch_render_supported:1 +}; + + + +/* + Behavior:SelectionModel - manage selection states + @export + select + unselect + selectAll + unselectAll + isSelected + getSelectedId +*/ +webix.SelectionModel={ + $init:function(){ + //collection of selected IDs + this._selected = webix.toArray(); + webix.assert(this.data, "SelectionModel :: Component doesn't have DataStore"); + + //remove selection from deleted items + this.data.attachEvent("onStoreUpdated",webix.bind(this._data_updated,this)); + this.data.attachEvent("onStoreLoad", webix.bind(this._data_loaded,this)); + this.data.attachEvent("onAfterFilter", webix.bind(this._data_filtered,this)); + this.data.attachEvent("onIdChange", webix.bind(this._id_changed,this)); + this.$ready.push(this._set_noselect); + }, + _set_noselect: function(){ + if (this._settings.select=="multiselect" || this._settings.multiselect) + webix.event(this.$view,"mousedown", function(e){ + var shiftKey = (e||event).shiftKey; + if(shiftKey){ + webix._noselect_element = this; + webix.html.addCss(this,"webix_noselect",1); + } + }); + }, + _id_changed:function(oldid, newid){ + for (var i = this._selected.length - 1; i >= 0; i--) + if (this._selected[i]==oldid) + this._selected[i]=newid; + }, + _data_filtered:function(){ + for (var i = this._selected.length - 1; i >= 0; i--){ + if (this.data.getIndexById(this._selected[i]) < 0) { + var id = this._selected[i]; + this.removeCss(id, "webix_selected", true); + this._selected.splice(i,1); + this.callEvent("onSelectChange",[id]); + } + } + }, + //helper - linked to onStoreUpdated + _data_updated:function(id,obj,type){ + if (type == "delete"){ //remove selection from deleted items + if (this.loadBranch){ + //hierarchy, need to check all + for (var i = this._selected.length - 1; i >= 0; i--) + if (!this.exists(this._selected[i])) + this._selected.splice(i,1); + } else + this._selected.remove(id); + } + else if (!id && !this.data.count() && !this.data._filter_order){ //remove selection for clearAll + this._selected = webix.toArray(); + } + }, + _data_loaded:function(){ + if (this._settings.select) + this.data.each(function(obj){ + if (obj && obj.$selected) this.select(obj.id); + }, this); + }, + //helper - changes state of selection for some item + _select_mark:function(id,state,refresh){ + if (!refresh && !this.callEvent("onBeforeSelect",[id,state])) return false; + + if (state) + this.addCss(id, "webix_selected", true); + else + this.removeCss(id, "webix_selected", true); + + if (refresh) + refresh.push(id); //if we in the mass-select mode - collect all changed IDs + else{ + if (state) + this._selected.push(id); //then add to list of selected items + else + this._selected.remove(id); + this._refresh_selection(id); //othervise trigger repainting + } + + return true; + }, + //select some item + select:function(id,preserve){ + var ctrlKey = arguments[2]; + var shiftKey = arguments[3]; + //if id not provide - works as selectAll + if (!id) return this.selectAll(); + + //allow an array of ids as parameter + if (webix.isArray(id)){ + for (var i=0; i < id.length; i++) + this.select(id[i], (i?1:preserve), ctrlKey, shiftKey); + return; + } + + webix.assert(this.data.exists(id), "Incorrect id in select command: "+id); + + //block selection mode + if (shiftKey && this._selected.length) + return this.selectAll(this._selected[this._selected.length-1],id); + //single selection mode + if (!ctrlKey && !preserve && (this._selected.length!=1 || this._selected[0]!=id)){ + this._silent_selection = true; //prevent unnecessary onSelectChange event + this.unselectAll(); + this._silent_selection = false; + } + if (this.isSelected(id)){ + if (ctrlKey) this.unselect(id); //ctrl-selection of already selected item + return; + } + + if (this._select_mark(id,true)){ //if not blocked from event + this.callEvent("onAfterSelect",[id]); + } + }, + //unselect some item + unselect:function(id){ + //if id is not provided - unselect all items + if (!id) return this.unselectAll(); + if (!this.isSelected(id)) return; + + this._select_mark(id,false); + }, + //select all items, or all in defined range + selectAll:function(from,to){ + var range; + var refresh=[]; + + if (from||to) + range = this.data.getRange(from||null,to||null); //get limited set if bounds defined + else + range = this.data.getRange(); //get all items in other case + //in case of paging - it will be current page only + range.each(function(obj){ + if (!this.data.getMark(obj.id, "webix_selected")){ + this._selected.push(obj.id); + this._select_mark(obj.id,true,refresh); + } + },this); + //repaint self + this._refresh_selection(refresh); + }, + //remove selection from all items + unselectAll:function(){ + var refresh=[]; + + this._selected.each(function(id){ + this._select_mark(id,false,refresh); //unmark selected only + },this); + + this._selected=webix.toArray(); + this._refresh_selection(refresh); //repaint self + }, + //returns true if item is selected + isSelected:function(id){ + return this._selected.find(id)!=-1; + }, + /* + returns ID of selected items or array of IDs + to make result predictable - as_array can be used, + with such flag command will always return an array + empty array in case when no item was selected + */ + getSelectedId:function(as_array){ + switch(this._selected.length){ + case 0: return as_array?[]:""; + case 1: return as_array?[this._selected[0]]:this._selected[0]; + default: return ([].concat(this._selected)); //isolation + } + }, + getSelectedItem:function(as_array){ + var sel = this.getSelectedId(true); + if (sel.length > 1 || as_array){ + for (var i = sel.length - 1; i >= 0; i--) + sel[i] = this.getItem(sel[i]); + return sel; + } else if (sel.length) + return this.getItem(sel[0]); + }, + //detects which repainting mode need to be used + _is_mass_selection:function(obj){ + // crappy heuristic, but will do the job + return obj.length>100 || obj.length > this.data.count/2; + }, + _refresh_selection:function(refresh){ + if (typeof refresh != "object") refresh = [refresh]; + if (!refresh.length) return; //nothing to repaint + + if (this._is_mass_selection(refresh)) + this.data.refresh(); //many items was selected - repaint whole view + else + for (var i=0; i < refresh.length; i++) //repaint only selected + this.render(refresh[i],this.data.getItem(refresh[i]),"update"); + + if (!this._silent_selection) + this.callEvent("onSelectChange",[refresh]); + } +}; + +webix.ready(function(){ + webix.event(document.body,"mouseup", function(e){ + if(webix._noselect_element){ + webix.html.removeCss(webix._noselect_element,"webix_noselect"); + webix._noselect_element = null; + } + }); +}); +/* + Behavior:DataMove - allows to move and copy elements, heavily relays on DataStore.move + @export + copy + move +*/ +webix.TreeDataMove={ + $init:function(){ + webix.assert(this.data, "DataMove :: Component doesn't have DataStore"); + }, + //creates a copy of the item + copy:function(sid,tindex,tobj,details){ + details = details || {}; + details.copy = true; + return this.move(sid, tindex, tobj, details); + }, + _next_move_index:function(nid, next, source){ + if (next && nid){ + var new_index = this.getBranchIndex(nid); + return new_index+(source == this && source.getBranchIndex(next)=0) + return order[pos]; + return null; + }, + getNextSiblingId:function(id){ + var order = this.branch[this.getItem(id).$parent]; + var pos = webix.PowerArray.find.call(order, id)+1; + if (pos 0){ + var branch = this.branch[id]; + for(var i=0;i
    "; + else + return "
    "; + } else + return "
    "; + }, + checkbox:function(obj, common){ + if(obj.nocheckbox) + return ""; + return ""; + }, + folder:function(obj, common){ + if (obj.icon) + return "
    "; + + if (obj.$count){ + if (obj.open) + return "
    "; + else + return "
    "; + } + return "
    "; + } +}; + +webix.TreeAPI = { + open: function(id) { + if (!id) return; + //ignore open for leaf items + var item = this.getItem(id); + if (!item.$count || item.open) return; + + if (this.callEvent("onBeforeOpen",[id])){ + item.open=true; + this.data.callEvent("onStoreUpdated",[id, 0, "branch"]); + this.callEvent("onAfterOpen",[id]); + } + }, + close: function(id) { + if (!id) return; + var item = this.getItem(id); + if (!item.open) return; + + if (this.callEvent("onBeforeClose",[id])){ + item.open=false; + this.data.callEvent("onStoreUpdated",[id, 0, "branch"]); + this.callEvent("onAfterClose",[id]); + } + }, + openAll: function(id){ + this.data.eachSubItem((id||0), function(obj, branch){ + if (branch) + obj.open = true; + }); + this.data.refresh(); + }, + closeAll: function(id){ + this.data.eachSubItem((id||0), function(obj, branch){ + if (branch) + obj.open = false; + }); + this.data.refresh(); + }, + _tree_check_uncheck:function(id,mode,e){ + if(this._settings.threeState) + return this._tree_check_uncheck_3(id,(mode !== null?mode:"")); + + var item = this.getItem(id); + + item.checked = (mode !== null?mode:!item.checked); + this.callEvent("onItemCheck", [id, item.checked, e]); + }, + isBranchOpen:function(search_id){ + if (search_id == "0") return true; + + var item = this.getItem(search_id); + if (item.open) + return this.isBranchOpen(item.$parent); + return false; + }, + getOpenItems: function() { + var open = []; + for (var id in this.data.branch) { + if (this.exists(id) && this.getItem(id).open) + open.push(id); + } + return open; + }, + getState: function(){ + return { + open: this.getOpenItems(), + select: this.getSelectedId(true) + }; + }, + _repeat_set_state:function(tree, open){ + var event = this.data.attachEvent("onStoreLoad", function(){ + tree.setState.call(tree,open); + tree.data.detachEvent(event); + tree = null; + }); + }, + setState: function(state){ + var repeat = false; + var dyn = false; + + if (state.open){ + this.closeAll(); + var open = state.open; + for (var i = 0; i < open.length; i++){ + var item = this.getItem(open[i]); + if (item && item.$count){ + item.open=true; + //dynamic loading + if (item.$count == -1){ + //call the same method after data loading + this._repeat_set_state(this, state); + this.refresh(); + return 0; + //end processing + } + } + } + this.refresh(); + } + + + if (state.select && this.select){ + var select = state.select; + this.unselect(); + for (var i = 0; i < select.length; i++) + if (this.exists(select[i])) + this.select(select[i], true); + } + + return 1; + } +}; + +webix.TreeClick = { + webix_tree_open:function(e, id){ + this.close(id); + return false; + }, + webix_tree_close:function(e, id){ + this.open(id); + return false; + }, + webix_tree_checkbox:function(e,id){ + this._tree_check_uncheck(id, null, e); + return false; + } +}; + +webix.TreeCollection = webix.proto({ + name:"TreeCollection", + $init:function(){ + webix.extend(this.data, webix.TreeStore, true); + this.data.provideApi(this,true); + } +}, webix.TreeDataLoader, webix.DataCollection); + +/* + Behavior:DragItem - adds ability to move items by dnd + + dnd context can have next properties + from - source object + to - target object + source - id of dragged item(s) + target - id of drop target, null for drop on empty space + start - id from which DND was started +*/ + + + + + + +webix.DragOrder={ + _do_not_drag_selection:true, + $drag:function(s,e){ + var html = webix.DragItem.$drag.call(this,s,e); + if (html){ + var context = webix.DragControl.getContext(); + if (this.getBranchIndex) + this._drag_order_stored_left = this._drag_order_complex?((this.getItem(context.start).$level) * 16):0; + if (!context.fragile) + this.addCss(context.start, "webix_transparent"); + } + return html; + }, + $dragPos:function(pos,e, node){ + var box = webix.html.offset(this.$view); + var left = box.x + (this._drag_order_complex?( + box.width - webix.ui.scrollSize - 1):1); + + node.style.display = 'none'; + var html = document.elementFromPoint(left, pos.y); + + if (html != this._last_sort_dnd_node){ + var view = webix.$$(html); + //this type of dnd is limited to the self + if (view && view == this){ + var id = this.locate(html); + if (id && this._translate_id) + id = this._translate_id(id); + + var start_id = webix.DragControl.getContext().start; + if (id){ + if (id != this._last_sort_dnd_node){ + if (id != start_id){ + var details, index; + + if (this.getBranchIndex){ + details = { parent:this.getParentId(id) }; + index = this.getBranchIndex(id); + } else { + details = {}; + index = this.getIndexById(id); + } + + if (this.callEvent("onBeforeDropOrder",[start_id, index, e, details])){ + this.move(start_id, index, this, details); + this._last_sort_dnd_node = id; + } + } + webix.DragControl._last = this._contentobj; + } + } + else { + id = "$webix-last"; + if (this._last_sort_dnd_node != id){ + if (!this.callEvent("onBeforeDropOrder",[start_id, -1, e, { parent: 0} ])) return; + this._last_sort_dnd_node = id; + } + } + } + } + + node.style.display = 'block'; + + + box.y += this._header_height; + + pos.x = this._drag_order_stored_left||box.x; + pos.y = pos.y-18; + + if (pos.y < box.y) + pos.y = box.y; + else { + var max = box.y + this.$view.offsetHeight - 60; + if (pos.y > max) + pos.y = max; + } + //prevent normal dnd landing checking + webix.DragControl._skip = true; + }, + $dragIn:function(){ + return false; + }, + $drop:function(s,t,e){ + var context = webix.DragControl.getContext(); + var id = context.start; + this.removeCss(id, "webix_transparent"); + + var index = this.getIndexById(id); + this.callEvent("onAfterDropOrder",[id, index , e]); + if (context.fragile) + this.refresh(); + } +}; +webix.DragItem={ + //helper - defines component's container as active zone for dragging and for dropping + _initHandlers:function(obj, source, target){ + if (!source) webix.DragControl.addDrop(obj._contentobj,obj,true); + if (!target) webix.DragControl.addDrag(obj._contentobj,obj); + + this.attachEvent("onDragOut",function(a,b){ this.$dragMark(a,b); }); + }, + drag_setter:function(value){ + if (value){ + if (value == "order") + webix.extend(this, webix.DragOrder, true); + if (value == "inner") + this._inner_drag_only = true; + + this._initHandlers(this, value == "source", value == "target"); + delete this.drag_setter; //prevent double initialization + } + return value; + }, + /* + s - source html element + t - target html element + d - drop-on html element ( can be not equal to the target ) + e - native html event + */ + //called when drag moved over possible target + $dragIn:function(s,t,e){ + var id = this.locate(e) || null; + var context = webix.DragControl._drag_context; + + //in inner drag mode - ignore dnd from other components + if ((this._inner_drag_only || context.from._inner_drag_only) && context.from !== this) return false; + + var to = webix.DragControl.getMaster(t); + //previous target + var html = (this.getItemNode(id, e)||this._dataobj); + //prevent double processing of same target + if (html == webix.DragControl._landing) return html; + context.target = id; + context.to = to; + + if (this._auto_scroll_delay) + this._auto_scroll_delay = window.clearTimeout(this._auto_scroll_delay); + this._auto_scroll_delay = webix.delay(this._auto_scroll, this, [webix.html.pos(e), id], 250); + + if (!this.$dropAllow(context, e) || + !this.callEvent("onBeforeDragIn",[context, e])){ + context.to = context.target = null; + return null; + } + //mark target only when landing confirmed + this.$dragMark(context,e); + return html; + }, + $dropAllow:function(){ + return true; + }, + _drag_pause:function(id){ + //may be reimplemented in some components + // tree for example + }, + _auto_scroll:function(pos, id){ + var yscroll = 1; + var xscroll = 0; + + var scroll = this._settings.dragscroll; + if (typeof scroll == "string"){ + xscroll = scroll.indexOf("x") != -1; + yscroll = scroll.indexOf("y") != -1; + } + + var data = this._body || this.$view; + var box = webix.html.offset(data); + + var top = box.y; + var bottom = top + data.offsetHeight; + var left = box.x; + var right = left + data.offsetWidth; + + var scroll = this.getScrollState(); + var reset = false; + var sense = 40; //dnd auto-scroll sensivity + + var context = webix.DragControl.getContext(); + + //extension point + this._drag_pause(id); + + if (yscroll){ + if (pos.y < (top + sense)){ + this.scrollTo(scroll.x, scroll.y-sense*2); + reset = true; + } else if (pos.y > bottom - sense){ + this.scrollTo(scroll.x, scroll.y+sense*2); + reset = true; + } + } + + if (xscroll){ + if (pos.x < (left + sense)){ + this.scrollTo(scroll.x-sense*2, scroll.y); + reset = true; + } else if (pos.x > right - sense){ + this.scrollTo(scroll.x+sense*2, scroll.y); + reset = true; + } + } + + + + if (reset && webix.DragControl._active) + if (context && context.to === this) + this._auto_scroll_delay = webix.delay(this._auto_scroll, this, [pos], 100); + }, + //called when drag moved out from possible target + $dragOut:function(s,t,n,e){ + var id = this.locate(e) || null; + var context = webix.DragControl._drag_context; + + //still over previous target + if ((context.target||"").toString() == (id||"").toString()) return null; + + if (this._auto_scroll_delay) + this._auto_scroll_delay = window.clearTimeout(this._auto_scroll_delay); + + //unmark previous target + context.target = context.to = null; + this.callEvent("onDragOut",[context,e]); + return null; + }, + //called when drag moved on target and button is released + $drop:function(s,t,e){ + if (this._auto_scroll_delay) + this._auto_scroll_delay = window.clearTimeout(this._auto_scroll_delay); + + var context = webix.DragControl._drag_context; + //finalize context details + context.to = this; + var target = this._translate_id?this._translate_id(context.target):context.target; + + if (this.getBranchIndex){ + if (target){ + context.parent = this.getParentId(target); + context.index = this.getBranchIndex(target); + } + } else + context.index = target?this.getIndexById(target):this.count(); + + //unmark last target + this.$dragMark({}, e); + + + if( context.from && context.from != context.to && context.from.callEvent ){ + context.from.callEvent("onBeforeDropOut", [context,e]); + } + + if (!this.callEvent("onBeforeDrop",[context,e])) return; + //moving + this._context_to_move(context,e); + + this.callEvent("onAfterDrop",[context,e]); + }, + _context_to_move:function(context,e){ + webix.assert(context.from, "Unsopported d-n-d combination"); + if (context.from){ //from different component + var details = { parent: context.parent, mode: context.pos }; + context.from.move(context.source,context.index,context.to, details); + } + }, + //called when drag action started + $drag:function(s,e){ + var id = this.locate(e); + if (this._translate_id) id=this._translate_id(id, true); + + if (id){ + var list = [id]; + + if (this.getSelectedId && !this._do_not_drag_selection){ //has selection model + //if dragged item is one of selected - drag all selected + var selection = this.getSelectedId(true, true); + + if (selection && selection.length > 1 && webix.PowerArray.find.call(selection,id)!=-1){ + var hash = {}; + var list = []; + for (var i=0;i max) max = property(data[i])*1; + + return max*1; + }, + count:function(property, data){ + return data.length; + }, + any:function(property, data){ + return property(data[0]); + }, + string:function(property, data){ + return property.$name; + } +}; + +webix.GroupStore = { + ungroup:function(skipRender){ + if (this.getBranchIndex) + return this._ungroup_tree.apply(this, arguments); + + if (this._not_grouped_order){ + this.order = this._not_grouped_order; + this.pull = this._not_grouped_pull; + this._not_grouped_pull = this._not_grouped_order = null; + } + if(!skipRender){ + this.callEvent("onStoreUpdated",[]); + } + + }, + _group_processing:function(scheme){ + this.blockEvent(); + this.group(scheme); + this.unblockEvent(); + }, + _group_prop_accessor:function(val){ + if (typeof val == "function") + return val; + var acc = function(obj){ return obj[val]; }; + acc.$name = val; + return acc; + }, + group:function(stats){ + if (this.getBranchIndex) + return this._group_tree.apply(this, arguments); + + var key = this._group_prop_accessor(stats.by); + if (!stats.map[key]) + stats.map[key] = [key, this._any]; + + var groups = {}; + var labels = []; + this.each(function(data){ + var current = key(data); + if (!groups[current]){ + labels.push({ id:current, $group:true, $row:stats.row }); + groups[current] = webix.toArray(); + } + groups[current].push(data); + }); + for (var prop in stats.map){ + var functor = (stats.map[prop][1]||"any"); + var property = this._group_prop_accessor(stats.map[prop][0]); + if (typeof functor != "function"){ + webix.assert(webix.GroupMethods[functor], "unknown grouping rule: "+functor); + functor = webix.GroupMethods[functor]; + } + + for (var i=0; i < labels.length; i++) { + labels[i][prop]=functor.call(this, property, groups[labels[i].id]); + } + } + + this._not_grouped_order = this.order; + this._not_grouped_pull = this.pull; + + this.order = webix.toArray(); + this.pull = {}; + for (var i=0; i < labels.length; i++){ + var id = this.id(labels[i]); + this.pull[id] = labels[i]; + this.order.push(id); + } + + this.callEvent("onStoreUpdated",[]); + }, + _group_tree:function(input, parent){ + this._group_level_count = (this._group_level_count||0) + 1; + + //supports simplified group by syntax + var stats; + if (typeof input == "string"){ + stats = { by:this._group_prop_accessor(input), map:{} }; + stats.map[input] = [input]; + } else if (typeof input == "function"){ + stats = { by:input, map:{} }; + } else + stats = input; + + //prepare + var level; + if (parent) + level = this.getItem(parent).$level; + else { + parent = 0; + level = 0; + } + + var order = this.branch[parent]; + var key = this._group_prop_accessor(stats.by); + + //run + var topbranch = []; + var labels = []; + for (var i=0; i= 0; i--) { + if (this.pull[order[i]].$footer) + order.splice(i,1); + } + this._fix_group_levels(order, 0, 1); + + if (!skipRender) + this.callEvent("onStoreUpdated",[]); + }, + _fix_group_levels:function(branch, parent, level){ + if (parent) + this.getItem(parent).$count = branch.length; + + for (var i = 0; i < branch.length; i++) { + var item = this.pull[branch[i]]; + item.$level = level; + item.$parent = parent; + var next = this.branch[item.id]; + if (next) + this._fix_group_levels(next, item.id, level+1); + } + } +}; +webix.clipbuffer = { + + _area: null, + _blur_id: null, + _ctrl: 0, + + /*! create textarea or returns existing + **/ + init: function() { + // returns existing textarea + if (this._area !== null) + return this._area; + + webix.destructors.push(this); + // creates new textarea + this._area = document.createElement('textarea'); + this._area.className = "webix_clipbuffer"; + this._area.setAttribute("webixignore", 1); + document.body.appendChild(this._area); + + webix.event(document.body, 'keydown', webix.bind(function(e){ + var key = e.keyCode; + var ctrl = !!(e.ctrlKey || e.metaKey); + if (key === 86 && ctrl) + webix.delay(this._paste, this, [], 100); + }, this)); + + return this._area; + }, + destructor: function(){ + this._area = null; + }, + /*! set text into buffer + **/ + set: function(text) { + this.init(); + this._area.value = text; + this.focus(); + }, + /*! select text in textarea + **/ + focus: function() { + this.init(); + this._area.focus(); + this._area.select(); + }, + /*! process ctrl+V pressing + **/ + _paste: function() { + var text = this._area.value; + var last_active = webix.UIManager.getFocus(); + if (last_active) { + last_active.callEvent("onPaste", [text]); + this._area.select(); + } + } +}; + + +webix.CopyPaste = { + clipboard_setter: function(value) { + if (value === true || value === 1) value = "modify"; + this.attachEvent("onAfterSelect", function(id) { + var item = this.getItem(id); + var text = this.type.templateCopy(item); + webix.clipbuffer.set(text, this); + webix.clipbuffer.focus(); + }); + this.attachEvent("onPaste", function(text) { + if (!webix.isUndefined(this._paste[this._settings.clipboard])) + this._paste[this._settings.clipboard].call(this, text); + }); + this.attachEvent("onFocus", function() { + webix.clipbuffer.focus(); + }); + return value; + }, + _paste: { + // insert new item with pasted value + insert: function(text) { + this.add({ value: text }); + }, + // change value of each selected item + modify: function(text) { + var sel = this.getSelectedId(true); + for (var i = 0; i < sel.length; i++) { + this.getItem(sel[i]).value = text; + this.refresh(sel[i]); + } + }, + // do nothing + custom: function(text) {} + }, + templateCopy_setter: function(value) { + this.type.templateCopy = webix.template(value); + }, + type:{ + templateCopy: function(item) { + return this.template(item); + } + } +}; + + +webix.KeysNavigation = { + _navigation_helper:function(mode){ + return function(view, e){ + var tag = (e.srcElement || e.target); + + //ignore clipboard listener + if (!tag.getAttribute("webixignore")){ + //ignore hotkeys if focus in the common input + //to allow normal text edit operations + var name = tag.tagName; + if (name == "INPUT" || name == "TEXTAREA" || name == "SELECT") return true; + } + + if (view && view.moveSelection && view.config.navigation && !view._in_edit_mode) + return view.moveSelection(mode, e.shiftKey); + return true; + }; + }, + moveSelection:function(mode, shift){ + //get existing selection + var selected = this.getSelectedId(true); + if (selected.length == 1){ //if we have a selection + selected = selected[0]; + + if (mode == "left" && this.close) + return this.close(selected); + if (mode == "right" && this.open) + return this.open(selected); + else if (mode == "top") { + selected = this.getFirstId(); + } else if (mode == "bottom") { + selected = this.getLastId(); + } else if (mode == "up" || mode == "left" || mode == "pgup") { + var index = this.getIndexById(selected); + var step = mode == "pgup" ? 10 : 1; + selected = this.getIdByIndex(Math.max(0, index-step)); + } else if (mode == "down" || mode == "right" || mode == "pgdown") { + var index = this.getIndexById(selected); + var step = mode == "pgdown" ? 10 : 1; + selected = this.getIdByIndex(Math.min(this.count()-1, index+step)); + } else { + webix.assert(false, "Not supported selection moving mode"); + return; + } + + this.showItem(selected); + this.select(selected); + } + return false; + }, + navigation_setter:function(value){ + //using global flag to apply hotkey only once + if (value && !webix.UIManager._global_nav_grid_hotkeys){ + webix.UIManager._global_nav_grid_hotkeys = true; + //hotkeys will react on any component but will not work in edit mode + //you can define moveSelection method to handle navigation keys + webix.UIManager.addHotKey("up", this._navigation_helper("up")); + webix.UIManager.addHotKey("down", this._navigation_helper("down")); + webix.UIManager.addHotKey("shift+up", this._navigation_helper("up")); + webix.UIManager.addHotKey("shift+down", this._navigation_helper("down")); + webix.UIManager.addHotKey("shift+right", this._navigation_helper("right")); + webix.UIManager.addHotKey("shift+left", this._navigation_helper("left")); + webix.UIManager.addHotKey("pageup", this._navigation_helper("pgup")); + webix.UIManager.addHotKey("pagedown", this._navigation_helper("pgdown")); + webix.UIManager.addHotKey("home", this._navigation_helper("top")); + webix.UIManager.addHotKey("end", this._navigation_helper("bottom")); + webix.UIManager.addHotKey("right", this._navigation_helper("right")); + webix.UIManager.addHotKey("left", this._navigation_helper("left")); + + } + + return value; + } +}; + + + +webix.protoUI({ + name:"tree", + defaults:{ + scroll:"a" + }, + $init:function(){ + this._viewobj.className += " webix_tree"; + + //map API of DataStore on self + webix.extend(this.data, webix.TreeStore, true); + webix.extend(this.on_click, webix.TreeClick); + this.attachEvent("onAfterRender", this._refresh_scroll); + this.attachEvent("onPartialRender", this._refresh_scroll); + this.data.provideApi(this,true); + }, + //attribute , which will be used for ID storing + _id:"webix_tm_id", + //supports custom context menu + on_context:{}, + on_dblclick:{ + webix_tree_checkbox:function(){ + if(this.on_click.webix_tree_checkbox) + return this.on_click.webix_tree_checkbox.apply(this,arguments); + } + }, + //css class to action map, for onclick event + on_click:{ + webix_tree_item:function(e,id){ + if(this._settings.activeTitle){ + var item = this.getItem(id); + if(item.open) + this.close(id); + else + this.open(id); + } + if (this._settings.select){ + if (this._settings.select=="multiselect" || this._settings.multiselect){ + if (this._settings.multiselect == "level"){ + //allow only selection on the same level + var select = this.getSelectedId(true)[0]; + if (select && this.getParentId(id) != this.getParentId(select)) + return; + } + this.select(id, false, (e.ctrlKey || e.metaKey || (this._settings.multiselect == "touch")), e.shiftKey); //multiselection + } else + this.select(id); + } + } + }, + _paste: { + // insert new item with pasted value + insert: function(text) { + var parent = this.getSelectedId() ||'0' ; + this.add({ value: text }, null, parent); + }, + // change value of each selected item + modify: function(text) { + var sel = this.getSelectedId(true); + for (var i = 0; i < sel.length; i++) { + this.getItem(sel[i]).value = text; + this.refresh(sel[i]); + } + }, + // do nothing + custom: function(text) {} + }, + _drag_order_complex:true, + $dragHTML:function(obj){ + return "
    "+this.type.template(obj, this.type)+"
    "; + }, + + //css class to action map, for dblclick event + type:webix.extend({ + //normal state of item + template:function(obj,common){ + var template = common["template"+obj.level]||common.templateCommon; + return template.apply(this, arguments); + }, + classname:function(obj, common, marks){ + var css = "webix_tree_item"; + + if (obj.$css){ + if (typeof obj.$css == "object") + obj.$css = webix.html.createCss(obj.$css); + css += " "+obj.$css; + } + if (marks && marks.$css) + css += " "+marks.$css; + + return css; + }, + templateCommon:webix.template("{common.icon()} {common.folder()} #value#"), + templateStart:webix.template('
    '), + templateEnd:webix.template("
    "), + templateCopy: webix.template("#value#") + }, webix.TreeType) +}, webix.AutoTooltip, webix.Group, webix.TreeAPI, webix.DragItem, webix.TreeDataMove, webix.SelectionModel, webix.KeysNavigation, webix.MouseEvents, webix.Scrollable, webix.TreeDataLoader, webix.ui.proto, webix.TreeRenderStack, webix.CopyPaste, webix.EventSystem); + +webix.TreeStateCheckbox = { + _init_render_tree_state: function(){ + if (this._branch_render_supported){ + var old_render = this.render; + this.render = function(id,data,mode){ + var updated = old_render.apply(this,arguments); + + if(this._settings.threeState && updated && data != "checkbox") + this._setThirdState.apply(this,arguments); + }; + this._init_render_tree_state=function(){}; + } + }, + threeState_setter:function(value){ + if (value) + this._init_render_tree_state(); + return value; + }, + _setThirdState:function(id){ + var i,leaves,parents,checkedParents,tree; + parents = []; + tree = this; + + /*if item was removed*/ + if(id&&!tree.data.pull[id]){ + id = 0; + } + /*sets checkbox states*/ + /*if branch or full reloading*/ + if(!id||tree.data.pull[id].$count){ + leaves = this._getAllLeaves(id); + leaves.sort(function(a,b){ + return tree.data.pull[b].$level - tree.data.pull[a].$level; + }); + for(i=0;i < leaves.length;i++){ + if(!i||tree.data.pull[leaves[i]].$parent!=tree.data.pull[leaves[i-1]].$parent) + parents = parents.concat(tree._setParentThirdState(leaves[i])); + } + } + else{ + /*an item is a leaf */ + parents = parents.concat(tree._setParentThirdState(id)); + } + + checkedParents = {}; + for(i=0;i0||unsureCount>0){ + indeterminate = true; + } + + + //we need to reset indeterminate in any case :( + if (indeterminate || indeterminate != item.indeterminate) + needrender = true; + item.indeterminate = indeterminate; + if (item.checked != checked) + needrender = true; + item.checked = checked; + + if (needrender){ + result.push(parentId); + parentId = this.getParentId(parentId); + } else + parentId = 0; + + + + } + return result; + }, + /*get all checked items in tree*/ + getChecked:function(){ + var result=[]; + var tree = this; + this.data.eachSubItem(0,function(obj){ + if (tree.isChecked(obj.id)) + result.push(obj.id); + }); + return result; + }, + _tree_check_uncheck_3:function(id, mode){ + var item = this.getItem(id); + if(item){ + if (mode === "") + mode = !item.checked; + if(item.checked != mode || item.indeterminate){ + item.checked = mode; + this._correctThreeState(id); + var parents = this._setParentThirdState(id); + if (this._branch_render_supported && parents.length < 5){ + for (var i=0; i
    "; + } + return html; + }, + _icon_src:function(obj, common, level){ + var lines = common._tree_branch_render_state; + var tree = webix.TreeRenderStack._obj; + if (lines === 0 && tree){ + //we are in standalone rendering + //need to reconstruct rendering state + var lines_level = obj.$level; + var branch_id = obj.id; + + lines = []; + while (lines_level){ + var parent_id = tree.getParentId(branch_id); + var pbranch = tree.data.branch[parent_id]; + if (pbranch[pbranch.length-1] == branch_id) + lines[lines_level] = true; + + branch_id = parent_id; + lines_level--; + } + + //store for next round + common._tree_branch_render_state = lines; + } + if (!lines) + return 0; + //need to be replaced with image urls + if (level == obj.$level){ + var mode = 3; //3-way line + if (!obj.$parent){ //top level + if (obj.$index === 0) + mode = 4; //firts top item + } + if (lines[obj.$level]) + mode = 2; + + if (obj.$count){ + if (obj.open) + return "minus"+mode; + else + return "plus"+mode; + } else + return "line"+mode; + } else { + if (!lines[level]) + return "line1"; + return "blank"; + } + } +}); + + + + + + + + + +/* + UI: navigation control +*/ +webix.NavigationButtons = { + _renderPanel:function(){ + webix.html.remove(this._navPanel); + + + this._navPanel = webix.html.create("DIV",{ + "class":"webix_nav_panel "+"webix_nav_panel_"+this._settings.navigation.type, + "style": "z-index:"+webix.ui.zIndex()+";" + },""); + + this._viewobj.appendChild(this._navPanel); + + + this._renderNavItems(); + this._renderNavButtons(); + this._setLinkEventHandler(); + }, + _setLinkEventHandler: function(){ + var h = []; + if(this._navPanel) + h[0] = webix.event(this._navPanel,"click", webix.bind(function(e){ + var elem = (e.srcElement || e.target); + var found = false; + while(elem != this._navPanel && !found){ + var bindId = elem.getAttribute(this._linkAttr); + if(bindId){ + found = true; + this._showPanelBind(bindId); + } + elem = elem.parentNode; + } + },this)); + if(this._prevNavButton) + h[1] = webix.event(this._prevNavButton,"click", webix.bind(function(e){ + this._showNavItem(-1); + },this)); + if(this._nextNavButton) + h[1] = webix.event(this._nextNavButton,"click", webix.bind(function(e){ + this._showNavItem(1); + },this)); + this.attachEvent("onDestruct", function(){ + for(var i=0;i< h.length; i++){ + this.detachEvent(h[i]); + } + h = null; + }); + }, + _showNavItem: function(inc){ + if(this._cells){ + var index = this._active_cell + inc; + if(index >= this._cells.length || index < 0){ + index = (index < 0?this._cells.length-1:0); + } + this.setActiveIndex(index); + } + }, + _showPanelBind: function(id){ + if(this._cells) + webix.$$(id).show(); + }, + _renderNavItems:function(){ + var item, config; + config = this._settings.navigation; + if(config.items){ + this._linkAttr = config.linkAttr || "bind_id"; + + if(!this._navPanel) + this._renderPanel(); + else + this._clearPanel(); + + var data = (this._cells?this._cells:this.data.order); + if(data.length>1){ + for (var i=0; i < data.length; i++){ + + item = webix.html.create("DIV",{ + "class":"webix_nav_item webix_nav_"+(i==this._active_cell?"active":"inactive") + },"
    "); + var id = this._cells?this._cells[i]._settings.id:data[i]; + if(id) + item.setAttribute(this._linkAttr, id); + this._navPanel.appendChild(item); + } + + + } + } + }, + _clearPanel:function(){ + if (this._navPanel){ + var coll = this._navPanel.childNodes; + for (var i = coll.length - 1; i >= 0; i--) + webix.html.remove(coll[i]); + } + }, + _renderNavButtons: function(){ + var item, config; + config = this._settings.navigation; + if(config.buttons){ + + if(this._prevNavButton) + webix.html.remove(this._prevNavButton); + if(this._prevNavButton) + webix.html.remove(this._nextNavButton); + + var zIndex = webix.ui.zIndex(); + this._prevNavButton = webix.html.create( + "DIV", + { + "class":"webix_nav_button_"+config.type+" webix_nav_button_prev ", + "style":"z-index:"+zIndex+";" + }, + "
    " + ); + this._viewobj.appendChild(this._prevNavButton); + + this._nextNavButton = webix.html.create( + "DIV", + { + "class":"webix_nav_button_"+config.type+" webix_nav_button_next ", + "style":"z-index:"+zIndex+";" + }, + "
    " + ); + this._viewobj.appendChild(this._nextNavButton); + } + } +}; + + + + + + + + +webix.protoUI({ + name:"list", + _listClassName : "webix_list", + $init:function(config){ + webix.html.addCss(this._viewobj, this._listClassName + (((config.layout||this.defaults.layout) == "x")?"-x":"") ); + this.data.provideApi(this,true); + + this._auto_resize = webix.bind(this._auto_resize, this); + this.data.attachEvent("onStoreLoad", this._auto_resize); + this.data.attachEvent("onStoreUpdated", this._auto_resize); + this.data.attachEvent("onSyncApply", this._auto_resize); + this.attachEvent("onAfterRender", this._correct_width_scroll); + }, + $dragHTML:function(obj, e){ + if (this._settings.layout == "y" && this.type.width == "auto"){ + this.type.width = this._content_width; + var node = this._toHTML(obj); + this.type.width = "auto"; + return node; + } + return this._toHTML(obj); + }, + defaults:{ + select:false, + scroll:true, + layout:"y" + }, + _id:"webix_l_id", + on_click:{ + webix_list_item:function(e,id){ + if (this._settings.select){ + this._no_animation = true; + if (this._settings.select=="multiselect" || this._settings.multiselect) + this.select(id, false, (e.ctrlKey || e.metaKey || (this._settings.multiselect == "touch")), e.shiftKey); //multiselection + else + this.select(id); + this._no_animation = false; + } + } + }, + on_dblclick:{ + }, + getVisibleCount:function(){ + return Math.floor(this._content_height / this.type.height); + }, + _auto_resize:function(){ + if (this._settings.autoheight || this._settings.autowidth) + this.resize(); + }, + _auto_height_calc:function(count){ + var value = this.data.$pagesize||this.count(); + + this._onoff_scroll(count && count < value); + if (this._settings.autoheight && value < (count||Infinity) ) + count = value; + return Math.max(this.type.height * count,this._settings.minHeight||0); + }, + _auto_width_calc:function(count){ + var value = this.data.$pagesize||this.count(); + + this._onoff_scroll(count && count < value); + if (this._settings.autowidth && value < (count||Infinity) ) + count = value; + + return (this.type.width * count); + }, + _correct_width_scroll:function(){ + if (this._settings.layout == "x") + this._dataobj.style.width = (this.type.width != "auto") ? (this.type.width * this.count() + "px") : "auto"; + }, + $getSize:function(dx,dy){ + if (this._settings.layout == "y"){ + if (this.type.width!="auto") + this._settings.width = this.type.width + (this._scroll_y?webix.ui.scrollSize:0); + if (this._settings.yCount || this._settings.autoheight) + this._settings.height = this._auto_height_calc(this._settings.yCount)||1; + } + else { + if (this.type.height!="auto") + this._settings.height = this.type.height + (this._scroll_x?webix.ui.scrollSize:0); + if (this._settings.xCount || this._settings.autowidth) + this._settings.width = this._auto_width_calc(this._settings.xCount)||1; + } + return webix.ui.view.prototype.$getSize.call(this, dx, dy); + }, + $setSize:function(){ + webix.ui.view.prototype.$setSize.apply(this, arguments); + }, + type:{ + css:"", + widthSize:function(obj, common){ + return common.width+(common.width>-1?"px":""); + }, + heightSize:function(obj, common){ + return common.height+(common.height>-1?"px":""); + }, + classname:function(obj, common, marks){ + var css = "webix_list_item"; + if (obj.$css){ + if (typeof obj.$css == "object") + obj.$css = webix.html.createCss(obj.$css); + css += " "+obj.$css; + } + if (marks && marks.$css) + css += " "+marks.$css; + + return css; + }, + template:function(obj){ + return (obj.icon?(" "):"") + obj.value + (obj.badge?("
    "+obj.badge+"
    "):""); + }, + width:"auto", + templateStart:webix.template('
    '), + templateEnd:webix.template("
    ") + }, + $skin:function(){ + this.type.height = webix.skin.$active.listItemHeight; + } +}, webix.KeysNavigation, webix.DataMove, webix.DragItem, webix.MouseEvents, webix.SelectionModel, webix.Scrollable, webix.ui.proto, webix.CopyPaste); + +webix.protoUI({ + name:"grouplist", + defaults:{ + animate:{ + } + }, + _listClassName : "webix_grouplist", + $init:function(){ + webix.extend(this.data, webix.TreeStore, true); + //needed for getRange + this.data.count = function(){ return this.order.length; }; + this.data.provideApi(this,true); + this.data.attachEvent("onClearAll", webix.bind(this._onClear, this)); + this._onClear(); + }, + _onClear:function(){ + this._nested_cursor = []; + this._nested_chain = []; + }, + $setSize:function(){ + if (webix.ui.view.prototype.$setSize.apply(this, arguments)){ + //critical for animations in group list + this._dataobj.style.width = this._content_width; + } + }, + on_click:{ + webix_list_item:function(e,id){ + if (this._in_animation) { + return false; + } + + for (var i=0; i < this._nested_chain.length; i++){ + if (this._nested_chain[i] == id){ //one level up + for (var j=i; j < this._nested_chain.length; j++) { + this.data.getItem(this._nested_chain[j]).$template=""; + } + if (!i){ //top level + this._nested_cursor = this.data.branch[0]; + this._nested_chain = []; + } else { + this._nested_cursor= this.data.branch[this._nested_chain[i-1]]; + this._nested_chain.splice(i); + } + this._is_level_down = false; + return this.render(); + } + } + + var obj = this.getItem(id); + if (obj.$count){ //one level down + this._is_level_down = true; + this._nested_chain.push(id); + obj.$template = "Back"; + this._nested_cursor = this.data.branch[obj.id]; + return this.render(); + } else { + if (this._settings.select){ + this._no_animation = true; + if (this._settings.select=="multiselect" || this._settings.multiselect) + this.select(id, false, ((this._settings.multiselect == "touch") || e.ctrlKey || e.metaKey), e.shiftKey); //multiselection + else + this.select(id); + this._no_animation = false; + } + } + } + }, + getOpenState:function(){ + return {parents:this._nested_chain,branch:this._nested_cursor}; + }, + render:function(id,data,type,after){ + var i, lastChain; + + //start filtering processing=> + this._nested_chain = webix.copy(this._nested_chain); + this._nested_cursor = webix.copy(this._nested_cursor); + + if(this._nested_chain.length){ + for(i = 0;i'), + templateBack:webix.template("#value#"), + templateItem:webix.template("#value#"), + templateGroup:webix.template("#value#"), + templateEnd:function(obj, common){ + var html = ''; + if(obj.$count) html += "
    "; + html += ""; + return html; + } + }, + showItem:function(id){ + var obj, parent; + if(id){ + obj = this.getItem(id); + parent = obj.$parent; + + if (obj.$count) + parent = obj.id; + } + this._nested_cursor = this.data.branch[parent||0]; + this._nested_chain=[]; + + //build _nested_chain + while(parent){ + this.getItem(parent).$template = "Back"; + this._nested_chain.unshift(parent); + parent = this.getItem(parent).$parent; + } + + //render + this._no_animation = true; + this.render(); + this._no_animation = false; + + //scroll if necessary + webix.RenderStack.showItem.call(this,id); + } +}, webix.Group, webix.ui.list ); +webix.type(webix.ui.grouplist,{}); + + +webix.protoUI({ + name:"unitlist", + _id:"webix_item_id", + uniteBy_setter: webix.template, + sort_setter: function(config){ + if(typeof(config)!="object") + config={}; + this._mergeSettings(config,{ + dir:"asc", + as:"string" + }); + return config; + }, + render:function(id,data,type,after){ + var config = this._settings; + if (!this.isVisible(config.id)) + return; + if (webix.debug_render) + webix.log("Render: "+this.name+"@"+config.id); + if(!config.uniteBy){ + if (webix.debug_render){ + webix.log("uniteBy is undefined"); + } + return false; + } + if (id){ + var cont = this.getItemNode(id); //get html element of updated item + if(cont&&type=="update"&&(this._settings.uniteBy.call(this,data)==this.getItem(id).$unitValue)){ + var t = this._htmlmap[id] = this._toHTMLObject(data); + webix.html.insertBefore(t, cont); + webix.html.remove(cont); + return; + } + } + //full reset + if (this.callEvent("onBeforeRender",[this.data])){ + this.units = null; + this._setUnits(); + if(this.units){ + this._dataobj.innerHTML = this._getUnitRange().map(this._toHTML, this).join(""); + this._htmlmap = null; + } + this.callEvent("onAfterRender",[]); + } + }, + getUnits:function(){ + var result = []; + if(this.units){ + for(var b in this.units){ + result.push(b); + } + } + return result; + }, + getUnitList:function(id){ + return (this.units?this.units[id]:null); + }, + _toHTML:function(obj){ + //check if related template exist + var mark = this.data._marks[obj.id]; + webix.assert((!obj.$template || this.type["template"+obj.$template]),"RenderStack :: Unknown template: "+obj.$template); + this.callEvent("onItemRender",[obj]); + if(obj.$unit){ + return this.type.templateStartHeader(obj,this.type)+this.type.templateHeader.call(this,obj.$unit)+this.type.templateEnd(obj, this.type); + } + return this.type.templateStart(obj,this.type,mark)+(obj.$template?this.type["template"+obj.$template]:this.type.template)(obj,this.type)+this.type.templateEnd(obj, this.type); + }, + _getUnitRange:function(){ + var data,i,u,unit; + data = []; + var min = this.data.$min || 0; + var max = this.data.$max || Infinity; + var count = 0; + + for(u in this.units){ + data.push({$unit:u}); + unit = this.units[u]; + for(i=0;i < unit.length;i++){ + if (count == min) data = [{$unit:u}]; + data.push(this.getItem(unit[i])); + if (count == max) return webix.toArray(data); + count++; + } + } + + return webix.toArray(data); + }, + _setUnits: function(){ + var list = this; + this.units = {}; + this.data.each(function(obj){ + var result = list._settings.uniteBy.call(this,obj); + obj.$unitValue = result; + if(!list.units[result]) + list.units[result] = []; + list.units[result].push(obj.id); + }); + }, + type:{ + headerHeight: 20, + templateHeader: function(value){ + return ""+value+""; + }, + templateStart:function(obj,type,marks){ + if(obj.$unit) + return type.templateStartHeader.apply(this,arguments); + var className = "webix_list_item webix_list_"+(type.css)+"_item"+((marks&&marks.webix_selected)?" webix_selected":"")+type.classname(obj,type,marks); + var style = "width:"+type.width+"px; height:"+type.height+"px; padding:"+type.padding+"px; margin:"+type.margin+"px; overflow:hidden;"+(type.layout&&type.layout=="x"?"float:left;":""); + return '
    '; + }, + templateStartHeader:function(obj,type){ + var className = "webix_unit_header webix_unit_"+(type.css)+"_header"+(obj.$selected?"_selected":""); + var style = "width:"+type.width+"px; height:"+type.headerHeight+"px; overflow:hidden;"; + return '
    '; + } + }, + $skin:function(){ + this.type.headerHeight = webix.skin.$active.unitHeaderHeight||20; + } +}, webix.ui.list); + +/* + UI:DataView +*/ + + + +/* + Behavior:EditAbility - enables item operation for the items + + @export + edit + stopEdit +*/ + + + +webix.EditAbility={ + defaults:{ + editaction:"click" + }, + $init:function(config){ + this._editors = {}; + this._in_edit_mode = 0; + this._edit_open_time = 0; + this._contentobj.style.position = "relative"; + if (config) + config.onDblClick = config.onDblClick || {}; + + this.attachEvent("onAfterRender", this._refocus_inline_editor); + + //when we call webix.extend the editable prop can be already set + if (this._settings.editable) + this._init_edit_events_once(); + }, + _refocus_try:function(newnode){ + try{ //Chrome throws an error if selectionStart is not accessible + if (typeof newnode.selectionStart == "number") { + newnode.selectionStart = newnode.selectionEnd = newnode.value.length; + } else if (typeof newnode.createTextRange != "undefined") { + var range = newnode.createTextRange(); + range.collapse(false); + range.select(); + } + } catch(e){} + }, + _refocus_inline_editor:function(){ + var editor = this.getEditor(); + if (editor && editor.$inline && !editor.getPopup){ + var newnode = this._locateInput(editor); + if (newnode && newnode != editor.node){ + var text = editor.node.value; + editor.node = newnode; + newnode.value = text; + newnode.focus(); + + this._refocus_try(newnode); + } else + this.editStop(); + } + }, + editable_setter:function(value){ + if (value) + this._init_edit_events_once(); + return value; + }, + _init_edit_events_once:function(){ + //will close editor on any click outside + webix.attachEvent("onEditEnd", webix.bind(function(){ + if (this._in_edit_mode) + this.editStop(); + }, this)); + webix.attachEvent("onClick", webix.bind(function(e){ + //but ignore click which opens editor + if (this._in_edit_mode && (new Date())-this._edit_open_time > 200){ + if (!this._last_editor || this._last_editor.popupType || !e || this._last_editor.node != e.target) + this.editStop(); + } + }, this)); + + //property sheet has simple data object, without events + if (this.data.attachEvent) + this.data.attachEvent("onIdChange", webix.bind(function(oldid, newid){ + this._changeEditorId(oldid, newid); + }, this)); + + //when clicking on row - will start editor + this.attachEvent("onItemClick", function(id){ + if (this._settings.editable && this._settings.editaction == "click") + this.edit(id); + }); + this.attachEvent("onItemDblClick", function(id){ + if (this._settings.editable && this._settings.editaction == "dblclick") + this.edit(id); + }); + //each time when we clicking on input, reset timer to prevent self-closing + this._reset_active_editor = webix.bind(function(){ + this._edit_open_time = new Date(); + },this); + + this._init_edit_events_once = function(){}; + + if (this._component_specific_edit_init) + this._component_specific_edit_init(); + }, + _handle_live_edits:function(){ + webix.delay(function(){ + var editor = this.getEditor(); + if (editor && editor.config.liveEdit){ + var state = { value:editor.getValue(), old: editor.value }; + if (state.value == state.old) return; + + editor.value = state.value; + this._set_new_value(editor, state.value); + this.callEvent("onLiveEdit", [state, editor]); + } + }, this); + }, + _show_editor_form:function(id){ + var form = this._settings.form; + if (typeof form != "string") + this._settings.form = form = webix.ui(form).config.id; + + var form = webix.$$(form); + var realform = form.setValues?form:form.getChildViews()[0]; + + + realform.setValues(this.getItem(id.row || id)); + form.config.master = this.config.id; + form.show( this.getItemNode(id) ); + + var first = realform.getChildViews()[0]; + if (first.focus()) + first.focus(); + }, + edit:function(id, preserve, show){ + if (!this.callEvent("onBeforeEditStart", [id])) return; + if (this._settings.form) + return this._show_editor_form(id); + + var editor = this._get_editor_type(id); + if (editor){ + if (this.getEditor(id)) return; + if (!preserve) this.editStop(); + //save time of creation to prevent instant closing from the same click + this._edit_open_time = new Date(); + //render html input + webix.assert(webix.editors[editor], "Invalid editor type: "+editor); + var type = webix.extend({}, webix.editors[editor]); + + var node = this._init_editor(id, type, show); + if (type.config.liveEdit) + this._live_edits_handler = this.attachEvent("onKeyPress", this._handle_live_edits); + + var area = type.getPopup?type.getPopup(node)._viewobj:node; + + if (area) + webix.event(area, "click", this._reset_active_editor); + if (node) + webix.event(node, "change", this._on_editor_change, { view:this, id:id }); + if (show !== false) + type.focus(); + + webix.UIManager.setFocus(this, true); + this.callEvent("onAfterEditStart", [id]); + return type; + } + return null; + }, + getEditor:function(id){ + if (!id) + return this._last_editor; + + return this._editors[id]; + }, + _changeEditorId:function(oldid, newid) { + var editor = this._editors[oldid]; + if (editor){ + this._editors[newid] = editor; + editor.id = newid; + delete this._editors[oldid]; + } + }, + _on_editor_change:function(e){ + if (this.view.hasEvent("onEditorChange")) + this.view.callEvent("onEditorChange", [this.id, this.view.getEditorValue(this.id) ]); + }, + _get_edit_config:function(id){ + return this._settings; + }, + _init_editor:function(id, type, show){ + var config = type.config = this._get_edit_config(id); + var node = type.render(); + + if (type.$inline) + node = this._locateInput(id); + type.node = node; + + var item = this.getItem(id); + //value can be configured by editValue option + var value = item[this._settings.editValue||"value"]; + //if property was not defined - use empty value + if (webix.isUndefined(value)) + value = ""; + + type.setValue(value, item); + type.value = value; + + this._addEditor(id, type); + + //show it over cell + if (show !== false) + this.showItem(id); + if (!type.$inline) + this._sizeToCell(id, node, true); + + if (type.afterRender) + type.afterRender(); + + return node; + }, + _locate_cell:function(id){ + return this.getItemNode(id); + }, + _locateInput:function(id){ + var cell = this._locate_cell(id); + if (cell) + cell = cell.getElementsByTagName("input")[0] || cell; + + return cell; + }, + _get_editor_type:function(id){ + return this._settings.editor; + }, + _addEditor:function(id, type){ + type.id = id; + this._editors[id]= this._last_editor = type; + this._in_edit_mode++; + }, + _removeEditor:function(editor){ + if (this._last_editor == editor) + this._last_editor = 0; + + if (editor.destroy) + editor.destroy(); + + delete editor.popup; + delete editor.node; + + delete this._editors[editor.id]; + this._in_edit_mode--; + }, + focusEditor:function(id){ + var editor = this.getEditor.apply(this, arguments); + if (editor && editor.focus) + editor.focus(); + }, + editCancel:function(){ + this.editStop(null, null, true); + }, + editStop:function(id){ + if (this._edit_stop) return; + this._edit_stop = 1; + + + var cancel = arguments[2]; + var result = 1; + if (!id){ + this._for_each_editor(function(editor){ + result = result * this._editStop(editor, cancel); + }); + } else + result = this._editStop(this._editors[id], cancel); + + this._edit_stop = 0; + return result; + }, + _cellPosition:function(id){ + var html = this.getItemNode(id); + return { + left:html.offsetLeft, + top:html.offsetTop, + height:html.offsetHeight, + width:html.offsetWidth, + parent:this._contentobj + }; + }, + _sizeToCell:function(id, node, inline){ + //fake inputs + if (!node.style) return; + + var pos = this._cellPosition(id); + + node.style.top = pos.top + "px"; + node.style.left = pos.left + "px"; + + node.style.width = pos.width-1+"px"; + node.style.height = pos.height-1+"px"; + + node.top = pos.top; //later will be used during y-scrolling + + if (inline) pos.parent.appendChild(node); + }, + _for_each_editor:function(handler){ + for (var editor in this._editors) + handler.call(this, this._editors[editor]); + }, + _editStop:function(editor, ignore){ + if (!editor) return; + var state = { + value : editor.getValue(), + old : editor.value + }; + if (this.callEvent("onBeforeEditStop", [state, editor, ignore])){ + if (!ignore){ + if (state.value != state.old || editor.config.liveEdit) + this.updateItem(this._set_new_value(editor, state.value)); + } + if (editor.$inline) + editor.node = null; + else + webix.html.remove(editor.node); + + var popup = editor.config.suggest; + if (popup && typeof popup == "string") + webix.$$(popup).hide(); + + this._removeEditor(editor); + if (this._live_edits_handler) + this.detachEvent(this._live_edits_handler); + + this.callEvent("onAfterEditStop", [state, editor, ignore]); + return 1; + } + return 0; + }, + validateEditor:function(id){ + var result = true; + if (this._settings.rules){ + var editor = this.getEditor(id); + var key = editor.column||this._settings.editValue||"value"; + var rule = this._settings.rules[key]; + var all = this._settings.rules.$all; + + if (rule || all){ + var obj = this.data.getItem(editor.row||editor.id); + var value = editor.getValue(); + var input = editor.getInputNode(); + + if (rule) + result = rule.call(this, value, obj, key); + if (all) + result = all.call(this, value, obj, key) && result; + + if (result) + webix.html.removeCss(input, "webix_invalid"); + else + webix.html.addCss(input, "webix_invalid"); + + webix.callEvent("onLiveValidation", [editor, result, obj, value]); + } + } + return result; + }, + getEditorValue:function(id){ + var editor; + if (arguments.length === 0) + editor = this._last_editor; + else + editor = this.getEditor(id); + + if (editor) + return editor.getValue(); + }, + getEditState:function(){ + return this._last_editor || false; + }, + editNext:function(next, from){ + next = next !== false; //true by default + if (this._in_edit_mode == 1 || from){ + //only if one editor is active + var editor_next = this._find_cell_next((this._last_editor || from), function(id){ + if (this._get_editor_type(id)) + return true; + return false; + }, next); + + if (this.editStop()){ //if we was able to close previous editor + if (editor_next){ //and there is a new target + this.edit(editor_next); //init new editor + this._after_edit_next(editor_next); + } + return false; + } + } + }, + //stab, used in datatable + _after_edit_next:function(){}, + _find_cell_next:function(start, check, direction){ + var row = this.getIndexById(start.id); + var order = this.data.order; + + if (direction){ + for (var i=row+1; i=0; i--){ + if (check.call(this, order[i])) + return order[i]; + } + } + + return null; + }, + _set_new_value:function(editor, new_value){ + this.getItem(editor.id)[this._settings.editValue||"value"] = new_value; + return editor.id; + } +}; + + +(function(){ + +function init_suggest(editor, input){ + var suggest = editor.config.suggest; + if (suggest){ + var box = editor.config.suggest = create_suggest(suggest); + var boxobj = webix.$$(box); + if (boxobj && input) + boxobj.linkInput(input); + } +} + +function create_suggest(config){ + if (typeof config == "string") return config; + if (config.linkInput) return config._settings.id; + + + if (typeof config == "object"){ + if (webix.isArray(config)) + config = { data: config }; + config.view = config.view || "suggest"; + } else if (config === true) + config = { view:"suggest" }; + + var obj = webix.ui(config); + return obj.config.id; +} + + +/* + this.node - html node, available after render call + this.config - editor config + this.value - original value + this.popup - id of popup +*/ +webix.editors = { + "text":{ + focus:function(){ + this.getInputNode(this.node).focus(); + this.getInputNode(this.node).select(); + }, + getValue:function(){ + return this.getInputNode(this.node).value; + }, + setValue:function(value){ + var input = this.getInputNode(this.node); + input.value = value; + + init_suggest(this, input); + }, + getInputNode:function(){ + return this.node.firstChild; + }, + render:function(){ + return webix.html.create("div", { + "class":"webix_dt_editor" + }, ""); + } + }, + "inline-checkbox":{ + render:function(){ return {}; }, + getValue:function(){ + return this.node.checked; + }, + setValue:function(){}, + focus:function(){ + this.node.focus(); + }, + getInputNode:function(){}, + $inline:true + }, + "inline-text":{ + render:function(){ return {}; }, + getValue:function(){ + return this.node.value; + }, + setValue:function(){}, + focus:function(){ + this.node.select(); + this.node.focus(); + }, + getInputNode:function(){}, + $inline:true + }, + "checkbox":{ + focus:function(){ + this.getInputNode().focus(); + }, + getValue:function(){ + return this.getInputNode().checked; + }, + setValue:function(value){ + this.getInputNode().checked = !!value; + }, + getInputNode:function(){ + return this.node.firstChild.firstChild; + }, + render:function(){ + return webix.html.create("div", { + "class":"webix_dt_editor" + }, "
    "); + } + }, + "select":{ + focus:function(){ + this.getInputNode().focus(); + }, + getValue:function(){ + return this.getInputNode().value; + }, + setValue:function(value){ + this.getInputNode().value = value; + }, + getInputNode:function(){ + return this.node.firstChild; + }, + render:function(){ + var html = ""; + var options = this.config.options || this.config.collection; + webix.assert(options,"options not defined for select editor"); + + if (options.data && options.data.each) + options.data.each(function(obj){ + html +=""; + }); + else { + if (webix.isArray(options)){ + for (var i=0; i"+options[i]+""; + } else for (var key in options){ + html +=""; + } + } + + return webix.html.create("div", { + "class":"webix_dt_editor" + }, ""); + } + }, + popup:{ + focus:function(){ + this.getInputNode().focus(); + }, + destroy:function(){ + this.getPopup().hide(); + }, + getValue:function(){ + return this.getInputNode().getValue()||""; + }, + setValue:function(value){ + this.getPopup().show(this.node); + this.getInputNode().setValue(value); + }, + getInputNode:function(){ + return this.getPopup().getChildViews()[0]; + }, + getPopup:function(){ + if (!this.config.popup) + this.config.popup = this.createPopup(); + + return webix.$$(this.config.popup); + }, + createPopup:function(){ + var popup = this.config.popup || this.config.suggest; + if (popup){ + var pobj; + if (typeof popup == "object" && !popup.name){ + popup.view = popup.view || "suggest"; + pobj = webix.ui(popup); + } else + pobj = webix.$$(popup); + + if (pobj.linkInput) + pobj.linkInput(document.body); + return pobj; + } + + var type = webix.editors.$popup[this.popupType]; + if (typeof type != "string"){ + type = webix.editors.$popup[this.popupType] = webix.ui(type); + this.popupInit(type); + } + + return type._settings.id; + }, + + popupInit:function(popup){ + + }, + popupType:"text", + render :function(){ return {}; }, + $inline:true + } +}; + +webix.editors.color = webix.extend({ + focus :function(){}, + popupType:"color", + popupInit:function(popup){ + popup.getChildViews()[0].attachEvent("onSelect", function(value){ + webix.callEvent("onEditEnd",[value]); + }); + } +}, webix.editors.popup); + +webix.editors.date = webix.extend({ + focus :function(){}, + popupType:"date", + setValue:function(value){ + this._is_string = this.config.stringResult || (value && typeof value == "string"); + webix.editors.popup.setValue.call(this, value); + }, + getValue:function(){ + return this.getInputNode().getValue(this._is_string?webix.i18n.parseFormatStr:"")||""; + }, + popupInit:function(popup){ + popup.getChildViews()[0].attachEvent("onDateSelect", function(value){ + webix.callEvent("onEditEnd",[value]); + }); + } +}, webix.editors.popup); + +webix.editors.combo = webix.extend({ + _create_suggest:function(config){ + if(this.config.popup){ + return this.config.popup.config.id; + } + else if (config){ + return create_suggest(config); + } else + return this._shared_suggest(config); + }, + _shared_suggest:function(){ + var e = webix.editors.combo; + return (e._suggest = e._suggest || this._create_suggest(true)); + }, + render:function(){ + var node = webix.html.create("div", { + "class":"webix_dt_editor" + }, ""); + + //save suggest id for future reference + var suggest = this.config.suggest = this._create_suggest(this.config.suggest); + + if (suggest){ + webix.$$(suggest).linkInput(node.firstChild, true); + webix.event(node.firstChild, "click",webix.bind(this.showPopup, this)); + } + return node; + }, + getPopup:function(){ + return webix.$$(this.config.suggest); + }, + showPopup:function(){ + var popup = this.getPopup(); + var list = popup.getList(); + var input = this.getInputNode(); + var value = this.getValue(); + + popup.show(input); + if(value ){ + webix.assert(list.exists(value), "Option with ID "+value+" doesn't exist"); + if(list.exists(value)){ + list.select(value); + list.showItem(value); + } + }else{ + list.unselect(); + list.showItem(list.getFirstId()); + } + popup._last_input_target = input; + }, + afterRender:function(){ + this.showPopup(); + }, + setValue:function(value){ + this._initial_value = value; + if (this.config.suggest){ + var sobj = webix.$$(this.config.suggest); + var data = this.config.collection || this.config.options; + if (data) + sobj.getList().data.importData(data); + + this._initial_text = this.getInputNode(this.node).value = sobj.getItemText(value); + } + }, + getValue:function(){ + var value = this.getInputNode().value; + + if (this.config.suggest){ + if (value == this._initial_text) + return this._initial_value; + return webix.$$(this.config.suggest).getSuggestion(); + } else + return value; + } +}, webix.editors.text); + + +webix.editors.richselect = webix.extend({ + focus:function(){}, + getValue:function(){ + return this.getPopup().getValue(); + }, + setValue:function(value){ + var suggest = this.config.collection || this.config.options; + var list = this.getInputNode(); + if (suggest) + this.getPopup().getList().data.importData(suggest); + + this.getPopup().show(this.node); + this.getPopup().setValue(value); + }, + getInputNode:function(){ + return this.getPopup().getList(); + }, + popupInit:function(popup){ + popup.linkInput(document.body); + }, + popupType:"richselect" +}, webix.editors.popup); + +webix.editors.password = webix.extend({ + render:function(){ + return webix.html.create("div", { + "class":"webix_dt_editor" + }, ""); + } +}, webix.editors.text); + +webix.editors.$popup = { + text:{ + view:"popup", width:250, height:150, + body:{ view:"textarea" } + }, + color:{ + view:"popup", + body:{ view:"colorboard" } + }, + date:{ + view:"popup", width:250, height:250, padding:0, + body:{ view:"calendar", icons:true, borderless:true } + }, + richselect:{ + view:"suggest", + body:{ view:"list", select:true } + } +}; + +})(); + + + + +/* + Renders collection of items + Always shows y-scroll + Can be used with huge datasets + + @export + show + render +*/ + + + +webix.VirtualRenderStack={ + $init:function(){ + webix.assert(this.render,"VirtualRenderStack :: Object must use RenderStack first"); + + this._htmlmap={}; //init map of rendered elements + + //we need to repaint area each time when view resized or scrolling state is changed + webix.event(this._viewobj,"scroll",webix.bind(this._render_visible_rows,this)); + if(webix.env.touch){ + this.attachEvent("onAfterScroll", webix.bind(this._render_visible_rows,this)); + } + //here we store IDs of elemenst which doesn't loadede yet, but need to be rendered + this._unrendered_area=[]; + }, + //return html object by item's ID. Can return null for not-rendering element + getItemNode:function(search_id){ + //collection was filled in _render_visible_rows + return this._htmlmap[search_id]; + }, + //adjust scrolls to make item visible + showItem:function(id){ + var range = this._getVisibleRange(); + var ind = this.data.getIndexById(id); + //we can't use DOM method for not-rendered-yet items, so fallback to pure math + var dy = Math.floor(ind/range._dx)*range._y; + var state = this.getScrollState(); + if (dy= state.y + this._content_height) + this.scrollTo(0, dy); + }, + //repain self after changes in DOM + //for add, delete, move operations - render is delayed, to minify performance impact + render:function(id,data,type){ + if (!this.isVisible(this._settings.id) || this.$blockRender) + return; + + if (webix.debug_render) + webix.log("Render: "+this.name+"@"+this._settings.id); + + if (id){ + var cont = this.getItemNode(id); //old html element + switch(type){ + case "update": + if (!cont) return; + //replace old with new + var t = this._htmlmap[id] = this._toHTMLObject(data); + webix.html.insertBefore(t, cont); + webix.html.remove(cont); + break; + default: // "move", "add", "delete" + /* + for all above operations, full repainting is necessary + but from practical point of view, we need only one repainting per thread + code below initiates double-thread-rendering trick + */ + this._render_delayed(); + break; + } + } else { + //full repainting + if (this.callEvent("onBeforeRender",[this.data])){ + this._htmlmap = {}; //nulify links to already rendered elements + this._render_visible_rows(null, true); + // clear delayed-rendering, because we already have repaint view + this._wait_for_render = false; + this.callEvent("onAfterRender",[]); + } + } + }, + //implement double-thread-rendering pattern + _render_delayed:function(){ + //this flag can be reset from outside, to prevent actual rendering + if (this._wait_for_render) return; + this._wait_for_render = true; + + window.setTimeout(webix.bind(function(){ + this.render(); + },this),1); + }, + //create empty placeholders, which will take space before rendering + _create_placeholder:function(height){ + var node = document.createElement("DIV"); + node.style.cssText = "height:"+height+"px; width:100%; overflow:hidden;"; + return node; + }, + /* + Methods get coordinatest of visible area and checks that all related items are rendered + If, during rendering, some not-loaded items was detected - extra data loading is initiated. + reset - flag, which forces clearing of previously rendered elements + */ + _render_visible_rows:function(e,reset){ + this._unrendered_area=[]; //clear results of previous calls + + var viewport = this._getVisibleRange(); //details of visible view + + if (!this._dataobj.firstChild || reset){ //create initial placeholder - for all view space + this._dataobj.innerHTML=""; + this._dataobj.appendChild(this._create_placeholder(viewport._max)); + //register placeholder in collection + this._htmlrows = [this._dataobj.firstChild]; + } + + /* + virtual rendering breaks all view on rows, because we know widht of item + we can calculate how much items can be placed on single row, and knowledge + of that, allows to calculate count of such rows + + each time after scrolling, code iterate through visible rows and render items + in them, if they are not rendered yet + + both rendered rows and placeholders are registered in _htmlrows collection + */ + + //position of first visible row + var t = viewport._from; + + while(t<=viewport._height){ //loop for all visible rows + //skip already rendered rows + while(this._htmlrows[t] && this._htmlrows[t]._filled && t<=viewport._height){ + t++; + } + //go out if all is rendered + if (t>viewport._height) break; + + //locate nearest placeholder + var holder = t; + while (!this._htmlrows[holder]) holder--; + var holder_row = this._htmlrows[holder]; + + //render elements in the row + var base = t*viewport._dx+(this.data.$min||0); //index of rendered item + if (base > (this.data.$max||Infinity)) break; //check that row is in virtual bounds, defined by paging + var nextpoint = Math.min(base+viewport._dx-1,(this.data.$max||Infinity)); + var node = this._create_placeholder(viewport._y); + //all items in rendered row + var range = this.data.getIndexRange(base, nextpoint); + if (!range.length) break; + + var loading = { $template:"Loading" }; + for (var i=0; i0){ + holder_row.style.height = delta2+"px"; + this._htmlrows[t+1] = holder_row; + } else { + if (delta<0) + webix.html.remove(holder_row); + else + holder_row.style.height = delta+"px"; + if (delta2>0){ + var new_space = this._htmlrows[t+1] = this._create_placeholder(delta2); + webix.html.insertBefore(new_space,node.nextSibling,this._dataobj); + } + } + + + t++; + } + + //when all done, check for non-loaded items + if (this._unrendered_area.length){ + //we have some data to load + //detect borders + var from = this._unrendered_area[0]; + var to = this._unrendered_area.pop()+1; + if (to>from){ + //initiate data loading + var count = to - from; + if (this._maybe_loading_already(count, from)) return; + + count = Math.max(count, (this._settings.datafetch||this._settings.loadahead||0)); + this.loadNext(count, from); + } + } + }, + //calculates visible view + _getVisibleRange:function(){ + var state = this.getScrollState(); + var top = state.y; + var width = this._content_width; + var height = this._content_height; + + //size of single item + var t = this.type; + + var dx = Math.floor(width/t.width)||1; //at least single item per row + + var min = Math.floor(top/t.height); //index of first visible row + var dy = Math.ceil((height+top)/t.height)-1; //index of last visible row + //total count of items, paging can affect this math + var count = this.data.$max?(this.data.$max-this.data.$min):this.data.count(); + var max = Math.ceil(count/dx)*t.height; //size of view in rows + + return { _from:min, _height:dy, _top:top, _max:max, _y:t.height, _dx:dx}; + }, + _cellPosition:function(id){ + var html = this.getItemNode(id); + if (!html){ + this.showItem(id); + this._render_visible_rows(); + html = this.getItemNode(id); + } + return { + left:html.offsetLeft, + top:html.offsetTop, + height:html.offsetHeight, + width:html.offsetWidth, + parent:this._contentobj + }; + } +}; + + +webix.protoUI({ + name:"dataview", + $init:function(config){ + if (config.sizeToContent) + //method need to be called before data-loaders + //so we are using unshift to place it at start + this.$ready.unshift(this._after_init_call); + var prerender = config.prerender || this.defaults.prerender; + if (prerender === false || (prerender !== true && config.height !== "auto" && !config.autoheight)) + webix.extend(this, webix.VirtualRenderStack, true); + if (config.autoheight) + config.scroll = false; + + this._contentobj.className+=" webix_dataview"; + }, + _after_init_call:function(){ + var test = webix.html.create("DIV",0,this.type.template({})); + test.style.position="absolute"; + document.body.appendChild(test); + this.type.width = test.offsetWidth; + this.type.height = test.offsetHeight; + + webix.html.remove(test); + }, + + defaults:{ + scroll:true, + datafetch:50 + }, + _id:"webix_f_id", + on_click:{ + webix_dataview_item:function(e,id){ + if (this._settings.select){ + if (this._settings.select=="multiselect" || this._settings.multiselect) + this.select(id, false, ((this._settings.multiselect == "touch") || e.ctrlKey || e.metaKey), e.shiftKey); //multiselection + else + this.select(id); + } + } + }, + on_dblclick:{ + }, + on_mouse_move:{ + }, + type:{ + //normal state of item + template:webix.template("#value#"), + //in case of dyn. loading - temporary spacer + templateLoading:webix.template("Loading..."), + + width:160, + height:50, + + classname:function(obj, common, marks){ + var css = "webix_dataview_item "; + + if (common.css) css +=common.css+" "; + if (obj.$css){ + if (typeof obj.$css == "object") + obj.$css = webix.html.createCss(obj.$css); + css +=obj.$css+" "; + } + if (marks && marks.$css) css +=marks.$css+" "; + + return css; + }, + + templateStart:webix.template('
    '), + templateEnd:webix.template("
    ") + + }, + _calck_autoheight:function(width){ + return (this._settings.height = this.type.height * Math.ceil( this.data.count() / Math.floor(width / this.type.width))); + }, + autoheight_setter:function(mode){ + if (mode){ + this.data.attachEvent("onStoreLoad", webix.bind(this.resize, this)); + this._contentobj.style.overflowY = "hidden"; + } + return mode; + }, + $getSize:function(dx, dy){ + if ((this._settings.xCount >0) && this.type.width != "auto" && !this._autowidth) + this._settings.width = this.type.width*this._settings.xCount + (this._scroll_y?webix.ui.scrollSize:0); + if (this._settings.yCount && this.type.height != "auto") + this._settings.height = this.type.height*this._settings.yCount; + + var width = this._settings.width || this._content_width; + if (this._settings.autoheight && width){ + this._calck_autoheight(width); + this.scroll_setter(false); + } + return webix.ui.view.prototype.$getSize.call(this, dx, dy); + }, + $setSize:function(x,y){ + if (webix.ui.view.prototype.$setSize.call(this, x, y)){ + if (this._settings.autoheight && this._calck_autoheight() != this._content_height) + return webix.delay(this.resize, this); + + var render = false; + if (this._settings.yCount && this.type.height == "auto"){ + this.type.height = Math.floor(this._content_height/this._settings.yCount); + render = true; + } + if (this._settings.xCount && (this.type.width == "auto"||this._autowidth)){ + this._autowidth = true; //flag marks that width was set to "auto" initially + this.type.width = Math.floor(this._content_width/this._settings.xCount); + render = true; + } + + if (render || this._render_visible_rows) + this.render(); + } + } +}, webix.DataMove, webix.DragItem, webix.MouseEvents, webix.KeysNavigation, webix.SelectionModel, webix.Scrollable, webix.ui.proto); + + + + +webix.DataDriver.htmltable={ + + //convert json string to json object if necessary + toObject:function(data){ + data = webix.toNode(data); + webix.assert(data, "table is not found"); + webix.assert(data.tagName.toLowerCase() === 'table', "Incorrect table object"); + + var tr = data.rows; + webix.html.remove(data); + return tr; + }, + //get array of records + getRecords:function(data){ + var new_data = []; + //skip header rows if necessary + var i = (data[0] && data[0]._webix_skip)?1:0; + + for (; i < data.length; i++) + new_data.push(data[i]); + return new_data; + }, + //get hash of properties for single record + getDetails:function(data){ + var td = data.getElementsByTagName('td'); + data = {}; + //get hash of properties for single record, data named as "data{index}" + for (var i=0; i < td.length; i++) { + data['data' + i] = td[i].innerHTML; + } + return data; + }, + //get count of data and position at which new data need to be inserted + getInfo:function(data){ + // dyn loading is not supported for htmltable + return { + _size:0, + _from:0 + }; + }, + getOptions:function(){}, + + /*! gets header from first table row + **/ + getConfig: function(data) { + var columns = []; + var td = data[0].getElementsByTagName('th'); + if (td.length) data[0]._webix_skip = true; + for (var i = 0; i < td.length; i++) { + var col = { + id: 'data' + i, + header: this._de_json(td[i].innerHTML) + }; + var attrs = this._get_attrs(td[i]); + col = webix.extend(col, attrs); + columns.push(col); + } + return columns; + }, + + _de_json:function(str){ + var pos = str.indexOf("json://"); + + if (pos != -1) + str = JSON.parse(str.substr(pos+7)); + return str; + }, + + /*! gets hash of html-element attributes + **/ + _get_attrs: function(el) { + var attr = el.attributes; + var hash = {}; + for (var i = 0; i < attr.length; i++) { + hash[attr[i].nodeName] = this._de_json(attr[i].nodeValue); + } + hash.width = parseInt(hash.width, 10); + return hash; + } +}; +webix.protoUI({ + name:"vscroll", + defaults:{ + scroll:"x", + scrollStep:40, + scrollPos:0, + scrollSize:18, + scrollVisible:1, + zoom:1 + }, + $init:function(config){ + var dir = config.scroll||"x"; + var node = this._viewobj = webix.toNode(config.container); + node.className += " webix_vscroll_"+dir; + node.innerHTML="
    "; + webix.event(node,"scroll", this._onscroll,this); + + this._last_set_size = 0; + this._last_scroll_pos = 0; + }, + _check_quantum:function(value){ + if (value>1500000){ + this._settings.zoom = Math.floor(value/1500000)+1; + this._zoom_limit = value-this._last_set_size; + value = Math.floor(value/this._settings.zoom)+this._last_set_size; + } else { + this._settings.zoom = 1; + this._zoom_limit = Infinity; + } + return value; + }, + scrollWidth_setter:function(value){ + value = this._check_quantum(value); + this._viewobj.firstChild.style.width = value+"px"; + return value; + }, + scrollHeight_setter:function(value){ + value = this._check_quantum(value); + this._viewobj.firstChild.style.height = value+"px"; + return value; + }, + sizeTo:function(value, top, bottom){ + value = value-(top||0)-(bottom||0); + + var width = this._settings.scrollSize; + //IEFix + //IE doesn't react on scroll-click if it has not at least 1 px of visible content + if (webix.env.isIE && width) + width += 1; + if (!width && this._settings.scrollVisible && !webix.env.$customScroll){ + this._viewobj.style.pointerEvents="none"; + width = 14; + } + + if (!width){ + this._viewobj.style.display = 'none'; + } else { + if (top) + this._viewobj.style.marginTop = top+ "px"; + this._viewobj.style[this._settings.scroll == "x"?"width":"height"] = Math.max(0,value)+"px"; + this._viewobj.style[this._settings.scroll == "x"?"height":"width"] = width+"px"; + } + + this._last_set_size = value; + }, + getScroll:function(){ + return this._settings.scrollPos*this._settings.zoom; + }, + getSize:function(){ + return (this._settings.scrollWidth||this._settings.scrollHeight)*this._settings.zoom; + }, + scrollTo:function(value){ + if (value<0) + value = 0; + var config = this._settings; + value = Math.min(((config.scrollWidth||config.scrollHeight)-this._last_set_size)*config.zoom, value); + + if (value < 0) value = 0; + var svalue = value/config.zoom; + + if (this._last_scroll_pos != svalue){ + this._viewobj[config.scroll == "x"?"scrollLeft":"scrollTop"] = svalue; + this._onscroll_inner(svalue); + return true; + } + }, + _onscroll:function(){ + var x = this._viewobj[this._settings.scroll == "x"?"scrollLeft":"scrollTop"]; + if (x != this._last_scroll_pos) + this._onscroll_inner(x); + }, + _onscroll_inner:function(value){ + this._last_scroll_pos = value; + this._settings.scrollPos = (Math.min(this._zoom_limit, value*this._settings.zoom) || 0); + this.callEvent("onScroll",[this._settings.scrollPos]); + }, + activeArea:function(area, x_mode){ + this._x_scroll_mode = x_mode; + webix.event(area,"mousewheel",this._on_wheel,this); + webix.event(area,"DOMMouseScroll",this._on_wheel,this); + }, + _on_wheel:function(e){ + var dir = 0; + if (e.wheelDeltaX && Math.abs(e.wheelDeltaX) > Math.abs(e.wheelDeltaY)){ + //x-scroll + if (this._x_scroll_mode) + dir = e.wheelDeltaX / -40; + } else { + //y-scroll + if (!this._x_scroll_mode){ + if (webix.isUndefined(e.wheelDelta)) + dir = e.detail; + else + dir = e.wheelDelta / -40; + } + } + + if (dir) + if (this.scrollTo(this._settings.scrollPos + dir*this._settings.scrollStep)) + return webix.html.preventEvent(e); + } +}, webix.EventSystem, webix.Settings); + + +webix.Number={ + format: function(value, config){ + if (value === "" || typeof value === "undefined") return value; + + config = config||webix.i18n; + value = parseFloat(value); + + var sign = value < 0 ? "-":""; + value = Math.abs(value); + + var str = value.toFixed(config.decimalSize).toString(); + str = str.split("."); + + var int_value = ""; + if (config.groupSize){ + var step = config.groupSize; + var i=str[0].length; + do { + i-=step; + var chunk = (i>0)?str[0].substr(i,step):str[0].substr(0,step+i); + int_value = chunk+(int_value?config.groupDelimiter+int_value:""); + } while(i>0); + } else + int_value = str[0]; + + if (config.decimalSize) + return sign + int_value + config.decimalDelimiter + str[1]; + else + return sign + int_value; + }, + numToStr:function(config){ + return function(value){ + return webix.Number.format(value, config); + }; + } +}; + +webix.Date={ + startOnMonday:false, + + toFixed:function(num){ + if (num<10) return "0"+num; + return num; + }, + weekStart:function(date){ + date = this.copy(date); + + var shift=date.getDay(); + if (this.startOnMonday){ + if (shift===0) shift=6; + else shift--; + } + return this.datePart(this.add(date,-1*shift,"day")); + }, + monthStart:function(date){ + date = this.copy(date); + + date.setDate(1); + return this.datePart(date); + }, + yearStart:function(date){ + date = this.copy(date); + + date.setMonth(0); + return this.monthStart(date); + }, + dayStart:function(date){ + return this.datePart(date, true); + }, + dateToStr:function(format,utc){ + if (typeof format == "function") return format; + + if(webix.env.strict){ + return function(date){ + var str = ""; + var lastPos = 0; + format.replace(/%[a-zA-Z]/g,function(s,pos){ + str += format.slice(lastPos,pos); + var fn = function(date){ + if( s == "%d") return webix.Date.toFixed(date.getDate()); + if( s == "%m") return webix.Date.toFixed((date.getMonth()+1)); + if( s == "%j") return date.getDate(); + if( s == "%n") return (date.getMonth()+1); + if( s == "%y") return webix.Date.toFixed(date.getFullYear()%100); + if( s == "%Y") return date.getFullYear(); + if( s == "%D") return webix.i18n.calendar.dayShort[date.getDay()]; + if( s == "%l") return webix.i18n.calendar.dayFull[date.getDay()]; + if( s == "%M") return webix.i18n.calendar.monthShort[date.getMonth()]; + if( s == "%F") return webix.i18n.calendar.monthFull[date.getMonth()]; + if( s == "%h") return webix.Date.toFixed((date.getHours()+11)%12+1); + if( s == "%g") return ((date.getHours()+11)%12+1); + if( s == "%G") return date.getHours(); + if( s == "%H") return webix.Date.toFixed(date.getHours()); + if( s == "%i") return webix.Date.toFixed(date.getMinutes()); + if( s == "%a") return (date.getHours()>11?"pm":"am"); + if( s == "%A") return (date.getHours()>11?"PM":"AM"); + if( s == "%s") return webix.Date.toFixed(date.getSeconds()); + if( s == "%W") return webix.Date.toFixed(webix.Date.getISOWeek(date)); + return s; + }; + str += fn(date); + lastPos = pos + 2; + }); + str += format.slice(lastPos,format.length); + return str; + }; + + } + + format=format.replace(/%[a-zA-Z]/g,function(a){ + switch(a){ + case "%d": return "\"+webix.Date.toFixed(date.getDate())+\""; + case "%m": return "\"+webix.Date.toFixed((date.getMonth()+1))+\""; + case "%j": return "\"+date.getDate()+\""; + case "%n": return "\"+(date.getMonth()+1)+\""; + case "%y": return "\"+webix.Date.toFixed(date.getFullYear()%100)+\""; + case "%Y": return "\"+date.getFullYear()+\""; + case "%D": return "\"+webix.i18n.calendar.dayShort[date.getDay()]+\""; + case "%l": return "\"+webix.i18n.calendar.dayFull[date.getDay()]+\""; + case "%M": return "\"+webix.i18n.calendar.monthShort[date.getMonth()]+\""; + case "%F": return "\"+webix.i18n.calendar.monthFull[date.getMonth()]+\""; + case "%h": return "\"+webix.Date.toFixed((date.getHours()+11)%12+1)+\""; + case "%g": return "\"+((date.getHours()+11)%12+1)+\""; + case "%G": return "\"+date.getHours()+\""; + case "%H": return "\"+webix.Date.toFixed(date.getHours())+\""; + case "%i": return "\"+webix.Date.toFixed(date.getMinutes())+\""; + case "%a": return "\"+(date.getHours()>11?\"pm\":\"am\")+\""; + case "%A": return "\"+(date.getHours()>11?\"PM\":\"AM\")+\""; + case "%s": return "\"+webix.Date.toFixed(date.getSeconds())+\""; + case "%W": return "\"+webix.Date.toFixed(webix.Date.getISOWeek(date))+\""; + default: return a; + } + }); + if (utc===true) format=format.replace(/date\.get/g,"date.getUTC"); + return new Function("date","if (!date) return ''; if (!date.getMonth) date=webix.i18n.parseFormatDate(date); return \""+format+"\";"); + }, + strToDate:function(format,utc){ + if (typeof format == "function") return format; + + var mask=format.match(/%[a-zA-Z]/g); + var splt="var temp=date.split(/[^0-9a-zA-Z]+/g);"; + var i,t,s; + + if(!webix.i18n.calendar.monthShort_hash){ + s = webix.i18n.calendar.monthShort; + t = webix.i18n.calendar.monthShort_hash = {}; + for (i = 0; i < s.length; i++) + t[s[i]]=i; + + s = webix.i18n.calendar.monthFull; + t = webix.i18n.calendar.monthFull_hash = {}; + for (i = 0; i < s.length; i++) + t[s[i]]=i; + } + + if(webix.env.strict){ + return function(date){ + if (!date) return ''; + if (typeof date == 'object') return date; + var temp=date.split(/[^0-9a-zA-Z]+/g); + var set=[0,0,1,0,0,0]; + for (i=0; i50?1900:2000); + else if( a == "%Y") + set[0]=temp[i]||0; + else if( a == "%n" || a == "%m") + set[1]=(temp[i]||1)-1; + else if( a == "%M") + set[1]=webix.i18n.calendar.monthShort_hash[temp[i]]||0; + else if( a == "%F") + set[1]=webix.i18n.calendar.monthFull_hash[temp[i]]||0; + else if( a == "%j" || a == "%d") + set[2]=temp[i]||1; + else if( a == "%g" || a == "%G" || a == "%h" || a == "%H") + set[3]=temp[i]||0; + else if( a == "%a" || a == "%A") + set[3]=set[3]%12+((temp[i]||'').toLowerCase()=='am'?0:12); + else if( a == "%i") + set[4]=temp[i]||0; + else if( a == "%s") + set[5]=temp[i]||0; + } + if(utc) + return new Date(Date.UTC(set[0],set[1],set[2],set[3],set[4],set[5])); + return new Date(set[0],set[1],set[2],set[3],set[4],set[5]); + }; + } + + for (i=0; i50?1900:2000);"; + break; + case "%g": + case "%G": + case "%h": + case "%H": + splt+="set[3]=temp["+i+"]||0;"; + break; + case "%i": + splt+="set[4]=temp["+i+"]||0;"; + break; + case "%Y": splt+="set[0]=temp["+i+"]||0;"; + break; + case "%a": + case "%A": splt+="set[3]=set[3]%12+((temp["+i+"]||'').toLowerCase()=='am'?0:12);"; + break; + case "%s": splt+="set[5]=temp["+i+"]||0;"; + break; + case "%M": splt+="set[1]=webix.i18n.calendar.monthShort_hash[temp["+i+"]]||0;"; + break; + case "%F": splt+="set[1]=webix.i18n.calendar.monthFull_hash[temp["+i+"]]||0;"; + break; + default: + break; + } + } + var code ="set[0],set[1],set[2],set[3],set[4],set[5]"; + if (utc) code =" Date.UTC("+code+")"; + return new Function("date","if (!date) return ''; if (typeof date == 'object') return date; var set=[0,0,1,0,0,0]; "+splt+" return new Date("+code+");"); + }, + + getISOWeek: function(ndate) { + if(!ndate) return false; + var nday = ndate.getDay(); + if (nday === 0) { + nday = 7; + } + var first_thursday = new Date(ndate.valueOf()); + first_thursday.setDate(ndate.getDate() + (4 - nday)); + var year_number = first_thursday.getFullYear(); // year of the first Thursday + var ordinal_date = Math.floor( (first_thursday.getTime() - new Date(year_number, 0, 1).getTime()) / 86400000); //ordinal date of the first Thursday - 1 (so not really ordinal date) + var weekNumber = 1 + Math.floor( ordinal_date / 7); + return weekNumber; + }, + + getUTCISOWeek: function(ndate){ + return this.getISOWeek(ndate); + }, + _correctDate: function(d,d0,inc,checkFunc){ + if(!inc) + return; + var incorrect = checkFunc(d,d0); + if(incorrect){ + var i = (inc>0?1:-1); + while(incorrect){ + d.setHours(d.getHours()+i); + incorrect = checkFunc(d,d0); + i += (inc>0?1:-1); + } + } + }, + add:function(date,inc,mode,copy){ + if (copy) date = this.copy(date); + var d = webix.Date.copy(date); + switch(mode){ + case "day": + date.setDate(date.getDate()+inc); + this._correctDate(date,d,inc,function(d,d0){ + return webix.Date.datePart(d0,true)== webix.Date.datePart(d,true); + }); + break; + case "week": + date.setDate(date.getDate()+7*inc); + this._correctDate(date,d,7*inc,function(d,d0){ + return webix.Date.datePart(d0,true)== webix.Date.datePart(d,true); + }); + break; + case "month": + date.setMonth(date.getMonth()+inc); + this._correctDate(date,d,inc,function(d,d0){ + return d0.getMonth() == d.getMonth() && d0.getYear() == d.getYear(); + }); + break; + case "year": + date.setYear(date.getFullYear()+inc); + this._correctDate(date,d,inc,function(d,d0){ + return d0.getFullYear() == d.getFullYear(); + }); + break; + case "hour": + date.setHours(date.getHours()+inc); + this._correctDate(date,d,inc,function(d,d0){ + return d0.getHours() == d.getHours() && webix.Date.datePart(d0,true)== webix.Date.datePart(d,true); + }); + break; + case "minute": date.setMinutes(date.getMinutes()+inc); break; + default: + webix.Date.add[mode](date, inc, mode); + break; + } + return date; + }, + datePart:function(date, copy){ + if (copy) date = this.copy(date); + + // workaround for non-existent hours + var d = this.copy(date); + d.setHours(0); + if(d.getDate()!=date.getDate()){ + date.setHours(1); + } + else{ + date.setHours(0); + } + + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); + return date; + }, + timePart:function(date, copy){ + if (copy) date = this.copy(date); + return (date.valueOf()/1000 - date.getTimezoneOffset()*60)%86400; + }, + copy:function(date){ + return new Date(date.valueOf()); + }, + equal:function(a,b){ + if (!a || !b) return false; + return a.valueOf() === b.valueOf(); + }, + isHoliday:function(day){ + day = day.getDay(); + if (day === 0 || day==6) return "webix_cal_event"; + } +}; + + +webix.i18n = { + _dateMethods:["fullDateFormat", "timeFormat", "dateFormat", "longDateFormat", "parseFormat", "parseTimeFormat"], + parseFormat:"%Y-%m-%d %H:%i", + parseTimeFormat:"%H:%i", + numberFormat:webix.Number.format, + priceFormat:function(value){ return webix.i18n._price_format(webix.i18n.numberFormat(value, webix.i18n._price_settings)); }, + + setLocale:function(locale){ + var extend = function(base,source){ + for (var method in source){ + if(typeof(source[method]) == "object" && !webix.isArray(source[method])){ + if(!base[method]){ + base[method] = {}; + } + extend(base[method],source[method]); + } + else + base[method] = source[method]; + } + }; + + if (typeof locale == "string") + locale = this.locales[locale]; + if (locale){ + extend(this, locale); + } + var helpers = webix.i18n._dateMethods; + for( var i=0; i=this._settings.leftSplit && i= 0; i--){ + heights[i] = heights[i] || this._settings.headerRowHeight; + heights._summ += heights[i]*1; + } + + //set null to cells included in col|row spans + for (var i=0; i"; + for (var i = start; i < end; i++){ + html += ""; + for (var i = start; i < end; i++) + html += ""; + html += ""; + } + + var count = this._columns[0][name].length; + var block_evs = []; + + for (var j = 0; j < count; j++){ + html += ""; + for (var i = start; i < end; i++){ + var header = this._columns[i][name][j]; + if (header === null) continue; + + if (header.content){ + header.contentId = header.contentId||webix.uid(); + header.columnId = this._columns[i].id; + header.format = this._columns[i].format; + + webix.assert(webix.ui.datafilter, "Filtering extension was not included"); + webix.assert(webix.ui.datafilter[header.content], "Unknown content type: "+header.content); + + header.text = webix.ui.datafilter[header.content].render(this, header); + this._active_headers[header.contentId] = header; + this._has_active_headers = true; + } + + html += "=end-1) + hcss+=" webix_last"; + if (hcss) + html+=' class="'+hcss+'"'; + + var cell_height = heights[j]; + var sheight=""; + if (header.contentId) + html+=" active_id='"+header.contentId+"'"; + if (header.colspan) + html+=" colspan='"+header.colspan+"'"; + if (header.rowspan){ + html+=" rowspan='"+header.rowspan+"'"; + cell_height = this._summ_next(this._headers, j, header.rowspan); + } + + if (cell_height != this._settings.headerRowHeight) + sheight =" style='line-height:"+cell_height+"px; height:"+cell_height+"px;'"; + + var css ="webix_hcell"; + var header_css = header.css; + if (header_css){ + if (typeof header_css == "object") + header.css = header_css = webix.html.createCss(header_css); + css+=" "+header_css; + } + if (this._columns[i].$selected) + css += " webix_sel_hcell"; + + html+=">
    "; + + var text = (header.text===""?" ":header.text); + if (header.rotate) + text = "
    "+text+"
    "; + + html += text + "
    "; + } + html += ""; + } + html+=""; + + return html; + }, + showItemByIndex:function(row_ind, column_ind){ + var pager = this._settings.pager; + if (pager){ + var target = Math.floor(row_ind/pager.size); + if (target != pager.page) + webix.$$(pager.id).select(target); + } + + //parameter will be set to -1, to mark that scroll need not to be adjusted + if (row_ind != -1){ + var state = this._get_y_range(); + if (row_ind < state[0]+1 || row_ind >= state[1]-1 ){ + //not visible currently + var summ = this._getHeightByIndexSumm(0,row_ind); + if (row_ind < state[0]+1){ + //scroll top - show row at top of screen + summ = Math.max(0, summ-1); + } else { + //scroll bottom - show row at bottom of screen + summ += this._getHeightByIndex(row_ind) - this._dtable_offset_height; + //because of row rounding we neet to scroll some extra + //TODO: create a better heuristic + if (row_ind>0) + summ += this._getHeightByIndex(row_ind-1)-1; + } + this._y_scroll.scrollTo(summ); + } + } + if (column_ind != -1){ + //ignore split columns - they are always visible + if (column_ind < this._settings.leftSplit) return; + if (column_ind >= this._rightSplit) return; + + //very similar to y-logic above + var state = this._get_x_range(); + if (column_ind < state[0]+1 || column_ind >= state[1]-1 ){ + //not visible currently + var summ = 0; + for (var i=this._settings.leftSplit; i=this._settings.leftSplit && col= this._rightSplit ? 2 : 1); + parent = this._body.childNodes[split_column].firstChild; + break; + } + + left += leftcolumn.width; + } + + var max = this.data.order.length; + var top = this._getHeightByIndexSumm((this._render_scroll_top||0), this.getIndexById(row)); + + return { + parent: parent, + top: top + (this._render_scroll_shift||0), + left: left, + width: config.width, + height: (item.$height || this._settings.rowHeight) + }; + }, + _get_total_height:function(){ + var pager = this._settings.pager; + var start = 0; + var max = this.data.order.length; + + if (pager){ + start = pager.size * pager.page; + max = Math.min(max, start + pager.size); + if (pager.level){ + start = this.data.$min; + max = this.data.$max; + } + } + + return this._getHeightByIndexSumm(start, max); + }, + setRowHeight:function(rowId, height){ + if (isNaN(height)) return; + if (height0){ + t-=this._columns[xind].width; + xind++; + } + var xend = xind; + if (t) xind--; + + t+=this._center_width; + while (t>0 && xend0){ + t-=this._getHeightByIndex(xind); + xind++; + } + + //how much of the first cell is scrolled out + var xdef = (xind>0 && t)?-(this._getHeightByIndex(xind-1)+t):0; + var xend = xind; + if (t) xind--; + + t+=(this._dtable_offset_height||this._content_height); + + if (rowHeight){ + var dep = Math.ceil(t/rowHeight); + t-=dep*rowHeight; + xend+=dep; + + if (xend>end) + xend = end; + } else + while (t>0 && xend= state[1]) return; + + //get visible column + var x_range = this._get_x_range(); + for (var i=0; i= this._settings.leftSplit && ( i x_range[1])) + column._yr0 = -999; //ensure that column will not be reused + + if (column.attached && column.node){ + var node = column.node.childNodes[rowindex-state[0]]; + var value = this._getValue(item, this._columns[i], 0); + + node.innerHTML = value; + node.className = this._getCss(this._columns[i], value, item, id); + } + } + }, + _check_rendered_cols:function(x_scroll, force){ + if (!this._columns.length) return; + + if (force) + this._clearColumnCache(); + + if (webix.debug_render) + webix.log("Render: "+this.name+"@"+this._settings.id); + + + var xr = this._get_x_range(this._settings.prerender); + var yr = this._get_y_range(this._settings.prerender === true); + + if (x_scroll){ + for (var i=this._settings.leftSplit; i= this._last_valid_render_pos); + this._last_valid_render_pos = yr[0]; + + if (this._data_request_flag){ + if (paging && (!fetch || fetch >= paging.size)) + if (this._check_rows([0,paging.size*paging.page], Math.max(fetch, paging.size), true)) + return (this._data_request_flag = null); + + this._run_load_next(this._data_request_flag, direction); + this._data_request_flag = null; + } else { + if (this._settings.loadahead) + var check = this._check_rows(yr, this._settings.loadahead, direction); + } + }, + _check_rows:function(view, count, dir){ + var start = view[1]; + var end = start+count; + if (!dir){ + start = view[0]-count; + end = view[0]; + } + + if (start<0) start = 0; + end = Math.min(end, this.data.order.length-1); + + var result = false; + for (var i=start; i"; + }, + radio:function(obj, common, value, config){ + var checked = (value == config.checkValue) ? 'checked="true"' : ''; + return ""; + }, + editIcon:function(){ + return ""; + }, + trashIcon:function(){ + return ""; + } + }, + type_setter:function(value){ + if(!this.types || !this.types[value]) + webix.type(this, value); + else { + this.type = webix.clone(this.types[value]); + if (this.type.css) + this._contentobj.className+=" "+this.type.css; + } + if (this.type.on_click) + webix.extend(this.on_click, this.type.on_click); + + return value; + }, + _renderColumn:function(index,yr,force, single){ + var col = this._columns[index]; + if (!col.attached){ + var split_column = index= this._rightSplit ? 2 : 1); + this._body.childNodes[split_column].firstChild.appendChild(col.node); + col.attached = true; + col.split = split_column; + } + + this._render_scroll_top = yr[0]; + this._render_scroll_shift = 0; + + //if columns not aligned during scroll - set correct scroll top value for each column + var total = 0; + if (this._settings.scrollAlignY){ + if ((yr[1] == this.data.order.length) || (this.data.$pagesize && yr[1] % this.data.$pagesize === 0 )){ + total = (this._render_scroll_shift = yr[2]); + col.node.style.top = total+"px"; + } else if (col._yr2) + col.node.style.top = "0px"; + } else { + this._render_scroll_shift = yr[2]; + if (yr[2] != col._yr2){ + total = yr[2]; + col.node.style.top = total+"px"; + } + } + + if (!force && (col._yr0 == yr[0] && col._yr1 == yr[1])) return 0; + + var html=""; + var config = this._settings.columns[index]; + var rowHeight = this._settings.rowHeight; + + + for (var i = yr[0]; i < yr[1]; i++){ + var id = this.data.order[i]; + var item = this.data.getItem(id); + var value; + if (item){ + if (single && item.$row){ + this._render_full_row_some = true; + this._render_full_rows.push({ top:total, id:item.id, index:i}); + html+="
    "; + total += rowHeight; + continue; + } + var value = this._getValue(item, config, i); + var css = this._getCss(config, value, item, id); + + if (item.$height){ + html+="
    "+value+"
    "; + total += item.$height - rowHeight; + } else { + html+="
    "+value+"
    "; + } + } else { + html+="
    "; + if (!this._data_request_flag) + this._data_request_flag = {start:i, count:yr[1]-i}; + else + this._data_request_flag.last = i; + } + total += rowHeight; + } + col.node.innerHTML = html; + col._yr0=yr[0]; + col._yr1=yr[1]; + col._yr2=yr[2]; + return 1; + }, + _set_split_sizes_y:function(){ + if (!this._columns.length || isNaN(this._content_height*1)) return; + webix.debug_size_box(this, ["y-sizing"], true); + + var wanted_height = this._dtable_height+(this._scrollSizeX?this._scrollSizeX:0); + if ((this._settings.autoheight || this._settings.yCount) && this.resize()) + return; + + this._y_scroll.sizeTo(this._content_height, this._header_height, this._footer_height); + this._y_scroll.define("scrollHeight", wanted_height); + + this._dtable_offset_height = Math.max(0,this._content_height-this._scrollSizeX-this._header_height-this._footer_height); + for (var i = 0; i < 3; i++){ + + this._body.childNodes[i].style.height = this._dtable_offset_height+"px"; + if (this._settings.prerender) + this._body.childNodes[i].firstChild.style.height = this._dtable_height+"px"; + else + this._body.childNodes[i].firstChild.style.height = this._dtable_offset_height+"px"; + } + }, + _set_split_sizes_x:function(){ + if (!this._columns.length) return; + if (webix.debug_size) webix.log(" - "+this.name+"@"+this._settings.id+" X sizing"); + + var index = 0; + this._left_width = 0; + this._right_width = 0; + this._center_width = 0; + + while (index=this._rightSplit){ + this._right_width += this._columns[index].width; + index--; + } + + if (!this._content_width) return; + + if (this._settings.autowidth && this.resize()) + return; + + this._center_width = this._content_width - this._right_width - this._left_width - this._scrollSizeY; + + this._body.childNodes[1].firstChild.style.width = this._dtable_width+"px"; + + this._body.childNodes[0].style.width = this._left_width+"px"; + this._body.childNodes[1].style.width = this._center_width+"px"; + this._body.childNodes[2].style.width = this._right_width+"px"; + this._header.childNodes[0].style.width = this._left_width+"px"; + this._header.childNodes[1].style.width = this._center_width+"px"; + this._header.childNodes[2].style.width = this._right_width+"px"; + this._footer.childNodes[0].style.width = this._left_width+"px"; + this._footer.childNodes[1].style.width = this._center_width+"px"; + this._footer.childNodes[2].style.width = this._right_width+"px"; + + var delta = this._center_width - this._dtable_width; + if (delta<0) delta=0; //negative header space has not sense + + if (delta != this._header_fix_width){ + this._header_fix_width = delta; + this._size_header_footer_fix(); + } + + // temp. fix: Chrome [DIRTY] + if (webix.env.isWebKit){ + var w = this._body.childNodes[0].offsetWidth; + w = this._body.childNodes[1].offsetWidth; + w = this._body.childNodes[2].offsetWidth; + } + + this._x_scroll.sizeTo(this._content_width-this._scrollSizeY); + this._x_scroll.define("scrollWidth", this._dtable_width+this._left_width+this._right_width); + }, + $getSize:function(dx, dy){ + if ((this._settings.autoheight || this._settings.yCount) && this._settings.columns){ + //if limit set - use it + var desired = ((this._settings.yCount || 0) * this._settings.rowHeight); + //else try to use actual rendered size + //if component invisible - this is not valid, so fallback to all rows + if (!desired) desired = this.isVisible() ? this._dtable_height : (this.count() * this._settings.rowHeight); + //add scroll and check minHeight limit + this._settings.height = Math.max(desired+(this._scrollSizeX?this._scrollSizeX:0)-1, (this._settings.minHeight||0))+this._header_height+this._footer_height; + } + if (this._settings.autowidth && this._settings.columns) + this._settings.width = Math.max(this._dtable_width+this._left_width+this._right_width+this._scrollSizeY,(this._settings.minWidth||0)); + + + var minwidth = this._left_width+this._right_width+this._scrollSizeY; + var sizes = webix.ui.view.prototype.$getSize.call(this, dx, dy); + + + sizes[0] = Math.max(sizes[0]||minwidth); + return sizes; + }, + _restore_scroll_state:function(){ + if (this._x_scroll){ + var state = this.getScrollState(); + this._x_scroll._last_scroll_pos = this._y_scroll._last_scroll_pos = -1; + this.scrollTo(state.x, state.y); + } + }, + $setSize:function(x,y){ + if (webix.ui.view.prototype.$setSize.apply(this, arguments)){ + if (this._dtable_fully_ready){ + this.callEvent("onResize",[this._content_width, this._content_height]); + this._set_split_sizes_x(); + this._set_split_sizes_y(); + } + this.render(); + } + }, + _on_header_click:function(column){ + var col = this.getColumnConfig(column); + if (!col.sort) return; + + var order = 'asc'; + if (col.id == this._last_sorted) + order = this._last_order == "asc" ? "desc" : "asc"; + + this._sort(col.id, order, col.sort); + }, + markSorting:function(column, order){ + if (!this._sort_sign) + this._sort_sign = webix.html.create("DIV"); + webix.html.remove(this._sort_sign); + + if (order){ + var cell = this._get_header_cell(this.getColumnIndex(column)); + if (cell){ + this._sort_sign.className = "webix_ss_sort_"+order; + cell.style.position = "relative"; + cell.appendChild(this._sort_sign); + } + + this._last_sorted = column; + this._last_order = order; + } else { + this._last_sorted = this._last_order = null; + } + }, + scroll_setter:function(mode){ + if (typeof mode == "string"){ + this._settings.scrollX = (mode.indexOf("x") != -1); + this._settings.scrollY = (mode.indexOf("y") != -1); + return mode; + } else + return (this._settings.scrollX = this._settings.scrollY = mode); + }, + _get_header_cell:function(column){ + var cells = this._header.getElementsByTagName("TD"); + var maybe = null; + for (var i = 0; i= 0; i--) + if (hash[css[i]]) + css_call.push(hash[css[i]]); + } + + if (trg.parentNode.getAttribute){ + + var column = trg.parentNode.getAttribute("column") || trg.getAttribute("column"); + if (column){ //we need to ignore TD - which is header|footer + var isBody = trg.parentNode.tagName == "DIV"; + found = true; + if (isBody){ + var index = trg.parentNode.getAttribute("row") || trg.getAttribute("row") || ( webix.html.index(trg) + this._columns[column]._yr0 ); + this._item_clicked = id = { row:this.data.order[index], column:this._columns[column].id}; + id.toString = this._id_to_string; + } else + this._item_clicked = id = { column:this._columns[column].id }; + //some custom css handlers was found + if (css_call.length){ + for (var i = 0; i < css_call.length; i++) { + var functor = webix.toFunctor(css_call[i], this.$scope); + var res = functor.call(this,e,id,trg); + if (res===false) return; + } + } + + //call inner handler + if (isBody){ + if(this.callEvent("on"+name,[id,e,trg])&&pair){ + this.callEvent("on"+pair,[id,e,trg]); + } + } + else if (name == "ItemClick"){ + var isHeader = (trg.parentNode.parentNode.getAttribute("section") == "header"); + if (isHeader && this.callEvent("onHeaderClick", [id, e, trg])) + this._on_header_click(id.column); + } + break; + } + } + + trg=trg.parentNode; + } + return found; //returns true if item was located and event was triggered + }, + + + + + showOverlay:function(message){ + if (!this._datatable_overlay){ + var t = webix.html.create("DIV", { "class":"webix_overlay" }, ""); + this._body.appendChild(t); + this._datatable_overlay = t; + } + this._datatable_overlay.innerHTML = message; + }, + hideOverlay:function(){ + if (this._datatable_overlay){ + webix.html.remove(this._datatable_overlay); + this._datatable_overlay = null; + } + }, + mapCells: function(startrow, startcol, numrows, numcols, callback) { + if (startrow === null && this.data.order.length > 0) startrow = this.data.order[0]; + if (startcol === null) startcol = this.columnId(0); + if (numrows === null) numrows = this.data.order.length; + if (numcols === null) numcols = this._settings.columns.length; + + if (!this.exists(startrow)) return; + startrow = this.getIndexById(startrow); + startcol = this.getColumnIndex(startcol); + if (startcol === null) return; + + for (var i = 0; i < numrows && (startrow + i) < this.data.order.length; i++) { + var row_ind = startrow + i; + var row_id = this.data.order[row_ind]; + var item = this.getItem(row_id); + for (var j = 0; j < numcols && (startcol + j) < this._settings.columns.length; j++) { + var col_ind = startcol + j; + var col_id = this.columnId(col_ind); + item[col_id] = callback(item[col_id], row_id, col_id, i, j); + } + } + }, + _call_onparse: function(driver, data){ + if (!this._settings.columns && driver.getConfig) + this.define("columns", driver.getConfig(data)); + }, + _autoDetectConfig:function(){ + var test = this.getItem(this.getFirstId()); + var res = this._settings.columns = []; + for (var key in test) + if (key != "id") + res.push({ id:key, header:key[0].toUpperCase()+key.substr(1), sort:"string", editor:"text" }); + if (res.length) + res[0].fillspace = true; + if (typeof this._settings.select == "undefined") + this.define("select", "row"); + } +},webix.AutoTooltip, webix.Group, webix.DataMarks, webix.DataLoader, webix.MouseEvents, webix.MapCollection, webix.ui.view, webix.EventSystem, webix.Settings); + +webix.ui.datafilter = { + textWaitDelay:500, + "summColumn":{ + getValue:function(){}, + setValue: function(){}, + refresh:function(master, node, value){ + var result = 0; + master.mapCells(null, value.columnId, null, 1, function(value){ + value = value*1; + if (!isNaN(value)) + result+=value; + return value; + }); + + if (value.format) + result = value.format(result); + if (value.template) + result = value.template({value:result}); + + node.firstChild.innerHTML = result; + }, + trackCells:true, + render:function(master, config){ + if (config.template) + config.template = webix.template(config.template); + return ""; + } + }, + "masterCheckbox":{ + getValue:function(){}, + setValue:function(){}, + getHelper:function(node, config){ + return { + check:function(){ config.checked = false; node.onclick(); }, + uncheck:function(){ config.checked = true; node.onclick(); }, + isChecked:function(){ return config.checked; } + }; + }, + refresh:function(master, node, config){ + node.onclick = function(){ + this.getElementsByTagName("input")[0].checked = config.checked = !config.checked; + var column = master.getColumnConfig(config.columnId); + var checked = config.checked ? column.checkValue : column.uncheckValue; + master.data.each(function(obj){ + obj[config.columnId] = checked; + master.callEvent("onCheck", [obj.id, config.columnId, checked]); + this.callEvent("onStoreUpdated", [obj.id, obj, "save"]); + }); + master.refresh(); + }; + }, + render:function(master, config){ + return ""; + } + }, + "textFilter":{ + getInputNode:function(node){ return node.firstChild.firstChild; }, + getValue:function(node){ return this.getInputNode(node).value; }, + setValue:function(node, value){ this.getInputNode(node).value=value; }, + refresh:function(master, node, value){ + node.component = master._settings.id; + master.registerFilter(node, value, this); + + node._comp_id = master._settings.id; + if (value.value && this.getValue(node) != value.value) this.setValue(node, value.value); + node.onclick = webix.html.preventEvent; + webix.event(node, "keydown", this._on_key_down); + }, + render:function(master, config){ + if (this.init) this.init(config); + config.css = "webix_ss_filter"; + return ""; + }, + _on_key_down:function(e, node, value){ + var id = this._comp_id; + + //tabbing through filters must not trigger filtering + //we can improve this functionality by preserving initial filter value + //and comparing new one with it + if ((e.which || e.keyCode) == 9) return; + + if (this._filter_timer) window.clearTimeout(this._filter_timer); + this._filter_timer=window.setTimeout(function(){ + webix.$$(id).filterByAll(); + },webix.ui.datafilter.textWaitDelay); + } + }, + "selectFilter":{ + getInputNode:function(node){ return node.firstChild.firstChild; }, + getValue:function(node){ return this.getInputNode(node).value; }, + setValue:function(node, value){ this.getInputNode(node).value=value; }, + refresh:function(master, node, value){ + //value - config from header { contet: } + value.compare = value.compare || function(a,b){ return a == b; }; + + node.component = master._settings.id; + master.registerFilter(node, value, this); + + var data; + if (value.options) + data = value.options; + else + data = master.collectValues(value.columnId); + + //slow in IE + //http://jsperf.com/select-options-vs-innerhtml + var select = document.createElement("select"); + for (var i = 0; i < data.length; i++){ + var option = document.createElement("option"); + option.value = data[i].id; + option.text = data[i].value; + select.add(option); + } + + node.firstChild.innerHTML = ""; + node.firstChild.appendChild(select); + + if (value.value) this.setValue(node, value.value); + node.onclick = webix.html.preventEvent; + + select._comp_id = master._settings.id; + webix.event(select, "change", this._on_change); + }, + render:function(master, config){ + if (this.init) this.$init(config); + config.css = "webix_ss_filter"; return ""; }, + _on_change:function(e, node, value){ + webix.$$(this._comp_id).filterByAll(); + } + } +}; + +webix.ui.datafilter.serverFilter = webix.extend({ + _on_key_down:function(e, node, value){ + var id = this._comp_id; + var code = (e.which || e.keyCode); + + //ignore tab and navigation keys + if (code == 9 || ( code >= 33 && code <= 40)) return; + + if (this._filter_timer) window.clearTimeout(this._filter_timer); + this._filter_timer=window.setTimeout(function(){ + + webix.$$(id).loadNext(-1,0,{ + before:function(){ + var url = this.data.url; + if (this.editStop) this.editStop(); + this.clearAll(); + this.data.url = url; + }, + success:function(){ + this.callEvent("onAfterFilter",[]); + } + },0,1); + + },webix.ui.datafilter.textWaitDelay); + } +}, webix.ui.datafilter.textFilter); + +webix.ui.datafilter.serverSelectFilter = webix.extend({ + _on_change:function(e, node, value){ + var id = this._comp_id; + webix.$$(id).loadNext(-1,0,{ + before:function(){ + var url = this.data.url; + if (this.editStop) this.editStop(); + this.clearAll(); + this.data.url = url; + }, + success:function(){ + this.callEvent("onAfterFilter",[]); + } + },0,1); + } +}, webix.ui.datafilter.selectFilter); + +webix.ui.datafilter.numberFilter = webix.extend({ + init:function(config){ + config.prepare = function(value, filter){ + var equality = (value.indexOf("=") != -1)?1:0; + var intvalue = this.format(value); + if (intvalue === "") return ""; + + if (value.indexOf(">") != -1) + config.compare = this._greater; + else if (value.indexOf("<") != -1){ + config.compare = this._lesser; + equality *= -1; + } + else { + config.compare = this._equal; + equality = 0; + } + + return intvalue - equality; + }; + }, + format:function(value){ + return value.replace(/[^0-9]/g,""); + }, + _greater:function(a,b){ return a*1>b; }, + _lesser:function(a,b){ return a*1< =]+/,"")); + } + return date.valueOf(); + } +}, webix.ui.datafilter.numberFilter); + +webix.extend(webix.ui.datatable,{ + find:function(config, first){ + var result = []; + var count = this.data.count(); + + for (var i = 0; i < count; i++){ + var data = this.getItem(this.data.order[i]); + var match = true; + if (typeof config == "object"){ + for (var key in config) + if (data[key] != config[key]){ + match = false; + break; + } + } else if (!config(data)) + match = false; + + if (match) + result.push(data); + + if (first && result.length) + return result[0]; + } + + return result; + }, + filterByAll:function(){ + //we need to use dynamic function creating + //jshint -W083:true + this.data.silent(function(){ + this.filter(); + var first = false; + for (var key in this._filter_elements){ + webix.assert(key, "empty column id for column with filtering"); + + var record = this._filter_elements[key]; + var originvalue = record[2].getValue(record[0]); + + //saving last filter value, for usage in getState + var inputvalue = originvalue; + if (record[1].prepare) + inputvalue = record[1].prepare.call(record[2], inputvalue, record[1], this); + + //preserve original value + record[1].value = originvalue; + var compare = record[1].compare; + + if (!this.callEvent("onBeforeFilter",[key, inputvalue, record[1]])) continue; + + if (inputvalue === "") continue; + if (compare) + this.filter(function(obj, value){ + if (!obj) return false; + + var test = obj[key]; + return compare(test, value, obj); + }, inputvalue, first); + else + this.filter(key, inputvalue, first); + first = true; + } + }, this); + this.refresh(); + this.callEvent("onAfterFilter",[]); + }, + filterMode_setter:function(mode){ + return webix.extend(this.data._filterMode, mode, true); + }, + getFilter:function(columnId){ + var filter = this._filter_elements[columnId]; + webix.assert(filter, "Filter doesn't exists for column in question"); + + if (filter && filter[2].getInputNode) + return filter[2].getInputNode(filter[0]); + return null; + }, + registerFilter:function(node, config, obj){ + this._filter_elements[config.columnId] = [node, config, obj]; + }, + collectValues:function(id){ + var values = [{ id:"", value:"" }]; + var checks = { "" : true }; + + var obj = this.getColumnConfig(id); + var options = obj.options||obj.collection; + + if (options){ + if (typeof options == "object" && !options.loadNext){ + //raw object + if (webix.isArray(options)) + for (var i=0; i b.value ? 1 : -1; }); + } +}); + + +webix.extend(webix.ui.datatable, { + hover_setter:function(value){ + if (value && !this._hover_initialized){ + this._enable_mouse_move(); + this.config.experimental = true; + + this.attachEvent("onMouseMoving", function(e){ + + var row = this.locate(arguments[0]); + row = row ? row.row : null; + + if (this._last_hover != row){ + if (this._last_hover) + this.removeRowCss(this._last_hover, this._settings.hover); + + this._delayed_hover_set(); + this._last_hover = row; + } + }); + + this.attachEvent("onMouseOut", function(){ + if (this._last_hover){ + this.removeRowCss(this._last_hover, this._settings.hover); + this._last_hover = null; + } + }); + + this._hover_initialized = 1; + } + return value; + }, + _delayed_hover_set:function(){ + webix.delay(function(){ + if (this._last_hover) + this.addRowCss( this._last_hover, this._settings.hover ); + }, this, [], 5); + }, + select_setter:function(value){ + if (!this.select && value){ + webix.extend(this, this._selections._commonselect, true); + if (value === true) + value = "row"; + else if (value == "multiselect"){ + value = "row"; + this._settings.multiselect = true; + } + webix.assert(this._selections[value], "Unknown selection mode: "+value); + webix.extend(this, this._selections[value], true); + } + return value; + }, + getSelectedId:function(mode){ + return mode?[]:""; //dummy placeholder + }, + getSelectedItem:function(mode){ + return webix.SelectionModel.getSelectedItem.call(this, mode); + }, + _selections:{ + //shared methods for all selection models + _commonselect:{ + _select_css:' webix_cell_select', + $init:function(){ + this._reinit_selection(); + this.on_click.webix_cell = webix.bind(this._click_before_select, this); + + //temporary stab, actual handlers need to be created + this._data_cleared = this._data_filtered = function(){ + this.unselect(); + }; + + this.data.attachEvent("onStoreUpdated",webix.bind(this._data_updated,this)); + this.data.attachEvent("onClearAll", webix.bind(this._data_cleared,this)); + this.data.attachEvent("onAfterFilter", webix.bind(this._data_filtered,this)); + this.data.attachEvent("onIdChange", webix.bind(this._id_changed,this)); + + this.$ready.push(webix.SelectionModel._set_noselect); + }, + _id_changed:function(oldid, newid){ + for (var i=0; i 1 || asArray){ + result = [].concat(this._selected_areas); + if (plain) + for (var i = 0; i < result.length; i++) + result[i]=result[i].id; + } else { + result = this._selected_areas[0]; + if (plain && result) + return result.id; + } + + return result; + }, + _id_to_string:function(){ + return this.row; + }, + _select:function(data, preserve){ + var key = this._select_key(data); + //don't allow selection on unnamed columns + if (key === null) return; + data.id = key; + data.toString = this._id_to_string; + + if (!this.callEvent("onBeforeSelect",[data, preserve])) return false; + + //ignore area, if it was already selected and + // - we are preserving existing selection + // - this is the only selected area + // otherwise we need to clear other selected areas + if (this._selected_pull[key] && (preserve || this._selected_areas.length == 1)) return; + + if (!preserve) + this._clear_selection(); + + this._selected_areas.push(data); + this._selected_pull[key] = true; + + this.callEvent("onAfterSelect",[data, preserve]); + + + this._finalize_select(this._post_select(data)); + return true; + }, + _clear_selection:function(){ + if (!this._selected_areas.length) return false; + + for (var i=0; irow_end_ind){ + var temp = row_start_ind; + row_start_ind = row_end_ind; + row_end_ind = temp; + } + + this._silent_selection = true; + for (var i=row_start_ind; i<=row_end_ind; i++) + this.select(this.getIdByIndex(i),true); + this._silent_selection = false; + this._finalize_select(); + } + }, + + cell:{ + _select_key:function(data){ + if (!data.column) return null; + return data.row+"_"+data.column; + }, + select:function(row_id, column_id, preserve){ + webix.assert(this.data.exists(row_id), "Incorrect id in select command: "+row_id); + this._select({row:row_id, column:column_id}, preserve); + }, + _post_select:function(data){ + var sel = this._add_item_select(data.row); + sel.$count++; + sel[data.column]=true; + return data.row; + }, + unselect:function(row_id, column_id){ + this._unselect({row:row_id, column:column_id}); + }, + _post_unselect:function(data){ + var sel = this._add_item_select(data.row); + sel.$count-- ; + sel[data.column] = false; + if (sel.$count<=0) + this.data.removeMark(data.row,"webix_selected"); + return data.row; + }, + mapSelection:function(callback){ + return this._mapSelection(callback, false, false); + }, + _selectRange:function(a,b){ + return this.selectRange(a.row, a.column, b.row, b.column); + }, + + selectRange:function(row_id, column_id, end_row_id, end_column_id){ + var row_start_ind = this.getIndexById(row_id); + var row_end_ind = this.getIndexById(end_row_id); + + var col_start_ind = this.getColumnIndex(column_id); + var col_end_ind = this.getColumnIndex(end_column_id); + + if (row_start_ind>row_end_ind){ + var temp = row_start_ind; + row_start_ind = row_end_ind; + row_end_ind = temp; + } + + if (col_start_ind>col_end_ind){ + var temp = col_start_ind; + col_start_ind = col_end_ind; + col_end_ind = temp; + } + + this._silent_selection = true; + for (var i=row_start_ind; i<=row_end_ind; i++) + for (var j=col_start_ind; j<=col_end_ind; j++) + this.select(this.getIdByIndex(i),this.columnId(j),true); + this._silent_selection = false; + this._finalize_select(); + } + }, + + column:{ + _select_css:' webix_column_select', + _select_key:function(data){ return data.column; }, + _id_to_string:function(){ + return this.column; + }, + //returns box-like area, with ordered selection cells + select:function(column_id, preserve){ + this._select({ column:column_id }, preserve); + }, + _post_select:function(data){ + this._settings.columns[this.getColumnIndex(data.column)].$selected = true; + if (!this._silent_selection) + this._render_header_and_footer(); + }, + unselect:function(column_id){ + this._unselect({column : column_id}); + }, + _post_unselect:function(data){ + this._settings.columns[this.getColumnIndex(data.column)].$selected = null; + this._render_header_and_footer(); + }, + mapSelection:function(callback){ + return this._mapSelection(callback, true, false); + }, + _selectRange:function(a,b){ + return this.selectRange(a.column, b.column); + }, + selectRange:function(column_id, end_column_id){ + var column_start_ind = this.getColumnIndex(column_id); + var column_end_ind = this.getColumnIndex(end_column_id); + + if (column_start_ind>column_end_ind){ + var temp = column_start_ind; + column_start_ind = column_end_ind; + column_end_ind = temp; + } + + this._silent_selection = true; + for (var i=column_start_ind; i<=column_end_ind; i++) + this.select(this.columnId(i),true); + this._silent_selection = false; + + this._render_header_and_footer(); + this._finalize_select(); + } + } + } +}); + + + + + +webix.extend(webix.ui.datatable, { + blockselect_setter:function(value){ + if (value && this._block_sel_flag){ + webix.event(this._viewobj, "mousemove", this._bs_move, this); + webix.event(this._viewobj, "mousedown", this._bs_down, this); + webix.event(document.body, "mouseup", this._bs_up, this); + this._block_sel_flag = this._bs_ready = this._bs_progress = false; + } + return value; + }, + _block_sel_flag:true, + _childOf:function(e, tag){ + var src = e.target||e.srcElement; + while (src){ + if (src.getAttribute && src.getAttribute("webixignore")) return false; + if (src == tag) + return true; + src = src.parentNode; + } + return false; + }, + _bs_down:function(e){ + if (this._childOf(e, this._body)){ + this._bs_position = webix.html.offset(this._body); + var pos = webix.html.pos(e); + this._bs_ready = [pos.x - this._bs_position.x, pos.y - this._bs_position.y]; + } + }, + _bs_up:function(){ + if (this._block_panel){ + var start = this._locate_cell_xy.apply(this, this._bs_ready); + var end = this._locate_cell_xy.apply(this, this._bs_progress); + if (start.row && end.row) + this._selectRange(start, end); + this._block_panel = webix.html.remove(this._block_panel); + } + this._bs_ready = this._bs_progress = false; + }, + _bs_start:function(){ + this.clearSelection(); + this._block_panel = webix.html.create("div", {"class":"webix_block_selection"},""); + this._body.appendChild(this._block_panel); + }, + _bs_move:function(e){ + if (this._bs_ready !== false){ + var pos = webix.html.pos(e); + var progress = [pos.x - this._bs_position.x, pos.y - this._bs_position.y]; + + //prevent unnecessary block selection while dbl-clicking + if (Math.abs(this._bs_ready[0] - progress[0]) < 5 && Math.abs(this._bs_ready[1] - progress[1]) < 5) + return; + + if (this._bs_progress === false) + this._bs_start(e); + + this._bs_progress = progress; + this._setBlockPosition(this._bs_ready[0], this._bs_ready[1], this._bs_progress[0], this._bs_progress[1]); + } + }, + _setBlockPosition:function(x1,y1,x2,y2){ + var style = this._block_panel.style; + + var startx = Math.min(x1,x2); + var endx = Math.max(x1,x2); + + var starty = Math.min(y1,y2); + var endy = Math.max(y1,y2); + + style.left = startx+"px"; + style.top = starty+"px"; + style.width = (endx-startx)+"px"; + style.height = (endy-starty)+"px"; + }, + _locate_cell_xy:function(x,y){ + if (this._right_width && x>this._left_width + this._center_width) + x+= this._x_scroll.getSize()-this._center_width-this._left_width-this._right_width; + else if (!this._left_width || x>this._left_width) + x+= this._x_scroll.getScroll(); + + + y += this.getScrollState().y; + + var row = null; + var column = null; + + if (x<0) x=0; + if (y<0) y=0; + + var cols = this._settings.columns; + var rows = this.data.order; + + var summ = 0; + for (var i=0; i=x){ + column = cols[i].id; + break; + } + } + if (!column) + column = cols[cols.length-1].id; + + summ = 0; + if (this._settings.fixedRowHeight){ + row = rows[Math.floor(y/this._settings.rowHeight)]; + } else for (var i=0; i=y){ + row = rows[i]; + break; + } + } + if (!row) + row = rows[rows.length-1]; + + return {row:row, column:column}; + } +}); +webix.protoUI({ + name:"resizearea", + defaults:{ + dir:"x" + }, + $init:function(config){ + var dir = config.dir||"x"; + var node = webix.toNode(config.container); + var size = (dir=="x"?"width":"height"); + var margin = (config.margin? config.margin+"px":0); + + this._key_property = (dir == "x"?"left":"top"); + + this._viewobj = webix.html.create("DIV",{ + "class" : "webix_resize_area webix_dir_"+dir + }); + //[[COMPAT]] FF12 can produce 2 move events + webix.event(this._viewobj, webix.env.mouse.down, webix.html.stopEvent); + + if(margin){ + if(dir=="x") + margin = margin+" 0 "+margin; + else + margin = "0 "+margin+" 0 "+margin; + } + this._dragobj = webix.html.create("DIV",{ + "class" : "webix_resize_handle_"+dir, + "style" : (margin?"padding:"+margin:"") + },"
    "); + + this._originobj = webix.html.create("DIV",{ + "class" : "webix_resize_origin_"+dir + }); + + if(config[size]){ + this._originobj.style[size] = config[size]+(config.border?1:0)+"px"; + this._dragobj.style[size] = config[size]+"px"; + } + if (config.cursor) + this._dragobj.style.cursor = this._originobj.style.cursor = this._viewobj.style.cursor = config.cursor; + this._moveev = webix.event(node, webix.env.mouse.move, this._onmove, this); + this._upev = webix.event(document.body, webix.env.mouse.up, this._onup, this); + + this._dragobj.style[this._key_property] = this._originobj.style[this._key_property] = config.start+"px"; + + node.appendChild(this._viewobj); + node.appendChild(this._dragobj); + node.appendChild(this._originobj); + }, + _onup:function(){ + + this.callEvent("onResizeEnd", [this._last_result]); + + webix.eventRemove(this._moveev); + webix.eventRemove(this._upev); + + webix.html.remove(this._viewobj); + webix.html.remove(this._dragobj); + webix.html.remove(this._originobj); + this._viewobj = this._dragobj = this._originobj = null; + }, + _onmove:function(e){ + var pos = webix.html.pos(e); + this._last_result = (this._settings.dir == "x" ? pos.x : pos.y)+this._settings.start-this._settings.eventPos; + this._dragobj.style[this._key_property] = this._last_result+"px"; + this.callEvent("onResize", [this._last_result]); + } +}, webix.EventSystem, webix.Settings); +webix.extend(webix.ui.datatable, { + + resizeRow_setter:function(value){ + this._settings.scrollAlignY = false; + this._settings.fixedRowHeight = false; + return this.resizeColumn_setter(value); + }, + resizeColumn_setter:function(value){ + if (value && this._rs_init_flag){ + webix.event(this._viewobj, "mousemove", this._rs_move, this); + webix.event(this._viewobj, "mousedown", this._rs_down, this); + webix.event(this._viewobj, "mouseup", this._rs_up, this); + this._rs_init_flag = false; + } + return value; + }, + + _rs_init_flag:true, + + _rs_down:function(e){ + //if mouse was near border + if (!this._rs_ready) return; + this._rs_process = [webix.html.pos(e),this._rs_ready[2]]; + webix.html.denySelect(); + }, + _rs_up:function(){ + this._rs_process = false; + webix.html.allowSelect(); + }, + _rs_start:function(e){ + e = e||event; + if(this._rs_progress) + return; + var dir = this._rs_ready[0]; + var node = this._rs_process[1]; + var obj = this._locate(node); + if (!obj) return; + + var eventPos = this._rs_process[0]; + var start; + + if (dir == "x"){ + start = webix.html.offset(node).x+this._rs_ready[1] - webix.html.offset(this._body).x; + eventPos = eventPos.x; + if (!this._rs_ready[1]) obj.cind-=(node.parentNode.colSpan||1); + } else { + start = webix.html.offset(node).y+this._rs_ready[1] - webix.html.offset(this._body).y+this._header_height; + eventPos = eventPos.y; + if (!this._rs_ready[1]) obj.rind--; + } + if (obj.cind>=0 && obj.rind>=0){ + this._rs_progress = [dir, obj, start]; + + var resize = new webix.ui.resizearea({ + container:this._viewobj, + dir:dir, + eventPos:eventPos, + start:start, + cursor:(dir == "x"?"e":"n")+"-resize" + }); + resize.attachEvent("onResizeEnd", webix.bind(this._rs_end, this)); + } + this._rs_down = this._rs_ready = false; + }, + _rs_end:function(result){ + if (this._rs_progress){ + var dir = this._rs_progress[0]; + var obj = this._rs_progress[1]; + var newsize = result-this._rs_progress[2]; + if (dir == "x"){ + + //in case of right split - different sizing logic applied + if (this._settings.rightSplit && obj.cind+1>=this._rightSplit && + obj.cind !== this._columns.length - 1) + { + obj.cind++; + newsize *= -1; + } + + var oldwidth = this._columns[obj.cind].width; + this._setColumnWidth(obj.cind, oldwidth + newsize); + } + else { + var rid = this.getIdByIndex(obj.rind); + var oldheight = this.getItem(rid).$height||this._settings.rowHeight; + this.setRowHeight(rid, oldheight + newsize); + } + this._rs_up(); + } + this._rs_progress = null; + }, + _rs_move:function(e){ + if (this._rs_ready && this._rs_process) + return this._rs_start(e); + + e = e||event; + var node = e.target||e.srcElement; + var mode = false; //resize ready flag + + if (node.tagName == "TD" || node.tagName == "TABLE") return ; + var element_class = node.className||""; + var in_body = element_class.indexOf("webix_cell")!=-1; + //ignore resize in case of drag-n-drop enabled + if (in_body && this.config.drag) return; + var in_header = element_class.indexOf("webix_hcell")!=-1; + this._rs_ready = false; + + if (in_body || in_header){ + var dx = node.offsetWidth; + var dy = node.offsetHeight; + var pos = webix.html.posRelative(e); + + if (in_body && this._settings.resizeRow){ + if (pos.y<3){ + this._rs_ready = ["y", 0, node]; + mode = "n-resize"; + } else if (dy-pos.y<4){ + this._rs_ready = ["y", dy, node]; + mode = "n-resize"; + } + + } + if (this._settings.resizeColumn){ + if (pos.x<3){ + this._rs_ready = ["x", 0, node]; + mode = "e-resize"; + } else if (dx-pos.x<4){ + this._rs_ready = ["x", dx, node]; + mode = "e-resize"; + } + } + } + + //mark or unmark resizing ready state + if (this._cursor_timer) window.clearTimeout(this._cursor_timer); + this._cursor_timer = webix.delay(this._mark_resize_ready, this, [mode], mode?100:0); + }, + + _mark_resize_ready:function(mode){ + if (this._last_cursor_mode != mode){ + this._last_cursor_mode = mode; + this._viewobj.style.cursor=mode||"default"; + } + } +}); + + +webix.extend(webix.ui.datatable,webix.PagingAbility); + +webix.csv = { + escape:true, + delimiter:{ + rows: "\n", + cols: "\t" + }, + parse:function(text, sep){ + sep = sep||this.delimiter; + if (!this.escape) + return this._split_clip_data(text, sep); + + var lines = text.replace(/\n$/,"").split(sep.rows); + + var i = 0; + while (i < lines.length - 1) { + if (this._substr_count(lines[i], '"') % 2 === 1) { + lines[i] += sep.rows + lines[i + 1]; + delete lines[i + 1]; + i++; + } + i++; + } + var csv = []; + for (i = 0; i < lines.length; i++) { + if (typeof(lines[i]) !== 'undefined') { + var line = lines[i].split(sep.cols); + for (var j = 0; j < line.length; j++) { + if (line[j].indexOf('"') === 0) + line[j] = line[j].substr(1, line[j].length - 2); + line[j] = line[j].replace('""', '"'); + } + csv.push(line); + } + } + return csv; + }, + _split_clip_data: function(text, sep) { + var lines = text.split(sep.rows); + for (var i = 0; i < lines.length; i++) { + lines[i] = lines[i].split(sep.cols); + } + return lines; + }, + /*! counts how many occurances substring in string **/ + _substr_count: function(string, substring) { + var arr = string.split(substring); + return arr.length - 1; + }, + stringify:function(data, sep){ + sep = sep||this.delimiter; + + if (!this.escape){ + for (var i = 0; i < data.length; i++) + data[i] = data[i].join(sep.cols); + return data.join(sep.rows); + } + + var reg = /\n|\"|;|,/; + for (var i = 0; i < data.length; i++) { + for (var j = 0; j < data[i].length; j++) { + if (reg.test(data[i][j])) { + data[i][j] = data[i][j].replace(/"/g, '""'); + data[i][j] = '"' + data[i][j] + '"'; + } + } + data[i] = data[i].join(sep.cols); + } + data = data.join(sep.rows); + return data; + } +}; + +webix.TablePaste = { + clipboard_setter:function(value){ + if (value === true || value === 1) this._settings.clipboard = 'block'; + webix.clipbuffer.init(); + this.attachEvent("onSelectChange",this._sel_to_clip); + this.attachEvent("onPaste", this._clip_to_sel); + + return value; + }, + + _sel_to_clip: function() { + if (!this.getEditor || !this.getEditor()){ + var data = this._get_sel_text(); + webix.clipbuffer.set(data); + webix.UIManager.setFocus(this); + } + }, + + _get_sel_text: function() { + var data = []; + this.mapSelection(function(value, row, col, row_ind, col_ind) { + if (!data[row_ind]) data[row_ind] = []; + data[row_ind].push(value); + return value; + }); + + return webix.csv.stringify(data, this._settings.delimiter); + }, + + _clip_to_sel: function(text) { + if (!webix.isUndefined(this._paste[this._settings.clipboard])) { + var data = webix.csv.parse(text, this._settings.delimiter); + this._paste[this._settings.clipboard].call(this, data); + } + }, + + _paste: { + block: function(data) { + var leftTop = this.mapSelection(null); + if (!leftTop) return; + + // filling cells with data + this.mapCells(leftTop.row, leftTop.column, data.length, null, function(value, row, col, row_ind, col_ind) { + if (data[row_ind] && data[row_ind].length>col_ind) { + return data[row_ind][col_ind]; + } + return value; + }); + this.render(); + }, + + selection: function(data) { + this.mapSelection(function(value, row, col, row_ind, col_ind) { + if (data[row_ind] && data[row_ind].length>col_ind) + return data[row_ind][col_ind]; + return value; + }); + this.render(); + }, + + repeat: function(data) { + this.mapSelection(function(value, row, col, row_ind, col_ind) { + row = data[row_ind%data.length]; + value = row[col_ind%row.length]; + return value; + }); + this.render(); + }, + + custom: function(text) {} + } +}; + +webix.extend(webix.ui.datatable, webix.TablePaste); +/* + Export for webix.ui.datatable +*/ + +(function(){ + + +//public methods +webix.extend(webix.ui.datatable,{ + exportToPDF:function(url, config){ + var xml = _get_export_xml(this, config || {}); + url = url || "http://webix-export.appspot.com/export/pdf"; + _send_export(url, xml); + }, + exportToExcel:function(url, config){ + var xml = _get_export_xml(this, config || {}); + url = url || "http://webix-export.appspot.com/export/excel"; + _send_export(url, xml); + } +}); + + + +function _get_export_xml(grid, config){ + var scheme = _get_export_scheme(grid, config); + var xml = ''; + xml += _get_export_abstract('header', 'head', grid, scheme); + if (grid.config.footer) + xml += _get_export_abstract('footer', 'foot', grid, scheme); + xml += _get_export_data(grid, scheme, config); + xml += ''; + return xml; +} + +function _get_export_abstract(section, tag, grid, scheme){ + var xml = "<" + tag + ">"; + var max = 1; + + // detects the bigger value of header/footer rows + for (var i = 0; i < scheme.length; i++) + if (scheme[i][section] && scheme[i][section].length > max) + max = scheme[i][section].length; + for (var i = 0; i < max; i++) { + xml += ''; + + for (var j = 0; j < scheme.length; j++) { + var column = scheme[j]; + + xml += ']*>/g," "); + xml += ']]>'; + } + xml += ''; + } + xml += ""; + return xml; +} + + +function _get_export_scheme(grid, config){ + var scheme = []; + var allowed = config.columns; + if (config.id) + scheme.push({ id:"id", width:50, header:[{ text:"ID" }], footer:[""] }); + + function add_column(source, config){ + var column = source ? webix.clone(source) : {}; + if (typeof config == "object") + webix.extend(column, config, true); + + scheme.push(column); + } + + if (allowed){ + for (var key in allowed) + add_column(grid.getColumnConfig(key), allowed[key]); + } else { + var cols = grid._settings.columns; + for (var i = 0; i < cols.length; i++) + add_column(cols[i]); + } + return scheme; +} + +function _get_export_data(grid, scheme, config){ + var xml = ''; + + var data = grid.data; + for (var i = 0; i < data.order.length; i++) { + var id = data.order[i]; + var item = data.pull[id]; + if (config.level && config.level != item.$level) continue; + + var level = item.$level ? ' level="' + (item.$level - 1) + '"' : ''; + xml += ''; + for (var j = 0; j < scheme.length; j++){ + var value = grid._getValue(item, scheme[j], i); + xml += ']*>/g,"") : "") + ']]>'; + } + xml += ''; + } + + return xml; +} + +function _send_export(url, xml) { + webix.send(url, { grid_xml : encodeURI(xml) }, null, "_blank"); +} + + +})(); + +if(!webix.storage) + webix.storage = {}; + +webix.storage.local = { + put:function(name, data){ + if(name && window.JSON && window.localStorage){ + window.localStorage.setItem(name, window.JSON.stringify(data)); + } + }, + get:function(name){ + if(name && window.JSON && window.localStorage){ + var json = window.localStorage.getItem(name); + if(!json) + return null; + return webix.DataDriver.json.toObject(json); + }else + return null; + }, + remove:function(name){ + if(name && window.JSON && window.localStorage){ + window.localStorage.removeItem(name); + } + }, + clear:function(){ + window.localStorage.clear(); + } +}; + +webix.storage.session = { + put:function(name, data){ + if(name && window.JSON && window.sessionStorage){ + window.sessionStorage.setItem(name, window.JSON.stringify(data)); + } + }, + get:function(name){ + if(name && window.JSON && window.sessionStorage){ + var json = window.sessionStorage.getItem(name); + if(!json) + return null; + return webix.DataDriver.json.toObject(json); + }else + return null; + }, + remove:function(name){ + if(name && window.JSON && window.sessionStorage){ + window.sessionStorage.removeItem(name); + } + }, + clear:function(){ + window.sessionStorage.clear(); + } +}; + +webix.storage.cookie = { + put:function(name, data, domain, expires ){ + if(name && window.JSON){ + document.cookie = name + "=" + window.JSON.stringify(data) + + (( expires && (expires instanceof Date)) ? ";expires=" + expires.toUTCString() : "" ) + + (( domain ) ? ";domain=" + domain : "" ); + } + }, + _get_cookie:function(check_name){ + // first we'll split this cookie up into name/value pairs + // note: document.cookie only returns name=value, not the other components + var a_all_cookies = document.cookie.split( ';' ); + var a_temp_cookie = ''; + var cookie_name = ''; + var cookie_value = ''; + var b_cookie_found = false; // set boolean t/f default f + + for (var i = 0; i < a_all_cookies.length; i++ ){ + // now we'll split apart each name=value pair + a_temp_cookie = a_all_cookies[i].split( '=' ); + + // and trim left/right whitespace while we're at it + cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, ''); + + // if the extracted name matches passed check_name + if (cookie_name == check_name ){ + b_cookie_found = true; + // we need to handle case where cookie has no value but exists (no = sign, that is): + if ( a_temp_cookie.length > 1 ){ + cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g, '') ); + } + // note that in cases where cookie is initialized but no value, null is returned + return cookie_value; + } + a_temp_cookie = null; + cookie_name = ''; + } + if ( !b_cookie_found ){ + return null; + } + return null; + }, + get:function(name){ + if(name && window.JSON){ + var json = this._get_cookie(name); + if(!json) + return null; + return webix.DataDriver.json.toObject(json); + }else + return null; + }, + remove:function(name, domain){ + if(name && this._get_cookie(name)) + document.cookie = name + "=" + (( domain ) ? ";domain=" + domain : "") + ";expires=Thu, 01-Jan-1970 00:00:01 GMT"; + }, + clear:function(domain){ + var cookies = document.cookie.split(";"); + for (var i = 0; i < cookies.length; i++) + document.cookie = /^[^=]+/.exec(cookies[i])[0] + "=" + (( domain ) ? ";domain=" + domain : "") + ";expires=Thu, 01-Jan-1970 00:00:01 GMT"; + } +}; + +webix.DataState = { + getState:function(){ + var cols_n = this.config.columns.length; + var columns = this.config.columns; + var settings = { + ids:[], + size:[], + select:this.getSelectedId(true), + scroll:this.getScrollState() + }; + for(var i = 0; i < cols_n; i++){ + settings.ids.push(columns[i].id); + settings.size.push(columns[i].width); + } + + if(this._last_sorted){ + settings.sort={ + id:this._last_sorted, + dir:this._last_order + }; + } + if (this._filter_elements) { + var filter = {}; + var any_filter = 0; + for (var key in this._filter_elements) { + if (this._hidden_column_hash[key]) continue; + + var f = this._filter_elements[key]; + f[1].value = filter[key] = f[2].getValue(f[0]); + any_filter = 1; + } + if (any_filter) + settings.filter=filter; + } + + settings.hidden = []; + for (var key in this._hidden_column_hash) + settings.hidden.push(key); + + return settings; + }, + setState:function(obj){ + var columns = this.config.columns; + if(!obj) return; + + this._last_sorted = null; + this.blockEvent(); + + if (obj.hidden){ + var hihash = {}; + for (var i=0; i 1, 0, 0, 1, 0, 0 + var _tmatrix = matrix.replace(/(matrix\()(.*)(\))/gi, "$2"); + // 1, 0, 0, 1, 0, 0 --> 1,0,0,1,0,0 + _tmatrix = _tmatrix.replace(/\s/gi, ""); + _tmatrix = _tmatrix.split(','); + + var tmatrix = {}; + var tkey = ['a', 'b', 'c', 'd', 'e', 'f']; + for(var i=0; i0) return allow?(current + sign*Math.sqrt(delta)):0; + + var max = dx - px; + if (max + value < 0) + return allow?(current - Math.sqrt(-(value-current))):-max; + + // t._fast_correction = false; + return value; + }, + _init_scroll_node:function(node){ + if (!node.scroll_enabled){ + node.scroll_enabled = true; + node.parentNode.style.position="relative"; + var prefix = webix.env.cssPrefix; + node.style.cssText += prefix+"transition: "+prefix+"transform; "+prefix+"user-select:none; "+prefix+"transform-style:flat;"; + node.addEventListener(webix.env.transitionEnd,t._scroll_end,false); + } + }, + _init_scroller:function(delta){ + if (t._scroll_mode.indexOf("x") != -1) + t._scroll[0] = t._create_scroll("x", t._scroll_stat.dx, t._scroll_stat.px, "width"); + if (t._scroll_mode.indexOf("y") != -1) + t._scroll[1] = t._create_scroll("y", t._scroll_stat.dy, t._scroll_stat.py, "height"); + + t._init_scroll_node(t._scroll_node); + window.setTimeout(t._set_scroll_pos,1); + }, + _create_scroll:function(mode, dy, py, dim){ + if (dy - py <2){ + var matrix = t._get_matrix(t._scroll_node); + var e = (mode=="y"?matrix.e:0); + var f = (mode=="y"?0:matrix.f); + if (!t._scroll_master) + t._set_matrix(t._scroll_node, e, f, "0ms"); + t._scroll_mode = t._scroll_mode.replace(mode,""); + return ""; + } + + var scroll = webix.html.create("DIV", { + "class":"webix_scroll_"+mode + },""); + + scroll.style[dim] = Math.max((py*py/dy-7),10) +"px"; + t._scroll_node.parentNode.appendChild(scroll); + + return scroll; + }, + _axis_check:function(value, mode, old){ + if (value > t.config.deltaStep){ + if (t._was_not_moved){ + t._long_move(mode); + t._locate(mode); + if ((t._scroll_mode||"").indexOf(mode) == -1) t._scroll_mode = ""; + } + return false; + } + return old; + }, + _scroll_end:function(){ + //sending event to the owner of the scroll only + var result,state,view; + view = webix.$$(t._scroll_node||this); + if (view){ + if (t._scroll_node) + result = t._get_matrix(t._scroll_node); + else if(view.getScrollState){ + state = view.getScrollState(); + result = {e:state.x, f:state.y}; + } + webix.callEvent("onAfterScroll", [result]); + if (view.callEvent) + view.callEvent("onAfterScroll",[result]); + } + if (!t._scroll_mode){ + webix.html.remove(t._scroll); + t._scroll = [null, null]; + } + t._active_transion = false; + }, + _long_move:function(mode){ + window.clearTimeout(t._long_touch_timer); + t._was_not_moved = false; + }, + _stop_old_scroll:function(e){ + if (t._scroll[0] || t._scroll[1]){ + t._stop_scroll(e, t._scroll[0]?"x":"y"); + }else + return true; + }, + _touchstart :function(e){ + var target = e.target || event.srcElement; + if (t._disabled || (target.tagName&&target.tagName.toLowerCase() == "textarea" && target.offsetHeight0){ + for (var i = 0; i < fill.length; i++) + if (fill[i]){ + var request = Math.min(width, Math.round(width * fill[i]/summ)); + resize = this._setColumnWidth(i, request, true) || resize; + width = width - cols[i].width; + summ = summ - fill[i]; + } + } + + if (resize) + this._updateColsSizeSettings(true); + }, + _getColumnConfigSize:function(ind, headers){ + var d = webix.html.create("DIV",{"class":"webix_view webix_table_cell webix_measure_size webix_cell"},""); + d.style.cssText = "width:1px; visibility:hidden; position:absolute; top:0px; left:0px; overflow:hidden;"; + document.body.appendChild(d); + + var config = this._settings.columns[ind]; + var max = -Infinity; + + //iterator other all loaded data is required + if (headers != "header") + for (var i=0; i= 0){ + var width = this._getColumnConfigSize(ind, headers); + return this._setColumnWidth(ind, width, ignore); + } + }, + adjustColumn:function(id, headers){ + this._adjustColumn(this.getColumnIndex(id), headers); + }, + adjustRowHeight:function(id, silent){ + var config = this.getColumnConfig(id); + var count = this.data.count(); + + var d = webix.html.create("DIV",{"class":"webix_table_cell webix_measure_size webix_cell"},""); + d.style.cssText = "width:"+config.width+"px; height:1px; visibility:hidden; position:absolute; top:0px; left:0px; overflow:hidden;"; + this.$view.appendChild(d); + + this.data.each(function(obj){ + //in case of dyn. mode - this can be undefined + if (obj){ + d.innerHTML = this._getValue(obj, config, 0); + obj.$height = Math.max(d.scrollHeight, this._settings.rowHeight); + } + }, this); + + d = webix.html.remove(d); + if (!silent) + this.refresh(); + } +}); +webix.extend(webix.ui.datatable,{ + + math_setter:function(value){ + if (value) + this._math_init(); + return value; + }, + + _math_pref: '$', + + _math_init: function() { + if(webix.env.strict) return; + + this.data.attachEvent("onStoreUpdated", webix.bind(this._parse_row_math, this)); + this.data.attachEvent("onStoreLoad", webix.bind(this._parse_math, this)); + this.attachEvent("onStructureLoad", this._parse_math); + }, + _parse_row_math:function(id, obj, action){ + if (!id || (action=="delete" || action=="paint")) return; + + if (action == "add") + this._exprs_by_columns(obj); + + for (var i=0; i 0 && value.substr(0, 1) === '=') { + // calculate math value + if ((typeof(item[this._math_pref + col]) === 'undefined') || (_inner_call !== true)) + item[this._math_pref + col] = item[col]; + item[col] = this._calculate(value, row, col); + //this.updateItem(item); + } else { + // just a string + if (typeof(item[this._math_pref + col]) !== 'undefined') + delete item[this._math_pref + col]; + // remove triggers if they were setted earlier + this._remove_old_triggers(row, col); + } + // recalculate depending cells + if (typeof(item.depends) !== 'undefined' && typeof(item.depends[col]) !== 'undefined') { + for (var i in item.depends[col]) { + var name = item.depends[col][i][0] + '__' + item.depends[col][i][1]; + if (typeof(this._math_recalc[name]) === 'undefined') { + this._math_recalc[name] = true; + this._parse_cell_math(item.depends[col][i][0], item.depends[col][i][1], true); + } + } + } + }, + + _set_original_value: function(row, col) { + var item = this.getItem(row); + if (typeof(item[this._math_pref + col]) !== 'undefined') + item[col] = item[this._math_pref + col]; + }, + + _parse_math: function(){ + if (!this._columns || !this.count()) return; + + this._exprs_by_columns(); + + + for (var j = 0; j < this._columns.length; j++){ + var col = this.columnId(j); + this.data.each(function(obj){ + this._parse_cell_math(obj.id, col); + }, this); + } + }, + + _exprs_by_columns: function(row) { + for (var i = 0; i < this._columns.length; i++){ + if (this._columns[i].math) { + var col = this.columnId(i); + var math = '=' + this._columns[i].math; + math = math.replace(/\$r/g, '#$r#'); + math = math.replace(/\$c/g, '#$c#'); + if (row) + row[col] = this._parse_relative_expr(math, row.id, col); + else + this.data.each(function(obj){ + obj[col] = this._parse_relative_expr(math, obj.id, col); + }, this); + } + } + }, + + _parse_relative_expr: function(expr, row, col) { + return (webix.template(expr))({ '$r': row, '$c': col }); + }, + + _get_calc_value: function(row, col) { + var item; + + if (this.exists(row)) + item = this.getItem(row); + else + return '#out_of_range'; + + var value = item[this._math_pref + col] || item[col] || 0; + value = value.toString(); + if (value.substring(0, 1) !== '=') + // it's a string + return value; + else { + // TODO: check if value shouldn't be recalculated + // and return value calculated earlier + + // calculate math expr value right now + if (typeof(item[this._math_pref + col]) === 'undefined') + item[this._math_pref + col] = item[col]; + item[col] = this._calculate(value, row, col, true); + return item[col]; + } + }, + + _calculate: function(value, row, col, _inner_call) { + // add coord in math trace to detect self-references + if (_inner_call === true) { + if (this._in_math_trace(row, col)) + return '#selfreference'; + } else + this._start_math_trace(); + this._to_math_trace(row, col); + + var item = this.getItem(row); + value = value.substring(1); + + // get operations list + var operations = this._get_operations(value); + var triggers = this._get_refs(value); + + if (operations) { + value = this._replace_refs(value, triggers); + value = this._parse_args(value, operations); + } else { + value = this._replace_refs(value, triggers, true); + var triggers = []; + } + + var exc = this._math_exception(value); + if (exc !== false) + return exc; + + // remove from coord from trace when calculations were finished - it's important! + this._from_math_trace(row, col); + + // process triggers to know which cells should be recalculated when one was changed + this._remove_old_triggers(row, col); + for (var i = 0; i < triggers.length; i++) { + this._add_trigger([row, col], triggers[i]); + } + var exc = this._math_exception(value); + if (exc !== false) + return exc; + + // there aren't any operations here. returns number or value of another cell + if (!value) return value; + + // process mathematical expression and getting final result + value = this._compute(value); + var exc = this._math_exception(value); + if (exc !== false) + return exc; + return value; + }, + + _get_operations: function(value) { + // gettings operations list (+-*/) + var splitter = /(\+|\-|\*|\/)/g; + var operations = value.replace(/\[[^)]*?\]/g,"").match(splitter); + return operations; + }, + + /*! gets list of referencies in formula + **/ + _get_refs: function(value) { + var reg = /\[([^\]]+),([^\]]+)\]/g; + var cells = value.match(reg); + if (cells === null) cells = []; + + for (var i = 0; i < cells.length; i++) { + var cell = cells[i]; + var tmp = cell; + cell = cell.substr(1, cell.length - 2); + cell = cell.split(','); + cell[0] = this._trim(cell[0]); + cell[1] = this._trim(cell[1]); + if (cell[0].substr(0, 1) === ':') + cell[0] = this.getIdByIndex(cell[0].substr(1)); + if (cell[1].substr(0, 1) === ':') + cell[1] = this.columnId(cell[1].substr(1)); + cell[2] = tmp; + cells[i] = cell; + } + + return cells; + }, + + // replace given list of references by their values + _replace_refs: function(value, cells, clean) { + var dell = "(", delr = ")"; + if (clean) dell = delr = ""; + for (var i = 0; i < cells.length; i++) { + var cell = cells[i]; + var cell_value = this._get_calc_value(cell[0], cell[1]); + if (isNaN(cell_value)) + cell_value = '"'+cell_value+'"'; + value = value.replace(cell[2], dell + cell_value + delr); + } + return value; + }, + + _parse_args: function(value, operations) { + var args = []; + for (var i = 0; i < operations.length; i++) { + var op = operations[i]; + var temp = this._split_by(value, op); + args.push(temp[0]); + value = temp[1]; + } + args.push(value); + + //var reg = /^(-?\d|\.|\(|\))+$/; + for (var i = 0; i < args.length; i++) { + var arg = this._trim(args[i]); + // if (reg.test(arg) === false) + // return ''; //error + args[i] = arg; + } + + var expr = ""; + for (var i = 0; i < args.length - 1; i++) { + expr += args[i] + operations[i]; + } + expr += args[args.length - 1]; + return expr; + }, + + _compute: function(expr) { + try { + webix.temp_value = ''; + expr = 'webix.temp_value = ' + expr; + eval(expr); + } catch(ex) { + webix.assert(false,"Math error in datatable
    "+expr); + webix.temp_value = ''; + } + var result = webix.temp_value; + webix.temp_value = null; + return result.toString(); + }, + + _split_by: function(value, splitter) { + var pos = value.indexOf(splitter); + var before = value.substr(0, pos); + var after = value.substr(pos + 1); + return [before, after]; + }, + + _trim: function(value) { + value = value.replace(/^ */g, ''); + value = value.replace(/ *$/g, ''); + return value; + }, + + _start_math_trace: function() { + this._math_trace = []; + }, + _to_math_trace: function(row, col) { + this._math_trace[row + '__' + col] = true; + }, + _from_math_trace: function(row, col) { + if (typeof(this._math_trace[row + '__' + col]) !== 'undefined') + delete this._math_trace[row + '__' + col]; + }, + _in_math_trace: function(row, col) { + if (typeof(this._math_trace[row + '__' + col]) !== 'undefined') + return true; + else + return false; + }, + + _add_trigger: function(depends, from) { + var item = this.getItem(from[0]); + if (typeof(item.depends) === 'undefined') + item.depends = {}; + if (typeof(item.depends[from[1]]) === 'undefined') + item.depends[from[1]] = {}; + item.depends[from[1]][depends[0] + '__' + depends[1]] = depends; + + item = this.getItem(depends[0]); + if (typeof(item.triggers) === 'undefined') + item.triggers = {}; + if (typeof(item.triggers[depends[1]]) === 'undefined') + item.triggers[depends[1]] = {}; + item.triggers[depends[1]][from[0] + '__' + from[1]] = from; + }, + + _remove_old_triggers: function(row, col) { + if (!this.exists(row, col)) return; + var item = this.getItem(row, col); + if (typeof(item.triggers) === 'undefined') return; + for (var i in item.triggers[col]) { + var depend = item.triggers[col][i]; + delete this.getItem(depend[0]).depends[depend[1]][row + '__' + col]; + } + }, + + // check if exception syntax exists and returns exception text or false + _math_exception: function(value) { + var reg = /#\w+/; + var match = value.match(reg); + if (match !== null && match.length > 0) + return match[0]; + return false; + } + +}); + + + + +webix.extend(webix.ui.datatable, { + + ///////////////////////// + // edit start // + ///////////////////////// + _get_editor_type:function(id){ + return this.getColumnConfig(id.column).editor; + }, + getEditor:function(row, column){ + if (!row) + return this._last_editor; + + if (arguments.length == 1){ + column = row.column; + row = row.row; + } + + return ((this._editors[row]||{})[column]); + }, + _for_each_editor:function(handler){ + for (var row in this._editors){ + var row_editors = this._editors[row]; + for (var column in row_editors) + if (column!="$count") + handler.call(this, row_editors[column]); + } + }, + _init_editor:function(id, type, show){ + var row = id.row; + var column = id.column; + var col_settings = type.config = this.getColumnConfig(column); + //show it over cell + if (show !== false) + this.showCell(row, column); + + var node = type.render(); + + if (type.$inline) + node = this._locateInput(id); + type.node = node; + + var item = this.getItem(row); + var format = col_settings.editFormat; + + var value; + if (this._settings.editMath) + value = item["$"+column]; + value = value || item[column]; + + if (webix.isUndefined(value)) + value=""; + + type.setValue(format?format(value):value, item); + type.value = item[column]; + this._addEditor(id, type); + + if (!type.$inline) + this._sizeToCell(id, node, true); + + if (type.afterRender) + type.afterRender(); + + if (this._settings.liveValidation){ + webix.event(type.node, "keyup", this._bind_live_validation(id, this)); + this.validateEditor(id); + } + + return node; + }, + _bind_live_validation:function(id, that){ + return function(){ + that.validateEditor(id); + }; + }, + _set_new_value:function(editor, new_value){ + var parser = this.getColumnConfig(editor.column).editParse; + var item = this.getItem(editor.row); + + item[editor.column] = parser?parser(new_value):new_value; + if (this._settings.editMath) + delete item["$"+editor.column]; + return editor.row; + }, + //register editor in collection + _addEditor:function(id, type, node){ + var row_editors = this._editors[id.row]=this._editors[id.row]||{}; + + row_editors.$count = (row_editors.$count||0)+1; + + type.row = id.row; type.column = id.column; + this._last_editor = row_editors[id.column] = type; + + this._in_edit_mode++; + this._last_editor_scroll = this.getScrollState(); + }, + _removeEditor:function(editor){ + if (this._last_editor == editor) + this._last_editor = 0; + + if (editor.destroy) + editor.destroy(); + + var row = this._editors[editor.row]; + delete row[editor.column]; + row.$count -- ; + if (!row.$count) + delete this._editors[editor.row]; + this._in_edit_mode--; + }, + _changeEditorId:function(oldid, newid) { + var editor = this._editors[oldid]; + if (editor){ + this._editors[newid] = editor; + delete this._editors[oldid]; + for (var key in editor) + editor[key].row = newid; + } + }, + + //get html cell by combined id + _locate_cell:function(id){ + var config = this.getColumnConfig(id.column); + if (config && config.node && config.attached){ + var index = this.getIndexById(id.row); + if (index >= config._yr0 && index< config._yr1) + return config.node.childNodes[index-config._yr0]; + } + return 0; + }, + + + ///////////////////////// + // public methods // + ///////////////////////// + editCell:function(row, column, preserve, show){ + column = column || this._settings.columns[0].id; + return webix.EditAbility.edit.call(this, {row:row, column:column}, preserve, show); + }, + editRow:function(id, focus){ + if (id && id.row) + id = id.row; + + var next = false; + this.eachColumn(function(column){ + this.edit({ row:id, column:column}, next, !next); + next = true; + }); + }, + editColumn:function(id, focus){ + if (id && id.column) + id = id.column; + + var next = false; + this.eachRow(function(row){ + this.edit({row:row, column:id}, next, !next); + next = true; + }); + }, + eachRow:function(handler, all){ + var order = this.data.order; + if (all) + order = this.data._filter_order || order; + + for (var i=0; i=0; i--){ + for (var j=column-1; j>=0; j--){ + var id = { row:order[i], column:cols[j].id}; + if (check.call(this, id)) + return id; + } + column = cols.length; + } + } + + return null; + }, + + + ///////////////////////////// + // scroll correction // + ///////////////////////////// + _correct_after_focus_y:function(){ + if (this._in_edit_mode){ + if (this._ignore_after_focus_scroll) + this._ignore_after_focus_scroll = false; + else { + this._y_scroll.scrollTo(this.getScrollState().y+this._body.childNodes[1].firstChild.scrollTop); + this._body.childNodes[1].firstChild.scrollTop = 0; + this._ignore_after_focus_scroll = true; + } + } + }, + _correct_after_focus_x:function(){ + if (this._in_edit_mode){ + this._x_scroll.scrollTo(this._body.childNodes[1].scrollLeft); + } + }, + _component_specific_edit_init:function(){ + this.attachEvent("onScrollY", this._update_editor_y_pos); + this.attachEvent("onScrollX", this._update_editor_y_pos); + this.attachEvent("onScrollY", this._refocus_inline_editor); + this.attachEvent("onColumnResize", function(){ this.editStop(); }); + this.attachEvent("onAfterFilter", function(){ this.editStop(); }); + this.attachEvent("onRowResize", function(){ this.editStop(); }); + this._body.childNodes[1].firstChild.onscroll = webix.bind(this._correct_after_focus_y, this); + this._body.childNodes[1].onscroll = webix.bind(this._correct_after_focus_x, this); + }, + _update_editor_y_pos:function(){ + if (this._in_edit_mode){ + var old = this._last_editor_scroll; + this._last_editor_scroll = this.getScrollState(); + + var diff = this._last_editor_scroll.y - old.y; + this._for_each_editor(function(editor){ + if (editor.getPopup){ + var node = this.getItemNode(editor); + if (node) + editor.getPopup().show(node); + else + editor.getPopup().show({ x:-10000, y:-10000 }); + } else if (!editor.$inline){ + editor.node.top -= diff; + editor.node.style.top = editor.node.top + "px"; + } + }); + } + } + +}); + +webix.extend(webix.ui.datatable, webix.EditAbility); +webix.extend(webix.ui.datatable, { + $init:function(){ + this._hidden_column_hash = {}; + this._hidden_column_order = []; + this._hidden_split=[0,0]; + + this.attachEvent("onStructureLoad", this._hideInitialColumns); + }, + _hideInitialColumns:function(){ + var cols = this._columns; + for (var i = cols.length-1; i>=0; i--){ + if (cols[i].hidden) + this.hideColumn(cols[i].id, true, true); + else if (cols[i].batch && this.config.visibleBatch && cols[i].batch!=this.config.visibleBatch){ + this.hideColumn(cols[i].id, true, true); + } + } + + }, + moveColumn:function(id, index){ + var start_index = this.getColumnIndex(id); + if (start_index == index) return; //already in place + var columns = this._settings.columns; + + var start = columns.splice(start_index,1); + var pos = index - (index>start_index?1:0); + webix.PowerArray.insertAt.call(columns, start[0], pos); + + //TODO: split handling + //we can move split line when column dropped after it + + this._refresh_columns(); + }, + isColumnVisible:function(id){ + return !this._hidden_column_hash[id]; + }, + hideColumn:function(id, mode, silent){ + var cols = this._settings.columns; + var horder = this._hidden_column_order; + var hhash = this._hidden_column_hash; + + if (mode!==false){ + var index = this.getColumnIndex(id); + webix.assert(index != -1, "hideColumn: invalid ID or already hidden"); + + //in case of second call to hide the same column, command will be ignored + if (index == -1) return; + + if (!horder.length){ + for (var i=0; i=this._rightSplit) + this._settings.rightSplit--; + else + this._rightSplit--; + + this._fixColspansHidden(index, cols[index], 0); + this._hideColumn(index); + var column = hhash[id] = cols.splice(index, 1)[0]; + column._yr0 = -1; + + delete this._columns_pull[id]; + } else { + var column = hhash[id]; + webix.assert(column, "showColumn: invalid ID or already visible"); + + //in case of second show command for already visible column - ignoring + if (!column) return; + + var prev = null; + var i = 0; + for (; i=this._hidden_split[1]) + this._settings.rightSplit++; + else + this._rightSplit++; + + delete hhash[id]; + this._columns_pull[id] = column; + } + if (!silent) + this._refresh_columns(); + }, + _fixColspansHidden:function(ind, config, mod){ + for (var i = config.header.length - 1; i >= 0; i--) { + if (config.header[i] === null){ + for (var j = ind; j >= 0; j--) { + var prev = this._columns[j]; + if (prev.header[i] !== null){ + if (prev.header[i].colspan + mod > ind - j) + prev.header[i].colspan -= mod ? -1 : 1; + break; + } + } + } else if (config.header[i].colspan && mod === 0) + config.header[i].colspan = 1; + } + }, + refreshColumns:function(columns){ + this._columns_pull = {}; + //clear rendered data + for (var i=0; i=0){ + var row = t[index].row; + var column = t[index].column; + var preserve = this._settings.multiselect ? shift : false; + + if (mode == "top" || mode == "bottom") { + if (row) { + // first/last row setting + if (mode == "top") + row = this.data.getFirstId(); + else if (mode == "bottom") + row = this.data.getLastId(); + } + if (column) { + // first/last column setting + var index = 0; + if (mode == "bottom") + index = this.config.columns.length-1; + column = this.columnId(index); + } + } else if (mode == "up" || mode== "down" || mode == "pgup" || mode == "pgdown"){ + if (row){ + //it seems row's can be seleted + var index = this.getIndexById(row); + var step = (mode == "pgup" || mode == "pgdown") ? Math.round(this._dtable_offset_height/this._settings.rowHeight) : 1; + //get new selection row + if (mode == "up" || mode == "pgup") index-=step; + else if (mode == "down" || mode == "pgdown") index+=step; + //check that we in valid row range + if (index <0) index=0; + if (index >=this.data.order.length) index=this.data.order.length-1; + + row = this.getIdByIndex(index); + } + } else if (mode == "right" || mode == "left"){ + if (column && this.config.select != "row"){ + //it seems column's can be selected + var index = this.getColumnIndex(column); + //get new selected column + if (mode == "right") index++; + else if (mode == "left") index--; + //check that result column index is in valid range + if (index<0 || index>=this.config.columns.length) return; + + column = this.columnId(index); + } else if (this.open && mode == "right"){ + return this.open(row); + } else if (this.close && mode == "left"){ + return this.close(row); + } + } else { + webix.assert(false, "Not supported selection moving mode"); + return; + } + + this.showCell(row, column); + this._select({ row:row, column:column }, preserve); + } + + return false; + } +}); +webix.extend(webix.ui.datatable, webix.KeysNavigation); + + + + +webix.extend(webix.ui.datatable,webix.DataMove); +webix.extend(webix.ui.datatable, { + $dragHTML:function(item, e){ + var width = this._content_width - this._scrollSizeY; + var html="
    "; + var cols = this._settings.columns; + for (var i=0; i"+value+"
    "; + } + return html+"
    "; + }, + getHeaderNode:function(column_id, row_index){ + var ind = this.getColumnIndex(column_id); + row_index = row_index || 0; + var nodes = this._header.childNodes[1].getElementsByTagName("TR")[row_index+1].childNodes; + for (var i=0; i state[1]) return; + + //get visible column + var x_range = this._get_x_range(); + var colindex = this._settings.leftSplit ? 0 : x_range[0]; + if (id.column){ + colindex = this.getColumnIndex(id.column); + //column not visible + if (colindex < this._rightSplit && colindex >= this._settings.leftSplit && ( colindex x_range[1])) + return; + } + + var column = this._settings.columns[colindex]; + if (column.attached && column.node) + return column.node.childNodes[rowindex-state[0]]; + } + }, + _translate_id:function(obj, mode){ + if (obj && (!obj.header || !mode)) + return this.data.order[obj.rind]; + return 0; + }, + dragColumn_setter:function(value){ + var control; //will be defined below + if (value == "order"){ + control = { + $drag:webix.bind(function(s,e){ + var id = this.locate(e); + if (!id || !this.callEvent("onBeforeColumnDrag", [id.column, e])) return false; + webix.DragControl._drag_context = { from:control, start:id, custom:"column_dnd" }; + + var column = this.getColumnConfig(id.column); + + this._relative_column_drag = webix.html.posRelative(e); + this._limit_column_drag = column.width; + + return "
    "+(column.header[0].text||" ")+"
    "; + }, this), + $dragPos:webix.bind(function(pos, e, node){ + var context = webix.DragControl.getContext(); + var box = webix.html.offset(this.$view); + node.style.display = 'none'; + var html = document.elementFromPoint(pos.x, box.y+1); + + var id = (html?this.locate(html):null); + + var start = webix.DragControl.getContext().start.column; + if (id && id.column != start && (!this._column_dnd_temp_block || id.column != this._last_sort_dnd_node )){ + //ignore normal dnd , and dnd from other components + if (context.custom == "column_dnd" && webix.$$(html) == this){ + if (!this.callEvent("onBeforeColumnDropOrder",[start, id.column,e])) return; + + var start_index = this.getColumnIndex(start); + var end_index = this.getColumnIndex(id.column); + + //on touch devices we need to preserve drag-start element till the end of dnd + if(e.touches){ + this._dragTarget = e.target; + this._dragTarget.style.display = "none"; + this.$view.parentNode.appendChild(this._dragTarget); + } + + this.moveColumn(start, end_index+(start_index max) + pos.x = max; + } + webix.DragControl._skip = true; + + }, this), + $dragDestroy:webix.bind(function(a, node){ + webix.html.remove(node); + //clean dnd source element + if(this._dragTarget) + webix.html.remove(this._dragTarget); + var id = webix.DragControl.getContext().start; + this.callEvent("onAfterColumnDropOrder",[id.column, this._last_sort_dnd_node, a]); + }, this) + }; + } else if (value) { + control = { + _inner_drag_only:true, + $drag:webix.bind(function(s,e){ + var id = this.locate(e); + if (!id || !this.callEvent("onBeforeColumnDrag", [id.column, e])) return false; + webix.DragControl._drag_context = { from:control, start:id, custom:"column_dnd" }; + + var header = this.getColumnConfig(id.column).header; + var text = " "; + for (var i = 0; i < header.length; i++) + if (header[i]){ + text = header[i].text; + break; + } + + return "
    "+text+"
    "; + }, this), + $drop:webix.bind(function(s,t,e){ + var target = e; + //on touch devices event doesn't point to the actual drop target + if(e.touches && this._drag_column_last) + target = this._drag_column_last; + + var id = this.locate(target); + + if (!id) return false; + var start = webix.DragControl.getContext().start.column; + if (start != id.column){ + if (!this.callEvent("onBeforeColumnDrop",[start, id.column ,e])) return; + var start_index = this.getColumnIndex(start); + var end_index = this.getColumnIndex(id.column); + + this.moveColumn(start, end_index+(start_index
    "; + else + return webix.TreeType.checkbox.apply(this, arguments); + }; + + this.data.provideApi(this,true); + + }, + _drag_order_complex:false, + _unwrap_id:function(original){ + return function (e,id){ + id = id.row; + return original.call(this,e,id); + }; + }, + getState:function(){ + var state = webix.DataState.getState.call(this); + webix.extend(state, webix.TreeAPI.getState.call(this)); + return state; + }, + setState:function(state){ + if (webix.TreeAPI.setState.call(this, state)){ + //run grid-state only when tree component was fully loaded + webix.DataState.setState.call(this, state); + } + }, + clipboard_setter: function(value) { + webix.extend(this._paste, webix.TreeTablePaste); + return webix.TablePaste.clipboard_setter.call(this, value); + } +}, webix.TreeAPI, webix.TreeStateCheckbox, webix.TreeDataLoader, webix.ui.datatable); + + + + + +webix.Canvas = webix.proto({ + $init:function(container){ + this._canvas_labels = []; + this._canvas_name = container.name; + this._obj = webix.toNode(container.container||container); + var width = container.width*(window.devicePixelRatio||1); + var height = container.height*(window.devicePixelRatio||1); + var style = container.style||""; + style += ";width:"+container.width+"px;height:"+container.height+"px;"; + this._prepareCanvas(container.name, style ,width, height); + }, + _prepareCanvas:function(name,style,x,y){ + //canvas has the same size as master object + this._canvas = webix.html.create("canvas",{ width:x, height:y, canvas_id:name, style:(style||"")}); + this._obj.appendChild(this._canvas); + //use excanvas in IE + if (!this._canvas.getContext){ + if (webix.env.isIE){ + webix.require("legacy/excanvas/excanvas.js"); //sync loading + G_vmlCanvasManager.init_(document); + G_vmlCanvasManager.initElement(this._canvas); + } else //some other not supported browser + webix.assert(this._canvas.getContext,"Canvas is not supported in the browser"); + } + return this._canvas; + }, + getCanvas:function(context){ + var ctx = (this._canvas||this._prepareCanvas(this._contentobj)).getContext(context||"2d"); + if(!this._webixDevicePixelRatio){ + this._webixDevicePixelRatio = true; + ctx.scale(window.devicePixelRatio||1, window.devicePixelRatio||1); + } + return ctx; + }, + _resizeCanvas:function(x, y){ + if (this._canvas){ + this._canvas.setAttribute("width", x*(window.devicePixelRatio||1)); + this._canvas.setAttribute("height", y*(window.devicePixelRatio||1)); + this._canvas.style.width = x+"px"; + this._canvas.style.height = y+"px"; + this._webixDevicePixelRatio = false; + } + }, + renderText:function(x,y,text,css,w){ + if (!text) return; //ignore empty text + if (w) w = Math.max(w,0); + if (y) y = Math.max(y,0); + var t = webix.html.create("DIV",{ + "class":"webix_canvas_text"+(css?(" "+css):""), + "style":"left:"+x+"px; top:"+y+"px;" + },text); + this._obj.appendChild(t); + this._canvas_labels.push(t); //destructor? + if (w) + t.style.width = w+"px"; + return t; + }, + renderTextAt:function(valign,align, x,y,t,c,w){ + var text=this.renderText.call(this,x,y,t,c,w); + if (text){ + if (valign){ + if(valign == "middle") + text.style.top = parseInt(y-text.offsetHeight/2,10) + "px"; + else + text.style.top = y-text.offsetHeight + "px"; + } + if (align){ + if(align == "left") + text.style.left = x-text.offsetWidth + "px"; + else + text.style.left = parseInt(x-text.offsetWidth/2,10) + "px"; + } + } + return text; + }, + clearCanvas:function(skipMap){ + var areas=[], i; + + for(i=0; i < this._canvas_labels.length;i++) + this._obj.removeChild(this._canvas_labels[i]); + this._canvas_labels = []; + + if (!skipMap&&this._obj._htmlmap){ + + //areas that correspond this canvas layer + areas = this._getMapAreas(); + + //removes areas of this canvas + while(areas.length){ + areas[0].parentNode.removeChild(areas[0]); + areas.splice(0,1); + } + areas = null; + + //removes _htmlmap object if all its child nodes are removed + if(!this._obj._htmlmap.getElementsByTagName("AREA").length){ + this._obj._htmlmap.parentNode.removeChild(this._obj._htmlmap); + this._obj._htmlmap = null; + } + + } + //FF breaks, when we are using clear canvas and call clearRect without parameters + this.getCanvas().clearRect(0,0,this._canvas.offsetWidth, this._canvas.offsetHeight); + }, + toggleCanvas:function(){ + this._toggleCanvas(this._canvas.style.display=="none"); + }, + showCanvas:function(){ + this._toggleCanvas(true); + }, + hideCanvas:function(){ + this._toggleCanvas(false); + }, + _toggleCanvas:function(show){ + var areas, i; + + for(i=0; i < this._canvas_labels.length;i++) + this._canvas_labels[i].style.display = (show?"":"none"); + + if (this._obj._htmlmap){ + areas = this._getMapAreas(); + for( i = 0; i < areas.length; i++){ + if(show) + areas[i].removeAttribute("disabled"); + else + areas[i].setAttribute("disabled","true"); + } + } + //FF breaks, when we are using clear canvas and call clearRect without parameters + this._canvas.style.display = (show?"":"none"); + }, + _getMapAreas:function(){ + var res = [], areas, i; + + areas = this._obj._htmlmap.getElementsByTagName("AREA"); + + for(i = 0; i < areas.length; i++){ + if(areas[i].getAttribute("userdata") == this._canvas_name){ + res.push(areas[i]); + } + } + + return res; + } +}); + + + + + + + +webix.color = { + _toHex:["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"], + toHex:function(number, length){ + number=parseInt(number,10); + var str = ""; + while (number>0){ + str=this._toHex[number%16]+str; + number=Math.floor(number/16); + } + while (str.length 255) + r = 0; + if (g < 0 || g > 255) + g = 0; + if (b < 0 || b > 255) + b = 0; + return [r,g,b]; + }, + hsvToRgb:function(h, s, v){ + var hi,f,p,q,t,r,g,b; + hi = Math.floor((h/60))%6; + f = h/60-hi; + p = v*(1-s); + q = v*(1-f*s); + t = v*(1-(1-f)*s); + r = 0; + g = 0; + b = 0; + switch(hi) { + case 0: + r = v; g = t; b = p; + break; + case 1: + r = q; g = v; b = p; + break; + case 2: + r = p; g = v; b = t; + break; + case 3: + r = p; g = q; b = v; + break; + case 4: + r = t; g = p; b = v; + break; + case 5: + r = v; g = p; b = q; + break; + default: + break; + } + r = Math.floor(r*255); + g = Math.floor(g*255); + b = Math.floor(b*255); + return [r, g, b]; + }, + rgbToHsv:function(r, g, b){ + var r0,g0,b0,min0,max0,s,h,v; + r0 = r/255; + g0 = g/255; + b0 = b/255; + min0 = Math.min(r0, g0, b0); + max0 = Math.max(r0, g0, b0); + h = 0; + s = max0===0?0:(1-min0/max0); + v = max0; + if (max0 == min0) { + h = 0; + } else if (max0 == r0 && g0>=b0) { + h = 60*(g0 - b0)/(max0 - min0)+0; + } else if (max0 == r0 && g0 < b0) { + h = 60*(g0 - b0)/(max0 - min0)+360; + } else if (max0 == g0) { + h = 60*(b0 - r0)/(max0-min0)+120; + } else if (max0 == b0) { + h = 60*(r0 - g0)/(max0 - min0)+240; + } + return [h, s, v]; + } +}; + + + + + + +webix.HtmlMap = webix.proto({ + $init:function(key){ + this._id = "map_"+webix.uid(); + this._key = key; + this._map = []; + }, + addRect: function(id,points,userdata) { + this._createMapArea(id,"RECT",points,userdata); + }, + addPoly: function(id,points,userdata) { + this._createMapArea(id,"POLY",points,userdata); + }, + _createMapArea:function(id,shape,coords,userdata){ + var extra_data = ""; + if(arguments.length==4) + extra_data = "userdata='"+userdata+"'"; + this._map.push(""); + }, + addSector:function(id,alpha0,alpha1,x,y,R,ky,userdata){ + var points = []; + points.push(x); + points.push(Math.floor(y*ky)); + for(var i = alpha0; i < alpha1; i+=Math.PI/18){ + points.push(Math.floor(x+R*Math.cos(i))); + points.push(Math.floor((y+R*Math.sin(i))*ky)); + } + points.push(Math.floor(x+R*Math.cos(alpha1))); + points.push(Math.floor((y+R*Math.sin(alpha1))*ky)); + points.push(x); + points.push(Math.floor(y*ky)); + + return this.addPoly(id,points,userdata); + }, + render:function(obj){ + var d = webix.html.create("DIV"); + d.style.cssText="position:absolute; width:100%; height:100%; top:0px; left:0px;"; + obj.appendChild(d); + var src = webix.env.isIE?"":"src='data:image/gif;base64,R0lGODlhEgASAIAAAP///////yH5BAUUAAEALAAAAAASABIAAAIPjI+py+0Po5y02ouz3pwXADs='"; + d.innerHTML=""+this._map.join("\n")+""; + + obj._htmlmap = d; //for clearing routine + + this._map = []; + } +}); + + + +webix.protoUI({ + name:"chart", + $init:function(config){ + this._series = [this._settings]; + this._legend_labels = []; + this._contentobj.className += " webix_chart"; + this.$ready.push(this._after_init_call); + /*preset*/ + if(config.preset){ + this._definePreset(config); + } + + //this.attachEvent("onLocateData", this._switchSerie); + this.attachEvent("onMouseMove",this._switchSerie); + + this.data.provideApi(this, true); + }, + _after_init_call:function(){ + this.data.attachEvent("onStoreUpdated",webix.bind(function(){ + this.render(); + },this)); + }, + defaults:{ + color:"RAINBOW", + alpha:"1", + label:false, + value:"{obj.value}", + padding:{}, + type:"pie", + lineColor:"#ffffff", + cant:0.5, + barWidth: 30, + line:{ + width:2, + color:"#1293f8" + }, + item:{ + radius:3, + borderColor:"#636363", + borderWidth:1, + color: "#ffffff", + alpha:1, + type:"r", + shadow:false + }, + shadow:true, + gradient:false, + border:true, + labelOffset: 20, + origin:"auto", + scale: "linear" + }, + _id:"webix_area_id", + on_click:{ + webix_chart_legend_item: function(e,id,obj){ + var series = obj.getAttribute("series_id"); + if(this.callEvent("onLegendClick",[e,series,obj])){ + var config = this._settings; + var values = config.legend.values; + var toggle = (values&&values[series].toggle)||config.legend.toggle; + if((typeof series != "undefined")&&this._series.length>1){ + // hide action + if(toggle){ + if(obj.className.indexOf("hidden")!=-1){ + this.showSeries(series); + } + else{ + this.hideSeries(series); + } + } + } + } + } + }, + on_dblclick:{ + }, + on_mouse_move:{ + }, + locate: function(e){ + return webix.html.locate(e,this._id); + }, + $setSize:function(x,y){ + if(webix.ui.view.prototype.$setSize.call(this,x,y)){ + for(var c in this.canvases){ + this.canvases[c]._resizeCanvas(this._content_width, this._content_height); + } + this.render(); + } + }, + type_setter:function(val){ + webix.assert(this["$render_"+val], "Chart type is not supported, or extension is not loaded: "+val); + + if (typeof this._settings.offset == "undefined"){ + this._settings.offset = !(val == "area" || val == "stackedArea"); + } + + if(val=="radar"&&!this._settings.yAxis) + this.define("yAxis",{}); + if(val=="scatter"){ + if(!this._settings.yAxis) + this.define("yAxis",{}); + if(!this._settings.xAxis) + this.define("xAxis",{}); + } + + + return val; + }, + removeAllSeries: function(){ + this.clearCanvas(); + if(this._legendObj){ + this._legendObj.innerHTML = ""; + this._legendObj.parentNode.removeChild(this._legendObj); + this._legendObj = null; + } + if(this.canvases){ + this.canvases = {}; + } + this._contentobj.innerHTML=""; + for(var i = 0; i < this._series.length; i++){ + if(this._series[i].tooltip) + this._series[i].tooltip.destructor(); + } + // this.callEvent("onDestruct",[]); + this._series = []; + }, + clearCanvas:function(){ + if(this.canvases&&typeof this.canvases == "object") + for(var c in this.canvases){ + this.canvases[c].clearCanvas(); + } + }, + render:function(){ + var bounds, i, data, map, temp; + if (!this.isVisible(this._settings.id)) + return; + + if (!this.callEvent("onBeforeRender",[this.data])) + return; + if(this.canvases&&typeof this.canvases == "object"){ + for(i in this.canvases){ + this.canvases[i].clearCanvas(); + } + } + else + this.canvases = {}; + /*if(this._legendObj){ + for(i=0; i < this._legend_labels.length;i++) + this._legendObj.removeChild(this._legend_labels[i]); + } + this._legend_labels = []; + */ + + if(this._settings.legend){ + if(!this.canvases["legend"]) + this.canvases["legend"] = this._createCanvas("legend"); + this._drawLegend( + this.data.getRange(), + this._content_width, + this._content_height + ); + } + bounds = this._getChartBounds(this._content_width,this._content_height); + map = new webix.HtmlMap(this._id); + temp = this._settings; + + if(this._series){ + data = this._getChartData(); + + for(i=0; i < this._series.length;i++){ + this._settings = this._series[i]; + if(!this.canvases[i]) + this.canvases[i] = this._createCanvas(i,"z-index:"+(2+i)); + this["$render_"+this._settings.type]( + this.canvases[i].getCanvas(), + data, + bounds.start, + bounds.end, + i, + map + ); + } + } + + map.render(this._contentobj); + this._contentobj.lastChild.style.zIndex = 100; + this._applyBounds(this._contentobj.lastChild,bounds); + this.callEvent("onAfterRender",[]); + this._settings = temp; + }, + _applyBounds: function(elem,bounds){ + var style = {}; + style.left = bounds.start.x; + style.top = bounds.start.y; + style.width = bounds.end.x-bounds.start.x; + style.height = bounds.end.y - bounds.start.y; + for(var prop in style){ + elem.style[prop] = style[prop]+"px"; + } + }, + _getChartData: function(){ + var axis, axisConfig ,config, data, i, newData, + start, units, value, valuesHash; + data = this.data.getRange(); + axis = (this._settings.type.toLowerCase().indexOf("barh")!=-1?"yAxis":"xAxis"); + axisConfig = this._settings[axis]; + if(axisConfig&&axisConfig.units&&(typeof axisConfig.units == "object")){ + config = axisConfig.units; + units = []; + if(typeof config.start != "undefined"&&typeof config.end != "undefined" && typeof config.next != "undefined"){ + start = config.start; + while(start<=config.end){ + units.push(start); + start = config.next.call(this,start); + } + } + else if(Object.prototype.toString.call(config) === '[object Array]'){ + units = config; + } + newData = []; + if(units.length){ + value = axisConfig.value; + valuesHash = {}; + for(i=0;i < data.length;i++){ + valuesHash[value(data[i])] = i; + } + for(i=0;i< units.length;i++){ + if(typeof valuesHash[units[i]]!= "undefined"){ + data[valuesHash[units[i]]].$unit = units[i]; + newData.push(data[valuesHash[units[i]]]); + } + else{ + newData.push({$unit:units[i]}); + } + } + } + return newData; + } + return data; + }, + series_setter:function(config){ + if(typeof config!="object"){ + webix.assert(config,"Chart :: Series must be an array or object"); + } + else{ + + this._parseSettings(!config.length?config:config[0]); + this._series = [this._settings]; + + + for(var i=1;i< config.length;i++) + this.addSeries(config[i]); + } + return config; + }, + value_setter:webix.template, + xValue_setter:webix.template, + yValue_setter:function(config){ + this.define("value",config); + }, + alpha_setter:webix.template, + label_setter:webix.template, + lineColor_setter:webix.template, + borderColor_setter:webix.template, + pieInnerText_setter:webix.template, + gradient_setter:function(config){ + if((typeof(config)!="function")&&config&&(config === true)) + config = "light"; + return config; + }, + colormap:{ + "RAINBOW":function(obj){ + var pos = Math.floor(this.getIndexById(obj.id)/this.count()*1536); + if (pos==1536) pos-=1; + return this._rainbow[Math.floor(pos/256)](pos%256); + } + }, + color_setter:function(value){ + return this.colormap[value]||webix.template( value); + }, + fill_setter:function(value){ + return ((!value||value=="0")?false:webix.template( value)); + }, + _definePreset:function(obj){ + this.define("preset",obj.preset); + delete obj.preset; + }, + preset_setter:function(value){ + var a, b, preset; + this.defaults = webix.extend({},this.defaults); + preset = this.presets[value]; + + if(typeof preset == "object"){ + + for(a in preset){ + + if(typeof preset[a]=="object"){ + if(!this.defaults[a]||typeof this.defaults[a]!="object"){ + this.defaults[a] = webix.extend({},preset[a]); + } + else{ + this.defaults[a] = webix.extend({},this.defaults[a]); + for(b in preset[a]){ + this.defaults[a][b] = preset[a][b]; + } + } + }else{ + this.defaults[a] = preset[a]; + } + } + return value; + } + return false; + }, + legend_setter:function( config){ + if(!config){ + if(this.legendObj){ + this.legendObj.innerHTML = ""; + this.legendObj = null; + } + return false; + } + if(typeof(config)!="object") //allow to use template string instead of object + config={template:config}; + + this._mergeSettings(config,{ + width:150, + height:18, + layout:"y", + align:"left", + valign:"bottom", + template:"", + toggle:(this._settings.type.toLowerCase().indexOf("stacked")!=-1?"":"hide"), + marker:{ + type:"square", + width:15, + height:15, + radius:3 + }, + margin: 4, + padding: 3 + }); + + config.template = webix.template(config.template); + return config; + }, + item_setter:function( config){ + if(typeof(config)!="object") + config={color:config, borderColor:config}; + this._mergeSettings(config,webix.extend({},this.defaults.item)); + var settings = ["alpha","borderColor","color","radius"]; + this._converToTemplate(settings,config); + return config; + }, + line_setter:function( config){ + if(typeof(config)!="object") + config={color:config}; + webix.extend(this.defaults.line,config,true); + config = webix.extend({},this.defaults.line); + config.color = webix.template(config.color); + return config; + }, + padding_setter:function( config){ + if(typeof(config)!="object") + config={left:config, right:config, top:config, bottom:config}; + this._mergeSettings(config,{ + left:50, + right:20, + top:35, + bottom:40 + }); + return config; + }, + xAxis_setter:function( config){ + if(!config) return false; + if(typeof(config)!="object") + config={ template:config }; + + this._mergeSettings(config,{ + title:"", + color:"#000000", + lineColor:"#cfcfcf", + template:"{obj}", + lines:true + }); + var templates = ["lineColor","template","lines"]; + this._converToTemplate(templates,config); + this._configXAxis = webix.extend({},config); + return config; + }, + yAxis_setter:function( config){ + this._mergeSettings(config,{ + title:"", + color:"#000000", + lineColor:"#cfcfcf", + template:"{obj}", + lines:true, + bg:"#ffffff" + }); + var templates = ["lineColor","template","lines","bg"]; + this._converToTemplate(templates,config); + this._configYAxis = webix.extend({},config); + return config; + }, + _converToTemplate:function(arr,config){ + for(var i=0;i< arr.length;i++){ + config[arr[i]] = webix.template(config[arr[i]]); + } + }, + _createCanvas: function(name,style,container){ + return new webix.Canvas({container:(container||this._contentobj),name:name,style:(style||""), width: this._content_width, height:this._content_height }); + }, + _drawScales:function(data,point0,point1,start,end,cellWidth){ + var y = 0; + if(this._settings.yAxis){ + if(!this.canvases["y"]) + this.canvases["y"] = this._createCanvas("axis_y"); + + y = this._drawYAxis(this.canvases["y"].getCanvas(),data,point0,point1,start,end); + } + if (this._settings.xAxis){ + if(!this.canvases["x"]) + this.canvases["x"] = this._createCanvas("axis_x"); + this._drawXAxis(this.canvases["x"].getCanvas(),data,point0,point1,cellWidth,y); + } + return y; + }, + _drawXAxis:function(ctx,data,point0,point1,cellWidth,y){ + var x0 = point0.x-0.5; + var y0 = parseInt((y?y:point1.y),10)+0.5; + var x1 = point1.x; + var unitPos; + var center = true; + + + + for(var i=0; i < data.length;i ++){ + + if(this._settings.offset === true) + unitPos = x0+cellWidth/2+i*cellWidth; + else{ + unitPos = (i==data.length-1)?point1.x:x0+i*cellWidth; + center = !!i; + } + unitPos = Math.ceil(unitPos)-0.5; + /*scale labels*/ + var top = ((this._settings.origin!="auto")&&(this._settings.type=="bar")&&(parseFloat(this._settings.value(data[i]))0 && nmax > 0 && (logMax-logMin>1) ){ + this._logScaleCalc = true; + return this._calculateLogScale(nmin,nmax); + } + + } + if(this._settings.origin!="auto"&&this._settings.origin5?10:5); + step = parseInt(stepVal,10)*calculStep; + + if(step>Math.abs(nmin)) + start = (nmin<0?-step:0); + else{ + var absNmin = Math.abs(nmin); + var powerStart = Math.floor(this._log10(absNmin)); + var nminVal = absNmin/Math.pow(10,powerStart); + start = Math.ceil(nminVal*10)/10*Math.pow(10,powerStart)-step; + if(absNmin>1&&step>0.1){ + start = Math.ceil(start); + } + while(nmin<0?start<=nmin:start>=nmin) + start -= step; + if(nmin<0) start =-start-2*step; + + } + end = start; + while(end1) + for(var i=1; i < this._series.length;i++){ + var maxI = webix.GroupMethods.max(this._series[i][value], data); + var minI = webix.GroupMethods.min(this._series[i][value], data); + if (maxI > maxValue) maxValue = maxI; + if (minI < minValue) minValue = minI; + } + } + return {max:maxValue,min:minValue}; + }, + _log10:function(n){ + var method_name="log"; + return Math[method_name](n)/Math.LN10; + }, + _drawXAxisLabel:function(x,y,obj,center,top){ + if (!this._settings.xAxis) return; + var elem = this.canvases["x"].renderTextAt(top, center, x,y-(top?2:0),this._settings.xAxis.template(obj)); + if (elem) + elem.className += " webix_axis_item_x"; + }, + _drawXAxisLine:function(ctx,x,y1,y2,obj){ + if (!this._settings.xAxis||!this._settings.xAxis.lines) return; + this._drawLine(ctx,x,y1,x,y2,this._settings.xAxis.lineColor.call(this,obj),1); + }, + _drawLine:function(ctx,x1,y1,x2,y2,color,width){ + ctx.strokeStyle = color; + ctx.lineWidth = width; + ctx.beginPath(); + ctx.moveTo(x1,y1); + ctx.lineTo(x2,y2); + ctx.stroke(); + ctx.lineWidth = 1; + }, + _getRelativeValue:function(minValue,maxValue){ + var relValue, origRelValue; + var valueFactor = 1; + if(maxValue != minValue){ + relValue = maxValue - minValue; + } + else relValue = minValue; + return [relValue,valueFactor]; + }, + _rainbow : [ + function(pos){ return "#FF"+webix.color.toHex(pos/2,2)+"00";}, + function(pos){ return "#FF"+webix.color.toHex(pos/2+128,2)+"00";}, + function(pos){ return "#"+webix.color.toHex(255-pos,2)+"FF00";}, + function(pos){ return "#00FF"+webix.color.toHex(pos,2);}, + function(pos){ return "#00"+webix.color.toHex(255-pos,2)+"FF";}, + function(pos){ return "#"+webix.color.toHex(pos,2)+"00FF";} + ], + /** + * adds series to the chart (value and color properties) + * @param: obj - obj with configuration properties + */ + addSeries:function(obj){ + var temp = webix.extend({},this._settings); + this._settings = webix.extend({},temp); + this._parseSettings(obj,{}); + this._series.push(this._settings); + this._settings = temp; + }, + /*switch global settings to serit in question*/ + _switchSerie:function(id, e, tag) { + var tip; + + if(!tag.getAttribute("userdata")) + return; + + this._active_serie = tag.getAttribute("userdata"); + if (!this._series[this._active_serie]) return; + for (var i=0; i < this._series.length; i++) { + tip = this._series[i].tooltip; + + if (tip) + tip.disable(); + } + if(!tag.getAttribute("disabled")){ + tip = this._series[this._active_serie].tooltip; + if (tip) + tip.enable(); + } + + }, + hideSeries:function(series){ + this.canvases[series].hideCanvas(); + if(this._settings.legend.values&&this._settings.legend.values[series]) + this._settings.legend.values[series].$hidden = true; + this._drawLegend(); + }, + showSeries:function(series){ + this.canvases[series].showCanvas(); + if(this._settings.legend.values&&this._settings.legend.values[series]) + delete this._settings.legend.values[series].$hidden; + this._drawLegend(); + + }, + /** + * renders legend block + * @param: ctx - canvas object + * @param: data - object those need to be displayed + * @param: width - the width of the container + * @param: height - the height of the container + */ + _drawLegend:function(data,width){ + /*position of the legend block*/ + var i, legend, legendContainer, legendHeight, legendItems, legendWidth, style, + x=0, y= 0, ctx, itemColor, disabled, item; + + data = data||[]; + width = width||this._content_width; + ctx = this.canvases["legend"].getCanvas(); + /*legend config*/ + legend = this._settings.legend; + /*the legend sizes*/ + + style = (this._settings.legend.layout!="x"?"width:"+legend.width+"px":""); + /*creation of legend container*/ + + if(this._legendObj){ + + this._legendObj.innerHTML = ""; + this._legendObj.parentNode.removeChild(this._legendObj); + } + this.canvases["legend"].clearCanvas(true); + + legendContainer = webix.html.create("DIV",{ + "class":"webix_chart_legend", + "style":"left:"+x+"px; top:"+y+"px;"+style + },""); + if(legend.padding){ + legendContainer.style.padding = legend.padding+"px"; + } + this._legendObj = legendContainer; + this._contentobj.appendChild(legendContainer); + + /*rendering legend text items*/ + legendItems = []; + if(!legend.values) + for(i = 0; i < data.length; i++){ + legendItems.push(this._drawLegendText(legendContainer,legend.template(data[i]))); + } + else + for(i = 0; i < legend.values.length; i++){ + legendItems.push(this._drawLegendText(legendContainer,legend.values[i].text,(typeof legend.values[i].id!="undefined"?typeof legend.values[i].id:i),legend.values[i].$hidden)); + } + if (legendContainer.offsetWidth === 0) + legendContainer.style.width = "auto"; + legendWidth = legendContainer.offsetWidth; + legendHeight = legendContainer.offsetHeight; + + /*this._settings.legend.width = legendWidth; + this._settings.legend.height = legendHeight;*/ + /*setting legend position*/ + if(legendWidth2) + text.setAttribute("series_id",series); + cont.appendChild(text); + return text; + }, + /** + * draw legend colorful marder + * @param: ctx - canvas object + * @param: x - the horizontal position of the marker + * @param: y - the vertical position of the marker + * @param: obj - data object which color needs being used + */ + _drawLegendMarker:function(ctx,x,y,color,height,disabled,i){ + var p = []; + var marker = this._settings.legend.marker; + var values = this._settings.legend.values; + var type = (values&&values[i].markerType?values[i].markerType:marker.type); + if(color){ + ctx.strokeStyle = ctx.fillStyle = color; + } + + if(type=="round"||!marker.radius){ + ctx.beginPath(); + ctx.lineWidth = marker.height; + ctx.lineCap = marker.type; + /*start of marker*/ + x += ctx.lineWidth/2+5; + y += height/2; + ctx.moveTo(x,y); + var x1 = x + marker.width-marker.height +1; + ctx.lineTo(x1,y); + ctx.stroke(); + ctx.fill(); + + } + else if(type=="item"){ + /*copy of line*/ + if(this._settings.line&&this._settings.type != "scatter" && !this._settings.disableLines){ + ctx.beginPath(); + ctx.lineWidth = this._series[i].line.width; + ctx.strokeStyle = disabled?color:this._series[i].line.color.call(this,{}); + var x0 = x + 5; + var y0 = y + height/2; + ctx.moveTo(x0,y0); + var x1 = x0 + marker.width; + ctx.lineTo(x1,y0); + ctx.stroke(); + } + /*item copy*/ + var config = this._series[i].item; + var radius = parseInt(config.radius.call(this,{}),10)||0; + if(radius){ + ctx.beginPath(); + if(disabled){ + ctx.lineWidth = config.borderWidth; + ctx.strokeStyle = color; + ctx.fillStyle = color; + } + else{ + ctx.lineWidth = config.borderWidth; + ctx.fillStyle = config.color.call(this,{}); + ctx.strokeStyle = config.borderColor.call(this,{}); + ctx.globalAlpha = config.alpha.call(this,{}); + } + ctx.beginPath(); + x += marker.width/2+5; + y += height/2; + this._strokeChartItem(ctx,x,y,radius+1,config.type); + ctx.fill(); + ctx.stroke(); + } + ctx.globalAlpha = 1; + }else{ + ctx.beginPath(); + ctx.lineWidth = 1; + x += 5; + y += height/2-marker.height/2; + p = [ + [x+marker.radius,y+marker.radius,marker.radius,Math.PI,3*Math.PI/2,false], + [x+marker.width-marker.radius,y], + [x+marker.width-marker.radius,y+marker.radius,marker.radius,-Math.PI/2,0,false], + [x+marker.width,y+marker.height-marker.radius], + [x+marker.width-marker.radius,y+marker.height-marker.radius,marker.radius,0,Math.PI/2,false], + [x+marker.radius,y+marker.height], + [x+marker.radius,y+marker.height-marker.radius,marker.radius,Math.PI/2,Math.PI,false], + [x,y+marker.radius] + ]; + this._path(ctx,p); + ctx.stroke(); + ctx.fill(); + } + + }, + /** + * gets the points those represent chart left top and right bottom bounds + * @param: width - the width of the chart container + * @param: height - the height of the chart container + */ + _getChartBounds:function(width,height){ + var chartX0, chartY0, chartX1, chartY1; + + chartX0 = this._settings.padding.left; + chartY0 = this._settings.padding.top; + chartX1 = width - this._settings.padding.right; + chartY1 = height - this._settings.padding.bottom; + + if(this._settings.legend){ + var legend = this._settings.legend; + /*legend size*/ + var legendWidth = this._settings.legend.width; + var legendHeight = this._settings.legend.height; + + /*if legend is horizontal*/ + if(legend.layout == "x"){ + if(legend.valign == "center"){ + if(legend.align == "right") + chartX1 -= legendWidth; + else if(legend.align == "left") + chartX0 += legendWidth; + } + else if(legend.valign == "bottom"){ + chartY1 -= legendHeight; + } + else{ + chartY0 += legendHeight; + } + } + /*vertical scale*/ + else{ + if(legend.align == "right") + chartX1 -= legendWidth; + else if(legend.align == "left") + chartX0 += legendWidth; + } + } + return {start:{x:chartX0,y:chartY0},end:{x:chartX1,y:chartY1}}; + }, + /** + * gets the maximum and minimum values for the stacked chart + * @param: data - data set + */ + _getStackedLimits:function(data){ + var i, j, maxValue, minValue, value; + if(this._settings.yAxis&&(typeof this._settings.yAxis.end!="undefined")&&(typeof this._settings.yAxis.start!="undefined")&&this._settings.yAxis.step){ + maxValue = parseFloat(this._settings.yAxis.end); + minValue = parseFloat(this._settings.yAxis.start); + } + else{ + for(i=0; i < data.length; i++){ + data[i].$sum = 0 ; + data[i].$min = Infinity; + for(j =0; j < this._series.length;j++){ + value = parseFloat(this._series[j].value(data[i])||0); + if(isNaN(value)) continue; + if(this._series[j].type.toLowerCase().indexOf("stacked")!=-1) + data[i].$sum += value; + if(value < data[i].$min) data[i].$min = value; + } + } + maxValue = -Infinity; + minValue = Infinity; + for(i=0; i < data.length; i++){ + if (data[i].$sum > maxValue) maxValue = data[i].$sum ; + if (data[i].$min < minValue) minValue = data[i].$min ; + } + if(minValue>0) minValue =0; + } + return {max: maxValue, min: minValue}; + }, + /*adds colors to the gradient object*/ + _setBarGradient:function(ctx,x1,y1,x2,y2,type,color,axis){ + var gradient, offset, rgb, hsv, color0, stops; + if(type == "light"){ + if(axis == "x") + gradient = ctx.createLinearGradient(x1,y1,x2,y1); + else + gradient = ctx.createLinearGradient(x1,y1,x1,y2); + stops = [[0,"#FFFFFF"],[0.9,color],[1,color]]; + offset = 2; + } + else if(type == "falling"||type == "rising"){ + if(axis == "x") + gradient = ctx.createLinearGradient(x1,y1,x2,y1); + else + gradient = ctx.createLinearGradient(x1,y1,x1,y2); + rgb = webix.color.toRgb(color); + hsv = webix.color.rgbToHsv(rgb[0],rgb[1],rgb[2]); + hsv[1] *= 1/2; + color0 = "rgb("+webix.color.hsvToRgb(hsv[0],hsv[1],hsv[2])+")"; + if(type == "falling"){ + stops = [[0,color0],[0.7,color],[1,color]]; + } + else if(type == "rising"){ + stops = [[0,color],[0.3,color],[1,color0]]; + } + offset = 0; + } + else{ + ctx.globalAlpha = 0.37; + offset = 0; + if(axis == "x") + gradient = ctx.createLinearGradient(x1,y2,x1,y1); + else + gradient = ctx.createLinearGradient(x1,y1,x2,y1); + stops = [[0,"#9d9d9d"],[0.3,"#e8e8e8"],[0.45,"#ffffff"],[0.55,"#ffffff"],[0.7,"#e8e8e8"],[1,"#9d9d9d"]]; + } + this._gradient(gradient,stops); + return {gradient: gradient,offset: offset}; + }, + /** + * returns the x and y position + * @param: a - angle + * @param: x - start x position + * @param: y - start y position + * @param: r - destination to the point + */ + _getPositionByAngle:function(a,x,y,r){ + a *= (-1); + x = x+Math.cos(a)*r; + y = y-Math.sin(a)*r; + return {x:x,y:y}; + }, + _gradient:function(gradient,stops){ + for(var i=0; i< stops.length; i++){ + gradient.addColorStop(stops[i][0],stops[i][1]); + } + }, + _path: function(ctx,points){ + var i, method; + for(i = 0; i< points.length; i++){ + method = (i?"lineTo":"moveTo"); + if(points[i].length>2) + method = "arc"; + ctx[method].apply(ctx,points[i]); + } + }, + _addMapRect:function(map,id,points,bounds,sIndex){ + map.addRect(id,[points[0].x-bounds.x,points[0].y-bounds.y,points[1].x-bounds.x,points[1].y-bounds.y],sIndex); + } +}, webix.Group, webix.AutoTooltip, webix.DataLoader, webix.MouseEvents, webix.EventSystem , webix.ui.view); + + +webix.extend(webix.ui.chart, { + $render_pie:function(ctx,data,x,y,sIndex,map){ + this._renderPie(ctx,data,x,y,1,map,sIndex); + + }, + /** + * renders a pie chart + * @param: ctx - canvas object + * @param: data - object those need to be displayed + * @param: x - the width of the container + * @param: y - the height of the container + * @param: ky - value from 0 to 1 that defines an angle of inclination (0=0)||(a1>=0 && a2<=Math.PI)||(Math.abs(a1-Math.PI)>0.003&&a1<=Math.PI && a2>=Math.PI))) return; + + if(a1<=0 && a2>=0){ + a1 = 0; + line = false; + this._drawSectorLine(ctx,x0,y0,R,a1,a2); + } + if(a1<=Math.PI && a2>=Math.PI){ + a2 = Math.PI; + line = false; + this._drawSectorLine(ctx,x0,y0,R,a1,a2); + } + /*the height of 3D pie*/ + var offset = (this._settings.pieHeight||Math.floor(R/4))/this._settings.cant; + ctx.beginPath(); + ctx.arc(x0,y0,R,a1,a2,false); + ctx.lineTo(x0+R*Math.cos(a2),y0+R*Math.sin(a2)+offset); + ctx.arc(x0,y0+offset,R,a2,a1,true); + ctx.lineTo(x0+R*Math.cos(a1),y0+R*Math.sin(a1)); + ctx.fill(); + if(line) + ctx.stroke(); + }, + /** + * draws a serctor arc + */ + _drawSectorLine:function(ctx,x0,y0,R,a1,a2){ + ctx.beginPath(); + ctx.arc(x0,y0,R,a1,a2,false); + ctx.stroke(); + }, + /** + * adds a shadow to pie + * @param: ctx - canvas object + * @param: x - the horizontal position of the pie center + * @param: y - the vertical position of the pie center + * @param: R - pie radius + */ + _addShadow:function(ctx,x,y,R){ + ctx.globalAlpha = 0.5; + var shadows = ["#c4c4c4","#c6c6c6","#cacaca","#dcdcdc","#dddddd","#e0e0e0","#eeeeee","#f5f5f5","#f8f8f8"]; + for(var i = shadows.length-1;i>-1;i--){ + ctx.beginPath(); + ctx.fillStyle = shadows[i]; + ctx.arc(x+1,y+1,R+i,0,Math.PI*2,true); + ctx.fill(); + } + ctx.globalAlpha = 1; + }, + /** + * returns a gray gradient + * @param: gradient - gradient object + */ + _getGrayGradient:function(gradient){ + gradient.addColorStop(0.0,"#ffffff"); + gradient.addColorStop(0.7,"#7a7a7a"); + gradient.addColorStop(1.0,"#000000"); + return gradient; + }, + /** + * adds gray radial gradient + * @param: ctx - canvas object + * @param: x - the horizontal position of the pie center + * @param: y - the vertical position of the pie center + * @param: radius - pie radius + * @param: x0 - the horizontal position of a gradient center + * @param: y0 - the vertical position of a gradient center + */ + _showRadialGradient:function(ctx,x,y,radius,x0,y0){ + //ctx.globalAlpha = 0.3; + ctx.beginPath(); + var gradient; + if(typeof this._settings.gradient!= "function"){ + gradient = ctx.createRadialGradient(x0,y0,radius/4,x,y,radius); + gradient = this._getGrayGradient(gradient); + } + else gradient = this._settings.gradient(gradient); + ctx.fillStyle = gradient; + ctx.arc(x,y,radius,0,Math.PI*2,true); + ctx.fill(); + //ctx.globalAlpha = 1; + ctx.globalAlpha = 0.7; + }, + /** + * returns the calculates pie parameters: center position and radius + * @param: ctx - canvas object + * @param: x0 - the horizontal position of the pie center + * @param: y0 - the vertical position of the pie center + * @param: R - pie radius + * @param: alpha1 - the angle that defines the 1st edge of a sector + * @param: alpha2 - the angle that defines the 2nd edge of a sector + * @param: ky - the value that defines an angle of inclination + * @param: text - label text + * @param: in_width (boolean) - if label needs being displayed inside a pie + */ + _drawSectorLabel:function(x0,y0,R,alpha1,alpha2,ky,text,in_width){ + var t = this.canvases[0].renderText(0,0,text,0,1); + if (!t) return; + + //get existing width of text + var labelWidth = t.scrollWidth; + t.style.width = labelWidth+"px"; //adjust text label to fit all text + if (labelWidth>x0) labelWidth = x0; //the text can't be greater than half of view + + //calculate expected correction based on default font metrics + var width = (alpha2-alpha1<0.2?4:8); + if (in_width) width = labelWidth/1.8; + var alpha = alpha1+(alpha2-alpha1)/2; + + //position and its correction + R = R-(width-8)/2; + var corr_x = - width; + var corr_y = -8; + var align = "right"; + + //for items in left upper and lower sector + if(alpha>=Math.PI/2 && alpha=Math.PI){ + corr_x = -labelWidth-corr_x+1;/*correction for label width*/ + align = "left"; + } + + /* + calculate position of text + basically get point at center of pie sector + */ + var offset = 0; + + if(!in_width&&ky<1&&(alpha>0&&alpha=Math.PI/2 && alpha=Math.PI)){ + x += labelWidth/3; + } + + + //we need to set position of text manually, based on above calculations + t.style.top = y+"px"; + t.style.left = x+"px"; + t.style.width = labelWidth+"px"; + t.style.textAlign = align; + t.style.whiteSpace = "nowrap"; + }, + $render_pie3D:function(ctx,data,x,y,sIndex,map){ + this._renderPie(ctx,data,x,y,this._settings.cant,map); + }, + $render_donut:function(ctx,data,point0,point1,sIndex,map){ + if(!data.length) + return; + this._renderPie(ctx,data,point0,point1,1,map,sIndex); + var config = this._settings; + var coord = this._getPieParameters(point0,point1); + var pieRadius = (config.radius?config.radius:coord.radius); + var innerRadius = ((config.innerRadius&&(config.innerRadiusminValue){ + this._drawXAxis(ctx,data,point0,point1,cellWidth,point1.y-unit*(this._settings.origin-minValue)); + } + + /*a real bar width */ + barWidth = parseInt(this._settings.barWidth,10); + var seriesNumber = 0; + var seriesIndex = 0; + for(i=0; icellWidth) barWidth = parseInt(cellWidth/seriesNumber-4,10); + + /*the half of distance between bars*/ + var barOffset = (cellWidth - barWidth*seriesNumber)/2; + + /*the radius of rounding in the top part of each bar*/ + var radius = (typeof this._settings.radius!="undefined"?parseInt(this._settings.radius,10):Math.round(barWidth/5)); + + var inner_gradient = false; + var gradient = this._settings.gradient; + + if(gradient && typeof(gradient) != "function"){ + inner_gradient = gradient; + gradient = false; + } else if (gradient){ + gradient = ctx.createLinearGradient(0,point1.y,0,point0.y); + this._settings.gradient(gradient); + } + /*draws a black line if the horizontal scale isn't defined*/ + if(!xax){ + this._drawLine(ctx,point0.x,point1.y+0.5,point1.x,point1.y+0.5,"#000000",1); //hardcoded color! + } + + for(i=0; i < data.length;i ++){ + + var value = parseFloat(this._settings.value(data[i])||0); + if(this._logScaleCalc) + value = this._log10(value); + + if(isNaN(value)) + continue; + if(value>maxValue) value = maxValue; + value -= minValue; + value *= valueFactor; + + /*start point (bottom left)*/ + var x0 = point0.x + barOffset + i*cellWidth+(barWidth+1)*seriesIndex; + var y0 = point1.y; + + if(value<0||(this._settings.yAxis&&value===0&&!(this._settings.origin!="auto"&&this._settings.origin>minValue))){ + this.canvases[sIndex].renderTextAt(true, true, x0+Math.floor(barWidth/2),y0,this._settings.label(data[i])); + continue; + } + + /*takes start value into consideration*/ + if(!yax&&!(this._settings.origin!="auto"&&xax)) value += startValue/unit; + + var color = gradient||this._settings.color.call(this,data[i]); + + + /*drawing bar body*/ + ctx.globalAlpha = this._settings.alpha.call(this,data[i]); + var points = this._drawBar(ctx,point0,x0,y0,barWidth,minValue,radius,unit,value,color,gradient,inner_gradient); + if (inner_gradient){ + this._drawBarGradient(ctx,x0,y0,barWidth,minValue,radius,unit,value,color,inner_gradient); + } + /*drawing the gradient border of a bar*/ + if(this._settings.border) + this._drawBarBorder(ctx,x0,y0,barWidth,minValue,radius,unit,value,color); + + ctx.globalAlpha = 1; + + /*sets a bar label*/ + if(points[0]!=x0) + this.canvases[sIndex].renderTextAt(false, true, x0+Math.floor(barWidth/2),points[1],this._settings.label(data[i])); + else + this.canvases[sIndex].renderTextAt(true, true, x0+Math.floor(barWidth/2),points[3],this._settings.label(data[i])); + /*defines a map area for a bar*/ + map.addRect(data[i].id,[x0-point0.x,points[3]-point0.y,points[2]-point0.x,points[1]-point0.y],sIndex); + //this._addMapRect(map,data[i].id,[{x:x0,y:points[3]},{x:points[2],y:points[1]}],point0,sIndex); + } + }, + _correctBarParams:function(ctx,x,y,value,unit,barWidth,minValue){ + var xax = this._settings.xAxis; + var axisStart = y; + if(!!xax&&this._settings.origin!="auto" && (this._settings.origin>minValue)){ + y -= (this._settings.origin-minValue)*unit; + axisStart = y; + value = value-(this._settings.origin-minValue); + if(value < 0){ + value *= (-1); + ctx.translate(x+barWidth,y); + ctx.rotate(Math.PI); + x = 0; + y = 0; + } + y -= 0.5; + } + + return {value:value,x0:x,y0:y,start:axisStart}; + }, + _drawBar:function(ctx,point0,x0,y0,barWidth,minValue,radius,unit,value,color,gradient,inner_gradient){ + ctx.save(); + ctx.fillStyle = color; + var p = this._correctBarParams(ctx,x0,y0,value,unit,barWidth,minValue); + var points = this._setBarPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,(this._settings.border?1:0)); + if (gradient&&!inner_gradient) ctx.lineTo(p.x0+(this._settings.border?1:0),point0.y); //fix gradient sphreading + ctx.fill(); + ctx.restore(); + var x1 = p.x0; + var x2 = (p.x0!=x0?x0+points[0]:points[0]); + var y1 = (p.x0!=x0?(p.start-points[1]-p.y0):p.y0); + var y2 = (p.x0!=x0?p.start-p.y0:points[1]); + + return [x1,y1,x2,y2]; + }, + _setBorderStyles:function(ctx,color){ + var hsv,rgb; + rgb = webix.color.toRgb(color); + hsv = webix.color.rgbToHsv(rgb[0],rgb[1],rgb[2]); + hsv[2] /= 1.4; + color = "rgb("+webix.color.hsvToRgb(hsv[0],hsv[1],hsv[2])+")"; + ctx.strokeStyle = color; + if(ctx.globalAlpha==1) + ctx.globalAlpha = 0.9; + }, + _drawBarBorder:function(ctx,x0,y0,barWidth,minValue,radius,unit,value,color){ + var p; + ctx.save(); + p = this._correctBarParams(ctx,x0,y0,value,unit,barWidth,minValue); + this._setBorderStyles(ctx,color); + this._setBarPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,ctx.lineWidth/2,1); + ctx.stroke(); + /*ctx.fillStyle = color; + this._setBarPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,0); + ctx.lineTo(p.x0,0); + ctx.fill() + + + ctx.fillStyle = "#000000"; + ctx.globalAlpha = 0.37; + + this._setBarPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,0); + ctx.fill() + */ + ctx.restore(); + }, + _drawBarGradient:function(ctx,x0,y0,barWidth,minValue,radius,unit,value,color,inner_gradient){ + ctx.save(); + var p = this._correctBarParams(ctx,x0,y0,value,unit,barWidth,minValue); + var gradParam = this._setBarGradient(ctx,p.x0,p.y0,p.x0+barWidth,p.y0-unit*p.value+2,inner_gradient,color,"y"); + var borderOffset = this._settings.border?1:0; + ctx.fillStyle = gradParam.gradient; + this._setBarPoints(ctx,p.x0+gradParam.offset,p.y0,barWidth-gradParam.offset*2,radius,unit,p.value,gradParam.offset+borderOffset); + ctx.fill(); + ctx.restore(); + }, + /** + * sets points for bar and returns the position of the bottom right point + * @param: ctx - canvas object + * @param: x0 - the x position of start point + * @param: y0 - the y position of start point + * @param: barWidth - bar width + * @param: radius - the rounding radius of the top + * @param: unit - the value defines the correspondence between item value and bar height + * @param: value - item value + * @param: offset - the offset from expected bar edge (necessary for drawing border) + */ + _setBarPoints:function(ctx,x0,y0,barWidth,radius,unit,value,offset,skipBottom){ + /*correction for displaing small values (when rounding radius is bigger than bar height)*/ + ctx.beginPath(); + //y0 = 0.5; + var angle_corr = 0; + if(radius>unit*value){ + var cosA = (radius-unit*value)/radius; + if(cosA<=1&&cosA>=-1) + angle_corr = -Math.acos(cosA)+Math.PI/2; + } + /*start*/ + ctx.moveTo(x0+offset,y0); + /*start of left rounding*/ + var y1 = y0 - Math.floor(unit*value) + radius + (radius?0:offset); + if(radius0) + ctx.arc(x2,y1,radius-offset,-Math.PI+angle_corr,-Math.PI/2,false); + /*start of right rounding*/ + var x3 = x0 + barWidth - radius - offset; + var y3 = y1 - radius + (radius?offset:0); + ctx.lineTo(x3,y3); + /*right rounding*/ + if (radius&&radius>0) + ctx.arc(x3+offset,y1,radius-offset,-Math.PI/2,0-angle_corr,false); + /*bottom right point*/ + var x5 = x0 + barWidth-offset; + ctx.lineTo(x5,y0); + /*line to the start point*/ + if(!skipBottom){ + ctx.lineTo(x0+offset,y0); + } + // ctx.lineTo(x0,0); //IE fix! + return [x5,y3]; + } +}); +webix.extend(webix.ui.chart, { + /** + * renders a graphic + * @param: ctx - canvas object + * @param: data - object those need to be displayed + * @param: width - the width of the container + * @param: height - the height of the container + * @param: sIndex - index of drawing chart + */ + $render_line:function(ctx, data, point0, point1, sIndex, map){ + var config,i,items,params,x0,x1,x2,y1,y2,y0,res1,res2; + params = this._calculateLineParams(ctx,data,point0,point1,sIndex); + config = this._settings; + if (data.length) { + x0 = (config.offset?point0.x+params.cellWidth*0.5:point0.x); + //finds items with data (excludes scale units) + items= []; + for(i=0; i < data.length;i++){ + res2 = this._getPointY(data[i],point0,point1,params); + if(res2){ + x2 = ((!i)?x0:params.cellWidth*i - 0.5 + x0); + y2 = (typeof res2 == "object"?res2.y0:res2); + if(i && this._settings.fixOverflow){ + res1 = this._getPointY(data[i-1],point0,point1,params); + if(res1.out && res1.out == res2.out){ + continue; + } + x1 = params.cellWidth*(i-1) - 0.5 + x0; + y1 = (typeof res1 == "object"?res1.y0:res1); + + if(res1.out){ + y0 = (res1.out == "min"?point1.y:point0.y); + items.push({x:this._calcOverflowX(x1,x2,y1,y2,y0),y:y0}); + } + if(res2.out){ + y0 = (res2.out == "min"?point1.y:point0.y); + items.push({x:this._calcOverflowX(x1,x2,y1,y2,y0),y:y0}); + } + + } + if(!res2.out) + items.push({x:x2, y: res2, index: i}); + } + } + + this._mapStart = point0; + for(i = 1; i <= items.length; i++){ + //line start position + x1 = items[i-1].x; + y1 = items[i-1].y; + if(i=0;i--){ + ctx.globalAlpha = alphas[i]; + ctx.strokeStyle = "#d0d0d0"; + ctx.beginPath(); + this._strokeChartItem(ctx,x0,y0+2*R/3,R+i+1,config.type); + ctx.stroke(); + } + ctx.beginPath(); + ctx.globalAlpha = 0.3; + ctx.fillStyle = "#bdbdbd"; + this._strokeChartItem(ctx,x0,y0+2*R/3,R+1,config.type); + ctx.fill(); + } + ctx.restore(); + ctx.lineWidth = config.borderWidth; + ctx.fillStyle = config.color.call(this,obj); + ctx.strokeStyle = config.borderColor.call(this,obj); + ctx.globalAlpha = config.alpha.call(this,obj); + ctx.beginPath(); + this._strokeChartItem(ctx,x0,y0,R+1,config.type); + ctx.fill(); + ctx.stroke(); + ctx.globalAlpha = 1; + } + /*item label*/ + if(label){ + this.canvases[sIndex].renderTextAt(false, true, x0,y0-R-this._settings.labelOffset,this._settings.label.call(this,obj)); + } + if(map){ + var areaPos = (this._settings.eventRadius||R+1); + //this._addMapRect(map,obj.id,[{x:x0-areaPos,y:y0-areaPos},{x0+areaPos,y:y0+areaPos}],point0,sIndex); + map.addRect(obj.id,[x0-areaPos-mapStart.x,y0-areaPos-mapStart.y,x0+areaPos-mapStart.x,y0+areaPos-mapStart.y],sIndex); + } + + }, + _strokeChartItem:function(ctx,x0,y0,R,type){ + var p=[]; + if(type && (type=="square" || type=="s")){ + R *= Math.sqrt(2)/2; + p = [ + [x0-R-ctx.lineWidth/2,y0-R], + [x0+R,y0-R], + [x0+R,y0+R], + [x0-R,y0+R], + [x0-R,y0-R] + ]; + } + else if(type && (type=="diamond" || type=="d")){ + var corr = (ctx.lineWidth>1?ctx.lineWidth*Math.sqrt(2)/4:0); + p = [ + [x0,y0-R], + [x0+R,y0], + [x0,y0+R], + [x0-R,y0], + [x0+corr,y0-R-corr] + ]; + } + else if(type && (type=="triangle" || type=="t")){ + p = [ + [x0,y0-R], + [x0+Math.sqrt(3)*R/2,y0+R/2], + [x0-Math.sqrt(3)*R/2,y0+R/2], + [x0,y0-R] + ]; + } + else + p = [ + [x0,y0,R,0,Math.PI*2,true] + ]; + this._path(ctx,p); + }, + /** + * gets the vertical position of the item + * @param: data - data object + * @param: y0 - the y position of chart start + * @param: y1 - the y position of chart end + * @param: params - the object with elements: minValue, maxValue, unit, valueFactor (the value multiple of 10) + */ + _getPointY: function(data,point0,point1,params){ + var minValue = params.minValue; + var maxValue = params.maxValue; + var unit = params.unit; + var valueFactor = params.valueFactor; + /*the real value of an object*/ + var value = this._settings.value(data); + if(this._logScaleCalc){ + value = this._log10(value); + } + /*a relative value*/ + var v = (parseFloat(value||0) - minValue)*valueFactor; + if(!this._settings.yAxis) + v += params.startValue/unit; + /*a vertical coordinate*/ + var y = point1.y - unit*v; + /*the limit of the max and min values*/ + if(this._settings.fixOverflow && ( this._settings.type == "line" || this._settings.type == "area")){ + if(value > maxValue) + y = {y: point0.y, y0: y, out: "max"}; + else if(v<0 || value < minValue) + y = {y: point1.y, y0: y, out: "min"}; + } + else{ + if(value > maxValue) + y = point0.y; + if(v<0 || value < minValue) + y = point1.y; + } + return y; + }, + _calculateLineParams: function(ctx,data,point0,point1,sIndex){ + var params = {}; + + /*maxValue - minValue*/ + var relValue; + + /*available height*/ + params.totalHeight = point1.y-point0.y; + + /*a space available for a single item*/ + //params.cellWidth = Math.round((point1.x-point0.x)/((!this._settings.offset&&this._settings.yAxis)?(data.length-1):data.length)); + params.cellWidth =(point1.x-point0.x)/((!this._settings.offset)?(data.length-1):data.length); + /*scales*/ + var yax = !!this._settings.yAxis; + + var limits = (this._settings.type.indexOf("stacked")!=-1?this._getStackedLimits(data):this._getLimits()); + params.maxValue = limits.max; + params.minValue = limits.min; + + /*draws x and y scales*/ + if(!sIndex) + this._drawScales(data, point0, point1,params.minValue,params.maxValue,params.cellWidth); + + /*necessary for automatic scale*/ + if(yax){ + params.maxValue = parseFloat(this._settings.yAxis.end); + params.minValue = parseFloat(this._settings.yAxis.start); + } + + /*unit calculation (y_position = value*unit)*/ + var relativeValues = this._getRelativeValue(params.minValue,params.maxValue); + relValue = relativeValues[0]; + params.valueFactor = relativeValues[1]; + params.unit = (relValue?params.totalHeight/relValue:10); + + params.startValue = 0; + if(!yax){ + /*defines start value for better representation of small values*/ + params.startValue = 10; + if(params.unit!=params.totalHeight) + params.unit = (relValue?(params.totalHeight - params.startValue)/relValue:10); + } + return params; + } +}); + + +webix.extend(webix.ui.chart, { + /** + * renders a bar chart + * @param: ctx - canvas object + * @param: data - object those need to be displayed + * @param: x - the width of the container + * @param: y - the height of the container + * @param: sIndex - index of drawing chart + */ + $render_barH:function(ctx, data, point0, point1, sIndex, map){ + var barOffset, barWidth, cellWidth, color, gradient, i, limits, maxValue, minValue, + innerGradient, valueFactor, relValue, radius, relativeValues, + startValue, totalWidth,value, unit, x0, y0, yax; + + /*an available width for one bar*/ + cellWidth = (point1.y-point0.y)/data.length; + + limits = this._getLimits("h"); + + maxValue = limits.max; + minValue = limits.min; + + totalWidth = point1.x-point0.x; + + yax = !!this._settings.yAxis; + + /*draws x and y scales*/ + if(!sIndex) + this._drawHScales(ctx,data,point0, point1,minValue,maxValue,cellWidth); + + /*necessary for automatic scale*/ + if(yax){ + maxValue = parseFloat(this._settings.xAxis.end); + minValue = parseFloat(this._settings.xAxis.start); + } + + /*unit calculation (bar_height = value*unit)*/ + relativeValues = this._getRelativeValue(minValue,maxValue); + relValue = relativeValues[0]; + valueFactor = relativeValues[1]; + + unit = (relValue?totalWidth/relValue:10); + if(!yax){ + /*defines start value for better representation of small values*/ + startValue = 10; + unit = (relValue?(totalWidth-startValue)/relValue:10); + } + + + /*a real bar width */ + barWidth = parseInt(this._settings.barWidth,10); + if((barWidth*this._series.length+4)>cellWidth) barWidth = cellWidth/this._series.length-4; + /*the half of distance between bars*/ + barOffset = Math.floor((cellWidth - barWidth*this._series.length)/2); + /*the radius of rounding in the top part of each bar*/ + radius = (typeof this._settings.radius!="undefined"?parseInt(this._settings.radius,10):Math.round(barWidth/5)); + + innerGradient = false; + gradient = this._settings.gradient; + + if (gradient&&typeof(gradient) != "function"){ + innerGradient = gradient; + gradient = false; + } else if (gradient){ + gradient = ctx.createLinearGradient(point0.x,point0.y,point1.x,point0.y); + this._settings.gradient(gradient); + } + /*draws a black line if the horizontal scale isn't defined*/ + if(!yax){ + this._drawLine(ctx,point0.x-0.5,point0.y,point0.x-0.5,point1.y,"#000000",1); //hardcoded color! + } + + + + for(i=0; i < data.length;i ++){ + + + value = parseFloat(this._settings.value(data[i]||0)); + if(this._logScaleCalc) + value = this._log10(value); + + if(value>maxValue) value = maxValue; + value -= minValue; + value *= valueFactor; + + /*start point (bottom left)*/ + x0 = point0.x; + y0 = point0.y+ barOffset + i*cellWidth+(barWidth+1)*sIndex; + + if((value<0&&this._settings.origin=="auto")||(this._settings.xAxis&&value===0&&!(this._settings.origin!="auto"&&this._settings.origin>minValue))){ + this.canvases[sIndex].renderTextAt("middle", "right", x0+10,y0+barWidth/2+barOffset,this._settings.label(data[i])); + continue; + } + if(value<0&&this._settings.origin!="auto"&&this._settings.origin>minValue){ + value = 0; + } + + /*takes start value into consideration*/ + if(!yax) value += startValue/unit; + color = gradient||this._settings.color.call(this,data[i]); + + /*drawing the gradient border of a bar*/ + if(this._settings.border){ + this._drawBarHBorder(ctx,x0,y0,barWidth,minValue,radius,unit,value,color); + } + + /*drawing bar body*/ + ctx.globalAlpha = this._settings.alpha.call(this,data[i]); + var points = this._drawBarH(ctx,point1,x0,y0,barWidth,minValue,radius,unit,value,color,gradient,innerGradient); + if (innerGradient){ + this._drawBarHGradient(ctx,x0,y0,barWidth,minValue,radius,unit,value,color,innerGradient); + + } + ctx.globalAlpha = 1; + + + /*sets a bar label and map area*/ + + if(points[3]==y0){ + this.canvases[sIndex].renderTextAt("middle", "left", points[0]-5,points[3]+Math.floor(barWidth/2),this._settings.label(data[i])); + map.addRect(data[i].id,[points[0]-point0.x,points[3]-point0.y,points[2]-point0.x,points[3]+barWidth-point0.y],sIndex); + + }else{ + this.canvases[sIndex].renderTextAt("middle", false, points[2]+5,points[1]+Math.floor(barWidth/2),this._settings.label(data[i])); + map.addRect(data[i].id,[points[0]-point0.x,y0-point0.y,points[2]-point0.x,points[3]-point0.y],sIndex); + } + + } + }, + /** + * sets points for bar and returns the position of the bottom right point + * @param: ctx - canvas object + * @param: x0 - the x position of start point + * @param: y0 - the y position of start point + * @param: barWidth - bar width + * @param: radius - the rounding radius of the top + * @param: unit - the value defines the correspondence between item value and bar height + * @param: value - item value + * @param: offset - the offset from expected bar edge (necessary for drawing border) + */ + _setBarHPoints:function(ctx,x0,y0,barWidth,radius,unit,value,offset,skipLeft){ + /*correction for displaing small values (when rounding radius is bigger than bar height)*/ + var angle_corr = 0; + if(radius>unit*value){ + var sinA = (radius-unit*value)/radius; + angle_corr = -Math.asin(sinA)+Math.PI/2; + } + /*start*/ + ctx.moveTo(x0,y0+offset); + /*start of left rounding*/ + var x1 = x0 + unit*value - radius - (radius?0:offset); + if(radius0) + ctx.arc(x1,y2,radius-offset,-Math.PI/2+angle_corr,0,false); + /*start of right rounding*/ + var y3 = y0 + barWidth - radius - (radius?0:offset); + var x3 = x1 + radius - (radius?offset:0); + ctx.lineTo(x3,y3); + /*right rounding*/ + if (radius&&radius>0) + ctx.arc(x1,y3,radius-offset,0,Math.PI/2-angle_corr,false); + /*bottom right point*/ + var y5 = y0 + barWidth-offset; + ctx.lineTo(x0,y5); + /*line to the start point*/ + if(!skipLeft){ + ctx.lineTo(x0,y0+offset); + } + // ctx.lineTo(x0,0); //IE fix! + return [x3,y5]; + }, + _drawHScales:function(ctx,data,point0,point1,start,end,cellWidth){ + var x = 0; + if(this._settings.xAxis){ + if(!this.canvases["x"]) + this.canvases["x"] = this._createCanvas("axis_x"); + x = this._drawHXAxis(this.canvases["x"].getCanvas(),data,point0,point1,start,end); + } + if (this._settings.yAxis){ + if(!this.canvases["y"]) + this.canvases["y"] = this._createCanvas("axis_y"); + this._drawHYAxis(this.canvases["y"].getCanvas(),data,point0,point1,cellWidth,x); + } + }, + _drawHYAxis:function(ctx,data,point0,point1,cellWidth,yAxisX){ + if (!this._settings.yAxis) return; + var unitPos; + var x0 = parseInt((yAxisX?yAxisX:point0.x),10)-0.5; + var y0 = point1.y+0.5; + var y1 = point0.y; + this._drawLine(ctx,x0,y0,x0,y1,this._settings.yAxis.color,1); + + + + for(var i=0; i < data.length;i ++){ + + /*scale labels*/ + var right = ((this._settings.origin!="auto")&&(this._settings.type=="barH")&&(parseFloat(this._settings.value(data[i]))minValue)){ + x += (this._settings.origin-minValue)*unit; + axisStart = x; + value = value-(this._settings.origin-minValue); + if(value < 0){ + value *= (-1); + ctx.translate(x,y+barWidth); + ctx.rotate(Math.PI); + x = 0.5; + y = 0; + } + x += 0.5; + } + + return {value:value,x0:x,y0:y,start:axisStart}; + }, + _drawBarH:function(ctx,point1,x0,y0,barWidth,minValue,radius,unit,value,color,gradient,inner_gradient){ + ctx.save(); + var p = this._correctBarHParams(ctx,x0,y0,value,unit,barWidth,minValue); + ctx.fillStyle = color; + ctx.beginPath(); + var points = this._setBarHPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,(this._settings.border?1:0)); + if (gradient&&!inner_gradient) ctx.lineTo(point1.x,p.y0+(this._settings.border?1:0)); //fix gradient sphreading + ctx.fill(); + ctx.restore(); + var y1 = p.y0; + var y2 = (p.y0!=y0?y0:points[1]); + var x1 = (p.y0!=y0?(p.start-points[0]):p.start); + var x2 = (p.y0!=y0?p.start:points[0]); + + return [x1,y1,x2,y2]; + }, + _drawBarHBorder:function(ctx,x0,y0,barWidth,minValue,radius,unit,value,color){ + ctx.save(); + var p = this._correctBarHParams(ctx,x0,y0,value,unit,barWidth,minValue); + + ctx.beginPath(); + this._setBorderStyles(ctx,color); + ctx.globalAlpha =0.9; + this._setBarHPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,ctx.lineWidth/2,1); + + ctx.stroke(); + ctx.restore(); + }, + _drawBarHGradient:function(ctx,x0,y0,barWidth,minValue,radius,unit,value,color,inner_gradient){ + ctx.save(); + //y0 -= (webix.env.isIE?0:0.5); + var p = this._correctBarHParams(ctx,x0,y0,value,unit,barWidth,minValue); + var gradParam = this._setBarGradient(ctx,p.x0,p.y0+barWidth,p.x0+unit*p.value,p.y0,inner_gradient,color,"x"); + ctx.fillStyle = gradParam.gradient; + ctx.beginPath(); + this._setBarHPoints(ctx,p.x0,p.y0+gradParam.offset,barWidth-gradParam.offset*2,radius,unit,p.value,gradParam.offset); + ctx.fill(); + ctx.globalAlpha = 1; + ctx.restore(); + } +}); + +webix.extend(webix.ui.chart, { + /** + * renders a bar chart + * @param: ctx - canvas object + * @param: data - object those need to be displayed + * @param: x - the width of the container + * @param: y - the height of the container + * @param: sIndex - index of drawing chart + */ + $render_stackedBar:function(ctx, data, point0, point1, sIndex, map){ + var maxValue,minValue; + /*necessary if maxValue - minValue < 0*/ + var valueFactor; + /*maxValue - minValue*/ + var relValue; + + var total_height = point1.y-point0.y; + + var yax = !!this._settings.yAxis; + var xax = !!this._settings.xAxis; + + var limits = this._getStackedLimits(data); + maxValue = limits.max; + minValue = limits.min; + + /*an available width for one bar*/ + var cellWidth = Math.floor((point1.x-point0.x)/data.length); + + /*draws x and y scales*/ + if(!sIndex) + this._drawScales(data,point0, point1,minValue,maxValue,cellWidth); + + /*necessary for automatic scale*/ + if(yax){ + maxValue = parseFloat(this._settings.yAxis.end); + minValue = parseFloat(this._settings.yAxis.start); + } + + /*unit calculation (bar_height = value*unit)*/ + var relativeValues = this._getRelativeValue(minValue,maxValue); + relValue = relativeValues[0]; + valueFactor = relativeValues[1]; + + var unit = (relValue?total_height/relValue:10); + + /*a real bar width */ + var barWidth = parseInt(this._settings.barWidth,10); + if(barWidth+4 > cellWidth) barWidth = cellWidth-4; + /*the half of distance between bars*/ + var barOffset = Math.floor((cellWidth - barWidth)/2); + + + var inner_gradient = (this._settings.gradient?this._settings.gradient:false); + + /*draws a black line if the horizontal scale isn't defined*/ + if(!xax){ + //scaleY = y-bottomPadding; + this._drawLine(ctx,point0.x,point1.y+0.5,point1.x,point1.y+0.5,"#000000",1); //hardcoded color! + } + + for(var i=0; i < data.length;i ++){ + var value = parseFloat(this._settings.value(data[i]||0)); + if(this._logScaleCalc) + value = this._log10(value); + + if(!value){ + if(!sIndex||!data[i].$startY) + data[i].$startY = point1.y; + continue; + } + /*adjusts the first tab to the scale*/ + if(!sIndex) + value -= minValue; + + value *= valueFactor; + + /*start point (bottom left)*/ + var x0 = point0.x + barOffset + i*cellWidth; + var y0 = point1.y; + if(!sIndex) + data[i].$startY = y0; + else + y0 = data[i].$startY; + + /*the max height limit*/ + if(y0 < (point0.y+1)) continue; + + if(value<0||(this._settings.yAxis&&value===0)){ + this.canvases["y"].renderTextAt(true, true, x0+Math.floor(barWidth/2),y0,this._settings.label(data[i])); + continue; + } + + var color = this._settings.color.call(this,data[i]); + + + + /*drawing bar body*/ + ctx.globalAlpha = this._settings.alpha.call(this,data[i]); + ctx.fillStyle = this._settings.color.call(this,data[i]); + ctx.beginPath(); + var points = this._setStakedBarPoints(ctx,x0-(this._settings.border?0.5:0),y0,barWidth+(this._settings.border?0.5:0),unit,value,0,point0.y); + ctx.fill(); + + /*gradient*/ + if (inner_gradient){ + ctx.save(); + var gradParam = this._setBarGradient(ctx,x0,y0,x0+barWidth,points[1],inner_gradient,color,"y"); + ctx.fillStyle = gradParam.gradient; + ctx.beginPath(); + points = this._setStakedBarPoints(ctx,x0+gradParam.offset,y0,barWidth-gradParam.offset*2,unit,value,(this._settings.border?1:0),point0.y); + ctx.fill(); + ctx.restore(); + } + /*drawing the gradient border of a bar*/ + if(this._settings.border){ + ctx.save(); + this._setBorderStyles(ctx,color); + ctx.beginPath(); + + this._setStakedBarPoints(ctx,x0-0.5,y0,barWidth+1,unit,value,0,point0.y,1); + ctx.stroke(); + ctx.restore(); + } + ctx.globalAlpha = 1; + + /*sets a bar label*/ + this.canvases[sIndex].renderTextAt(false, true, x0+Math.floor(barWidth/2),(points[1]+(y0-points[1])/2)-7,this._settings.label(data[i])); + /*defines a map area for a bar*/ + map.addRect(data[i].id,[x0-point0.x,points[1]-point0.y,points[0]-point0.x,(data[i].$startY||y0)-point0.y],sIndex); + + /*the start position for the next series*/ + data[i].$startY = (this._settings.border?(points[1]+1):points[1]); + } + }, + /** + * sets points for bar and returns the position of the bottom right point + * @param: ctx - canvas object + * @param: x0 - the x position of start point + * @param: y0 - the y position of start point + * @param: barWidth - bar width + * @param: radius - the rounding radius of the top + * @param: unit - the value defines the correspondence between item value and bar height + * @param: value - item value + * @param: offset - the offset from expected bar edge (necessary for drawing border) + * @param: minY - the minimum y position for the bars () + */ + _setStakedBarPoints:function(ctx,x0,y0,barWidth,unit,value,offset,minY,skipBottom){ + /*start*/ + ctx.moveTo(x0,y0); + /*start of left rounding*/ + var y1 = y0 - unit*value+offset; + /*maximum height limit*/ + if(y1cellWidth) barWidth = cellWidth-4; + /*the half of distance between bars*/ + var barOffset = (cellWidth - barWidth)/2; + /*the radius of rounding in the top part of each bar*/ + var radius = 0; + + var inner_gradient = false; + var gradient = this._settings.gradient; + if (gradient){ + inner_gradient = true; + } + /*draws a black line if the horizontal scale isn't defined*/ + if(!yax){ + this._drawLine(ctx,point0.x-0.5,point0.y,point0.x-0.5,point1.y,"#000000",1); //hardcoded color! + } + + var seriesNumber = 0; + var seriesIndex = 0; + for(i=0; imaxValue) value = maxValue; + value -= minValue; + value *= valueFactor; + + /*start point (bottom left)*/ + var x0 = point0.x; + var y0 = point0.y+ barOffset + i*cellWidth; + + if(!seriesIndex) + data[i].$startX = x0; + else + x0 = data[i].$startX; + + if(value<0||(this._settings.yAxis&&value===0)){ + this.canvases["y"].renderTextAt("middle", true, x0+10,y0+barWidth/2,this._settings.label(data[i])); + continue; + } + + /*takes start value into consideration*/ + if(!yax) value += startValue/unit; + var color = this._settings.color.call(this,data[i]); + + + /*drawing bar body*/ + ctx.globalAlpha = this._settings.alpha.call(this,data[i]); + ctx.fillStyle = this._settings.color.call(this,data[i]); + ctx.beginPath(); + var points = this._setBarHPoints(ctx,x0,y0,barWidth,radius,unit,value,(this._settings.border?1:0)); + if (gradient&&!inner_gradient) ctx.lineTo(point0.x+total_width,y0+(this._settings.border?1:0)); //fix gradient sphreading + ctx.fill(); + + if (inner_gradient){ + var gradParam = this._setBarGradient(ctx,x0,y0+barWidth,x0,y0,inner_gradient,color,"x"); + ctx.fillStyle = gradParam.gradient; + ctx.beginPath(); + points = this._setBarHPoints(ctx,x0,y0, barWidth,radius,unit,value,0); + ctx.fill(); + } + /*drawing the gradient border of a bar*/ + if(this._settings.border){ + this._drawBarHBorder(ctx,x0,y0,barWidth,minValue,radius,unit,value,color); + } + + ctx.globalAlpha = 1; + + /*sets a bar label*/ + this.canvases[sIndex].renderTextAt("middle",true,data[i].$startX+(points[0]-data[i].$startX)/2-1, y0+(points[1]-y0)/2, this._settings.label(data[i])); + /*defines a map area for a bar*/ + map.addRect(data[i].id,[data[i].$startX-point0.x,y0-point0.y,points[0]-point0.x,points[1]-point0.y],sIndex); + /*the start position for the next series*/ + data[i].$startX = points[0]; + } + } +}); +webix.extend(webix.ui.chart, { + /** + * renders a spline chart + * @param: ctx - canvas object + * @param: data - object those need to be displayed + * @param: width - the width of the container + * @param: height - the height of the container + * @param: sIndex - index of drawing chart + */ + $render_spline:function(ctx, data, point0, point1, sIndex, map){ + var config,i,items,j,params,sparam,x,x0,x1,x2,y,y1,y2; + params = this._calculateLineParams(ctx,data,point0,point1,sIndex); + config = this._settings; + this._mapStart = point0; + + /*array of all points*/ + items = []; + + /*drawing all items*/ + if (data.length) { + + /*getting all points*/ + x0 = (config.offset?point0.x+params.cellWidth*0.5:point0.x); + for(i=0; i < data.length;i ++){ + y = this._getPointY(data[i],point0,point1,params); + if(y){ + x = ((!i)?x0:params.cellWidth*i - 0.5 + x0); + items.push({x:x,y:y,index:i}); + } + } + sparam = this._getSplineParameters(items); + + for(i =0; i< items.length; i++){ + x1 = items[i].x; + y1 = items[i].y; + if(ipoint1.y) + sY1=point1.y; + var sY2 = this._getSplineYPoint(j+1,x1,i,sparam.a,sparam.b,sparam.c,sparam.d); + if(sY2point1.y) + sY2=point1.y; + this._drawLine(ctx,j,sY1,j+1,sY2,config.line.color(data[i]),config.line.width); + + } + this._drawLine(ctx,x2-1,this._getSplineYPoint(j,x1,i,sparam.a,sparam.b,sparam.c,sparam.d),x2,y2,config.line.color(data[i]),config.line.width); + } + this._drawItem(ctx,x1,y1,data[items[i].index],config.label(data[items[i].index]), sIndex, map); + } + } + }, + /*gets spline parameter*/ + _getSplineParameters:function(points){ + var a ,b, c, d, i, s, u, v, + h = [], + m = [], + n = points.length; + + for(i =0; i=1; i--) + s[i] = (v[i] - h[i]*s[i+1])/u[i]; + + a = []; b = []; c = []; d = []; + + for(i =0; i 0; i --){ + x -= params.cellWidth ; + y = data[i].$startY; + if(y) + path.push([x,y]); + } + } + + // go to start point + path.push([path[0][0],path[0][1]]); + + // filling path + ctx.globalAlpha = this._settings.alpha.call(this,data[0]); + ctx.fillStyle = this._settings.color.call(this,data[0]); + ctx.beginPath(); + this._path(ctx,path); + ctx.fill(); + + // set y positions of the next series + for(i=0; i < data.length;i ++){ + y = yPos[i]; + + if(!y){ + if(i == data.length-1){ + y = data[i].$startY; + } + for(j =i+1; j< data.length; j++){ + if(yPos[j]){ + a0 = {x:point0.x,y:yPos[0]}; + a1 = {x:(point0.x+params.cellWidth*j),y:yPos[j]}; + y = solveEquation(point0.x+params.cellWidth*i,a0,a1); + break; + } + + } + } + + data[i].$startY = y; + } + + + } + } +}); + //+stackedArea +webix.extend(webix.ui.chart, { + $render_radar:function(ctx,data,x,y,sIndex,map){ + this._renderRadarChart(ctx,data,x,y,sIndex,map); + + }, + /** + * renders a pie chart + * @param: ctx - canvas object + * @param: data - object those need to be displayed + * @param: x - the width of the container + * @param: y - the height of the container + * @param: ky - value from 0 to 1 that defines an angle of inclination (02) + this._strokeRadarChart(ctx,posArr,data); + if(!config.disableItems || data.length<3) + this._drawRadarItemMarkers(ctx,posArr,data,sIndex,map); + posArr = null; + }, + _drawRadarItemMarkers:function(ctx,points,data,sIndex,map){ + for(var i=0;i < points.length;i++){ + this._drawItem(ctx,points[i].x,points[i].y,data[i],this._settings.label.call(this,data),sIndex,map); + } + }, + _fillRadarChart:function(ctx,points,data){ + var pos0,pos1; + ctx.globalAlpha= this._settings.alpha.call(this,{}); + + ctx.beginPath(); + for(var i=0;i < points.length;i++){ + ctx.fillStyle = this._settings.fill.call(this,data[i]); + pos0 = points[i]; + pos1 = (points[i+1]|| points[0]); + if(!i){ + + ctx.moveTo(pos0.x,pos0.y); + } + ctx.lineTo(pos1.x,pos1.y); + } + ctx.fill(); + ctx.globalAlpha=1; + }, + _strokeRadarChart:function(ctx,points,data){ + var pos0,pos1; + for(var i=0;i < points.length;i++){ + pos0 = points[i]; + pos1 = (points[i+1]|| points[0]); + this._drawLine(ctx,pos0.x,pos0.y,pos1.x,pos1.y,this._settings.line.color.call(this,data[i]),this._settings.line.width); + } + }, + _drawRadarAxises:function(ratios,x,y,radius,data){ + var configY = this._settings.yAxis; + var configX = this._settings.xAxis; + var start = configY.start; + var end = configY.end; + var step = configY.step; + var scaleParam= {}; + var config = this._configYAxis; + if(typeof config.step =="undefined"||typeof config.start=="undefined"||typeof config.end =="undefined"){ + var limits = this._getLimits(); + scaleParam = this._calculateScale(limits.min,limits.max); + start = scaleParam.start; + end = scaleParam.end; + step = scaleParam.step; + configY.end = end; + configY.start = start; + } + var units = []; + var i,j,p; + var c=0; + var stepHeight = radius*step/(end-start); + /*correction for small step*/ + var power,corr; + if(step<1){ + power = Math.min(this._log10(step),(start<=0?0:this._log10(start))); + corr = Math.pow(10,-power); + } + var angles = []; + if(!this.canvases["scale"]) + this.canvases["scale"] = this._createCanvas("radar_scale"); + var ctx = this.canvases["scale"].getCanvas(); + for(i = end; i>=start; i -=step){ + var value = this._logScaleCalc?Math.pow(10,i):i; + if(scaleParam.fixNum) value = parseFloat(i).toFixed(scaleParam.fixNum); + + units.push(Math.floor(c*stepHeight)+ 0.5); + if(corr && !this._logScaleCalc){ + value = Math.round(value*corr)/corr; + i = value; + } + var unitY = y-radius+units[units.length-1]; + + this.canvases["scale"].renderTextAt("middle","left",x,unitY, + configY.template(value.toString()), + "webix_axis_item_y webix_radar" + ); + if(ratios.length<2){ + this._drawScaleSector(ctx,"arc",x,y,radius-units[units.length-1],-Math.PI/2,3*Math.PI/2,i); + return; + } + var startAlpha = -Math.PI/2;/*possibly need to moved in config*/ + var alpha0 = startAlpha; + var alpha1; + + for(j=0;j< ratios.length;j++){ + if(i==end) + angles.push(alpha0); + alpha1 = startAlpha+ratios[j]-0.0001; + this._drawScaleSector(ctx,(ratios.length>2?(config.lineShape||"line"):"arc"),x,y,radius-units[units.length-1],alpha0,alpha1,i,j,data[i]); + alpha0 = alpha1; + } + c++; + } + /*renders radius lines and labels*/ + for(i=0;i< angles.length;i++){ + p = this._getPositionByAngle(angles[i],x,y,radius); + if(configX.lines.call(this,data[i],i)) + this._drawLine(ctx,x,y,p.x,p.y,(configX?configX.lineColor.call(this,data[i]):"#cfcfcf"),1); + this._drawRadarScaleLabel(ctx,x,y,radius,angles[i],(configX?configX.template.call(this,data[i]):" ")); + } + + }, + _drawScaleSector:function(ctx,shape,x,y,radius,a1,a2,i,j){ + var pos1, pos2; + if(radius<0) + return false; + pos1 = this._getPositionByAngle(a1,x,y,radius); + pos2 = this._getPositionByAngle(a2,x,y,radius); + var configY = this._settings.yAxis; + if(configY.bg){ + ctx.beginPath(); + ctx.moveTo(x,y); + if(shape=="arc") + ctx.arc(x,y,radius,a1,a2,false); + else{ + ctx.lineTo(pos1.x,pos1.y); + ctx.lineTo(pos2.x,pos2.y); + } + ctx.fillStyle = configY.bg(i,j); + ctx.moveTo(x,y); + ctx.fill(); + ctx.closePath(); + } + if(configY.lines.call(this,i)){ + ctx.lineWidth = 1; + ctx.beginPath(); + if(shape=="arc") + ctx.arc(x,y,radius,a1,a2,false); + else{ + ctx.moveTo(pos1.x,pos1.y); + ctx.lineTo(pos2.x,pos2.y); + } + ctx.strokeStyle = configY.lineColor.call(this,i); + ctx.stroke(); + } + }, + _drawRadarScaleLabel:function(ctx,x,y,r,a,text){ + var t = this.canvases["scale"].renderText(0,0,text,"webix_axis_radar_title",1); + var width = t.scrollWidth; + var height = t.offsetHeight; + var delta = 0.001; + var pos = this._getPositionByAngle(a,x,y,r+5); + var corr_x=0,corr_y=0; + if(a<0||a>Math.PI){ + corr_y = -height; + } + if(a>Math.PI/2){ + corr_x = -width; + } + if(Math.abs(a+Math.PI/2) limits.max) + pos = point0[axis.toLowerCase()]; + /*the limit of the minimum value*/ + if(value < limits.min) + pos = point1[axis.toLowerCase()]; + return pos; + }, + _calcScatterUnit:function(p,min,max,size,axis){ + var relativeValues = this._getRelativeValue(min,max); + axis = (axis||""); + p["relValue"+axis] = relativeValues[0]; + p["valueFactor"+axis] = relativeValues[1]; + p["unit"+axis] = (p["relValue"+axis]?size/p["relValue"+axis]:10); + } +}); +/*chart presents*/ +webix.extend(webix.ui.chart, { + presets:{ + "simple":{ + item:{ + borderColor: "#ffffff", + color: "#2b7100", + shadow: false, + borderWidth:2 + }, + line:{ + color:"#8ecf03", + width:2 + } + }, + "plot":{ + color:"#1293f8", + item:{ + borderColor:"#636363", + borderWidth:1, + color: "#ffffff", + type:"r", + shadow: false + }, + line:{ + color:"#1293f8", + width:2 + } + }, + "diamond":{ + color:"#b64040", + item:{ + borderColor:"#b64040", + color: "#b64040", + type:"d", + radius:3, + shadow:true + }, + line:{ + color:"#ff9000", + width:2 + } + }, + "point":{ + color:"#fe5916", + disableLines:true, + fill:false, + disableItems:false, + item:{ + color:"#feb916", + borderColor:"#fe5916", + radius:2, + borderWidth:1, + type:"r" + }, + alpha:1 + }, + "line":{ + line:{ + color:"#3399ff", + width:2 + }, + item:{ + color:"#ffffff", + borderColor:"#3399ff", + radius:2, + borderWidth:2, + type:"d" + }, + fill:false, + disableItems:false, + disableLines:false, + alpha:1 + }, + "area":{ + fill:"#3399ff", + line:{ + color:"#3399ff", + width:1 + }, + disableItems:true, + alpha: 0.2, + disableLines:false + }, + "round":{ + item:{ + radius:3, + borderColor:"#3f83ff", + borderWidth:1, + color:"#3f83ff", + type:"r", + shadow:false, + alpha:0.6 + } + }, + "square":{ + item:{ + radius:3, + borderColor:"#447900", + borderWidth:2, + color:"#69ba00", + type:"s", + shadow:false, + alpha:1 + } + }, + /*bar*/ + "column":{ + color:"RAINBOW", + gradient:false, + barWidth:45, + radius:0, + alpha:1, + border:true + }, + "stick":{ + barWidth:5, + gradient:false, + color:"#67b5c9", + radius:2, + alpha:1, + border:false + }, + "alpha":{ + color:"#b9a8f9", + barWidth:70, + gradient:"falling", + radius:0, + alpha:0.5, + border:true + } + } +}); + +/* + UI:Calendar +*/ + + + + + + + +webix.protoUI({ + name:"calendar", + + defaults:{ + date: new Date(), //selected date, not selected by default + select: false, + navigation: true, + monthSelect: true, + weekHeader: true, + weekNumber: false, + skipEmptyWeeks: false, + + calendarHeader: "%F %Y", + calendarWeekHeader: "W#", + //calendarTime: "%H:%i", + events:webix.Date.isHoliday, + minuteStep: 5, + icons: false, + timepickerHeight: 30, + headerHeight: 70, + dayTemplate: function(d){ + return d.getDate(); + }, + width: 259, + height: 250 + }, + + dayTemplate_setter: webix.template, + calendarHeader_setter:webix.Date.dateToStr, + calendarWeekHeader_setter:webix.Date.dateToStr, + calendarTime_setter:function(format){ + this._calendarTime = format; + return webix.Date.dateToStr(format); + }, + date_setter:function(date){ + return this._string_to_date(date); + }, + maxDate_setter:function(date){ + return this._string_to_date(date); + }, + minDate_setter:function(date){ + return this._string_to_date(date); + }, + + $init: function() { + this._viewobj.className += " webix_calendar"; + + //special dates + this._special_dates = {}; + this._selected_date_part = this._selected_date = null; + this._zoom_level = 0; + }, + type_setter: function(value){ + if(value == "time"){ + this._zoom_in = true; + this._zoom_level = -1; + } + return value; + }, + $setSize:function(x,y){ + + if(webix.ui.view.prototype.$setSize.call(this,x,y)){ + //repaint calendar when size changed + this.render(); + } + }, + $getSize:function(dx, dy){ + if (this._settings.cellHeight){ + var state = this._getDateBoundaries(this._settings.date); + this._settings.height = this._settings.cellHeight * state._rows + (webix.skin.$active.calendarHeight||70); + } + return webix.ui.view.prototype.$getSize.call(this, dx,dy); + }, + _getDateBoundaries: function(date, reset) { + // addition information about rendering event: + // how many days from the previous month, + // next, + // number of weeks to display and so on + + if (!this._set_date_bounds || reset){ + var month = date.getMonth(); + var year = date.getFullYear(); + + var next = new Date(year, month+1, 1); + var start = webix.Date.weekStart(new Date(year, month, 1)); + + var days = Math.round((next.valueOf() - start.valueOf())/(60*1000*60*24)); + var rows = this._settings.skipEmptyWeeks?Math.ceil(days/7):6; + + this._set_date_bounds = { _month: month, _start:start, _next:next, _rows: rows}; + } + + return this._set_date_bounds; + }, + $skin:function(){ + if(webix.skin.$active.calendar){ + if( webix.skin.$active.calendar.width) + this.defaults.width = webix.skin.$active.calendar.width; + if( webix.skin.$active.calendar.height) + this.defaults.height = webix.skin.$active.calendar.height; + if( webix.skin.$active.calendar.headerHeight) + this.defaults.headerHeight = webix.skin.$active.calendar.headerHeight; + if( webix.skin.$active.calendar.timepickerHeight) + this.defaults.timepickerHeight = webix.skin.$active.calendar.timepickerHeight; + } + + }, + _getColumnConfigSizes: function(date){ + var bounds = this._getDateBoundaries(date); + + var s = this._settings; + var _columnsHeight = []; + var _columnsWidth = []; + + var containerWidth = this._content_width - 36; + + var containerHeight = this._content_height - this._settings.headerHeight - 10 - (this._settings.timepicker||this._icons?this._settings.timepickerHeight:0); + + var columnsNumber = (s.weekNumber)?8:7; + for(var i=0; i"+webix.i18n.calendar.today+""; + }, + on_click:{ + "webix_cal_icon_today": function(){ + this.setValue(new Date()); + this.callEvent("onTodaySet",[this.getSelectedDate()]); + } + } + }, + { + template: function(){ + return ""+webix.i18n.calendar.clear+""; + }, + on_click:{ + "webix_cal_icon_clear": function(){ + this.setValue(""); + this.callEvent("onDateClear",[this.getSelectedDate()]); + } + } + } + ], + refresh:function(){ this.render(); }, + render: function() { + //reset zoom level + this._zoom_level = 0; + this._zoom_size = false; + + var s = this._settings; + + if (!this.isVisible(s.id)) return; + this._current_time = webix.Date.datePart(new Date()); + + if (webix.debug_render) + webix.log("Render: "+this.name+"@"+s.id); + this.callEvent("onBeforeRender",[]); + + var date = this._settings.date; + + var bounds = this._getDateBoundaries(date, true); + var sizes = this._getColumnConfigSizes(date); + var width = sizes[0]; + var height = sizes[1]; + + var html = "
    "+s.calendarHeader(date)+''; + if (s.navigation) + html += "
    "; + html += "
    "; + + if(s.weekHeader) + html += "
    "+this._week_template(width)+"
    "; + + html += "
    "+this._body_template(width, height, bounds)+"
    "; + + if (this._settings.timepicker || this._icons){ + html += ""; + } + + + this._contentobj.innerHTML = html; + + if(this._settings.type == "time"){ + var time = this._settings.date; + if(time){ + if(typeof(time) == "string"){ + date = webix.i18n.parseTimeFormatDate(time); + } + else if(webix.isArray(time)){ + date.setHours(time[0]); + date.setMinutes(time[1]); + } + } + this._changeZoomLevel(-1,date); + } + this.callEvent("onAfterRender",[]); + }, + _icons_template: function(date){ + var html = "
    "; + var icons = this._icons; + + for(var i=0; i < icons.length; i++){ + if(icons[i].template){ + var template = (typeof(icons[i].template) == "function"?icons[i].template: webix.template(icons[i].template)); + html += template.call(this,date); + } + if(icons[i].on_click){ + webix.extend(this.on_click,icons[i].on_click); + } + } + html += "
    "; + return html; + }, + _timepicker_template:function(date){ + var timeFormat = this._settings.calendarTime||webix.i18n.timeFormatStr; + return "
    "+timeFormat(date)+"
    "; + }, + _week_template: function(widths){ + var s = this._settings; + var week_template = ''; + var correction = 0; + + if(s.weekNumber) { + correction = 1; + week_template += "
    "+s.calendarWeekHeader()+"
    "; + } + + var k = (webix.Date.startOnMonday)?1:0; + for (var i=0; i<7; i++){ // 7 days total + var day_index = (k + i) % 7; // 0 - Sun, 6 - Sat as in Locale.date.day_short + var day = webix.i18n.calendar.dayShort[day_index]; // 01, 02 .. 31 + week_template += "
    "+day+"
    "; + } + + return week_template; + }, + blockDates_setter:function(value){ + return webix.toFunctor(value, this.$scope); + }, + _day_css:function(day, bounds){ + var css = "webix_cal_day"; + if (webix.Date.equal(day, this._current_time)) + css += " webix_cal_today"; + if (webix.Date.equal(day, this._selected_date_part)) + css += " webix_cal_select"; + if (day.getMonth() != bounds._month) + css += " webix_cal_outside"; + + if ( (this._settings.blockDates && this._settings.blockDates.call(this,day)) || + ( day < this._settings.minDate || day > this._settings.maxDate)) + css+= " webix_cal_day_disabled"; + + if (this._settings.events) + css+=" "+this._settings.events(day); + + return css; + }, + _body_template: function(widths, heights, bounds){ + var s = this._settings; + var html = ""; + var day = webix.Date.datePart(webix.Date.copy(bounds._start)); + var start = s.weekNumber?1:0; + var weekNumber = webix.Date.getISOWeek(webix.Date.add(day,2,"day", true)); + + var min = this._settings.minDate || new Date(1,1,1); + var max = this._settings.maxDate || new Date(9999,1,1); + + + for (var y=0; y"; + if (start) + html += "
    "+weekNumber+"
    "; + + for (var x=start; x"+d+""; + day = webix.Date.add(day, 1, "day"); + if(day.getHours()){ + day = webix.Date.datePart(day); + } + } + + html += ""; + weekNumber++; + } + return html; + }, + _changeDate:function(dir, step, notset){ + var now = this._settings.date; + if(!step) { step = this._zoom_logic[this._zoom_level]._changeStep; } + if(!this._zoom_level){ + now = webix.Date.copy(now); + now.setDate(1); + } + var next = webix.Date.add(now, dir*step, "month", true); + this._changeDateInternal(now, next); + }, + _changeDateInternal:function(now, next){ + if(this.callEvent("onBeforeMonthChange", [now, next])){ + if (this._zoom_level){ + this._update_zoom_level(next); + } + else{ + this.showCalendar(next); + } + this.callEvent("onAfterMonthChange", [next, now]); + } + }, + _zoom_logic:{ + "-2":{ + _setContent:function(next, i){ next.setMinutes(i); } + }, + "-1":{ + _setContent:function(next, i){ next.setHours(i); } + }, + "0":{ + _changeStep:1 + },//days + "1":{ //months + _getTitle:function(date){ return date.getFullYear(); }, + _getContent:function(i){ return webix.i18n.calendar.monthShort[i]; }, + _setContent:function(next, i){ if(i!=next.getMonth()) next.setDate(1);next.setMonth(i); }, + _changeStep:12 + }, + "2":{ //years + _getTitle:function(date){ + var start = date.getFullYear(); + this._zoom_start_date = start = start - start%10 - 1; + return start+" - "+(start+10); + }, + _getContent:function(i){ return this._zoom_start_date+i; }, + _setContent:function(next, i){ next.setFullYear(this._zoom_start_date+i); }, + _changeStep:12*10 + } + }, + _update_zoom_level:function(date){ + var css, height, i, selected, width; + var html = ""; + var index = this._settings.weekHeader?2: 1; + var zlogic = this._zoom_logic[this._zoom_level]; + var sections = this._contentobj.childNodes; + + if (date) + this._settings.date = date; + + + //store width and height of draw area + if (!this._zoom_size){ + /*this._reserve_box_height = sections[index].offsetHeight +(index==2?sections[1].offsetHeight:0);*/ + + this._reserve_box_height = this._contentobj.offsetHeight - this._settings.headerHeight - this._settings.timepickerHeight; + this._reserve_box_width = sections[index].offsetWidth; + this._zoom_size = 1; + } + + //main section + if (this._zoom_in){ + //hours and minutes + height = this._reserve_box_height/6; + var timeColNum = 6; + var timeFormat = this._calendarTime||webix.i18n.timeFormat; + var enLocale = timeFormat.match(/%([a,A])/); + if(enLocale) + timeColNum++; + width = parseInt((this._reserve_box_width-3)/timeColNum,10); + + html += "
    "+this._timeHeaderTemplate(width,enLocale)+"
    "; + html += "
    "; + html += "
    "; + selected = this._settings.date.getHours(); + for (i=0; i<24; i++){ + css=""; + if(enLocale){ + if((selected>11&&i<=11)||(selected<=11&&i>11)) + css = " webix_cal_blurred_hours"; + if(i%4===0){ + var label = (i==4?"AM":(i==16?"PM":"")); + html += "
    "+label+"
    "; + } + } + css += (selected == i? " webix_selected" : ""); + var value = webix.Date.toFixed(enLocale&& i>12?i-12:i); + html += "
    "+value+"
    "; + } + html += "
    "; + html += "
    "; + selected = this._settings.date.getMinutes(); + for (i=0; i<60; i+=this._settings.minuteStep){ + css = (selected == i ? " webix_selected" : ""); + html += "
    "+webix.Date.toFixed(i)+"
    "; + } + html += "
    "; + html += "
    "; + html += ""; + this._contentobj.innerHTML = html; + } else { + //years and months + //reset header + sections[0].firstChild.innerHTML = zlogic._getTitle(this._settings.date); + height = this._reserve_box_height/3; + width = this._reserve_box_width/4; + selected = (this._zoom_level==1?this._settings.date.getMonth():this._settings.date.getFullYear()); + for (i=0; i<12; i++){ + css = (selected == (this._zoom_level==1?i:zlogic._getContent(i)) ? " webix_selected" : ""); + html+="
    "+zlogic._getContent(i)+"
    "; + } + if(index-1){ + sections[index-1].style.display = "none"; + } + sections[index].innerHTML = html; + if(!sections[index+1]){ + this._contentobj.innerHTML += ""; + } + else + sections[index+1].innerHTML=this._timeButtonsTemplate(); + sections[index].style.height = this._reserve_box_height+"px"; + } + }, + _getCalSizesString: function(width,height){ + return "width:"+width+"px; height:"+height+"px; line-height:"+height+"px;"; + }, + _timeButtonsTemplate: function(){ + return ""; + }, + _timeHeaderTemplate: function(width,enLocale){ + var w1 = width*(enLocale?5:4); + var w2 = width*2; + return "
    "+webix.i18n.calendar.hours+"
    "+webix.i18n.calendar.minutes+"
    "; + }, + _changeZoomLevel: function(zoom,date){ + if(this.callEvent("onBeforeZoom",[zoom])){ + this._zoom_level = zoom; + if(zoom) + this._update_zoom_level(date); + else + this.showCalendar(date); + this.callEvent("onAfterZoom",[zoom]); + } + }, + _mode_selected:function(value){ + var now = this._settings.date; + var next = webix.Date.copy(now); + this._zoom_logic[this._zoom_level]._setContent(next, value); + var zoom = this._zoom_level-1; + this._changeZoomLevel(zoom, next); + }, + // selects date and redraw calendar + _selectDate: function(date){ + if(this.callEvent("onBeforeDateSelect", [date])){ + this.selectDate(date, true); + this.callEvent("onDateSelect", [date]); // should be deleted in a future version + this.callEvent("onAfterDateSelect", [date]); + } + }, + on_click:{ + webix_cal_prev_button: function(e, id, target){ + this._changeDate(-1); + }, + webix_cal_next_button: function(e, id, target){ + this._changeDate(1); + }, + webix_cal_day: function(e, id, target){ + if(target.className.indexOf('webix_cal_day_disabled')!==-1) + return false; + var cind = webix.html.index(target) - (this._settings.weekNumber?1:0); + var rind = webix.html.index(target.parentNode); + var date = webix.Date.add(this._getDateBoundaries()._start, cind + rind*7, "day", true); + if (this._settings.timepicker){ + date.setHours(this._settings.date.getHours()); + date.setMinutes(this._settings.date.getMinutes()); + } + this._selectDate(date); + + }, + webix_cal_time:function(e){ + if(this._zoom_logic[this._zoom_level-1]){ + this._zoom_in = true; + var zoom = this._zoom_level - 1; + this._changeZoomLevel(zoom); + } + }, + webix_cal_done:function(e){ + this._selectDate(this._settings.date); + }, + webix_cal_month_name:function(e){ + this._zoom_in = false; + //maximum zoom reached + if (this._zoom_level == 2 || !this._settings.monthSelect) return; + + var zoom = Math.max(this._zoom_level, 0) + 1; + this._changeZoomLevel(zoom); + }, + webix_cal_block:function(e, id, trg){ + if(this._zoom_in){ + var level = (trg.className.indexOf("webix_cal_block_min")!=-1?this._zoom_level-1:this._zoom_level); + var now = this._settings.date; + var next = webix.Date.copy(now); + this._zoom_logic[level]._setContent(next, trg.getAttribute("data-value")*1); + this._update_zoom_level(next); + } + else{ + this._mode_selected(trg.getAttribute("data-value")*1); + } + } + }, + + + _string_to_date: function(date, format){ + if (!date){ + return webix.Date.datePart(new Date()); + } + + + if(typeof date == "string"){ + if (format) + date = webix.Date.strToDate(format)(date); + else + date=webix.i18n.parseFormatDate(date); + } + + return date; + }, + showCalendar: function(date) { + date = this._string_to_date(date); + + //date is already visible, skip update + this._settings.date = date; + this.render(); + this.resize(); + }, + getSelectedDate: function() { + return (this._selected_date)?webix.Date.copy(this._selected_date):this._selected_date; + + }, + getVisibleDate: function() { + return webix.Date.copy(this._settings.date); + }, + setValue: function(date, format){ + this.selectDate(date, true); + }, + getValue: function(format){ + var date = this.getSelectedDate(); + if (format) + date = webix.Date.dateToStr(format)(date); + return date; + }, + selectDate: function(date, show){ + if(date){ + date = this._string_to_date(date); + this._selected_date = date; + this._selected_date_part = webix.Date.datePart(webix.Date.copy(date)); + } + else{ //deselect + this._selected_date = null; + this._selected_date_part = null; + if(this._settings.date){ + webix.Date.datePart(this._settings.date); + } + } + + if (show) + this.showCalendar(date); + else + this.render(); + + this.callEvent("onChange",[date]); + }, + locate:function(){ return null; } + +}, webix.MouseEvents, webix.ui.view, webix.EventSystem); + + + + + + + +webix.protoUI({ + name:"property", + $init:function(){ + this._contentobj.className+=" webix_property"; + this._destroy_with_me = []; + }, + defaults:{ + nameWidth:100, + editable:true + }, + on_render:{ + checkbox:function(value, config){ + return ""; + }, + color:function(value, config){ + return "
    " +value+"
    "; + } + }, + on_edit:{ + label:false + }, + _id:"webix_f_id", + on_click:{ + webix_property_check:function(ev){ + var id = this.locate(ev); + this.getItem(id).value = !this.getItem(id).value; + this.callEvent("onCheck",[id, this.getItem(id).value]); + return false; + } + }, + on_dblclick:{ + }, + registerType:function(name, data){ + if (data.template) + this.on_render[name] = data.template; + if (data.editor) + this.on_edit[name] = data.editor; + if (data.click) + for (var key in data.click) + this.on_click[key] = data.click[key]; + }, + elements_setter:function(data){ + this._idToLine = {}; + for(var i =0; i < data.length; i++){ + var line = data[i]; + if (line.type == "multiselect") + line.optionslist = true; + + //line.type = line.type||"label"; + line.id = line.id||webix.uid(); + line.label = line.label||""; + line.value = line.value||""; + this._idToLine[line.id] = i; + this.template = this._map_options(data[i]); + } + return data; + }, + showItem:function(id){ + webix.RenderStack.showItem.call(this, id); + }, + locate:function(e){ + return webix.html.locate(arguments[0], this._id); + }, + getItemNode:function(id){ + return this._dataobj.childNodes[this._idToLine[id]]; + }, + getItem:function(id){ + return this._settings.elements[this._idToLine[id]]; + }, + _get_editor_type:function(id){ + var type = this.getItem(id).type; + if (type == "checkbox") return "inline-checkbox"; + var alter_type = this.on_edit[type]; + return (alter_type === false)?false:(alter_type||type); + }, + _get_edit_config:function(id){ + return this.getItem(id); + }, + _find_cell_next:function(start, check , direction){ + var row = this._idToLine[start.id]; + var order = this._settings.elements; + + if (direction){ + for (var i=row+1; i=0; i--){ + if (check.call(this, order[i].id)) + return order[i].id; + } + } + + return null; + }, + updateItem:function(){ + this.refresh(); + }, + _cellPosition:function(id){ + var html = this.getItemNode(id); + return { + left:html.offsetLeft+this._settings.nameWidth, + top:html.offsetTop, + height:html.firstChild.offsetHeight, + width:this._data_width, + parent:this._contentobj + }; + }, + setValues:function(data, update){ + if(!update) this._clear(); + for(var key in data){ + var line = this.getItem(key); + if (line) + line.value = data[key]; + } + + this._props_dataset = data; + this.refresh(); + }, + _onLoad:function(){ + //use setValues after data loading + return webix.Values._onLoad.apply(this, arguments); + }, + _clear:function(){ + var lines = this._settings.elements; + for (var i=0; i'; + if (data.type == "label") + html[i] = pre+"
    "+data.label+"
    "; + else { + var render = this.on_render[data.type], + content; + var post = "
    "+data.label+"
    "; + if(data.collection || data.options){ + content = data.template(data, data.value); + }else if(data.format) + content = data.format(data.value); + else + content = data.value; + if (render) + content = render.call(this, data.value, data); + html[i] = pre+post+content+"
    "; + } + } + return html.join(""); + }, + type:{ + height:24, + templateStart:webix.template(""), + templateEnd:webix.template("") + }, + $skin: function(){ + this.type.height = webix.skin.$active.propertyItemHeight||24; + } +}, webix.EditAbility, webix.MapCollection, webix.MouseEvents, webix.Scrollable, webix.SingleRender, webix.AtomDataLoader, webix.EventSystem, webix.ui.view); + + + + + +webix.protoUI({ + name:"colorboard", + defaults:{ + template:"
    ", + palette:null, + height:220, + width:220, + cols:12, + rows:10, + minLightness:0.15, + maxLightness:1 + }, + $init:function(config){ + webix.event(this._viewobj, "click", webix.bind(function(e){ + var value = webix.html.locate(e, "webix_val"); + this.setValue(value); + this.callEvent("onSelect", [this._settings.value, e]); + }, this)); + }, + _findIndex:function(value){ + var pal = this._settings.palette; + value = value.toUpperCase(); + for(var r= 0, rows= pal.length; r < rows; r++) + for(var c= 0, cols = pal[r].length; c < cols; c++){ + if(pal[r][c].toUpperCase() == value){ + return {row:r, col:c}; + } + } + return null; + }, + $setSize:function(x,y){ + if(webix.ui.view.prototype.$setSize.call(this,x,y)){ + this.render(); + } + }, + getValue:function(){ + return this._settings.value; + }, + _getBox:function(){ + return this._viewobj.firstChild; + }, + setValue:function(value){ + if(!value) + return; + if(value.charAt(0) != "#") + value = '#' + value; + + this._settings.value = value; + this._drawSelection(value); + + return value; + }, + _selectBox:null, + _getSelectBox:function(){ + if( this._selectBox && this._selectBox.parentNode ){ + return this._selectBox; + }else{ + var div = this._selectBox = document.createElement("div"); + div.className = "webix_color_selector"; + this._viewobj.lastChild.appendChild(div); + return div; + } + }, + _drawSelection:function(value, cell){ + if(this.isVisible()){ + var left = 0, top = 0; + + if(!cell){ + var ind = this._findIndex(value); + if(ind){ + cell = this._viewobj.lastChild.childNodes[ind.row].childNodes[ind.col]; + } + } + + if(cell && cell.parentNode && cell.parentNode.parentNode){ + var parent = cell.parentNode; + left = cell.offsetLeft - parent.offsetLeft ; + top = - (this.$height - (cell.offsetTop -parent.parentNode.offsetTop )) ; + }else{ + if (this._selectBox) + this._selectBox.style.left = "-100px"; + return; + } + + var div = this._getSelectBox(); + var style = [ + "left:" + left + "px", + "top:" + top+"px", + "width:" + cell.style.width, + "height:" + cell.style.height + ].join(";"); + + if( typeof( div.style.cssText ) !== 'undefined' ) { + div.style.cssText = style; + } else { + div.setAttribute('style',style); + } + } + }, + + + _initPalette:function(config){ + function numToHex(n){ + return webix.color.toHex(n, 2); + } + function rgbToHex(r,g,b){ + return "#"+numToHex( Math.floor(r)) +numToHex( Math.floor(g)) + numToHex(Math.floor(b)); + } + function hslToRgb(h, s, l){ + var r, g, b; + if(!s){ + r = g = b = l; // achromatic + }else{ + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return {r:r * 255, g:g * 255, b:b * 255}; + } + function hue2rgb(p, q, t){ + if(t < 0) t += 1; + if(t > 1) t -= 1; + if (t < 1/6) + return p + (q - p) * 6 * t; + else if (t <= 1/2) + return q; + else if (t < 2/3) + return p + (q - p) * (2/3 - t) * 6; + else + return p; + } + + function renderGrayBar(colCount){ + var gray = [], + val = 255, + step = val / colCount; + + for(var i=0; i < colCount; i++){ + val = Math.round(val > 0 ? val : 0); + gray.push(rgbToHex(val, val, val)); + val -= step; + } + gray[gray.length - 1] = "#000000"; + return gray; + } + + var colors = []; + var colorRows = config.rows - 1; + var colorStep = 1/config.cols; + var lightStep = (config.maxLightness - config.minLightness)/colorRows; + var colorRange = null; + + colors.push(renderGrayBar(config.cols)); + + for(var step = 0, lt = config.minLightness; step < colorRows; step++){ + colorRange = []; + for(var c = 0, col = 0; c < config.cols; c++ ){ + var val = hslToRgb(col, 1, lt ); + colorRange.push(rgbToHex(val.r, val.g, val.b)); + col += colorStep; + } + colors.push(colorRange); + lt+=lightStep; + } + + this._settings.palette = colors; + }, + + + render:function(){ + if(!this.isVisible(this._settings.id)) + return; + + if(!this._settings.palette) + this._initPalette(this._settings); + var palette = this._settings.palette; + + this.callEvent("onBeforeRender",[]); + var config = this._settings, + itemTpl = webix.template("
    " + (config.template||"") + "
    "), + data = {width: 0, height:0, val:0}, + width = this.$width, + height = this.$height, + widths = []; + + var html = "
    "; + + var firstRow = (typeof palette[0] == "object") ? palette[0] : palette; + for(var i=0; i < firstRow.length; i++){ + widths[i] = Math.floor(width/(firstRow.length - i)); + width -= widths[i]; + } + + if(typeof palette[0] == "object"){ + for(var r=0; r < palette.length; r++){ + var cellHeight = Math.floor(height/(palette.length - r)); + height -= cellHeight; + var row = palette[r]; + html += renderRow(row, widths, cellHeight); + } + }else{ + html+= renderRow(palette, widths, height); + } + + html += "
    "; + this._viewobj.innerHTML = html; + + function renderRow(row, widths, height){ + var rowHtml = "
    "; + for(var cell = 0; cell < row.length; cell++){ + data.width = widths[cell]; + data.height = height; + data.val = row[cell]; + rowHtml += itemTpl(data); + } + rowHtml += "
    "; + return rowHtml; + } + this._selectBox = null; + this.callEvent("onAfterRender",[]); + }, + refresh:function(){ this.render(); } +}, webix.ui.view, webix.EventSystem); + + +webix.protoUI({ + name:"resizer", + defaults:{ + width:7, height:7 + }, + $init:function(config){ + webix.assert(this.getParentView(), "Resizer can't be initialized outside a layout"); + + var space = this.getParentView()._margin; + + webix.event(this._viewobj, webix.env.mouse.down, this._rsDown, this); + webix.event(document.body, webix.env.mouse.up, this._rsUp, this); + + var dir = this._getResizeDir(); + + this._rs_started = false; + this._resizer_dir = dir; + + this._resizer_dim = (dir=="x"?"width":"height"); + + if (dir=="x") + config.height = 0; + else + config.width = 0; + + if (space>0){ + this._viewobj.className += " webix_resizer_v"+dir; + this._viewobj.style.marginRight = "-"+space+"px"; + if (dir == "x") + config.width = space; + else + config.height = space; + this.$nospace = true; + } else + this._viewobj.className += " webix_resizer_"+dir; + + this._viewobj.innerHTML = "
    "; + if (dir == "y" && space>0) this._viewobj.style.marginBottom = "-"+(config.height||this.defaults.height)+"px"; + }, + _rsDown:function(e){ + var cells = this._getResizerCells(); + //some sibling can block resize + if(cells){ + e = e||event; + this._rs_started = true; + this._rs_process = webix.html.pos(e); + this._rsLimit = []; + this._rsStart(e, cells[0]); + } + }, + _rsUp:function(){ + this._rs_started = false; + this._rs_process = false; + }, + _rsStart:function(e, cell){ + var dir,offset, pos,posParent,start; + e = e||event; + dir = this._resizer_dir; + + /*layout position:relative to place absolutely positioned elements in it*/ + this.getParentView()._viewobj.style.position = "relative"; + pos = webix.html.offset(this._viewobj); + posParent = webix.html.offset(this.getParentView()._viewobj); + start = pos[dir]-posParent[dir]; + offset = webix.html.offset(cell.$view)[dir]- webix.html.offset(this.getParentView().$view)[dir]; + + this._rs_progress = [dir,cell, start, offset]; + /*resizer stick (resizerea ext)*/ + + this._resizeStick = new webix.ui.resizearea({ + container:this.getParentView()._viewobj, + dir:dir, + eventPos:this._rs_process[dir], + start:start-1, + height: this.$height, + width: this.$width, + border: 1, + margin: this.getParentView()["_padding"+dir.toUpperCase()] + }); + + /*stops resizing on stick mouseup*/ + this._resizeStick.attachEvent("onResizeEnd", webix.bind(this._rsEnd, this)); + /*needed to stop stick moving when the limit for dimension is reached*/ + this._resizeStick.attachEvent("onResize", webix.bind(this._rsResizeHandler, this)); + + webix.html.addCss(document.body,"webix_noselect",1); + }, + _getResizeDir: function(){ + return this.getParentView()._vertical_orientation?"y":"x"; + }, + _rsResizeHandler:function(){ + var cells,config,cDiff,diff,dir,i,limits,limitSizes,sizes,totalSize; + if(this._rs_progress){ + cells = this._getResizerCells(); + dir = this._rs_progress[0]; + /*vector distance between resizer and stick*/ + diff = this._resizeStick._last_result -this._rs_progress[2]; + /*new sizes for the resized cells, taking into account the stick position*/ + sizes = this._rsGetDiffCellSizes(cells,dir,diff); + /*sum of cells dimensions*/ + totalSize = cells[0]["$"+this._resizer_dim]+cells[1]["$"+this._resizer_dim]; + /*max and min limits if they're set*/ + limits = (dir=="y"?["minHeight","maxHeight"]:["minWidth","maxWidth"]); + for(i=0;i<2;i++){ + config = cells[i]._settings; + cDiff = (i?-diff:diff);/*if cDiff is positive, the size of i cell is increased*/ + /*if size is bigger than max limit or size is smaller than min limit*/ + var min = config[limits[0]]; + var max = config[limits[1]]; + + if(cDiff>0&&max&&max<=sizes[i] || cDiff<0&&(min||3)>=sizes[i]){ + this._rsLimit[i] = (cDiff>0?max:(min||3)); + /*new sizes, taking into account max and min limits*/ + limitSizes = this._rsGetLimitCellSizes(cells,dir); + /*stick position*/ + this._resizeStick._dragobj.style[(dir=="y"?"top":"left")] = this._rs_progress[3] + limitSizes[0]+"px"; + return; + }else if(sizes[i]<3){/*cells size can not be less than 1*/ + this._resizeStick._dragobj.style[(dir=="y"?"top":"left")] = this._rs_progress[3] + i*totalSize+1+"px"; + }else{ + this._rsLimit[i] = null; + } + } + } + }, + _getResizerCells:function(){ + var cells,i; + cells = this.getParentView()._cells; + for(i=0; i< cells.length;i++){ + if(cells[i]==this){ + if (!cells[i-1] || cells[i-1]._settings.$noresize) return null; + if (!cells[i+1] || cells[i+1]._settings.$noresize) return null; + return [cells[i-1],cells[i+1]]; + } + } + }, + _rsEnd:function(result){ + if (typeof result == "undefined") return; + + var cells,dir,diff,i,size; + var vertical = this.getParentView()._vertical_orientation; + this._resizerStick = null; + if (this._rs_progress){ + dir = this._rs_progress[0]; + diff = result-this._rs_progress[2]; + cells = this._getResizerCells(); + if(cells[0]&&cells[1]){ + /*new cell sizes*/ + size = this._rsGetCellSizes(cells,dir,diff); + for (var i=0; i<2; i++){ + //cell has not fixed size, of fully fixed layout + var cell_size = cells[i].$getSize(0,0); + if (vertical?(cell_size[2] == cell_size[3]):(Math.abs(cell_size[1]-cell_size[0])<3)){ + /*set fixed sizes for both cells*/ + cells[i]._settings[this._resizer_dim]=size[i]; + if (cells[i]._bubble_size) + cells[i]._bubble_size(this._resizer_dim, size[i], vertical); + } else { + var actualSize = cells[i].$view[vertical?"offsetHeight":"offsetWidth"];//cells[i]["$"+this._resizer_dim]; + cells[i]._settings.gravity = size[i]/actualSize*cells[i]._settings.gravity; + } + } + + cells[0].resize(); + + for (var i = 0; i < 2; i++) + if (cells[i].callEvent) + cells[i].callEvent("onViewResize",[]); + webix.callEvent("onLayoutResize", [cells]); + } + this._rs_progress = false; + } + this._rs_progress = false; + this._rs_started = false; + this._rsLimit = null; + webix.html.removeCss(document.body,"webix_noselect"); + }, + _rsGetLimitCellSizes: function(cells){ + var size1,size2,totalSize; + totalSize = cells[0]["$"+this._resizer_dim]+cells[1]["$"+this._resizer_dim]; + if(this._rsLimit[0]){ + size1 = this._rsLimit[0]; + size2 = totalSize-size1; + } + else if(this._rsLimit[1]){ + size2 = this._rsLimit[1]; + size1 = totalSize-size2; + } + return [size1,size2]; + }, + _rsGetDiffCellSizes:function(cells,dir,diff){ + var sizes =[]; + for(var i=0;i<2;i++) + sizes[i] = cells[i]["$"+this._resizer_dim]+(i?-1:1)*diff; + return sizes; + }, + _rsGetCellSizes:function(cells,dir,diff){ + var i,sizes,totalSize; + /*if max or min dimentsions are set*/ + if(this._rsLimit[0]||this._rsLimit[1]){ + sizes = this._rsGetLimitCellSizes(cells,dir); + } + else{ + sizes = this._rsGetDiffCellSizes(cells,dir,diff); + for(i =0; i<2;i++ ){ + /*if stick moving is stopped outsize cells borders*/ + if(sizes[i]<0){ + totalSize = sizes[0]+sizes[1]; + sizes[i] =1; + sizes[1-i] = totalSize-1; + } + } + + } + return sizes; + } +}, webix.MouseEvents, webix.ui.view); + + + +webix.protoUI({ + name:"multiview", + defaults:{ + animate:{ + } + }, + setValue:function(val){ + webix.$$(val).show(); + }, + getValue:function(){ + return this.getActiveId(); + }, + $init:function(){ + this._active_cell = 0; + this._vertical_orientation = 1; + this._viewobj.style.position = "relative"; + this._viewobj.className += " webix_multiview"; + this._back_queue = []; + }, + _ask_render:function(cell_id, view_id){ + var cell = webix.$$(cell_id); + if (!cell._render_hash){ + cell._render_queue = []; + cell._render_hash = {}; + } + if (!cell._render_hash[view_id]){ + cell._render_hash[view_id]=true; + cell._render_queue.push(view_id); + } + }, + _render_activation:function(cell_id){ + var cell = webix.$$(cell_id); + if(this._settings.keepViews) + cell._viewobj.style.display = ""; + /*back array*/ + if(this._back_queue[this._back_queue.length-2]!=cell_id){ + if(this._back_queue.length==10) + this._back_queue.splice(0,1); + this._back_queue.push(cell_id); + } + else + this._back_queue.splice(this._back_queue.length-1,1); + + if (cell._render_hash){ + for (var i=0; i < cell._render_queue.length; i++) + webix.$$(cell._render_queue[i]).render(); + + cell._render_queue = []; + cell._render_hash = {}; + } + }, + addView:function(){ + var id = webix.ui.baselayout.prototype.addView.apply(this, arguments); + webix.html.remove(webix.$$(id).$view); + return id; + }, + _beforeRemoveView:function(index, view){ + //removing current view + if (index == this._active_cell){ + var next = Math.max(index-1, 1); + if (this._cells[next]) + this._show(this._cells[next], false); + } + + if (index < this._active_cell) + this._active_cell--; + }, + //necessary, as we want to ignore hide calls for elements in multiview + _hide:function(){}, + _parse_cells:function(collection){ + collection = collection || this._collection; + + for (var i=0; i < collection.length; i++) + collection[i]._inner = this._settings.borderless?{top:1, left:1, right:1, bottom:1}:(this._settings._inner||{}); + + webix.ui.baselayout.prototype._parse_cells.call(this, collection); + + for (var i=1; i < this._cells.length; i++){ + if(this._settings.keepViews) + this._cells[i]._viewobj.style.display = "none"; + else + webix.html.remove(this._cells[i]._viewobj); + } + + + for (var i=0; i= 100000) self_size[1]=0; + if (self_size[3] >= 100000) self_size[3]=0; + + self_size[0] = (self_size[0] || size[0] ) +dx; + self_size[1] = (self_size[1] || size[1] ) +dx; + self_size[2] = (self_size[2] || size[2] ) +dy; + self_size[3] = (self_size[3] || size[3] ) +dy; + + webix.debug_size_box_end(this, self_size); + + return self_size; + }, + $setSize:function(x,y){ + this._layout_sizes = [x,y]; + webix.ui.baseview.prototype.$setSize.call(this,x,y); + this._cells[this._active_cell].$setSize(x,y); + }, + isVisible:function(base_id, cell_id){ + if (cell_id && cell_id != this.getActiveId()){ + if (base_id) + this._ask_render(cell_id, base_id); + return false; + } + return webix.ui.view.prototype.isVisible.call(this, base_id, this._settings.id); + }, + getActiveId:function(){ + return this._cells.length?this._cells[this._active_cell]._settings.id:null; + }, + back:function(step){ + step=step||1; + if(this.callEvent("onBeforeBack",[this.getActiveId(), step])){ + if(this._back_queue.length>step){ + var viewId = this._back_queue[this._back_queue.length-step-1]; + webix.$$(viewId).show(); + return viewId; + } + return null; + } + return null; + + } +},webix.ui.baselayout); + + + + + +webix.protoUI({ + name:"form", + defaults:{ + type:"form", + autoheight:true + }, + _default_height:-1, + _form_classname:"webix_form", + _form_vertical:true, + $getSize:function(dx, dy){ + if (this._scroll_y && !this._settings.width) dx += webix.ui.scrollSize; + + var sizes = webix.ui.layout.prototype.$getSize.call(this, dx, dy); + + if (this._settings.scroll || !this._settings.autoheight){ + sizes[2] = this._settings.height || this._settings.minHeight || 0; + sizes[3] += 100000; + } + + return sizes; + } +}, webix.ui.toolbar); + + + + +webix.protoUI({ + name:"multiselect", + $cssName:"richselect", + defaults:{ + separator:"," + }, + _suggest_config:function(value){ + var isobj = !webix.isArray(value) && typeof value == "object" && !value.name; + var suggest = { view:"checksuggest", separator:this.config.separator, buttonText: this.config.buttonText, button: this.config.button }; + + if (this._settings.optionWidth) + suggest.width = this._settings.optionWidth; + else + suggest.fitMaster = true; + + if (isobj) + webix.extend(suggest, value, true); + + var view = webix.ui(suggest); + var list = view.getList(); + if (typeof value == "string") + list.load(value); + else if (!isobj) + list.parse(value); + + view.attachEvent("onBeforeShow",function(node,mode, point){ + this.setValue(webix.$$(this._settings.master).config.value); + }); + + return view; + }, + + $setValue:function(value){ + if (!this._rendered_input) return; + var popup = this.getPopup(); + this.getInputNode().innerHTML = popup ? popup.setValue(value) : ""; + }, + getValue:function(){ + return this._settings.value||""; + } +}, webix.ui.richselect); + +webix.editors.multiselect = webix.extend({ + popupType:"multiselect" +}, webix.editors.richselect); + +webix.type(webix.ui.list, { + name:"multilist", + templateStart:webix.template('
    ') +}, "default"); + +webix.type(webix.ui.list, { + name:"checklist", + templateStart:webix.template('
    {common.checkbox()}'), + checkbox: function(obj){ + var icon = obj.$checked?"fa-check-square":"fa-square-o"; + return ""; + }, + template: webix.template("#value#") +}, "default"); + + +webix.protoUI({ + name:"multisuggest", + defaults:{ + separator:",", + type:"layout", + button:true, + width:0, + filter:function(item,value){ + var itemText = this.getItemText(item.id); + return (itemText.toString().toLowerCase().indexOf(value.toLowerCase())>-1); + }, + body:{ + rows:[ + { view:"list", type:"multilist", borderless:true, autoheight:true, yCount:5, multiselect:"touch", select:true, + on:{ + onItemClick: function(id){ + var popup = this.getParentView().getParentView(); + webix.delay(function(){ + webix.$$(popup._settings.master).setValue(popup.getValue()); + }); + } + }}, + { view:"button", click:function(){ + var suggest = this.getParentView().getParentView(); + suggest.setMasterValue({ id:suggest.getValue() }); + suggest.hide(); + }} + ] + } + }, + _get_extendable_cell:function(obj){ + return obj.rows[0]; + }, + _set_on_popup_click:function(){ + var button = this.getButton(); + var text = (this._settings.button?(this._settings.buttonText || webix.i18n.controls.select):0); + if(button){ + if(text){ + button._settings.value = text; + button.refresh(); + } + else + button.hide(); + } + }, + getButton:function(){ + return this.getBody().getChildViews()[1]; + }, + getList:function(){ + return this.getBody().getChildViews()[0]; + }, + setValue:function(value){ + var text = []; + var list = this.getList(); + list.unselect(); + + if (value){ + if (typeof value == "string") + value = value.split(this.config.separator); + + if (value[0]){ + for (var i = 0; i < value.length; i++){ + if (list.exists(value[i])){ + list.select(value[i], true); + text.push(this.getItemText(value[i])); + } + } + } + } + + return text.join(this.config.separator+" "); + }, + getValue:function(){ + return this.getList().getSelectedId(true).sort().join(this.config.separator); + } +}, webix.ui.suggest); + +webix.protoUI({ + name:"checksuggest", + defaults:{ + button:false, + body:{ + rows:[ + { view:"list", css:"webix_multilist", borderless:true, autoheight:true, yCount:5, select: true, + type:"checklist", + on:{ + onItemClick: function(id){ + var item = this.getItem(id); + item.$checked = item.$checked?0:1; + this.refresh(id); + var popup = this.getParentView().getParentView(); + webix.$$(popup._settings.master).setValue(popup.getValue()); + } + } + }, + { view:"button", click:function(){ + var suggest = this.getParentView().getParentView(); + suggest.setMasterValue({ id:suggest.getValue() }); + suggest.hide(); + }} + ] + } + }, + _enter_key: function(popup,list) { + if (list.count && list.count()){ + if (popup.isVisible()) { + var value = list.getSelectedId(false, true); + if(value){ + list.getItem(value).$checked = list.getItem(value).$checked?0:1; + value = this.getValue(); + var master = webix.$$(this._settings.master); + master._inputValue = ""; + master.setValue(value); + master.getInputNode().value = ""; + } + popup.hide(true); + } else { + popup.show(this._last_input_target); + } + } else { + if (popup.isVisible()) + popup.hide(true); + } + }, + setValue:function(value){ + var i, + list = this.getList(), + text = [], + values = {}, + changed = []; + + value = value || []; + if (typeof value == "string") + value = value.split(this.config.separator); + + for ( i = 0; i < value.length; i++){ + values[value[i]] = 1; + } + + list.data.each(function(item){ + if(item.$checked){ + if(!values[item.id]){ + item.$checked = 0; + changed.push(item.id); + } + } + else{ + if(values[item.id]){ + item.$checked = 1; + changed.push(item.id); + } + } + if(item.$checked) + text.push(this.getItemText(item.id)); + },this,true); + + for( i=0; i < changed.length; i++ ){ + list.refresh(changed[i]); + } + + return text.join(this.config.separator+" "); + }, + getValue:function(){ + var values = []; + this.getList().data.each(function(item){ + if(item.$checked){ + values.push(item.id); + } + },this,true); + return values.sort().join(this.config.separator); + }, + _preselectMasterOption: function(){} +}, webix.ui.multisuggest); + +webix.protoUI({ + name:"multicombo", + $cssName:"text", + defaults:{ + separator:",", + icon: false, + iconWidth: 0, + template:function(obj,common){ + return common._render_value_block(obj, common); + } + }, + $init:function(){ + this.$view.className += " webix_multicombo"; + + this.attachEvent("onBlur", webix.bind(function(e){ + this._inputValue = ""; + this.refresh(); + },this)); + + this.attachEvent("onBeforeRender",function(){ + if(!this._inputHeight) + this._inputHeight = this.config.aheight; + return true; + }); + this.attachEvent("onAfterRender", function(){ + this._last_size = null; + }); + }, + on_click: { + "webix_multicombo_delete": function(e,view,node){ + var value; + if(node && (value = node.parentNode.getAttribute("value"))) + this._removeValue(value); + return false; + } + }, + _removeValue: function(value){ + var v = webix.toArray(this._settings.value.split(this._settings.separator)); + v.remove(value); + this.setValue(v.join(this._settings.separator)); + }, + _suggest_config:function(value){ + var isObj = !webix.isArray(value) && typeof value == "object" && !value.name, + suggest = { view:"checksuggest", separator:this.config.separator, buttonText: this.config.buttonText, button: this.config.button }, + combo = this; + + if (this._settings.optionWidth) + suggest.width = this._settings.optionWidth; + + if (isObj) + webix.extend(suggest, value, true); + + var view = webix.ui(suggest); + if(!this._settings.optionWidth) + view.$customWidth = function(node){ + this.config.width = combo._get_input_width(combo._settings); + }; + view.attachEvent("onBeforeShow",function(node,mode, point){ + this.setValue(webix.$$(this._settings.master).config.value); + if(node.tagName && node.tagName.toLowerCase() == "input"){ + webix.ui.popup.prototype.show.apply(this, [node.parentNode,mode, point]); + return false; + } + }); + var list = view.getList(); + if (typeof value == "string") + list.load(value); + else if (!isObj) + list.parse(value); + + return view; + }, + _render_value_block:function(obj, common){ + + var id = obj.id || webix.uid(); + var width = common._get_input_width(obj); + var inputAlign = obj.inputAlign || "left"; + + var height = this._inputHeight - 2*webix.skin.$active.inputPadding -2; + var text = (obj.text||obj.value||this._get_div_placeholder(obj)); + var value = obj.value; + + var list = "
      "; + var input = ""; + var html = "
      "+list+input +"
      "; + + var inputAlign = (obj.inputAlign||"left"); + id = id || obj.name || webix.uid(); + + var label = common.$renderLabel(obj,id); + + + html += "
      "; + + if (top) + return label+"
      "+html+"
      "; + else + return "
      "+label+html+"
      "; + + }, + _getValueListBox: function(){ + return this._getBox().getElementsByTagName("UL")[0]; + }, + _set_inner_size: function(){ + var popup = this.getPopup(); + if(popup){ + var text = (popup ? popup.setValue(this._settings.value) : ""); + var html = ""; + var listbox = this._getValueListBox(); + if(text){ + + var values = this._settings.value.split(this._settings.separator); + var textArr = text.split(this._settings.separator); + + var height = this._inputHeight - 2*webix.skin.$active.inputPadding - 8; + for(var i=0; i < textArr.length;i++){ + var content = ""+textArr[i]+"x"; + html += "
    • "+content+"
    • "; + } + } + + listbox.innerHTML = html; + } + this._resizeToContent(); + }, + _focusAtEnd: function(inputEl){ + if (inputEl && inputEl.value.length){ + if (inputEl.createTextRange){ + var FieldRange = inputEl.createTextRange(); + FieldRange.moveStart('character',inputEl.value.length); + FieldRange.collapse(); + FieldRange.select(); + }else if (inputEl.selectionStart || inputEl.selectionStart == '0') { + var elemLen = inputEl.value.length; + inputEl.selectionStart = elemLen; + inputEl.selectionEnd = elemLen; + inputEl.focus(); + } + }else{ + inputEl.focus(); + } + }, + _resizeToContent: function(){ + var top = this._settings.labelPosition == "top"; + var inputHeight = Math.max(this._getBox().firstChild.offsetHeight+ 2*webix.skin.$active.inputPadding, this._inputHeight)+ (top?this._labelTopHeight:0); + var sizes = this.$getSize(0,0); + if(inputHeight != sizes[2]){ + this._calcHeight = this._getBox().firstChild.offsetHeight + (top?this._labelTopHeight:0); + var topView =this.getTopParentView(); + clearTimeout(topView._template_resize_timer); + topView._template_resize_timer = webix.delay(function(){ + this.config.height = this._calcHeight + 2*webix.skin.$active.inputPadding; + this.resize(); + if(this._typing){ + this._focusAtEnd(this.getInputNode()); + this._typing = false; + } + if(this.getPopup().isVisible()||this._typing) + this.getPopup().show(this._getBox().firstChild); + }, this); + } + }, + getInputNode: function(){ + return this._getBox().getElementsByTagName("INPUT")[0]; + }, + $setValue:function(){ + this._set_inner_size(); + }, + getValue:function(){ + return this._settings.value; + }, + _calcInputWidth: function(value){ + var tmp = document.createElement("span"); + tmp.className = "webix_multicombo_input"; + tmp.style.visibility = "visible"; + tmp.style.height = "0px"; + tmp.innerHTML = value.replace(/&/g,'&').replace(//g,'>'); + document.body.appendChild(tmp); + var width = tmp.offsetWidth+10; + document.body.removeChild(tmp); + return width; + }, + _init_onchange:function(){ + + // input focus and focus styling + webix.event(this._getBox(),"click",function(){ + this.getInputNode().focus(); + },this); + webix.event(this.getInputNode(),"focus",function(){ + if(this._getBox().className.indexOf("webix_focused") == -1) + this._getBox().className += " webix_focused"; + + },this); + webix.event(this.getInputNode(),"blur",function(){ + this._getBox().className = this._getBox().className.replace(" webix_focused",""); + },this); + + // need for clear click ("x") in IE + webix.event(this.getInputNode(),"input",function(){ + if(!this.getInputNode().value && this._inputValue){ + this.getInputNode().style.width = "20px"; + this._inputWidth = 20; + this._inputValue = ""; + this._typing = true; + this.getPopup().show(this._getBox().firstChild); + this._resizeToContent(); + } + },this); + // resize + webix.event(this.getInputNode(),"keyup",function(){ + var inp = this.getInputNode(); + var width = this._calcInputWidth(inp.value)+10; + inp.style.width = width +"px"; + if(width!=this._inputWidth){ + this._inputWidth = width; + this._inputValue = inp.value; + this._typing = true; + this.getPopup().show(this._getBox().firstChild); + this._resizeToContent(); + } + + },this); + + // remove the last value on Backspace click + webix.event(this.getInputNode(),"keydown",function(e){ + if (this.isVisible()){ + e = (e||event); + var node = this._getValueListBox().lastChild; + if(e.keyCode == 8 && node){ + if(!this.getInputNode().value && ((new Date()).valueOf() - (this._backspaceTime||0) > 500)){ + this._typing = true; + this._removeValue(node.getAttribute("value")); + } + else{ + this._backspaceTime = (new Date()).valueOf(); + } + } + + } + },this); + webix.$$(this._settings.suggest).linkInput(this); + } +}, webix.ui.richselect); + + + + + +webix.protoUI({ + name:"menu", + _listClassName:"webix_menu", + $init:function(){ + this.data.attachEvent('onStoreUpdated', webix.bind(function(){ + this._hide_sub_menu(); + },this)); + this.attachEvent('onMouseMove', this._mouse_move_menu); + this.attachEvent('onMouseOut',function(){ + if (this._menu_was_activated() && this._settings.openAction == "click") return; + if (!this._child_menu_active) + this._hide_sub_menu(); + }); + this.attachEvent('onItemClick', function(id, e, trg){ + var item = this.getItem(id); + if (item){ + if (item.$template) return; + + var parent = this.getTopMenu(); + + //ignore disabled items + if (!this.data.getMark(id, "webix_disabled")){ + if (!parent.callEvent("onMenuItemClick", [id, e, trg])){ + e.showpopup = true; + return; + } + + if (this != parent) + parent._call_onclick(id,e,trg); + + //click on group - do not close submenus + if (!item.submenu){ + parent._hide_sub_menu(true); + if (parent._hide_on_item_click) + parent.hide(); + } else { + if ((this === parent || webix.env.touch ) && parent._settings.openAction == "click"){ + this._mouse_move_activation(id, trg); + } + + //do not close popups when clicking on menu folder + e.showpopup = true; + } + } + } + }); + + this.data.attachEvent("onClearAll", function(){ + this._hidden_items = []; + }); + this.data._hidden_items = []; + }, + getTopMenu:function(){ + var parent = this; + while (parent._parent_menu) + parent = webix.$$(parent._parent_menu); + return parent; + }, + _auto_height_calc:function(count){ + if (this._settings.autoheight) count = this.count(); + + var height = 0; + for (var i=0; i'; + } + var link = (obj.href?" href='"+obj.href+"' ":"")+(obj.target?" target='"+obj.target+"' ":""); + return webix.ui.list.prototype.type.templateStart(obj,common,mark).replace(/^
      ":""); + }, + templateEnd: function(obj, common, mark){ + return (obj.$template === "Separator" || obj.$template === "Spacer")?"
      ":""; + }, + templateSeparator:webix.template("
      "), + templateSpacer:webix.template("
      ") + }, + getMenu: function(id){ + if (!this.data.pull[id]){ + for (var subid in this.data.pull){ + var obj = this.getItem(subid); + if (obj.submenu){ + var search = this._get_submenu(obj).getMenu(id); + if (search) return search; + } + } + } else return this; + }, + getSubMenu:function(id){ + var menu = this.getMenu(id); + var obj = menu.getItem(id); + return (obj.submenu?menu._get_submenu(obj):null); + }, + getMenuItem:function(id){ + return this.getMenu(id).getItem(id); + }, + _get_submenu:function(data){ + var sub = webix.$$(data.submenu); + if (!sub){ + data.submenu = this._create_sub_menu(data); + sub = webix.$$(data.submenu); + } + return sub; + }, + _mouse_move_menu:function(id, e, target){ + if (!this._menu_was_activated()) + return; + + this._mouse_move_activation(id, target); + }, + _menu_was_activated:function(){ + var top = this.getTopMenu(); + if (top._settings.openAction == "click"){ + if (webix.env.touch) return false; + var sub = top._open_sub_menu; + if (sub && webix.$$(sub).isVisible()) + return true; + return false; + } + return true; + }, + _mouse_move_activation:function(id, target){ + var data = this.getItem(id); + if (!data) return; + + //clear flag of submenu usage + this._child_menu_active = null; + + //hide previously opened sub-menu + if (this._open_sub_menu && data.submenu != this._open_sub_menu) + this._hide_sub_menu(true); + + //show submenu + if (data.submenu&&!this.config.hidden){ + + var sub = this._get_submenu(data); + if(this.data.getMark(id,"webix_disabled")) + return; + + sub.show(target,{ pos:this._settings.subMenuPos }); + + sub._parent_menu = this._settings.id; + + this._open_sub_menu = data.submenu; + } + }, + disableItem:function(id){ + this.getMenu(id).addCss(id, "webix_disabled"); + }, + enableItem:function(id){ + this.getMenu(id).removeCss(id, "webix_disabled"); + }, + _set_item_hidden:function(id, state){ + var menu = this.data; + if (menu._hidden_items[id] != state){ + menu._hidden_items[id] = state; + menu.filter(function(obj){ + return !menu._hidden_items[obj.id]; + }); + this.resize(); + } + }, + hideItem:function(id){ + var menu = this.getMenu(id); + if (menu) menu._set_item_hidden(id, true); + }, + showItem:function(id){ + var menu = this.getMenu(id); + if (menu){ + menu._set_item_hidden(id, false); + return webix.ui.list.prototype.showItem.call(menu, id); + } + }, + _hide_sub_menu : function(mode){ + if (this._open_sub_menu){ + //recursive sub-closing + var sub = webix.$$(this._open_sub_menu); + if (sub._hide_sub_menu) //custom context may not have submenu + sub._hide_sub_menu(mode); + if (mode || !sub._show_on_mouse_out){ + sub.hide(); + this._open_sub_menu = null; + } + } + }, + _create_sub_menu : function(data){ + var listConfig = { + view:"submenu", + data:data.submenu + }; + + var settings = this.getTopMenu()._settings.submenuConfig; + if (settings) + webix.extend(listConfig, settings, true); + + var parentData = this.getMenuItem(data.id); + if(parentData && parentData.config) + webix.extend(listConfig, parentData.config, true); + + var menu = webix.ui(listConfig); + return menu._settings.id; + }, + $skin:function(){ + webix.ui.list.prototype.$skin.call(this); + this.type.height = webix.skin.$active.menuHeight; + }, + defaults:{ + scroll:"", + layout:"x", + mouseEventDelay:100, + subMenuPos:"bottom" + } +}, webix.ui.list); + + +webix.protoUI({ + name:"submenu", + $init:function(){ + this._body_cell = webix.clone(this._dummy_cell_interface); + this._body_cell._view = this; + + this.attachEvent('onMouseOut',function(){ + if (this.getTopMenu()._settings.openAction == "click") + return; + if (!this._child_menu_active && !this._show_on_mouse_out) + this.hide(); + }); + + //inform parent that focus is still in menu + this.attachEvent('onMouseMoving',function(){ + if (this._parent_menu) + webix.$$(this._parent_menu)._child_menu_active = true; + }); + + }, + $skin:function(){ + webix.ui.menu.prototype.$skin.call(this); + webix.ui.popup.prototype.$skin.call(this); + + this.type.height = webix.skin.$active.menuHeight; + }, + _dummy_cell_interface : { + $getSize:function(dx, dy){ + //we saving height and width, as list can hardcode new values + var h = this._view._settings.height*1; + var w = this._view._settings.width*1; + var size = webix.ui.menu.prototype.$getSize.call(this._view, dx, dy); + //restoring + this._view._settings.height = h; + this._view._settings.width = w; + return size; + }, + $setSize:function(x,y){ + if (this._view._settings.scroll) + this._view._bodyobj.style.height = y+"px"; + }, + destructor:function(){ this._view = null; } + }, + //ignore body element + body_setter:function(){ + }, + defaults:{ + width:150, + subMenuPos:"right", + layout:"y", + autoheight:true + }, + type:{ + height: webix.skin.menuHeight, + subsign:true + } +}, webix.ui.menu, webix.ui.popup); + + + + +webix.ContextHelper = { + defaults:{ + padding:"4", + hidden:true + }, + body_setter:function(value){ + value = webix.ui.window.prototype.body_setter.call(this, value); + this._body_cell._viewobj.style.borderWidth = "0px"; + return value; + }, + attachTo:function(obj){ + webix.assert(obj, "Invalid target for Context::attach"); + if (obj.on_context) + obj.attachEvent("onAfterContextMenu", webix.bind(this._show_at_ui, this)); + else + webix.event(obj, "contextmenu", this._show_at_node, this); + }, + getContext:function(){ + return this._area; + }, + _show_at_node:function(e){ + + this._area = webix.toNode(e||event); + return this._show_at(e); + }, + _show_at_ui:function(id, e, trg){ + this._area = { obj:webix.$$(e), id:id }; + return this._show_at(e); + }, + _show_at:function(e){ + var result = this.show(e, null, true); + //event forced to close other popups|context menus + webix.callEvent("onClick", [e]); + + return (result === false?false:webix.html.preventEvent(e)); + }, + _show_on_mouse_out:true, + master_setter:function(value){ + this.attachTo(value); + return null; + } +}; +webix.protoUI({ + name:"context" +}, webix.ContextHelper, webix.ui.popup); + +webix.protoUI({ + name:"contextmenu", + _hide_on_item_click:true, + $init: function(config){ + if(config.submenuConfig) + webix.extend(config,config.submenuConfig); + } +}, webix.ContextHelper, webix.ui.submenu); + +/* + +*/ + +webix.protoUI({ + name:"tabbar", + $skin:function(){ + var skin = webix.skin.$active; + var defaults = this.defaults; + + defaults.topOffset = skin.tabTopOffset||0; + defaults.tabOffset = (typeof skin.tabOffset != "undefined"?skin.tabOffset:10); + defaults.bottomOffset = skin.tabBottomOffset||0; + defaults.height = skin.tabbarHeight; + + defaults.tabMargin = skin.tabMargin; + defaults.inputPadding = skin.inputPadding; + defaults.tabMinWidth = skin.tabMinWidth||100; + defaults.tabMoreWidth = skin.tabMoreWidth||40; + }, + _getTabbarSizes: function(){ + + var config = this.config, + i, + len = config.options.length, // number of tabs + totalWidth = this._input_width - config.tabOffset*2, + limitWidth = config.optionWidth||config.tabMinWidth; + + if(totalWidth/len < limitWidth){ + return { max: (parseInt(totalWidth/limitWidth,10)||1)}; + } + if(!config.optionWidth){ + for(i=0;i< config.options.length; i++){ + if(config.options[i].width){ + totalWidth -= config.options[i].width+(!i&&!config .type?config.tabMargin:0); + len--; + } + } + } + + return {width: (len?totalWidth/len:config.tabMinWidth)}; + }, + _init_popup: function(){ + var obj = this._settings; + if (!obj.tabbarPopup){ + var popupConfig = { + view: "popup", + width: (obj.popupWidth||200), + body:{ + view: "list", + borderless: true, + select: true, + css: "webix_tab_list", + autoheight: true, yCount:obj.yCount, + type:{ + template: obj.popupTemplate + } + } + }; + var view = webix.ui(popupConfig); + view.getBody().attachEvent("onBeforeSelect",webix.bind(function(id){ + if (id && this.callEvent("onBeforeTabClick", [id])){ + this.setValue(id); + webix.$$(this._settings.tabbarPopup).hide(); + this.callEvent("onAfterTabClick", [id]); + return true; + } + },this)); + obj.tabbarPopup = view._settings.id; + this._destroy_with_me.push(view); + } + this._init_popup = function(){}; + }, + getPopup: function(){ + this._init_popup(); + return webix.$$(this._settings.tabbarPopup); + }, + moreTemplate_setter: webix.template, + popupTemplate_setter: webix.template, + defaults:{ + popupWidth: 200, + popupTemplate: "#value#", + yCount: 7, + moreTemplate: '', + template:function(obj,common) { + var contentWidth, html, i, leafWidth, resultHTML, style, sum, verticalOffset, width, + tabs = obj.options; + + if (!tabs.length){ + html = "
      "; + } else { + common._check_options(tabs); + if (!obj.value && tabs.length) + obj.value = tabs[0].id; + + tabs = webix.copy(tabs); + + html = ""; + if (obj.tabOffset) + html += "
       
      "; + contentWidth = common._input_width - obj.tabOffset*2-(!obj.type?(obj.tabMargin)*(tabs.length-1):0); + verticalOffset = obj.topOffset+obj.bottomOffset; + + var sizes = common._getTabbarSizes(); + + if(sizes.max && sizes.max < tabs.length){ + //we need popup + var popup = common.getPopup(); + popup.hide(); + + var list = (popup.getBody()||null); + if(list){ + if(sizes.max){ + var found = false; + for( i = 0; i < tabs.length && !found; i++) + if(tabs[i].id== obj.value){ + found = true; + if((i+1) > sizes.max){ + var displayTabs = tabs.splice( i + 1- sizes.max , sizes.max); + tabs = displayTabs.concat(tabs); + } + } + list.clearAll(); + list.parse(tabs.slice(sizes.max)); + } + else{ + list.clearAll(); + } + } + } else if (common._settings.tabbarPopup) + webix.$$(common._settings.tabbarPopup).hide(); + + sum = obj.tabOffset; + var lastTab = false; + for(i = 0; (i1)?(obj.tabMargin)*(sizes.max-1):0); + width = (contentWidth - obj.tabMoreWidth)/sizes.max ; + } + else + width = sizes.width; + + width = (tabs[i].width||obj.optionWidth||width); + + sum += width + (i&&!obj.type?obj.tabMargin:0); + + if(obj.tabMargin>0&&i&&!obj.type) + html += "
      "; + + // tab innerHTML + html += common._getTabHTML(tabs[i],width); + + + if(lastTab){ + var iconHeight = common._content_height - (!obj.type?(verticalOffset):0); + html += '
      '+obj.moreTemplate(obj,common)+'
      '; + sum += obj.tabMoreWidth; + } + } + + + + leafWidth = common._content_width - sum; + + if (leafWidth>0 && !obj.type) + html += "
       
      "; + } + + resultHTML = ""; + + // consider top and bottom offset in tabs height (top tabbar) + style = (verticalOffset&& !obj.type)?"height:"+(common._content_height-verticalOffset)+"px":""; + + //space above tabs (top tabbar) + if(obj.topOffset && !obj.type) + resultHTML += "
      "; + + // tabs html + resultHTML += "
      "+html+"
      "; + + //space below to tabs (top tabbar) + if(obj.bottomOffset && !obj.type) + resultHTML += "
      "; + + return resultHTML; + } + }, + _getTabHTML: function(tab,width){ + var html, + className = '', + config = this.config; + + if(tab.id== config.value) + className=" webix_selected"; + + if (tab.css) + className+=" "+tab.css; + + width = (tab.width||width); + + html ='
      '; + + // a tab title + if(this._tabTemplate){ + var calcHeight = this._content_height- config.inputPadding*2 - 2; + var height = this._content_height - 2; + var temp = webix.extend({ cheight: calcHeight, aheight:height }, tab); + html+= this._tabTemplate(temp); + } + else { + var icon = tab.icon?(" "):""; + html+=icon + tab.value; + } + + if (tab.close || config.close) + html+=""; + + html+="
      "; + return html; + }, + _types:{ + image:"
      #value#
      ", + icon:"
      #value#
      ", + iconTop:"
      #value#
      " + }, + type_setter:function(value){ + this._settings.tabOffset = 0; + if (this._types[value]) + this._tabTemplate = webix.template(this._types[value]); + return value; + } +}, webix.ui.segmented); + +webix.protoUI({ + name:"tabview", + defaults:{ + type:"clean" + }, + setValue:function(val){ + this._cells[0].setValue(val); + }, + getValue:function(){ + return this._cells[0].getValue(); + }, + getTabbar:function(){ + return this._cells[0]; + }, + getMultiview:function(){ + return this._cells[1]; + }, + addView:function(obj){ + var id = obj.body.id = obj.body.id || webix.uid(); + + this.getMultiview().addView(obj.body); + + obj.id = obj.body.id; + obj.value = obj.header; + delete obj.body; + delete obj.header; + + var t = this.getTabbar(); + t.addOption(obj); + t.refresh(); + + return id; + }, + removeView:function(id){ + var t = this.getTabbar(); + t.removeOption(id); + t.refresh(); + }, + $init:function(config){ + this.$ready.push(this._init_tabview_handlers); + + var cells = config.cells; + var tabs = []; + + webix.assert(cells && cells.length, "tabview must have cells collection"); + + for (var i = cells.length - 1; i >= 0; i--){ + var view = cells[i].body||cells[i]; + if (!view.id) view.id = "view"+webix.uid(); + tabs[i] = { value:cells[i].header, id:view.id, close:cells[i].close, width:cells[i].width }; + cells[i] = view; + } + + var tabbar = { view:"tabbar", multiview:true }; + var mview = { view:"multiview", cells:cells, animate:(!!config.animate) }; + + if (config.value) + tabbar.value = config.value; + + if (config.tabbar) + webix.extend(tabbar, config.tabbar, true); + if (config.multiview) + webix.extend(mview, config.multiview, true); + + tabbar.options = tabbar.options || tabs; + + config.rows = [ + tabbar, mview + ]; + + delete config.cells; + delete config.tabs; + }, + _init_tabview_handlers:function(){ + this.getTabbar().attachEvent("onOptionRemove", function(id){ + var view = webix.$$(id); + if (view) + view.destructor(); + }); + } +}, webix.ui.layout); + + + + + +webix.protoUI({ + name:"htmlform", + _default_values: null, + $init: function(config) { + this.elements = null; + if (config.content && (config.container == config.content || !config.container && config.content == document.body)) + this._copy_inner_content = true; + }, + content_setter:function(content){ + content = webix.toNode(content); + if (this._copy_inner_content){ + while (content.childNodes.length > 1) + this._viewobj.childNodes[0].appendChild(content.childNodes[0]); + } else { + this._viewobj.childNodes[0].appendChild(content); + } + return true; + }, + render:function(){ + if (!this._default_values) { + webix.ui.template.prototype.render.apply(this, arguments); + this._default_values = this.getValues(); + } + }, + _parse_inputs: function() { + if (!this.elements) + this.elements = this._viewobj.querySelectorAll("[name]"); + return this.elements; + }, + getValues: function() { + var data = (this._values?webix.clone(this._values):{}); + var els = this._parse_inputs(); + for (var i = 0; i < els.length; i++) { + if (this._tagname(els[i]) === 'input' && + this._attribute(els[i], 'type') === 'radio' && + els[i].checked === false) continue; + data[els[i].name] = this._get_html_value(els[i]); + } + return data; + }, + setValues: function(data, update) { + if(!update) this.clear(true); + this.render(); + + this._values = webix.clone(data); + + if (webix.debug_render) + webix.log("Render: "+this.name+"@"+this._settings.id); + + var els = this._parse_inputs(); + for (var i = 0; i < els.length; i++) { + if (!webix.isUndefined(data[els[i].name])) + this._set_html_value(els[i], data[els[i].name]); + } + + this.callEvent("onChange",[]); + }, + + focus: function(name) { + var el; + if (!webix.isUndefined(name)) + el = this._viewobj.querySelector('[name="' + name + '"]'); + else + el = this._parse_inputs()[0]; + if (!webix.isUndefined(el)) el.focus(); + }, + + clear: function(all) { + this.render(); + var els = this._parse_inputs(); + for (var i = 0; i < els.length; i++) { + var cleared = all?"":this._default_values[els[i].name] || ""; + this._set_html_value(els[i], cleared); + } + }, + + _tagname: function(el) { + if (!el.tagName) return null; + return el.tagName.toLowerCase(); + }, + + _attribute: function(el, name) { + if (!el.getAttribute) return null; + var attr = el.getAttribute(name); + return (attr.toLowerCase) ? attr.toLowerCase() : null; + }, + + _get_html_value: function(el) { + var tagname = this._tagname(el); + if (this._get_value[tagname]) + return this._get_value[tagname].call(this, el); + return this._get_value.other.call(this, el); + }, + + _get_value: { + input: function(el) { + var type = this._attribute(el, 'type'); + if (type === 'checkbox') + return el.checked; + return el.value; + }, + textarea: function(el) { + return el.value; + }, + select: function(el) { + var index = el.selectedIndex; + return el.options[index].value; + }, + other: function(el) { + return el.innerHTML; + } + }, + + _set_html_value: function(el, value) { + var tagname = this._tagname(el); + if (this._set_value[tagname]) + return this._set_value[tagname].call(this, el, value); + return this._set_value.other.call(this, el, value); + }, + + _set_value: { + input: function(el, value) { + var type = this._attribute(el, 'type'); + if (type === 'checkbox') + el.checked = (value) ? true : false; + else if (type === 'radio') + el.checked = (el.value === value) ? true : false; + else + el.value = value; + }, + textarea: function(el, value) { + el.value = value; + }, + select: function(el, value) { + //select first option if no provided and if possible + el.value = value?value:el.firstElementChild.value||value; + }, + other: function(el, value) { + el.innerHTML = value; + } + }, + + _mark_invalid:function(id,obj){ + this._clear_invalid(id,obj); + var el = this._viewobj.querySelector('[name="' + id + '"]'); + if (el) webix.html.addCss(el, "invalid"); + }, + _clear_invalid:function(id,obj){ + var el = this._viewobj.querySelector('[name="' + id + '"]'); + if (el) webix.html.removeCss(el, "invalid"); + } + +}, webix.ui.template, webix.Values); + + + + + + +webix.dp = function(name){ + if (typeof name == "object" && name._settings) + name = name._settings.id; + + if (webix.dp._pull[name]) + return webix.dp._pull[name]; + + if (typeof name == "string"||typeof name == "number") + name = { master:webix.$$(name) }; + + var dp = new webix.DataProcessor(name); + var masterId = dp._settings.master._settings.id; + webix.dp._pull[masterId]=dp; + + webix.$$(masterId).attachEvent("onDestruct",function(){ + webix.dp._pull[this._settings.id] = null; + delete webix.dp._pull[this._settings.id]; + }); + + return dp; +}; +webix.dp._pull = {}; +webix.dp.$$ = function(id){ + return webix.dp._pull[id]; +}; + + +webix.DataProcessor = webix.proto({ + defaults: { + autoupdate:true, + updateFromResponse:false, + mode:"post", + operationName:"webix_operation", + trackMove:false + }, + + + /*! constructor + **/ + $init: function() { + this.reset(); + this._ignore = false; + this.name = "DataProcessor"; + this.$ready.push(this._after_init_call); + }, + reset:function(){ + this._updates = []; + }, + url_setter:function(value){ + /* + we can use simple url or mode->url + */ + var mode = ""; + if (typeof value == "string"){ + var parts = value.split("->"); + if (parts.length > 1){ + value = parts[1]; + mode = parts[0]; + } + } else if (value && value.mode){ + mode = value.mode; + value = value.url; + } + + if (mode) + return webix.proxy(mode, value); + + return value; + }, + master_setter:function(value){ + var store = value; + if (value.name != "DataStore") + store = value.data; + + this._settings.store = store; + return value; + }, + /*! attaching onStoreUpdated event + **/ + _after_init_call: function(){ + webix.assert(this._settings.store, "store or master need to be defined for the dataprocessor"); + this._settings.store.attachEvent("onStoreUpdated", webix.bind(this._onStoreUpdated, this)); + this._settings.store.attachEvent("onDataMove", webix.bind(this._onDataMove, this)); + }, + ignore:function(code,master){ + var temp = this._ignore; + this._ignore = true; + code.call((master||this)); + this._ignore = temp; + }, + off:function(){ + this._ignore = true; + }, + on:function(){ + this._ignore = false; + }, + + _copy_data:function(source){ + var obj = {}; + for (var key in source) + if (key.indexOf("$")!==0) + obj[key]=source[key]; + return obj; + }, + save:function(id, operation, obj){ + operation = operation || "update"; + this._save_inner(id, (obj || this._settings.store.getItem(id)), operation); + }, + _save_inner:function(id, obj, operation){ + if (typeof id == "object") id = id.toString(); + if (!id || this._ignore === true || !operation || operation == "paint") return true; + + var store = this._settings.store; + if (store && store._scheme_serialize) + obj = store._scheme_serialize(obj); + + var update = { id: id, data:this._copy_data(obj), operation:operation }; + //save parent id + if (!webix.isUndefined(obj.$parent)) update.data.parent = obj.$parent; + + if (update.operation != "delete"){ + //prevent saving of not-validated records + var master = this._settings.master; + if (master && master.data && master.data.getMark && master.data.getMark(id, "webix_invalid")) + update._invalid = true; + + if (!this.validate(update.data)) + update._invalid = true; + } + + if (this._check_unique(update)) + this._updates.push(update); + + if (this._settings.autoupdate) + this.send(); + + return true; + }, + _onDataMove:function(sid, tindex, parent){ + if (this._settings.trackMove){ + var obj = webix.copy(this._settings.store.getItem(sid)); + var order = this._settings.store.order; + + obj.webix_move_index = tindex; + obj.webix_move_id = order[tindex+1]||""; + obj.webix_move_parent = parent; + this._save_inner(sid, obj, "update"); + } + }, + _onStoreUpdated: function(id, obj, operation){ + switch (operation) { + case 'save': + operation = "update"; + break; + case 'update': + operation = "update"; + break; + case 'add': + operation = "insert"; + break; + case 'delete': + operation = "delete"; + break; + default: + return true; + } + return this._save_inner(id, obj, operation); + }, + _check_unique:function(check){ + for (var i = 0; i < this._updates.length; i++){ + var one = this._updates[i]; + if (one.id == check.id){ + if (check.operation == "delete"){ + if (one.operation == "insert") + this._updates.splice(i,1); + else + one.operation = "delete"; + } + one.data = check.data; + one._invalid = check._invalid; + return false; + } + } + return true; + }, + send:function(){ + this._sendData(); + }, + + _sendData: function(){ + if (!this._settings.url) + return; + + var marked = this._updates; + var to_send = []; + var url = this._settings.url; + + for (var i = 0; i < marked.length; i++) { + var tosave = marked[i]; + + if (tosave._in_progress) continue; + if (tosave._invalid) continue; + + var id = tosave.id; + var operation = tosave.operation; + var precise_url = (typeof url == "object" && !url.$proxy) ? url[operation] : url; + var proxy = precise_url && (precise_url.$proxy || typeof precise_url === "function"); + + if (!precise_url) continue; + + if (this._settings.store._scheme_save) + this._settings.store._scheme_save(tosave.data); + + if (!this.callEvent("onBefore"+operation, [id, tosave])) + continue; + tosave._in_progress = true; + + if (!this.callEvent("onBeforeDataSend", [tosave])) return; + + tosave.data = this._updatesData(tosave.data); + + var callback = this._send_callback({ id:tosave.id, status:tosave.operation }); + if (precise_url.$proxy){ + if (precise_url.save) + precise_url.save(this.config.master, tosave, this, callback); + else + to_send.push(tosave); + } else { + if (operation == "insert") delete tosave.data.id; + + + if (proxy){ + //promise + precise_url(tosave.id, tosave.operation, tosave.data).then( + function(data){ + if (data && typeof data.json == "function") + data = data.json(); + callback.success("", data, -1); + }, + function(error){ + callback.error("", null, error); + } + ); + } else { + //normal url + tosave.data[this._settings.operationName] = operation; + this._send(precise_url, tosave.data, this._settings.mode, operation, callback); + } + } + + this.callEvent("onAfterDataSend", [tosave]); + } + + if (url.$proxy && url.saveAll && to_send.length) + url.saveAll(this.config.master, to_send, this, this._send_callback({})); + }, + + + /*! process updates list to POST and GET params according dataprocessor protocol + * @param updates + * list of objects { id: "item id", data: "data hash", operation: "type of operation"} + * @return + * object { post: { hash of post params as name: value }, get: { hash of get params as name: value } } + **/ + + + + _updatesData:function(source){ + var target = {}; + for (var j in source){ + if (j.indexOf("$")!==0) + target[j] = source[j]; + } + return target; + }, + + + + /*! send dataprocessor query to server + * and attach event to process result + * @param url + * server url + * @param get + * hash of get params + * @param post + * hash of post params + * @mode + * 'post' or 'get' + **/ + _send: function(url, post, mode, operation, callback) { + webix.assert(url, "url was not set for DataProcessor"); + + if (typeof url == "function") + return url(post, operation, callback); + + webix.ajax()[mode](url, post, callback); + }, + _send_callback:function(id){ + var self = this; + return { + success:function(t,d,l){ return self._processResult(id, t,d,l); }, + error :function(t,d,l){ return self._processError(id, t,d,l); } + }; + }, + attachProgress:function(start, end, error){ + this.attachEvent("onBeforeDataSend", start); + this.attachEvent("onAfterSync", end); + this.attachEvent("onAfterSaveError", error); + this.attachEvent("onLoadError", error); + }, + _processError:function(id, text, data, loader){ + if (id) + this._innerProcessResult(true, id.id, false, id.status, false, {text:text, data:data, loader:loader}); + else { + this.callEvent("onLoadError", arguments); + webix.callEvent("onLoadError", [text, data, loader, this]); + } + }, + _innerProcessResult:function(error, id, newid, status, obj, details){ + var update = this.getItemState(id); + update._in_progress = false; + + if (error){ + if (this.callEvent("onBeforeSaveError", [id, status, obj, details])){ + update._invalid = true; + this.callEvent("onAfterSaveError", [id, status, obj, details]); + return; + } + } else + this.setItemState(id, false); + + if (obj && status != "delete" && this._settings.updateFromResponse){ + var item = this._settings.store.getItem(id); + webix.extend(item, obj, true); + this._settings.store.refresh(id); + } + + if (newid && id != newid) + this._settings.store.changeId(id, newid); + + + this.callEvent("onAfterSave",[obj, id, details]); + this.callEvent("onAfter"+status, [obj, id, details]); + }, + processResult: function(state, hash, details){ + //compatibility with custom json response + var error = (hash && (hash.status == "error" || hash.status == "invalid")); + var newid = (hash ? ( hash.newid || hash.id ) : false); + + this._innerProcessResult(error, state.id, newid, state.status, hash, details); + }, + // process saving from result + _processResult: function(state, text, data, loader){ + this.callEvent("onBeforeSync", [state, text, data, loader]); + + if (loader === -1){ + //callback from promise + this.processResult(state, data, {}); + } else { + var proxy = this._settings.url; + if (proxy.$proxy && proxy.result) + proxy.result(state, this._settings.master, this, text, data, loader); + else { + var hash; + if (text){ + hash = data.json(); + //invalid response + if (text && typeof hash == "undefined") + hash = { status:"error" }; + } + this.processResult(state, hash, {text:text, data:data, loader:loader}); + } + } + + this.callEvent("onAfterSync", [state, text, data, loader]); + }, + + + /*! if it's defined escape function - call it + * @param value + * value to escape + * @return + * escaped value + **/ + escape: function(value) { + if (this._settings.escape) + return this._settings.escape(value); + else + return encodeURIComponent(value); + }, + getState:function(){ + if (!this._updates.length) return false; + for (var i = this._updates.length - 1; i >= 0; i--) + if (this._updates[i]._in_progress) + return "saving"; + + return true; + }, + getItemState:function(id){ + var index = this._get_stack_index(id); + return this._updates[index] || null; + }, + setItemState:function(id, state){ + if (state) + this.save(id, state); + else{ + var index = this._get_stack_index(id); + if (index > -1) + this._updates.splice(index, 1); + } + }, + _get_stack_index: function(id) { + var index = -1; + var update = null; + for (var i=0; i < this._updates.length; i++) + if (this._updates[i].id == id) { + index = i; + break; + } + + return index; + } + +}, webix.Settings, webix.EventSystem, webix.ValidateData); + + + + +webix.jsonp = function(url, params, callback, master){ + var id = "webix_jsonp_"+webix.uid(); + var script = document.createElement('script'); + script.id = id; + script.type = 'text/javascript'; + + var head = document.getElementsByTagName("head")[0]; + + if (typeof params == "function"){ + master = callback; + callback = params; + params = {}; + } + + if (!params) + params = {}; + + params.jsonp = "webix.jsonp."+id; + webix.jsonp[id]=function(){ + callback.apply(master||window, arguments); + script.parentNode.removeChild(script); + callback = head = master = script = null; + delete webix.jsonp[id]; + }; + + var vals = []; + for (var key in params) vals.push(key+"="+encodeURIComponent(params[key])); + + url += (url.indexOf("?") == -1 ? "?" : "&")+vals.join("&"); + + script.src = url ; + head.appendChild(script); +}; + +webix.markup = { + namespace:"x", + attribute:"data-", + dataTag:"li", + _dash:/-([a-z])/g, + _after_dash:function (match) { return match[1].toUpperCase(); }, + _parse_int:{ + width:true, + height:true, + gravity:true, + margin:true, + padding:true, + paddingX:true, + paddingY:true, + minWidth:true, + maxWidth:true, + minHeight:true, + maxHeight:true, + headerRowHeight:true + }, + _view_has_method:function(view, name){ + return webix.ui.hasMethod(view, name); + }, + + init: function(node, target, scope){ + node = node || document.body; + + var els = []; + var temp = this._get_core_els(node); + var html = temp.html; + var ui = null; + + //make copy to prevent node removing effects + for (var i = temp.length - 1; i >= 0; i--) els[i] = temp[i]; + + for (var i = 0; i < els.length; i++) { + var config, temp_config; + //collect configuration + config = this._sub_markup(els[i], html); + config.$scope = scope; + ui = this._initComponent(config, els[i], html, target); + } + return ui; + }, + + parse:function(source, mode){ + //convert from string to object + if (typeof source == "string") + source = webix.DataDriver[mode || "xml"].toObject(source, source); + + var els = this._get_core_els(source, mode); + return this._sub_markup(els[0], els.html); + }, + + _initComponent:function(config, node, html, target){ + if (!target){ + config.container = node.parentNode; + webix.html.remove(node); + } else + config.container = target; + + if (this._view_has_method(config.view, "setPosition")) + delete config.container; + + //init ui + return webix.ui(config); + }, + + _get_core_els:function(node){ + this._full_prefix = this.namespace?(this.namespace+":"):""; + this._full_prefix_top = this._full_prefix+"ui"; + + //xhtml mode + var els = node.getElementsByTagName(this._full_prefix_top); + if (!els.length && node.documentElement && node.documentElement.tagName == this._full_prefix_top) + els = [ node.documentElement ]; + + //loading from xml file with valid namespace + if (!els.length && this.namespace){ + els = node.getElementsByTagName("ui"); + if (!els.length && node.documentElement && node.documentElement.tagName == "ui") + els = [ node.documentElement ]; + } + + if (!els.length){ + //html mode + els = this._get_html_tops(node); + els.html = true; + } + return els; + }, + + //html conversion + _get_html_tops: function(node){ + if (node.getAttribute && node.getAttribute(this.attribute+"view")) + return [node]; + + var els = node.querySelectorAll("["+this.attribute+"view]"); + + var tags = []; var marks = []; + for (var i = 0; i < els.length; i++) + if (!els[i].parentNode.getAttribute(this.attribute+"view")) + tags.push(els[i]); + + return tags; + }, + + + + _sub_markup: function(el, html, json){ + var htmltable = false; + //ignore top x:ui for xhtml and xml + if (!json){ + var name = this._get_name(el, html); + if (name == "ui"){ + var childs = el.childNodes; + for (var i = 0; i < childs.length; i++) + if (childs[i].nodeType == 1){ + return this._sub_markup(childs[i], html); + } + } + json = { view: name }; + if (html && el.tagName.toLowerCase() == "table"){ + json.data = el; + json.datatype = "htmltable"; + htmltable = true; + } + } + + var is_layout = json.view == "cols" || json.view == "rows" || this._view_has_method(json.view, "addView"); + + var subs = []; + var has_tags = 0; + var allow_sub_tags = !(html || el.style); //only for xml documents + var first = el.firstChild; + while (first){ + //tag node + if (first.nodeType == 1){ + var name = this._get_name(first, html); + if (name == "data"){ + has_tags = 1; + var data = first; first = first.nextSibling; + json.data = this._handle_data(data, html); + continue; + } else if (name == "config"){ + this._get_config_html(first, json, html); + var confignode = first; + first = first.nextSibling; + + webix.html.remove(confignode); + continue; + } else if (name == "column"){ + has_tags = 1; + + var column = this._tag_to_json(first, html); + column.header = column.header || column.value; + column.width = column.width * 1 || ""; + + json.columns = json.columns || []; + json.columns.push(column); + } else if (name || (is_layout && html)){ + var obj = this._sub_markup(first , html , { view:name }); + if (obj.view == "head") + json.head = obj.rows ? obj.rows[0] : obj.template; + else if (obj.view == "body"){ + if (this._view_has_method(json.view, "addView")){ + //multiview, accordion + + //subtag or plain value + //in case of multiple sub tags, only first will be used + // #dirty + subs.push({ + body: (obj.rows ? obj.rows[0] : obj.value), + header:obj.header || "" + }); + } else { + //window, fieldset + + //one sub tag - use it + //multiple sub tags - create sub layout + //or use plain text value + json.body = obj.rows ? ( obj.rows.length == 1 ? obj.rows[0] : { rows:obj.rows } ) : obj.value; + } + } else + subs.push(obj); + } else if (allow_sub_tags) { + has_tags = 1; + var tagName = first.tagName; + if (html) tagName = tagName.toLowerCase().replace(this._dash, this._after_dash); + json[tagName] = webix.DataDriver.xml.tagToObject(first); + + } + } + + first = first.nextSibling; + } + + this._attrs_to_json(el, json, html); + + if (subs.length){ + if (json.stack) + json[json.stack] = subs; + else if (this._view_has_method(json.view, "setValues")) + json["elements"] = subs; + else if (json.view == "rows"){ + json.view = "layout"; + json.rows = subs; + } else if (json.view == "cols"){ + json.view = "layout"; + json.cols = subs; + } else if (this._view_has_method(json.view, "setValue")){ + json["cells"] = subs; + } else if (this._view_has_method(json.view, "getBody")){ + json.body = subs.length == 1 ? subs[0] : { rows:subs }; + } else + json["rows"] = subs; + } else if (!htmltable && !has_tags){ + if (html && !json.template && (!json.view || json.view == "template")){ + json.view = "template"; + json.content = el; + } else { + var content = this._content(el, html); + if (content){ + var target = "template"; + if (this._view_has_method(json.view, "setValue")) + target = "value"; + json[target] = json[target] || content; + } + } + } + + return json; + }, + + _empty: function(str) { + var clean = str.replace(/\s+/gm, ''); + return (clean.length > 0) ? false : true; + }, + + _markup_names:{ + body:1, + head:1, + data:1, + rows:1, + cols:1, + cells:1, + elements:1, + ui:1, + column:1, + config:1 + }, + + _get_config_html:function(tag, json, html){ + var master = this._attrs_to_json(tag, { }); + if (master.name){ + json[master.name] = master; + delete master.name; + } else + if (master.stack) json[master.stack] = []; + else + json = master; + + var childs = tag.childNodes; + for (var i = 0; i < childs.length; i++) { + var sub = null; + if (childs[i].nodeType == 1 && childs[i].tagName.toLowerCase() == "config" && childs[i].attributes.length) + sub = this._get_config_html(childs[i], master, html); + else + sub = childs[i].innerHTML; + if (master.stack && sub) + json[master.stack].push(sub); + + } + return json; + }, + + _get_name:function(tag, html){ + //value of view attribute or config tag + if (html) + return tag.getAttribute(this.attribute+"view") || ( tag.tagName.toLowerCase() == "config" ? "config" : null); + var name = tag.tagName.toLowerCase(); + if (this.namespace){ + if (name.indexOf(this._full_prefix) === 0 || tag.scopeName == this.namespace) + return name.replace(this._full_prefix,""); + } else { + if (webix.ui[name] || this._markup_names[name]) + return name; + } + return 0; + }, + + _handle_data:function(el, html){ + var data = []; + + var records = el.getElementsByTagName(webix.markup.dataTag); + for (var i=0; i
      "+text+"
      "; + } + + function info(text){ + if (!t.area){ + t.area = document.createElement("DIV"); + t.area.className = "webix_message_area"; + t.area.style[t.position]="5px"; + document.body.appendChild(t.area); + } + t.hide(text.id); + var message = document.createElement("DIV"); + message.innerHTML = "
      "+text.text+"
      "; + message.className = "webix_info webix_" + text.type; + message.onclick = function(){ + t.hide(text.id); + text = null; + }; + + if (webix.$testmode) + message.className += " webix_no_transition"; + + if (t.position == "bottom" && t.area.firstChild) + t.area.insertBefore(message,t.area.firstChild); + else + t.area.appendChild(message); + + if (text.expire > 0) + t.timers[text.id]=window.setTimeout(function(){ + t.hide(text.id); + }, text.expire); + + //styling for animation + message.style.height = message.offsetHeight-2+"px"; + + t.pull[text.id] = message; + message = null; + + return text.id; + } + function _boxStructure(config, ok, cancel){ + var box = document.createElement("DIV"); + box.className = " webix_modal_box webix_"+config.type; + box.setAttribute("webixbox", 1); + + var inner = ''; + if (config.width) + box.style.width = config.width+(webix.rules.isNumber(config.width)?"px":""); + if (config.height) + box.style.height = config.height+(webix.rules.isNumber(config.height)?"px":""); + if (config.title) + inner+='
      '+config.title+'
      '; + inner+='
      '+(config.content?'':config.text)+'
      '; + if (ok || config.ok) + inner += button(config.ok || "OK", true,"confirm"); + if (cancel || config.cancel) + inner += button(config.cancel || "Cancel", false); + if (config.buttons){ + for (var i=0; i b.id) ? 1 : ((a.id == b.id) ? 0 : -1); + }); + + return { elements:options, data:values, head:" ["+view.name+"] "+view._settings.id+"" }; + } + + function create_inspector(){ + if (!webix.$$("webix_debug_inspector_win")) + webix.ui({ + id:"webix_debug_inspector_win", + view:"window", + top:2, left: 0, width:350, height:350, + head:false, autofit:false, + body:{cols:[ + { width:10}, + {type:"clean", rows:[ + { view:"toolbar", elements:[ + { view:"label", value:"", id:"webix_debug_inspector_head" }, + { view:"button", width:100, value:"Hide", type:"custom", click:function(){ + webix.debug_inspect(); + }} + ]}, + { + id:"webix_debug_inspector", nameWidth:150, + view:"property", scroll:"y", + elements:[], + on:{ + onaftereditstop:function(state, editor){ + if (state.old == state.value) return; + + var value = state.value; + if (value === "true" || value === "false"){ + value = (value === "true"); + } else { + var intvalue = parseInt(value,10); + if (intvalue == value) + value = intvalue; + } + + var view = webix.$$(this.config.view); + view.define(editor.id, value); + if (view.refreshColumns) + view.refreshColumns(); + else if (view.refresh) + view.refresh(); + + view.resize(); + } + } + } + ] + }] + } + }); + } + function show_inspector(view, ev){ + create_inspector(); + var win = webix.$$("webix_debug_inspector_win"); + + if (view){ + var config = get_inspector_config(view); + var winx = document.body.offsetWidth; + var winy = document.body.offsetHeight; + var pos = ev?webix.html.pos(ev):{x:0,y:0}; + + win.define("height", Math.max(350, winy-4)); + win.resize(); + + var props = webix.$$("webix_debug_inspector"); + props.define("elements", config.elements); + props.define("view", view); + + win.show({ x:(pos.x > winx/2 )?0:(winx-370), y:0 }); + webix.$$("webix_debug_inspector").setValues(config.data); + webix.$$("webix_debug_inspector_head").setValue(config.head); + } else + win.hide(); + } + webix.debug_inspect = show_inspector; + + function infi(value){ + if (value >= 100000) + return "Any"; + return value; + } + function log_level(data, prefix, now){ + window.console.log((data == now?">>":" ")+prefix + data.name+" / " +data.config.id); + prefix+=" "; + if (data._cells) + for (var i=0; i["+view.name+"]"; + document.getElementById("webix_debug_cmx").innerHTML = info; + } + }, + data:[ + "
      ", + { id:"inspect", value:"Inspect"}, + { id:"docs", value:"Documentation"}, + { + value:"Log to Console", submenu:[ + { id:"size", value:"Sizes" }, + { id:"tree", value:"Tree" }, + { id:"dump", value:"Dump"} + ] + } + ], + click:function(id, ev){ + //mixing two object result in confusion + var obj = webix.$$(this.config.lastTarget); + + if (id == "dump"){ + window.console.info("\n"+obj.name+" / "+obj.config.id); + window.console.log("\nView: ",obj,", Config: ", obj.config, ", Data: ", obj.data); + window.console.log(obj.$view); + } + + if (id == "tree"){ + + var now = obj; + while (obj.getParentView()) + obj = obj.getParentView(); + + window.console.log(""); + log_level(obj, "", now); + } + + if (id == "size"){ + window.console.info(""); + window.console.info("\n"+obj.name+" / "+obj.config.id); + window.console.info("\n[min] ", obj.config.width, " x ", obj.config.height); + var sizes = obj.$getSize(0,0); + window.console.info("[max] ", infi(sizes[1]), " x ", infi(sizes[3])+(obj.config.autoheight?", auto height":"")); + window.console.info("[gravity] ", obj.config.gravity); + + window.console.info("\n[content] ", obj._content_width, " x ", obj._content_height); + window.console.info("[last set] ", obj._last_size[0], " x ", obj._last_size[1]); + if (obj._settings._inner) + window.console.info("\n[borders] ", "left:", !obj._settings._inner.left,"\ttop:", !obj._settings._inner.top, "\tright:", !obj._settings._inner.right, "\tbottom:", !obj._settings._inner.bottom); + else + window.console.info("\n[borders] none"); + } + + if (id == "docs") + window.open("http://docs.webix.com/api__refs__ui."+obj.name+".html","__blank"); + + if (id == "inspect"){ + show_inspector(this.config.lastTarget, ev); + } + }, + master:document.body + }); +}); + + + + +webix.protoUI({ + name:"carousel", + defaults:{ + scrollSpeed:"300ms", + type: "clean", + navigation: {} + }, + $init:function(config){ + this._viewobj.className += " webix_carousel"; + this._layout = null; + this._dataobj = null; + this._active_cell = 0; + this.$ready.unshift(this._initLayout); + this.$ready.push(this._after_init_call); + }, + + _initLayout: function(){ + if(this._layout && this._layout.destructor) + this._layout.destructor(); + + var layout = ""; + + if(this.config.cols){ + layout = "cols"; + this._vertical_orientation = 0; + } + else{ + layout = "rows"; + this._vertical_orientation = 1; + } + + var config = {borderless: true, type: "clean"}; + config[layout] = webix.copy(this.config[layout]); + webix.extend(config,(config.layoutConfig||{}),true); + + this._layout = webix.ui._view(config); + this._layout._parent_cell = this; + + this._viewobj.appendChild(this._layout._viewobj); + this._cells = this._layout._cells; + + this._layout._show = webix.bind(webix.ui.carousel.prototype._show,this); + this._layout.adjustScroll = webix.bind(webix.ui.carousel.prototype.adjustScroll,this); + + webix.attachEvent("onReconstruct", webix.bind(function(view){ + if(view == this._layout) + this._setScroll(); + },this)); + + this._contentobj = this._viewobj.firstChild; + }, + getChildViews:function(){ + return [this._layout]; + }, + getLayout:function(){ + return this._layout; + }, + _after_init_call:function(){ + this._contentobj.setAttribute("touch_scroll", (this._vertical_orientation?"y":"x")); + + this._layout.attachEvent("onAfterScroll",webix.bind(function(){ + this.callEvent("onShow",[this.getActiveId()]); + },this)); + }, + adjustScroll:function(matrix){ + var size = (this._vertical_orientation?this._content_height:this._content_width); + + var correction; + if (this._vertical_orientation) { + correction = Math.round(matrix.f/size); + matrix.f = correction*size; + } else { + correction = Math.round(matrix.e/size); + matrix.e = correction*size; + } + + this._active_cell = - correction; + + if(this._settings.navigation) + this._renderNavItems(); + + return true; + }, + _show:function(obj){ + var i, layout, _nextCell, _size, x, y; + _nextCell = -1; + layout = this._layout; + for (i=0; i < layout._cells.length; i++){ + if (layout._cells[i]==obj){ + _nextCell = i; + break; + } + } + + if (_nextCell < 0 || _nextCell == this._active_cell) + return; + + this._active_cell = _nextCell; + _size = (layout._vertical_orientation?this._content_height:this._content_width); + + x = -(layout._vertical_orientation?0:_nextCell*_size); + y = -(layout._vertical_orientation?_nextCell*_size:0); + + this.scrollTo(x,y); + this.callEvent("onShow",[layout._cells[this._active_cell]._settings.id]); + if(this._settings.navigation) + this._renderPanel(); + }, + scrollTo:function(x,y){ + if (webix.Touch && webix.animate.isSupported()) + webix.Touch._set_matrix(this._contentobj, x,y, this._settings.scrollSpeed||"100ms"); + else{ + this._contentobj.style.marginLeft = x+"px"; + this._contentobj.style.marginTop = y+"px"; + } + }, + navigation_setter:function(config){ + this._mergeSettings(config,{ + type: "corner", + buttons: true, + items: true + }); + return config; + }, + showNext:function(){ + if (this._active_cell < this._layout._cells.length - 1) + this.setActiveIndex(this._active_cell+1); + }, + showPrev:function(){ + if (this._active_cell > 0) + this.setActiveIndex(this._active_cell-1); + }, + setActiveIndex:function(value){ + webix.assert(value < this._layout._cells.length, "Not existing index in collection"); + + var id = this._layout._cells[value]._settings.id; + webix.$$(id).show(); + }, + getActiveIndex:function(){ + return this._active_cell; + }, + $getSize:function(dx, dy){ + var layoutSizes = this._layout.$getSize(0, 0); + var selfSizes = webix.ui.view.prototype.$getSize.call(this, dx, dy); + if(this._layout._vertical_orientation){ + selfSizes[0] = Math.max(selfSizes[0], layoutSizes[0]); + selfSizes[1] = Math.min(selfSizes[1], layoutSizes[1]); + + } else{ + selfSizes[2] = Math.max(selfSizes[2], layoutSizes[2]); + selfSizes[3] = Math.min(selfSizes[3], layoutSizes[3]); + } + return selfSizes; + }, + $setSize:function(x,y){ + var layout = this._layout; + var c = layout._cells.length; + + var changed = webix.ui.view.prototype.$setSize.call(this,x,y); + var yc = this._content_height*(layout._vertical_orientation?c:1); + var xc = this._content_width*(layout._vertical_orientation?1:c); + + if (changed){ + this._contentobj.style.height = yc+"px"; + this._contentobj.style.width = xc+"px"; + layout.$setSize(xc,yc); + this._setScroll(); + } else + layout.$setSize(xc,yc); + }, + _setScroll: function(){ + var layout = this._layout; + var activeCell = this._active_cell||0; + var size = (layout._vertical_orientation?this._content_height:this._content_width); + + var x = -(layout._vertical_orientation?0:activeCell*size); + var y = -(layout._vertical_orientation?activeCell*size:0); + + + this.scrollTo(x,y); + + if(this._settings.navigation) + this._renderPanel(); + }, + getActiveId:function(){ + var cell = this._layout._cells[this._active_cell]; + return cell?cell._settings.id:null; + }, + setActive:function(value){ + webix.$$(value).show(); + } +}, webix.EventSystem,webix.NavigationButtons, webix.ui.view); + +/* + UI:Uploader +*/ + + + + + +webix.type(webix.ui.list, { + name:"uploader", + template:"#name# {common.removeIcon()}{common.percent()}
      #sizetext#
      ", + percent:function(obj){ + if (obj.status == 'transfer') + return "
      "+obj.percent+"%
      "; + return "
      "; + }, + removeIcon:function(obj){ + return "
      "; + }, + on_click:{ + "webix_remove_upload":function(ev, id){ + webix.$$(this.config.uploader).files.remove(id); + } + } +}); + +webix.UploadDriver = { + flash: { + $render: function(render_config) { + + if (!window.swfobject) + webix.require("legacy/swfobject.js"); // sync loading + + var config = this._settings; + config.swfId = (config.swfId||"webix_swf_"+webix.uid()); + + this._getBox().innerHTML += "
      "; + this._upload_area = this._getBox().lastChild; + + // add swf object + swfobject.embedSWF(webix.codebase+"/legacy/uploader.swf", config.swfId, "100%", "100%", "9", null, { + uploaderId: config.id, + ID: config.swfId, + enableLogs:(config.enableLogs?"1":""), + paramName:(config.paramName||"upload"), + multiple:(config.multiple?"Y":"") + }, {wmode:"transparent"}); + + var v = swfobject.getFlashPlayerVersion(); + + webix.event(this._viewobj, "click", webix.bind(function() { + var now_date = new Date(); + if (now_date - (this._upload_timer_click||0) > 250){ + this.fileDialog(); + } + }, this)); + + this.files.attachEvent("onBeforeDelete", webix.bind(this._stop_file,this)); + }, + $applyFlash: function(name,params){ + return this[name].apply(this,params); + }, + getSwfObject: function(){ + return swfobject.getObjectById(this._settings.swfId); + }, + fileDialog:function(){ + if(this.getSwfObject()) + this.getSwfObject().showDialog(); + }, + send: function(id){ + if (typeof id == "function"){ + this._last_assigned_upload_callback = id; + id = 0; + } + + if (!id){ + var order = this.files.data.order; + var complete = true; + if (order.length) + for (var i=0; i 250){ + this.fileDialog(); + } + }, this)); + + webix.event(this._viewobj, 'dragenter', webix.html.preventEvent); + webix.event(this._viewobj, 'dragexit', webix.html.preventEvent); + webix.event(this._viewobj, 'dragover', webix.html.preventEvent); + }, + + // adding files by drag-n-drop + _drop: function(e) { + var files = e.dataTransfer.files; + if (this.callEvent('onBeforeFileDrop', [files, e])) + this._add_files(files); + this.callEvent("onAfterFileDrop",[files, e]); + }, + + fileDialog:function(context){ + this._upload_timer_click = new Date(); + this._last_file_context = context; + var inputs = this._viewobj.getElementsByTagName("INPUT"); + inputs[inputs.length-1].click(); + }, + send: function(id, details){ + //alternative syntx send(callback) + if (typeof id == "function"){ + this._last_assigned_upload_callback = id; + id = 0; + } + + if (!id){ + var order = this.files.data.order; + var complete = true; + + if (order.length) + for (var i=0; i 1024){ + index++; + size = size/1024; + } + return Math.round(size*100)/100+" "+webix.i18n.fileSize[index]; + }, + + _complete: function(id, response) { + if (response.status === 'server') { + var item = this.files.getItem(id); + + item.status = "server"; + item.progress = 100; + webix.extend(item, response, true); + + this.callEvent("onFileUpload", [item, response]); + this.callEvent("onChange", []); + this.files.updateItem(id); + } + + if (this.isUploaded()) + this._upload_complete(response); + }, + _upload_complete:function(response){ + this.callEvent("onUploadComplete", [response]); + if (this._last_assigned_upload_callback){ + this._last_assigned_upload_callback.call(this, response); + this._last_assigned_upload_callback = 0; + } + }, + isUploaded:function(){ + var order = this.files.data.order; + for (var i=0; i=7); + + + var iphone_safari = iphone && (size == 356 || size == 208 || size == 306 || size == 158 || size == 444); + var iphone5 = (window.screen.height==568); + + var fix = function(){ + var x = 0; var y=0; + if (iphone && !iOS7){ + if (!webix.ui.orientation){ + x = 320; + y = iphone5?(iphone_safari?504:548):(iphone_safari?416:460); + } else { + x = iphone5?568:480; + y = iphone_safari?268:300; + } + } else if (webix.env.isAndroid){ + + if(!webix.env.isFF){ + //ipad doesn't change orientation and zoom level, so just ignore those lines + document.body.style.width = document.body.style.height = "1px"; + document.body.style.overflow="hidden"; + + var dmod = window.outerWidth/window.innerWidth; //<1 + x = window.outerWidth/dmod; + y = window.outerHeight/dmod; + } + } else if(!webix.env.isIEMobile){ + x = window.innerWidth; + y = window.innerHeight; + } + + if (y){ + document.body.style.height = y+"px"; + document.body.style.width = x+"px"; + } + + webix.ui.$freeze = false; + webix.ui.resize(); + }; + + var onrotate = function(){ + webix.ui.$freeze = true; + if(webix.env.isSafari) + fix(); + else + webix.delay(fix,null, [], 500); + }; + + + webix.attachEvent("onRotate", onrotate); + orientation(); + webix.delay(onrotate); + +}; + + +})(); +(function(){ + +if (window.jQuery){ + + var $ = jQuery; + var methods = []; + + var get_id = function(node){ + if (node && node.getAttribute) + return node.getAttribute("view_id"); + }; + + var get_helper = function(name){ + return function(config){ + if (typeof(config) === 'string') { + if (methods[config] ) { + return methods[config].apply(this, []); + }else { + $.error('Method ' + config + ' does not exist on jQuery.'.name); + } + } else { + var views = []; + this.each(function() { + var view; + var id; + + //if target a webix component - return it + var id = get_id(this) || get_id(this.firstChild); + if (id) + view = webix.$$(id); + + if (!view){ + //do not include data in copy as it can be massive + var temp_data = config?config.data:0; + if (temp_data) config.data = null; + + var copy = webix.copy(config||{ autoheight:true, autowidth:true }); + copy.view = name; + if (temp_data) config.data = copy.data = temp_data; + + + if (this.tagName.toLowerCase() === 'table') { + var div = webix.html.create("div",{ + id:(this.getAttribute("id")||""), + "class":(this.getAttribute("class")||"") + },""); + + this.parentNode.insertBefore(div, this); + copy.container = div; + view = webix.ui(copy); + view.parse(this, "htmltable"); + } else { + copy.container = this; + view = webix.ui(copy); + } + } + views.push(view); + }); + + if (views.length === 1) return views[0]; + return views; + } + }; + }; + + var run = function(){ + for (var key in webix.ui){ + var name = "webix_"+key; + if (!$.fn[name]) + $.fn[name] = get_helper(key); + } + }; + + run(); + $(run); + +} + +})(); + +/* + Behavior:History - change multiview state on 'back' button + + */ + +webix.history = { + track:function(id, url){ + this._init_state(id, url); + + var view = webix.$$(id); + + var handler = function(){ + if (webix.history._ignored) return; + + if (view.getValue) + webix.history.push(id, view.getValue()); + }; + + if (view.getActiveId) + view.attachEvent("onViewChange", handler); + else + view.attachEvent("onChange", handler); + }, + _set_state:function(view, state){ + webix.history._ignored = 1; + + view = webix.$$(view); + if (view.callEvent("onBeforeHistoryNav", [state])) + if (view.setValue) + view.setValue(state); + + webix.history._ignored = 0; + }, + push:function(view, url, value){ + view = webix.$$(view); + var new_url = ""; + if (url) + new_url = "#!/"+url; + if (webix.isUndefined(value)){ + if (view.getValue) + value = view.getValue(); + else + value = url; + } + + window.history.pushState({ webix:true, id:view._settings.id, value:value }, "", new_url); + }, + _init_state:function(view, url){ + webix.event(window, "popstate", function(ev){ + if (ev.state && ev.state.webix){ + webix.history._set_state(ev.state.id, ev.state.value); + } + }); + + var state = window.location.hash; + webix.noanimate = true; + if (state && state.indexOf("#!/") === 0) + webix.history._set_state(view, state.replace("#!/","")); + else if (url){ + webix.history.push(view, url); + webix.history._set_state(view, url); + } + webix.noanimate = false; + + this._init_state = function(){}; + } +}; +webix.protoUI({ + name:"fieldset", + defaults:{ + borderless:true + }, + $init:function(obj){ + webix.assert(obj.body, "fieldset must have not-empty body"); + + this._viewobj.className += " webix_fieldset"; + this._viewobj.innerHTML = "
      "; + }, + label_setter:function(value){ + this._viewobj.firstChild.childNodes[0].innerHTML = value; + return value; + }, + getChildViews:function(){ + return [this._body_view]; + }, + body_setter:function(config){ + this._body_view = webix.ui(config, this._viewobj.firstChild.childNodes[1]); + this._body_view._parent_cell = this; + return config; + }, + getBody:function(){ + return this._body_view; + }, + $getSize:function(x,y){ + webix.debug_size_box_start(this, true); + x+=18; y+=45; + var t = this._last_body_size = this._body_view.$getSize(x,y); + webix.debug_size_box_end(this, t); + return t; + }, + $setSize:function(x,y){ + if (webix.ui.view.prototype.$setSize.call(this, x,y)){ + y = Math.min(this._last_body_size[3], y); + x = Math.min(this._last_body_size[1], x); + this._body_view.$setSize(x-18,y-45); + } + } +}, webix.ui.view); + + +webix.protoUI({ + name:"slider", + $touchCapture:true, + defaults:{ + min:0, + max:100, + value:50, + step:1, + title:false, + template:function(obj, common){ + var id = common._handle_id = "x" +(obj.id || webix.uid()); + var html = "
       
       
      "; + return common.$renderInput(obj, html, id); + } + }, + type_setter:function(type){ + this._viewobj.className += " webix_slider_"+type; + }, + title_setter:function(value){ + if (typeof value == 'string') + return webix.template(value); + return value; + }, + _get_slider_handle:function(){ + //not very good, but reliable enough + return document.getElementById(this._handle_id); + }, + _set_inner_size:function(){ + + var handle = this._get_slider_handle(); + var config = this._settings; + + //10 - padding of webix_slider_box ( 20 = 10*2 ) + //8 - width of handle / 2 + + if (handle){ //view is rendered for sure + var width = this._get_input_width(config); + + var value = config.value%config.step?(Math.round(config.value/config.step)*config.step):config.value; + value = Math.max(Math.min(value,config.max),config.min); + var max = config.max - config.min; + var left = Math.ceil((width - 20) * (value-config.min) / max); + var right = width-20-left; + + handle.style.left = 10 + left - 8 + "px"; + handle.parentNode.style.width = width+"px"; + //1px border + right = Math.min(Math.max(right,2),width-22); + left = Math.min(Math.max(left,2),width-22); + //width for left and right bars + var part = handle.previousSibling; + part.style.width = right + "px"; + var last = part.previousSibling; + last.style.width = left + "px"; + + if (this._settings.title){ + handle.parentNode.previousSibling.innerHTML = this._settings.title(this._settings, this); + } + } + }, + refresh:function(){ + this._set_inner_size(); + }, + $setValue:function(){ + this.refresh(); + }, + $getValue:function(){ + return this._settings.value; + }, + $init:function(){ + if(webix.env.touch){ + this.attachEvent("onTouchStart" , webix.bind(this._on_mouse_down_start, this)); + } + else + webix.event(this._viewobj, "mousedown", webix.bind(this._on_mouse_down_start, this)); + }, + _on_mouse_down_start:function(e){ + var trg = e.target || e.srcElement; + if(this._mouse_down_process){ + this._mouse_down_process(e); + } + + var value = this._settings.value; + if(webix.isArray(value)) + value = webix.copy(value); + + if (trg.className.indexOf("webix_slider_handle")!=-1){ + this._start_value = value; + return this._start_handle_dnd.apply(this,arguments); + } else if (trg.className.indexOf("webix_slider") != -1){ + this._start_value = value; + + this._settings.value = this._get_value_from_event.apply(this,arguments); + + this._start_handle_dnd(e); + } + }, + _start_handle_dnd:function(e){ + if(webix.env.touch){ + this._handle_drag_events = [ + this.attachEvent("onTouchMove" , webix.bind(this._handle_move_process, this)), + this.attachEvent("onTouchEnd" , webix.bind(this._handle_move_stop, this)) + ]; + } + else + this._handle_drag_events = [ + webix.event(document.body, "mousemove", webix.bind(this._handle_move_process, this)), + webix.event(document.body, "mouseup", webix.bind(this._handle_move_stop, this)) + ]; + webix.html.addCss(document.body,"webix_noselect"); + }, + _handle_move_stop:function(e){ + //detach event handlers + if(this._handle_drag_events){ + if(webix.env.touch){ + webix.detachEvent(this._handle_drag_events[0]); + webix.detachEvent(this._handle_drag_events[1]); + } + else{ + webix.eventRemove(this._handle_drag_events[0]); + webix.eventRemove(this._handle_drag_events[1]); + } + this._handle_drag_events = []; + } + + webix.html.removeCss(document.body,"webix_noselect"); + + var value = this._settings.value; + if(webix.isArray(value)) + value = webix.copy(value); + + this._settings.value = this._start_value; + this.setValue(value); + }, + _handle_move_process:function(e){ + + this._settings.value = this._get_value_from_event.apply(this,arguments); + + this.refresh(); + this.callEvent("onSliderDrag", []); + }, + _get_value_from_event:function(event,touchContext){ + // this method takes 2 arguments in case of touch env + var pos = 0; + if(webix.env.touch){ + pos = touchContext?touchContext.x: event.x; + } + else + pos = webix.html.pos(event).x; + return this._get_value_from_pos(pos); + }, + _get_value_from_pos:function(pos){ + var config = this._settings; + //10 - padding of slider box + var max = config.max - config.min; + var left = webix.html.offset(this._get_slider_handle().parentNode).x; + var newvalue = Math.ceil((pos-left) * max / this._get_input_width(config)); + newvalue = Math.round((newvalue+config.min)/config.step) * config.step; + return Math.max(Math.min(newvalue, config.max), config.min); + }, + _init_onchange:function(){} //need not ui.text logic +}, webix.ui.text); + +/*webix.require core/proxy.js*/ + + +/* + view.load("offline->some.php") + + or + + view.load( webix.proxy("offline", "some.php") ); + + or + + view.load( webix.proxy("offline", "post->url.php") ); +*/ + +webix.proxy.offline = { + $proxy:true, + + storage: webix.storage.local, + cache:false, + data:"", + + _is_offline : function(){ + if (!this.cache && !webix.env.offline){ + webix.call("onOfflineMode",[]); + webix.env.offline = true; + } + }, + _is_online : function(){ + if (!this.cache && webix.env.offline){ + webix.env.offline = false; + webix.call("onOnlineMode", []); + } + }, + + load:function(view, callback){ + var mycallback = { + error:function(){ + //assuming offline mode + var text = this.getCache() || this.data; + + var loader = { responseText: text }; + var data = webix.ajax.prototype._data(loader); + + this._is_offline(); + webix.ajax.$callback(view, callback, text, data, loader); + }, + success:function(text, data, loader){ + this._is_online(); + webix.ajax.$callback(view, callback, text, data, loader); + + this.setCache(text); + } + }; + + //in cache mode - always load data from cache + if (this.cache && this.getCache()) + mycallback.error.call(this); + else { + //else try to load actual data first + if (this.source.$proxy) + this.source.load(this, mycallback); + else + webix.ajax(this.source, mycallback, this); + } + }, + getCache:function(){ + return this.storage.get(this._data_name()); + }, + clearCache:function(){ + this.storage.remove(this._data_name()); + }, + setCache:function(text){ + this.storage.put(this._data_name(), text); + }, + _data_name:function(){ + if (this.source.$proxy) + return this.source.source + "_$proxy$_data"; + else + return this.source + "_$proxy$_data"; + }, + saveAll:function(view, update, dp, callback){ + this.setCache(view.serialize()); + webix.ajax.$callback(view, callback, "", update); + }, + result:function(id, master, dp, text, data){ + for (var i = 0; i < data.length; i++) + dp.processResult({ id: data[i].id, status: data[i].operation }, {}, {}); + } +}; + +webix.proxy.cache = { + init:function(){ + webix.extend(this, webix.proxy.offline); + }, + cache:true +}; + +webix.proxy.local = { + init:function(){ + webix.extend(this, webix.proxy.offline); + }, + cache:true, + data:[] +}; + +if (window.angular) + +(function(){ + + function id_helper($element){ + //we need uniq id as reference + var id = $element.attr("id"); + if (!id){ + id = webix.uid(); + $element.attr("id", id); + } + return id; + } + + function locate_view_id($element){ + if (typeof $element.attr("webix-ui") != "undefined") + return $element.attr("id"); + return locate_view_id($element.parent()); + } + + + + +//creates webix ui components +angular.module("webix", []) + .directive('webixUi', [ "$parse", function($parse) { + return { + restrict: 'A', + scope: false, + link:function ($scope, $element, $attrs, $controller){ + var dataname = $attrs["webixUi"]; + var callback = $attrs["webixReady"]; + var wxRoot = null; + var id = id_helper($element); + + $element.ready(function(){ + if (wxRoot) return; + + if (callback) + callback = $parse(callback); + + //destruct components + $element.bind('$destroy', function() { + if(wxRoot) wxRoot.destructor(); + }); + + //webix-ui attribute has some value - will try to use it as configuration + if (dataname){ + //configuration + var watcher = function(data){ + if (wxRoot) wxRoot.destructor(); + if ($scope[dataname]){ + var config = webix.copy($scope[dataname]); + config.$scope =$scope; + wxRoot = webix.ui(config, $element[0]); + if (callback) + callback($scope, { root: wxRoot }); + } + }; + $scope.$watch(dataname, watcher); + watcher(); + } else { + //if webix-ui is empty - init inner content as webix markup + if (!$attrs["view"]) + $element.attr("view", "rows"); + + var ui = webix.markup; + var tmp_a = ui.attribute; ui.attribute = ""; + //FIXME - memory leaking, need to detect the moment of dom element removing and destroy UI + if (typeof $attrs["webixRefresh"] != "undefined") + wxRoot = ui.init($element[0], $element[0], $scope); + else + wxRoot = ui.init($element[0], null, $scope); + + ui.attribute = tmp_a; + + if (callback) + callback($scope, { root: wxRoot }); + } + + //size of ui + $scope.$watch(function() { + return $element[0].offsetWidth + "." + $element[0].offsetHeight; + }, function() { + if (wxRoot) wxRoot.adjust(); + }); + + }); + } + }; + }]) + + .directive('webixShow', [ "$parse", function($parse) { + return { + restrict: 'A', + scope: false, + + link:function ($scope, $element, $attrs, $controller){ + var attr = $parse($attrs["webixShow"]); + var id = id_helper($element); + + if (!attr($scope)) + $element.attr("hidden", "true"); + + $scope.$watch($attrs["webixShow"], function(){ + var view = webix.$$(id); + if (view){ + if (attr($scope)){ + webix.$$(id).show(); + $element[0].removeAttribute("hidden"); + } else + webix.$$(id).hide(); + } + }); + + } + }; + }]) + + .directive('webixEvent', [ "$parse", function($parse) { + var wrap_helper = function($scope, view, eventobj){ + var ev = eventobj.split("="); + var action = $parse(ev[1]); + var name = ev[0].trim(); + view.attachEvent(name, function(){ + return action($scope, { id:arguments[0], details:arguments }); + }); + }; + + return { + restrict: 'A', + scope: false, + + link:function ($scope, $element, $attrs, $controller){ + var events = $attrs["webixEvent"].split(";"); + var id = id_helper($element); + + setTimeout(function(){ + var first = $element[0].firstChild; + if (first && first.nodeType == 1) + id = first.getAttribute("view_id") || id; + + var view = webix.$$(id); + for (var i = 0; i < events.length; i++) { + wrap_helper($scope, view, events[i]); + } + }); + + } + }; + }]) + + .directive('webixElements', [ "$parse", function($parse) { + return { + restrict: 'A', + scope: false, + + link:function ($scope, $element, $attrs, $controller){ + + var data = $attrs["webixElements"]; + var id = id_helper($element); + + if ($scope.$watchCollection) + $scope.$watchCollection(data, function(collection){ + setTimeout(function(){ + var view = webix.$$(id); + if (view){ + view.define("elements", collection); + view.refresh(); + } + },1); + }); + } + + }; + }]) + + .directive('webixData', [ "$parse", function($parse) { + return { + restrict: 'A', + scope: false, + + link:function ($scope, $element, $attrs, $controller){ + + var data = $attrs["webixData"]; + var id = id_helper($element); + + if ($scope.$watchCollection) + $scope.$watchCollection(data, function(collection){ + if (collection){ + setTimeout(function(){ + var first = $element[0].firstChild; + if (first && first.nodeType == 1) + id = first.getAttribute("view_id") || id; + + var view = webix.$$(id); + if (view){ + if (view.options_setter){ + view.define("options", collection); + view.refresh(); + }else{ + if (view.clearAll) + view.clearAll(); + view.parse(collection); + } + } + },1); + } + }); + } + + }; + }]); +})(); +if (window.Backbone) +(function(){ + + var cfg = { + use_id : false + }; + + function _start_ext_load(cal){ + cal._backbone_loading = true; + cal.callEvent("onBeforeLoad", []); + cal.blockEvent(); + } + function _finish_ext_load(cal){ + cal.unblockEvent(); + cal._backbone_loading = false; + cal.refresh(); + } + +webix.attachEvent("onUnSyncUnknown", function(wData, bData){ + var whandlers = wData._sync_events; + var handlers = wData._sync_backbone_events; + + for (var i = 0; i < whandlers.length; i++) + wData.detachEvent(whandlers[i]); + + for (var i = 0; i < handlers.length; i++) + bData.off.apply(bData, handlers[i]); +}); + +webix.attachEvent("onSyncUnknown", function(wData, bData, config){ + if (config) cfg = config; + if (cfg.get && typeof cfg.get == "string") + cfg.get = cfg.get.split(","); + + //remove private properties + function sanitize(ev){ + if (cfg.use_id) + return ev; + + var obj = {}; + for (var key in ev) + if (key != "id") + obj[key] = ev[key]; + + return obj; + } + + function _get_id(model){ + return cfg.use_id ? model.id : model.cid; + } + + function datareset(wData, bData){ + var data = []; + bData.each(function(model){ + var cid = _get_id(model); + var ev = copymodel(model); + ev.id = cid; + data.push(ev); + }); + wData.clearAll(); + wData._parse(data); + } + + function copymodel(model){ + if (cfg.get){ + var data = {}; + for (var i = 0; i < cfg.get.length; i++){ + var key = cfg.get[i]; + data[key] = model.get(key); + } + return data; + } + return model.toJSON(); + } + + var handlers = [ + ["change", function(model, info){ + var cid = _get_id(model); + var ev = wData.pull[cid] = copymodel(model); + ev.id = cid; + + if (wData._scheme_update) + wData._scheme_update(ev); + wData.refresh(ev.id); + }], + ["remove", function(model, changes){ + var cid = _get_id(model); + if (wData.pull[cid]) + wData.remove(cid); + }], + ["add", function(model, changes){ + var cid = _get_id(model); + if (!wData.pull[cid]){ + var ev = copymodel(model); + ev.id = cid; + if (wData._scheme_init) + wData._scheme_init(ev); + wData.add(ev); + } + }], + ["reset", function(model, changes){ + datareset(wData, bData); + }], + ["request", function(obj){ + if (obj instanceof Backbone.Collection) + _start_ext_load(wData); + }], + ["sync", function(obj){ + if (obj instanceof Backbone.Collection) + _finish_ext_load(wData); + }], + ["error", function(obj){ + if (obj instanceof Backbone.Collection) + _finish_ext_load(wData); + }] + ]; + + for (var i = 0; i < handlers.length; i++) + bData.bind.apply(bData, handlers[i]); + + + var whandlers = [ + wData.attachEvent("onAfterAdd", function(id){ + if (!bData.get(id)){ + var data = sanitize(wData.getItem(id)); + var model = new bData.model(data); + + var cid = _get_id(model); + if (cid != id) + this.changeId(id, cid); + + bData.add(model); + bData.trigger("webix:add", model); + } + return true; + }), + wData.attachEvent("onDataUpdate", function(id){ + var ev = bData.get(id); + var upd = sanitize(wData.getItem(id)); + + ev.set(upd); + bData.trigger("webix:change", ev); + + return true; + }), + wData.attachEvent("onAfterDelete", function(id){ + var model = bData.get(id); + if (model){ + bData.trigger("webix:remove", model); + bData.remove(id); + } + return true; + }) + ]; + + wData._sync_source = bData; + wData._sync_events = whandlers; + wData._sync_backbone_events = handlers; + + if (bData.length || wData.count()){ + datareset(wData, bData); + } +}); + +window.WebixView = Backbone.View.extend({ + tagName:"div", + //startign from backbone 1.1, this.options is not saved automatically + initialize : function (options) { + this.options = options || {}; + }, + render:function(){ + if (this.beforeRender) this.beforeRender.apply(this, arguments); + + var config = this.config || this.options.config; + var el = this.el ? $(this.el)[0] : document.body; + //clear previous content if any + if (el && !el.config) el.innerHTML = ""; + this.root = webix.ui(webix.copy(config), el); + + if (this.afterRender) this.afterRender.apply(this, arguments); + return this; + }, + destroy:function(){ + if (this.root) this.root.destructor(); + }, + getRoot:function(){ + return this.root; + }, + getChild:function(id){ + webix.assert(this.root.$$, "You need to set isolate property for top view"); + return this.root.$$(id); + } +}); + +})(); + + + + + + +webix.ActiveContent = { + $init:function(config){ + if (config.activeContent){ + this.$ready.push(this._init_active_content_list); + + this._active_holders = {}; + this._active_holders_item = {}; + this._active_holders_values = {}; + this._active_references = {}; + + for (var key in config.activeContent){ + this[key] = this._bind_active_content(key); + if (config.activeContent[key].earlyInit){ + var temp = webix._parent_cell; webix._parent_cell = null; + this[key].call(this,{},this, config.activeContent); + webix._parent_cell=temp; + } + } + } + }, + _init_active_content_list:function(){ + webix.event(this.$view, "blur", function(ev){ + var el = webix.$$(ev); + if (el !== this && el.getValue && el.setValue){ + el.getNode(ev); + + var newvalue = el.getValue(); + if (newvalue != el._settings.value) + el.setValue(newvalue); + } + }, this, true); + + if (this.filter){ + for (var key in this._settings.activeContent){ + this.type[key] = this[key]; + this[key] = this._locate_active_content_by_id(key); + } + //really bad! + this.type.masterUI = this; + } + }, + _locate_active_content_by_id:function(key){ + return function(id){ + var button = this._active_references[key]; + var button_id = button._settings.id; + var html = this.getItemNode(id).getElementsByTagName("DIV"); + for (var i=0; i < html.length; i++) { + if (html[i].getAttribute("view_id") == button_id){ + button._viewobj = button._dataobj = html[i]; + break; + } + } + return button; + }; + }, + _get_active_node:function(el, key, master){ + return function(e){ + if (e){ + var trg=e.target||e.srcElement; + while (trg){ + if (trg.getAttribute && trg.getAttribute("view_id")){ + el._dataobj = el._viewobj = el.$view = trg; + if (master.locate){ + var id = master.locate(trg.parentNode); + var value = master._active_holders_values[key][id]; + el._settings.value = value; + el._settings.$masterId = id; + } + return trg; + } + trg = trg.parentNode; + } + } + return el._viewobj; + }; + }, + _set_new_active_value:function(key, master){ + return function(value){ + var data = master.data; + if (master.filter){ + var id = master.locate(this._viewobj.parentNode); + data = master.getItem(id); + //XMLSerializer - FF "feature" + this.refresh(); + master._active_holders_item[key][id]=this._viewobj.outerHTML||(new XMLSerializer().serializeToString(this._viewobj)); + master._active_holders_values[key][id] = value; + } + data[key] = value; + }; + }, + _bind_active_content:function(key){ + return function(obj, common, active){ + var object = common._active_holders?common:common.masterUI; + + if (!object._active_holders[key]){ + var d = document.createElement("DIV"); + + active = active || object._settings.activeContent; + var el = webix.ui(active[key], d); + d.firstChild.setAttribute("onclick", "event.processed = true; if (webix.env.isIE8) event.srcElement.w_view = '"+el._settings.id+"';"); + + el.getNode = object._get_active_node(el, key, object); + + el.attachEvent("onChange", object._set_new_active_value(key, object)); + + object._active_references[key] = el; + object._active_holders[key] = d.innerHTML; + object._active_holders_item[key] = {}; + object._active_holders_values[key] = {}; + } + if (object.filter && obj[key] != object._active_holders_values[key] && !webix.isUndefined(obj[key])){ + var el = object._active_references[key]; + el.blockEvent(); + //in IE we can lost content of active element during parent repainting + if (!el.$view.firstChild) el.refresh(); + el.setValue(obj[key]); + el.refresh(); + el.unblockEvent(); + + object._active_holders_values[key][obj.id] = obj[key]; + object._active_holders_item[key][obj.id] = el._viewobj.outerHTML||(new XMLSerializer().serializeToString(el._viewobj)); + } + + return object._active_holders_item[key][obj.id]||object._active_holders[key]; + }; + } +}; +webix.ProgressBar = { + $init:function(){ + if (webix.isUndefined(this._progress) && this.attachEvent){ + this.attachEvent("onBeforeLoad", this.showProgress); + this.attachEvent("onAfterLoad", this.hideProgress); + this._progress = null; + } + }, + showProgress:function(config){ + // { position: 0 - 1, delay: 2000ms by default, css : name of css class to use } + if (!this._progress){ + + config = webix.extend({ + position:0, + delay: 2000, + type:"icon", + icon:"refresh", + hide:false + }, (config||{}), true); + + var incss = (config.type == "icon") ? ("fa-"+config.icon+" fa-spin") : ""; + + + + this._progress = webix.html.create( + "DIV", + { "class":"webix_progress_"+config.type}, + "
      " + ); + this._viewobj.style.position = "relative"; + webix.html.insertBefore(this._progress, this._viewobj.firstChild, this._viewobj); + + if(!webix.Touch.$active){ + if(this.getScrollState){ + var scroll = this.getScrollState(); + if(this._viewobj.scrollWidth != this.$width){ + this._progress.style.left = scroll.x +"px"; + } + if(this._viewobj.scrollHeight != this.$height){ + if(config.type != "bottom"){ + this._progress.style.top = scroll.y +"px"; + } else { + this._progress.style.top = scroll.y + this.$height - this._progress.offsetHeight +"px"; + } + + } + } + } + + + this._progress_delay = 1; + } + + if (config && config.type != "icon") + webix.delay(function(){ + if (this._progress){ + var position = config.position || 1; + //check for css-transition support + if(this._progress.style[webix.env.transitionDuration] !== webix.undefined || !config.delay){ + this._progress.firstChild.style.width = position*100+"%"; + if (config.delay) + this._progress.firstChild.style[webix.env.transitionDuration] = config.delay+"ms"; + } else{ + //if animation is not supported fallback to timeouts [IE9] + var count = 0, + start = 0, + step = position/config.delay*30, + view = this; + + if(this._progressTimer){ + //reset the existing progress + window.clearInterval(this._progressTimer); + start = this._progress.firstChild.offsetWidth/this._progress.offsetWidth*100; + } + this._progressTimer = window.setInterval(function(){ + if(count*30 == config.delay){ + window.clearInterval(view._progressTimer); + } + else{ + view._progress.firstChild.style.width = start+count*step*position*100+"%"; + count++; + } + },30); + } + + if (config.hide) + webix.delay(this.hideProgress, this, [1], config.delay); + + } + this._progress_delay = 0; + }, this); + + }, + hideProgress:function(now){ + if (this._progress_delay) + now = true; + + if (this._progress){ + if (now){ + if(this._progressTimer) + window.clearInterval(this._progressTimer); + webix.html.remove(this._progress); + this._progress = null; + } else { + this.showProgress({ position:1.1, delay:300 , hide:true }); + } + } + } +}; + +/* + UI:Video +*/ + +webix.protoUI({ + name:"video", + $init:function(config){ + if (!config.id) config.id = webix.uid(); + this.$ready.push(this._init_video); + }, + _init_video:function(){ + var c = this._settings; + this._contentobj = webix.html.create("video",{ + "class":"webix_view_video", + "style":"width:100%;height:100%;", + "autobuffer":"autobuffer" + },""); + if(c.poster) + this._contentobj.poster=c.poster; + + if(c.src){ + if(typeof c.src!= "object") + c.src = [c.src]; + for(var i = 0; i < c.src.length;i++) + this._contentobj.innerHTML += ' '; + } + /*if(this._contentobj.addEventListener) + this._contentobj.addEventListener('click', function(videoNode) { + return function() { + videoNode.play(); + }; + }(this._contentobj),false); */ + + if(c.controls) + this._contentobj.controls=true; + if(c.autoplay) + this._contentobj.autoplay=true; + this._viewobj.appendChild(this._contentobj); + }, + getVideo:function(){ + return this._contentobj; + }, + defaults:{ + src:"", + controls: true + } +}, webix.ui.view); diff --git a/static/webix/license.txt b/static/webix/license.txt new file mode 100644 index 0000000..20d40b6 --- /dev/null +++ b/static/webix/license.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/static/webix/readme.txt b/static/webix/readme.txt new file mode 100644 index 0000000..fa28ea9 --- /dev/null +++ b/static/webix/readme.txt @@ -0,0 +1,17 @@ +Webix UI v.2.4.5 +============== + +http://webix.com + +If you don't know where to start - check + +- http://webix.com/quick-start/#!/1 +- http://docs.webix.com/desktop__getting_started.html + + +### Commercial license and Support + +You can buy commercial license and support subscription at http://webix.com + + +(c) XB Software Ltd. 2014 \ No newline at end of file diff --git a/static/webix/whatsnew.txt b/static/webix/whatsnew.txt new file mode 100644 index 0000000..2fda148 --- /dev/null +++ b/static/webix/whatsnew.txt @@ -0,0 +1,389 @@ +Version 2.4.4 +============== + +### Fixes + +- workaround for rendering regressions in Google Chrome +- aminations in datatable +- avoiding errors when refresh() is called before render() +- bottomPadding and invalid message; textarea sizing +- incorrect checkbox state after double-click +- deleting items in filtered state in tree or treetable +- display native context menu on a page with webix context menu +- flash upload and compiled webix.js +- regression in restoring of scroll state in datatable +- repainting changes in the hidden view +- styling of disabled buttons +- text selection during using a custom scrolls + + +Version 2.4 +============== + +### Major new features + +- Portlet widget +- MultiCombo widget +- Range Slider widget +- Advanced validation messages for forms + +[Full list of changes and fixes](http://docs.webix.com/desktop__whats_new_2_4.html) + + +Version 2.3 +============ + +### Major new features + +- new material skin +- barcode widget +- organogram (organization chart) widget +- badges and icons for list, buttons and menus (and views based on them) +- "Today" and "Clear" buttons are added to the date editor. +- better default styling, ability to customize layout configuration + +[Full list of changes and fixes](http://docs.webix.com/desktop__whats_new_2_3.html) + + +Version 2.2 +================ + +### Major features +- Data binding for Tree, TreeTable and TreeCollection +- Optional Today and Clear buttons in the Calendar +- Ability to define file types for file uploader +- Webix.ajax api can be used to fetch binary data ( file downloading by ajax ) +- Optional hover for rows in datatable +- Improved scrolling on touch devices + + +[Full list of changes and fixes](http://docs.webix.com/desktop__whats_new_2_2.html) + + +Version 2.1 +================ + +### Major features +- Better compatibility with Bootstrap and jQuery +- Icon font contains 479 icons now ( Font Awesome updated to 4.2 ) +- "strict" mode for Webix +- Datatable and treetable math can be extended with custom functions +- Uploader can work in Internet Explorer 8 + +[Full list of changes and fixes](http://docs.webix.com/desktop__whats_new_2_1.html) + + +Version 2.0 +================ + +### Major features +- Promises API for all ajax operations +- Progress bars and overlays +- Icons and close button in tabbar +- Improved keyboard navigation +- Extra locales added +- Package includes source map files +- [pro] PRO edition includes Pivot component +- [pro] Multiselect and multitext inputs +- [pro] Advanced editors for DataTable and Property views +- [pro] Colspans and Rowspans in DataTable +- [pro] Column menu in DataTable +- [pro] Optional custom scrollbars +- [pro] Grouped columns in DataTable +- [pro] Advanced filters for DataTable + + +[Full list of changes and fixes](http://docs.webix.com/desktop__whats_new_2.html) + + +Version 1.10 +================ +### Major new features + +- IE12 compatibility +- Column Batches in the DataTable + +[Full list of changes and fixes](http://docs.webix.com/desktop__whats_new_1_10.html) + + +Version 1.9 +================ + +### Major new features + +- Hotkey for inputs +- HTML links in menu + + +[Full list of changes and fixes](http://docs.webix.com/desktop__whats_new_1_9.html) + + +Version 1.8 +================ + +###Responsive Layouts and Tabbar + +- Layout view can be hidden or moved if there's not enough space for them on the screen. [Check details](desktop/responsive_layout.md). +- Tabbar tabs can be moved to a related popup if there're not enoght space for them on the screen. [Check details](desktop/responsive_tabbar.md). + + +###Disabling dates in Calendar + +Calendar dates can be disabled to prevent their selection. [Check details](desktop/calendar.md#blockdates). + + +### Breaking changes + - webix.proxy.$callback was replaced with webix.ajax.$callback + - adjustHeaders deprecated + + +[Full list of changes and fixes](http://docs.webix.com/desktop__whats_new_1_8.html) + + + +Version 1.7 +============== + +### Breaking changes in API + +datatable.locate method returns object with "row" and "column" properties, in previous version result object has "row" and "col" properties respectfully. + + +### Default skin + +Default skin changed to flat ( you still can use the old skin by using skins/air.css ) +Compact skin changed to flat theme as well ( old one renamed to skins/aircompact.css ) + + +### Improvments in API +- text sorting mode for datatable +- autoheight property for "property" view +- ability to edit math formulas in the datatable +- "touch" mode for multiselect + + +[Full list of changes and fixes](http://docs.webix.com/desktop__whats_new_1_7.html) + + + +Version 1.6 +============== + +### Breaking changes in DataProcessor + +Parameters of onBeforeSync, onAfterSync was changed +onError event replaced with two new events - onBeforeSaveError and onAfterSaveError + + +### Improved support for mobile devices +- win8 touch support +- drag-n-drop on touch devices + + +### Improvments in Server side integrations +- full support of REST API +- data in components can be updated from server side +- client side code can't be broken by server side errors anymore +- ability to set custom headers for server side calls + +### UI components +- better memory cleaning after component destruction +- improved API for complex forms + + +[Full list of changes and fixes](http://docs.webix.com/desktop__whats_new_1_6.html) + + + +Version 1.5 +----------- + +### Improved support for mobile devices +- new skin for mobile UI +- functionality of desktop UI adapted to touch events and gestures + +### Improvments in DataTable +- adjustRowHeight method added to datatable +- fillspace can be used for multiple columsn +- richselect can be used as editor in the datatable +- checkboxes can have checkValue and uncheckValue options + +### Improvments in Angular and Backbone + +- [angular] webix-ui is compatible with ng-repeat +- [angular] webix-data works for options in combo and select +- [angular] init through angular directive links event handlers to the current scope + +- [backbone] handling of reset event +- [backbone] handling of models with getters +- [backbone] WebixView is compatible with backbone 1.1 +- [backbone] using sync with already loaded collection + + +[Full list of changes and fixes](http://docs.webix.com/desktop__whats_new_1_5.html) + + + +Version 1.4 +----------- + +### Advanced data selection controls + +- mutli-column select box +- rich content select box + +### New Server Integrations + +- loading and saving data through websockets +- loading and saving data through indexedDB + +### Improvements in Window Positioning + +- window can have complex relation size and position (details) +- window can be shown in fullscreen mode + +### Others + +- autoConfig option for the datatable +- dataprocessor tracks data moving events +- keyboard navigation for list component +- correct sizing of layout with hidden pannels +- elementsConfig supported for nested collections +- getSelection deprecated in favor of getSelectionId +- better styling for icon buttons +- webix.onReady event +- webix.ui.zindexBase property added +- different small fixes in UX and styling + + +Version 1.3 +----------- +### New skins +- 6 new skins added + +### Others +- video player component (ui.video) added +- API and look of carousel control improved +- charts can use logarithmic scale +- small fixes + + +Version 1.2 +----------- + +### Integration with AngularJS +- webix-ui directive to define webix views directly in HTML +- webix-show, webix-event, webix-data directives to link webix components and scope +- webix component can be used with angular data bindings + +### Integration with Backbone + +- webix components can load data from Backbone Collections +- webix components can save data back to Backbone Collections +- WebixView, that can be used as normal Backbone View +- Backbone Router can be used to alter Webix Layouts + +### Others +- *setContent* method for template component +- *isolate* configuration property for layout components +- *onBeforeDropOut* event added +- more than 50 different fixes + + +Version 1.1 +------------ + +### Server side integration +- all components can save data through REST API +- offline and caching loading strategies +- custom data saving and data loading transports + +### UI improvments + +- "disabled" configuration options for all views ( including all form controls ) +- webix.history can be used with multiview control +- per-submenu configuration is possible ( "config" property of menu item ) +- improved visual filtering in treetable and tree + +### API +- onViewResize event added +- "disabled" option added for all views +- ability to define XSS safe templates + +### Fixes + +- popup's visibility on iOS +- incorrect sizing of multiview and accordion +- incorrect behavior of drag-n-drop in datatable +- setValue doesn't work for radio buttons + + + +Version 1.0.2 +-------------- + +### New functionality + +- getText method for datatable +- lineMaxLimit parameter that cuts a line in "non-item" position +- ui.fullScreen solution for FF +- default size of resizer changed +- xml parse can recognize arrays +- addView adds to the end of layout if index was not defined +- skin updates, important flags removed where possible +- csrf key now sent through http headers + +### Fixes + +- IE ignores hotkeys +- IE8 doesn't generated dblClick events +- IE8 sets invalid value after changing cell value with select editor +- minWidth and maxWidth settings from xml +- loading tree-like data from XML +- datatable do not allow to define order of columns during export to pdf and excel +- incorrect remove action for local and session storage +- regression in layout rendering when views are added through addView +- dataprocessor and id change during binding +- label align in segmented button +- incorrect in-layout positions after showBatch call +- invalid animations in FF and Chrome + + + +Version 1.0.1 +-------------- + +### New functionality + +- layouts are correctly shown when they are zoomed by a browser +- selectFilter can show data from the attached collections +- better strategy for x-layout rendering +- API calls against hidden items in menu +- init from html|xml markup improved +- dataprocessor can have different urls for different action +- value attribute for tabview +- getTopParentView method added for all views +- getPopup method added to the datepicker +- setHTML method added to the label +- setValue and getValue methods added to the multiview + + +### Fixes + +- invalid size and focus of popup editors +- toggle button ignores inputWidth settings +- regression in treetable checkbox behavior +- regression in datatable markup parsing +- conflict between data and content properties of template +- row markers are not removed during clearAll +- mulitiview with no animation +- chart rendering in multiview (no animation case) +- label position in pie chart +- validation and htmlform control +- incorrect column autosizing in case of hidden container +- native selection during cell resize +- hideItem throws an error for menu's item which was already hidden +- incorrect handling of custom popups in editors +- sizing of scrollview was broken +- window ignores y parameter of show command +- dnd in tree as child diff --git a/templates/animate-exit.js b/templates/animate-exit.js new file mode 100644 index 0000000..db35d83 --- /dev/null +++ b/templates/animate-exit.js @@ -0,0 +1 @@ +$("#content").animate( {'width':'hide', opacity:0 }, 500, "swing", function() { diff --git a/templates/basic_questions.html b/templates/basic_questions.html new file mode 100644 index 0000000..58dd013 --- /dev/null +++ b/templates/basic_questions.html @@ -0,0 +1,50 @@ +{% import 'customize.html' as c %} + +{% extends "webix.html" %} +{% block title %}{{c.basic_questions_header}} - Step 3 of 6{% endblock %} +{% block head %} + {{ super() }} +{% endblock %} +{% block webixcode %} + + { template: "

      {{c.basic_questions_header|safe}}:

      {{c.basic_questions_text|safe}}
      ", autoheight:true}, + + {% include 'render_question_form.html' %} + + ], + +}); + +// Replace the logo with a stop watch +{% include 'topleft_stopwatch.html' %} + +function next_button() { + // First clear any red highlighting for all questions + {% for question in questions %} + webix.html.removeCss( $$("{{question.id}}").getNode(), "redhighlight"); + {% endfor %} + + // Get a list of incorrectly answered questions + webix.ajax().post("basic_questions_check", $$('questions').getValues(), function(text){ + incorrect_questions = JSON.parse(text)['incorrect_questions']; + + if (incorrect_questions.length == 0){ + // All questions correct, go to the next stage + // Pass the answers again for server side verification + answers_obj = $$('questions').getValues(); + answers_obj.time_away = total_time_away; + {% include "animate-exit.js" %} + webix.send('basic_questions_check_animation', answers_obj); + }); + } else { + // Otherwise give a message and highlight incorrect questions + webix.message({type:"error", text:"Some questions were answered incorrectly"}); + + for (var i=0; i < incorrect_questions.length; i++){ + webix.html.addCss( $$(incorrect_questions[i]).getNode(), "redhighlight"); + }; + }; + }); +}; + +{% endblock %} diff --git a/templates/basic_questions_check_animation.html b/templates/basic_questions_check_animation.html new file mode 100644 index 0000000..3222eb3 --- /dev/null +++ b/templates/basic_questions_check_animation.html @@ -0,0 +1,27 @@ + + + All answers correct + + + +
      + + + + +
      + OK +
      +
      + + + diff --git a/templates/customize.html b/templates/customize.html new file mode 100644 index 0000000..9c1bb40 --- /dev/null +++ b/templates/customize.html @@ -0,0 +1,40 @@ + +{% set left_logo_url = "http://your-domain-here.com" %} +{% set left_logo_image = "logo.png" %} # in /static +{% set left_logo_text = "Upload Sievee" %} + + +{% set right_logo_url = "https://www.python.org" %} +{% set right_logo_image = "logo-right.png" %} # in /static +{% set right_logo_text = "Python powered" %} + + +{% set intro_line_1 = "This is a demo of Upload Sievee (pronounced Upload CV). You can pretend to be applying for this position." %} +{% set intro_line_2 = "To continue with the application, fill in the following details and click on Next.

      " %} + + +{% set information_text = "This application is divided into three main sections.\ +
        \ +
      • Compulsory questions (timed)
      • \ +
      • Optional questions (timed)
      • \ +
      • Optional questions (not-timed)
      • \ +
      \ + You can use this area to explain to the candidate about these sections and the sort of questions that would be asked.

      \ + To start answering the compulsory questions, click on Next.



      " %} + + +{% set basic_questions_header = "Compulsory questions" %} +{% set basic_questions_text = "These are basic questions you need to answer in order to be able to submit your CV. Try answering some questions incorrectly and see what happens. Incorrect questions would also affect the report at the end." %} + + +{% set extra_questions_header = "Optional timed questions" %} +{% set extra_questions_text = "These are extra questions that do not have fixed answers. Useful for open-ended technical questions that need to be timed." %} + + +{% set last_questions_header = "Optional untimed questions" %} +{% set last_questions_text = "These questions are not timed. Good chance to ask about the candidate and why they want to apply for this job." %} + + +{% set cv_upload_text = "Thank the candidate for going in so far. They will upload their CV here; you can upload a small garbage file." %} + +{% set finished_text = "The application went through successfully. You would normally get an email with attachments containing whatever they uploaded, along with a report of how they answered the questions.

      See the bottom of this page for a sample report." %} diff --git a/templates/cv_upload.html b/templates/cv_upload.html new file mode 100644 index 0000000..2bfac77 --- /dev/null +++ b/templates/cv_upload.html @@ -0,0 +1,82 @@ +{% import 'customize.html' as c %} + +{% extends "webix.html" %} +{% block title %}CV Upload - Step 6 of 6{% endblock %} +{% block head %} + {{ super() }} +{% endblock %} +{% block webixcode %} + + { template: "{{c.cv_upload_text|safe}}


      ", autoheight:true}, + { template: '
      ' } + ], + +}); + +webix.type(webix.ui.list, { + name:"uploaderList", + template:function(f,type){ + var html = "
      "+f.name+"
      "; + html += "
      "; + html += "
      "; + html += "
      "; + html += "
      "+type.status(f)+"
      "; + html += "
      "; + html += "
      "+ f.sizetext+"
      "; + return html; + }, + status:function(f){ + var messages = { + server: "Done", + error: "Error", + client: "Ready", + transfer: f.percent+"%" + }; + return messages[f.status] + }, + on_click:{ + "remove_file":function(ev, id){ + $$(this.config.uploader).files.remove(id); + } + }, + height: 35 +}); + + + +webix.ui({ + container:"uploader_container", + padding: 5, + view: "form", type: "line", width:500, rows: [ + { view: "uploader", id:"upl1", height:37, align:"center", type:"iconButton", icon:"plus-circle", label:"Add files" ,autosend:false, link:"mylist", upload:"{{ url_for('cv_upload') }}"}, + { + borderless: true, + view:"list", id:"mylist", type:"uploaderList", + autoheight:true, minHeight: 50 + }, + { + view:"button", disabled:true, id:"uploadButton", width:190, label: "Upload and continue", type:"iconButton", icon: "upload", click: "uploadFiles()", align: "right" + }, + + ] +}); + +$$("upl1").attachEvent("onAfterFileAdd", function() { + $$('uploadButton').enable(); +}); + + +$$("upl1").attachEvent("onUploadComplete", function() { + {% include "animate-exit.js" %} + location.href = '{{ url_for("finished") }}'; + }); + +}); + + +function uploadFiles(){ + $$("upl1").send(); +} + + +{% endblock %} diff --git a/templates/extra_questions.html b/templates/extra_questions.html new file mode 100644 index 0000000..096703f --- /dev/null +++ b/templates/extra_questions.html @@ -0,0 +1,28 @@ +{% import 'customize.html' as c %} + +{% extends "webix.html" %} +{% block title %}{{c.extra_questions_header|safe}} - Step 4 of 6{% endblock %} +{% block head %} + {{ super() }} +{% endblock %} +{% block webixcode %} + { template: "

      {{c.extra_questions_header|safe}}:

      {{c.extra_questions_text|safe}}
      ", autoheight:true}, + + {% include 'render_question_form.html' %} + + ], + +}); + +// Replace the logo with a stop watch +{% include 'topleft_stopwatch.html' %} + +function next_button() { + answers_obj = $$('questions').getValues(); + answers_obj.time_away = total_time_away; + {% include "animate-exit.js" %} + webix.send('extra_questions', answers_obj); + }); +}; + +{% endblock %} diff --git a/templates/finished.html b/templates/finished.html new file mode 100644 index 0000000..a5e88bf --- /dev/null +++ b/templates/finished.html @@ -0,0 +1,24 @@ +{% import 'customize.html' as c %} + +{% extends "webix.html" %} +{% block title %}Completed{% endblock %} +{% block head %} + {{ super() }} +{% endblock %} +{% block webixcode %} + { template: 'Success

      \ + {{c.finished_text|safe}}', height:500, + }, + ], +}); + +{% endblock %} + +{% block endbody %} +{% if demo_mode %} +Here is the report you would be emailed if this wasn't running in demo-mode: +
      +{{report}}
      +
      +{% endif %} +{% endblock %} diff --git a/templates/information.html b/templates/information.html new file mode 100644 index 0000000..5375180 --- /dev/null +++ b/templates/information.html @@ -0,0 +1,22 @@ +{% import 'customize.html' as c %} + +{% extends "webix.html" %} +{% block title %}Upload your CV - Step 2 of 6{% endblock %} +{% block head %} + {{ super() }} +{% endblock %} +{% block webixcode %} + { template: "
      {{c.information_text|safe}}", autoheight:true, }, + + { view:"button", value:"Next", label:"Next", type:"next", width:100, align:"right", click:"next_button()" }, + ], + +}); + +function next_button() { + {% include "animate-exit.js" %} + window.location.replace("{{ url_for("basic_questions") }}"); + }); +}; + +{% endblock %} diff --git a/templates/intro.html b/templates/intro.html new file mode 100644 index 0000000..c5e5b00 --- /dev/null +++ b/templates/intro.html @@ -0,0 +1,36 @@ +{% import 'customize.html' as c %} + +{% extends "webix.html" %} +{% block title %}Upload your CV - Step 1 of 6{% endblock %} +{% block head %} + {{ super() }} +{% endblock %} +{% block webixcode %} + { template: "{{c.intro_line_1|safe}}", autoheight:true}, + + { template: "{{c.intro_line_2|safe}}", autoheight:true }, + + + { view:"form", id:"candidateinfo", width:300, elements: [ + { view:"search", name:"name", icon:"user", placeholder:"Full name", width:250, align:"center", validate:webix.rules.isNotEmpty }, + { view:"search", name:"email", icon:"envelope", placeholder:"Email address", width:250, align:"center", validate:webix.rules.isEmail }, + { view:"search", name:"phone", icon:"phone", placeholder:"Phone number", width:250, align:"center", validate:webix.rules.isNotEmpty }, + { view:"button", value:"Next", label:"Next", width:100, align:"right", type:"next", click:"next_button()" }, + ]}, + + + ], + +}); + +function next_button() { + if ( $$('candidateinfo').validate() ) { + {% include "animate-exit.js" %} + webix.send('information', $$('candidateinfo').getValues()) + + }); + } + +}; + +{% endblock %} diff --git a/templates/nontech_questions.html b/templates/nontech_questions.html new file mode 100644 index 0000000..4d4d82c --- /dev/null +++ b/templates/nontech_questions.html @@ -0,0 +1,24 @@ +{% import 'customize.html' as c %} + +{% extends "webix.html" %} +{% block title %}{{c.last_questions_header|safe}} - Step 5 of 6{% endblock %} +{% block head %} + {{ super() }} +{% endblock %} +{% block webixcode %} + + { template: "

      {{c.last_questions_header|safe}}:

      {{c.last_questions_text|safe}}", autoheight:true}, + + {% include 'render_question_form.html' %} + + ], + +}); + +function next_button() { + {% include "animate-exit.js" %} + webix.send('nontech_questions', $$('questions').getValues()); + }); +}; + +{% endblock %} diff --git a/templates/not_first_step.html b/templates/not_first_step.html new file mode 100644 index 0000000..37a865f --- /dev/null +++ b/templates/not_first_step.html @@ -0,0 +1,3 @@ + +You need to start from the first step + diff --git a/templates/render_question_form.html b/templates/render_question_form.html new file mode 100644 index 0000000..69f061e --- /dev/null +++ b/templates/render_question_form.html @@ -0,0 +1,25 @@ + { view:"form", id:"questions", elements: [ + {% for question in questions %} + { view:"label", id:"{{question.id}}", label:"
      {{ question.question|safe }}
      ", }, + {% if question.type == "radio" %} + { view:"radio", name:"{{question.id}}", vertical:true, options:[ + {% for option in question.options %} + { value: "{{option}}", id:"{{option}}" }, + {% endfor %} + ]}, + {% endif %} + + {% if question.type == "line" %} + { view:"text", name:"{{question.id}}", value:"{{question.hint}}", width:{{question.width or 300}} }, + {% endif %} + + {% if question.type == "multiline" %} + { view:"textarea", name:"{{question.id}}", value:"{{question.hint}}", height:{{question.height or 100}}, width:{{question.width or 400}} }, + {% endif %} + + { view:"label", label:"
      " }, + {% endfor %} + + { view:"button", value:"next", label:"Next", type:"next", width:100, align:"right", click:"next_button()" }, + ]}, + diff --git a/templates/topleft_stopwatch.html b/templates/topleft_stopwatch.html new file mode 100644 index 0000000..685a628 --- /dev/null +++ b/templates/topleft_stopwatch.html @@ -0,0 +1,23 @@ +stopwatch_html = '
      0 1 2 3 4 5 6 7 8 9
      0 1 2 3 4 5 6 7 8 9
      :
      0 1 2 3 4 5 6
      0 1 2 3 4 5 6 7 8 9
      :
      0 1 2 3 4 5 6
      0 1 2 3 4 5 6 7 8 9
      :
      0 1 2 3 4 5 6 7 8 9
      0 1 2 3 4 5 6 7 8 9
      ' + +$$('topleft').setHTML(stopwatch_html); + + +// Also record the time spent away from the page + +var time_away = 0 +var time_back = 0 +var total_time_away = 0 +// Away: +$(window).blur(function(){ + time_away = new Date().getTime(); +}); + +// Back: +$(window).focus(function(){ + if (time_away != 0) { + time_back = new Date().getTime(); + total_time_away += (time_back - time_away) / 1000; + }; +}); + diff --git a/templates/webix.html b/templates/webix.html new file mode 100644 index 0000000..96e685b --- /dev/null +++ b/templates/webix.html @@ -0,0 +1,50 @@ +{% import 'customize.html' as c %} + + + + + {% block head %} + {% block title %}{% endblock %} + + + + + + + {% endblock %} + + +
      + + {% block endbody%}{% endblock %} + + diff --git a/upload_sievee.py b/upload_sievee.py new file mode 100755 index 0000000..e99caa2 --- /dev/null +++ b/upload_sievee.py @@ -0,0 +1,413 @@ +#!/usr/bin/env python +# Upload Sievee +# by RizviR + +# (note that Webix (the JS library used) is GPLv3) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + + +from flask import Flask, render_template, request, url_for, g, json, jsonify, redirect, session +import yaml +import json +import sqlalchemy +import datetime +import os +from random import randint +from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, select, and_, or_ +from werkzeug import secure_filename +from mailer import Mailer, Message +import re + +app = Flask(__name__) + +app.config.from_pyfile('settings.cfg') +app.secret_key = app.config['SECRET_KEY'] + +@app.before_request +def before_request(): + g.questions = yaml.load(open('questions.yaml', 'r')) + + g.engine = create_engine('mysql://{user}:{password}@{ip}/{db}'.format(user=app.config['SQL_USER'], + password=app.config['SQL_PASSWORD'], ip=app.config['SQL_IP'], db=app.config['SQL_DB'])) + meta = MetaData() + g.candidates = Table('candidates', meta, autoload=True, autoload_with=g.engine) + g.conn = g.engine.connect() + + +@app.route("/") +def intro_page(): + # We don't support mobile yet + # Taken from http://detectmobilebrowsers.com/ + reg_b = re.compile(r"(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino", re.I|re.M) + reg_v = re.compile(r"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-", re.I|re.M) + + user_agent = request.headers.get('User-Agent',None) + if user_agent: + b = reg_b.search(user_agent) + v = reg_v.search(user_agent[0:4]) + if b or v: + return " Please apply for this position on a laptop or a desktop, because it involves writing answers and uploading your CV that may be difficult on a mobile.

      Visit this site again on a desktop/laptop.
      " + + return render_template('intro.html', allowback=1) + +@app.route("/not_first_step") +def not_first_step(): + return render_template('not_first_step.html') + +@app.route("/information", methods=['GET', 'POST']) +def information(): + if request.method != "POST": + return render_template('not_first_step.html') + # Get all the candidate details and save it in the session + candidate_name = request.form['name'] + candidate_email = request.form['email'] + candidate_phone = request.form['phone'] + + session['name'] = candidate_name + session['email'] = candidate_email + session['phone'] = candidate_phone + ipaddress = request.remote_addr + useragent = request.headers.get('User-Agent') + + # Insert into DB + result = g.conn.execute ( g.candidates.insert().values(name=candidate_name, + email=candidate_email, phone=candidate_phone, ip=ipaddress, + useragent=useragent, entry_date=datetime.datetime.now()) ) + candidate_id = result.inserted_primary_key[0] + session['id'] = candidate_id + + # Create the ID dir in the repo directory + path = app.config['REPO_DIR'] + '/' + str(candidate_id) + if not os.path.exists(path): + os.makedirs(path) + + return render_template('information.html') + +def get_question(questionID, section): + for question in g.questions[section]: + if question['id'] == questionID: + return question['question'] + return "" + +def is_answer_correct(questionID, answer): + # Look for the question ID in the questions YAML + for question in g.questions['basic-questions']: + if question['id'] == questionID: + if question['answer'] == answer.strip(): + return True + # Answer is not correct + # Record the incorrect attempts in a text file + path = "{0}/{1}/basic_questions.txt".format(app.config['REPO_DIR'], session['id']) + if not is_int(session['id']): + return "Unexpected ID" + with open(path, 'a') as basic_questions_file: + for question in g.questions['basic-questions']: + if question['id'] == questionID: + question_string = question['question'] + correct_answer = question['answer'] + basic_questions_file.write('Question: {0}\n'.format(question_string)) + basic_questions_file.write('Correct Answer: {0}\n'.format(correct_answer)) + basic_questions_file.write('Incorrect answer given: {0}\n'.format(answer.encode('ascii','ignore').decode('ascii'))) + basic_questions_file.write('\n') + return False + +# Expects something from a javascript POST like +# { question01: "the answer we got for question01", question02: "another answer" } +def get_incorrect_questions(answers): + incorrect_questions = [] + for questionID, value in answers.iteritems(): + if not is_answer_correct(questionID, value): + incorrect_questions.append(questionID); + return incorrect_questions + + +@app.route("/basic_questions", methods=['GET', 'POST']) +def basic_questions(): + if not 'id' in session: + return render_template('not_first_step.html') + + # We should have just come back from the information page + # Fill in some stuff + g.conn.execute( g.candidates.update().where(g.candidates.c.id == session['id']).values(read_intro=True)) + # Only set the start time if it isn't already there, otherwise it'd be overwritten in a refresh + existing_basic_questions_start = g.conn.execute( select([g.candidates]).where(g.candidates.c.id == session['id']) ).fetchone()['basic_questions_start'] + if not existing_basic_questions_start: + g.conn.execute( g.candidates.update().where(g.candidates.c.id == session['id']).values(basic_questions_start=datetime.datetime.now())) + + return render_template('basic_questions.html', questions=g.questions['basic-questions']) + +def is_int(s): + try: + int(s) + return True + except: + return False + +@app.route("/basic_questions_check", methods=['GET', 'POST']) +def basic_questions_check(): + if request.method != "POST": + return render_template('not_first_step.html') + if not 'id' in session: + return render_template('not_first_step.html') + # We're trusting the id value in creating the path + if not is_int(session['id']): + return "Unexpected ID" + incorrect_questions = get_incorrect_questions(request.form) + + # Increment the attempts in the DB + num_incorrect = len(incorrect_questions) + g.conn.execute( g.candidates.update().where(g.candidates.c.id == session['id']).values( basic_questions_incorrect=g.candidates.c.basic_questions_incorrect + num_incorrect )) + + + + return jsonify( { "incorrect_questions": incorrect_questions } ) + +@app.route("/basic_questions_check_animation", methods=['GET', 'POST']) +def basic_questions_check_animation(): + if request.method != "POST": + return "Invalid request" + if not 'id' in session: + return render_template('not_first_step.html') + + + # 'request.form' is a ImmutableMultiDict, so copy it to make it RW to remove the time + request_form = request.form.copy() + # Get the time_away given by the JS script + try: + time_away = str(request_form.pop("time_away", None)) + except: + time_away = 0 + + # Double check if all answers are correct + incorrect_questions = get_incorrect_questions(request_form) + if len(incorrect_questions) == 0: + # All answers correct. Store the info. + # The finish time of the basic quetions: + g.conn.execute( g.candidates.update().where(g.candidates.c.id == session['id']).values(basic_questions_end=datetime.datetime.now())) + # Calculate the total time spent on basic_questions + start_time = g.conn.execute( select([g.candidates]).where(g.candidates.c.id == session['id']) ).fetchone()['basic_questions_start'] + total_time_datetime = datetime.datetime.now() - start_time + total_time_seconds = total_time_datetime.total_seconds() + # Time spent away from the page + g.conn.execute( g.candidates.update().where(g.candidates.c.id == session['id']).values(basic_questions_timeaway=time_away)) + + # Now write the time taken to the basic_questions.txt file + path = "{0}/{1}/basic_questions.txt".format(app.config['REPO_DIR'], session['id']) + if not is_int(session['id']): + return "Unexpected ID" + with open(path, 'a') as basic_questions_file: + basic_questions_file.write('Total time taken: {0:.2f} seconds\n'.format(float(total_time_seconds))) + basic_questions_file.write('Total time spent away from page: {0:.2f} seconds\n'.format(float(time_away))) + + + return render_template('basic_questions_check_animation.html', randomnum=randint(1,999999)) + else: + return "Having fun fooling around?" + + +@app.route("/extra_questions", methods=['GET', 'POST']) +def extra_questions(): + if not 'id' in session: + return render_template('not_first_step.html') + request_form = request.form.copy() + if request.method == "POST": + # We got the answers. + # First pop the time_away variable + try: + time_away = str(request_form.pop("time_away", None)) + except: + time_away = 0 + + # Then save the time + g.conn.execute( g.candidates.update().where(g.candidates.c.id == session['id']).values(extra_questions_end=datetime.datetime.now())) + # Calculate total time + start_time = g.conn.execute( select([g.candidates]).where(g.candidates.c.id == session['id']) ).fetchone()['extra_questions_start'] + total_time_datetime = datetime.datetime.now() - start_time + total_time_seconds = total_time_datetime.total_seconds() + # Time spent away from the page + g.conn.execute( g.candidates.update().where(g.candidates.c.id == session['id']).values(extra_questions_timeaway=time_away)) + + # Save the questions into a text file + path = "{0}/{1}/extra_questions.txt".format(app.config['REPO_DIR'], session['id']) + if not is_int(session['id']): + return "Unexpected ID" + with open(path, 'a') as extra_questions_file: + for questionID, value in request_form.iteritems(): + extra_questions_file.write('Question: {0}\n'.format( get_question(questionID, 'extra-questions') ) ) + extra_questions_file.write('Answer: {0}\n'.format( value.encode('ascii','ignore').decode('ascii') ) ) + extra_questions_file.write('\n' ) + extra_questions_file.write('Total time taken: {0:.2f} seconds\n'.format(float(total_time_seconds))) + extra_questions_file.write('Total time spent away from page: {0:.2f} seconds\n'.format(float(time_away))) + + # Done, now redirect to nontech questions + return redirect( url_for('nontech_questions')) + + else: + # Record time + g.conn.execute( g.candidates.update().where(g.candidates.c.id == session['id']).values(extra_questions_start=datetime.datetime.now())) + return render_template('extra_questions.html', questions=g.questions['extra-questions']) + + +@app.route("/nontech_questions", methods=['GET', 'POST']) +def nontech_questions(): + if not 'id' in session: + return render_template('not_first_step.html') + if request.method == "POST": + # Save the questions into a text file + path = "{0}/{1}/nontech_questions.txt".format(app.config['REPO_DIR'], session['id']) + with open(path, 'a') as nontech_questions_file: + for questionID, value in request.form.iteritems(): + nontech_questions_file.write('Question: {0}\n'.format( get_question(questionID, 'nontech-questions') ) ) + nontech_questions_file.write('Answer: {0}\n'.format( value.encode('ascii','ignore').decode('ascii') ) ) + nontech_questions_file.write('\n' ) + + # Now redirect to CV upload page + return redirect( url_for('cv_upload')) + else: + return render_template('nontech_questions.html', questions=g.questions['nontech-questions']) + +@app.route("/cv_upload", methods=['GET', 'POST']) +def cv_upload(): + if not 'id' in session: + return render_template('not_first_step.html') + if request.method == "POST": + # Getting a file upload + path = "{0}/{1}/cv_upload".format(app.config['REPO_DIR'], session['id']) + # Check if this makes sense + if not os.path.realpath(path).startswith(app.config['REPO_DIR']): + return "403", 403 + if not is_int(session['id']): + return "Unexpected ID", 403 + if not os.path.exists(path): + os.makedirs(path) + f = request.files['upload'] + if not app.config['DEMO_MODE']: + f.save(path + "/" + secure_filename(f.filename)) + + # Record that everything is completed + g.conn.execute( g.candidates.update().where(g.candidates.c.id == session['id']).values(cv_uploaded=True)) + + return "{ status: 'server'}" + else: + return render_template('cv_upload.html') + +@app.route("/finished") +def finished(): + if not 'id' in session: + return render_template('not_first_step.html') + report = send_email(session['id']) + return render_template('finished.html', randomnum=randint(1,999999), report=report, demo_mode=app.config['DEMO_MODE']) + + +# Reads the repo filesystem and fetches the answers to a question +# 'filename' can be basic_questions.txt, extra_questions.txt, etc +def get_answers(ID, filename): + path = "{0}/{1}/{2}".format(app.config['REPO_DIR'], ID, filename) + try: + with open(path, 'r') as f: + return f.read() + except: + return "" + + +def send_email(ID): + # Construct email, this is a biggie + body = "" + this_candidate_info = dict( g.conn.execute( select([g.candidates]).where(g.candidates.c.id == ID) ).fetchone().items() ) + + # We have to figure out if this potential devil saw the questions before + # This isn't fool proof of course, but can catch most attempts where they + # see the questions, close the window, research the answers, and try again. + + # Get a list of IDs that match the candidates email address, phone number + # or (hesitated on this one) IP, and crucially those IDs in the DB that + # haven't completed the submission + this_candidate_email = this_candidate_info['email'] + this_candidate_phone = this_candidate_info['phone'] + this_candidate_ip = this_candidate_info['ip'] + subject = "[Candidate] {0}".format(this_candidate_email) + + possible_candidates = g.conn.execute( select(['*']).where( + and_( + g.candidates.c.cv_uploaded == False, + or_( + g.candidates.c.email == this_candidate_email, + g.candidates.c.phone == this_candidate_phone, + g.candidates.c.ip == this_candidate_ip, + ) + ) + )) + + attempts = [] + for candidate in possible_candidates: + attempts.append( dict(candidate.items()) ) + + attempts.append(this_candidate_info) + # At this points, attempts[] has all the candidates attempts + + multiple_attempts = True if len(attempts) > 1 else False + + body += "Candidate info:\n" + for attempt in attempts: + if multiple_attempts: + body += "--- Attempt ID {0} ---\n".format(attempt['id']) + body += "- Name: {0}\n".format(attempt['name']) + body += "- Email: {0}\n".format(attempt['email']) + body += "- Phone: {0}\n".format(attempt['phone']) + body += "- IP address: {0}\n".format(attempt['ip']) + body += "- Browser: {0}\n".format(attempt['useragent']) + body += "- Time: {0}\n".format(attempt['entry_date']) + body += "\n" + + + for code,title in [ ('basic_questions','Basic Questions'), ('extra_questions','Extra Questions'), ('nontech_questions', 'Nontech Questions') ]: + body += "_" * 60 + body += "\n" + body += "{0}:\n\n".format(title) + for attempt in attempts: + if multiple_attempts: + body += "--- Attempt ID {0} ---\n".format(attempt['id']) + if attempt.get('{0}_start'.format(code), None) and not attempt.get('{0}_end'.format(code), None): + body += "The candidate saw the questions without attempting any on {0}\n\n".format(attempt['basic_questions_start']) + continue + # Now copy the .txt for this ID blindly + body += get_answers(attempt['id'], '{0}.txt'.format(code)) + body += "\n" + + app.logger.debug(body) + + # Actually send the email: + if not app.config['DEMO_MODE']: + message = Message(From=app.config['MAIL_FROM'], To=app.config['MAIL_TO']) + message.Subject = subject + message.Body = body + # Get attachments, all files in the repo ID + path = "{0}/{1}/cv_upload".format(app.config['REPO_DIR'], this_candidate_info['id']) + for filename in os.listdir(path): + file_location = "{0}/{1}".format(path, filename) + message.attach(file_location) + app.logger.debug("Attaching {0}".format(file_location)) + sender = Mailer(app.config['MAIL_SERVER']) + sender.send(message) + return "" + else: + return body + + +if __name__ == "__main__": + app.debug = True + app.run(host="0.0.0.0") + diff --git a/upload_sievee.wsgi b/upload_sievee.wsgi new file mode 100755 index 0000000..200f251 --- /dev/null +++ b/upload_sievee.wsgi @@ -0,0 +1,4 @@ +import sys +sys.path.insert(0, '/the/location/of/this_dir') + +from upload_cv import app as application