/*js
//==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>
//
// CssHidex v1.16 [ Commercial Version ]
// Copyright (c) phpkobo.com ( http://www.phpkobo.com/ )
// Email : admin@phpkobo.com
// ID : HDXCS-116
// URL : http://www.phpkobo.com/csshidex
//
//==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<
*/
////////////////////////////////////////////////////////////////////
// $shorthands
function $(selector,el_ref){
return (el_ref?el_ref:document).querySelector(selector);
};
function $$(selector,el_ref){
return (el_ref?el_ref:document).querySelectorAll(selector);
};
function $id(id){
return document.getElementById(id);
};
function $ce(tagName){
return document.createElement(tagName);
};
////////////////////////////////////////////////////////////////////
// jQuery.offset
function jqOffset(el){
var rect=el.getBoundingClientRect();
var el_body=document.documentElement;
return {
x:rect.left+el_body.scrollLeft,
y:rect.top+el_body.scrollTop
};
};
////////////////////////////////////////////////////////////////////
// ajaxCall
function ajaxCall(url_server,requ,callback,auxproc,errproc){
const xhr=new XMLHttpRequest();
xhr.open("POST",url_server,true);
xhr.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded; charset=UTF-8");
xhr.addEventListener("load",function(){
if (xhr.status==200){
let str=xhr.responseText;
const sig="[!json!]";
const pos=str.indexOf(sig);
if(pos!=-1){
if(pos>0){
const pretext=str.substr(0,pos);
if(errproc){errproc("SBL",pretext);}
}
str=str.substr(pos+sig.length);
const resp=JSON.parse(str);
if (resp.result=="OK"){
if(callback){callback(resp);}
}else{
if(errproc){errproc("NOR",resp.result);}
}
}else{
if(errproc){errproc("SMS",str);}
}
}else{
let s="";
s+="status:"+xhr.status+"\n";
s+="statusText:"+xhr.statusText;
if(errproc){errproc("N2H",s);}
}
});
if(auxproc){auxproc(xhr);}
xhr.send("requ="+encodeURIComponent(JSON.stringify(requ)));
return xhr;
};
////////////////////////////////////////////////////////////////////
// protect a webpage form drag-and-drop
function preventFileDrop(){
document.addEventListener("dragover",function(e){
e.preventDefault();
});
document.addEventListener("drop",function(e){
e.preventDefault();
});
};
preventFileDrop();
////////////////////////////////////////////////////////////////////
// end events
function onEnd(el,callback,ename){
const func=function(e){
if(el==e.srcElement){
el.removeEventListener(ename,func);
if(callback){callback(e);}
}
};
el.addEventListener(ename,func);
};
function onTransitionEnd(el,callback){
onEnd(el,callback,"transitionend");
};
function onAnimationEnd(el,callback){
onEnd(el,callback,"animationend");
};
////////////////////////////////////////////////////////////////////
// createElementFromHTML
function createElementFromHTML(html){
const el=document.createElement("div");
el.innerHTML=html;
return el.firstElementChild;
}
////////////////////////////////////////////////////////////////////
// browser detection
function isSafari(){
return (window.safari!==undefined);
};
function isFireFox(){
return (navigator.userAgent.toLowerCase().indexOf('firefox')>-1);
};
function isIE(){
var ua=window.navigator.userAgent;
var msie=ua.indexOf("MSIE ");
// Trident/7.0; rv:11.0
return ((msie>0)||!!ua.match(/Trident.*rv\:11\./));
};
////////////////////////////////////////////////////////////////////
// send enter & space to click
function esToClick(el){
el.addEventListener("keydown",function(e){
if((e.key=="Enter")||(e.key==" ")){
e.preventDefault();
this.click();
}
});
return el;
};
"use strict";
function CUiControl(px){
var el_control=px.el_control;
function enable(){
el_control.classList.remove("uic-disable");
};
function disable(){
el_control.classList.add("uic-disable");
};
function init(){
enable();
};
init();
return {
enable:enable,
disable:disable
};
};
"use strict";
function CSvgBtnControl(px){
// elements
var el_control=px.el_control;
// parameters
var btntype=px.btntype?px.btntype:"check";
// function closures
var fcl=null;
// button data
var btndata={
"check":{
scale:20,
code:`
`},
"x":{
scale:25,
code:`
`},
"threedots":{
scale:20,
code:`
`},
"threelines":{
scale:20,
code:`
`},
"folder":{
scale:20,
code:`
`}
};
function setBtn(btntype){
el_control.innerHTML=btndata[btntype].code;
var el_svg=el_control.querySelector(".sbc-svg");
var scale=btndata[btntype].scale;
el_svg.style.top=el_svg.style.bottom=
el_svg.style.left=el_svg.style.right=scale+"%";
if(px.style){
for(var key in px.style){
el_control.style[key]=px.style[key];
}
}
};
function init(){
setBtn(btntype);
// events
var style_focus=true;
el_control.addEventListener("pointerdown",function(e){
style_focus=false;
});
el_control.addEventListener("click",function(e){
style_focus=true;
});
el_control.addEventListener("keydown",function(e){
if((e.key=="Enter")||(e.key==" ")){
e.preventDefault();
this.click();
}
});
el_control.addEventListener("focus",function(e){
if(style_focus){
el_control.classList.add("sbc-focus");
}
});
el_control.addEventListener("blur",function(e){
el_control.classList.remove("sbc-focus");
});
// call base class
fcl=CUiControl({
el_control:el_control
});
};
init();
return fcl;
};
"use strict";
////////////////////////////////////////////////////////////////////
// CFileViewControl
function CFileViewControl(px){
// elements
var el_control=px.el_control;
var el_fileboard=null;
function show(){
el_control.classList.remove("fvc-hide");
enable();
};
function hide(){
el_control.classList.add("fvc-hide");
disable();
};
function enable(){
el_control.classList.remove("fvc-disable");
};
function disable(){
el_control.classList.add("fvc-disable");
};
function setPicture(data){
el_fileboard.style["background-image"]="url("+data.dataurl+")";
};
function clearFile(){
el_fileboard.style["background-image"]="none";
// dispatch event
el_control.dispatchEvent(new Event("fileviewclear"));
};
function init(){
// build droparea
var el_checkboard=document.createElement("div");
el_checkboard.className="fvc-checkboard";
el_fileboard=document.createElement("div");
el_fileboard.className="fvc-fileboard";
var el_close=document.createElement("div");
el_close.className="fvc-close";
el_close.classList.add("sbc-control");
el_close.setAttribute("tabindex","0");
el_control.appendChild(el_checkboard);
el_control.appendChild(el_fileboard);
el_control.appendChild(el_close);
CSvgBtnControl({
el_control:el_close,
btntype:"x"
});
// events
el_close.addEventListener("click",function(e){
clearFile();
});
// call base class
CUiControl({
el_control:el_control
});
};
init();
return {
show:show,
hide:hide,
enable:enable,
disable:disable,
setPicture:setPicture
};
};
"use strict";
////////////////////////////////////////////////////////////////////
// CDropAreaControl
function CDropAreaControl(px){
// elements
var el_control=px.el_control;
var el_fileinput=null;
var el_select=null;
var el_message=null;
function show(){
el_control.classList.remove("dac-hide");
el_control.classList.remove("dac-dragover");
};
function hide(){
el_control.classList.add("dac-hide");
};
function enable(){
el_control.classList.remove("dac-disable");
};
function disable(){
el_control.classList.add("dac-disable");
};
function loadFile(file){
if(!file){return;}
el_control.dispatchEvent(new CustomEvent("dropareafile",{detail:file}));
};
function init(){
// build droparea
var el_message=document.createElement("div");
el_message.className="dac-message";
el_message.innerHTML="Drop Picture File Here";
el_fileinput=document.createElement("input");
el_fileinput.className="dac-fileinput";
el_fileinput.setAttribute("type","file");
el_fileinput.setAttribute("title","");
el_fileinput.setAttribute("tabindex","-1");
el_select=document.createElement("div");
el_select.className="dac-select";
el_select.classList.add("sbc-control");
el_select.setAttribute("tabindex","0");
el_select.appendChild(el_fileinput);
el_control.appendChild(el_message);
el_control.appendChild(el_select);
CSvgBtnControl({
el_control:el_select,
btntype:"folder"
});
// events
// relay a click on the button to the file input inside
el_select.addEventListener("click",function(e){
e.preventDefault();
e.stopPropagation();
el_fileinput.click();
});
// handle the change evernt of a file input
el_fileinput.addEventListener("change",function(e){
e.preventDefault();
// check the number of the files selected.
// if it's 0 (like the dialog box is cancelled),
// then do not proceed.
if(this.files.length){
loadFile(this.files[0],"fi");
// set the value to null so it can select
// the same file and trigger the 'change' event.
this.value=null;
}
});
// drag and drop a file to the input code
el_control.addEventListener("drop",function(e){
this.classList.remove("dac-dragover");
e.preventDefault();
if(e.dataTransfer.files.length){
loadFile(e.dataTransfer.files[0],"dd");
}
});
el_control.addEventListener("dragenter",function(e){
this.classList.add("dac-dragover");
});
el_control.addEventListener("dragleave",function(e){
this.classList.remove("dac-dragover");
});
// prevent from opening the image in the browser
// This does not stop the browser to open the image
// when it's dropped outsite of the element
el_control.addEventListener("dragover",function(e){
e.preventDefault();
});
// call base class
CUiControl({
el_control:el_control
});
};
init();
return {
show:show,
hide:hide,
enable:enable,
disable:disable
};
};
"use strict";
////////////////////////////////////////////////////////////////////
// CProgBarControl
function CProgBarControl(px){
// elements
var el_control=px.el_control;
var el_bar=null;
var el_progress=null;
var el_text=null;
// locale
var lca=px.lca;
// variables
var default_delay=300;
var timer_id=null;
function show0(){
el_control.classList.remove("pbc-hide");
setProgress(0);
};
function show(delay){
if(delay===undefined){
delay=default_delay;
}
if(delay===0){
show0();
}else{
timer_id=setTimeout(function(){
if(timer_id===null){return;}
show0();
},delay);
}
};
function hide(){
timer_id=null;
el_control.classList.add("pbc-hide");
};
function setProgress(val,max){
if(!max){max=100;}
var percent=Math.floor(val*100/max);
el_text.innerHTML=percent+"%";
el_progress.style.width=percent+"%";
};
function createCancelButton(){
var el_cancel_txt=document.createElement("div");
el_cancel_txt.className="pbc-cancel-txt";
el_cancel_txt.innerHTML=lca["label:cancel"];
var el_cancel_bg=document.createElement("div");
el_cancel_bg.className="pbc-cancel-bg";
var el_cancel=document.createElement("div");
el_cancel.className="pbc-cancel";
el_cancel.appendChild(el_cancel_bg);
el_cancel.appendChild(el_cancel_txt);
return el_cancel;
};
function init(){
var el_cancel=createCancelButton();
el_progress=document.createElement("div");
el_progress.className="pbc-progress";
el_text=document.createElement("div");
el_text.className="pbc-text";
el_bar=document.createElement("div");
el_bar.className="pbc-bar";
el_bar.appendChild(el_progress);
el_bar.appendChild(el_text);
el_control.classList.add("pbc-hide");
el_control.appendChild(el_bar);
el_control.appendChild(el_cancel);
// events
el_cancel.addEventListener("click",function(e){
el_control.dispatchEvent(new Event("progbarcancel"));
});
// call base class
CUiControl({
el_control:el_control
});
};
init();
return {
show:show,
hide:hide,
setProgress:setProgress
};
};
"use strict";
////////////////////////////////////////////////////////////////////
// CAlertBandControl
function CAlertBandControl(px){
// elements
var el_control=px.el_control;
var el_box=null;
var el_msg=null;
function setupBoxColor(bgcolor){
if(bgcolor===undefined){return;}
var cname;
switch(bgcolor){
case "black":
case "white":
case "red":
case "green":
case "blue":
el_box.classList.add("abc-box-"+bgcolor);
break;
default:
el_box.style.background=bgcolor;
break;
}
};
function open(msg,bgcolor){
if(bgcolor!==undefined){
setupBoxColor(bgcolor);
}
el_msg.innerHTML=msg;
el_control.classList.remove("abc-hide");
};
function close(){
el_control.classList.add("abc-hide");
};
function init(){
// build alertband
var el_radiate=document.createElement("div");
el_radiate.className="abc-radiate";
var el_close=document.createElement("div");
el_close.className="abc-close";
el_close.classList.add("sbc-control");
el_close.setAttribute("tabindex","0");
if(0){
var el_side_left=document.createElement("div");
el_side_left.className="abc-side";
}
el_msg=document.createElement("div");
el_msg.className="abc-msg";
var el_side_right=document.createElement("div");
el_side_right.className="abc-side";
el_side_right.appendChild(el_close);
var el_tbl=document.createElement("div");
el_tbl.className="abc-tbl";
if(0){
el_tbl.appendChild(el_side_left);
}
el_tbl.appendChild(el_msg);
el_tbl.appendChild(el_side_right);
el_box=document.createElement("div");
el_box.className="abc-box";
el_box.appendChild(el_radiate);
el_box.appendChild(el_tbl);
el_control.classList.add("abc-hide");
el_control.appendChild(el_box);
CSvgBtnControl({
el_control:el_close,
btntype:"x",
style:{
color:"white",
background:"rgba(255,255,255,.3)"
}
});
// events
el_control.addEventListener("click",function(e){
close();
el_control.dispatchEvent(new Event("alertbandend"));
});
el_close.addEventListener("click",function(e){
e.stopPropagation();
el_control.click();
});
// call base class
CUiControl({
el_control:el_control
});
};
init();
return {
open:open,
close:close
};
};
"use strict";
////////////////////////////////////////////////////////////////////
// CWSpinnerControl
function CWSpinnerControl(px){
// elements
var el_control=px.el_control;
// variables
var default_delay=300;
var timer_id=null;
function start0(){
el_control.classList.remove("wsc-hide");
};
function start(delay){
if(delay===undefined){
delay=default_delay;
}
if(delay===0){
start0();
}else{
timer_id=setTimeout(function(){
if(timer_id===null){return;}
start0();
},delay);
}
};
function stop(){
timer_id=null;
el_control.classList.add("wsc-hide");
};
function init(){
var el_spin=document.createElement("div");
el_spin.className="wsc-spin";
var el_radiate=document.createElement("div");
el_radiate.className="wsc-radiate";
var el_center=document.createElement("div");
el_center.className="wsc-center";
el_center.appendChild(el_spin);
el_center.appendChild(el_radiate);
el_control.classList.add("wsc-hide");
el_control.appendChild(el_center);
// call base class
CUiControl({
el_control:el_control
});
};
init();
return {
start:start,
stop:stop
};
};
"use strict";
////////////////////////////////////////////////////////////////////
// CUPicControl
function CUPicControl(px){
// elements
var el_control=px.el_control;
var el_droparea=null;
var el_fileview=null;
var el_progbar=null;
var el_alertband=null;
var el_wspinner=null;
// locale
var lca=px.lca;
// extention list
var ext_list=px.ext_list;
// url server
var url_server=px.url_server;
// xhr timeout
var xhr_timeout=((px.xhr_timeout!==undefined)?px.xhr_timeout:0);
// Data URL
var dataurl=null;
// fileinfo
var fileinfo=null;
// xhreq
var xhreq=null;
// function closures
var fcl_fileview=null;
var fcl_droparea=null;
var fcl_progbar=null;
var fcl_alertband=null;
var fcl_wspinner=null;
function openErrMsg(errmsg){
fcl_fileview.disable();
fcl_droparea.disable();
fcl_alertband.open(errmsg,"red");
};
function loadFile(file){
if(!file){return;}
// hide progress
fcl_progbar.hide();
// check file extention
var ext=file.name.split(".").pop();
if(ext_list.indexOf(ext)==-1){
var str=lca["err:invalid-file-type"];
str=str.replace("%ext%",ext);
openErrMsg(str);
return;
}
// show Waiting
fcl_wspinner.start();
fcl_droparea.disable();
// dispatch fileinfo
fileinfo={
name:file.name,
size:file.size,
type:file.type,
lastModified:file.lastModified
};
el_control.dispatchEvent(new CustomEvent("load",{detail:fileinfo}));
// read contents
var reader=new FileReader();
reader.addEventListener("load",function(){
dataurl=reader.result;
fcl_fileview.setPicture({dataurl:dataurl});
// browser will be busy resizing the image.
// remove hourglass after the browser becomes idle
setTimeout(function(){
fcl_wspinner.stop();
fcl_fileview.show();
fcl_droparea.hide();
},100);
});
reader.readAsDataURL(file);
};
function send(){
var requ={
cmd:"save",
filename:fileinfo.name,
dataurl:dataurl
};
xhreq=ajaxCall(url_server,requ,function(resp){
fcl_wspinner.stop();
fcl_fileview.enable();
if(resp.errmsg){
openErrMsg(resp.errmsg);
}
el_control.dispatchEvent(new CustomEvent("sent",{detail:resp}));
},function(xhr){
// set timeout in milliseconds
if(xhr_timeout){
xhr.timeout=xhr_timeout;
}
// ending procedure
var xhr_last_type=null;
function xhrEnd(e){
fcl_progbar.hide();
if(e.type!="loadend"){
xhr_last_type=e.type;
openErrMsg(lca["err:xhr:"+xhr_last_type]);
}
};
// load events (start,progress,end)
xhr.upload.addEventListener("loadstart",function(e){
fcl_progbar.show();
fcl_fileview.disable();
});
xhr.upload.addEventListener("progress",function(e){
if(e.lengthComputable){
fcl_progbar.setProgress(e.loaded,e.total);
}
});
xhr.upload.addEventListener("loadend",function(e){
xhrEnd(e);
if(xhr_last_type===null){
fcl_wspinner.start();
}
});
// termination events (timeout,error,abort)
xhr.upload.addEventListener("timeout",xhrEnd);
xhr.upload.addEventListener("error",xhrEnd);
xhr.upload.addEventListener("abort",xhrEnd);
});
};
function init(){
// build
el_fileview=document.createElement("div");
el_fileview.className="fvc-control";
el_droparea=document.createElement("div");
el_droparea.className="dac-control";
el_progbar=document.createElement("div");
el_progbar.className="pbc-control";
el_alertband=document.createElement("div");
el_alertband.className="abc-control";
el_wspinner=document.createElement("div");
el_wspinner.className="wsc-control";
el_control.appendChild(el_fileview);
el_control.appendChild(el_droparea);
el_control.appendChild(el_progbar);
el_control.appendChild(el_alertband);
el_control.appendChild(el_wspinner);
// components
fcl_fileview=CFileViewControl({
el_control:el_fileview
});
fcl_droparea=CDropAreaControl({
el_control:el_droparea
});
fcl_progbar=CProgBarControl({
el_control:el_progbar,
lca:lca
});
fcl_alertband=CAlertBandControl({
el_control:el_alertband
});
fcl_wspinner=CWSpinnerControl({
el_control:el_wspinner
});
// events
el_fileview.addEventListener("fileviewclear",function(e){
// show droparea
fcl_droparea.enable();
fcl_droparea.show();
// hide fileboard
fcl_fileview.hide();
fcl_fileview.setPicture("none");
// clear fileinfo
fileinfo=null;
el_control.dispatchEvent(new CustomEvent(
"load",{detail:fileinfo}));
});
el_droparea.addEventListener("dropareafile",function(e){
loadFile(e.detail)
});
el_progbar.addEventListener("progbarcancel",function(e){
xhreq.abort();
});
el_alertband.addEventListener("alertbandend",function(e){
fcl_fileview.enable();
fcl_droparea.enable();
});
// call base class
CUiControl({
el_control:el_control
});
};
init();
return {
send:send
};
};