919 lines
20 KiB
Plaintext
919 lines
20 KiB
Plaintext
<PUBLIC:COMPONENT>
|
|
<PUBLIC:EVENT ID="event_oncolorchange" name="oncolorchange" />
|
|
<PUBLIC:EVENT ID="event_oncolorpopup" name="oncolorpopup" />
|
|
<PUBLIC:PROPERTY name="selectedColor" GET="_get_selectedColor" PUT="_set_selectedColor"/>
|
|
<PUBLIC:METHOD name="popupColor" INTERNALNAME="_mtd_popupColor" />
|
|
<PUBLIC:ATTACH EVENT="onclick" ONEVENT="_mtd_onclick()" />
|
|
</PUBLIC:COMPONENT>
|
|
|
|
<script type="text/javascript">
|
|
|
|
|
|
/****************************************************************\
|
|
Cookie Functions
|
|
\****************************************************************/
|
|
|
|
|
|
function SetCookie(name,value,seconds)
|
|
{
|
|
var cookie=name+"="+escape(value)+"; path=/;";
|
|
if(seconds)
|
|
{
|
|
var d=new Date();
|
|
d.setSeconds(d.getSeconds()+seconds);
|
|
cookie+=" expires="+d.toUTCString()+";";
|
|
}
|
|
document.cookie=cookie;
|
|
}
|
|
function GetCookie(name)
|
|
{
|
|
var cookies=document.cookie.split(';');
|
|
for(var i=0;i<cookies.length;i++)
|
|
{
|
|
var parts=cookies[i].split('=');
|
|
if(name==parts[0].replace(/\s/g,''))
|
|
return unescape(parts[1])
|
|
}
|
|
//return undefined..
|
|
}
|
|
function GetCookieDictionary()
|
|
{
|
|
var dict={};
|
|
var cookies=document.cookie.split(';');
|
|
for(var i=0;i<cookies.length;i++)
|
|
{
|
|
var parts=cookies[i].split('=');
|
|
dict[parts[0].replace(/\s/g,'')]=unescape(parts[1]);
|
|
}
|
|
return dict;
|
|
}
|
|
function GetCookieArray()
|
|
{
|
|
var arr=[];
|
|
var cookies=document.cookie.split(';');
|
|
for(var i=0;i<cookies.length;i++)
|
|
{
|
|
var parts=cookies[i].split('=');
|
|
var cookie={name:parts[0].replace(/\s/g,''),value:unescape(parts[1])};
|
|
arr[arr.length]=cookie;
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
|
|
function HideSelects()
|
|
{
|
|
var cmd=element.getAttribute("Command");
|
|
if(cmd!=null&&cmd!="")return;
|
|
|
|
selects=[];
|
|
var coll=element.document.all.tags("SELECT");
|
|
for(var i=0;i<coll.length;i++)
|
|
{
|
|
var sel=coll[i];
|
|
if(sel.currentStyle.visibility!='hidden')
|
|
{
|
|
selects[selects.length]=sel;
|
|
var style=sel.runtimeStyle||sel.style;
|
|
style._visibility=style.visibility;
|
|
style.visibility='hidden';
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// All colors in the following color array will be used in the editor color picker
|
|
var colorsArray = new Array("#000000","#993300","#333300","#003300","#003366","#000080","#333399","#333333",
|
|
"#800000","#FF6600","#808000","#008000","#008080","#0000FF","#666699","#808080",
|
|
"#FF0000","#FF9900","#99CC00","#339966","#33CCCC","#3366FF","#800080","#999999",
|
|
"#FF00FF","#FFCC00","#FFFF00","#00FF00","#00FFFF","#00CCFF","#993366","#C0C0C0",
|
|
"#FF99CC","#FFCC99","#FFFF99","#CCFFCC","#CCFFFF","#99CCFF","#CC99FF","#FFFFFF");
|
|
|
|
var ShowMoreColors = true;
|
|
|
|
var dlgurl='[[_CuteEditorResource_]]Load.ashx?type=dialog&file=ColorPicker.Aspx&culture=[[_culture_]]'+"&[[DNN_Arg]]"
|
|
function element._cphtc_sel(color)
|
|
{
|
|
_color=color;
|
|
event_oncolorchange.fire();
|
|
}
|
|
function element._cphtc_dlg()
|
|
{
|
|
CloseDiv();
|
|
|
|
var oldvalue=_color;
|
|
|
|
function HandleReturn(res)
|
|
{
|
|
if(res!=null&&res!==false)
|
|
{
|
|
_color=res;
|
|
event_oncolorchange.fire();
|
|
}
|
|
else if(element.disableVisual)
|
|
{
|
|
_color=oldvalue;
|
|
event_oncolorchange.fire();
|
|
}
|
|
}
|
|
|
|
event_oncolorpopup.fire();
|
|
_colorpickerDialogFeature = "dialogWidth:520px;dialogHeight:420px;help:0;status:0;resizable:1";
|
|
if(element.disableVisual)
|
|
{
|
|
if(window.editor)
|
|
{
|
|
window.editor.ShowDialog(HandleReturn,dlgurl
|
|
,{editor:editor}
|
|
,_colorpickerDialogFeature);
|
|
}
|
|
else
|
|
{
|
|
var res=showModalDialog(dlgurl
|
|
,{color:oldvalue}
|
|
,_colorpickerDialogFeature);
|
|
HandleReturn(res);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//FEATURE:change the color in ColorPicker.aspx would fire the event so the changing would affect immediately , and it could be auto rollback
|
|
|
|
|
|
if(window.editor)
|
|
{
|
|
window.editor.ShowDialog(HandleReturn,dlgurl
|
|
,{editor:editor}
|
|
,_colorpickerDialogFeature);
|
|
}
|
|
else
|
|
{
|
|
var res=showModalDialog(dlgurl+'?culture=[[_culture_]]'+"&[[DNN_Arg]]"
|
|
,{color:oldvalue,onchange:HandleReturn}
|
|
,_colorpickerDialogFeature);
|
|
|
|
HandleReturn(res);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
var _color="";
|
|
|
|
function _get_selectedColor()
|
|
{
|
|
return _color;
|
|
}
|
|
function _set_selectedColor(val)
|
|
{
|
|
_color=val;
|
|
}
|
|
|
|
var div;
|
|
var selects=[];
|
|
var isopen=false;
|
|
|
|
function _mtd_onclick()
|
|
{
|
|
_mtd_popupColor();
|
|
}
|
|
|
|
function _mtd_popupColor()
|
|
{
|
|
if(div==null)
|
|
{
|
|
div = document.createElement("<DIV style='width=140;cursor:default;position:absolute;z-index:88888888;background-color:white;border:0px;overflow:visible;'>");
|
|
|
|
var temp_html = '';
|
|
var total = colorsArray.length;
|
|
var width = 8;
|
|
|
|
temp_html += "<table cellpadding=0 cellspacing=5 style='width:100%;font-family: Verdana; font-size: 6px; BORDER: #666666 1px solid;' bgcolor=#f9f8f7><tr><td>";
|
|
temp_html += "<table cellpadding=0 cellspacing=2 style='font-size: 3px;'>";
|
|
|
|
temp_html += '<tr>';
|
|
temp_html += '<td colspan=10 align=center style="padding:1px;border:solid 1px #f9f8f7;margin:1px" onmouseup="document.all.'+element.uniqueID+'._cphtc_sel(this.ColorValue)" ColorValue="" onmouseover="CuteEditor_ColorPicker_ButtonOver(this);">';
|
|
temp_html += '<table cellspacing=0 cellpadding=0 border=0 width=90% style="font-size:3px">';
|
|
temp_html += '<tr><td width=18><div style="background-color:#000000; border:solid 1px #808080; width:12px; height:12px; font-size: 3px;"> </div></td><td align=center style="font:normal 11px verdana;"> [[Automatic]]</td></tr>';
|
|
temp_html += '</table>';
|
|
temp_html += '</td>';
|
|
temp_html += '</tr>';
|
|
|
|
temp_html += '<tr><td> </td></tr>';
|
|
|
|
for (var i=0; i<total; i++) {
|
|
if ((i % width) == 0)
|
|
{
|
|
temp_html += "<tr>";
|
|
}
|
|
|
|
temp_html += '<td title='+colorsArray[i]+' align=center style="padding:1px;border:solid 1px #f9f8f7;" onmouseover="CuteEditor_ColorPicker_ButtonOver(this);" ColorValue="'+colorsArray[i]+'" onmouseup="document.all.'+element.uniqueID+'._cphtc_sel(this.ColorValue);">';
|
|
temp_html += '<div style="background-color:'+colorsArray[i]+'; border:solid 1px #808080; width:12px; height:12px; font-size: 3px;"> </div>';
|
|
temp_html += '</td>';
|
|
|
|
if ( ((i+1)>=total) || (((i+1) % width) == 0))
|
|
{
|
|
temp_html += "</tr>";
|
|
}
|
|
}
|
|
temp_html += '<tr><td> </td></tr>';
|
|
//temp_html += '<tr>';
|
|
//temp_html += '<td colspan="10" style="height:23px; font-family: arial; font-size:11px; border: solid 1px #f9f8f7;" onMouseOver="" onMouseOut="" onClick="" align=center> More Colors...</td>';
|
|
//temp_html += '</tr>';
|
|
temp_html += '</table>';
|
|
temp_html += '</td></tr>';
|
|
if(ShowMoreColors)
|
|
{
|
|
temp_html += '<tr>';
|
|
temp_html += '<td colspan=10 align=center style="padding:1px;border:solid 1px #f9f8f7;" onmouseover="CuteEditor_ColorPicker_ButtonOver(this);" onmouseup="document.all.'+element.uniqueID+'._cphtc_dlg();">';
|
|
temp_html += '<table cellspacing=0 cellpadding=0 border=0 width=90% style="font-size:3px">';
|
|
temp_html += '<tr><td width=18><div style="background-color:#000000; border:solid 1px #808080; width:12px; height:12px;font-size: 3px;"></div></td><td align=center style="font-size:11px">[[MoreColors]]</td></tr>';
|
|
temp_html += '</table>';
|
|
temp_html += '</td>';
|
|
temp_html += '</tr>';
|
|
}
|
|
temp_html += '</table>';
|
|
|
|
div.innerHTML=temp_html;
|
|
|
|
element.document.body.appendChild(div);
|
|
|
|
div.onclick=CloseDiv;
|
|
}
|
|
|
|
if(isopen)CloseDiv();
|
|
|
|
isopen=true;
|
|
|
|
HideSelects();
|
|
|
|
|
|
div.style.top=0;
|
|
div.style.left=0;
|
|
div.style.display='block';
|
|
var pos=CalcPosition(div,element);
|
|
pos.top+=element.offsetHeight;
|
|
AdjustMirror(div,element,pos);
|
|
div.style.left=pos.left+"px";
|
|
div.style.top=pos.top+"px";
|
|
|
|
var coll=div.all;
|
|
for(var i=0;i<coll.length;i++)
|
|
coll[i].unselectable='on';
|
|
|
|
if(div.focus)div.focus();
|
|
|
|
var manager=new CaptureManager(element,handlelosecapture);
|
|
manager.AddElement(div);
|
|
}
|
|
function handlelosecapture()
|
|
{
|
|
CloseDiv();
|
|
}
|
|
function CloseDiv()
|
|
{
|
|
CaptureManager.Unregister(element);
|
|
|
|
isopen=false;
|
|
div.style.display='none';
|
|
for(var i=0;i<selects.length;i++)
|
|
{
|
|
var sel=selects[i];
|
|
sel.runtimeStyle.visibility=sel.runtimeStyle._visibility;
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
<script type="text/javascript">
|
|
|
|
|
|
//Old_Position_Functions.js
|
|
|
|
/****************************************************************\
|
|
Position Functions
|
|
\****************************************************************/
|
|
|
|
//TODO:firefox,fixed,body width
|
|
|
|
function GetIsFixedPosition(e)
|
|
{
|
|
var isfirefox=navigator.userAgent.indexOf("Firefox")>-1;
|
|
if(!isfirefox)
|
|
{
|
|
if(e.offsetParent!=null)
|
|
return false;
|
|
}
|
|
var stylepos;
|
|
if(e.currentStyle)
|
|
stylepos=e.currentStyle.position;
|
|
else
|
|
stylepos=window.getComputedStyle(e,null).getPropertyValue("position");
|
|
return stylepos=="fixed";
|
|
}
|
|
function GetCurrentBorderWidth(p,side)
|
|
{
|
|
var val="";
|
|
if(p.currentStyle)
|
|
{
|
|
if(p.currentStyle["border"+side+"Style"]=="none")
|
|
return 0;
|
|
val=p.currentStyle["border"+side+"Width"]
|
|
}
|
|
else
|
|
{
|
|
side=side.toLowerCase();
|
|
var s=window.getComputedStyle(p,null);
|
|
|
|
if(s.getPropertyValue("border-style-"+side)=="none")
|
|
return 0;
|
|
val=s.getPropertyValue("border-"+side+"-width")
|
|
}
|
|
if(!val)
|
|
return 0;
|
|
switch(val)
|
|
{
|
|
case "thin":
|
|
return 1;
|
|
case "medium":
|
|
if(navigator.userAgent.indexOf("MSIE 7.")>-1||window.document.compatMode!="CSS1Compat")
|
|
{
|
|
if(p.nodeName=="TABLE"||p.nodeName=="TD")
|
|
return 0;
|
|
}
|
|
return 3;
|
|
case "thick":
|
|
return 5;
|
|
}
|
|
return parseInt(val)||0;
|
|
}
|
|
|
|
function GetScrollPosition(e)
|
|
{
|
|
var isxhtml=window.document.compatMode=="CSS1Compat";
|
|
var isie=navigator.userAgent.indexOf("MSIE")>-1;
|
|
var isie5=isie&&navigator.userAgent.indexOf("MSIE 5.")>-1;
|
|
var isie6=isie&&navigator.userAgent.indexOf("MSIE 6.")>-1;
|
|
var isie7=isie&&navigator.userAgent.indexOf("MSIE 7.")>-1;
|
|
var isie8=isie&&parseInt(navigator.userAgent.split("MSIE ")[1].split(".")[0])>7;
|
|
var isopera=!!window.opera;
|
|
var iswebkit=navigator.userAgent.indexOf("AppleWebKit")>-1;
|
|
var isfirefox=navigator.userAgent.indexOf("Firefox")>-1;
|
|
|
|
var pos={left:0,top:0};
|
|
|
|
var ffborderfix=0;
|
|
|
|
|
|
function AddBoder(par)
|
|
{
|
|
if(par.nodeName!="BODY"&&par.nodeName!="HTML")
|
|
{
|
|
pos.left+=GetCurrentBorderWidth(par,"Left");
|
|
pos.top+=GetCurrentBorderWidth(par,"Top");
|
|
}
|
|
}
|
|
|
|
while(e)
|
|
{
|
|
pos.left+=e.offsetLeft;
|
|
pos.top+=e.offsetTop;
|
|
|
|
var par=GetStandParent(e);
|
|
|
|
if(par)
|
|
{
|
|
//fix the offsetTop/offsetLeft bug.?
|
|
for(var p=e.parentNode;p!=par;p=p.parentNode)
|
|
{
|
|
pos.top-=p.scrollTop;
|
|
pos.left-=p.scrollLeft;
|
|
}
|
|
}
|
|
|
|
if(GetIsFixedPosition(e))
|
|
{
|
|
if(isopera)
|
|
{
|
|
if(e.offsetTop==0)
|
|
pos.top+=parseInt(window.getComputedStyle(e,null).getPropertyValue("top"))||0;
|
|
if(e.offsetLeft==0)
|
|
pos.left+=parseInt(window.getComputedStyle(e,null).getPropertyValue("left"))||0;
|
|
}
|
|
pos.top+=Math.max(document.body.scrollTop,document.documentElement.scrollTop);
|
|
pos.left+=Math.max(document.body.scrollLeft,document.documentElement.scrollLeft);
|
|
if(isie8)
|
|
{
|
|
if(e.parentElement&&e.parentElement.style.position=="absolute")
|
|
{
|
|
var ppos=GetScrollPosition(e.parentElement);
|
|
pos.top+=ppos.top;
|
|
pos.left+=ppos.left;
|
|
}
|
|
}
|
|
return pos;
|
|
}
|
|
|
|
|
|
if(!par)
|
|
return pos;
|
|
|
|
if(isopera)
|
|
{
|
|
//NOTE: only tested opera 10
|
|
//do not check the border!
|
|
}
|
|
else if(isfirefox)
|
|
{
|
|
//TODO:-moz-box-sizing:border-box;
|
|
AddBoder(par);
|
|
//for firefox bug!
|
|
if(ffborderfix==0)
|
|
{
|
|
if(window.getComputedStyle(e,null).getPropertyValue("position")=="absolute")
|
|
{
|
|
AddBoder(par);
|
|
ffborderfix=1;
|
|
}
|
|
}
|
|
}
|
|
else if(isxhtml)
|
|
{
|
|
if(isie8)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
AddBoder(par);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AddBoder(par);
|
|
}
|
|
|
|
if(isxhtml)
|
|
{
|
|
// if(isie8||isopera||iswebkit) root offsetParent is BODY
|
|
if(iswebkit)
|
|
{
|
|
//if(iswebkit) , the document.body.scrollTop has value , document.documentElement.scrollTop is awlasy zero
|
|
if(par.nodeName!="BODY")
|
|
{
|
|
pos.left-=par.scrollLeft;
|
|
pos.top-=par.scrollTop;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(par.nodeName!="HTML")
|
|
{
|
|
pos.left-=par.scrollLeft;
|
|
pos.top-=par.scrollTop;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(par.nodeName!="BODY")
|
|
{
|
|
pos.left-=par.scrollLeft;
|
|
pos.top-=par.scrollTop;
|
|
}
|
|
}
|
|
|
|
e=par;
|
|
}
|
|
|
|
|
|
if(isfirefox)
|
|
{
|
|
pos.left-=GetCurrentBorderWidth(document.body,"Left");
|
|
pos.top-=GetCurrentBorderWidth(document.body,"Top");
|
|
pos.left+=GetCurrentBorderWidth(document.documentElement,"Left");
|
|
pos.top+=GetCurrentBorderWidth(document.documentElement,"Top");
|
|
}
|
|
|
|
return pos;
|
|
}
|
|
function GetStandParent(e)
|
|
{
|
|
if(e.offsetParent)
|
|
return e.offsetParent;
|
|
if(e.nodeName=="BODY"||e.nodeName=="HTML")
|
|
return null;
|
|
return document.body;
|
|
}
|
|
function CalcPosition(floate, e)
|
|
{
|
|
var epos=GetScrollPosition(e);
|
|
if(GetIsFixedPosition(floate))
|
|
{
|
|
epos.top-=Math.max(document.body.scrollTop,document.documentElement.scrollTop);
|
|
epos.left-=Math.max(document.body.scrollLeft,document.documentElement.scrollLeft);
|
|
|
|
return {left:epos.left,top:epos.top};
|
|
}
|
|
else
|
|
{
|
|
var spar=GetStandParent(floate);
|
|
var spos=GetScrollPosition(spar);
|
|
if(spar.nodeName!="BODY"&&spar.nodeName!="HTML")
|
|
{
|
|
spos.left+=GetCurrentBorderWidth(spar,"Left");
|
|
spos.top+=GetCurrentBorderWidth(spar,"Top");
|
|
spos.left-=spar.scrollLeft;
|
|
spos.top-=spar.scrollTop;
|
|
}
|
|
}
|
|
return {left:epos.left-spos.left,top:epos.top-spos.top};
|
|
}
|
|
|
|
|
|
|
|
|
|
function GetClientPosition(e)
|
|
{
|
|
var pos=GetScrollPosition(e);
|
|
pos.top-=Math.max(document.body.scrollTop,document.documentElement.scrollTop);
|
|
pos.left-=Math.max(document.body.scrollLeft,document.documentElement.scrollLeft);
|
|
return pos;
|
|
}
|
|
|
|
|
|
//get the best position to put the floate
|
|
function AdjustMirror(floate,e,pos)
|
|
{
|
|
//c:Client,f:floate,e:e,p:floate"s StandParent,m:Mirror
|
|
|
|
//get the size of window
|
|
var cw=window.document.body.clientWidth;
|
|
var ch=window.document.body.clientHeight;
|
|
if(window.document.compatMode=="CSS1Compat")
|
|
{
|
|
cw=window.document.documentElement.clientWidth;
|
|
ch=window.document.documentElement.clientHeight;
|
|
}
|
|
|
|
//get the size of float element
|
|
var fw=floate.offsetWidth;
|
|
var fh=floate.offsetHeight;
|
|
|
|
var pcpos=GetClientPosition(GetStandParent(floate));
|
|
|
|
//get the center of float element
|
|
var fmpos={left:pcpos.left+pos.left+fw/2,top:pcpos.top+pos.top+fh/2};//
|
|
|
|
var empos={left:pcpos.left+pos.left,top:pcpos.top+pos.top};
|
|
|
|
var isbody=false;
|
|
if(e!=null)
|
|
{
|
|
if(e.nodeName=="BODY")
|
|
{
|
|
isbody=true;
|
|
}
|
|
|
|
var ecpos=GetClientPosition(e);
|
|
//get the center of the relative element
|
|
empos={left:ecpos.left+e.offsetWidth/2,top:ecpos.top+e.offsetHeight/2};//
|
|
}
|
|
|
|
var allowjump=!isbody;
|
|
var allowmove=true;
|
|
|
|
//left<-->right
|
|
|
|
if(fmpos.left-fw/2<0)
|
|
{
|
|
if((empos.left*2-fmpos.left)+fw/2<=cw)
|
|
{
|
|
if(allowjump)fmpos.left=empos.left*2-fmpos.left;
|
|
}
|
|
else if(allowmove)
|
|
{
|
|
fmpos.left=fw/2+4;
|
|
}
|
|
}
|
|
else if(fmpos.left+fw/2>cw)
|
|
{
|
|
if((empos.left*2-fmpos.left)-fw/2>=0)
|
|
{
|
|
if(allowjump)fmpos.left=empos.left*2-fmpos.left;
|
|
}
|
|
else if(allowmove)
|
|
{
|
|
fmpos.left=cw-fw/2-4;
|
|
}
|
|
}
|
|
|
|
|
|
//top<-->bottom
|
|
|
|
if(fmpos.top-fh/2<0)
|
|
{
|
|
if((empos.top*2-fmpos.top)+fh/2<=ch)
|
|
{
|
|
if(allowjump)fmpos.top=empos.top*2-fmpos.top;
|
|
}
|
|
else if(allowmove)
|
|
{
|
|
fmpos.top=fh/2+4;
|
|
}
|
|
}
|
|
else if(fmpos.top+fh/2>ch)
|
|
{
|
|
if((empos.top*2-fmpos.top)-fh/2>=0)
|
|
{
|
|
if(allowjump)fmpos.top=empos.top*2-fmpos.top;
|
|
}
|
|
else if(allowmove)
|
|
{
|
|
fmpos.top=ch-fh/2-4;
|
|
}
|
|
}
|
|
|
|
pos.left=fmpos.left-pcpos.left-fw/2;
|
|
pos.top=fmpos.top-pcpos.top-fh/2;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************\
|
|
Capture Functions
|
|
this manager collect the elements that capture the mouse
|
|
if the mouse is in the element , the capture should be close ,
|
|
if the mouse is out of any element , the capture should be open .
|
|
\****************************************************************/
|
|
function CaptureManager(element,handlelosecapture)
|
|
{
|
|
if(CaptureManager.element&&CaptureManager.element.capturemanager)
|
|
{
|
|
CaptureManager.element.capturemanager.Unregister();
|
|
}
|
|
|
|
var enabled=true;
|
|
var elements=[];
|
|
var isout=true;
|
|
var iscap=false;
|
|
|
|
element.capturemanager=Manager;
|
|
CaptureManager.element=element;
|
|
|
|
Manager.AddElement(element);
|
|
|
|
var elementForCapture=element.document.createElement("<DIV style='width:0px;height:0px;left:0px;top:0px;position:absolute'>");
|
|
element.document.body.insertAdjacentElement('afterBegin',elementForCapture);
|
|
elementForCapture.attachEvent('onlosecapture',onlosecapture);
|
|
AttachEvents(elementForCapture);
|
|
|
|
elementForCapture.setCapture(true);
|
|
iscap=true;
|
|
|
|
return Manager;
|
|
|
|
function AttachEvents(subelement)
|
|
{
|
|
subelement.attachEvent('onmousedown',onmousedown);
|
|
subelement.attachEvent('onmousemove',onmousemove);
|
|
subelement.attachEvent('onmouseover',onmouseover);
|
|
subelement.attachEvent('onmouseout',onmouseout);
|
|
}
|
|
function DetachEvents(subelement)
|
|
{
|
|
subelement.detachEvent('onmousedown',onmousedown);
|
|
subelement.detachEvent('onmousemove',onmousemove);
|
|
subelement.detachEvent('onmouseover',onmouseover);
|
|
subelement.detachEvent('onmouseout',onmouseout);
|
|
}
|
|
|
|
function Manager()
|
|
{
|
|
}
|
|
function Manager.Unregister()
|
|
{
|
|
elementForCapture.detachEvent('onlosecapture',onlosecapture);
|
|
DetachEvents(elementForCapture);
|
|
elementForCapture.removeNode(true);
|
|
|
|
for(var i=0;i<elements.length;i++)
|
|
{
|
|
var subelement=elements[i];
|
|
DetachEvents(subelement);
|
|
}
|
|
|
|
enabled=false;
|
|
element.capturemanager=null;
|
|
CaptureManager.element=null;
|
|
if(iscap)
|
|
{
|
|
//element.document.title="r @ Unregister";
|
|
iscap=false;
|
|
elementForCapture.releaseCapture();
|
|
Manager.FireLoseCapture();
|
|
}
|
|
}
|
|
function Manager.AddElement(subelement)
|
|
{
|
|
AttachEvents(subelement);
|
|
elements[elements.length]=subelement;
|
|
}
|
|
function Manager.DelElement(subelement)
|
|
{
|
|
var len=elements.length;
|
|
for(var i=0;i<len;i++)
|
|
{
|
|
if(elements[i]==subelement)
|
|
{
|
|
DetachEvents(subelement);
|
|
for(var j=i;j<len-1;j++)
|
|
{
|
|
elements[j]=elements[j+1];
|
|
}
|
|
elements.length=elements.length-1;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
function Manager.FireLoseCapture()
|
|
{
|
|
handlelosecapture();
|
|
}
|
|
function onlosecapture()
|
|
{
|
|
if(iscap)//if fired by user
|
|
{
|
|
iscap=false;
|
|
try
|
|
{
|
|
Manager.FireLoseCapture();
|
|
}
|
|
finally
|
|
{
|
|
Manager.Unregister();
|
|
}
|
|
}
|
|
}
|
|
|
|
function onmousedown()
|
|
{
|
|
var currentElement=element.document.elementFromPoint(event.clientX,event.clientY);
|
|
for(var i=0;i<elements.length;i++)
|
|
{
|
|
var subelement=elements[i];
|
|
if(subelement.contains(currentElement))
|
|
return;
|
|
}
|
|
//if mouse down on other elements
|
|
Manager.Unregister();
|
|
}
|
|
|
|
function onmousemove()
|
|
{
|
|
var currentElement=element.document.elementFromPoint(event.clientX,event.clientY);
|
|
|
|
HookForElement(currentElement);
|
|
}
|
|
|
|
function HookForElement(currentElement)
|
|
{
|
|
for(var i=0;i<elements.length;i++)
|
|
{
|
|
var subelement=elements[i];
|
|
if(subelement.contains(currentElement))
|
|
{
|
|
if(iscap)
|
|
{
|
|
iscap=false;//set fire by Manager
|
|
elementForCapture.releaseCapture();
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
//if move on other elements
|
|
if(!iscap)
|
|
{
|
|
iscap=true;
|
|
elementForCapture.setCapture(true);
|
|
}
|
|
}
|
|
|
|
function onmouseover()
|
|
{
|
|
var currentElement=element.document.elementFromPoint(event.clientX,event.clientY);
|
|
|
|
isout=false;
|
|
for(var i=0;i<elements.length;i++)
|
|
{
|
|
var subelement=elements[i];
|
|
if(subelement.contains(event.fromElement))
|
|
return;
|
|
|
|
if(subelement.contains(currentElement))
|
|
{
|
|
if(iscap)
|
|
{
|
|
iscap=false;//set fire by Manager
|
|
elementForCapture.releaseCapture();
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
function onmouseout()
|
|
{
|
|
var currentElement=element.document.elementFromPoint(event.clientX,event.clientY);
|
|
|
|
isout=false;
|
|
for(var i=0;i<elements.length;i++)
|
|
{
|
|
var subelement=elements[i];
|
|
if(subelement.contains(event.toElement))
|
|
return;
|
|
}
|
|
|
|
if(!iscap)
|
|
{
|
|
iscap=true;
|
|
elementForCapture.setCapture(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!window.attachEvent)CaptureManager=CaptureManager_NoneIE;
|
|
|
|
|
|
function CaptureManager_NoneIE(element,handlelosecapture)
|
|
{
|
|
var manager={};
|
|
var elements=[element];
|
|
|
|
Window_Focus(window);
|
|
window.addEventListener("blur",LoseCapture,true);
|
|
window.document.addEventListener("click",HandleDocumentClick,true);
|
|
|
|
function LoseCapture()
|
|
{
|
|
setTimeout(manager.Unregister,1);
|
|
}
|
|
function HandleDocumentClick()
|
|
{
|
|
var src=Event_GetSrcElement();
|
|
for(var i=0;i<elements.length;i++)
|
|
{
|
|
if(Element_Contains(elements[i],src))
|
|
return;
|
|
}
|
|
LoseCapture();
|
|
}
|
|
manager.AddElement=function manager_AddElement(subelement)
|
|
{
|
|
elements.push(subelement);
|
|
}
|
|
manager.Unregister=function manager_Unregister()
|
|
{
|
|
window.removeEventListener("blur",LoseCapture,true);
|
|
window.document.removeEventListener("click",LoseCapture,true);
|
|
element.capturemanager=null;
|
|
handlelosecapture();
|
|
}
|
|
|
|
element.capturemanager=manager;
|
|
|
|
return manager;
|
|
}
|
|
|
|
function CaptureManager.Register(element,handlelosecapture)
|
|
{
|
|
return new CaptureManager(element,handlelosecapture);
|
|
}
|
|
function CaptureManager.Unregister(element)
|
|
{
|
|
if(element&&element.capturemanager)
|
|
{
|
|
element.capturemanager.Unregister();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
</script>
|
|
ureManager.Unregister(element)
|
|
{
|
|
if(element&&element.capturemanager)
|
|
{
|
|
element.capturemanager.Unregister();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
</script>
|