/*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
};
};
/*js
//==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>
//
//
//==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<
*/
////////////////////////////////////////////////////////////////////
// CTooltipControl
/*
var fcl_tooltip=CTooltipControl({
el_ttarea:el_container,
el_reference:e.target,
message:
"
aaa
"+
"bbb
"+
"This is a test
",
ttstyle:{
msgbox:{
"padding":"30px 40px",
"border-radius":"30px",
"background-color":"rgba(34,170,68,0.5)"
},
tip:{
"size":"10px"
},
message:{
"color":"yellow",
"font-family":"impact",
"font-size":"32px",
"font-weight":"bold",
"font-style":"italic"
}
}
});
////////////////////////////////////////////////////////////////////
//--------------- console output
// orientation
console.log("orien",orien);
// msgbox
console.log("msgbox.w",msgbox.w);
console.log("msgbox.h",msgbox.h);
// space
console.log("space.top",space.top);
console.log("space.bottom",space.bottom);
console.log("space.left",space.left);
console.log("space.right",space.right);
// clip
console.log("clip.x",clip.x);
console.log("clip.y",clip.y);
console.log("clip.w",clip.w);
console.log("clip.h",clip.h);
// reference
console.log("ref.x",ref.x);
console.log("ref.y",ref.y);
console.log("ref.w",ref.w);
console.log("ref.h",ref.h);
*/
////////////////////////////////////////////////////////////////////
function CTooltipControl(px){
// elements
var el_ttarea=px.el_ttarea;
var el_reference=px.el_reference;
var el_control=null;
// parameters
var message=px.message;
var ttstyle=px.ttstyle?px.ttstyle:{};
// variables
var shift={dx:0,dy:0};
var x_start;
var y_start;
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
};
};
function copyStyle(ax,bx){
if(bx){
for(var key in bx){
ax[key]=bx[key];
}
}
};
function getCssVal(cname,prop){
var el=document.createElement("div");
el.className=cname;
el.style.visibility="hidden";
el_ttarea.appendChild(el);
var val=window.getComputedStyle(el).getPropertyValue(prop);
el.remove();
return val;
};
function getCssInt(cname,prop){
return parseInt(getCssVal(cname,prop));
};
function getTipSize(){
if(ttstyle&&ttstyle.tip&&ttstyle.tip.size){
return parseInt(ttstyle.tip.size);
}else{
return getCssInt(
"ttip-triangle",
"border-top-width");
}
};
function getBoxRadius(){
if(ttstyle&&ttstyle.msgbox&&ttstyle.msgbox["border-radius"]){
return parseInt(ttstyle.msgbox["border-radius"]);
}else{
return getCssInt(
"ttip-msgbox",
"border-top-left-radius");
}
};
function getBackgroundColor(){
if(ttstyle&&ttstyle.tip&&ttstyle.msgbox["background-color"]){
return ttstyle.msgbox["background-color"];
}else{
return getCssVal(
"ttip-msgbox",
"background-color");
}
};
function getMsgBoxSize(el_msgbox){
el_msgbox.style.visibility="hidden";
el_ttarea.appendChild(el_msgbox);
var cs=window.getComputedStyle(el_msgbox);
var size={
w:parseInt(cs.getPropertyValue("width")),
h:parseInt(cs.getPropertyValue("height"))
};
el_msgbox.remove();
el_msgbox.style.visibility="visible";
return size;
};
function getClipAndSpace(clip,space){
// scroll position
var scrollpos={
top:document.documentElement.scrollTop,
left:document.documentElement.scrollLeft
};
// viewport
var vp={};
vp.top=scrollpos.top;
vp.bottom=vp.top+document.body.clientHeight;
vp.left=scrollpos.left;
vp.right=vp.left+document.body.clientWidth;
// ttarea
var ctnr_offset=jqOffset(el_ttarea);
var ctnr={};
ctnr.top=ctnr_offset.y;
ctnr.bottom=ctnr.top+el_ttarea.clientHeight;
ctnr.left=ctnr_offset.x;
ctnr.right=ctnr.left+el_ttarea.clientWidth;
// cross area of viewport and ttarea
var ca={};
ca.top=Math.max(vp.top,ctnr.top);
ca.bottom=Math.min(vp.bottom,ctnr.bottom);
ca.left=Math.max(vp.left,ctnr.left);
ca.right=Math.min(vp.right,ctnr.right);
// clip
clip.x=ca.left;
clip.y=ca.top;
clip.w=ca.right-ca.left;
clip.h=ca.bottom-ca.top;
// reference
var ref_offset=jqOffset(el_reference);
var ref={};
ref.top=ref_offset.y;
ref.bottom=ref.top+el_reference.offsetHeight;
ref.left=ref_offset.x;
ref.right=ref.left+el_reference.offsetWidth;
// space
space.top=ref.top-ca.top;
space.bottom=ca.bottom-ref.bottom;
space.left=ref.left-ca.left;
space.right=ca.right-ref.right;
};
function findOrien(space,msgbox){
var k=1.0;
var orien;
var lx={
top:(space.top-msgbox.h*k)*msgbox.w,
bottom:(space.bottom-msgbox.h*k)*msgbox.w,
left:(space.left-msgbox.w*k)*msgbox.h,
right:(space.right-msgbox.w*k)*msgbox.h
};
var b_top_bottom=((00)&&b_left_right){
orien="top";
}else if((lx.bottom>0)&&b_left_right){
orien="bottom";
}else if((lx.right>0)&&b_top_bottom){
orien="right";
}else if((lx.left>0)&&b_top_bottom){
orien="left";
}else{
var n;
n=lx.top;
orien="top";
if(lx.bottom>n){
n=lx.bottom;
orien="bottom";
}else if(lx.right>n){
n=lx.right;
orien="right";
}else if(lx.left>n){
n=lx.left;
orien="left";
}
}
return orien;
};
function open(){
// calc tooltip's tip width and height
var u=getTipSize();
var tri={
w:u*2,
h:u
};
// calc msgbox's border radius
var r=getBoxRadius();
var radius={
x:r,
y:r
};
// calc ttarea element size
var clip={};
var space={};
getClipAndSpace(clip,space);
// calc reference element size
var ref_offset=jqOffset(el_reference);
var ref={
x:ref_offset.x,
y:ref_offset.y,
w:el_reference.offsetWidth,
h:el_reference.offsetHeight
};
// create tooltip
el_control=document.createElement("div");
el_control.className="ttip-control";
// el_message
var el_message=document.createElement("div");
el_message.className="ttip-message";
el_message.innerHTML=message;
copyStyle(el_message.style,ttstyle.message);
// el_msgbox
var el_msgbox=document.createElement("div");
el_msgbox.className="ttip-msgbox";
el_msgbox.appendChild(el_message);
copyStyle(el_msgbox.style,ttstyle.msgbox);
// msgbox
var msgbox=getMsgBoxSize(el_msgbox);
msgbox.w+=tri.w;
msgbox.h+=tri.w;
// find orientation(top,bottom,left,right)
var orien=findOrien(space,msgbox);
// create triangle
var el_tri=document.createElement("div");
el_tri.className="ttip-triangle";
el_tri.style["border-"+orien+"-color"]=getBackgroundColor();
// create tip
var el_tip=document.createElement("div");
el_tip.className="ttip-tip";
el_tip.appendChild(el_tri);
if(ttstyle&&ttstyle.tip&&ttstyle.tip.size){
el_tri.style["border-width"]=ttstyle.tip.size;
}
// combine parts
switch(orien){
case "top":
el_control.appendChild(el_msgbox);
el_control.appendChild(el_tip);
break;
case "bottom":
el_control.appendChild(el_tip);
el_control.appendChild(el_msgbox);
break;
case "left":
el_tip.style.display="inline-block";
el_msgbox.style.display="inline-block";
el_control.appendChild(el_msgbox);
el_control.appendChild(el_tip);
break;
case "right":
el_tip.style.display="inline-block";
el_msgbox.style.display="inline-block";
el_control.appendChild(el_tip);
el_control.appendChild(el_msgbox);
break;
}
// put it in ttarea
el_ttarea.appendChild(el_control);
// get size of msgbox
var msgbox={
w:el_msgbox.offsetWidth,
h:el_msgbox.offsetHeight
};
// adjust tip width or height
switch(orien){
case "top":
case "bottom":
el_tip.style.height=tri.h+"px";
break;
case "left":
case "right":
el_tip.style.width=tri.h+"px";
el_tip.style.height=msgbox.h+"px";
break;
}
// position tip in the center
switch(orien){
case "top":
tri.y_init=0;
tri.x_init=(msgbox.w-tri.w)/2;
break;
case "bottom":
tri.y_init=-tri.h;
tri.x_init=(msgbox.w-tri.w)/2;
break;
case "left":
tri.y_init=(msgbox.h-tri.w)/2;
tri.x_init=0;
break;
case "right":
tri.y_init=(msgbox.h-tri.w)/2;
tri.x_init=-tri.h;
break;
}
// position tooltip
var x,y;
switch(orien){
case "top":
case "bottom":
x=ref.x+ref.w/2-msgbox.w/2;
tri.x=tri.x_init;
var d=(x+msgbox.w)-(clip.x+clip.w);
if(d>0){
tri.x=tri.x+d;
var d_tri=(tri.x+tri.w)-(msgbox.w-radius.x);
if(d_tri>0){
tri.x=msgbox.w-radius.x-tri.w;
x=x-d+d_tri;
}else{
x-=d;
}
}
var d=clip.x-x;
if(d>0){
tri.x=tri.x-d;
var d_tri=radius.x-tri.x;
if (d_tri>0){
tri.x=radius.x;
x=x+d-d_tri;
}else{
x+=d;
}
}
tri.y=tri.y_init;
break;
case "left":
case "right":
y=ref.y-(msgbox.h-ref.h)/2;
tri.y=tri.y_init;
var d =(y+msgbox.h)-(clip.y+clip.h);
if(d>0){
tri.y=tri.y+d;
var d_tri=(tri.y+tri.h)-(msgbox.h-radius.h);
if(d_tri>0){
tri.y=msgbox.h-radius.y-tri.h;
y=y-d+d_tri;
}else{
y-=d;
}
}
var d=clip.y-y;
if(d>0){
tri.y=tri.y-d;
var d_tri=radius.y-tri.y;
if(d_tri>0){
tri.y=radius.y;
y=y+d -d_tri;
}else{
y+=d;
}
}
tri.x=tri.x_init;
break;
}
// additional position calculations
var d=10;
switch(orien){
case "top":
y=ref.y-(msgbox.h+tri.h);
shift.dy=-d;
break;
case "bottom":
y=ref.y+ref.h;
shift.dy=d;
break;
case "left":
x=ref.x-(msgbox.w+tri.h);
shift.dx=-d;
break;
case "right":
x=ref.x+ref.w;
shift.dx=d;
break;
}
// set tip poisitons
el_tri.style.top=tri.y+"px";
el_tri.style.left=tri.x+"px";
// set tooltip poisitons
var ctnr_offset=jqOffset(el_ttarea);
var x_end=x-ctnr_offset.x;
var y_end=y-ctnr_offset.y;
x_start=x_end+shift.dx;
y_start=y_end+shift.dy;
el_control.style.opacity=0;
el_control.style.left=x_start+"px";
el_control.style.top=y_start+"px";
setTimeout(function(){
el_control.style.transition="opacity 0.3s,left 0.3s,top 0.3s";
el_control.style.opacity=1;
el_control.style.left=x_end+"px";
el_control.style.top=y_end+"px";
},1);
};
function close(){
el_control.style.transition="opacity 0.3s,left 0.3s,top 0.3s";
el_control.style.opacity=0;
el_control.style.left=x_start+"px";
el_control.style.top=y_start+"px";
el_control.addEventListener("transitionend",function(e){
if(e.propertyName=="opacity"){
this.remove();
}
});
};
function init(){
open();
};
init();
return{
close:close
};
};