
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL   1                                                                            **/
/** /var/www/dosdauter.de/www/htdocs/editor/scripts/language/de/editor_lang.js                           **/
/**                                                                                                      **/
/**********************************************************************************************************/

/*** Translation ***/
LanguageDirectory="de-DE";

function getTxt(s)
  {
  switch(s)
    {
    case "Save":return "Speichern";
    case "Preview":return "Vorschau";
    case "Full Screen":return "Vollbild";
    case "Search":return "Search";
    case "Check Spelling":return "Rechtschreibpr&uuml;fung";
    case "Text Formatting":return "Textformatierung";
    case "List Formatting":return "List Formatting";
    case "Paragraph Formatting":return "Paragraph Formatting";
    case "Styles":return "Stile";
    case "Custom CSS":return "Benutzer CSS";
    case "Styles & Formatting":return "Stile & Formatierung";
    case "Style Selection":return "Stile";
    case "Paragraph":return "Absatzformat";
    case "Font Name":return "Schrifttyp";
    case "Font Size":return "Schriftgr&ouml;&szlig;e";
    case "Cut":return "Ausschneiden";
    case "Copy":return "Kopieren";
    case "Paste":return "Einf&uuml;gen";
    case "Undo":return "R&uuml;ckg&auml;ngig";
    case "Redo":return "Wiederherstellen";
    case "Bold":return "Fett";
    case "Italic":return "Kursiv";
    case "Underline":return "Unterstrichen";
    case "Strikethrough":return "Durchgestrichen";
    case "Superscript":return "Hochgestellt";
    case "Subscript":return "Tiefgestellt";
    case "Justify Left":return "Linksb&uuml;ndig";
    case "Justify Center":return "Zentriert";
    case "Justify Right":return "Rechtsb&uuml;ndig";
    case "Justify Full":return "Blocksatz";
    case "Numbering":return "Nummerierung";
    case "Bullets":return "Aufz&auml;hlung";
    case "Indent":return "Einzug vergr&ouml;&szlig;ern";
    case "Outdent":return "Einzug verkleinern";
    case "Left To Right":return "Links nach Rechts";
    case "Right To Left":return "Rechts nach Links";
    case "Foreground Color":return "Schriftfarbe";
    case "Background Color":return "Hintergrundfarbe";
    case "Hyperlink":return "Verkn&uuml;pfung";
    case "Bookmark":return "Lesezeichen";
    case "Special Characters":return "Sonderzeichen";
    case "Image":return "Bild";
    case "Flash":return "Flash";
    case "Media":return "Medienobjekt";
    case "Content Block":return "Inhaltsblock"; 
    case "Internal Link":return "interne Vern&uuml;pfungen";
    case "Internal Image":return "Internal Image";
    case "Object":return "Object";
    case "Insert Table":return "Tabelle einf&uuml;gen";
    case "Table Size":return "Gr&ouml;&szlig;e";
    case "Edit Table":return "Tabelle bearbeiten";
    case "Edit Cell":return "Zelle bearbeiten";
    case "Table":return "Tabelle";
    case "Border & Shading":return "Rand & Schattierung";
    case "Show/Hide Guidelines":return "Hilfslinien einblenden/verbergen";
    case "Absolute":return "Absolute Positionierung";
    case "Paste from Word":return "von Word einf&uuml;gen";
    case "Line":return "Horizontale Linie";
    case "Form Editor":return "Formular Editor";
    case "Form":return "Formular";
    case "Text Field":return "Textfeld";
    case "List":return "Liste";
    case "Checkbox":return "Kontrollk&auml;stchen";
    case "Radio Button":return "Optionsfeld";
    case "Hidden Field":return "verstecktes Feld";
    case "File Field":return "Dateifeld";
    case "Button":return "Schaltfl&auml;che";
    case "Clean":return "L&ouml;schen";
    case "View/Edit Source":return "Quelltext anzeigen/bearbeiten";
    case "Tag Selector":return "Tag Selektor";
    case "Clear All":return "Alles l&ouml;schen";
    case "Tags":return "Tags";
    
    case "Heading 1":return "&Uuml;berschrift 1";
    case "Heading 2":return "&Uuml;berschrift 2";
    case "Heading 3":return "&Uuml;berschrift 3";
    case "Heading 4":return "&Uuml;berschrift 4";
    case "Heading 5":return "&Uuml;berschrift 5";
    case "Heading 6":return "&Uuml;berschrift 6";
    case "Preformatted":return "Preformatiert";
    case "Normal (P)":return "Normal (P)";
    case "Normal (DIV)":return "Normal (DIV)";

    case "Size 1":return "Gr&ouml;&szlig;e 1";
    case "Size 2":return "Gr&ouml;&szlig;e 2";
    case "Size 3":return "Gr&ouml;&szlig;e 3";
    case "Size 4":return "Gr&ouml;&szlig;e 4";
    case "Size 5":return "Gr&ouml;&szlig;e 5";
    case "Size 6":return "Gr&ouml;&szlig;e 6";
    case "Size 7":return "Gr&ouml;&szlig;e 7";

    case "Are you sure you wish to delete all contents?":
      return "M\u00f6chten Sie wirklich den gesamten Inhalt l\u00f6schen?";
    case "Remove Tag":return "Tag entfernen";
    
    case "Custom Colors":return "Benutzerdefiniert";
    case "More Colors...":return "weitere Farben...";
    case "Box Formatting":return "Box Formatierung";
    case "Advanced Table Insert":return "erweiterte Tabelle einf\u00fcgen";
    case "Edit Table/Cell":return "Tabelle/Zelle bearbeiten";
    case "Print":return "Print";
    case "Paste Text":return "Paste Text";
    case "CSS Builder":return "CSS Builder";
    case "Remove Formatting":return "Remove Formatting";
    case "Table Dimension Text": return "Table";
    case "Table Advance Link": return "Advanced";

    default:return "";
    }
  }
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL   1                                                                            **/
/** /var/www/dosdauter.de/www/htdocs/editor/scripts/istoolbar.js                                         **/
/**                                                                                                      **/
/**********************************************************************************************************/

/***********************************************************
InnovaStudio WYSIWYG Editor 3.6
© 2008, InnovaStudio (www.innovastudio.com). All rights reserved.
************************************************************/
var UA = navigator.userAgent.toLowerCase();
var isIE = (UA.indexOf('msie') >= 0) ? true : false;
var isNS = (UA.indexOf('mozilla') >= 0) ? true : false;

function ISToolbarManager(id) {
  this.id=id;
  this.btns=new Object();
  this.tbars=new Object();
  this.groups=new Object();
  this.tabCtl=null;
  
  this.createToolbar=function(id){
    var tb=new ISToolbar(id);
    tb.mgr=this;
    this.tbars[id]=tb;
    return tb;
  }
  
  this.createTbGroup=function(id){
    var gr=new ISToolbarGroup(id);
    gr.mgr=this;
    this.groups[id]=gr;
    return gr;
  }
  
  this.createTbTab=function(id) {
    var tab=new ISTabCtl(id);
    tab.mgr=this;
    this.tabCtl=tab;
    return tab;
  }
  
  this.render=function() {
    if(this.tabCtl) return this.tabCtl.render();
    var ret="";
    for(var i in this.groups) { if(this.groups[i].render) ret += this.groups[i].render(); }
    if(ret!="") return ret;

    for(var i in this.tbars) { if(this.tbars[i].render) ret += this.tbars[i].render(); }
    if(ret!="") return ret;
    return "";
  }
}

/*------------------*/
/* Toolbar */
/*------------------*/
var isTbars=new Object();

function ISToolbar(tId) {
  this.id=tId;
  this.mgr=null;
  this.btns=new Object();
  
  this.btnHeight=25;
  this.btnWidth=23;
  
  this.iconPath="icons/";
  
  this.floating=false;
  
  this.rt=new Object();
  this.rt.sepCnt=0;
  this.rt.brkCnt=0;
  
  this.style={toolbar:"istoolbar"};
  
  isTbars[tId]=this;
  
  return this;
};

var ISTbar=ISToolbar.prototype;

ISTbar.add=function(btn) {
  btn.container=this;
  if(!btn.width)btn.width=this.btnWidth;
  if(!btn.height)btn.height=this.btnHeight;
  this.btns[btn.id]=btn;
  if(this.mgr)this.mgr.btns[btn.id]=btn;
};

ISTbar.addButton=function(id, icon, text, width, height) {
  this.add(new ISButton(id, icon, text, width, height));
};

ISTbar.addToggleButton=function(id, group, checked, icon, text, width, height) {
  this.add(new ISToggleButton(id, group, checked, icon, text, width, height));
}

ISTbar.addDropdownButton=function(id, ddId, icon, text, width, height){
  this.add(new ISDropdownButton(id, ddId, icon, text, width, height));
};

ISTbar.addSeparator=function(icon) {
  var s=new ISSeparator((!icon || icon==""?"brkspace.gif":icon));
  s.id="sep"+ ++this.rt.sepCnt;
  s.container=this;
  s.height=this.btnHeight;
  this.btns[s.id]=s;
  if(this.mgr)this.mgr.btns[s.id]=s;
};

ISTbar.addBreak=function() {
  var s=new ISBreak();
  s.id="brt"+ ++this.rt.brkCnt;
  s.container=this;
  s.height=this.btnHeight;
  this.btns[s.id]=s;
  if(this.mgr)this.mgr.btns[s.id]=s;
};

ISTbar.show=function(x, y) {
  var tb=document.getElementById(this.id);
  tb.style.left=x+"px";
  tb.style.top=y+"px";
  tb.style.display="";
  tb.style.zIndex=100;
  this.rt.active=true;
};

ISTbar.hide=function() {
  var tb=document.getElementById(this.id);
  tb.style.display="none";
  this.rt.active=false;
}

ISTbar.changeState=function() {};
ISTbar.onClick=function(e, s) {
};

ISTbar.render=function() {
  var s=[], j=0;
  s[j++]="<div id='"+this.id+"' style='"+(this.floating?"position:absolute;top:0px;left:0px;display:none":"")+"'><table class='"+this.style.toolbar+"'  cellpadding=0 cellspacing=0 style=\"margin:0px;padding:0px;"+(this.floating?"":"width:100%;")+"\"><tr>";
  if(this.floating) {
    s[j++]="<td unselectable=\"on\" onmousedown=\"$mvmsDown(event, this, '"+this.id+"')\" onmouseover=\"this.style.cursor='move';\" onmouseout=\"this.style.cursor='default'\" style='background-image:url("+this.iconPath+"btndrag.gif)'>";
    s[j++]="&nbsp;</td>";
  }
  s[j++]="<td unselectable='on'>";
  s[j++]="<table cellpadding=0 cellspacing=0 width='100%'><tr><td style='background-image:url("+this.iconPath+"bg.gif);' unselectable='on'>";
  for(var it in this.btns) {
    if(this.btns[it].toHTML) s[j++]=this.btns[it].toHTML();
  }
  s[j++]="</td></tr></table>";  
  s[j++]="</td></tr></table></div>";
  
  return s.join("");
};

/**/
function ISButton(id, icon, text, width, height) {
  this.id=id;
  this.container=null;
  this.state=1;
  this.text=text;
  this.icon=icon;
  this.height=height;
  this.width=width;
  this.type="STD";
  this.domObj=null;
  
  /*set button state, 1=normal, 2=over 3=down 4=active 5=disable*/
  this.setState=function(s) {
    this.state=s;
    var btn=this.domObj;
    if(!btn) { btn=document.getElementById(this.id).childNodes[0];this.domObj=btn;}
    btn.style.top=-this.height*(s-1)+"px";
  };
  
  this.toHTML=function() {
    var s=[], j=0, tbId=this.container.id;
    s[j++]="<table cellpadding=0 cellspacing=0 align='left' style='margin:0px'><tr><td unselectable='on' style='text-align:left;padding:0px;padding-right:0px;VERTICAL-ALIGN: top;margin-left:0;margin-right:1px;margin-bottom:1px;width:"+this.width+"px;height:"+this.height+"px;'>";
    s[j++]="<div id=\""+id+"\" style=\"position:absolute;clip:rect(0px "+this.width+"px "+this.height+"px 0px);\" onmouseover=\"$msOver(event, '"+tbId+"', '"+this.id+"')\" onmouseout=\"$msOut(event, '"+tbId+"', '"+this.id+"')\" onmousedown=\"$msDown(event, '"+tbId+"', '"+this.id+"')\" onmouseup=\"$msUp(event, '"+tbId+"', '"+this.id+"')\" >";
    s[j++]="<img unselectable='on' onmousedown='if(event.preventDefault) event.preventDefault();' src=\""+this.container.iconPath+this.icon+"\" style=\"position:relative;top:0px;left:0px\" alt='"+this.text+"' title='"+this.text+"'/>"
    s[j++]="</div>";
    s[j++]="</td></tr></table>";
    
    if (this.type=="DD") s[j++]=isDDs[this.ddId].toHTML();
    return s.join("");
  };
};

function ISToggleButton(id, group, checked, icon, text, width, height) {
  this.constr=ISButton;
  this.constr(id, icon, text, width, height);
  delete this.constr;
  
  this.type="TGL";
  this.checked=checked;
  this.group=group;
};

function ISSeparator(icon) {
  this.icon=icon;
  this.height=25;
  
  this.toHTML=function() {
    var s=[], j=0;
    s[j++]="<table align=left cellpadding=0 cellspacing=0 style='table-layout:fixed;'><tr>";
    s[j++]="<td unselectable='on' style='padding:0px;padding-left:0px;padding-right:0px;VERTICAL-ALIGN:top;margin-bottom:1px;width:5px;height:"+this.height+"px;'><img unselectable='on' src='"+this.container.iconPath+this.icon+"' width='5px'></td>";
    s[j++]="</tr></table>";
    return s.join("");
  }
};

function ISBreak() {  
  this.toHTML=function() {
    var s=[], j=0;
    s[j++]="</td></tr><tr><td style='height:2px'></td></tr><tr><td style='background-image:url("+this.container.iconPath+"bg.gif);height:"+this.height+"px'>";
    return s.join("");
  };
};

function ISDropdownButton(id, ddId, icon, text, width, height) {
  this.constr=ISButton;
  this.constr(id, icon, text, width, height);
  delete this.constr;
  
  this.type="DD";

  this.ddId=ddId;
};

var isDDs=new Object();
function ISDropdown(id) {
  this.id=id;
  this.items=new Object();
  this.maxRowItems=15;
  this.iconPath="";
  
  this.add=function(it) { this.items[it.id]=it; it.container=this;};
  this.addItem=function(id, text, icon) {
    this.add(new ISDropdownItem(id, text, icon));
  };
  
  this.enableItem=function(id, f){
    this.items[id].enable=f;
    document.getElementById(id).className=(f?"isdd_norm":"isdd_disb");
  };
  
  this.selectItem=function(id, f) {
    this.clearSelection();
    this.items[id].selected=f;
    document.getElementById(id).className=(f?"isdd_sel":"isdd_norm");
  };
  
  this.clearSelection=function() {
    for(var it in this.items) {
      if(this.items[it].selected) {
        document.getElementById(it).className="isdd_norm";
        this.items[it].selected=false;
      }
    }
  }
  
  this.toHTML=function() {
    var s=[], j=0; it=null; 
    s[j++]="<table id='"+this.id+"' cellpadding=0 cellspacing=0 style='line-height:normal;z-index:1;display:none;position:absolute;border:#80788D 1px solid; cursor:default;background-color:#fbfbfd;' unselectable=on><tr><td>";
    s[j++]="<table cellpadding=0 cellspacing=0>";
    var r=1;
    for (var i in this.items) {
      it=this.items[i];
      if (!it.toHTML) continue;
      s[j++]=it.toHTML();
      if (r%this.maxRowItems==0) {
        s[j++]="</table>";
        s[j++]="</td><td valign=top style='padding:0px;border-left:#80788D 1px solid'>";
        s[j++]="<table cellpadding=0 cellspacing=0>";
      }
      r++;
    }
    s[j++]="</table></td></tr></table>";
    return s.join("");
  };
  
  this.onClick=function(itId) {}
  
  isDDs[id]=this;
};

function ISDropdownItem(id, text, icon) {
  this.id=id;
  this.text=text;
  this.icon=icon?icon:null;
  this.enable=true;
  this.selected=false;
  this.container=null;
  this.toHTML=function() {
    return "<tr><td id='"+this.id+"' onclick=\"$ddmsClick('"+this.container.id+"', '"+this.id+"', this)\" class='"+(this.enable?"isdd_norm":"isdd_disb")+"' onmouseover=\"$ddmsOver('"+this.container.id+"', '"+this.id+"', this)\" onmouseout=\"$ddmsOut('"+this.container.id+"', '"+this.id+"', this)\" unselectable=on nowrap>"
    + (this.icon?"<img style='vertical-align:middle;margin-right:2px;' src='"+this.container.iconPath+this.icon+"' />":"")
    + "<span unselectable='on'>" + this.text + "</span>"
    + "</td></tr>";
  }
};

function ISCustomDDItem(id, s) { 
  this.id=id;
  this.html=s;
  this.toHTML=function() {return ("<tr><td>"+this.html+"</td></tr>"); } 
};

/*------------------*/

/*floating functions*/
function $mvmsDown(e, el, tbId) {
  var tb=isTbars[tbId];
  tb.rt.clOff=(isIE?[e.offsetX, e.offsetY]:[e.layerX, e.layerY]);
  
  var d=document, de=d.documentElement;
  tb.rt.scrl1=(isIE?(de?[de.scrollLeft, de.scrollTop]:[d.body.scrollLeft, d.body.scrollTop]):[window.scrollX, window.scrollY]);

  d.onmousemove=function(e) {$tbStartDrag_1((isIE?event:e), tb, document.getElementById(tbId));}
  d.onmouseup=function(e) {$tbEndDrag((isIE?event:e), tb)}
  d.onselectstart=function() { return false;}
  d.onmousedown=function() { return false;}
  d.ondragstart=function() { return false;}  
  
  d=tb.rt.document;
  //tb.rt.scrl2=(isIE?[d.body.scrollLeft, d.body.scrollTop]:[d.body.scrollX, d.body.scrollY]);
  if(d) {
    d.onmousemove=function(e) {$tbStartDrag_2((isIE?d.parentWindow.event:e), tb, document.getElementById(tbId));}
    d.onmouseup=function(e) {$tbEndDrag((isIE?d.parentWindow.event:e), tb)}
    d.onselectstart=function() { return false;}
    d.onmousedown=function() { return false;}
    d.ondragstart=function() { return false;}   
  }
};

function $tbStartDrag_1(e, tb, oTb) {
  //window.status="x:"+(e.clientX)+"-y:"+(e.clientY);
  oTb.style.left=e.clientX-tb.rt.clOff[0]+tb.rt.scrl1[0] + "px";
  oTb.style.top=e.clientY-tb.rt.clOff[1]+tb.rt.scrl1[1] + "px";
};

function $tbStartDrag_2(e, tb, oTb) {
  //window.status="x:"+(e.clientX)  + "-y:"+(e.clientY);
  oTb.style.left=e.clientX-tb.rt.clOff[0]+tb.rt.docOff[0]+ "px";
  oTb.style.top=e.clientY-tb.rt.clOff[1]+tb.rt.docOff[1]+ "px";
};


function $tbEndDrag(e, tb) {
  //var d=tb.rt.document;
  var d=[document, tb.rt.document];
  for (var i=0;i<d.length;i++) {
    if (!d[i]) continue;
    d[i].onmousemove=null;
    d[i].onmouseup=null;
    d[i].onmousedown=function() { return true;}
    d[i].onselectstart=function() { return true;}
    d[i].onselectstart=function() { return true;}      
  }
};

function $ddmsOver(ddId, id, t) {
  var it=isDDs[ddId].items[id];
  if(!it.enable || it.selected)return;
  t.className="isdd_over";
};

function $ddmsOut(ddId, id, t) {
  var it=isDDs[ddId].items[id];
  if(!it.enable || it.selected)return;
  t.className="isdd_norm";
};

function $ddmsClick(ddId, id, t) {
  if(!isDDs[ddId].items[id].enable)return;
  isDDs[ddId].selectItem(id, true);
  hideDD(ddId);
  isDDs[ddId].onClick(id);
};

/*end of floating functions*/

var $bCancel=false;
function $msOver(e, tbId, btnId) {
  var btn=isTbars[tbId].btns[btnId];
  if(btn.state==1) btn.setState(2);
};

function $msOut(e, tbId, btnId) {
  var btn=isTbars[tbId].btns[btnId];
  if(btn.state==3) {$bCancel=true;}
  if(btn.state==2) btn.setState(1);
};

function $msDown(e, tbId, btnId) {
  var btn=isTbars[tbId].btns[btnId];
  if(btn.state!=5) btn.setState(3);
};

function $msUp(e, tbId, btnId) {
  var tbar=isTbars[tbId];
  var btn=tbar.btns[btnId];
  if($bCancel) {$bCancel=false; btn.setState(1); return false;}
  if(btn.state==5) return false;
  if (btn.type=="STD") {
    btn.setState(2);
    tbar.onClick(btnId);
  } else if(btn.type=="TGL") { 
    if (btn.group!=null && btn.group!="") {
      //find all other button with the same group and set 
      var tBtn=null;
      for (var it in tbar.btns) {
        tBtn=tbar.btns[it];
        if(!tBtn.id) continue;
        if (tBtn.group==btn.group && tBtn.id!=btn.id) {tBtn.setState(1); tBtn.checked=false;}
      }
    }
    //toggle button      
    btn.setState(btn.checked?2:4);
    btn.checked=!btn.checked;
    tbar.onClick(btnId);
  } else if(btn.type=="DD") {
    tbar.onClick(btnId);
    showDD(tbId, btnId, btn.ddId);
    btn.setState(2);
  }
  return true;
};

function showDD(tbId, btnId, ddId) {
  hideAllDD();
  
  var btn=document.getElementById(btnId);
  var dd=document.getElementById(ddId);
  var tmp=btn; var x=0, y=0;
  x=btn.offsetLeft; y=btn.offsetTop;
  dd.style.left=x+"px";
  dd.style.top=y+25+"px";
  dd.style.display="block";

  if (!isDDs[ddId].container) isDDs[ddId].container=isTbars[tbId].btns[btnId];
};

function hideDD(ddId) {
  if (document.getElementById(ddId)) document.getElementById(ddId).style.display="none";
};

function hideAllDD() {
  for (var tId in isDDs) { hideDD(tId); }
};
/*--------------------*/

var isTGroups=new Object();

function ISToolbarGroup(id) {
  this.id=id;
  this.mgr=null;
  this.grps=new Object();
  this.visible=true;
  
  isTGroups[id]=this;
}
var ISTbarGrp=ISToolbarGroup.prototype;

ISTbarGrp.addGroup=function(id, name, tbId) {
  var g=new ISGroup(id, name, tbId);
  this.grps[id]=g;
};

ISTbarGrp.render=function() {
  var s=[], j=0;
  s[j++]="<table id='"+this.id+"' cellpadding=0 cellspacing=0 border=0 style='"+(this.visible?"":"display:none;")+"'><tr>";
  for (var it in this.grps) {
    if(this.grps[it].render) {
      s[j++]="<td unselectable='on'>"+this.grps[it].render()+"</td>";
    }
  }  
  s[j++]="</tr></table>";
  return s.join("");
};

ISTbarGrp.setVisibility=function(b) {
  this.visible=b;
  var e=document.getElementById(this.id);
  if(e) e.style.display=(b?"":"none");
};

function ISGroup(id, name, tbId) {
  this.id=id;
  this.name=name;
  this.tbId=tbId;
  return this;
};

ISGroup.prototype.render=function() {
  var s=[], j=0;
  s[j++]="<table cellpadding=0 cellspacing=0 style='margin-right:3px;font-size:8px;' unselectable='on'>";
  s[j++]="<tr><td class='bdrgrptopleft'>&nbsp;</td><td class='bdrgrptop'></td><td class='bdrgrptopright'>&nbsp;</td></tr>";
  s[j++]="<tr><td colspan='3' width='100%'>";
  
  s[j++]="<table cellpadding=0 cellspacing=0 class='isgroup' width='100%' style='font-size:8px;'><tr><td class='bdrgrpleft'></td><td class='isgroupcontent' unselectable='on'>";
  s[j++]=isTbars[this.tbId].render();
  s[j++]="</td><td class='bdrgrpright'></td></tr>";  
  //s[j++]="<tr><td class='bdrgrpleft'></td><td class='isgrouptitle' align='center'>";
  //s[j++]=this.name;
  //s[j++]="</td><td class='bdrgrpright'></td></tr>";
  s[j++]="</table>";
  
  s[j++]="</td></tr>";
  s[j++]="<tr><td class='bdrgrpbottomleft'>&nbsp;</td><td class='bdrgrpbottom'></td><td class='bdrgrpbottomright'>&nbsp;</td></tr>";
  s[j++]="</table>";
  

  return s.join("");  
};

/*--------------------*/
var isTabs=new Object();

function ISTabCtl(id) {
  this.id=id;
  this.mgr=null;
  this.tabs=new Object();
  this.tabIdx=[];
  this.selTab=null;
  isTabs[id]=this;
  return this;
};

function ISTab(id, capt, obj) {
  this.id=id;
  this.capt=capt;
  this.obj=obj;
  this.selected=false;
  return this;
};

ISTab.prototype.render=function() {
  var s=[], j=0, sf=(this.selected?"sel":"")
  s[j++]="<table id='"+this.id+"' cellpadding=0 cellspacing=0 class='istab' align='left' onclick=\"isTabs."+this.tab.id+".setTab('"+this.id+"')\" style='cursor:default;' unselectable='on'><tr>";
  s[j++]="<td class='tableft"+sf+"' width='5px'></td>";
  s[j++]="<td class='tabtitle"+sf+"' unselectable='on'>"+this.capt+"</td>";
  s[j++]="<td class='tabright"+sf+"' width='5px'></td>";
  s[j++]="</tr></table>";
  return s.join("");    
};

ISTabCtl.prototype.addTab=function(id, capt, obj) {
  var t=new ISTab(id, capt, obj);
  t.tab=this;
  this.tabs[id]=t;
  if(this.tabIdx.length==0) this.selTab=id;
  this.tabIdx[this.tabIdx.length]=id;
};

ISTabCtl.prototype.render=function() {
  var s=[], j=0, o=null;
  s[j++]="<table cellpadding=0 cellspacing=0 class='istabctl'><tr><td class='bdrtabtopleft' unselectable='on'></td><td class='bdrtabtop' unselectable=\"on\">";
  for (var it in this.tabs) {
    o=this.tabs[it];
    if(!o.render) continue;
    o.selected=(this.selTab==o.id);
    s[j++]=o.render(); 
  }
  s[j++]="</td><td class='bdrtabtopright'></td></tr>";
  s[j++]="<tr><td class='bdrtableft' style='font-size:7pt'>&nbsp;</td><td class='tabcontent' unselectable='on'>";
  if(!isIE)s[j++]="<div style='position:relative'>";
  for (var it in this.tabs) { 
    o=this.tabs[it].obj;
    if(!o) continue;
    o.visible=(this.selTab==this.tabs[it].id);
    s[j++]=this.tabs[it].obj.render(); 
  }
  if(!isIE)s[j++]="</div>";
  s[j++]="</td><td class='bdrtabright' style='font-size:7pt'>&nbsp;</td></tr>";
  s[j++]="<tr><td class='bdrtabbottomleft'></td><td class='bdrtabbottom'></td><td class='bdrtabbottomright'></td></tr>";
  s[j++]="</table>";
  return s.join("");
};

ISTabCtl.prototype.setTab=function(id) {
  //current selected
  var t=document.getElementById(this.selTab);
  if (t) {
    t.rows[0].cells[0].className="tableft";
    t.rows[0].cells[1].className="tabtitle";
    t.rows[0].cells[2].className="tabright";
  }
  this.tabs[this.selTab].selected=false;
  this.tabs[this.selTab].obj.setVisibility(false);
  
  t=document.getElementById(id);
  t.rows[0].cells[0].className="tableftsel";
  t.rows[0].cells[1].className="tabtitlesel";
  t.rows[0].cells[2].className="tabrightsel";
  this.tabs[id].selected=true; 
  this.tabs[id].obj.setVisibility(true);
  this.selTab=id;
};
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL   1                                                                            **/
/** /var/www/dosdauter.de/www/htdocs/editor/scripts/moz/editor.js                                        **/
/**                                                                                                      **/
/**********************************************************************************************************/

/***********************************************************
InnovaStudio WYSIWYG Editor 3.6
© 2008, InnovaStudio (www.innovastudio.com). All rights reserved.
************************************************************/

var editor = new Array();

/*** Utility Object ***/
var oUtil=new InnovaEditorUtil();
function InnovaEditorUtil()
    {
    /*** Localization ***/
  this.langDir="en-US";
  this.scriptPath = "/editor/scripts/moz/"; /*moz - default */
  try{if(LanguageDirectory)this.langDir=LanguageDirectory;}catch(e){;}
   
  /*** /Localization ***/
  
    this.oName;
    this.oEditor;
    this.obj;
    this.oSel;
    this.sType;
    this.bInside=bInside;
    this.useSelection=true;
    this.arrEditor=[];
    this.onSelectionChanged=function(){return true;};
    this.activeElement;
    this.activeModalWin;
    this.setEdit = setEdit;
    this.bOnLoadReplaced=false;
    
    this.spcCharCode=[[169, "&copy;"],[163, "&pound;"],[174, "&reg;"],[233, "&eacute;"],[201, "&Eacute;"],[8364,"&euro;"]];
    this.spcChar=[];
    for(var i=0;i<this.spcCharCode.length;i++)
      {
      this.spcChar[i]=[new RegExp(String.fromCharCode(this.spcCharCode[i][0]), "g"), this.spcCharCode[i][1]];
      }

    this.replaceSpecialChar=function(sHTML) 
      {
      for(var i=0;i<this.spcChar.length;i++)
        {
        sHTML=sHTML.replace(this.spcChar[i][0], this.spcChar[i][1]);
        }
      return sHTML;
      }
    
    }

/*** Focus stuff ***/
function bInside(oElement)
    {
    while(oElement!=null)
        {
        if(oElement.designMode && oElement.designMode=="on")return true;
        oElement=oElement.parentNode;
        }
    return false;
    }

function checkFocus()
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    var parent = getSelectedElement(oSel);
    if(parent!=null)
        {
        if(!bInside(parent))return false;
        }
    else
        {
        if(!bInside(parent))return false;
        }
    return true;
    }

function iwe_focus()
    {
    var oEditor=document.getElementById("idContent"+this.oName);
    if(oEditor) oEditor.contentWindow.focus();
    }

/*** setEdit ***/
function setEdit(oName) 
  {
  if ((oName != null) && (oName!="")) 
    {
    try 
      { 
      var wnd=document.getElementById("idContent"+oName);
      wnd.contentDocument.designMode="on";
      wnd.focus();
      } catch(e) {}
    }
  else 
    {
    for (var i=0; i<this.arrEditor.length; i++)
      {
      try 
        {
          var wnd=document.getElementById("idContent"+this.arrEditor[i]).contentWindow;
          wnd.document.designMode="on";
          var r = wnd.getSelection().getRangeAt(0);
          r.selectNode(wnd.document.getElementsByTagName("Body")[0]);
          r.collapse(true);
          wnd.focus();
        } catch(e) {}
      }
    }
  }

/*** icons related ***/
var iconHeight;

/*** EDITOR OBJECT ***/
function InnovaEditor(oName)
    {
    this.oName=oName;
    this.init=initISEditor;
    this.RENDER=RENDER;

    this.loadHTML=loadHTML;
    this.loadHTMLFull=loadHTMLFull;
    this.getHTMLBody=getHTMLBody;
    this.getHTML=getHTML;
    this.getXHTMLBody=getXHTMLBody;
    this.getXHTML=getXHTML;
    this.getTextBody=getTextBody;
    this.putHTML=putHTML;//source dialog
    this.css="";
    
    this.onKeyPress=function(){return true;};
    
  this.styleSelectionHoverBg="#acb6bf";
    this.styleSelectionHoverFg="white";
    
  //clean
  this.cleanEmptySpan=cleanEmptySpan;
  this.cleanFonts=cleanFonts;
  this.cleanTags=cleanTags;
  this.replaceTags=replaceTags;
  this.cleanDeprecated=cleanDeprecated;
    
  this.doClean=doClean;
  this.applySpanStyle=applySpanStyle;

    this.bInside=bInside;
    this.checkFocus=checkFocus;
    this.focus=iwe_focus;

    this.doCmd=doCmd;
    this.applyParagraph=applyParagraph;
    this.applyFontName=applyFontName;
    this.applyFontSize=applyFontSize;
    this.applyBullets=applyBullets;
    this.applyNumbering=applyNumbering;
    this.applyJustifyLeft=applyJustifyLeft;
    this.applyJustifyCenter=applyJustifyCenter;
    this.applyJustifyRight=applyJustifyRight;
    this.applyJustifyFull=applyJustifyFull;
    this.applyBlockDirLTR=applyBlockDirLTR;
    this.applyBlockDirRTL=applyBlockDirRTL;
    this.applySpan=applySpan;
    this.makeAbsolute=makeAbsolute;
    this.insertHTML=insertHTML;
    this.clearAll=clearAll;
    this.insertCustomTag=insertCustomTag;
    this.selectParagraph=selectParagraph;

    this.useB=false;//not used

    this.hide=hide;

    this.width="560px";
    this.height="350px";
    this.publishingPath="";//ex."http://localhost/innovastudio/"

   this.scriptPath = "/editor/scripts/moz/"; /*moz - default */
  /*** icons related ***/
    this.iconPath="icons/";
    this.iconWidth=23; //25;
    this.iconHeight=25; //22;
  /*** /icons related ***/
  
    this.dropTopAdjustment_moz=0;
    this.dropLeftAdjustment_moz=0;
    this.heightAdjustment=0;  //not use, for IE only

    this.applyColor=applyColor;
    this.customColors=[];//["#ff4500","#ffa500","#808000","#4682b4","#1e90ff","#9400d3","#ff1493","#a9a9a9"];
    this.oColor1 = new ColorPicker("oColor1",this.oName);//to call: oEdit1.oColor1
    this.oColor2 = new ColorPicker("oColor2",this.oName);//rendered id: ...oColor1oEdit1
    this.expandSelection=expandSelection;

    this.useLastForeColor=false;
    this.useLastBackColor=false;
    this.stateForeColor="";
    this.stateBackColor="";

    this.fullScreen=fullScreen;
    this.stateFullScreen=false;

    this.getElm=iwe_getElm;

    this.features=[];
    
    //diff: "Search","Cut","Copy","Paste","Guidelines" 

    /*
    this.buttonMap=["Save","FullScreen","Preview","Print","Search","SpellCheck",
    "Cut","Copy","Paste","PasteWord","PasteText","|","Undo","Redo","|",
    "ForeColor","BackColor","|","Bookmark","Hyperlink",
    "Image","Flash","Media","ContentBlock","InternalLink","InternalImage","CustomObject","|",
    "Table","Guidelines","Absolute","|","Characters","Line",
    "Form","RemoveFormat","HTMLFullSource","HTMLSource","XHTMLFullSource",
    "XHTMLSource","ClearAll","BRK", 
    "StyleAndFormatting","Styles","|","CustomTag","Paragraph","FontName","FontSize","|",
    "Bold","Italic",
    "Underline","Strikethrough","Superscript","Subscript","|",
    "JustifyLeft","JustifyCenter","JustifyRight","JustifyFull","|",
    "Numbering","Bullets","|","Indent","Outdent","LTR","RTL"];//complete, default
    */
    
    this.buttonMap=["Save","FullScreen","Preview","Print","Search","SpellCheck",
    "Cut","Copy","Paste","PasteWord","PasteText","Undo","Redo",
    "ForeColor","BackColor","Bookmark","Hyperlink",
    "Image","Flash","Media","ContentBlock","InternalLink","InternalImage","CustomObject",
    "Table","Guidelines","Absolute","Characters","Line",
    "Form","RemoveFormat","HTMLFullSource","HTMLSource","XHTMLFullSource",
    "XHTMLSource","ClearAll","BRK", 
    "StyleAndFormatting","Styles","CustomTag","Paragraph","FontName","FontSize",
    "Bold","Italic",
    "Underline","Strikethrough","Superscript","Subscript",
    "JustifyLeft","JustifyCenter","JustifyRight","JustifyFull",
    "Numbering","Bullets","Indent","Outdent","LTR","RTL"];//complete, default
    
    //diff: btnSearch, btnCut, btnCopy, btnPaste, btnGuidelines
    this.btnSave=false;this.btnPreview=true;this.btnFullScreen=true;this.btnPrint=false;this.btnSearch=true;
    this.btnSpellCheck=false;this.btnTextFormatting=true;
    this.btnListFormatting=true;this.btnBoxFormatting=true;this.btnParagraphFormatting=true;this.btnCssText=true;this.btnCssBuilder=false;
    this.btnStyles=false;this.btnParagraph=true;this.btnFontName=true;this.btnFontSize=true;
    this.btnCut=true;this.btnCopy=true;this.btnPaste=true;this.btnPasteText=false;this.btnUndo=true;this.btnRedo=true;
    this.btnBold=true;this.btnItalic=true;this.btnUnderline=true;
    this.btnStrikethrough=false;this.btnSuperscript=false;this.btnSubscript=false;
    this.btnJustifyLeft=true;this.btnJustifyCenter=true;this.btnJustifyRight=true;this.btnJustifyFull=true;
    this.btnNumbering=true;this.btnBullets=true;this.btnIndent=true;this.btnOutdent=true;
    this.btnLTR=false;this.btnRTL=false;this.btnForeColor=true;this.btnBackColor=true;
    this.btnHyperlink=true;this.btnBookmark=true;this.btnCharacters=true;this.btnCustomTag=false;
    this.btnImage=true;this.btnFlash=false;this.btnMedia=false;
    this.btnTable=true;this.btnGuidelines=true;
    this.btnAbsolute=true;this.btnPasteWord=true;this.btnLine=true;
    this.btnForm=true;this.btnRemoveFormat=true;
    this.btnHTMLFullSource=false;this.btnHTMLSource=false;
    this.btnXHTMLFullSource=false;this.btnXHTMLSource=true;
    this.btnClearAll=false;

    this.tabs=[
    ["tabHome", "Home", ["grpEdit", "grpFont", "grpPara", "grpInsert", "grpTables"]],
    ["tabStyle", "Objects", ["grpMedia", "grpMisc"]]
    ];

    this.groups=[
    ["grpEdit", "", ["Undo", "Redo", "FullScreen", "RemoveFormat", "BRK", "Cut", "Copy", "Paste", "PasteWord", "PasteText", "XHTMLSource"]],
    ["grpFont", "", ["FontName", "FontSize", "Styles", "BRK", "Bold", "Italic", "Underline", "Strikethrough", "Superscript", "ForeColor", "BackColor"]],
    ["grpPara", "", ["Paragraph", "Indent", "Outdent", "StyleAndFormatting", "BRK", "JustifyLeft", "JustifyCenter", "JustifyRight", "JustifyFull", "Numbering", "Bullets"]],
    ["grpInsert", "", ["Hyperlink", "Bookmark", "BRK", "Image"]],
    ["grpTables", "", ["Table", "BRK", "Guidelines"]],
    ["grpMedia", "", ["Media", "BRK", "Flash"]],
    ["grpMisc", "", ["Characters", "Line", "BRK"]]
    ];

    this.useTab=true;

    //*** CMS FUNCTIONS ***
    this.cmdAssetManager="";

    this.cmdFileManager="";
    this.cmdImageManager="";
    this.cmdMediaManager="";
    this.cmdFlashManager="";

    this.btnContentBlock=false;
    this.cmdContentBlock=";";//needs ;
    this.btnInternalLink=false;
    this.cmdInternalLink=";";//needs ;
    this.insertLink=insertLink;
    this.btnCustomObject=false;
    this.cmdCustomObject=";";//needs ;
    this.btnInternalImage=false;
    this.cmdInternalImage=";";//needs ;
    //**********

    this.arrStyle=[];
    this.isCssLoaded=false;
    this.openStyleSelect=openStyleSelect;

    this.arrParagraph=[[getTxt("Heading 1"),"H1"],
        [getTxt("Heading 2"),"H2"],
        [getTxt("Heading 3"),"H3"],
        [getTxt("Heading 4"),"H4"],
        [getTxt("Heading 5"),"H5"],
        [getTxt("Heading 6"),"H6"],
        [getTxt("Preformatted"),"PRE"],
        [getTxt("Normal (P)"),"P"],
        [getTxt("Normal (DIV)"),"DIV"]];

    this.arrFontName=["Arial","Arial Black","Arial Narrow",
        "Book Antiqua","Bookman Old Style","Century Gothic",
        "Comic Sans MS","Courier New","Franklin Gothic Medium",
        "Garamond","Georgia","Impact","Lucida Console",
        "Lucida Sans","Lucida Unicode","Modern",
        "Monotype Corsiva","Palatino Linotype","Roman",
        "Script","Small Fonts","Symbol","Tahoma",
        "Times New Roman","Trebuchet MS","Verdana",
        "Webdings","Wingdings","serif","sans-serif",
        "cursive","fantasy","monospace"];

    this.arrFontSize=[[getTxt("Size 1"),"1"],
        [getTxt("Size 2"),"2"],
        [getTxt("Size 3"),"3"],
        [getTxt("Size 4"),"4"],
        [getTxt("Size 5"),"5"],
        [getTxt("Size 6"),"6"],
        [getTxt("Size 7"),"7"]];

    this.arrCustomTag=[];//eg.[["Full Name","{%full_name%}"],["Email","{%email%}"]];

    this.docType="";
    this.html="<html>";
    this.headContent="";
    this.preloadHTML="";

    this.onSave=function(){document.getElementById("iwe_btnSubmit"+this.oName).click()};

    this.onFullScreen=function(){return true;};
    this.onNormalScreen=function(){return true;};

    this.initialRefresh=false;//not used

    this.doUndo=doUndo;
    this.doRedo=doRedo;
    this.saveForUndo=saveForUndo;
    this.doUndoRedo=doUndoRedo;

    this.arrUndoList=[];
    this.arrRedoList=[];

    this.useTagSelector=true;
    this.TagSelectorPosition="bottom";
    this.moveTagSelector=moveTagSelector;
    this.selectElement=selectElement;
    this.removeTag=removeTag;
    this.doClick_TabCreate=doClick_TabCreate;
    this.doRefresh_TabCreate=doRefresh_TabCreate;

    this.arrCustomButtons = [["CustomName1","alert(0)","caption here","btnSave.gif"],
                            ["CustomName2","alert(0)","caption here","btnSave.gif"]];

    this.onSelectionChanged=function(){return true;};

    this.spellCheckMode="ieSpell";
    
    this.encodeIO=false;
    this.changeHeight = changeHeight;

    this.REPLACE=REPLACE;
    this.mode="HTMLBody";
    this.idTextArea;

    var me=this;
    this.tbar=new ISToolbarManager(this.oName);

    
    editor[editor.length] = this;
    return this;
    }

/*** Undo/Redo ***/
function saveForUndo()
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var obj=this;
    if(obj.arrUndoList[0])
        if(oEditor.document.body.innerHTML==obj.arrUndoList[0][0])return;
    for(var i=20;i>1;i--)obj.arrUndoList[i-1]=obj.arrUndoList[i-2];
    obj.focus();
    var oSel=oEditor.getSelection();
    var range = oSel.getRangeAt(0);
    obj.arrUndoList[0]=[oEditor.document.body.innerHTML, range.cloneRange()];

    this.arrRedoList=[];//clear redo list

    if(this.btnUndo) this.tbar.btns["btnUndo"+this.oName].setState(1);
    if(this.btnRedo) this.tbar.btns["btnRedo"+this.oName].setState(5);
    }
function doUndo() 
  {
    this.doUndoRedo(this.arrUndoList, this.arrRedoList);
  }

function doRedo() 
  {
    this.doUndoRedo(this.arrRedoList, this.arrUndoList);
  }
function doUndoRedo(listA, listB)
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var obj=this;
    if(!listA[0])return; //return of undo/redo array empty

    for(var i=20;i>1;i--)listB[i-1]=listB[i-2];
    var oSel=oEditor.getSelection();
    var range = oSel.getRangeAt(0);
    listB[0]=[oEditor.document.body.innerHTML, range.cloneRange()];

    sHTML=listA[0][0];

    oEditor.document.body.innerHTML=sHTML;

    oSel = oEditor.getSelection();
    oSel.removeAllRanges();
    oSel.addRange(listA[0][1]);

    for(var i=0;i<19;i++)listA[i]=listA[i+1];
    listA[19]=null;
    realTime(this);
    }

/*** RENDER ***/
var bOnSubmitOriginalSaved=false;
function REPLACE(idTextArea, dvId)
  {
  this.idTextArea=idTextArea;
  var oTextArea=document.getElementById(idTextArea);
  oTextArea.style.display="none";
  var oForm=oTextArea.form;
  if(oForm)
    {
    if(!bOnSubmitOriginalSaved)
      {
      if(oForm.onsubmit)
      onsubmit_original=oForm.onsubmit;
      
      bOnSubmitOriginalSaved=true;  
      }
    oForm.onsubmit = new Function("return onsubmit_new()");
    }

  var sContent=document.getElementById(idTextArea).value;
  sContent=sContent.replace(/&/g,"&amp;");
  sContent=sContent.replace(/</g,"&lt;");
  sContent=sContent.replace(/>/g,"&gt;");

  this.RENDER(sContent, dvId);
  }
function onsubmit_new()
  {
  var sContent;
  for(var i=0;i<oUtil.arrEditor.length;i++)
    {
    var oEdit=eval(oUtil.arrEditor[i]);
    if(oEdit.mode=="HTMLBody")sContent=oEdit.getHTMLBody();
    if(oEdit.mode=="HTML")sContent=oEdit.getHTML();
    if(oEdit.mode=="XHTMLBody")sContent=oEdit.getXHTMLBody();
    if(oEdit.mode=="XHTML")sContent=oEdit.getXHTML();
    document.getElementById(oEdit.idTextArea).value=sContent;
    }
  if(onsubmit_original)return onsubmit_original();
  }
function onsubmit_original(){}

function RENDER(sPreloadHTML, dvId)
    {
  /*** icons related ***/
  iconHeight=this.iconHeight;
  
    /*** Tetap Ada (For downgrade compatibility) ***/    
    if(sPreloadHTML.substring(0,4)=="<!--" &&
  sPreloadHTML.substring(sPreloadHTML.length-3)=="-->")
  sPreloadHTML=sPreloadHTML.substring(4,sPreloadHTML.length-3);

  if(sPreloadHTML.substring(0,4)=="<!--" &&
  sPreloadHTML.substring(sPreloadHTML.length-6)=="--&gt;")
  sPreloadHTML=sPreloadHTML.substring(4,sPreloadHTML.length-6);
  
  /*** Converting back HTML-encoded content (kalau tdk encoded tdk masalah) ***/  
  sPreloadHTML=sPreloadHTML.replace(/&lt;/g,"<");
  sPreloadHTML=sPreloadHTML.replace(/&gt;/g,">");
  sPreloadHTML=sPreloadHTML.replace(/&amp;/g,"&");

  /*** enable required buttons ***/
  if(this.cmdContentBlock!=";")this.btnContentBlock=true;
  if(this.cmdInternalLink!=";")this.btnInternalLink=true;
  if(this.cmdInternalImage!=";")this.btnInternalImage=true; 
  if(this.cmdCustomObject!=";")this.btnCustomObject=true;
  if(this.arrCustomTag.length>0)this.btnCustomTag=true;
  if(this.mode=="HTMLBody"){this.btnXHTMLSource=true;this.btnXHTMLFullSource=false;}
  if(this.mode=="HTML"){this.btnXHTMLFullSource=true;this.btnXHTMLSource=false;}
  if(this.mode=="XHTMLBody"){this.btnXHTMLSource=true;this.btnXHTMLFullSource=false;}
  if(this.mode=="XHTML"){this.btnXHTMLFullSource=true;this.btnXHTMLSource=false;}

    /*** features ***/
    var bUseFeature=false;
    if(this.features.length>0)
        {
        bUseFeature=true;
        for(var i=0;i<this.buttonMap.length;i++)
            eval(this.oName+".btn"+this.buttonMap[i]+"=true");//ex: oEdit1.btnStyleAndFormatting=true (no problem), oEdit1.btn|=true (no problem), oEdit1.btnBRK=true (no problem)

        this.btnTextFormatting=false;this.btnListFormatting=false;
        this.btnBoxFormatting=false;this.btnParagraphFormatting=false;
        this.btnCssText=false;this.btnCssBuilder=false;
        for(var j=0;j<this.features.length;j++)
            eval(this.oName+".btn"+this.features[j]+"=true");//ex: oEdit1.btnTextFormatting=true

        for(var i=0;i<this.buttonMap.length;i++)
            {
            sButtonName=this.buttonMap[i];          
            bBtnExists=false;
            for(var j=0;j<this.features.length;j++)
                if(sButtonName==this.features[j])bBtnExists=true;//ada;

            if(!bBtnExists)//tdk ada; set false
                eval(this.oName+".btn"+sButtonName+"=false");//ex: oEdit1.btnBold=false, oEdit1.btn|=false (no problem), oEdit1.btnBRK=false (no problem)
            }
        //Remove:"TextFormatting","ListFormatting",dst.=>tdk perlu(krn diabaikan)
        this.buttonMap=this.features;
        }
    /*** /features ***/

    this.preloadHTML=sPreloadHTML;

    var sHTMLDropMenus="";
    var sHTMLIcons="";
    var sTmp="";

    //Render Color Picker (forecolor)
    this.oColor1.url=this.scriptPath+"color_picker_fg.htm";
    this.oColor1.onShow = new Function(this.oName+".hide()");
    this.oColor1.onMoreColor = new Function(this.oName+".hide()");
    this.oColor1.onPickColor = new Function(this.oName+".applyColor('ForeColor', "+this.oName+".oColor1.color)");
    this.oColor1.onRemoveColor = new Function(this.oName+".applyColor('ForeColor','')");
    this.oColor1.txtCustomColors=getTxt("Custom Colors");
    this.oColor1.txtMoreColors=getTxt("More Colors...");
    
    //Render Color Picker (backcolor)
    this.oColor2.url=this.scriptPath+"color_picker_bg.htm";
    this.oColor2.onShow = new Function(this.oName+".hide()");
    this.oColor2.onMoreColor = new Function(this.oName+".hide()");
    this.oColor2.onPickColor = new Function(this.oName+".applyColor('hilitecolor', "+this.oName+".oColor2.color)");
    this.oColor2.onRemoveColor = new Function(this.oName+".applyColor('HiliteColor','')");
    this.oColor2.txtCustomColors=getTxt("Custom Colors");
    this.oColor2.txtMoreColors=getTxt("More Colors...");
    
    var me=this;

    if(this.useTab && this.tabs) {
      var tmp=null, tmpTb, grpMap=new Object();
      //create toolbar.
      for (var i=0;i<this.buttonMap.length;i++) {
        eval(this.oName+".btn"+this.buttonMap[i]+"=false");
      }
      for (var i=0; i<this.groups.length;i++) {
        tmp=this.groups[i];
        tmpTb=this.tbar.createToolbar(this.oName+"tbar"+tmp[0]);
        tmpTb.onClick=function(id) {tbAction(tmpTb, id, me, me.oName);};
        tmpTb.style.toolbar="main_istoolbar";
        tmpTb.iconPath=this.scriptPath.substring(0, this.scriptPath.indexOf("moz/"))+this.iconPath;
        tmpTb.btnWidth=this.iconWidth;
        tmpTb.btnHeight=this.iconHeight;
        for (var j=0;j<tmp[2].length;j++) {
          eval(this.oName+".btn"+tmp[2][j]+"=true");
        }
        buildToolbar(tmpTb, this, tmp[2]);
        grpMap[tmp[0]]=tmp[1];
      }

      //create tab
      var eTab=this.tbar.createTbTab("tabCtl"+this.oName), tmpGrp;
      for(var i=0; i<this.tabs.length; i++) {
        tmp=this.tabs[i];
        tmpGrp=this.tbar.createTbGroup(this.oName+"grp"+tmp[0]);
        for (var j=0; j<tmp[2].length;j++) {
          tmpGrp.addGroup(this.oName+tmp[2][j], grpMap[tmp[2][j]] , this.oName+"tbar"+tmp[2][j]);
        }
        eTab.addTab(this.oName+tmp[0], tmp[1], tmpGrp);
      }

    } else {
      var orTb=this.tbar.createToolbar(this.oName);  
        orTb.onClick=function(id) {tbAction(orTb, id, me, me.oName);};
        //orTb.style.toolbar="main_istoolbar";
        orTb.iconPath=this.scriptPath.substring(0, this.scriptPath.indexOf("moz/"))+this.iconPath;
        orTb.btnWidth=this.iconWidth;
        orTb.btnHeight=this.iconHeight;
        buildToolbar(orTb, this, this.buttonMap);
    }

    var sHTML="";
    var icPath=this.scriptPath.substring(0, this.scriptPath.indexOf("moz/"))+this.iconPath;    

    if(!document.getElementById("id_refresh_z_index"))
        sHTML+="<div id=id_refresh_z_index style='margin:0px'></div>";

    sHTML+="<table id=idArea"+this.oName+" name=idArea"+this.oName+" border='0px' "+
            "cellpadding=0 cellspacing=0 width='"+this.width+"' height='"+this.height+"'>"+
            "<tr><td colspan=2 style=\"padding:0px;padding-left:1px;border:#cfcfcf 0px solid;background:url('"+icPath+"bg.gif')\">"+
            "<table cellpadding=0 cellspacing=0 border=0 width=100%><tr><td dir=ltr style='padding:0px;'>"+
            this.tbar.render()+
            "</td></tr></table>"+
            "</td></tr>"+
            "<tr id=idTagSelTopRow"+this.oName+"><td colspan=2 id=idTagSelTop"+this.oName+" height=0px style='padding:0px;'></td></tr>";


    sHTML+="<tr style='width:100%;height:100%'><td colspan=2 valign=top height=100% style='padding:0px;background:white;padding-right:2px'>";
    
    sHTML+="<table id='cntContainer"+this.oName+"' cellpadding=0 cellspacing=0 width=100% height=100%><tr style='width:100%;height:100%'><td width='100%' height='100%' style='padding:0px;'>";//StyleSelect

    sHTML+="<iframe style='width:100%;height:100%;margin-top:1px;border:solid 1px #cfcfcf' "+
            " name=idContent"+ this.oName + " id=idContent"+this.oName+ "></iframe>";

    sHTML+="<iframe style='width:1px;height:1px;overflow:auto;border:0px' id=\"myStyle"+this.oName+"\" name=\"myStyle"+this.oName+"\" src='"+this.scriptPath+"blank.gif'></iframe>";

    sHTML+="</td><td id=idStyles"+this.oName+" style='padding:0px;background:#E9E8F2'></td></tr></table>"//StyleSelect

    sHTML+="</td></tr>";
    sHTML+="<tr id=idTagSelBottomRow"+this.oName+"><td colspan=2 id=idTagSelBottom"+this.oName+" style='padding:0px;'></td></tr>";
    sHTML+="</table>";

    sHTML+=sHTMLDropMenus;//dropdown
    
    sHTML+="<input type=submit name=iwe_btnSubmit"+this.oName+" id=iwe_btnSubmit"+this.oName+" value=SUBMIT style='display:none' >";//hidden submit button

    if(dvId) {
      var edtStr=[];
      edtStr[0]=sHTML;
      document.getElementById(dvId).innerHTML=edtStr.join("");
    } else {
      document.write(sHTML);
    }
       
    var clPick=document.getElementById("isClPiker"+this.oName);
    if(!clPick) { 
      clPick = document.createElement("DIV");
      clPick.id="isClPiker"+this.oName;
      clPick.innerHTML=this.oColor1.generateHTML() + this.oColor2.generateHTML();
      document.body.insertBefore(clPick, document.body.childNodes[0]);
    }
    

    var me=this;
    setTimeout(function() {me.init()},10);
 
    }

function initISEditor() {

    if(this.useTagSelector)
        {
        if(this.TagSelectorPosition=="bottom")this.TagSelectorPosition="top";
        else this.TagSelectorPosition="bottom";
        this.moveTagSelector()
        }

    var oEditor = document.getElementById("idContent"+this.oName).contentWindow;

    oUtil.oName=this.oName;//default active editor
    oUtil.oEditor=oEditor;
    oUtil.obj=this;

    oUtil.arrEditor.push(this.oName);

    try { oEditor.document.designMode="on"; } catch(e) {}

    var arrA = String(this.preloadHTML).match(/<HTML[^>]*>/ig);
    if(arrA)
        {//full html
          this.loadHTMLFull(this.preloadHTML);
        }
    else
        {
        this.loadHTML(this.preloadHTML);
        }

    /***** Replace current body onload ******/
    if(!oUtil.bOnLoadReplaced)
      {
      if(window.onload)onload_original=window.onload;
      window.onload = new Function("onload_new()");
      oUtil.bOnLoadReplaced=true;
      }
    /****************************************/

    this.focus();
    
    try {
      var cnt = oEditor.document.body.innerHTML;
      cnt = cnt.replace(/\s+/gi, "");
      if(cnt=="") {
        oEditor.document.body.innerHTML="<br class=\"innova\" />";
      }
      
      var range = oEditor.document.createRange();
      range.selectNode(oEditor.document.body.childNodes[0]);
      range.collapse(true);
      
      var sel = oEditor.getSelection();
      sel.removeAllRanges();
      sel.addRange(range);      
      
    } catch (e) {}
    
    this.focus();
}

function buildToolbar(tb, oEdt, btnMap) {
  var oName=oEdt.oName;
  
  for(var i=0;i<btnMap.length;i++)
    {
    sButtonName=btnMap[i];
    switch(sButtonName)
      {
      case "|":
          tb.addSeparator();
          break;
      case "BRK":
          tb.addBreak();
          break;
      case "Save":
          if(oEdt.btnSave)tb.addButton("btnSave"+oName, "btnSave.gif", getTxt("Save"));
          break;
      case "Preview":
          if(oEdt.btnPreview) {
            tb.addDropdownButton("btnPreview"+oName, "ddPreview"+oName, "btnPreview.gif",getTxt("Preview"));
            var pvDD=new ISDropdown("ddPreview"+oName); 
            pvDD.addItem("btnPreview1"+oName, "640x480");
            pvDD.addItem("btnPreview2"+oName, "800x600");
            pvDD.addItem("btnPreview3"+oName, "1024x768");
            pvDD.onClick=function(id) {ddAction(tb, id, oEdt, oEdt.oName)};
          }
          break;
      case "FullScreen":
          if(oEdt.btnFullScreen)tb.addButton("btnFullScreen"+oName, "btnFullScreen.gif",getTxt("Full Screen"));
          break;
      case "Print":
          if(oEdt.btnPrint)tb.addButton("btnPrint"+oName,"btnPrint.gif",getTxt("Print"));
          break;
      case "Search":
        if(oEdt.btnSearch)tb.addButton("btnSearch"+oName,"btnSearch.gif",getTxt("Search"));
        break;
      case "SpellCheck":
        if(oEdt.btnSpellCheck)
          {
          if (oEdt.spellCheckMode!="ieSpell") tb.addButton("btnSpellCheck"+oName, "btnSpellCheck.gif",getTxt("Check Spelling"));
          }
        break;
      case "StyleAndFormatting":
        if(oEdt.btnTextFormatting||oEdt.btnParagraphFormatting||oEdt.btnListFormatting||oEdt.btnBoxFormatting||oEdt.btnCssText||oEdt.btnCssBuilder) {
          tb.addDropdownButton("btnStyleAndFormat"+oName, "ddFormatting"+oName, "btnStyle.gif",getTxt("Styles & Formatting"));
          var ddFmt=new ISDropdown("ddFormatting"+oName);
          ddFmt.iconPath = tb.iconPath;
          ddFmt.onClick=function(id) {ddAction(tb, id, oEdt, oEdt.oName)};
          if(oEdt.btnTextFormatting) ddFmt.addItem("btnTextFormatting"+oName, getTxt("Text Formatting"), "btnTextFormatting.gif"); 
          if(oEdt.btnParagraphFormatting) ddFmt.addItem("btnParagraphFormatting"+oName, getTxt("Paragraph Formatting"), "btnParagraphFormatting.gif");
          if(oEdt.btnListFormatting) ddFmt.addItem("btnListFormatting"+oName, getTxt("List Formatting"), "btnListFormatting.gif");
          if(oEdt.btnBoxFormatting) ddFmt.addItem("btnBoxFormatting"+oName, getTxt("Box Formatting"), "btnBoxFormatting.gif");
          if(oEdt.btnCssText) ddFmt.addItem("btnCssText"+oName, getTxt("Custom CSS"), "btnCustomCss.gif");
          if(oEdt.btnCssBuilder) ddFmt.addItem("btnCssBuilder"+oName, getTxt("CSS Builder"));
        }
        break;
      case "Styles":
        if(oEdt.btnStyles)tb.addButton("btnStyles"+oName,"btnStyleSelect.gif",getTxt("Style Selection"));
        break;
      case "Paragraph":
        if(oEdt.btnParagraph)
          {
          tb.addDropdownButton("btnParagraph"+oName,"ddParagraph"+oName, oUtil.langDir+"/btnParagraph.gif",getTxt("Paragraph"), 77);
          var ddPar=new ISDropdown("ddParagraph"+oName);
          ddPar.onClick=function(id) {ddAction(tb, id, oEdt, oEdt.oName)};
          for(var j=0;j<oEdt.arrParagraph.length;j++)
            {
            ddPar.addItem("btnParagraph_"+j+oName, 
              "<"+oEdt.arrParagraph[j][1]+" style=\"\margin-bottom:4px\"  unselectable=on> "+
              oEdt.arrParagraph[j][0]+"</"+oEdt.arrParagraph[j][1]+">");
            }
          }
        break;
      case "FontName":
        if(oEdt.btnFontName)
          {
          tb.addDropdownButton("btnFontName"+oName,"ddFontName"+oName,oUtil.langDir+"/btnFontName.gif",getTxt("Font Name"),77);
          var ddFont=new ISDropdown("ddFontName"+oName);
          ddFont.onClick=function(id) {ddAction(tb, id, oEdt, oEdt.oName)};
          for(var j=0;j<oEdt.arrFontName.length;j++)
            {
            ddFont.addItem("btnFontName_"+j+oName, "<span style='font-family:"+oEdt.arrFontName[j]+"' unselectable=on>"+oEdt.arrFontName[j]+"</span><span unselectable=on style='font-family:tahoma'>("+ oEdt.arrFontName[j] +")</span>");
            }
          }
        break;
      case "FontSize":
        if(oEdt.btnFontSize)
          {
          tb.addDropdownButton("btnFontSize"+oName,"ddFontSize"+oName,oUtil.langDir+"/btnFontSize.gif",getTxt("Font Size"),60);
          var ddFs=new ISDropdown("ddFontSize"+oName);
          ddFs.onClick=function(id) {ddAction(tb, id, oEdt, oEdt.oName)};
          for(var j=0;j<oEdt.arrFontSize.length;j++)
            {
            ddFs.addItem("btnFontSize_"+j+oName, 
              "<font unselectable=on size=\""+oEdt.arrFontSize[j][1]+"\">"+
              oEdt.arrFontSize[j][0]+"</font>");
            }
          }
        break;
      case "Undo":
        if(oEdt.btnUndo)tb.addButton("btnUndo"+oName,"btnUndo.gif",getTxt("Undo"));
        break;
      case "Redo":
        if(oEdt.btnRedo)tb.addButton("btnRedo"+oName,"btnRedo.gif",getTxt("Redo"));
        break;
      
      case "Paste":
          if(oEdt.btnPasteWord || oEdt.btnPasteText) {
            tb.addDropdownButton("btnPaste"+oName, "ddPaste"+oName, "btnPaste.gif",getTxt("Paste"));
            var pvDD=new ISDropdown("ddPaste"+oName); 
            pvDD.iconPath = tb.iconPath;
            //pvDD.addItem("btnPasteClip"+oName, getTxt("Paste"), "btnPasteClip.gif");
            if(oEdt.btnPasteWord) pvDD.addItem("btnPasteWord"+oName, getTxt("Paste from Word"), "btnPasteWord.gif");
            if(oEdt.btnPasteText) pvDD.addItem("btnPasteText"+oName, getTxt("Paste Text"), "btnPasteText.gif");
            pvDD.onClick=function(id) {ddAction(tb, id, oEdt, oEdt.oName)};
          }
        break;
        
      //case "PasteWord":
      //  if(oEdt.btnPasteWord)tb.addButton("btnPasteWord"+oName,"btnPasteWord.gif",getTxt("Paste from Word"));
      //  break;
      //case "PasteText":
      //  if(oEdt.btnPasteText)tb.addButton("btnPasteText"+oName,"btnPasteText.gif",getTxt("Paste Text"));
      //  break;
      case "Bold":
        if(oEdt.btnBold)tb.addToggleButton("btnBold"+oName,"",false,"btnBold.gif",getTxt("Bold"));
        break;
      case "Italic":
        if(oEdt.btnItalic)tb.addToggleButton("btnItalic"+oName,"",false,"btnItalic.gif",getTxt("Italic"));
        break;
      case "Underline":
        if(oEdt.btnUnderline)tb.addToggleButton("btnUnderline"+oName,"",false,"btnUnderline.gif",getTxt("Underline"));
        break;
      case "Strikethrough":     
        if(oEdt.btnStrikethrough)tb.addToggleButton("btnStrikethrough"+oName,"",false,"btnStrikethrough.gif",getTxt("Strikethrough"));
        break;
      case "Superscript":
        if(oEdt.btnSuperscript)tb.addToggleButton("btnSuperscript"+oName,"",false,"btnSuperscript.gif",getTxt("Superscript"));
        break;
      case "Subscript":
        if(oEdt.btnSubscript)tb.addToggleButton("btnSubscript"+oName,"",false,"btnSubscript.gif",getTxt("Subscript"));
        break;
      case "JustifyLeft":
        if(oEdt.btnJustifyLeft)tb.addToggleButton("btnJustifyLeft"+oName,"align",false,"btnLeft.gif",getTxt("Justify Left"));
        break;
      case "JustifyCenter":
        if(oEdt.btnJustifyCenter)tb.addToggleButton("btnJustifyCenter"+oName,"align",false,"btnCenter.gif",getTxt("Justify Center"));
        break;
      case "JustifyRight":
        if(oEdt.btnJustifyRight)tb.addToggleButton("btnJustifyRight"+oName,"align",false,"btnRight.gif",getTxt("Justify Right"));
        break;
      case "JustifyFull":
        if(oEdt.btnJustifyFull)tb.addToggleButton("btnJustifyFull"+oName,"align",false,"btnFull.gif",getTxt("Justify Full"));
        break;
      case "Numbering":
        if(oEdt.btnNumbering)tb.addToggleButton("btnNumbering"+oName,"bullet",false,"btnNumber.gif",getTxt("Numbering"));
        break;
      case "Bullets":
        if(oEdt.btnBullets)tb.addToggleButton("btnBullets"+oName,"bullet",false,"btnList.gif",getTxt("Bullets"));
        break;
      case "Indent":
        if(oEdt.btnIndent)tb.addButton("btnIndent"+oName,"btnIndent.gif",getTxt("Indent"));
        break;
      case "Outdent":
        if(oEdt.btnOutdent)tb.addButton("btnOutdent"+oName,"btnOutdent.gif",getTxt("Outdent"));
        break;
      case "LTR":
        if(oEdt.btnLTR)tb.addToggleButton("btnLTR"+oName,"dir",false,"btnLTR.gif",getTxt("Left To Right"));
        break;
      case "RTL":
        if(oEdt.btnRTL)tb.addToggleButton("btnRTL"+oName,"dir",false,"btnRTL.gif",getTxt("Right To Left"));
        break;
      case "ForeColor":
        if(oEdt.btnForeColor)tb.addButton("btnForeColor"+oName,"btnForeColor.gif",getTxt("Foreground Color"));
        break;
      case "BackColor":
        if(oEdt.btnBackColor)tb.addButton("btnBackColor"+oName,"btnBackColor.gif",getTxt("Background Color"));
        break;
      case "Bookmark":
        if(oEdt.btnBookmark)tb.addButton("btnBookmark"+oName,"btnBookmark.gif",getTxt("Bookmark"));
        break;
      case "Hyperlink":
        if(oEdt.btnHyperlink)tb.addButton("btnHyperlink"+oName,"btnHyperlink.gif",getTxt("Hyperlink"));
        break;
      case "CustomTag":
        if(oEdt.btnCustomTag)
          {
          tb.addDropdownButton("btnCustomTag"+oName,"ddCustomTag"+oName,oUtil.langDir+"/btnCustomTag.gif",getTxt("Tags"),60);
          var ddCustomTag=new ISDropdown("ddCustomTag"+oName);
          ddCustomTag.onClick=function(id) {ddAction(tb, id, oEdt, oEdt.oName)};
          for(var j=0;j<oEdt.arrCustomTag.length;j++)
            {
              ddCustomTag.addItem("btnCustomTag_"+j+oName, oEdt.arrCustomTag[j][0]);
            }
          }
        break;
      case "Image":
        if(oEdt.btnImage)tb.addButton("btnImage"+oName,"btnImage.gif",getTxt("Image"));
        break;
      case "Flash":
        if(oEdt.btnFlash)tb.addButton("btnFlash"+oName,oUtil.langDir+"/btnFlash.gif",getTxt("Flash"), 55);
        break;
      case "Media":
        if(oEdt.btnMedia)tb.addButton("btnMedia"+oName,oUtil.langDir+"/btnMedia.gif",getTxt("Media"), 55);
        break;
        
      case "ContentBlock":
        if(oEdt.btnContentBlock)tb.addButton("btnContentBlock"+oName,"btnContentBlock.gif",getTxt("Content Block"));
        break;
      case "InternalLink":
        if(oEdt.btnInternalLink)tb.addButton("btnInternalLink"+oName,oUtil.langDir+"/btnInternalLink.gif",getTxt("Internal Link"), 85);
        break;
      case "InternalImage":
        if(oEdt.btnInternalImage)tb.addButton("btnInternalImage"+oName,"btnInternalImage.gif",getTxt("Internal Image"));
        break;
      case "CustomObject":
        if(oEdt.btnCustomObject)tb.addButton("btnCustomObject"+oName,oUtil.langDir+"/btnCustomObject.gif",getTxt("Object"), 85);
        break;
      case "Table":
        if(oEdt.btnTable)
          {
          var sdd=[], sZ=0;
          sdd[sZ++]="<table width='175' id='dropTableCreate"+oName+"' style='cursor:default;background:#f3f3f8;' cellpadding=0 cellspacing=1 unselectable=on>";
          for(var m=0;m<8;m++)
            {
            sdd[sZ++]="<tr>";
            for(var n=0;n<8;n++)
              {
              sdd[sZ++]="<td onclick='"+oName+".doClick_TabCreate(this)' onmouseover='doOver_TabCreate(this);event.cancelBubble=true;' style='background:#ffffff;font-size:1px;border:#d3d3d3 1px solid;width:20px;height:20px;' unselectable=on>&nbsp;</td>";
              }
            sdd[sZ++]="</tr>";
            }
          sdd[sZ++]="<tr><td colspan=8 onclick=\""+oName+".hide();modelessDialogShow('"+oEdt.scriptPath+"table_insert.htm',380,330);\" onmouseover=\"doOut_TabCreate(document.getElementById('dropTableCreate"+oName+"'));this.innerHTML='"+getTxt("Advanced Table Insert")+"';this.style.border='#777777 1px solid';this.style.backgroundColor='#8d9aa7';this.style.color='#ffffff'\" onmouseout=\"this.style.border='#f3f3f8 1px solid';this.style.backgroundColor='#f3f3f8';this.style.color='#000000'\" align=center style='font-family:verdana;font-size:10px;color:#000000;border:#f3f3f8 1px solid;padding:1px 1px 1px 1px' unselectable=on>"+getTxt("Advanced Table Insert")+"</td></tr>";
          sdd[sZ++]="</table>";
          
          tb.addDropdownButton("btnTable"+oName,"ddTable"+oName,"btnTable.gif",getTxt("Insert Table"));
          var ddTable=new ISDropdown("ddTable"+oName);
          ddTable.add(new ISCustomDDItem("btnInsertTable", sdd.join("")));
                    
          tb.addDropdownButton("btnTableEdit"+oName,"ddTableEdit"+oName,"btnTableEdit.gif",getTxt("Edit Table/Cell"));
          var ddTblEdit=new ISDropdown("ddTableEdit"+oName);
          ddTblEdit.iconPath = tb.iconPath;
          ddTblEdit.onClick=function(id) {ddAction(tb, id, oEdt, oEdt.oName)};
          ddTblEdit.addItem("mnuTableSize"+oName, getTxt("Table Size"), "btnTableSize.gif");
          ddTblEdit.addItem("mnuTableEdit"+oName, getTxt("Edit Table"), "btnEditTable.gif");
          ddTblEdit.addItem("mnuCellEdit"+oName, getTxt("Edit Cell"), "btnEditCell.gif");
          }
        break;
      case "Absolute":
        if(oEdt.btnAbsolute)tb.addButton("btnAbsolute"+oName,"btnAbsolute.gif",getTxt("Absolute"));
        break;
      case "Characters":
        if(oEdt.btnCharacters)tb.addButton("btnCharacters"+oName,"btnSymbol.gif",getTxt("Special Characters"));
        break;
      case "Line":
        if(oEdt.btnLine)tb.addButton("btnLine"+oName,"btnLine.gif",getTxt("Line"));
        break;
      case "Form":
        if(oEdt.btnForm)
          {
          var arrFormMenu = [[getTxt("Form"),"form_form.htm","280","177"],
            [getTxt("Text Field"),"form_text.htm","285","289"],
            [getTxt("List"),"form_list.htm","295","332"],
            [getTxt("Checkbox"),"form_check.htm","235","174"],
            [getTxt("Radio Button"),"form_radio.htm","235","177"],
            [getTxt("Hidden Field"),"form_hidden.htm","235","152"],
            [getTxt("File Field"),"form_file.htm","235","132"],
            [getTxt("Button"),"form_button.htm","235","174"]];
          
          tb.addDropdownButton("btnForm"+oName, "ddForm"+oName, "btnForm.gif",getTxt("Form Editor"));
          var ddForm=new ISDropdown("ddForm"+oName);
          ddForm.onClick=function(id) {ddAction(tb, id, oEdt, oEdt.oName)};
          for(var j=0;j<arrFormMenu.length;j++)
            {
              ddForm.addItem("btnForm"+j+oName, arrFormMenu[j][0]);
            }
          }
        break;

      case "RemoveFormat":
        if(oEdt.btnRemoveFormat)tb.addButton("btnRemoveFormat"+oName,"btnRemoveFormat.gif",getTxt("Remove Formatting"));
        break;
      case "HTMLFullSource":
        if(oEdt.btnHTMLFullSource)tb.addButton("btnHTMLFullSource"+oName,"btnSource.gif",getTxt("View/Edit Source"));
        break;
      case "HTMLSource":
        if(oEdt.btnHTMLSource)tb.addButton("btnHTMLSource"+oName,"btnSource.gif",getTxt("View/Edit Source"));
        break;
      case "XHTMLFullSource":
        if(oEdt.btnXHTMLFullSource)tb.addButton("btnXHTMLFullSource"+oName,"btnSource.gif",getTxt("View/Edit Source"));
        break;
      case "XHTMLSource":
        if(oEdt.btnXHTMLSource)tb.addButton("btnXHTMLSource"+oName,"btnSource.gif",getTxt("View/Edit Source"));
        break;
      case "ClearAll":
        if(oEdt.btnClearAll)tb.addButton("btnClearAll"+oName,"btnDelete.gif",getTxt("Clear All"));
        break;
      default:
        for(j=0;j<oEdt.arrCustomButtons.length;j++)
          {
          if(sButtonName==oEdt.arrCustomButtons[j][0])
            {
            sCbName=oEdt.arrCustomButtons[j][0];
            //sCbCommand=oEdt.arrCustomButtons[j][1];
            sCbCaption=oEdt.arrCustomButtons[j][2];
            sCbImage=oEdt.arrCustomButtons[j][3];
            if(oEdt.arrCustomButtons[j][4])
              tb.addButton(sCbName+oName,sCbImage,sCbCaption,oEdt.arrCustomButtons[j][4]);
            else
              tb.addButton(sCbName+oName,sCbImage,sCbCaption);
            }
          }
        break;
        
      }
    }
}


function iwe_getElm(s)
  {
  return document.getElementById(s+this.oName)
  }

/*** Replace current body onload ***/
function onload_new()
  { 
  onload_original();  
  //alert("setEdit here");
  //oUtil.setEdit();
  }
function onload_original()
  {
  }

/*** Color Picker Object ***/
var arrColorPickerObjects=[];
function ColorPicker(sName,sParent)
    {
    this.oParent=sParent;
    if(sParent)
        {
        this.oName=sParent+"."+sName;
        this.oRenderName=sName+sParent;
        }
    else
        {
        this.oName=sName;
        this.oRenderName=sName;
        }
    arrColorPickerObjects.push(this.oName);

    this.url="color_picker.htm";
    this.onShow=function(){return true;};
    this.onHide=function(){return true;};
    this.onPickColor=function(){return true;};
    this.onRemoveColor=function(){return true;};
    this.onMoreColor=function(){return true;};  
    this.show=showColorPicker;
    this.hide=hideColorPicker;
    this.hideAll=hideColorPickerAll;
    this.color;
    this.customColors=[];
    this.refreshCustomColor=refreshCustomColor;
    this.isActive=false;
    this.txtCustomColors="Custom Colors";
    this.txtMoreColors="More Colors...";
    this.align="left";
    this.currColor="#ffffff";//default current color
    this.generateHTML=generateHTML;
    this.RENDER=drawColorPicker;
    }
function generateHTML() 
  { 
    var arrColors=[["#800000","#8b4513","#006400","#2f4f4f","#000080","#4b0082","#800080","#000000"],
                ["#ff0000","#daa520","#6b8e23","#708090","#0000cd","#483d8b","#c71585","#696969"],
                ["#ff4500","#ffa500","#808000","#4682b4","#1e90ff","#9400d3","#ff1493","#a9a9a9"],
                ["#ff6347","#ffd700","#32cd32","#87ceeb","#00bfff","#9370db","#ff69b4","#dcdcdc"],
                ["#ffdab9","#ffffe0","#98fb98","#e0ffff","#87cefa","#e6e6fa","#dda0dd","#ffffff"]];
    var sHTMLColor="<table id=dropColor"+this.oRenderName+" style=\"z-index:1;display:none;position:absolute;border:#9b95a6 1px solid;cursor:default;background-color:#E9E8F2;padding:2px\" unselectable=on cellpadding=0 cellspacing=0 width=145px><tr><td unselectable=on style='padding:0px;'>";
    sHTMLColor+="<table align=center cellpadding=0 cellspacing=0 border=0 unselectable=on>";
    for(var i=0;i<arrColors.length;i++)
        {
        sHTMLColor+="<tr>";
        for(var j=0;j<arrColors[i].length;j++)
            sHTMLColor+="<td onclick=\""+this.oName+".color='"+arrColors[i][j]+"';"+this.oName+".onPickColor();"+this.oName+".currColor='"+arrColors[i][j]+"';"+this.oName+".hideAll()\" onmouseover=\"this.style.border='#777777 1px solid'\" onmouseout=\"this.style.border='#E9E8F2 1px solid'\" style=\"padding:0px;cursor:default;padding:1px;border:#E9E8F2 1px solid;\" unselectable=on>"+
                "<table style='margin:0px;width:13px;height:13px;background:"+arrColors[i][j]+";border:white 1px solid' cellpadding=0 cellspacing=0 unselectable=on>"+
                "<tr><td unselectable=on style='padding:0px;'></td></tr>"+
                "</table></td>";
        sHTMLColor+="</tr>";        
        }
    
    //~~~ custom colors ~~~~
    sHTMLColor+="<tr><td colspan=8 id=idCustomColor"+this.oRenderName+" style='padding:0px;'></td></tr>";
    
    //~~~ remove color & more colors ~~~~
    sHTMLColor+= "<tr>";
    sHTMLColor+= "<td unselectable=on style='padding:0px;'>"+
        "<table style='padding:0px;margin-left:1px;width:14px;height:14px;background:#E9E8F2;' cellpadding=0 cellspacing=0 unselectable=on>"+
        "<tr><td onclick=\""+this.oName+".onRemoveColor();"+this.oName+".currColor='';"+this.oName+".hideAll()\" onmouseover=\"this.style.border='#777777 1px solid'\" onmouseout=\"this.style.border='white 1px solid'\" style=\"cursor:default;padding:1px;border:white 1px solid;font-family:verdana;font-size:10px;color:#000000;line-height:9px;\" align=center valign=top unselectable=on>x</td></tr>"+
        "</table></td>";
    sHTMLColor+= "<td colspan=7 unselectable=on style='padding:0px;'>"+
        "<table style='padding:0px;margin:1px;width:117px;height:16px;background:#E9E8F2;border:white 1px solid' cellpadding=0 cellspacing=0 unselectable=on>"+
        "<tr><td id=\""+this.oName+"moreColTd\" onclick=\""+this.oName+".onMoreColor();"+this.oName+".hideAll();modalDialogShow('"+this.url+"?" +this.oName+ "', 442, 380)\" onmouseover=\"this.style.border='#777777 1px solid';this.style.background='#8d9aa7';this.style.color='#ffffff'\" onmouseout=\"this.style.border='#E9E8F2 1px solid';this.style.background='#E9E8F2';this.style.color='#000000'\" style=\"cursor:default;font-family:verdana;font-size:9px;color:#000000;line-height:9px;padding:1px\" align=center valign=top nowrap unselectable=on>"+this.txtMoreColors+"</td></tr>"+
        "</table></td>";
    sHTMLColor+= "</tr>";
    
    sHTMLColor+= "</table>";            
    sHTMLColor+="</td></tr></table>";
    return sHTMLColor;
  }
function drawColorPicker()
    {   
    document.write(this.generateHTML());
    }    
function refreshCustomColor()
    {
    this.customColors=eval(this.oParent).customColors;//[CUSTOM] (Get from public definition)
    
    if(this.customColors.length==0)
        {
        document.getElementById("idCustomColor"+this.oRenderName).innerHTML="";
        return;
        }
    sHTML="<table cellpadding=0 cellspacing=0 width=100%><tr><td colspan=8 style=\"font-family:verdana;font-size:9px;color:#000000;line-height:9px;padding:1px\">"+this.txtCustomColors+":</td></tr></table>";
    sHTML+="<table cellpadding=0 cellspacing=0><tr>";   
    for(var i=0;i<this.customColors.length;i++)
        {
        if(i<22)
            {
            if(i==8||i==16||i==24||i==32)sHTML+="</tr></table><table cellpadding=0 cellspacing=0><tr>"  
            sHTML+="<td onclick=\""+this.oName+".color='"+this.customColors[i]+"';"+this.oName+".onPickColor()\" onmouseover=\"this.style.border='#777777 1px solid'\" onmouseout=\"this.style.border='#E9E8F2 1px solid'\" style=\"cursor:default;padding:1px;border:#E9E8F2 1px solid;\" unselectable=on>"+
                "   <table  style='margin:0px;width:13px;height:13px;background:"+this.customColors[i]+";border:white 1px solid' cellpadding=0 cellspacing=0 unselectable=on>"+
                "   <tr><td unselectable=on></td></tr>"+
                "   </table>"+
                "</td>";
            }           
        }
    sHTML+="</tr></table>";
    document.getElementById("idCustomColor"+this.oRenderName).innerHTML=sHTML;
    }    
function showColorPicker(oEl)
    {
    this.onShow();
    
    this.hideAll();

    var box=document.getElementById("dropColor"+this.oRenderName);

    //remove hilite
    var allTds = box.getElementsByTagName("TD");
    for (var i = 0; i<allTds.length; i++) 
    {
        allTds[i].style.border="#E9E8F2 1px solid";
        if (allTds[i].id==this.oName+"moreColTd") 
      {
      allTds[i].style.border="#E9E8F2 1px solid";
      allTds[i].style.background="#E9E8F2";
      allTds[i].style.color="#000000";
      }
    }

    box.style.display="block";
    var nTop=0;
    var nLeft=0;

    oElTmp=oEl;
    while(oElTmp.tagName!="BODY" && oElTmp.tagName!="HTML")
        {
        nTop+=oElTmp.offsetTop;
        oElTmp = oElTmp.offsetParent;
        }

    oElTmp=oEl;
    while(oElTmp.tagName!="BODY" && oElTmp.tagName!="HTML")
        {
        nLeft+=oElTmp.offsetLeft;
        oElTmp=oElTmp.offsetParent;
        }
    
    if(this.align=="left")
        box.style.left=(nLeft+oUtil.obj.dropLeftAdjustment_moz)+"px";
    else//right
        box.style.left=(nLeft-143+oEl.offsetWidth+oUtil.obj.dropLeftAdjustment_moz)+"px";
        
    box.style.top=(nTop+iconHeight+1+oUtil.obj.dropTopAdjustment_moz)+"px";//[CUSTOM]
    
    box.style.zIndex=2500;
    
    this.isActive=true;
    
    this.refreshCustomColor();
    }    
function hideColorPicker()
    {
    this.onHide();
    
    var box=document.getElementById("dropColor"+this.oRenderName);
    box.style.display="none";
    this.isActive=false;
    }    
function hideColorPickerAll()
    {
    for(var i=0;i<arrColorPickerObjects.length;i++)
        {
        var box=document.getElementById("dropColor"+eval(arrColorPickerObjects[i]).oRenderName);
        box.style.display="none";
        eval(arrColorPickerObjects[i]).isActive=false;
        }
    }

/*** CONTENT ***/
function loadHTML(sHTML)//hanya utk first load.
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oDoc=oEditor.document.open("text/html","replace");
    if(this.publishingPath!="")
        {
        var arrA = String(this.preloadHTML).match(/<base[^>]*>/ig);
        if(!arrA)
            {//if no <base> found
            sHTML=this.docType+"<HTML><HEAD><BASE HREF=\""+this.publishingPath+"\"/>"+this.headContent+"</HEAD><BODY>" + sHTML + "</BODY></HTML>";
            //kalau cuma tambah <HTML><HEAD></HEAD><BODY.. tdk apa2.
            }
        }
    else
        {
        sHTML=this.docType+"<HTML><HEAD>"+this.headContent+"</HEAD><BODY>"+sHTML+"</BODY></HTML>";
        }
    oDoc.write(sHTML);
    oDoc.close();

    //RealTime
    
    var me=this;
    oEditor.document.addEventListener("keyup", new Function("editorDoc_onkeyup("+this.oName+")"), true);
    oEditor.document.addEventListener("mouseup", function(e) {editorDoc_onmouseup(e, me.oName);}, true);

  oEditor.document.addEventListener("keydown", new Function("var e=arguments[0];doKeyPress(eval(e), "+this.oName+")"), false);

    /*** Apply this.arrStyle to the content ***/
    if(this.arrStyle.length>0)
        {
        var oElement=oEditor.document.createElement("STYLE");
        oEditor.document.documentElement.childNodes[0].appendChild(oElement);
        var sCssText = "";
        for(var i=0;i<this.arrStyle.length;i++)
            {
            selector=this.arrStyle[i][0];
            style=this.arrStyle[i][3];
            sCssText += selector + " { " + style + " } ";    
            }
        oElement.appendChild(oEditor.document.createTextNode(sCssText));
        }

  /*** Apply this.css to the content ***/
    if(this.css!="")
        {
        var cssFrame = document.getElementById("myStyle"+this.oName).contentWindow;
        var cssDoc = cssFrame.document.open("text/html","replace");
        cssDoc.write("<html><head><link href=\""+this.css+"\" rel=\"stylesheet\" type=\"text/css\"></head><body onload=\"parent.ApplyCSS('"+this.oName+"')\"></body></html>");
        cssDoc.close();
        }

  this.cleanDeprecated();
    }

function loadHTMLFull(sHTML, firstLoad)//first load full HTML
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;

    //save doctype (if any/if not body only)
    var arrA=String(sHTML).match(/<!DOCTYPE[^>]*>/ig);
    if(arrA)
        for(var i=0;i<arrA.length;i++)
            {
            this.docType=arrA[i];
            }
    else this.docType="";//back to default value

    //save html (if any/if not body only)
    var arrB=String(sHTML).match(/<HTML[^>]*>/ig);
    if(arrB)
        for(var i=0;i<arrB.length;i++)
            {
            s=arrB[i];
            s=s.replace(/\"[^\"]*\"/ig,function(x){
                        x=x.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/'/g, "&apos;").replace(/\s+/ig,"#_#");
                        return x});
            s=s.replace(/<([^ >]*)/ig,function(x){return x.toLowerCase()});
            s=s.replace(/ ([^=]+)=([^" >]+)/ig," $1=\"$2\"");
            s=s.replace(/ ([^=]+)=/ig,function(x){return x.toLowerCase()});
            s=s.replace(/#_#/ig," ");
            this.html=s;
            }
    else this.html="<html>";//back to default value

    //Dalam pengeditan kalau pakai doctype,
    //membuat mouse tdk bisa di-klik di empty area
  //sHTML=String(sHTML).replace(/<!DOCTYPE[^>]*>/ig,"");
    if(this.publishingPath!="")
        {
        var arrA = sHTML.match(/<base[^>]*>/ig);
        if(!arrA)
            {
            sHTML="<BASE HREF=\""+this.publishingPath+"\"/>"+sHTML;
            }
        }

  /*** Remove link to external css (content with links to external css can't be edited), then the set css property ***/
    this.css="";
    var arrExtCss=String(sHTML).match(/<link[^>]*>/ig);
    if(arrExtCss)
        for(var i=0;i<arrExtCss.length;i++)
            {
            var s=arrExtCss[i];
            var arrTmp = s.split("href=\"");
            if (arrTmp.length > 1) 
        {
        s = arrTmp[1];
        arrTmp = s.split("\"");
        if (arrTmp.length > 1) 
          this.css=arrTmp[0];
        }
            }

  sHTML=sHTML.replace(/<link[^>]*>/ig,"");
  /*** end ***/
  
    if (firstLoad) {
      try {oEditor.document.designMode="on";} catch(e) {}
    }
    var oDoc=oEditor.document.open("text/html","replace");
    oDoc.write(sHTML);
    oDoc.close();
    
    //RealTime
    var me=this;
    oEditor.document.addEventListener("keyup", new Function("editorDoc_onkeyup("+me.oName+")"), true);
    oEditor.document.addEventListener("mouseup", function(e) {editorDoc_onmouseup(e, me.oName);}, true);

    //<br> or <p>
    oEditor.document.addEventListener("keydown", new Function("var e=arguments[0];doKeyPress(eval(e), "+this.oName+")"), false);

  /*** Change linked css to embedded css ***/
    if(this.css!="")
        {
        var cssFrame = document.getElementById("myStyle"+this.oName).contentWindow;
        var cssDoc = cssFrame.document.open("text/html","replace");
        cssDoc.write("<html><head><link href=\""+this.css+"\" rel=\"stylesheet\" type=\"text/css\"></head><body onload=\"parent.ApplyCSS('"+this.oName+"')\"></body></html>");
        cssDoc.close();
        }
  /*** end ***/

  this.cleanDeprecated();
    }

function putHTML(sHTML) 
  {//used by source editor
  this.loadHTMLFull(sHTML, true);
  }

function encodeHTMLCode(sHTML) {
  return sHTML.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
}

function cleanHTML(sHTML) {
  var h = sHTML.replace(/<br class="innova" \/>/gi, "").replace(/<br class="innova">/gi, "");
  return h;
}

function getTextBody()
  {
  var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
  var sText = oEditor.document.body.textContent;
  sText = sText.replace(/<!(?:--[\s\S]*?--\s*)?>\s*/gi, "");
  return sText;
  }
function getHTML()
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    this.cleanDeprecated();

    sHTML=getOuterHTML(oEditor.document.documentElement);
    sHTML=String(sHTML).replace(/ contentEditable=true/g,"");
    sHTML=this.docType+sHTML;//restore doctype (if any)
    sHTML=oUtil.replaceSpecialChar(sHTML);
    if(this.encodeIO) sHTML=encodeHTMLCode(sHTML);
    sHTML = cleanHTML(sHTML);
    return sHTML;
    }
function getHTMLBody()
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    this.cleanDeprecated();

    sHTML=oEditor.document.body.innerHTML;
    sHTML=String(sHTML).replace(/ contentEditable=true/g,"");
    sHTML=oUtil.replaceSpecialChar(sHTML);
    if(this.encodeIO) sHTML=encodeHTMLCode(sHTML);
    sHTML = cleanHTML(sHTML);
    return sHTML;
    }
var sBaseHREF="";
function getXHTML()
  {
  var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
  this.cleanDeprecated();
  
  //base handling
  sHTML=getOuterHTML(oEditor.document.documentElement);
  var arrTmp=sHTML.match(/<BASE([^>]*)>/ig);
  if(arrTmp!=null)sBaseHREF=arrTmp[0];
  var arrBase = oEditor.document.getElementsByTagName("BASE");
  if (arrBase.length != null) 
    {
    for(var i=0; i<arrBase.length; i++) 
      {
      arrBase[i].parentNode.removeChild(arrBase[i]);
      }
    }
    
  //~~~~~~~~~~~~~
  sBaseHREF=sBaseHREF.replace(/<([^ >]*)/ig,function(x){return x.toLowerCase()});               
  sBaseHREF=sBaseHREF.replace(/ [^=]+="[^"]+"/ig,function(x){
    x=x.replace(/\s+/ig,"#_#");
    x=x.replace(/^#_#/," ");
    return x});
  sBaseHREF=sBaseHREF.replace(/ ([^=]+)=([^" >]+)/ig," $1=\"$2\"");
  sBaseHREF=sBaseHREF.replace(/ ([^=]+)=/ig,function(x){return x.toLowerCase()});
  sBaseHREF=sBaseHREF.replace(/#_#/ig," "); 

  sBaseHREF=sBaseHREF.replace(/>$/ig," \/>").replace(/\/ \/>$/ig,"\/>");
  //~~~~~~~~~~~~~

  sHTML=recur(oEditor.document.documentElement,"");

  sHTML=this.docType+this.html+sHTML+"\n</html>";//restore doctype (if any) & html
  sHTML=sHTML.replace(/<head>/i,"<head>"+sBaseHREF);//restore base href  
  sHTML=oUtil.replaceSpecialChar(sHTML);
  if(this.encodeIO) sHTML=encodeHTMLCode(sHTML);
  sHTML = cleanHTML(sHTML);
  return sHTML;
  }
function getXHTMLBody()
  {
  var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
  this.cleanDeprecated();

  //base handling
  sHTML=getOuterHTML(oEditor.document.documentElement);
  var arrTmp=sHTML.match(/<BASE([^>]*)>/ig);
  if(arrTmp!=null)sBaseHREF=arrTmp[0];
  var arrBase = oEditor.document.getElementsByTagName("BASE");
  if (arrBase.length != null) 
    {
    for(var i=0; i<arrBase.length; i++) 
      {
      arrBase[i].parentNode.removeChild(arrBase[i]);
      }
    }
  //~~~~~~~~~~~~~

  sHTML=recur(oEditor.document.body,"");
  sHTML=oUtil.replaceSpecialChar(sHTML);
  if(this.encodeIO) sHTML=encodeHTMLCode(sHTML);
  sHTML = cleanHTML(sHTML);
  return sHTML;
  }
function ApplyCSS(oName)
  {
    var sTmp="";
    var myStyle=document.getElementById("myStyle"+oName).contentWindow;
    for(var i=0;i<myStyle.document.styleSheets[0].cssRules.length;i++)
        {
        var sSelector=myStyle.document.styleSheets[0].cssRules[i].selectorText;
        if(sSelector!=undefined)
      {
      sCssText=myStyle.document.styleSheets[0].cssRules[i].style.cssText.replace(/"/g,"&quot;");
      var itemCount = sSelector.split(".").length;
      if(itemCount>1) 
        {
        sCaption=sSelector.split(".")[1];
        sTmp+=",[\""+sSelector+"\",true,\""+sCaption+"\",\""+ sCssText + "\"]";
        }
      else sTmp+=",[\""+sSelector+"\",false,\"\",\""+ sCssText + "\"]";
      }
        }
    var arrStyle = eval("["+sTmp.substr(1)+"]");

    if(arrStyle.length>0)
        {
        var oEditor=document.getElementById("idContent"+oName).contentWindow;
        var oElement=oEditor.document.createElement("STYLE");
        //oElement.id="idExtCss"
        oEditor.document.documentElement.childNodes[0].appendChild(oElement);
        var sCssText = "";
        for(var i=0;i<arrStyle.length;i++)
            {
            selector=arrStyle[i][0];
            style=arrStyle[i][3].replace(/&quot;/g,"\"");
            sCssText += selector + " { " + style + " } ";    
            }
        oElement.appendChild(oEditor.document.createTextNode(sCssText));        
        }
  }
function ApplyExternalStyle(oName)
    {
  var oEditor=document.getElementById("idContent"+oName).contentWindow;
  var sTmp="";
  for(var j=0;j<oEditor.document.styleSheets.length;j++)
    {
    var myStyle=oEditor.document.styleSheets[j];

    //In full HTML editing: this will parse linked & embedded stylesheet
    //In Body content editing: this will parse all embedded/applied css & arrStyle.
    for(var i=0;i<myStyle.cssRules.length;i++)
      {
      sSelector=myStyle.cssRules[i].selectorText;
      if(sSelector!=undefined)
        {
        sCssText=myStyle.cssRules[i].style.cssText.replace(/"/g,"&quot;");
        var itemCount = sSelector.split(".").length;
        if(itemCount>1) 
          {
          sCaption=sSelector.split(".")[1];
          sTmp+=",[\""+sSelector+"\",true,\""+sCaption+"\",\""+ sCssText + "\"]";
          }
        else sTmp+=",[\""+sSelector+"\",false,\"\",\""+ sCssText + "\"]";
        }
      }
    }
  
  var arrStyle = eval("["+sTmp.substr(1)+"]"); 
  eval(oName).arrStyle=arrStyle;//Update arrStyle property
    }

function doApplyStyle(oName,sClassName)
  {
    var oEditor=document.getElementById("idContent"+oName).contentWindow;
    var oSel=oEditor.getSelection();
    eval(oName).saveForUndo();
  
  var element;
    if(oUtil.activeElement)
        {
        element=oUtil.activeElement;
        element.className=sClassName;
        }
    else
    { 
    element = getSelectedElement(oSel);
    if (isTextSelected(oSel)) 
      {
      if(oSel!="")
        {
        /*
        var idNewSpan=eval(oName).applySpan();
        if(idNewSpan)idNewSpan.className=sClassName;
        else
          {
          oElement.className=sClassName;
          }
        */
        eval(oName).applySpanStyle([],sClassName);
        }
      else
        {
        if(element.tagName=="BODY")return;
        element.className=sClassName;
        }
      }
    else
      {
      if(element.tagName=="BODY")return;
      element.className=sClassName;
      }
    }
  realTime(eval(oName));
  }

function openStyleSelect()
  {
  if(!this.isCssLoaded)ApplyExternalStyle(this.oName);
  this.isCssLoaded=true;//make only 1 call to ApplyExternalStyle()

  var idStyles=document.getElementById("idStyles"+this.oName);
  if(idStyles.innerHTML!="")
    {//toggle
    if(idStyles.style.display=="")
      idStyles.style.display="none";
    else
      idStyles.style.display="";
    return;
    }
  idStyles.style.display="";

  var h=document.getElementById("idContent"+this.oName).offsetHeight-27;
  
  var arrStyle=this.arrStyle;
  
  var sHTML="";
  sHTML+="<div unselectable=on style='margin:5px;margin-top:0;margin-right:0' align=right>"
  
  sHTML+="<table style='margin:1px;margin-top:2px;margin-bottom:3px;width:14px;height:14px;background:#E9E8F2;' cellpadding=0 cellspacing=0 unselectable=on>"+
    "<tr><td onclick=\""+this.oName+".openStyleSelect();\" onmouseover=\"this.style.border='#708090 1px solid';this.style.color='white';this.style.backgroundColor='9FA7BB'\" onmouseout=\"this.style.border='white 1px solid';this.style.color='black';this.style.backgroundColor=''\" style=\"cursor:default;padding:1px;border:white 1px solid;font-family:verdana;font-size:10px;color:#000000;line-height:9px;\" align=center valign=top unselectable=on>x</td></tr>"+
    "</table>";

  var sBody="";
  for(var i=0;i<arrStyle.length;i++)
    {
    sSelector=arrStyle[i][0];
    if(sSelector=="body")sBody=arrStyle[i][3];
    }

  sHTML+="<div unselectable=on style='overflow:auto;width:200px;height:"+h+"px;'>";
  sHTML+="<table name='tblStyles"+this.oName+"' id='tblStyles"+this.oName+"' cellpadding=0 cellspacing=0 style='background:#fcfcfc;"+sBody+";height:100%;width:100%;margin:0;'>";
  
  for(var i=0;i<arrStyle.length;i++)
    {
    sSelector=arrStyle[i][0];
    isOnSelection=arrStyle[i][1];

    sCssText=arrStyle[i][3];
    //sCssText=sCssText.replace(/color: rgb\(255, 255, 255\)/,"COLOR: #000000");

    sCaption=arrStyle[i][2];
    if(isOnSelection)
      {
      if(sSelector.split(".").length>1)//sudah pasti
        {
        var tmpSelector = sSelector;
        if (sSelector.indexOf(":")>0) tmpSelector = sSelector.substring(0, sSelector.indexOf(":"));
        sHTML+="<tr style=\"cursor:default\" onmouseover=\"if(this.style.marginRight!='1px'){this.style.background='"+this.styleSelectionHoverBg+"';this.style.color='"+this.styleSelectionHoverFg+"'}\" onmouseout=\"if(this.style.marginRight!='1px'){this.style.background='';this.style.color=''}\">";
        sHTML+="<td unselectable=on onclick=\"doApplyStyle('"+this.oName+"','"+tmpSelector.split(".")[1]+"')\" style='padding:2px'>";
        if(sSelector.split(".")[0]=="")
          sHTML+="<span unselectable=on style=\""+sCssText+";margin:0;\">"+sCaption+"</span>";
        else
          sHTML+="<span unselectable=on style=\""+sCssText+";margin:0;\">"+sSelector+"</span>";
        sHTML+="</td></tr>";
        }
      }
    }
  sHTML+="<tr><td height=100%>&nbsp;</td></tr></table></div>";
  sHTML+="</div>"
  document.getElementById("idStyles"+this.oName).innerHTML=sHTML;
  }

/**************************
  NEW SPAN OPERATION 
**************************/

/*** CLEAN ***/
function cleanFonts() 
  {
  var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
  var allFonts = oEditor.document.body.getElementsByTagName("FONT");
  if(allFonts.length==0)return false;
  
  var f; var range;
  while (allFonts.length>0) 
    {
    f = allFonts[0];
    if (f.hasChildNodes && f.childNodes.length==1 && f.childNodes[0].nodeType==1 && f.childNodes[0].nodeName=="SPAN") 
      {
      //if font containts only span child node
      
      var theSpan = f.childNodes[0];
      copyAttribute(theSpan, f);
      
      range = oEditor.document.createRange();
      range.selectNode(f);
      range.insertNode(theSpan);
      range.selectNode(f);
      range.deleteContents();
      } 
    else 
      if (f.parentNode.nodeName=="SPAN" && f.parentNode.childNodes.length==1) 
        {
        //font is the only child node of span.
        var theSpan = f.parentNode;
        copyAttribute(theSpan, f);
        theSpan.innerHTML = f.innerHTML;
        } 
      else 
        {
        var newSpan = oEditor.document.createElement("SPAN");
        copyAttribute(newSpan, f);
        newSpan.innerHTML = f.innerHTML;
        f.parentNode.replaceChild(newSpan, f);
        }
    }
  return true;
  }
function cleanTags(elements,sVal)
  {
  var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
  if(elements.length==0)return false;
  
  var f;var range;
  while(elements.length>0) 
    {
    f = elements[0];
    if(f.hasChildNodes && f.childNodes.length==1 && f.childNodes[0].nodeType==1 && f.childNodes[0].nodeName=="SPAN") 
      {//if font containts only span child node      
      var theSpan=f.childNodes[0];
      if(sVal=="bold")theSpan.style.fontWeight="bold";
      if(sVal=="italic")theSpan.style.fontStyle="italic";
      if(sVal=="line-through")theSpan.style.textDecoration="line-through";
      if(sVal=="underline")theSpan.style.textDecoration="underline";

      range=oEditor.document.createRange();
      range.selectNode(f);
      range.insertNode(theSpan);
      range.selectNode(f);
      range.deleteContents();
      } 
    else 
      if (f.parentNode.nodeName=="SPAN" && f.parentNode.childNodes.length==1) 
        {
        //font is the only child node of span.
        var theSpan=f.parentNode;
        if(sVal=="bold")theSpan.style.fontWeight="bold";
        if(sVal=="italic")theSpan.style.fontStyle="italic";
        if(sVal=="line-through")theSpan.style.textDecoration="line-through";
        if(sVal=="underline")theSpan.style.textDecoration="underline";
        
        theSpan.innerHTML=f.innerHTML;
        } 
      else 
        {
        var newSpan = oEditor.document.createElement("SPAN");
        if(sVal=="bold")newSpan.style.fontWeight="bold";
        if(sVal=="italic")newSpan.style.fontStyle="italic";
        if(sVal=="line-through")newSpan.style.textDecoration="line-through";
        if(sVal=="underline")newSpan.style.textDecoration="underline";

        newSpan.innerHTML=f.innerHTML;
        f.parentNode.replaceChild(newSpan,f);
        }
    }
  return true;
  }
function replaceTags(sFrom,sTo)
  {
  var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
  
  var elements=oEditor.document.body.getElementsByTagName(sFrom);
  
  while(elements.length>0) 
    {
    f = elements[0];
    
    var newSpan = oEditor.document.createElement(sTo);
    newSpan.innerHTML=f.innerHTML;
    f.parentNode.replaceChild(newSpan,f);
    }
  }
/************************************
  Used in loadHTML, loadHTMLFull, 
  doKeyPress,
  getHTML, getXHTML, 
  getHTMLBody, getXHTMLBody,
  pasteWord.htm,
  source_html.htm, source_xhtml.htm
*************************************/
function cleanDeprecated()
  {
  var oEditor=document.getElementById("idContent"+this.oName).contentWindow;

  var elements;

  elements=oEditor.document.body.getElementsByTagName("STRONG");
  this.cleanTags(elements,"bold");
  elements=oEditor.document.body.getElementsByTagName("B");
  this.cleanTags(elements,"bold");

  elements=oEditor.document.body.getElementsByTagName("I");
  this.cleanTags(elements,"italic");
  elements=oEditor.document.body.getElementsByTagName("EM");
  this.cleanTags(elements,"italic");
  
  elements=oEditor.document.body.getElementsByTagName("STRIKE");
  this.cleanTags(elements,"line-through");
  elements=oEditor.document.body.getElementsByTagName("S");
  this.cleanTags(elements,"line-through");
  
  elements=oEditor.document.body.getElementsByTagName("U");
  this.cleanTags(elements,"underline");

  this.replaceTags("DIR","DIV");
  this.replaceTags("MENU","DIV"); 
  this.replaceTags("CENTER","DIV");
  this.replaceTags("XMP","PRE");
  this.replaceTags("BASEFONT","SPAN");//will be removed by cleanEmptySpan()
  
  elements=oEditor.document.body.getElementsByTagName("APPLET");
  while(elements.length>0) 
    {
    var f = elements[0];
    theParent = f.parentNode;
    theParent.removeChild(f);
    }
  
  this.cleanFonts();
  this.cleanEmptySpan();

  return true;
  }

/*** APPLY ***/
function applySpanStyle(arrStyles,sClassName, blockTag)
  {
  var useBlock = "SPAN";
  if (blockTag!=null && blockTag!="") useBlock = blockTag;

  var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
  var oSel=oEditor.getSelection();

  var range;
  var oElement;
  if (!isTextSelected(oSel)) 
    { //if not text selection
    range = oSel.getRangeAt(0);
    oElement = getSelectedElement(oSel);
    if(oElement.nodeName==useBlock) return oElement;
    return;
    }

  this.hide();
  this.doCmd("fontsize","0");

  replaceWithSpan(oEditor,arrStyles,sClassName, useBlock);
  realTime(this);  
  }
function doClean()
    {
    this.saveForUndo();//Save for Undo

    if(oUtil.activeElement) var element=oUtil.activeElement;
    else
        {
        var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
        var oSel=oEditor.getSelection();        
    element = getSelectedElement(oSel);
    if(isTextSelected(oSel)) 
      {
      if(oSel!="")
        {
        var range = oSel.getRangeAt(0);
        if(element.innerHTML!=range.toString())
          {
          this.doCmd('RemoveFormat');
          realTime(this);
          return;
          }
        }
      else
        {
        if(element.tagName=="BODY")return;
        }
      }
    else
      {
      if(element.tagName=="BODY")return;
      }
        }
        
  element.removeAttribute("className");
  element.removeAttribute("style");

  if(element.tagName=="H1"||
    element.tagName=="H2"||
    element.tagName=="H3"||
    element.tagName=="H4"||
    element.tagName=="H5"||
    element.tagName=="H6"||
    element.tagName=="PRE"||
    element.tagName=="P"||
    element.tagName=="DIV")
    {
    this.doCmd('FormatBlock','<P>');
    } 

    this.doCmd('RemoveFormat');
    realTime(this);
    }

function cleanEmptySpan()
  {
  var bReturn=false;
  var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
  var reg = /<\s*SPAN\s*>/gi;

  while (true) 
    {
    var allSpans = oEditor.document.getElementsByTagName("SPAN");
    if(allSpans.length==0) break;

    var emptySpans = []; 
    for (var i=0; i<allSpans.length; i++) 
      {
      if (getOuterHTML(allSpans[i]).search(reg) == 0)
        emptySpans[emptySpans.length]=allSpans[i];
      }
    if (emptySpans.length == 0) break;
    var theSpan, theParent;
    for (var i=0; i<emptySpans.length; i++) 
      {
      theSpan = emptySpans[i];
      theParent = theSpan.parentNode;
      if (!theParent) continue;
      if (theSpan.hasChildNodes()) 
        {
        var range = oEditor.document.createRange();
        range.selectNodeContents(theSpan);
        var docFrag = range.extractContents();
        theParent.replaceChild(docFrag, theSpan);
        } 
      else 
        {
        theParent.removeChild(theSpan);
        }
      bReturn=true;
      }
    }
  return bReturn;
  }

/*** COMMON ***/
function copyStyleClass(newSpan,arrStyles,sClassName) 
  {
  if(arrStyles)
    {
    for(var i=0;i<arrStyles.length;i++) eval("newSpan.style."+arrStyles[i][0]+"=\""+arrStyles[i][1]+"\"");
    if(newSpan.style.cssText=="")newSpan.removeAttribute("style",0);
    }
  if(sClassName)
    newSpan.className=sClassName;
  }

function copyAttribute(newSpan,f) 
  {
  if ((f.face != null) && (f.face != ""))newSpan.style.fontFamily=f.face;
  if ((f.size != null) && (f.size != ""))
    {
    var nSize="";
    if(f.size==1)nSize="8pt";
    else if(f.size==2)nSize="10pt";
    else if(f.size==3)nSize="12pt";
    else if(f.size==4)nSize="14pt";
    else if(f.size==5)nSize="18pt";
    else if(f.size==6)nSize="24pt";
    else if(f.size>=7)nSize="36pt";
    else if(f.size<=-2||f.size=="0")nSize="8pt";
    else if(f.size=="-1")nSize="10pt";
    else if(f.size==0)nSize="12pt";
    else if(f.size=="+1")nSize="14pt";
    else if(f.size=="+2")nSize="18pt";
    else if(f.size=="+3")nSize="24pt";
    else if(f.size=="+4"||f.size=="+5"||f.size=="+6")nSize="36pt";
    else nSize="";
    if(nSize!="")newSpan.style.fontSize=nSize;
    }
  if ((f.style.backgroundColor != null)&&(f.style.backgroundColor != ""))newSpan.style.backgroundColor=f.style.backgroundColor;
  if ((f.color != null)&&(f.color != ""))newSpan.style.color=f.color;
  if((f.className!=null)&&(f.className!=""))newSpan.className=f.className;
  }
  
function replaceWithSpan(oEditor, arrStyles, sClassName, blockTag)
  {
  var useBlock = "SPAN";
  if (blockTag!=null && blockTag!="") useBlock = blockTag;

  var oSel = oEditor.getSelection();

  //mark selection start font and selection end font.
  var range = oSel.getRangeAt(0);
  var startFont = GetElement(range.startContainer, "FONT");
  if (startFont == null) startFont = range.startContainer.nextSibling;
  startFont.setAttribute("startcont", "this");

  var endFont = GetElement(range.endContainer, "FONT");
  if (endFont == null) endFont = range.endContainer.prevSibling;
  if (endFont != null) endFont.setAttribute("endcont", "this");

  var startCont = range.startContainer;
  var endCont = range.endContainer;

  //assume, FONT tag are created when applying font size command
  var allFonts = oEditor.document.getElementsByTagName("FONT");
  var newSpan = null;
  var f = null;
  while(allFonts.length > 0) 
    {
    f = allFonts[0];      
    //if a font tag have only 1 child nodes and the child nodes is SPAN, then remove the font tag
    if (f.childNodes && f.childNodes.length==1 && f.childNodes[0].nodeType==1 && f.childNodes[0].nodeName==useBlock) 
      {
      newSpan = f.childNodes[0];

      var spans = newSpan.getElementsByTagName(useBlock);
      if (spans) 
        {
        for (var j=0; j<spans.length; j++) 
          {
          if(arrStyles||sClassName)copyStyleClass(spans[j],arrStyles,sClassName);
          else copyAttribute(spans[j], f);
          }
        }

      if(arrStyles||sClassName)copyStyleClass(newSpan,arrStyles,sClassName);
      else copyAttribute(newSpan, f);

      range = oEditor.document.createRange();

      //check whether this is the font tag to start/end the selection
      if (f.getAttribute("startcont")=="this") startCont = newSpan;
      if (f.getAttribute("endcont")=="this") endCont = newSpan;

      range.selectNode(f);
      range.insertNode(newSpan);
      range.selectNode(f);
      range.deleteContents();
      } 
    else 
      {
      //check if there are spans in the selection
      var spans = f.getElementsByTagName(useBlock);
      if (spans) 
        {
        for (var j=0; j<spans.length; j++) 
          {
          if(arrStyles||sClassName)copyStyleClass(spans[j],arrStyles,sClassName);
          else copyAttribute(spans[j], f);
          }
        }

      newSpan = oEditor.document.createElement(useBlock);
      newSpan.innerHTML = f.innerHTML;

      if(arrStyles||sClassName)copyStyleClass(newSpan,arrStyles,sClassName);
      else copyAttribute(newSpan, f);

      //check whether this is the font tag to start/end the selection
      if (f.getAttribute("startcont")=="this") startCont = newSpan;
      if (f.getAttribute("endcont")=="this") endCont = newSpan;

      f.parentNode.replaceChild(newSpan, f);
      }
    }

  //create selection
  //set selection start
  range = oEditor.document.createRange();
  range.setStart(startCont.childNodes[0], 0);
  //set selection end
  var lastNode = endCont.childNodes[endCont.childNodes.length-1];
  var endOffsetPos = 0;
  if (lastNode.nodeType==Node.TEXT_NODE) 
    {
    endOffsetPos = lastNode.nodeValue.length;
    } 
  else 
    {
    endOffsetPos = lastNode.childNodes.length;
    }
  range.setEnd(lastNode, endOffsetPos);
  //do the selection
  oSel = oEditor.getSelection();
  oSel.removeAllRanges();
  oSel.addRange(range);
  }
/******** /NEW SPAN OPERATION *********/

/*** REALTIME ***/
/*
function editorDoc_onkeydown(edtObj)
    {
  edtObj.onKeyPress();
    realTime(edtObj);    
    }*/
function editorDoc_onkeyup(oEdt)
    {
    
    if(oEdt.tmKeyup) {clearTimeout(oEdt.tmKeyup); oEdt.tmKeyup=null;} 
    if(!oEdt.tmKeyup)oEdt.tmKeyup=setTimeout(function(){realTime(oEdt);}, 1000);

    //realTime(edtObj);
    }
function editorDoc_onmouseup(e, oName)
    {
    var edtObj=eval(oName);
    var edtFrm=document.getElementById("idContent"+edtObj.oName);
    
    oUtil.activeElement=null;//focus ke editor, jgn pakai selection dari tag selector
    oUtil.oName=oName;
    oUtil.oEditor=edtFrm.contentWindow;
    oUtil.obj=edtObj;
    edtObj.hide();//pengganti onfocus
    realTime(edtObj);      
    }
function setActiveEditor(edtObj)
    {
    oUtil.oName=edtObj.oName;
    oUtil.oEditor=document.getElementById("idContent"+edtObj.oName).contentWindow;
    oUtil.obj=edtObj;
    }

var arrTmp=[];
function GetElement(oElement,sMatchTag)//Used in realTime() only.
    {
    while (oElement!=null&&oElement.tagName!=sMatchTag)
        {
        if(oElement.tagName=="BODY")return null;
        oElement=oElement.parentNode;
        }
    return oElement;
    }
    
var arrTmp2=[];//TAG SELECTOR
function realTime(edtObj)
    {
    try{
    var oName = edtObj.oName;

    var oEditor=document.getElementById("idContent"+oName).contentWindow;

    var oSel=oEditor.getSelection();
    var element = getSelectedElement(oSel);

    var obj=edtObj;
    var tbar=obj.tbar;
    var btn=null;

    //Enable/Disable Table Edit & Cell Edit Menu
    if(obj.btnTable)
        {
        
        var btn=tbar.btns["btnTableEdit"+oName];
        var ddTbl=isDDs[btn.ddId];
        ddTbl.enableItem("mnuTableSize"+oName, true);
        ddTbl.enableItem("mnuTableEdit"+oName, true);
        ddTbl.enableItem("mnuCellEdit"+oName, true);
        var oTable=GetElement(element,"TABLE");
        if (oTable)
            {
            ddTbl.enableItem("mnuCellEdit"+oName, false);
            btn.setState(1);
            } 
        else btn.setState(5);

        var oTD=GetElement(element,"TD");
        if (oTD)
            {
            ddTbl.enableItem("mnuCellEdit"+oName, true);
            }
        }

    //REALTIME BUTTONS HERE
    var doc=oEditor.document;
    
    if(obj.btnParagraph)
        {
        btn=tbar.btns["btnParagraph"+oName];
        btn.setState(doc.queryCommandEnabled("FormatBlock")?1:5);        
        }
    if(obj.btnFontName)
        {
        btn=tbar.btns["btnFontName"+oName];
        btn.setState(doc.queryCommandEnabled("FontName")?1:5);
        }

    if(obj.btnFontSize)
        {
        btn=tbar.btns["btnFontSize"+oName];
        btn.setState(doc.queryCommandEnabled("FontSize")?1:5);
        }
    if(obj.btnPaste)
        {
        btn=tbar.btns["btnPaste"+oName];
        btn.setState(doc.queryCommandEnabled("Paste")?1:5);
        }
    if(obj.btnUndo)
        {
        btn=tbar.btns["btnUndo"+oName];
        btn.setState(!obj.arrUndoList[0]?5:1);
        }
    if(obj.btnRedo)
        {
        btn=tbar.btns["btnRedo"+oName];
        btn.setState(!obj.arrRedoList[0]?5:1);
        }

    if(obj.btnBold)
        {
        btn=tbar.btns["btnBold"+oName];
        btn.setState(doc.queryCommandEnabled("Bold")?(doc.queryCommandState("Bold")?4:1):5);
        }
        
    if(obj.btnItalic)
        {
        btn=tbar.btns["btnItalic"+oName];
        btn.setState(doc.queryCommandEnabled("Italic")?(doc.queryCommandState("Italic")?4:1):5);
        }

    if(obj.btnUnderline)
        {
        btn=tbar.btns["btnUnderline"+oName];
        btn.setState(doc.queryCommandEnabled("Underline")?(doc.queryCommandState("Underline")?4:1):5);
        }

    if(obj.btnStrikethrough)
        {
        btn=tbar.btns["btnStrikethrough"+oName];
        btn.setState(doc.queryCommandEnabled("Strikethrough")?(doc.queryCommandState("Strikethrough")?4:1):5);
        }

    if(obj.btnSuperscript)
        {
        btn=tbar.btns["btnSuperscript"+oName];
        btn.setState(doc.queryCommandEnabled("Superscript")?(doc.queryCommandState("Superscript")?4:1):5);
        }

    if(obj.btnSubscript)
        {
        btn=tbar.btns["btnSubscript"+oName];
        btn.setState(doc.queryCommandEnabled("Subscript")?(doc.queryCommandState("Subscript")?4:1):5);
        }

    if(obj.btnNumbering)
        {
        btn=tbar.btns["btnNumbering"+oName];
        btn.setState(doc.queryCommandEnabled("InsertOrderedList")?(doc.queryCommandState("InsertOrderedList")?4:1):5);
        }
        
    if(obj.btnBullets)
        {
        btn=tbar.btns["btnBullets"+oName];
        btn.setState(doc.queryCommandEnabled("InsertUnorderedList")?(doc.queryCommandState("InsertUnorderedList")?4:1):5);
        }

    if(obj.btnJustifyLeft)
        {
        btn=tbar.btns["btnJustifyLeft"+oName];
        btn.setState(doc.queryCommandEnabled("JustifyLeft")?(doc.queryCommandState("JustifyLeft")?4:1):5);
        }
    if(obj.btnJustifyCenter)
        {
        btn=tbar.btns["btnJustifyCenter"+oName];
        btn.setState(doc.queryCommandEnabled("JustifyCenter")?(doc.queryCommandState("JustifyCenter")?4:1):5);
        }

    if(obj.btnJustifyRight)
        {
        btn=tbar.btns["btnJustifyRight"+oName];
        btn.setState(doc.queryCommandEnabled("JustifyRight")?(doc.queryCommandState("JustifyRight")?4:1):5);
        }
    if(obj.btnJustifyFull)
        {
        btn=tbar.btns["btnJustifyFull"+oName];
        btn.setState(doc.queryCommandEnabled("JustifyFull")?(doc.queryCommandState("JustifyFull")?4:1):5);
        }

    if(obj.btnIndent)
        {
        btn=tbar.btns["btnIndent"+oName];
        btn.setState(doc.queryCommandEnabled("Indent")?1:5);
        }

    if(obj.btnOutdent)
        {
        btn=tbar.btns["btnOutdent"+oName];
        btn.setState(doc.queryCommandEnabled("Outdent")?1:5);
        }

    if(obj.btnLTR)
        {
        btn=tbar.btns["btnLTR"+oName];
        btn.setState(element.dir?(element.dir.toLowerCase()=="ltr"?4:1):5);
        }
    if(obj.btnRTL)
        {
        btn=tbar.btns["btnRTL"+oName];
        btn.setState(element.dir?(element.dir.toLowerCase()=="rtl"?4:1):5);
        }


    var v=(element?1:5);
    if(obj.btnForeColor)tbar.btns["btnForeColor"+oName].setState(v);
    if(obj.btnBackColor)tbar.btns["btnBackColor"+oName].setState(v);
    if(obj.btnLine)tbar.btns["btnLine"+oName].setState(v);

    try{oUtil.onSelectionChanged()}catch(e){;}

    try{obj.onSelectionChanged()}catch(e){;}

  //STYLE SELECTOR ~~~~~~~~~~~~~~~~~~
  var idStyles=document.getElementById("idStyles"+oName);
  if(idStyles.innerHTML!="")
    {
    var oElement;
    if(oUtil.activeElement)
      oElement=oUtil.activeElement
    else
      oElement = getSelectedElement(oSel);    
    var sCurrClass=oElement.className;
    
    var oRows=document.getElementById("tblStyles"+oName).rows;
    for(var i=0;i<oRows.length-1;i++)
      {
      sClass=oRows[i].childNodes[0].childNodes[0].innerHTML;
      if(sClass.split(".").length>1 && sClass!="")sClass=sClass.split(".")[1];
      if(sCurrClass==sClass)
        {
        oRows[i].style.marginRight="1px";
        oRows[i].style.backgroundColor=obj.styleSelectionHoverBg;
        oRows[i].style.color=obj.styleSelectionHoverFg;
        }
      else
        {
        oRows[i].style.marginRight="";
        oRows[i].style.backgroundColor="";
        oRows[i].style.color="";
        }
      }
    }

    //TAG SELECTOR ~~~~~~~~~~~~~~~~~~
  if(obj.useTagSelector)
    {
    oElement=element;
    var sHTML="";var i=0;
    arrTmp2=[];//clear
    while (oElement!=null && oElement.tagName!="BODY" && oElement.nodeType==1)
      {
      arrTmp2[i]=oElement;
      sHTML = "&nbsp; &lt;<span id=tag"+oName+i+" unselectable=on style='text-decoration:underline;cursor:pointer' onclick=\""+oName+".selectElement("+i+")\">" + oElement.tagName + "</span>&gt;" + sHTML;
      oElement = oElement.parentNode;
      i++;
      }
    sHTML = "&nbsp;&lt;BODY&gt;" + sHTML;
    document.getElementById("idElNavigate"+oName).innerHTML = sHTML;
    document.getElementById("idElCommand"+oName).style.display="none";
    for (i=0; i<arrTmp2.length; i++) 
      {
      document.getElementById("tag"+oName+i).addEventListener("click", new Function(oName+".selectElement("+i+")"), true);
      }
    }
        
    }catch(e){;}

    }

function realtimeFontSelect(oName)
    {
    var oEditor=document.getElementById("idContent"+oName).contentWindow;
    var sFontName = oEditor.document.queryCommandValue("FontName");
    var edt=eval(oName);
    
    var found=false;
    for (var i=0;i<edt.arrFontName.length;i++) {
      if(sFontName==edt.arrFontName[i]) { found=true; break; }
    }
    if(found) {
      isDDs["ddFontName"+oName].selectItem("btnFontName_"+i+oName, true);
    } else {
      isDDs["ddFontName"+oName].clearSelection();
    }


    }
function realtimeSizeSelect(oName)
    {
    var oEditor=document.getElementById("idContent"+oName).contentWindow;
    var sFontSize=oEditor.document.queryCommandValue("FontSize");
    
    var edt=eval(oName);

    var found=false;
    for (var i=0;i<edt.arrFontSize.length;i++) {
        if(sFontSize==edt.arrFontSize[i][1]) { found=true; break; }
    }
    if(found) {
      isDDs["ddFontSize"+oName].selectItem("btnFontSize_"+i+oName, true);
    } else {
      isDDs["ddFontSize"+oName].clearSelection();
    }
    }

/*** TAG SELECTOR ***/
function moveTagSelector()
    {
    var edtArea=document.getElementById("idArea"+this.oName);
    var nWidth=edtArea.offsetWidth-90;
    var icPath=this.scriptPath.substring(0, this.scriptPath.indexOf("moz/"))+this.iconPath;    
    /*
    idElNavigate width seharusnya 100%. Dibuat px utk menghindari flicker problem di Nets8
    */
    var sTagSelTop="<table unselectable=on ondblclick='"+this.oName+".moveTagSelector()' width='100%' cellpadding=0 cellspacing=0><tr style='background:#e9e8f2;font-family:arial;font-size:10px;color:black;'>"+
        "<td id=idElNavigate"+ this.oName +" style='padding:1px;width:"+nWidth+"px' valign=top>&nbsp;</td>"+
        "<td align=right valign='center' nowrap>"+
        "<span id=idElCommand"+ this.oName +" unselectable=on style='vertical-align:middle;display:none;text-decoration:underline;cursor:pointer;padding-right:5px;' onclick='"+this.oName+".removeTag()'>"+getTxt("Remove Tag")+"</span>"+
        "<img src='"+icPath+"decrease.gif' style='cursor:pointer;vertical-align:middle;' onclick='"+this.oName+".changeHeight(-50)'>" +
        "<img src='"+icPath+"increase.gif' style='cursor:pointer;vertical-align:middle;margin-right:3px' onclick='"+this.oName+".changeHeight(50)'>"
        "</td></tr></table>";

    var sTagSelBottom="<table unselectable=on ondblclick='"+this.oName+".moveTagSelector()' width='100%' cellpadding=0 cellspacing=0><tr style='background:#e4e3ed;font-family:arial;font-size:10px;color:black;'>"+
        "<td id=idElNavigate"+ this.oName +" style='padding:1px;width:"+nWidth+"px' valign=top>&nbsp;</td>"+
        "<td align=right valign='center' nowrap>"+
        "<span id=idElCommand"+ this.oName +" unselectable=on style='vertical-align:middle;display:none;text-decoration:underline;cursor:pointer;padding-right:5px;' onclick='"+this.oName+".removeTag()'>"+getTxt("Remove Tag")+"</span>"+
        "<img src='"+icPath+"decrease.gif' style='cursor:pointer;vertical-align:middle' onclick='"+this.oName+".changeHeight(-50)'>" +
        "<img src='"+icPath+"increase.gif' style='cursor:pointer;vertical-align:middle;margin-right:3px' onclick='"+this.oName+".changeHeight(50)'>"
        "</td></tr></table>";

    var selTop = document.getElementById("idTagSelTop"+this.oName);
    var selTopRow = document.getElementById("idTagSelTopRow"+this.oName);
    var selBottom = document.getElementById("idTagSelBottom"+this.oName);
    var selBottomRow = document.getElementById("idTagSelBottomRow"+this.oName);

    if(this.TagSelectorPosition=="top")
        {
        selTop.innerHTML="";
        selBottom.innerHTML=sTagSelBottom;
        selTopRow.style.display="none";
        selBottomRow.style.display="";
        this.TagSelectorPosition="bottom";
        }
    else//if(this.TagSelectorPosition=="bottom")
        {
        selTop.innerHTML=sTagSelTop;
        selBottom.innerHTML="";
        selTopRow.style.display="";
        selBottomRow.style.display="none";
        this.TagSelectorPosition="top";
        }
    }
function selectElement(i)
    {
    if(!this.useTagSelector)return;
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    
    var range = oEditor.document.createRange();
    range.selectNode(arrTmp2[i]);

    var oSel = oEditor.getSelection();
    oSel.removeAllRanges();
    oSel.addRange(range);

    oActiveElement = arrTmp2[i];
    if(oActiveElement.tagName!="TD"&&
        oActiveElement.tagName!="TR"&&
        oActiveElement.tagName!="TBODY"&&
        oActiveElement.tagName!="LI")
        document.getElementById("idElCommand"+this.oName).style.display="";

    for(var j=0;j<arrTmp2.length;j++)document.getElementById("tag"+this.oName+j).style.background="";
    document.getElementById("tag"+this.oName+i).style.background="DarkGray";
    
    if(oActiveElement)
        oUtil.activeElement=oActiveElement;//Set active element in the Editor
        
    this.focus();
    }
function removeTag()
    {
    this.saveForUndo();//Save for Undo
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    
    var oSel=oEditor.getSelection();
    var element = getSelectedElement(oSel);
    var nearElement = element.nextSibling==null ? (element.previousSibling == null ? element.parentNode :element.previousSibling) : element.nextSibling;
    switch (element.nodeName) 
    {
        case "TABLE": ;
        case "IMG": ;
        case "INPUT": ;
        case "FORM": ;
        case "SELECT":
            element.parentNode.removeChild(element);
            break;
        default:
            oSel = oEditor.getSelection();
            var range = oSel.getRangeAt(0);
            var docFrag = range.createContextualFragment(element.innerHTML);
            range.deleteContents();
            range.insertNode(docFrag);
            try { oEditor.document.designMode="on"; } catch (e) {}
            break;
    }

    oSel=oEditor.getSelection();
    oSel.removeAllRanges();
    var range = oEditor.document.createRange();
    range.setStart(nearElement, 0);
    range.setEnd(nearElement, 0);
    oSel.addRange(range);
    
    this.focus();
    realTime(this);    
    }

/*** Apply Formatting ***/
function doCmd(sCmd,sOption)
    {
  if(sCmd=="Bold"||sCmd=="Italic"||sCmd=="Underline"||sCmd=="Strikethrough"||
    sCmd=="Superscript"||sCmd=="Subscript"||
    sCmd=="Indent"||sCmd=="Outdent"||sCmd=="InsertHorizontalRule")
    this.saveForUndo();//Save for Undo

    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    oEditor.document.execCommand(sCmd,false,sOption);
    realTime(this);
    }
function applyColor(sType,sColor)
    {
    this.hide();
    this.focus();//Focus stuff
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    this.saveForUndo();
    if (sColor!=null && sColor!="") 
    {
        oEditor.document.execCommand(sType,false,sColor);
        //spy setelah apply bisa select & ditampilkan di tag selector
        var sel = oEditor.getSelection();
        var range = sel.getRangeAt(0);
        if (range.startContainer.nodeType==Node.TEXT_NODE)
      {
            var el = range.startContainer.nextSibling;
            if (el)
        {
                range = oEditor.document.createRange();
                range.selectNode(el);
                sel = oEditor.getSelection();
                sel.removeAllRanges();
                sel.addRange(range);
        }
      }
    }
  else
    {
        var el = getSelectedElement(oEditor.getSelection());
        if (sType=="ForeColor")
      {
      el.style.color="";
      }
    else if (sType=="HiliteColor")
      {
      el.style.backgroundColor = "";
      }
    }

    realTime(this);
    if(sColor=="")return;
    //this.selectElement(0);
    }
function applyParagraph(val)
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    this.hide();
    this.saveForUndo();
    this.doCmd("FormatBlock",val);
    }
function applyFontName(val)
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    this.hide();
    this.saveForUndo();
    this.doCmd("fontname",val);
    }
function applyFontSize(val)
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    this.hide();
    this.saveForUndo();
    this.doCmd("fontsize",val);
    
    replaceWithSpan(oEditor);
    realTime(this);
    }
function applyBullets()
    {
    this.saveForUndo();
    this.doCmd("InsertUnOrderedList");
  this.tbar.btns["btnNumbering"+this.oName].setState(1);

    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    var oElement = getSelectedElement(oSel);
    while (oElement!=null&&
        oElement.tagName!="OL"&&
        oElement.tagName!="UL")
        {
        if(oElement.tagName=="BODY")return;
        oElement=oElement.parentNode;
        }
    oElement.removeAttribute("type",0);
    oElement.style.listStyleImage="";
    }
function applyNumbering()
    {
    this.saveForUndo();
    this.doCmd("InsertOrderedList");
    this.tbar.btns["btnBullets"+this.oName].setState(1);

    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    var oElement = getSelectedElement(oSel);
    while (oElement!=null&&
        oElement.tagName!="OL"&&
        oElement.tagName!="UL")
        {
        if(oElement.tagName=="BODY")return;
        oElement=oElement.parentNode;
        }
    oElement.removeAttribute("type",0);
    oElement.style.listStyleImage="";
    }
function applyJustifyLeft()
    {
    this.saveForUndo();
    this.doCmd("JustifyLeft");
    }
function applyJustifyCenter()
    {
    this.saveForUndo();
    this.doCmd("JustifyCenter");
    }
function applyJustifyRight()
    {
    this.saveForUndo();
    this.doCmd("JustifyRight");
    }
function applyJustifyFull()
    {
    this.saveForUndo();
    this.doCmd("JustifyFull");
    }
function applyBlockDirLTR()
    {
    this.saveForUndo();
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    var oEl = getSelectedElement(oSel);
    if (oEl.dir) oEl.removeAttribute("dir"); else oEl.dir = "ltr"; 
    this.focus();
    }
function applyBlockDirRTL()
    {
    this.saveForUndo();
    //this.doCmd("BlockDirRTL");
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    var oEl = getSelectedElement(oSel);
    if (oEl.dir) oEl.removeAttribute("dir"); else oEl.dir = "rtl"; 
    this.focus();
    }
function insertCustomTag(index)
  {
  this.insertHTML(this.arrCustomTag[index][1]);
  this.hide();
  this.focus();
  }
function expandSelection()
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    var range = oSel.getRangeAt(0);
    if (range.startContainer.nodeType == Node.TEXT_NODE) 
        {
        if (range.toString() == "") 
            {
            //select a word
            var sPos = range.startOffset;
            var ePos = range.endOffset;
            var startCont = range.startContainer;
            var str = startCont.nodeValue;
            sPos = str.substring(0, range.startOffset).search(/(\W+\w*)$/i);
            sPos = sPos == -1 ? 0 : sPos;
            var tPos = str.substring(sPos, range.startOffset).search(/\w+/i);
            sPos += (tPos==-1 ? str.substring(sPos, range.startOffset).length : tPos);
            ePos = str.substr(range.endOffset).search(/\W+/i);
            ePos = ePos == -1 ? str.length : ePos + range.endOffset;
            range = oEditor.document.createRange();
            range.setStart(startCont, sPos);
            range.setEnd(startCont, ePos);
            oSel = oEditor.getSelection();
            oSel.removeAllRanges();
            oSel.addRange(range);
            }
        }
    
    return;
    }
function selectParagraph()
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    var selParent = getSelectedElement(oSel);
    if(selParent)
        {
        if(oSel.getRangeAt(0).toString()=="")
            {
            var oElement=selParent;
            while (oElement!=null&&
                oElement.tagName!="H1"&&
                oElement.tagName!="H2"&&
                oElement.tagName!="H3"&&
                oElement.tagName!="H4"&&
                oElement.tagName!="H5"&&
                oElement.tagName!="H6"&&
                oElement.tagName!="PRE"&&
                oElement.tagName!="P"&&
                oElement.tagName!="DIV")
                {
                if(oElement.tagName=="BODY")return;
                oElement=oElement.parentNode;
                }
            
            var range = oEditor.document.createRange();
            range.selectNode(oElement);
            oSel = oEditor.getSelection();
            oSel.removeAllRanges();
            oSel.addRange(range);
            }
        }
    }
    
function insertHTML(sHTML)
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    var range = oSel.getRangeAt(0);
    
    this.saveForUndo();
    
    var docFrag = range.createContextualFragment(sHTML);
    range.collapse(true);
    var lastNode = docFrag.childNodes[docFrag.childNodes.length-1];
    range.insertNode(docFrag);
    try { oEditor.document.designMode="on"; } catch (e) {}
    if (lastNode.nodeType==Node.TEXT_NODE) 
        {
        range = oEditor.document.createRange();
        range.setStart(lastNode, lastNode.nodeValue.length);
        range.setEnd(lastNode, lastNode.nodeValue.length);
        oSel = oEditor.getSelection();
        oSel.removeAllRanges();
        oSel.addRange(range);
        
        var comCon=range.commonAncestorContainer;
        if(comCon && comCon.parentNode) {
          try {comCon.parentNode.normalize();}catch(e) {}
          }
        }
    }
    
function insertLink(url,title,target)
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    var range = oSel.getRangeAt(0);
    
    this.saveForUndo();

    var emptySel = false;
    if(range.toString()=="")
        {
        if (range.startContainer.nodeType==Node.ELEMENT_NODE) {
          if (range.startContainer.childNodes[range.startOffset].nodeType != Node.TEXT_NODE) { 
              if (range.startContainer.childNodes[range.startOffset].nodeName=="BR") emptySel = true; else emptySel=false;  
          } else { 
              emptySel = true; 
          }
        } else {
              emptySel = true;
        }
        
        if (emptySel) {
          var cap = (title!="" && title!=null ? title : url);
          var node = oEditor.document.createTextNode(cap);
          range.insertNode(node);
          try { oEditor.document.designMode="on"; } catch (e) {}

          range = oEditor.document.createRange();
          range.setStart(node, 0);
          range.setEnd(node, cap.length);

          oSel = oEditor.getSelection();
          oSel.removeAllRanges();
          oSel.addRange(range);
        }
    }
    var isSelInMidText = (range.startContainer.nodeType==Node.TEXT_NODE) && (range.startOffset>0);
    oEditor.document.execCommand("CreateLink", false, url);
    
    oSel = oEditor.getSelection();
    range = oSel.getRangeAt(0);

        //get A element
        if (range.startContainer.nodeType == Node.TEXT_NODE) {
            var node = (emptySel || !isSelInMidText ? range.startContainer.parentNode : range.startContainer.nextSibling); 

//A node
            range = oEditor.document.createRange();
            range.selectNode(node);
            
            oSel = oEditor.getSelection();
            oSel.removeAllRanges();
            oSel.addRange(range);
            
        }
        
        var oEl = range.startContainer.childNodes[range.startOffset];
        if(oEl) {
            if(target!="" && target!=undefined)oEl.target=target;
        }
    }
    
function clearAll()
    {
    if(confirm(getTxt("Are you sure you wish to delete all contents?"))==true)
        {
        this.saveForUndo();
        var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
        oEditor.document.body.innerHTML="<BR>";
        oEditor.focus();
        }
    }
function applySpan(blockTag)
    {
    var useBlock = "SPAN";
    if (blockTag!=null && blockTag!="") useBlock = blockTag;
    
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    
    var range;
    var oElement;
    var sHTML;
    if (!isTextSelected(oSel)) { //if not text selection
        range = oSel.getRangeAt(0);
        oElement = getSelectedElement(oSel);
        if(oElement.nodeName==useBlock) return oElement;
        return;
    }
    range = oSel.getRangeAt(0);
    sHTML=range.toString();
    
    var docFrag = range.extractContents();
    var idSpan = oEditor.document.createElement(useBlock);
    idSpan.appendChild(docFrag);
    range.insertNode(idSpan);
    try { oEditor.document.designMode="on"; } catch (e){}
    
    range = oEditor.document.createRange();
    range.selectNode(idSpan);
    oSel = oEditor.getSelection();
    oSel.removeAllRanges();
    oSel.addRange(range);
    
    return idSpan;
    }
function makeAbsolute()
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var oSel=oEditor.getSelection();
    var oEl = getSelectedElement(oSel);
    
    this.saveForUndo();
    
    if(oEl!=null && oEl.nodeName!="BODY")
        {
        if (oEl.style.position == "absolute") oEl.style.position="";
        else oEl.style.position="absolute";
        }
    }

/*** Table Insert Dropdown ***/
function doOver_TabCreate(el)
    {
    var oTD=el;
    var oTable=oTD.parentNode.parentNode.parentNode;
    var nRow=oTD.parentNode.rowIndex;
    var nCol=oTD.cellIndex; 
    var rows=oTable.rows;
    var custCell = rows[rows.length-1].childNodes[0];
    custCell.innerHTML="<div align=right>"+(nRow*1+1) + " x " + (nCol*1+1) + " " + getTxt("Table Dimension Text") + " ...  &nbsp;&nbsp;&nbsp;<span style='text-decoration:underline'>" + getTxt("Table Advance Link") + "</span>&nbsp;</div>";
    
    custCell.style.backgroundColor="";
    custCell.style.color="#000000";
    custCell.style.border="0px";
    for(var i=0;i<rows.length-1;i++) 
        {
        var oRow=rows[i];
        for(var j=0;j<oRow.childNodes.length;j++)
            {
            var oCol=oRow.childNodes[j];
            if(i<=nRow&&j<=nCol)oCol.style.backgroundColor="#316ac5";
            else oCol.style.backgroundColor="#ffffff";
            }
        }
    //event.cancelBubble=true;
    }    
function doOut_TabCreate(el)
    {
    var oTable=el;
    if(oTable.nodeName!="TABLE")return;
    var rows=oTable.rows;
    rows[rows.length-1].childNodes[0].innerHTML=getTxt("Advanced Table Insert");
    for(var i=0;i<rows.length-1;i++) 
        {
        var oRow=rows[i];
        for(var j=0;j<oRow.childNodes.length;j++)
            {
            var oCol=oRow.childNodes[j];
            oCol.style.backgroundColor="#ffffff";
            }
        }
    //event.cancelBubble=true;
    }    
function doRefresh_TabCreate()
    {
    var oTable=document.getElementById("dropTableCreate"+this.oName);
    var rows=oTable.rows;
    rows[rows.length-1].childNodes[0].innerHTML=getTxt("Advanced Table Insert");
    for(var i=0;i<rows.length-1;i++) 
        {
        var oRow=rows[i];
        for(var j=0;j<oRow.childNodes.length;j++)
            {
            var oCol=oRow.childNodes[j];
            oCol.style.backgroundColor="#ffffff";
            }
        }
    }
function doClick_TabCreate(el)
    {
    this.hide();
    
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    
    var oTD=el;
    var nRow=oTD.parentNode.rowIndex+1;
    var nCol=oTD.cellIndex+1;
    
    this.saveForUndo();

    var sHTML="<table style='border-collapse:collapse;width:100%;' selThis='selThis'>";
    for(var i=1;i<=nRow;i++)
        {
        sHTML+="<tr>";
        for(var j=1;j<=nCol;j++)
            {           
            sHTML+="<td style='border:#000000 1px solid'><br/></td>";
            }
        sHTML+="</tr>";
        }
    sHTML+="</table>";
    
    var oSel=oEditor.getSelection();
    var range = oSel.getRangeAt(0);
    range.collapse(true);
    
    var docFrag = range.createContextualFragment(sHTML);
    range.insertNode(docFrag);
    try { oEditor.document.designMode="on"; } catch (e) {}
    var allTabs = oEditor.document.getElementsByTagName("TABLE");
    for (var i = 0; i< allTabs.length; i++) {
        if (allTabs[i].getAttribute("selThis") == "selThis") {
            range = oEditor.document.createRange();
            range.selectNode(allTabs[i]);
            oSel = oEditor.getSelection();
            oSel.removeAllRanges();
            oSel.addRange(range);
            allTabs[i].removeAttribute("selThis");
            break;
        }
    }
    realTime(this);
    }

/*** doKeyPress ***/
function doKeyPress(evt,obj)
    {    
    if(!obj.arrUndoList[0]){obj.saveForUndo();}//pengganti saveForUndo_First

    if(evt.ctrlKey)
        {
        switch (evt.keyCode) 
            {
            //case 89: obj.doRedo(); break; //redo, CTRL-Y
            //case 90: obj.doUndo(); break; //undo, CTRL-Z
            case 86: //CTRL-V
        window.setTimeout("eval('"+obj.oName+"').cleanDeprecated();",5);
        break; 
            //case 88: obj.saveForUndo(); break; //CTRL-X
            }
        }

    if(evt.keyCode==37||evt.keyCode==38||evt.keyCode==39||evt.keyCode==40)//Arrow
        {
        obj.saveForUndo();//Save for Undo
        }

    if(evt.keyCode==13)
        { 
        obj.saveForUndo();//Save for Undo
        }

  obj.onKeyPress();
    }

/*** fullScreen ***/
function fullScreen()
    {
    var oEditor=document.getElementById("idContent"+this.oName).contentWindow;
    var edtArea = document.getElementById("idArea"+this.oName);

    this.hide();

    if(this.stateFullScreen)
        {
        this.onNormalScreen();
        this.stateFullScreen=false;
        document.body.style.overflow="";
        document.getElementById("id_refresh_z_index").style.margin="0px";
        edtArea.style.position="";
        edtArea.style.top="0px";
        edtArea.style.left="0px";

        if(this.width.toString().indexOf("%")!=-1)edtArea.style.width=this.width;
        else edtArea.style.width=parseInt(this.width)+"px";

    if(this.height.toString().indexOf("%")!=-1)edtArea.style.height=this.height;
    else edtArea.style.height=parseInt(this.height)+"px";    

        for(var i=0;i<oUtil.arrEditor.length;i++)
            {
            if(oUtil.arrEditor[i]!=this.oName) 
        {
        document.getElementById("idArea"+oUtil.arrEditor[i]).style.display="";
        try { document.getElementById("idContent"+oUtil.arrEditor[i]).contentWindow.document.designMode="on"; } catch (e) {}//new
        }
            }
        }
    else
        {
        this.onFullScreen();
        this.stateFullScreen=true;
        window.scroll(0,0);
        document.body.style.overflow="hidden";
        document.getElementById("id_refresh_z_index").style.margin="70px";
        edtArea.style.position="absolute";
        edtArea.style.top="0px";
        edtArea.style.left="0px";
        edtArea.style.width=window.innerWidth+"px";
        edtArea.style.height=window.innerHeight+"px";
        edtArea.style.zIndex = 2000;

        for(var i=0;i<oUtil.arrEditor.length;i++)
            {
            if(oUtil.arrEditor[i]!=this.oName) document.getElementById("idArea"+oUtil.arrEditor[i]).style.display="none";
            }
        oEditor.focus();
        }
       
  try { oEditor.document.designMode="on"; } catch (e) {}
  
  var idStyles=document.getElementById("idStyles"+this.oName);
  idStyles.innerHTML=""
    }

/*** Show/Hide Dropdown ***/
function modelessDialogShow(url,width,height)
    {
    var left = screen.availWidth/2 - width/2;
    var top = screen.availHeight/2 - height/2;
    window.open(url, "", "dependent=yes,scrollbars=1,width="+width+"px,height="+height+",left="+left+",top="+top);
    }

function modalDialogShow(url,width,height)
    {
    var left = screen.availWidth/2 - width/2;
    var top = screen.availHeight/2 - height/2;
    oUtil.activeModalWin = window.open(url, "", "width="+width+"px,height="+height+",left="+left+",top="+top);
    window.onfocus = function(){if (oUtil.activeModalWin.closed == false){oUtil.activeModalWin.focus();};};
    }

function hide()
    {
    hideAllDD();
  
    this.oColor1.hide();
    this.oColor2.hide();

    //additional
    if(this.btnTable)this.doRefresh_TabCreate();
    
    }

/*** HTML to XHTML ***/
function lineBreak1(tag) //[0]<TAG>[1]text[2]</TAG>
  {
  arrReturn = ["\n","",""];
  if( tag=="A"||tag=="B"||tag=="CITE"||tag=="CODE"||tag=="EM"|| 
    tag=="FONT"||tag=="I"||tag=="SMALL"||tag=="STRIKE"||tag=="BIG"||
    tag=="STRONG"||tag=="SUB"||tag=="SUP"||tag=="U"||tag=="SAMP"||
    tag=="S"||tag=="VAR"||tag=="BASEFONT"||tag=="KBD"||tag=="TT"||tag=="SPAN"||tag=="IMG") 
    arrReturn=["","",""];

  if( tag=="TEXTAREA"||tag=="TABLE"||tag=="THEAD"||tag=="TBODY"|| 
    tag=="TR"||tag=="OL"||tag=="UL"||tag=="DIR"||tag=="MENU"|| 
    tag=="FORM"||tag=="SELECT"||tag=="MAP"||tag=="DL"||tag=="HEAD"|| 
    tag=="BODY"||tag=="HTML") 
    arrReturn=["\n","","\n"];

  if( tag=="STYLE"||tag=="SCRIPT")
    arrReturn=["\n","",""];

  if(tag=="BR"||tag=="HR") 
    arrReturn=["","\n",""];

  return arrReturn;
  }  
function fixAttr(s)
  {
  s = String(s).replace(/&/g, "&amp;");
  s = String(s).replace(/</g, "&lt;");
  s = String(s).replace(/"/g, "&quot;");
  return s;
  }  
function fixVal(s)
  {
  s = String(s).replace(/&/g, "&amp;");
  s = String(s).replace(/</g, "&lt;");
  var x = escape(s);
  x = unescape(x.replace(/\%A0/gi, "-*REPL*-"));
  s = x.replace(/-\*REPL\*-/gi, "&nbsp;");
  return s;
  }  
function recur(oEl,sTab)
  {
  var sHTML="";
  for(var i=0;i<oEl.childNodes.length;i++)
    {
    var oNode=oEl.childNodes[i];
    if(oNode.nodeType==1)//tag
      {
      var sTagName = oNode.nodeName;

      var bDoNotProcess=false;
      if(sTagName.substring(0,1)=="/")
        {
        bDoNotProcess=true;//do not process
        }
      else
        {
        /*** tabs ***/
        var sT= sTab;
        sHTML+= lineBreak1(sTagName)[0];  
        if(lineBreak1(sTagName)[0] !="") sHTML+= sT;//If new line, use base Tabs
        /************/
        }

      if(bDoNotProcess)
        {
        ;//do not process
        }
      else if(sTagName=="OBJECT" || sTagName=="EMBED")
        {   
        s=getOuterHTML(oNode);

        s=s.replace(/\"[^\"]*\"/ig,function(x){           
            x=x.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/'/g, "&apos;").replace(/\s+/ig,"#_#").replace(/&amp;amp;/gi,"&amp;");
            return x});
        s=s.replace(/<([^ >]*)/ig,function(x){return x.toLowerCase()})            
        s=s.replace(/ ([^=]+)=([^"' >]+)/ig," $1=\"$2\"");//new
        
        s=s.replace(/ ([^=]+)=/ig,function(x){return x.toLowerCase()});
        s=s.replace(/#_#/ig," ");
        
        s=s.replace(/<param([^>]*)>/ig,"\n<param$1 />").replace(/\/ \/>$/ig," \/>");//no closing tag

        if(sTagName=="EMBED")
          if(oNode.innerHTML=="")
            s=s.replace(/>$/ig," \/>").replace(/\/ \/>$/ig,"\/>");//no closing tag
        
        s=s.replace(/<param name=\"Play\" value=\"0\" \/>/,"<param name=\"Play\" value=\"-1\" \/>")
        
        sHTML+=s;
        }
      else if(sTagName=="TITLE")
        {
        sHTML+="<title>"+oNode.innerHTML+"</title>";
        }
      else
        {
        if(sTagName=="AREA")
          {
          var sCoords=oNode.coords;
          var sShape=oNode.shape;
          }
          
        var oNode2=oNode.cloneNode(false);       
        s=getOuterHTML(oNode2).replace(/<\/[^>]*>/,"");
        
        if(sTagName=="STYLE")
          {
          var arrTmp=s.match(/<[^>]*>/ig);
          s=arrTmp[0];
          }       

        s=s.replace(/\"[^\"]*\"/ig,function(x){
            //x=x.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/'/g, "&apos;").replace(/\s+/ig,"#_#");
            //x=x.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\s+/ig,"#_#");
            x=x.replace(/&/g, "&amp;").replace(/&amp;amp;/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\s+/ig,"#_#");
            return x});
            //info ttg: .replace(/&amp;amp;/g, "&amp;")
            //ini karena '&' di (hanya) '&amp;' selalu di-replace lagi dgn &amp;.
            //tapi kalau &lt; , &gt; tdk (no problem) => default behaviour
    
        s=s.replace(/<([^ >]*)/ig,function(x){return x.toLowerCase()})            
        s=s.replace(/ ([^=]+)=([^" >]+)/ig," $1=\"$2\"");
        s=s.replace(/ ([^=]+)=/ig,function(x){return x.toLowerCase()});
        s=s.replace(/#_#/ig," ");
        
        //single attribute
        s=s.replace(/(<hr[^>]*)(noshade="")/ig,"$1noshade=\"noshade\"");
        s=s.replace(/(<input[^>]*)(checked="")/ig,"$1checked=\"checked\"");
        s=s.replace(/(<select[^>]*)(multiple="")/ig,"$1multiple=\"multiple\"");
        s=s.replace(/(<option[^>]*)(selected="")/ig,"$1selected=\"true\"");
        s=s.replace(/(<input[^>]*)(readonly="")/ig,"$1readonly=\"readonly\"");
        s=s.replace(/(<input[^>]*)(disabled="")/ig,"$1disabled=\"disabled\"");
        s=s.replace(/(<td[^>]*)(nowrap="" )/ig,"$1nowrap=\"nowrap\" ");
        s=s.replace(/(<td[^>]*)(nowrap=""\>)/ig,"$1nowrap=\"nowrap\"\>");
        
        s=s.replace(/ contenteditable=\"true\"/ig,"");
        
        if(sTagName=="AREA")
          {
          s=s.replace(/ coords=\"0,0,0,0\"/ig," coords=\""+sCoords+"\"");
          s=s.replace(/ shape=\"RECT\"/ig," shape=\""+sShape+"\"");
          }
          
        var bClosingTag=true;
        if(sTagName=="IMG"||sTagName=="BR"||
          sTagName=="AREA"||sTagName=="HR"|| 
          sTagName=="INPUT"||sTagName=="BASE"||
          sTagName=="LINK")//no closing tag
          {
          s=s.replace(/>$/ig," \/>").replace(/\/ \/>$/ig,"\/>");//no closing tag
          bClosingTag=false;      
          }         
        
        sHTML+=s;       
          
        /*** tabs ***/
        if(sTagName!="TEXTAREA")sHTML+= lineBreak1(sTagName)[1];
        if(sTagName!="TEXTAREA")if(lineBreak1(sTagName)[1] !="") sHTML+= sT;//If new line, use base Tabs
        /************/  
        
        if(bClosingTag)
          {
          /*** CONTENT ***/
          s=getOuterHTML(oNode);
          if(sTagName=="SCRIPT")
            {
            s = s.replace(/<script([^>]*)>[\n+\s+\t+]*/ig,"<script$1>");//clean spaces
            s = s.replace(/[\n+\s+\t+]*<\/script>/ig,"<\/script>");//clean spaces
            s = s.replace(/<script([^>]*)>\/\/<!\[CDATA\[/ig,"");
            s = s.replace(/\/\/\]\]><\/script>/ig,"");
            s = s.replace(/<script([^>]*)>/ig,"");
            s = s.replace(/<\/script>/ig,"");         
            s = s.replace(/^\s+/,'').replace(/\s+$/,'');            

            sHTML+="\n"+
              sT + "//<![CDATA[\n"+
              sT + s + "\n" +
              sT + "//]]>\n"+sT;

            }
          if(sTagName=="STYLE")
            {       
            s = s.replace(/<style([^>]*)>[\n+\s+\t+]*/ig,"<style$1>");//clean spaces
            s = s.replace(/[\n+\s+\t+]*<\/style>/ig,"<\/style>");//clean spaces         
            s = s.replace(/<style([^>]*)><!--/ig,"");
            s = s.replace(/--><\/style>/ig,"");
            s = s.replace(/<style([^>]*)>/ig,"");
            s = s.replace(/<\/style>/ig,"");          
            s = s.replace(/^\s+/,"").replace(/\s+$/,"");            
            
            sHTML+="\n"+
              sT + "<!--\n"+
              sT + s + "\n" +
              sT + "-->\n"+sT;
            }
          if(sTagName=="DIV"||sTagName=="P")
            {
            if(oNode.innerHTML==""||oNode.innerHTML=="&nbsp;") 
              {
              sHTML+="&nbsp;";
              }
            else sHTML+=recur(oNode,sT+"\t");
            }
          else
          if (sTagName == "STYLE" || sTagName=="SCRIPT")
            {
            //do nothing
            }
          else
            {
            sHTML+=recur(oNode,sT+"\t");  
            }         
            
          /*** tabs ***/
          if(sTagName!="TEXTAREA")sHTML+=lineBreak1(sTagName)[2];
          if(sTagName!="TEXTAREA")if(lineBreak1(sTagName)[2] !="")sHTML+=sT;//If new line, use base Tabs
          /************/
            
          sHTML+="</" + sTagName.toLowerCase() + ">";
          }     
        }     
      }
    else if(oNode.nodeType==3)//text
      {
      sHTML+= fixVal(oNode.nodeValue);
      }
    else if(oNode.nodeType==8)
      {
      if(getOuterHTML(oNode).substring(0,2)=="<"+"%")
        {//server side script
        sTmp=(getOuterHTML(oNode).substring(2))
        sTmp=sTmp.substring(0,sTmp.length-2)
        sTmp = sTmp.replace(/^\s+/,"").replace(/\s+$/,"");
        
        /*** tabs ***/
        var sT= sTab;
        /************/
        
        sHTML+="\n" +
          sT + "<%\n"+
          sT + sTmp + "\n" +
          sT + "%>\n"+sT;
        }
      else
        {//comments

        /*** tabs ***/
        var sT= sTab;
        /************/
        
        sTmp=oNode.nodeValue;
        sTmp = sTmp.replace(/^\s+/,"").replace(/\s+$/,"");
        
        sHTML+="\n" +
          sT + "<!--\n"+
          sT + sTmp + "\n" +
          sT + "-->\n"+sT;
        }
      }
    else
      {
      ;//Not Processed
      }
    }
  return sHTML;
  }

/*** Netscape range methods ***/
function getSelectedElement(sel) 
  {
    var range = sel.getRangeAt(0);
    var node = range.startContainer;
    if (node.nodeType == Node.ELEMENT_NODE) 
    {
        if (range.startOffset >= node.childNodes.length) return node;
        node = node.childNodes[range.startOffset];
    }
    if (node.nodeType == Node.TEXT_NODE) 
    {    
        if (node.nodeValue.length == range.startOffset) 
      {
      var el = node.nextSibling;
      if (el && el.nodeType==Node.ELEMENT_NODE) 
        {
        if (range.endContainer.nodeType==Node.TEXT_NODE && range.endContainer.nodeValue.length == range.endOffset) 
          {
          if (el == range.endContainer.parentNode) 
            {
            return el;
            }
          }
        }
      }    
        while (node!=null && node.nodeType != Node.ELEMENT_NODE) 
      {
            node = node.parentNode;
      }
    }    
    return node;
  }
function isTextSelected(sel) 
  {
    var range = sel.getRangeAt(0);    
    if (range!=null && range.startContainer!=null) 
    {
        return (range.startContainer.nodeType == Node.TEXT_NODE);
    }
    return false;
  }
function getOuterHTML(node) 
  {
    var sHTML = "";
    switch (node.nodeType) 
    {
        case Node.ELEMENT_NODE:
            sHTML = "<" + node.nodeName;
            
            var tagVal ="";
            for (var atr=0; atr < node.attributes.length; atr++) 
        {       
                if (node.attributes[atr].nodeName.substr(0,4) == "_moz" ) continue;
                if (node.attributes[atr].nodeValue.substr(0,4) == "_moz" ) continue;//yus                
                if (node.nodeName=='TEXTAREA' && node.attributes[atr].nodeName.toLowerCase()=='value') 
          {
                    tagVal = node.attributes[atr].nodeValue;
          } 
        else 
          {
                    sHTML += ' ' + node.attributes[atr].nodeName + '="' + node.attributes[atr].nodeValue + '"';
          }
        }
            sHTML += '>'; 
            sHTML += (node.nodeName!='TEXTAREA' ? node.innerHTML : tagVal);
            sHTML += "</"+node.nodeName+">";
            break;
        case Node.COMMENT_NODE:
            sHTML = "<!"+"--"+node.nodeValue+ "--"+">"; break;
        case Node.TEXT_NODE:
            sHTML = node.nodeValue; break;
    }
    return sHTML
  }
  
function tbAction(tb, id, edt, sfx) {
  var e=edt, oN=sfx, btn=id.substring(0, id.lastIndexOf(oN));
  
  switch(btn) {
    case "btnSave": e.onSave();break;
    case "btnFullScreen": e.fullScreen(); break;
    case "btnPrint": e.focus();document.getElementById("idContent"+edt.oName).contentWindow.print(); break;
    case "btnSearch": e.hide(); modelessDialogShow(e.scriptPath+"search.htm",375,163); break;
    case "btnSpellCheck": e.hide(); 
      if(e.spellCheckMode=="ieSpell") ; 
      else if(e.spellCheckMode=="NetSpell") checkSpellingById("idContent"+edt.oName);
      break;
    case "btnCut": e.doCmd("Cut"); break;
    case "btnCopy": e.doCmd("Copy"); break;
    //case "btnPaste": e.doPaste(); break;
    //case "btnPasteWord": e.hide(); modelessDialogShow(e.scriptPath+"paste_word.htm",400,280); break;
    //case "btnPasteText": e.hide(); modelessDialogShow(e.scriptPath+"paste_text.htm",400,280); break;
    case "btnUndo": e.doUndo(); break;
    case "btnRedo": e.doRedo(); break;
    case "btnBold": e.doCmd("Bold"); break;
    case "btnItalic": e.doCmd("Italic"); break;
    case "btnUnderline": e.doCmd("Underline"); break;
    case "btnStrikethrough": e.doCmd("Strikethrough"); break;
    case "btnSuperscript": e.doCmd("Superscript"); break;
    case "btnSubscript": e.doCmd("Subscript"); break;
    case "btnJustifyLeft": e.applyJustifyLeft(); break;
    case "btnJustifyCenter": e.applyJustifyCenter(); break;
    case "btnJustifyRight": e.applyJustifyRight(); break;
    case "btnJustifyFull": e.applyJustifyFull(); break;
    case "btnNumbering": e.applyNumbering(); break;
    case "btnBullets": e.applyBullets(); break;
    case "btnIndent": e.doCmd("Indent"); break;
    case "btnOutdent": e.doCmd("Outdent"); break;
    case "btnLTR": e.applyBlockDirLTR(); break;
    case "btnRTL": e.applyBlockDirRTL(); break;
    case "btnForeColor": e.oColor1.show(document.getElementById(id)); break;
    case "btnBackColor": e.oColor2.show(document.getElementById(id)); break;
    case "btnBookmark": e.hide();modelessDialogShow(e.scriptPath+"bookmark.htm",245,216); break;
    case "btnHyperlink": e.hide();modelessDialogShow(e.scriptPath+"hyperlink.htm",380,220); break;
    case "btnImage": e.hide();modelessDialogShow(e.scriptPath+"image.htm",440,351); break;
    case "btnFlash": e.hide();modelessDialogShow(e.scriptPath+"flash.htm",340,275); break;
    case "btnMedia": e.hide();modelessDialogShow(e.scriptPath+"media.htm",340,272); break;
    case "btnContentBlock": e.hide(); eval(e.cmdContentBlock); break;
    case "btnInternalLink": e.hide(); eval(e.cmdInternalLink); break;
    case "btnInternalImage": e.hide(); eval(e.cmdInternalImage); break;
    case "btnCustomObject": e.hide(); eval(e.cmdCustomObject); break;
    case "btnGuidelines": e.runtimeBorder(true); break;
    case "btnAbsolute": e.makeAbsolute(); break;
    case "btnCharacters": e.hide();modelessDialogShow(e.scriptPath+"characters.htm",495,162); break;
    case "btnLine": e.doCmd("InsertHorizontalRule"); break;
    case "btnRemoveFormat": e.doClean(); break;
    case "btnHTMLFullSource": setActiveEditor(edt);e.hide();modalDialogShow(e.scriptPath+"source_html_full.htm",600,450); break;
    case "btnHTMLSource": setActiveEditor(edt);e.hide();modalDialogShow(e.scriptPath+"source_html.htm",600,450); break;
    case "btnXHTMLFullSource": setActiveEditor(edt);e.hide();modalDialogShow(e.scriptPath+"source_xhtml_full.htm",600,450); break;
    case "btnXHTMLSource": setActiveEditor(edt);e.hide();modalDialogShow(e.scriptPath+"source_xhtml.htm",600,450); break;
    case "btnClearAll": e.clearAll(); break;
    case "btnStyles": e.hide(); e.openStyleSelect(); break;
    case "btnParagraph": e.hide(); e.selectParagraph(); break;
    case "btnFontName": e.hide(); e.expandSelection(); realtimeFontSelect(e.oName); break;
    case "btnFontSize": e.hide(); e.expandSelection(); realtimeSizeSelect(e.oName); break;
    default:
      for (var i=0;i<e.arrCustomButtons.length;i++){
        if(e.arrCustomButtons[i][0]==btn) {
          eval(e.arrCustomButtons[i][1]);
          break;
        }
      }    
  }
}

function ddAction(tb, id, edt, sfx) {
  var oN=sfx;
  var e=edt;
  var btn=id.substring(0, id.lastIndexOf(oN));
  
  switch(btn) {
    case "btnPreview1":
      setActiveEditor(edt);
      modalDialogShow(e.scriptPath+"preview.htm",640,480); 
      break;
    case "btnPreview2": 
      setActiveEditor(edt);
      modalDialogShow(e.scriptPath+"preview.htm",800,600); 
      break;
    case "btnPreview3": 
      setActiveEditor(edt);
      modalDialogShow(e.scriptPath+"preview.htm",1024,768); 
      break;
    case "btnTextFormatting": modelessDialogShow(e.scriptPath+"text1.htm",511,465); break;
    case "btnParagraphFormatting": modelessDialogShow(e.scriptPath+"paragraph.htm",440,284); break;
    case "btnListFormatting": modelessDialogShow(e.scriptPath+"list.htm",270,335); break;
    case "btnBoxFormatting": modelessDialogShow(e.scriptPath+"box.htm",438,380); break;
    case "btnCssText": modelessDialogShow(e.scriptPath+"styles_cssText.htm",360,332); break;
    case "btnCssBuilder": modelessDialogShow(e.scriptPath+"styles_cssText2.htm",430,445); break;
    case "btnForm0": modelessDialogShow(e.scriptPath+"form_form.htm", 280, 177); break;
    case "btnForm1": modelessDialogShow(e.scriptPath+"form_text.htm", 285, 289); break;
    case "btnForm2": modelessDialogShow(e.scriptPath+"form_list.htm", 295, 332); break;
    case "btnForm3": modelessDialogShow(e.scriptPath+"form_check.htm", 235, 174); break;
    case "btnForm4": modelessDialogShow(e.scriptPath+"form_radio.htm", 235, 177); break;
    case "btnForm5": modelessDialogShow(e.scriptPath+"form_hidden.htm", 235, 152); break;
    case "btnForm6": modelessDialogShow(e.scriptPath+"form_file.htm", 235, 132); break;
    case "btnForm7": modelessDialogShow(e.scriptPath+"form_button.htm", 235, 174); break;
    case "mnuTableSize": modelessDialogShow(e.scriptPath+"table_size.htm",240,262); break;
    case "mnuTableEdit": modelessDialogShow(e.scriptPath+"table_edit.htm",358,380); break;
    case "mnuCellEdit": modelessDialogShow(e.scriptPath+"table_editCell.htm",427,440); break;
    //case "btnPasteClip": e.doPaste(); break;
    case "btnPasteWord": modelessDialogShow(e.scriptPath+"paste_word.htm",400,280); break;
    case "btnPasteText": modelessDialogShow(e.scriptPath+"paste_text.htm",400,280); break;    
  }
  
  var idx=0;
  if(btn.indexOf("btnParagraphFormatting")!=-1) {
  } else
  if(btn.indexOf("btnParagraph")!=-1) {
    idx=btn.substr(btn.indexOf("_")+1);
    e.applyParagraph(e.arrParagraph[parseInt(idx)][1]);
  } else
  if(btn.indexOf("btnFontName")!=-1) {
    idx=btn.substr(btn.indexOf("_")+1);
    e.applyFontName(e.arrFontName[parseInt(idx)]);
  } else
  if(btn.indexOf("btnFontSize")!=-1) {
    idx=btn.substr(btn.indexOf("_")+1);
    e.applyFontSize(e.arrFontSize[parseInt(idx)][1]);
  } else
  if(btn.indexOf("btnCustomTag")!=-1) {
    idx=btn.substr(btn.indexOf("_")+1);
    e.insertCustomTag(parseInt(idx));
  }
}

function changeHeight(v) {
  
  var cH = String(this.height);
  var edtObj = document.getElementById("idArea" + this.oName);
  if(cH.indexOf("%") > -1) {
    cH = edtObj.childNodes[0].offsetHeight;
  }

  if (!this.minHeight) this.minHeight = parseInt(cH,10);

  var newHeight = parseInt(cH, 10) + v;
  
  if(newHeight < this.minHeight) {
    if (this.minHeight) v = v + this.minHeight-newHeight;
    newHeight = this.minHeight;
  }
  
  if(v<0) {

    var tbar = this.tbar;
    if(tbar.tabCtl)tbar.tabCtl.tabs[tbar.tabCtl.selTab].obj.setVisibility(false);

    var cntParent = document.getElementById("cntContainer"+this.oName).offsetParent;
    cntParent.style.height = cntParent.offsetHeight + (v<0?v:0) + "px";

    var ifrmParent = document.getElementById("idContent"+this.oName).offsetParent;
    ifrmParent.style.height = ifrmParent.offsetHeight + (v<0?v:0) + "px";  

    this.height = newHeight + "px";
    edtObj.style.height = this.height;

    if(tbar.tabCtl) window.setTimeout(function() {
      tbar.tabCtl.tabs[tbar.tabCtl.selTab].obj.setVisibility(true);
    }, 0);
    
  
  } else if(v>0) {
    
    var tbar = this.tbar;
    if(tbar.tabCtl)tbar.tabCtl.tabs[tbar.tabCtl.selTab].obj.setVisibility(false);
  
    this.height = newHeight + "px";
    edtObj.style.height = this.height;

    if(tbar.tabCtl) window.setTimeout(function() {
      tbar.tabCtl.tabs[tbar.tabCtl.selTab].obj.setVisibility(true);
    }, 0);

    var cntParent = document.getElementById("cntContainer"+this.oName).offsetParent;
    cntParent.style.height = cntParent.offsetHeight + (v<0?v:0) + "px";

    var ifrmParent = document.getElementById("idContent"+this.oName).offsetParent;
    ifrmParent.style.height = ifrmParent.offsetHeight + (v<0?v:0) + "px";  

  }
  


}
/**********************************************************************************************************/
/** COMBINE INCLUDE MINIFIED LEVEL  20                                                                   **/
/** /var/www/dosdauter.de/www/javascript/prototype/1.6.0.3/prototype.minified.js                         **/
/**                                                                                                      **/
/**********************************************************************************************************/

var Prototype={Version:"1.6.1",Browser:(function(){var b=navigator.userAgent;var a=Object.prototype.toString.call(window.opera)=="[object Opera]";return{IE:!!window.attachEvent&&!a,Opera:a,WebKit:b.indexOf("AppleWebKit/")>-1,Gecko:b.indexOf("Gecko")>-1&&b.indexOf("KHTML")===-1,MobileSafari:/Apple.*Mobile.*Safari/.test(b)}})(),BrowserFeatures:{XPath:!!document.evaluate,SelectorsAPI:!!document.querySelector,ElementExtensions:(function(){var a=window.Element||window.HTMLElement;return !!(a&&a.prototype)})(),SpecificElementExtensions:(function(){if(typeof window.HTMLDivElement!=="undefined"){return true}var c=document.createElement("div");var b=document.createElement("form");var a=false;if(c.__proto__&&(c.__proto__!==b.__proto__)){a=true}c=b=null;return a})()},ScriptFragment:"<script[^>]*>([\\S\\s]*?)<\/script>",JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/,emptyFunction:function(){},K:function(a){return a}};if(Prototype.Browser.MobileSafari){Prototype.BrowserFeatures.SpecificElementExtensions=false}var Abstract={};var Try={these:function(){var c;for(var b=0,d=arguments.length;b<d;b++){var a=arguments[b];try{c=a();break}catch(f){}}return c}};var Class=(function(){function a(){}function b(){var g=null,f=$A(arguments);if(Object.isFunction(f[0])){g=f.shift()}function d(){this.initialize.apply(this,arguments)}Object.extend(d,Class.Methods);d.superclass=g;d.subclasses=[];if(g){a.prototype=g.prototype;d.prototype=new a;g.subclasses.push(d)}for(var e=0;e<f.length;e++){d.addMethods(f[e])}if(!d.prototype.initialize){d.prototype.initialize=Prototype.emptyFunction}d.prototype.constructor=d;return d}function c(k){var f=this.superclass&&this.superclass.prototype;var e=Object.keys(k);if(!Object.keys({toString:true}).length){if(k.toString!=Object.prototype.toString){e.push("toString")}if(k.valueOf!=Object.prototype.valueOf){e.push("valueOf")}}for(var d=0,g=e.length;d<g;d++){var j=e[d],h=k[j];if(f&&Object.isFunction(h)&&h.argumentNames().first()=="$super"){var l=h;h=(function(i){return function(){return f[i].apply(this,arguments)}})(j).wrap(l);h.valueOf=l.valueOf.bind(l);h.toString=l.toString.bind(l)}this.prototype[j]=h}return this}return{create:b,Methods:{addMethods:c}}})();(function(){var d=Object.prototype.toString;function i(q,s){for(var r in s){q[r]=s[r]}return q}function l(q){try{if(e(q)){return"undefined"}if(q===null){return"null"}return q.inspect?q.inspect():String(q)}catch(r){if(r instanceof RangeError){return"..."}throw r}}function k(q){var s=typeof q;switch(s){case"undefined":case"function":case"unknown":return;case"boolean":return q.toString()}if(q===null){return"null"}if(q.toJSON){return q.toJSON()}if(h(q)){return}var r=[];for(var u in q){var t=k(q[u]);if(!e(t)){r.push(u.toJSON()+": "+t)}}return"{"+r.join(", ")+"}"}function c(q){return $H(q).toQueryString()}function f(q){return q&&q.toHTML?q.toHTML():String.interpret(q)}function o(q){var r=[];for(var s in q){r.push(s)}return r}function m(q){var r=[];for(var s in q){r.push(q[s])}return r}function j(q){return i({},q)}function h(q){return !!(q&&q.nodeType==1)}function g(q){return d.call(q)=="[object Array]"}function p(q){return q instanceof Hash}function b(q){return typeof q==="function"}function a(q){return d.call(q)=="[object String]"}function n(q){return d.call(q)=="[object Number]"}function e(q){return typeof q==="undefined"}i(Object,{extend:i,inspect:l,toJSON:k,toQueryString:c,toHTML:f,keys:o,values:m,clone:j,isElement:h,isArray:g,isHash:p,isFunction:b,isString:a,isNumber:n,isUndefined:e})})();Object.extend(Function.prototype,(function(){var k=Array.prototype.slice;function d(o,l){var n=o.length,m=l.length;while(m--){o[n+m]=l[m]}return o}function i(m,l){m=k.call(m,0);return d(m,l)}function g(){var l=this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1].replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g,"").replace(/\s+/g,"").split(",");return l.length==1&&!l[0]?[]:l}function h(n){if(arguments.length<2&&Object.isUndefined(arguments[0])){return this}var l=this,m=k.call(arguments,1);return function(){var o=i(m,arguments);return l.apply(n,o)}}function f(n){var l=this,m=k.call(arguments,1);return function(p){var o=d([p||window.event],m);return l.apply(n,o)}}function j(){if(!arguments.length){return this}var l=this,m=k.call(arguments,0);return function(){var n=i(m,arguments);return l.apply(this,n)}}function e(n){var l=this,m=k.call(arguments,1);n=n*1000;return window.setTimeout(function(){return l.apply(l,m)},n)}function a(){var l=d([0.01],arguments);return this.delay.apply(this,l)}function c(m){var l=this;return function(){var n=d([l.bind(this)],arguments);return m.apply(this,n)}}function b(){if(this._methodized){return this._methodized}var l=this;return this._methodized=function(){var m=d([this],arguments);return l.apply(null,m)}}return{argumentNames:g,bind:h,bindAsEventListener:f,curry:j,delay:e,defer:a,wrap:c,methodize:b}})());Date.prototype.toJSON=function(){return'"'+this.getUTCFullYear()+"-"+(this.getUTCMonth()+1).toPaddedString(2)+"-"+this.getUTCDate().toPaddedString(2)+"T"+this.getUTCHours().toPaddedString(2)+":"+this.getUTCMinutes().toPaddedString(2)+":"+this.getUTCSeconds().toPaddedString(2)+'Z"'};RegExp.prototype.match=RegExp.prototype.test;RegExp.escape=function(a){return String(a).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")};var PeriodicalExecuter=Class.create({initialize:function(b,a){this.callback=b;this.frequency=a;this.currentlyExecuting=false;this.registerCallback()},registerCallback:function(){this.timer=setInterval(this.onTimerEvent.bind(this),this.frequency*1000)},execute:function(){this.callback(this)},stop:function(){if(!this.timer){return}clearInterval(this.timer);this.timer=null},onTimerEvent:function(){if(!this.currentlyExecuting){try{this.currentlyExecuting=true;this.execute();this.currentlyExecuting=false}catch(a){this.currentlyExecuting=false;throw a}}}});Object.extend(String,{interpret:function(a){return a==null?"":String(a)},specialChar:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r","\\":"\\\\"}});Object.extend(String.prototype,(function(){function prepareReplacement(replacement){if(Object.isFunction(replacement)){return replacement}var template=new Template(replacement);return function(match){return template.evaluate(match)}}function gsub(pattern,replacement){var result="",source=this,match;replacement=prepareReplacement(replacement);if(Object.isString(pattern)){pattern=RegExp.escape(pattern)}if(!(pattern.length||pattern.source)){replacement=replacement("");return replacement+source.split("").join(replacement)+replacement}while(source.length>0){if(match=source.match(pattern)){result+=source.slice(0,match.index);result+=String.interpret(replacement(match));source=source.slice(match.index+match[0].length)}else{result+=source,source=""}}return result}function sub(pattern,replacement,count){replacement=prepareReplacement(replacement);count=Object.isUndefined(count)?1:count;return this.gsub(pattern,function(match){if(--count<0){return match[0]}return replacement(match)})}function scan(pattern,iterator){this.gsub(pattern,iterator);return String(this)}function truncate(length,truncation){length=length||30;truncation=Object.isUndefined(truncation)?"...":truncation;return this.length>length?this.slice(0,length-truncation.length)+truncation:String(this)}function strip(){return this.replace(/^\s+/,"").replace(/\s+$/,"")}function stripTags(){return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi,"")}function stripScripts(){return this.replace(new RegExp(Prototype.ScriptFragment,"img"),"")}function extractScripts(){var matchAll=new RegExp(Prototype.ScriptFragment,"img");var matchOne=new RegExp(Prototype.ScriptFragment,"im");return(this.match(matchAll)||[]).map(function(scriptTag){return(scriptTag.match(matchOne)||["",""])[1]})}function evalScripts(){return this.extractScripts().map(function(script){return eval(script)})}function escapeHTML(){return this.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function unescapeHTML(){return this.stripTags().replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&")}function toQueryParams(separator){var match=this.strip().match(/([^?#]*)(#.*)?$/);if(!match){return{}}return match[1].split(separator||"&").inject({},function(hash,pair){if((pair=pair.split("="))[0]){var key=decodeURIComponent(pair.shift());var value=pair.length>1?pair.join("="):pair[0];if(value!=undefined){value=decodeURIComponent(value)}if(key in hash){if(!Object.isArray(hash[key])){hash[key]=[hash[key]]}hash[key].push(value)}else{hash[key]=value}}return hash})}function toArray(){return this.split("")}function succ(){return this.slice(0,this.length-1)+String.fromCharCode(this.charCodeAt(this.length-1)+1)}function times(count){return count<1?"":new Array(count+1).join(this)}function camelize(){var parts=this.split("-"),len=parts.length;if(len==1){return parts[0]}var camelized=this.charAt(0)=="-"?parts[0].charAt(0).toUpperCase()+parts[0].substring(1):parts[0];for(var i=1;i<len;i++){camelized+=parts[i].charAt(0).toUpperCase()+parts[i].substring(1)}return camelized}function capitalize(){return this.charAt(0).toUpperCase()+this.substring(1).toLowerCase()}function underscore(){return this.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/-/g,"_").toLowerCase()}function dasherize(){return this.replace(/_/g,"-")}function inspect(useDoubleQuotes){var escapedString=this.replace(/[\x00-\x1f\\]/g,function(character){if(character in String.specialChar){return String.specialChar[character]}return"\\u00"+character.charCodeAt().toPaddedString(2,16)});if(useDoubleQuotes){return'"'+escapedString.replace(/"/g,'\\"')+'"'}return"'"+escapedString.replace(/'/g,"\\'")+"'"}function toJSON(){return this.inspect(true)}function unfilterJSON(filter){return this.replace(filter||Prototype.JSONFilter,"$1")}function isJSON(){var str=this;if(str.blank()){return false}str=this.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,"");return(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str)}function evalJSON(sanitize){var json=this.unfilterJSON();try{if(!sanitize||json.isJSON()){return eval("("+json+")")}}catch(e){}throw new SyntaxError("Badly formed JSON string: "+this.inspect())}function include(pattern){return this.indexOf(pattern)>-1}function startsWith(pattern){return this.indexOf(pattern)===0}function endsWith(pattern){var d=this.length-pattern.length;return d>=0&&this.lastIndexOf(pattern)===d}function empty(){return this==""}function blank(){return/^\s*$/.test(this)}function interpolate(object,pattern){return new Template(this,pattern).evaluate(object)}return{gsub:gsub,sub:sub,scan:scan,truncate:truncate,strip:String.prototype.trim?String.prototype.trim:strip,stripTags:stripTags,stripScripts:stripScripts,extractScripts:extractScripts,evalScripts:evalScripts,escapeHTML:escapeHTML,unescapeHTML:unescapeHTML,toQueryParams:toQueryParams,parseQuery:toQueryParams,toArray:toArray,succ:succ,times:times,camelize:camelize,capitalize:capitalize,underscore:underscore,dasherize:dasherize,inspect:inspect,toJSON:toJSON,unfilterJSON:unfilterJSON,isJSON:isJSON,evalJSON:evalJSON,include:include,startsWith:startsWith,endsWith:endsWith,empty:empty,blank:blank,interpolate:interpolate}})());var Template=Class.create({initialize:function(a,b){this.template=a.toString();this.pattern=b||Template.Pattern},evaluate:function(a){if(a&&Object.isFunction(a.toTemplateReplacements)){a=a.toTemplateReplacements()}return this.template.gsub(this.pattern,function(d){if(a==null){return(d[1]+"")}var f=d[1]||"";if(f=="\\"){return d[2]}var b=a,g=d[3];var e=/^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;d=e.exec(g);if(d==null){return f}while(d!=null){var c=d[1].startsWith("[")?d[2].replace(/\\\\]/g,"]"):d[1];b=b[c];if(null==b||""==d[3]){break}g=g.substring("["==d[3]?d[1].length:d[0].length);d=e.exec(g)}return f+String.interpret(b)})}});Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/;var $break={};var Enumerable=(function(){function c(y,x){var w=0;try{this._each(function(A){y.call(x,A,w++)})}catch(z){if(z!=$break){throw z}}return this}function r(z,y,x){var w=-z,A=[],B=this.toArray();if(z<1){return B}while((w+=z)<B.length){A.push(B.slice(w,w+z))}return A.collect(y,x)}function b(y,x){y=y||Prototype.K;var w=true;this.each(function(A,z){w=w&&!!y.call(x,A,z);if(!w){throw $break}});return w}function i(y,x){y=y||Prototype.K;var w=false;this.each(function(A,z){if(w=!!y.call(x,A,z)){throw $break}});return w}function j(y,x){y=y||Prototype.K;var w=[];this.each(function(A,z){w.push(y.call(x,A,z))});return w}function t(y,x){var w;this.each(function(A,z){if(y.call(x,A,z)){w=A;throw $break}});return w}function h(y,x){var w=[];this.each(function(A,z){if(y.call(x,A,z)){w.push(A)}});return w}function g(z,y,x){y=y||Prototype.K;var w=[];if(Object.isString(z)){z=new RegExp(RegExp.escape(z))}this.each(function(B,A){if(z.match(B)){w.push(y.call(x,B,A))}});return w}function a(w){if(Object.isFunction(this.indexOf)){if(this.indexOf(w)!=-1){return true}}var x=false;this.each(function(y){if(y==w){x=true;throw $break}});return x}function q(x,w){w=Object.isUndefined(w)?null:w;return this.eachSlice(x,function(y){while(y.length<x){y.push(w)}return y})}function l(w,y,x){this.each(function(A,z){w=y.call(x,w,A,z)});return w}function v(x){var w=$A(arguments).slice(1);return this.map(function(y){return y[x].apply(y,w)})}function p(y,x){y=y||Prototype.K;var w;this.each(function(A,z){A=y.call(x,A,z);if(w==null||A>=w){w=A}});return w}function n(y,x){y=y||Prototype.K;var w;this.each(function(A,z){A=y.call(x,A,z);if(w==null||A<w){w=A}});return w}function e(z,x){z=z||Prototype.K;var y=[],w=[];this.each(function(B,A){(z.call(x,B,A)?y:w).push(B)});return[y,w]}function f(x){var w=[];this.each(function(y){w.push(y[x])});return w}function d(y,x){var w=[];this.each(function(A,z){if(!y.call(x,A,z)){w.push(A)}});return w}function m(x,w){return this.map(function(z,y){return{value:z,criteria:x.call(w,z,y)}}).sort(function(B,A){var z=B.criteria,y=A.criteria;return z<y?-1:z>y?1:0}).pluck("value")}function o(){return this.map()}function s(){var x=Prototype.K,w=$A(arguments);if(Object.isFunction(w.last())){x=w.pop()}var y=[this].concat(w).map($A);return this.map(function(A,z){return x(y.pluck(z))})}function k(){return this.toArray().length}function u(){return"#<Enumerable:"+this.toArray().inspect()+">"}return{each:c,eachSlice:r,all:b,every:b,any:i,some:i,collect:j,map:j,detect:t,findAll:h,select:h,filter:h,grep:g,include:a,member:a,inGroupsOf:q,inject:l,invoke:v,max:p,min:n,partition:e,pluck:f,reject:d,sortBy:m,toArray:o,entries:o,zip:s,size:k,inspect:u,find:t}})();function $A(c){if(!c){return[]}if("toArray" in Object(c)){return c.toArray()}var b=c.length||0,a=new Array(b);while(b--){a[b]=c[b]}return a}function $w(a){if(!Object.isString(a)){return[]}a=a.strip();return a?a.split(/\s+/):[]}Array.from=$A;(function(){var s=Array.prototype,m=s.slice,o=s.forEach;function b(w){for(var v=0,x=this.length;v<x;v++){w(this[v])}}if(!o){o=b}function l(){this.length=0;return this}function d(){return this[0]}function g(){return this[this.length-1]}function i(){return this.select(function(v){return v!=null})}function u(){return this.inject([],function(w,v){if(Object.isArray(v)){return w.concat(v.flatten())}w.push(v);return w})}function h(){var v=m.call(arguments,0);return this.select(function(w){return !v.include(w)})}function f(v){return(v!==false?this:this.toArray())._reverse()}function k(v){return this.inject([],function(y,x,w){if(0==w||(v?y.last()!=x:!y.include(x))){y.push(x)}return y})}function p(v){return this.uniq().findAll(function(w){return v.detect(function(x){return w===x})})}function q(){return m.call(this,0)}function j(){return this.length}function t(){return"["+this.map(Object.inspect).join(", ")+"]"}function r(){var v=[];this.each(function(w){var x=Object.toJSON(w);if(!Object.isUndefined(x)){v.push(x)}});return"["+v.join(", ")+"]"}function a(x,v){v||(v=0);var w=this.length;if(v<0){v=w+v}for(;v<w;v++){if(this[v]===x){return v}}return -1}function n(w,v){v=isNaN(v)?this.length:(v<0?this.length+v:v)+1;var x=this.slice(0,v).reverse().indexOf(w);return(x<0)?x:v-x-1}function c(){var A=m.call(this,0),y;for(var w=0,x=arguments.length;w<x;w++){y=arguments[w];if(Object.isArray(y)&&!("callee" in y)){for(var v=0,z=y.length;v<z;v++){A.push(y[v])}}else{A.push(y)}}return A}Object.extend(s,Enumerable);if(!s._reverse){s._reverse=s.reverse}Object.extend(s,{_each:o,clear:l,first:d,last:g,compact:i,flatten:u,without:h,reverse:f,uniq:k,intersect:p,clone:q,toArray:q,size:j,inspect:t,toJSON:r});var e=(function(){return[].concat(arguments)[0][0]!==1})(1,2);if(e){s.concat=c}if(!s.indexOf){s.indexOf=a}if(!s.lastIndexOf){s.lastIndexOf=n}})();function $H(a){return new Hash(a)}var Hash=Class.create(Enumerable,(function(){function e(q){this._object=Object.isHash(q)?q.toObject():Object.clone(q)}function f(r){for(var q in this._object){var s=this._object[q],t=[q,s];t.key=q;t.value=s;r(t)}}function k(q,r){return this._object[q]=r}function c(q){if(this._object[q]!==Object.prototype[q]){return this._object[q]}}function n(q){var r=this._object[q];delete this._object[q];return r}function p(){return Object.clone(this._object)}function o(){return this.pluck("key")}function m(){return this.pluck("value")}function g(r){var q=this.detect(function(s){return s.value===r});return q&&q.key}function i(q){return this.clone().update(q)}function d(q){return new Hash(q).inject(this,function(r,s){r.set(s.key,s.value);return r})}function b(q,r){if(Object.isUndefined(r)){return q}return q+"="+encodeURIComponent(String.interpret(r))}function a(){return this.inject([],function(s,t){var r=encodeURIComponent(t.key),q=t.value;if(q&&typeof q=="object"){if(Object.isArray(q)){return s.concat(q.map(b.curry(r)))}}else{s.push(b(r,q))}return s}).join("&")}function l(){return"#<Hash:{"+this.map(function(q){return q.map(Object.inspect).join(": ")}).join(", ")+"}>"}function j(){return Object.toJSON(this.toObject())}function h(){return new Hash(this)}return{initialize:e,_each:f,set:k,get:c,unset:n,toObject:p,toTemplateReplacements:p,keys:o,values:m,index:g,merge:i,update:d,toQueryString:a,inspect:l,toJSON:j,clone:h}})());Hash.from=$H;Object.extend(Number.prototype,(function(){function d(){return this.toPaddedString(2,16)}function e(){return this+1}function a(k,j){$R(0,this,true).each(k,j);return this}function b(l,k){var j=this.toString(k||10);return"0".times(l-j.length)+j}function f(){return isFinite(this)?this.toString():"null"}function i(){return Math.abs(this)}function h(){return Math.round(this)}function g(){return Math.ceil(this)}function c(){return Math.floor(this)}return{toColorPart:d,succ:e,times:a,toPaddedString:b,toJSON:f,abs:i,round:h,ceil:g,floor:c}})());function $R(c,a,b){return new ObjectRange(c,a,b)}var ObjectRange=Class.create(Enumerable,(function(){function b(f,d,e){this.start=f;this.end=d;this.exclusive=e}function c(d){var e=this.start;while(this.include(e)){d(e);e=e.succ()}}function a(d){if(d<this.start){return false}if(this.exclusive){return d<this.end}return d<=this.end}return{initialize:b,_each:c,include:a}})());var Ajax={getTransport:function(){return Try.these(function(){return new XMLHttpRequest()},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")})||false},activeRequestCount:0};Ajax.Responders={responders:[],_each:function(a){this.responders._each(a)},register:function(a){if(!this.include(a)){this.responders.push(a)}},unregister:function(a){this.responders=this.responders.without(a)},dispatch:function(d,b,c,a){this.each(function(f){if(Object.isFunction(f[d])){try{f[d].apply(f,[b,c,a])}catch(g){}}})}};Object.extend(Ajax.Responders,Enumerable);Ajax.Responders.register({onCreate:function(){Ajax.activeRequestCount++},onComplete:function(){Ajax.activeRequestCount--}});Ajax.Base=Class.create({initialize:function(a){this.options={method:"post",asynchronous:true,contentType:"application/x-www-form-urlencoded",encoding:"UTF-8",parameters:"",evalJSON:true,evalJS:true};Object.extend(this.options,a||{});this.options.method=this.options.method.toLowerCase();if(Object.isString(this.options.parameters)){this.options.parameters=this.options.parameters.toQueryParams()}else{if(Object.isHash(this.options.parameters)){this.options.parameters=this.options.parameters.toObject()}}}});Ajax.Request=Class.create(Ajax.Base,{_complete:false,initialize:function($super,b,a){$super(a);this.transport=Ajax.getTransport();this.request(b)},request:function(b){this.url=b;this.method=this.options.method;var d=Object.clone(this.options.parameters);if(!["get","post"].include(this.method)){d._method=this.method;this.method="post"}this.parameters=d;if(d=Object.toQueryString(d)){if(this.method=="get"){this.url+=(this.url.include("?")?"&":"?")+d}else{if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){d+="&_="}}}try{var a=new Ajax.Response(this);if(this.options.onCreate){this.options.onCreate(a)}Ajax.Responders.dispatch("onCreate",this,a);this.transport.open(this.method.toUpperCase(),this.url,this.options.asynchronous);if(this.options.asynchronous){this.respondToReadyState.bind(this).defer(1)}this.transport.onreadystatechange=this.onStateChange.bind(this);this.setRequestHeaders();this.body=this.method=="post"?(this.options.postBody||d):null;this.transport.send(this.body);if(!this.options.asynchronous&&this.transport.overrideMimeType){this.onStateChange()}}catch(c){this.dispatchException(c)}},onStateChange:function(){var a=this.transport.readyState;if(a>1&&!((a==4)&&this._complete)){this.respondToReadyState(this.transport.readyState)}},setRequestHeaders:function(){var e={"X-Requested-With":"XMLHttpRequest","X-Prototype-Version":Prototype.Version,Accept:"text/javascript, text/html, application/xml, text/xml, */*"};if(this.method=="post"){e["Content-type"]=this.options.contentType+(this.options.encoding?"; charset="+this.options.encoding:"");if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005){e.Connection="close"}}if(typeof this.options.requestHeaders=="object"){var c=this.options.requestHeaders;if(Object.isFunction(c.push)){for(var b=0,d=c.length;b<d;b+=2){e[c[b]]=c[b+1]}}else{$H(c).each(function(f){e[f.key]=f.value})}}for(var a in e){this.transport.setRequestHeader(a,e[a])}},success:function(){var a=this.getStatus();return !a||(a>=200&&a<300)},getStatus:function(){try{return this.transport.status||0}catch(a){return 0}},respondToReadyState:function(a){var c=Ajax.Request.Events[a],b=new Ajax.Response(this);if(c=="Complete"){try{this._complete=true;(this.options["on"+b.status]||this.options["on"+(this.success()?"Success":"Failure")]||Prototype.emptyFunction)(b,b.headerJSON)}catch(d){this.dispatchException(d)}var f=b.getHeader("Content-type");if(this.options.evalJS=="force"||(this.options.evalJS&&this.isSameOrigin()&&f&&f.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))){this.evalResponse()}}try{(this.options["on"+c]||Prototype.emptyFunction)(b,b.headerJSON);Ajax.Responders.dispatch("on"+c,this,b,b.headerJSON)}catch(d){this.dispatchException(d)}if(c=="Complete"){this.transport.onreadystatechange=Prototype.emptyFunction}},isSameOrigin:function(){var a=this.url.match(/^\s*https?:\/\/[^\/]*/);return !a||(a[0]=="#{protocol}//#{domain}#{port}".interpolate({protocol:location.protocol,domain:document.domain,port:location.port?":"+location.port:""}))},getHeader:function(a){try{return this.transport.getResponseHeader(a)||null}catch(b){return null}},evalResponse:function(){try{return eval((this.transport.responseText||"").unfilterJSON())}catch(e){this.dispatchException(e)}},dispatchException:function(a){(this.options.onException||Prototype.emptyFunction)(this,a);Ajax.Responders.dispatch("onException",this,a)}});Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"];Ajax.Response=Class.create({initialize:function(c){this.request=c;var d=this.transport=c.transport,a=this.readyState=d.readyState;if((a>2&&!Prototype.Browser.IE)||a==4){this.status=this.getStatus();this.statusText=this.getStatusText();this.responseText=String.interpret(d.responseText);this.headerJSON=this._getHeaderJSON()}if(a==4){var b=d.responseXML;this.responseXML=Object.isUndefined(b)?null:b;this.responseJSON=this._getResponseJSON()}},status:0,statusText:"",getStatus:Ajax.Request.prototype.getStatus,getStatusText:function(){try{return this.transport.statusText||""}catch(a){return""}},getHeader:Ajax.Request.prototype.getHeader,getAllHeaders:function(){try{return this.getAllResponseHeaders()}catch(a){return null}},getResponseHeader:function(a){return this.transport.getResponseHeader(a)},getAllResponseHeaders:function(){return this.transport.getAllResponseHeaders()},_getHeaderJSON:function(){var a=this.getHeader("X-JSON");if(!a){return null}a=decodeURIComponent(escape(a));try{return a.evalJSON(this.request.options.sanitizeJSON||!this.request.isSameOrigin())}catch(b){this.request.dispatchException(b)}},_getResponseJSON:function(){var a=this.request.options;if(!a.evalJSON||(a.evalJSON!="force"&&!(this.getHeader("Content-type")||"").include("application/json"))||this.responseText.blank()){return null}try{return this.responseText.evalJSON(a.sanitizeJSON||!this.request.isSameOrigin())}catch(b){this.request.dispatchException(b)}}});Ajax.Updater=Class.create(Ajax.Request,{initialize:function($super,a,c,b){this.container={success:(a.success||a),failure:(a.failure||(a.success?null:a))};b=Object.clone(b);var d=b.onComplete;b.onComplete=(function(e,f){this.updateContent(e.responseText);if(Object.isFunction(d)){d(e,f)}}).bind(this);$super(c,b)},updateContent:function(d){var c=this.container[this.success()?"success":"failure"],a=this.options;if(!a.evalScripts){d=d.stripScripts()}if(c=$(c)){if(a.insertion){if(Object.isString(a.insertion)){var b={};b[a.insertion]=d;c.insert(b)}else{a.insertion(c,d)}}else{c.update(d)}}}});Ajax.PeriodicalUpdater=Class.create(Ajax.Base,{initialize:function($super,a,c,b){$super(b);this.onComplete=this.options.onComplete;this.frequency=(this.options.frequency||2);this.decay=(this.options.decay||1);this.updater={};this.container=a;this.url=c;this.start()},start:function(){this.options.onComplete=this.updateComplete.bind(this);this.onTimerEvent()},stop:function(){this.updater.options.onComplete=undefined;clearTimeout(this.timer);(this.onComplete||Prototype.emptyFunction).apply(this,arguments)},updateComplete:function(a){if(this.options.decay){this.decay=(a.responseText==this.lastText?this.decay*this.options.decay:1);this.lastText=a.responseText}this.timer=this.onTimerEvent.bind(this).delay(this.decay*this.frequency)},onTimerEvent:function(){this.updater=new Ajax.Updater(this.container,this.url,this.options)}});function $(b){if(arguments.length>1){for(var a=0,d=[],c=arguments.length;a<c;a++){d.push($(arguments[a]))}return d}if(Object.isString(b)){b=document.getElementById(b)}return Element.extend(b)}if(Prototype.BrowserFeatures.XPath){document._getElementsByXPath=function(f,a){var c=[];var e=document.evaluate(f,$(a)||document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);for(var b=0,d=e.snapshotLength;b<d;b++){c.push(Element.extend(e.snapshotItem(b)))}return c}}if(!window.Node){var Node={}}if(!Node.ELEMENT_NODE){Object.extend(Node,{ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12})}(function(c){var b=(function(){var f=document.createElement("form");var e=document.createElement("input");var d=document.documentElement;e.setAttribute("name","test");f.appendChild(e);d.appendChild(f);var g=f.elements?(typeof f.elements.test=="undefined"):null;d.removeChild(f);f=e=null;return g})();var a=c.Element;c.Element=function(f,e){e=e||{};f=f.toLowerCase();var d=Element.cache;if(b&&e.name){f="<"+f+' name="'+e.name+'">';delete e.name;return Element.writeAttribute(document.createElement(f),e)}if(!d[f]){d[f]=Element.extend(document.createElement(f))}return Element.writeAttribute(d[f].cloneNode(false),e)};Object.extend(c.Element,a||{});if(a){c.Element.prototype=a.prototype}})(this);Element.cache={};Element.idCounter=1;Element.Methods={visible:function(a){return $(a).style.display!="none"},toggle:function(a){a=$(a);Element[Element.visible(a)?"hide":"show"](a);return a},hide:function(a){a=$(a);a.style.display="none";return a},show:function(a){a=$(a);a.style.display="";return a},remove:function(a){a=$(a);a.parentNode.removeChild(a);return a},update:(function(){var b=(function(){var e=document.createElement("select"),f=true;e.innerHTML='<option value="test">test</option>';if(e.options&&e.options[0]){f=e.options[0].nodeName.toUpperCase()!=="OPTION"}e=null;return f})();var a=(function(){try{var f=document.createElement("table");if(f&&f.tBodies){f.innerHTML="<tbody><tr><td>test</td></tr></tbody>";var h=typeof f.tBodies[0]=="undefined";f=null;return h}}catch(g){return true}})();var d=(function(){var f=document.createElement("script"),h=false;try{f.appendChild(document.createTextNode(""));h=!f.firstChild||f.firstChild&&f.firstChild.nodeType!==3}catch(g){h=true}f=null;return h})();function c(f,g){f=$(f);if(g&&g.toElement){g=g.toElement()}if(Object.isElement(g)){return f.update().insert(g)}g=Object.toHTML(g);var e=f.tagName.toUpperCase();if(e==="SCRIPT"&&d){f.text=g;return f}if(b||a){if(e in Element._insertionTranslations.tags){while(f.firstChild){f.removeChild(f.firstChild)}Element._getContentFromAnonymousElement(e,g.stripScripts()).each(function(h){f.appendChild(h)})}else{f.innerHTML=g.stripScripts()}}else{f.innerHTML=g.stripScripts()}g.evalScripts.bind(g).defer();return f}return c})(),replace:function(b,c){b=$(b);if(c&&c.toElement){c=c.toElement()}else{if(!Object.isElement(c)){c=Object.toHTML(c);var a=b.ownerDocument.createRange();a.selectNode(b);c.evalScripts.bind(c).defer();c=a.createContextualFragment(c.stripScripts())}}b.parentNode.replaceChild(c,b);return b},insert:function(c,e){c=$(c);if(Object.isString(e)||Object.isNumber(e)||Object.isElement(e)||(e&&(e.toElement||e.toHTML))){e={bottom:e}}var d,f,b,g;for(var a in e){d=e[a];a=a.toLowerCase();f=Element._insertionTranslations[a];if(d&&d.toElement){d=d.toElement()}if(Object.isElement(d)){f(c,d);continue}d=Object.toHTML(d);b=((a=="before"||a=="after")?c.parentNode:c).tagName.toUpperCase();g=Element._getContentFromAnonymousElement(b,d.stripScripts());if(a=="top"||a=="after"){g.reverse()}g.each(f.curry(c));d.evalScripts.bind(d).defer()}return c},wrap:function(b,c,a){b=$(b);if(Object.isElement(c)){$(c).writeAttribute(a||{})}else{if(Object.isString(c)){c=new Element(c,a)}else{c=new Element("div",c)}}if(b.parentNode){b.parentNode.replaceChild(c,b)}c.appendChild(b);return c},inspect:function(b){b=$(b);var a="<"+b.tagName.toLowerCase();$H({id:"id",className:"class"}).each(function(f){var e=f.first(),c=f.last();var d=(b[e]||"").toString();if(d){a+=" "+c+"="+d.inspect(true)}});return a+">"},recursivelyCollect:function(a,c){a=$(a);var b=[];while(a=a[c]){if(a.nodeType==1){b.push(Element.extend(a))}}return b},ancestors:function(a){return Element.recursivelyCollect(a,"parentNode")},descendants:function(a){return Element.select(a,"*")},firstDescendant:function(a){a=$(a).firstChild;while(a&&a.nodeType!=1){a=a.nextSibling}return $(a)},immediateDescendants:function(a){if(!(a=$(a).firstChild)){return[]}while(a&&a.nodeType!=1){a=a.nextSibling}if(a){return[a].concat($(a).nextSiblings())}return[]},previousSiblings:function(a){return Element.recursivelyCollect(a,"previousSibling")},nextSiblings:function(a){return Element.recursivelyCollect(a,"nextSibling")},siblings:function(a){a=$(a);return Element.previousSiblings(a).reverse().concat(Element.nextSiblings(a))},match:function(b,a){if(Object.isString(a)){a=new Selector(a)}return a.match($(b))},up:function(b,d,a){b=$(b);if(arguments.length==1){return $(b.parentNode)}var c=Element.ancestors(b);return Object.isNumber(d)?c[d]:Selector.findElement(c,d,a)},down:function(b,c,a){b=$(b);if(arguments.length==1){return Element.firstDescendant(b)}return Object.isNumber(c)?Element.descendants(b)[c]:Element.select(b,c)[a||0]},previous:function(b,d,a){b=$(b);if(arguments.length==1){return $(Selector.handlers.previousElementSibling(b))}var c=Element.previousSiblings(b);return Object.isNumber(d)?c[d]:Selector.findElement(c,d,a)},next:function(c,d,b){c=$(c);if(arguments.length==1){return $(Selector.handlers.nextElementSibling(c))}var a=Element.nextSiblings(c);return Object.isNumber(d)?a[d]:Selector.findElement(a,d,b)},select:function(b){var a=Array.prototype.slice.call(arguments,1);return Selector.findChildElements(b,a)},adjacent:function(b){var a=Array.prototype.slice.call(arguments,1);return Selector.findChildElements(b.parentNode,a).without(b)},identify:function(a){a=$(a);var b=Element.readAttribute(a,"id");if(b){return b}do{b="anonymous_element_"+Element.idCounter++}while($(b));Element.writeAttribute(a,"id",b);return b},readAttribute:function(c,a){c=$(c);if(Prototype.Browser.IE){var b=Element._attributeTranslations.read;if(b.values[a]){return b.values[a](c,a)}if(b.names[a]){a=b.names[a]}if(a.include(":")){return(!c.attributes||!c.attributes[a])?null:c.attributes[a].value}}return c.getAttribute(a)},writeAttribute:function(e,c,f){e=$(e);var b={},d=Element._attributeTranslations.write;if(typeof c=="object"){b=c}else{b[c]=Object.isUndefined(f)?true:f}for(var a in b){c=d.names[a]||a;f=b[a];if(d.values[a]){c=d.values[a](e,f)}if(f===false||f===null){e.removeAttribute(c)}else{if(f===true){e.setAttribute(c,c)}else{e.setAttribute(c,f)}}}return e},getHeight:function(a){return Element.getDimensions(a).height},getWidth:function(a){return Element.getDimensions(a).width},classNames:function(a){return new Element.ClassNames(a)},hasClassName:function(a,b){if(!(a=$(a))){return}var c=a.className;return(c.length>0&&(c==b||new RegExp("(^|\\s)"+b+"(\\s|$)").test(c)))},addClassName:function(a,b){if(!(a=$(a))){return}if(!Element.hasClassName(a,b)){a.className+=(a.className?" ":"")+b}return a},removeClassName:function(a,b){if(!(a=$(a))){return}a.className=a.className.replace(new RegExp("(^|\\s+)"+b+"(\\s+|$)")," ").strip();return a},toggleClassName:function(a,b){if(!(a=$(a))){return}return Element[Element.hasClassName(a,b)?"removeClassName":"addClassName"](a,b)},cleanWhitespace:function(b){b=$(b);var c=b.firstChild;while(c){var a=c.nextSibling;if(c.nodeType==3&&!/\S/.test(c.nodeValue)){b.removeChild(c)}c=a}return b},empty:function(a){return $(a).innerHTML.blank()},descendantOf:function(b,a){b=$(b),a=$(a);if(b.compareDocumentPosition){return(b.compareDocumentPosition(a)&8)===8}if(a.contains){return a.contains(b)&&a!==b}while(b=b.parentNode){if(b==a){return true}}return false},scrollTo:function(a){a=$(a);var b=Element.cumulativeOffset(a);window.scrollTo(b[0],b[1]);return a},getStyle:function(b,c){b=$(b);c=c=="float"?"cssFloat":c.camelize();var d=b.style[c];if(!d||d=="auto"){var a=document.defaultView.getComputedStyle(b,null);d=a?a[c]:null}if(c=="opacity"){return d?parseFloat(d):1}return d=="auto"?null:d},getOpacity:function(a){return $(a).getStyle("opacity")},setStyle:function(b,c){b=$(b);var e=b.style,a;if(Object.isString(c)){b.style.cssText+=";"+c;return c.include("opacity")?b.setOpacity(c.match(/opacity:\s*(\d?\.?\d*)/)[1]):b}for(var d in c){if(d=="opacity"){b.setOpacity(c[d])}else{e[(d=="float"||d=="cssFloat")?(Object.isUndefined(e.styleFloat)?"cssFloat":"styleFloat"):d]=c[d]}}return b},setOpacity:function(a,b){a=$(a);a.style.opacity=(b==1||b==="")?"":(b<0.00001)?0:b;return a},getDimensions:function(c){c=$(c);var g=Element.getStyle(c,"display");if(g!="none"&&g!=null){return{width:c.offsetWidth,height:c.offsetHeight}}var b=c.style;var f=b.visibility;var d=b.position;var a=b.display;b.visibility="hidden";if(d!="fixed"){b.position="absolute"}b.display="block";var h=c.clientWidth;var e=c.clientHeight;b.display=a;b.position=d;b.visibility=f;return{width:h,height:e}},makePositioned:function(a){a=$(a);var b=Element.getStyle(a,"position");if(b=="static"||!b){a._madePositioned=true;a.style.position="relative";if(Prototype.Browser.Opera){a.style.top=0;a.style.left=0}}return a},undoPositioned:function(a){a=$(a);if(a._madePositioned){a._madePositioned=undefined;a.style.position=a.style.top=a.style.left=a.style.bottom=a.style.right=""}return a},makeClipping:function(a){a=$(a);if(a._overflow){return a}a._overflow=Element.getStyle(a,"overflow")||"auto";if(a._overflow!=="hidden"){a.style.overflow="hidden"}return a},undoClipping:function(a){a=$(a);if(!a._overflow){return a}a.style.overflow=a._overflow=="auto"?"":a._overflow;a._overflow=null;return a},cumulativeOffset:function(b){var a=0,c=0;do{a+=b.offsetTop||0;c+=b.offsetLeft||0;b=b.offsetParent}while(b);return Element._returnOffset(c,a)},positionedOffset:function(b){var a=0,d=0;do{a+=b.offsetTop||0;d+=b.offsetLeft||0;b=b.offsetParent;if(b){if(b.tagName.toUpperCase()=="BODY"){break}var c=Element.getStyle(b,"position");if(c!=="static"){break}}}while(b);return Element._returnOffset(d,a)},absolutize:function(b){b=$(b);if(Element.getStyle(b,"position")=="absolute"){return b}var d=Element.positionedOffset(b);var f=d[1];var e=d[0];var c=b.clientWidth;var a=b.clientHeight;b._originalLeft=e-parseFloat(b.style.left||0);b._originalTop=f-parseFloat(b.style.top||0);b._originalWidth=b.style.width;b._originalHeight=b.style.height;b.style.position="absolute";b.style.top=f+"px";b.style.left=e+"px";b.style.width=c+"px";b.style.height=a+"px";return b},relativize:function(a){a=$(a);if(Element.getStyle(a,"position")=="relative"){return a}a.style.position="relative";var c=parseFloat(a.style.top||0)-(a._originalTop||0);var b=parseFloat(a.style.left||0)-(a._originalLeft||0);a.style.top=c+"px";a.style.left=b+"px";a.style.height=a._originalHeight;a.style.width=a._originalWidth;return a},cumulativeScrollOffset:function(b){var a=0,c=0;do{a+=b.scrollTop||0;c+=b.scrollLeft||0;b=b.parentNode}while(b);return Element._returnOffset(c,a)},getOffsetParent:function(a){if(a.offsetParent){return $(a.offsetParent)}if(a==document.body){return $(a)}while((a=a.parentNode)&&a!=document.body){if(Element.getStyle(a,"position")!="static"){return $(a)}}return $(document.body)},viewportOffset:function(d){var a=0,c=0;var b=d;do{a+=b.offsetTop||0;c+=b.offsetLeft||0;if(b.offsetParent==document.body&&Element.getStyle(b,"position")=="absolute"){break}}while(b=b.offsetParent);b=d;do{if(!Prototype.Browser.Opera||(b.tagName&&(b.tagName.toUpperCase()=="BODY"))){a-=b.scrollTop||0;c-=b.scrollLeft||0}}while(b=b.parentNode);return Element._returnOffset(c,a)},clonePosition:function(b,d){var a=Object.extend({setLeft:true,setTop:true,setWidth:true,setHeight:true,offsetTop:0,offsetLeft:0},arguments[2]||{});d=$(d);var e=Element.viewportOffset(d);b=$(b);var f=[0,0];var c=null;if(Element.getStyle(b,"position")=="absolute"){c=Element.getOffsetParent(b);f=Element.viewportOffset(c)}if(c==document.body){f[0]-=document.body.offsetLeft;f[1]-=document.body.offsetTop}if(a.setLeft){b.style.left=(e[0]-f[0]+a.offsetLeft)+"px"}if(a.setTop){b.style.top=(e[1]-f[1]+a.offsetTop)+"px"}if(a.setWidth){b.style.width=d.offsetWidth+"px"}if(a.setHeight){b.style.height=d.offsetHeight+"px"}return b}};Object.extend(Element.Methods,{getElementsBySelector:Element.Methods.select,childElements:Element.Methods.immediateDescendants});Element._attributeTranslations={write:{names:{className:"class",htmlFor:"for"},values:{}}};if(Prototype.Browser.Opera){Element.Methods.getStyle=Element.Methods.getStyle.wrap(function(d,b,c){switch(c){case"left":case"top":case"right":case"bottom":if(d(b,"position")==="static"){return null}case"height":case"width":if(!Element.visible(b)){return null}var e=parseInt(d(b,c),10);if(e!==b["offset"+c.capitalize()]){return e+"px"}var a;if(c==="height"){a=["border-top-width","padding-top","padding-bottom","border-bottom-width"]}else{a=["border-left-width","padding-left","padding-right","border-right-width"]}return a.inject(e,function(f,g){var h=d(b,g);return h===null?f:f-parseInt(h,10)})+"px";default:return d(b,c)}});Element.Methods.readAttribute=Element.Methods.readAttribute.wrap(function(c,a,b){if(b==="title"){return a.title}return c(a,b)})}else{if(Prototype.Browser.IE){Element.Methods.getOffsetParent=Element.Methods.getOffsetParent.wrap(function(c,b){b=$(b);try{b.offsetParent}catch(f){return $(document.body)}var a=b.getStyle("position");if(a!=="static"){return c(b)}b.setStyle({position:"relative"});var d=c(b);b.setStyle({position:a});return d});$w("positionedOffset viewportOffset").each(function(a){Element.Methods[a]=Element.Methods[a].wrap(function(f,c){c=$(c);try{c.offsetParent}catch(h){return Element._returnOffset(0,0)}var b=c.getStyle("position");if(b!=="static"){return f(c)}var d=c.getOffsetParent();if(d&&d.getStyle("position")==="fixed"){d.setStyle({zoom:1})}c.setStyle({position:"relative"});var g=f(c);c.setStyle({position:b});return g})});Element.Methods.cumulativeOffset=Element.Methods.cumulativeOffset.wrap(function(b,a){try{a.offsetParent}catch(c){return Element._returnOffset(0,0)}return b(a)});Element.Methods.getStyle=function(a,b){a=$(a);b=(b=="float"||b=="cssFloat")?"styleFloat":b.camelize();var c=a.style[b];if(!c&&a.currentStyle){c=a.currentStyle[b]}if(b=="opacity"){if(c=(a.getStyle("filter")||"").match(/alpha\(opacity=(.*)\)/)){if(c[1]){return parseFloat(c[1])/100}}return 1}if(c=="auto"){if((b=="width"||b=="height")&&(a.getStyle("display")!="none")){return a["offset"+b.capitalize()]+"px"}return null}return c};Element.Methods.setOpacity=function(b,e){function f(g){return g.replace(/alpha\([^\)]*\)/gi,"")}b=$(b);var a=b.currentStyle;if((a&&!a.hasLayout)||(!a&&b.style.zoom=="normal")){b.style.zoom=1}var d=b.getStyle("filter"),c=b.style;if(e==1||e===""){(d=f(d))?c.filter=d:c.removeAttribute("filter");return b}else{if(e<0.00001){e=0}}c.filter=f(d)+"alpha(opacity="+(e*100)+")";return b};Element._attributeTranslations=(function(){var b="className";var a="for";var c=document.createElement("div");c.setAttribute(b,"x");if(c.className!=="x"){c.setAttribute("class","x");if(c.className==="x"){b="class"}}c=null;c=document.createElement("label");c.setAttribute(a,"x");if(c.htmlFor!=="x"){c.setAttribute("htmlFor","x");if(c.htmlFor==="x"){a="htmlFor"}}c=null;return{read:{names:{"class":b,className:b,"for":a,htmlFor:a},values:{_getAttr:function(d,e){return d.getAttribute(e)},_getAttr2:function(d,e){return d.getAttribute(e,2)},_getAttrNode:function(d,f){var e=d.getAttributeNode(f);return e?e.value:""},_getEv:(function(){var d=document.createElement("div");d.onclick=Prototype.emptyFunction;var g=d.getAttribute("onclick");var e;if(String(g).indexOf("{")>-1){e=function(f,h){h=f.getAttribute(h);if(!h){return null}h=h.toString();h=h.split("{")[1];h=h.split("}")[0];return h.strip()}}else{if(g===""){e=function(f,h){h=f.getAttribute(h);if(!h){return null}return h.strip()}}}d=null;return e})(),_flag:function(d,e){return $(d).hasAttribute(e)?e:null},style:function(d){return d.style.cssText.toLowerCase()},title:function(d){return d.title}}}}})();Element._attributeTranslations.write={names:Object.extend({cellpadding:"cellPadding",cellspacing:"cellSpacing"},Element._attributeTranslations.read.names),values:{checked:function(a,b){a.checked=!!b},style:function(a,b){a.style.cssText=b?b:""}}};Element._attributeTranslations.has={};$w("colSpan rowSpan vAlign dateTime accessKey tabIndex encType maxLength readOnly longDesc frameBorder").each(function(a){Element._attributeTranslations.write.names[a.toLowerCase()]=a;Element._attributeTranslations.has[a.toLowerCase()]=a});(function(a){Object.extend(a,{href:a._getAttr2,src:a._getAttr2,type:a._getAttr,action:a._getAttrNode,disabled:a._flag,checked:a._flag,readonly:a._flag,multiple:a._flag,onload:a._getEv,onunload:a._getEv,onclick:a._getEv,ondblclick:a._getEv,onmousedown:a._getEv,onmouseup:a._getEv,onmouseover:a._getEv,onmousemove:a._getEv,onmouseout:a._getEv,onfocus:a._getEv,onblur:a._getEv,onkeypress:a._getEv,onkeydown:a._getEv,onkeyup:a._getEv,onsubmit:a._getEv,onreset:a._getEv,onselect:a._getEv,onchange:a._getEv})})(Element._attributeTranslations.read.values);if(Prototype.BrowserFeatures.ElementExtensions){(function(){function a(e){var b=e.getElementsByTagName("*"),d=[];for(var c=0,f;f=b[c];c++){if(f.tagName!=="!"){d.push(f)}}return d}Element.Methods.down=function(c,d,b){c=$(c);if(arguments.length==1){return c.firstDescendant()}return Object.isNumber(d)?a(c)[d]:Element.select(c,d)[b||0]}})()}}else{if(Prototype.Browser.Gecko&&/rv:1\.8\.0/.test(navigator.userAgent)){Element.Methods.setOpacity=function(a,b){a=$(a);a.style.opacity=(b==1)?0.999999:(b==="")?"":(b<0.00001)?0:b;return a}}else{if(Prototype.Browser.WebKit){Element.Methods.setOpacity=function(a,b){a=$(a);a.style.opacity=(b==1||b==="")?"":(b<0.00001)?0:b;if(b==1){if(a.tagName.toUpperCase()=="IMG"&&a.width){a.width++;a.width--}else{try{var d=document.createTextNode(" ");a.appendChild(d);a.removeChild(d)}catch(c){}}}return a};Element.Methods.cumulativeOffset=function(b){var a=0,c=0;do{a+=b.offsetTop||0;c+=b.offsetLeft||0;if(b.offsetParent==document.body){if(Element.getStyle(b,"position")=="absolute"){break}}b=b.offsetParent}while(b);return Element._returnOffset(c,a)}}}}}if("outerHTML" in document.documentElement){Element.Methods.replace=function(c,e){c=$(c);if(e&&e.toElement){e=e.toElement()}if(Object.isElement(e)){c.parentNode.replaceChild(e,c);return c}e=Object.toHTML(e);var d=c.parentNode,b=d.tagName.toUpperCase();if(Element._insertionTranslations.tags[b]){var f=c.next();var a=Element._getContentFromAnonymousElement(b,e.stripScripts());d.removeChild(c);if(f){a.each(function(g){d.insertBefore(g,f)})}else{a.each(function(g){d.appendChild(g)})}}else{c.outerHTML=e.stripScripts()}e.evalScripts.bind(e).defer();return c}}Element._returnOffset=function(b,c){var a=[b,c];a.left=b;a.top=c;return a};Element._getContentFromAnonymousElement=function(c,b){var d=new Element("div"),a=Element._insertionTranslations.tags[c];if(a){d.innerHTML=a[0]+b+a[1];a[2].times(function(){d=d.firstChild})}else{d.innerHTML=b}return $A(d.childNodes)};Element._insertionTranslations={before:function(a,b){a.parentNode.insertBefore(b,a)},top:function(a,b){a.insertBefore(b,a.firstChild)},bottom:function(a,b){a.appendChild(b)},after:function(a,b){a.parentNode.insertBefore(b,a.nextSibling)},tags:{TABLE:["<table>","</table>",1],TBODY:["<table><tbody>","</tbody></table>",2],TR:["<table><tbody><tr>","</tr></tbody></table>",3],TD:["<table><tbody><tr><td>","</td></tr></tbody></table>",4],SELECT:["<select>","</select>",1]}};(function(){var a=Element._insertionTranslations.tags;Object.extend(a,{THEAD:a.TBODY,TFOOT:a.TBODY,TH:a.TD})})();Element.Methods.Simulated={hasAttribute:function(a,c){c=Element._attributeTranslations.has[c]||c;var b=$(a).getAttributeNode(c);return !!(b&&b.specified)}};Element.Methods.ByTag={};Object.extend(Element,Element.Methods);(function(a){if(!Prototype.BrowserFeatures.ElementExtensions&&a.__proto__){window.HTMLElement={};window.HTMLElement.prototype=a.__proto__;Prototype.BrowserFeatures.ElementExtensions=true}a=null})(document.createElement("div"));Element.extend=(function(){function c(g){if(typeof window.Element!="undefined"){var i=window.Element.prototype;if(i){var k="_"+(Math.random()+"").slice(2);var h=document.createElement(g);i[k]="x";var j=(h[k]!=="x");delete i[k];h=null;return j}}return false}function b(h,g){for(var j in g){var i=g[j];if(Object.isFunction(i)&&!(j in h)){h[j]=i.methodize()}}}var d=c("object");if(Prototype.BrowserFeatures.SpecificElementExtensions){if(d){return function(h){if(h&&typeof h._extendedByPrototype=="undefined"){var g=h.tagName;if(g&&(/^(?:object|applet|embed)$/i.test(g))){b(h,Element.Methods);b(h,Element.Methods.Simulated);b(h,Element.Methods.ByTag[g.toUpperCase()])}}return h}}return Prototype.K}var a={},e=Element.Methods.ByTag;var f=Object.extend(function(i){if(!i||typeof i._extendedByPrototype!="undefined"||i.nodeType!=1||i==window){return i}var g=Object.clone(a),h=i.tagName.toUpperCase();if(e[h]){Object.extend(g,e[h])}b(i,g);i._extendedByPrototype=Prototype.emptyFunction;return i},{refresh:function(){if(!Prototype.BrowserFeatures.ElementExtensions){Object.extend(a,Element.Methods);Object.extend(a,Element.Methods.Simulated)}}});f.refresh();return f})();Element.hasAttribute=function(a,b){if(a.hasAttribute){return a.hasAttribute(b)}return Element.Methods.Simulated.hasAttribute(a,b)};Element.addMethods=function(c){var i=Prototype.BrowserFeatures,d=Element.Methods.ByTag;if(!c){Object.extend(Form,Form.Methods);Object.extend(Form.Element,Form.Element.Methods);Object.extend(Element.Methods.ByTag,{FORM:Object.clone(Form.Methods),INPUT:Object.clone(Form.Element.Methods),SELECT:Object.clone(Form.Element.Methods),TEXTAREA:Object.clone(Form.Element.Methods)})}if(arguments.length==2){var b=c;c=arguments[1]}if(!b){Object.extend(Element.Methods,c||{})}else{if(Object.isArray(b)){b.each(g)}else{g(b)}}function g(k){k=k.toUpperCase();if(!Element.Methods.ByTag[k]){Element.Methods.ByTag[k]={}}Object.extend(Element.Methods.ByTag[k],c)}function a(m,l,k){k=k||false;for(var o in m){var n=m[o];if(!Object.isFunction(n)){continue}if(!k||!(o in l)){l[o]=n.methodize()}}}function e(n){var k;var m={OPTGROUP:"OptGroup",TEXTAREA:"TextArea",P:"Paragraph",FIELDSET:"FieldSet",UL:"UList",OL:"OList",DL:"DList",DIR:"Directory",H1:"Heading",H2:"Heading",H3:"Heading",H4:"Heading",H5:"Heading",H6:"Heading",Q:"Quote",INS:"Mod",DEL:"Mod",A:"Anchor",IMG:"Image",CAPTION:"TableCaption",COL:"TableCol",COLGROUP:"TableCol",THEAD:"TableSection",TFOOT:"TableSection",TBODY:"TableSection",TR:"TableRow",TH:"TableCell",TD:"TableCell",FRAMESET:"FrameSet",IFRAME:"IFrame"};if(m[n]){k="HTML"+m[n]+"Element"}if(window[k]){return window[k]}k="HTML"+n+"Element";if(window[k]){return window[k]}k="HTML"+n.capitalize()+"Element";if(window[k]){return window[k]}var l=document.createElement(n);var o=l.__proto__||l.constructor.prototype;l=null;return o}var h=window.HTMLElement?HTMLElement.prototype:Element.prototype;if(i.ElementExtensions){a(Element.Methods,h);a(Element.Methods.Simulated,h,true)}if(i.SpecificElementExtensions){for(var j in Element.Methods.ByTag){var f=e(j);if(Object.isUndefined(f)){continue}a(d[j],f.prototype)}}Object.extend(Element,Element.Methods);delete Element.ByTag;if(Element.extend.refresh){Element.extend.refresh()}Element.cache={}};document.viewport={getDimensions:function(){return{width:this.getWidth(),height:this.getHeight()}},getScrollOffsets:function(){return Element._returnOffset(window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop)}};(function(b){var g=Prototype.Browser,e=document,c,d={};function a(){if(g.WebKit&&!e.evaluate){return document}if(g.Opera&&window.parseFloat(window.opera.version())<9.5){return document.body}return document.documentElement}function f(h){if(!c){c=a()}d[h]="client"+h;b["get"+h]=function(){return c[d[h]]};return b["get"+h]()}b.getWidth=f.curry("Width");b.getHeight=f.curry("Height")})(document.viewport);Element.Storage={UID:1};Element.addMethods({getStorage:function(b){if(!(b=$(b))){return}var a;if(b===window){a=0}else{if(typeof b._prototypeUID==="undefined"){b._prototypeUID=[Element.Storage.UID++]}a=b._prototypeUID[0]}if(!Element.Storage[a]){Element.Storage[a]=$H()}return Element.Storage[a]},store:function(b,a,c){if(!(b=$(b))){return}if(arguments.length===2){Element.getStorage(b).update(a)}else{Element.getStorage(b).set(a,c)}return b},retrieve:function(c,b,a){if(!(c=$(c))){return}var e=Element.getStorage(c),d=e.get(b);if(Object.isUndefined(d)){e.set(b,a);d=a}return d},clone:function(c,a){if(!(c=$(c))){return}var e=c.cloneNode(a);e._prototypeUID=void 0;if(a){var d=Element.select(e,"*"),b=d.length;while(b--){d[b]._prototypeUID=void 0}}return Element.extend(e)}});var Selector=Class.create({initialize:function(a){this.expression=a.strip();if(this.shouldUseSelectorsAPI()){this.mode="selectorsAPI"}else{if(this.shouldUseXPath()){this.mode="xpath";this.compileXPathMatcher()}else{this.mode="normal";this.compileMatcher()}}},shouldUseXPath:(function(){var a=(function(){var e=false;if(document.evaluate&&window.XPathResult){var d=document.createElement("div");d.innerHTML="<ul><li></li></ul><div><ul><li></li></ul></div>";var c=".//*[local-name()='ul' or local-name()='UL']//*[local-name()='li' or local-name()='LI']";var b=document.evaluate(c,d,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);e=(b.snapshotLength!==2);d=null}return e})();return function(){if(!Prototype.BrowserFeatures.XPath){return false}var b=this.expression;if(Prototype.Browser.WebKit&&(b.include("-of-type")||b.include(":empty"))){return false}if((/(\[[\w-]*?:|:checked)/).test(b)){return false}if(a){return false}return true}})(),shouldUseSelectorsAPI:function(){if(!Prototype.BrowserFeatures.SelectorsAPI){return false}if(Selector.CASE_INSENSITIVE_CLASS_NAMES){return false}if(!Selector._div){Selector._div=new Element("div")}try{Selector._div.querySelector(this.expression)}catch(a){return false}return true},compileMatcher:function(){var e=this.expression,ps=Selector.patterns,h=Selector.handlers,c=Selector.criteria,le,p,m,len=ps.length,name;if(Selector._cache[e]){this.matcher=Selector._cache[e];return}this.matcher=["this.matcher = function(root) {","var r = root, h = Selector.handlers, c = false, n;"];while(e&&le!=e&&(/\S/).test(e)){le=e;for(var i=0;i<len;i++){p=ps[i].re;name=ps[i].name;if(m=e.match(p)){this.matcher.push(Object.isFunction(c[name])?c[name](m):new Template(c[name]).evaluate(m));e=e.replace(m[0],"");break}}}this.matcher.push("return h.unique(n);\n}");eval(this.matcher.join("\n"));Selector._cache[this.expression]=this.matcher},compileXPathMatcher:function(){var h=this.expression,j=Selector.patterns,c=Selector.xpath,g,b,a=j.length,d;if(Selector._cache[h]){this.xpath=Selector._cache[h];return}this.matcher=[".//*"];while(h&&g!=h&&(/\S/).test(h)){g=h;for(var f=0;f<a;f++){d=j[f].name;if(b=h.match(j[f].re)){this.matcher.push(Object.isFunction(c[d])?c[d](b):new Template(c[d]).evaluate(b));h=h.replace(b[0],"");break}}}this.xpath=this.matcher.join("");Selector._cache[this.expression]=this.xpath},findElements:function(a){a=a||document;var c=this.expression,b;switch(this.mode){case"selectorsAPI":if(a!==document){var d=a.id,f=$(a).identify();f=f.replace(/([\.:])/g,"\\$1");c="#"+f+" "+c}b=$A(a.querySelectorAll(c)).map(Element.extend);a.id=d;return b;case"xpath":return document._getElementsByXPath(this.xpath,a);default:return this.matcher(a)}},match:function(k){this.tokens=[];var q=this.expression,a=Selector.patterns,f=Selector.assertions;var b,d,g,o=a.length,c;while(q&&b!==q&&(/\S/).test(q)){b=q;for(var j=0;j<o;j++){d=a[j].re;c=a[j].name;if(g=q.match(d)){if(f[c]){this.tokens.push([c,Object.clone(g)]);q=q.replace(g[0],"")}else{return this.findElements(document).include(k)}}}}var n=true,c,l;for(var j=0,h;h=this.tokens[j];j++){c=h[0],l=h[1];if(!Selector.assertions[c](k,l)){n=false;break}}return n},toString:function(){return this.expression},inspect:function(){return"#<Selector:"+this.expression.inspect()+">"}});if(Prototype.BrowserFeatures.SelectorsAPI&&document.compatMode==="BackCompat"){Selector.CASE_INSENSITIVE_CLASS_NAMES=(function(){var c=document.createElement("div"),a=document.createElement("span");c.id="prototype_test_id";a.className="Test";c.appendChild(a);var b=(c.querySelector("#prototype_test_id .test")!==null);c=a=null;return b})()}Object.extend(Selector,{_cache:{},xpath:{descendant:"//*",child:"/*",adjacent:"/following-sibling::*[1]",laterSibling:"/following-sibling::*",tagName:function(a){if(a[1]=="*"){return""}return"[local-name()='"+a[1].toLowerCase()+"' or local-name()='"+a[1].toUpperCase()+"']"},className:"[contains(concat(' ', @class, ' '), ' #{1} ')]",id:"[@id='#{1}']",attrPresence:function(a){a[1]=a[1].toLowerCase();return new Template("[@#{1}]").evaluate(a)},attr:function(a){a[1]=a[1].toLowerCase();a[3]=a[5]||a[6];return new Template(Selector.xpath.operators[a[2]]).evaluate(a)},pseudo:function(a){var b=Selector.xpath.pseudos[a[1]];if(!b){return""}if(Object.isFunction(b)){return b(a)}return new Template(Selector.xpath.pseudos[a[1]]).evaluate(a)},operators:{"=":"[@#{1}='#{3}']","!=":"[@#{1}!='#{3}']","^=":"[starts-with(@#{1}, '#{3}')]","$=":"[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']","*=":"[contains(@#{1}, '#{3}')]","~=":"[contains(concat(' ', @#{1}, ' '), ' #{3} ')]","|=":"[contains(concat('-', @#{1}, '-'), '-#{3}-')]"},pseudos:{"first-child":"[not(preceding-sibling::*)]","last-child":"[not(following-sibling::*)]","only-child":"[not(preceding-sibling::* or following-sibling::*)]",empty:"[count(*) = 0 and (count(text()) = 0)]",checked:"[@checked]",disabled:"[(@disabled) and (@type!='hidden')]",enabled:"[not(@disabled) and (@type!='hidden')]",not:function(f){var j=f[6],c=Selector.patterns,k=Selector.xpath,a,l,h=c.length,b;var d=[];while(j&&a!=j&&(/\S/).test(j)){a=j;for(var g=0;g<h;g++){b=c[g].name;if(f=j.match(c[g].re)){l=Object.isFunction(k[b])?k[b](f):new Template(k[b]).evaluate(f);d.push("("+l.substring(1,l.length-1)+")");j=j.replace(f[0],"");break}}}return"[not("+d.join(" and ")+")]"},"nth-child":function(a){return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ",a)},"nth-last-child":function(a){return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ",a)},"nth-of-type":function(a){return Selector.xpath.pseudos.nth("position() ",a)},"nth-last-of-type":function(a){return Selector.xpath.pseudos.nth("(last() + 1 - position()) ",a)},"first-of-type":function(a){a[6]="1";return Selector.xpath.pseudos["nth-of-type"](a)},"last-of-type":function(a){a[6]="1";return Selector.xpath.pseudos["nth-last-of-type"](a)},"only-of-type":function(a){var b=Selector.xpath.pseudos;return b["first-of-type"](a)+b["last-of-type"](a)},nth:function(g,e){var h,i=e[6],d;if(i=="even"){i="2n+0"}if(i=="odd"){i="2n+1"}if(h=i.match(/^(\d+)$/)){return"["+g+"= "+h[1]+"]"}if(h=i.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(h[1]=="-"){h[1]=-1}var f=h[1]?Number(h[1]):1;var c=h[2]?Number(h[2]):0;d="[((#{fragment} - #{b}) mod #{a} = 0) and ((#{fragment} - #{b}) div #{a} >= 0)]";return new Template(d).evaluate({fragment:g,a:f,b:c})}}}},criteria:{tagName:'n = h.tagName(n, r, "#{1}", c);      c = false;',className:'n = h.className(n, r, "#{1}", c);    c = false;',id:'n = h.id(n, r, "#{1}", c);           c = false;',attrPresence:'n = h.attrPresence(n, r, "#{1}", c); c = false;',attr:function(a){a[3]=(a[5]||a[6]);return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(a)},pseudo:function(a){if(a[6]){a[6]=a[6].replace(/"/g,'\\"')}return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(a)},descendant:'c = "descendant";',child:'c = "child";',adjacent:'c = "adjacent";',laterSibling:'c = "laterSibling";'},patterns:[{name:"laterSibling",re:/^\s*~\s*/},{name:"child",re:/^\s*>\s*/},{name:"adjacent",re:/^\s*\+\s*/},{name:"descendant",re:/^\s/},{name:"tagName",re:/^\s*(\*|[\w\-]+)(\b|$)?/},{name:"id",re:/^#([\w\-\*]+)(\b|$)/},{name:"className",re:/^\.([\w\-\*]+)(\b|$)/},{name:"pseudo",re:/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/},{name:"attrPresence",re:/^\[((?:[\w-]+:)?[\w-]+)\]/},{name:"attr",re:/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/}],assertions:{tagName:function(a,b){return b[1].toUpperCase()==a.tagName.toUpperCase()},className:function(a,b){return Element.hasClassName(a,b[1])},id:function(a,b){return a.id===b[1]},attrPresence:function(a,b){return Element.hasAttribute(a,b[1])},attr:function(b,c){var a=Element.readAttribute(b,c[1]);return a&&Selector.operators[c[2]](a,c[5]||c[6])}},handlers:{concat:function(d,c){for(var e=0,f;f=c[e];e++){d.push(f)}return d},mark:function(a){var d=Prototype.emptyFunction;for(var b=0,c;c=a[b];b++){c._countedByPrototype=d}return a},unmark:(function(){var a=(function(){var b=document.createElement("div"),e=false,d="_countedByPrototype",c="x";b[d]=c;e=(b.getAttribute(d)===c);b=null;return e})();return a?function(b){for(var c=0,d;d=b[c];c++){d.removeAttribute("_countedByPrototype")}return b}:function(b){for(var c=0,d;d=b[c];c++){d._countedByPrototype=void 0}return b}})(),index:function(a,d,g){a._countedByPrototype=Prototype.emptyFunction;if(d){for(var b=a.childNodes,e=b.length-1,c=1;e>=0;e--){var f=b[e];if(f.nodeType==1&&(!g||f._countedByPrototype)){f.nodeIndex=c++}}}else{for(var e=0,c=1,b=a.childNodes;f=b[e];e++){if(f.nodeType==1&&(!g||f._countedByPrototype)){f.nodeIndex=c++}}}},unique:function(b){if(b.length==0){return b}var d=[],e;for(var c=0,a=b.length;c<a;c++){if(typeof(e=b[c])._countedByPrototype=="undefined"){e._countedByPrototype=Prototype.emptyFunction;d.push(Element.extend(e))}}return Selector.handlers.unmark(d)},descendant:function(a){var d=Selector.handlers;for(var c=0,b=[],e;e=a[c];c++){d.concat(b,e.getElementsByTagName("*"))}return b},child:function(a){var e=Selector.handlers;for(var d=0,c=[],f;f=a[d];d++){for(var b=0,g;g=f.childNodes[b];b++){if(g.nodeType==1&&g.tagName!="!"){c.push(g)}}}return c},adjacent:function(a){for(var c=0,b=[],e;e=a[c];c++){var d=this.nextElementSibling(e);if(d){b.push(d)}}return b},laterSibling:function(a){var d=Selector.handlers;for(var c=0,b=[],e;e=a[c];c++){d.concat(b,Element.nextSiblings(e))}return b},nextElementSibling:function(a){while(a=a.nextSibling){if(a.nodeType==1){return a}}return null},previousElementSibling:function(a){while(a=a.previousSibling){if(a.nodeType==1){return a}}return null},tagName:function(a,j,c,b){var k=c.toUpperCase();var e=[],g=Selector.handlers;if(a){if(b){if(b=="descendant"){for(var f=0,d;d=a[f];f++){g.concat(e,d.getElementsByTagName(c))}return e}else{a=this[b](a)}if(c=="*"){return a}}for(var f=0,d;d=a[f];f++){if(d.tagName.toUpperCase()===k){e.push(d)}}return e}else{return j.getElementsByTagName(c)}},id:function(a,l,b,c){var k=$(b),g=Selector.handlers;if(l==document){if(!k){return[]}if(!a){return[k]}}else{if(!l.sourceIndex||l.sourceIndex<1){var a=l.getElementsByTagName("*");for(var e=0,d;d=a[e];e++){if(d.id===b){return[d]}}}}if(a){if(c){if(c=="child"){for(var f=0,d;d=a[f];f++){if(k.parentNode==d){return[k]}}}else{if(c=="descendant"){for(var f=0,d;d=a[f];f++){if(Element.descendantOf(k,d)){return[k]}}}else{if(c=="adjacent"){for(var f=0,d;d=a[f];f++){if(Selector.handlers.previousElementSibling(k)==d){return[k]}}}else{a=g[c](a)}}}}for(var f=0,d;d=a[f];f++){if(d==k){return[k]}}return[]}return(k&&Element.descendantOf(k,l))?[k]:[]},className:function(b,a,c,d){if(b&&d){b=this[d](b)}return Selector.handlers.byClassName(b,a,c)},byClassName:function(c,b,f){if(!c){c=Selector.handlers.descendant([b])}var h=" "+f+" ";for(var e=0,d=[],g,a;g=c[e];e++){a=g.className;if(a.length==0){continue}if(a==f||(" "+a+" ").include(h)){d.push(g)}}return d},attrPresence:function(c,b,a,g){if(!c){c=b.getElementsByTagName("*")}if(c&&g){c=this[g](c)}var e=[];for(var d=0,f;f=c[d];d++){if(Element.hasAttribute(f,a)){e.push(f)}}return e},attr:function(a,j,h,k,c,b){if(!a){a=j.getElementsByTagName("*")}if(a&&b){a=this[b](a)}var l=Selector.operators[c],f=[];for(var e=0,d;d=a[e];e++){var g=Element.readAttribute(d,h);if(g===null){continue}if(l(g,k)){f.push(d)}}return f},pseudo:function(b,c,e,a,d){if(b&&d){b=this[d](b)}if(!b){b=a.getElementsByTagName("*")}return Selector.pseudos[c](b,e,a)}},pseudos:{"first-child":function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(Selector.handlers.previousElementSibling(e)){continue}c.push(e)}return c},"last-child":function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(Selector.handlers.nextElementSibling(e)){continue}c.push(e)}return c},"only-child":function(b,g,a){var e=Selector.handlers;for(var d=0,c=[],f;f=b[d];d++){if(!e.previousElementSibling(f)&&!e.nextElementSibling(f)){c.push(f)}}return c},"nth-child":function(b,c,a){return Selector.pseudos.nth(b,c,a)},"nth-last-child":function(b,c,a){return Selector.pseudos.nth(b,c,a,true)},"nth-of-type":function(b,c,a){return Selector.pseudos.nth(b,c,a,false,true)},"nth-last-of-type":function(b,c,a){return Selector.pseudos.nth(b,c,a,true,true)},"first-of-type":function(b,c,a){return Selector.pseudos.nth(b,"1",a,false,true)},"last-of-type":function(b,c,a){return Selector.pseudos.nth(b,"1",a,true,true)},"only-of-type":function(b,d,a){var c=Selector.pseudos;return c["last-of-type"](c["first-of-type"](b,d,a),d,a)},getIndices:function(d,c,e){if(d==0){return c>0?[c]:[]}return $R(1,e).inject([],function(a,b){if(0==(b-c)%d&&(b-c)/d>=0){a.push(b)}return a})},nth:function(c,s,u,r,e){if(c.length==0){return[]}if(s=="even"){s="2n+0"}if(s=="odd"){s="2n+1"}var q=Selector.handlers,p=[],d=[],g;q.mark(c);for(var o=0,f;f=c[o];o++){if(!f.parentNode._countedByPrototype){q.index(f.parentNode,r,e);d.push(f.parentNode)}}if(s.match(/^\d+$/)){s=Number(s);for(var o=0,f;f=c[o];o++){if(f.nodeIndex==s){p.push(f)}}}else{if(g=s.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(g[1]=="-"){g[1]=-1}var v=g[1]?Number(g[1]):1;var t=g[2]?Number(g[2]):0;var w=Selector.pseudos.getIndices(v,t,c.length);for(var o=0,f,k=w.length;f=c[o];o++){for(var n=0;n<k;n++){if(f.nodeIndex==w[n]){p.push(f)}}}}}q.unmark(c);q.unmark(d);return p},empty:function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(e.tagName=="!"||e.firstChild){continue}c.push(e)}return c},not:function(a,d,k){var g=Selector.handlers,l,c;var j=new Selector(d).findElements(k);g.mark(j);for(var f=0,e=[],b;b=a[f];f++){if(!b._countedByPrototype){e.push(b)}}g.unmark(j);return e},enabled:function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(!e.disabled&&(!e.type||e.type!=="hidden")){c.push(e)}}return c},disabled:function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(e.disabled){c.push(e)}}return c},checked:function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(e.checked){c.push(e)}}return c}},operators:{"=":function(b,a){return b==a},"!=":function(b,a){return b!=a},"^=":function(b,a){return b==a||b&&b.startsWith(a)},"$=":function(b,a){return b==a||b&&b.endsWith(a)},"*=":function(b,a){return b==a||b&&b.include(a)},"~=":function(b,a){return(" "+b+" ").include(" "+a+" ")},"|=":function(b,a){return("-"+(b||"").toUpperCase()+"-").include("-"+(a||"").toUpperCase()+"-")}},split:function(b){var a=[];b.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/,function(c){a.push(c[1].strip())});return a},matchElements:function(f,g){var e=$$(g),d=Selector.handlers;d.mark(e);for(var c=0,b=[],a;a=f[c];c++){if(a._countedByPrototype){b.push(a)}}d.unmark(e);return b},findElement:function(b,c,a){if(Object.isNumber(c)){a=c;c=false}return Selector.matchElements(b,c||"*")[a||0]},findChildElements:function(e,g){g=Selector.split(g.join(","));var d=[],f=Selector.handlers;for(var c=0,b=g.length,a;c<b;c++){a=new Selector(g[c].strip());f.concat(d,a.findElements(e))}return(b>1)?f.unique(d):d}});if(Prototype.Browser.IE){Object.extend(Selector.handlers,{concat:function(d,c){for(var e=0,f;f=c[e];e++){if(f.tagName!=="!"){d.push(f)}}return d}})}function $$(){return Selector.findChildElements(document,$A(arguments))}var Form={reset:function(a){a=$(a);a.reset();return a},serializeElements:function(g,b){if(typeof b!="object"){b={hash:!!b}}else{if(Object.isUndefined(b.hash)){b.hash=true}}var c,f,a=false,e=b.submit;var d=g.inject({},function(h,i){if(!i.disabled&&i.name){c=i.name;f=$(i).getValue();if(f!=null&&i.type!="file"&&(i.type!="submit"||(!a&&e!==false&&(!e||c==e)&&(a=true)))){if(c in h){if(!Object.isArray(h[c])){h[c]=[h[c]]}h[c].push(f)}else{h[c]=f}}}return h});return b.hash?d:Object.toQueryString(d)}};Form.Methods={serialize:function(b,a){return Form.serializeElements(Form.getElements(b),a)},getElements:function(e){var f=$(e).getElementsByTagName("*"),d,a=[],c=Form.Element.Serializers;for(var b=0;d=f[b];b++){a.push(d)}return a.inject([],function(g,h){if(c[h.tagName.toLowerCase()]){g.push(Element.extend(h))}return g})},getInputs:function(g,c,d){g=$(g);var a=g.getElementsByTagName("input");if(!c&&!d){return $A(a).map(Element.extend)}for(var e=0,h=[],f=a.length;e<f;e++){var b=a[e];if((c&&b.type!=c)||(d&&b.name!=d)){continue}h.push(Element.extend(b))}return h},disable:function(a){a=$(a);Form.getElements(a).invoke("disable");return a},enable:function(a){a=$(a);Form.getElements(a).invoke("enable");return a},findFirstElement:function(b){var c=$(b).getElements().findAll(function(d){return"hidden"!=d.type&&!d.disabled});var a=c.findAll(function(d){return d.hasAttribute("tabIndex")&&d.tabIndex>=0}).sortBy(function(d){return d.tabIndex}).first();return a?a:c.find(function(d){return/^(?:input|select|textarea)$/i.test(d.tagName)})},focusFirstElement:function(a){a=$(a);a.findFirstElement().activate();return a},request:function(b,a){b=$(b),a=Object.clone(a||{});var d=a.parameters,c=b.readAttribute("action")||"";if(c.blank()){c=window.location.href}a.parameters=b.serialize(true);if(d){if(Object.isString(d)){d=d.toQueryParams()}Object.extend(a.parameters,d)}if(b.hasAttribute("method")&&!a.method){a.method=b.method}return new Ajax.Request(c,a)}};Form.Element={focus:function(a){$(a).focus();return a},select:function(a){$(a).select();return a}};Form.Element.Methods={serialize:function(a){a=$(a);if(!a.disabled&&a.name){var b=a.getValue();if(b!=undefined){var c={};c[a.name]=b;return Object.toQueryString(c)}}return""},getValue:function(a){a=$(a);var b=a.tagName.toLowerCase();return Form.Element.Serializers[b](a)},setValue:function(a,b){a=$(a);var c=a.tagName.toLowerCase();Form.Element.Serializers[c](a,b);return a},clear:function(a){$(a).value="";return a},present:function(a){return $(a).value!=""},activate:function(a){a=$(a);try{a.focus();if(a.select&&(a.tagName.toLowerCase()!="input"||!(/^(?:button|reset|submit)$/i.test(a.type)))){a.select()}}catch(b){}return a},disable:function(a){a=$(a);a.disabled=true;return a},enable:function(a){a=$(a);a.disabled=false;return a}};var Field=Form.Element;var $F=Form.Element.Methods.getValue;Form.Element.Serializers={input:function(a,b){switch(a.type.toLowerCase()){case"checkbox":case"radio":return Form.Element.Serializers.inputSelector(a,b);default:return Form.Element.Serializers.textarea(a,b)}},inputSelector:function(a,b){if(Object.isUndefined(b)){return a.checked?a.value:null}else{a.checked=!!b}},textarea:function(a,b){if(Object.isUndefined(b)){return a.value}else{a.value=b}},select:function(c,f){if(Object.isUndefined(f)){return this[c.type=="select-one"?"selectOne":"selectMany"](c)}else{var b,d,g=!Object.isArray(f);for(var a=0,e=c.length;a<e;a++){b=c.options[a];d=this.optionValue(b);if(g){if(d==f){b.selected=true;return}}else{b.selected=f.include(d)}}}},selectOne:function(b){var a=b.selectedIndex;return a>=0?this.optionValue(b.options[a]):null},selectMany:function(d){var a,e=d.length;if(!e){return null}for(var c=0,a=[];c<e;c++){var b=d.options[c];if(b.selected){a.push(this.optionValue(b))}}return a},optionValue:function(a){return Element.extend(a).hasAttribute("value")?a.value:a.text}};Abstract.TimedObserver=Class.create(PeriodicalExecuter,{initialize:function($super,a,b,c){$super(c,b);this.element=$(a);this.lastValue=this.getValue()},execute:function(){var a=this.getValue();if(Object.isString(this.lastValue)&&Object.isString(a)?this.lastValue!=a:String(this.lastValue)!=String(a)){this.callback(this.element,a);this.lastValue=a}}});Form.Element.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.Element.getValue(this.element)}});Form.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.serialize(this.element)}});Abstract.EventObserver=Class.create({initialize:function(a,b){this.element=$(a);this.callback=b;this.lastValue=this.getValue();if(this.element.tagName.toLowerCase()=="form"){this.registerFormCallbacks()}else{this.registerCallback(this.element)}},onElementEvent:function(){var a=this.getValue();if(this.lastValue!=a){this.callback(this.element,a);this.lastValue=a}},registerFormCallbacks:function(){Form.getElements(this.element).each(this.registerCallback,this)},registerCallback:function(a){if(a.type){switch(a.type.toLowerCase()){case"checkbox":case"radio":Event.observe(a,"click",this.onElementEvent.bind(this));break;default:Event.observe(a,"change",this.onElementEvent.bind(this));break}}}});Form.Element.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.Element.getValue(this.element)}});Form.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.serialize(this.element)}});(function(){var v={KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,cache:{}};var e=document.documentElement;var w="onmouseenter" in e&&"onmouseleave" in e;var o;if(Prototype.Browser.IE){var h={0:1,1:4,2:2};o=function(y,x){return y.button===h[x]}}else{if(Prototype.Browser.WebKit){o=function(y,x){switch(x){case 0:return y.which==1&&!y.metaKey;case 1:return y.which==1&&y.metaKey;default:return false}}}else{o=function(y,x){return y.which?(y.which===x+1):(y.button===x)}}}function r(x){return o(x,0)}function q(x){return o(x,1)}function k(x){return o(x,2)}function c(z){z=v.extend(z);var y=z.target,x=z.type,A=z.currentTarget;if(A&&A.tagName){if(x==="load"||x==="error"||(x==="click"&&A.tagName.toLowerCase()==="input"&&A.type==="radio")){y=A}}if(y.nodeType==Node.TEXT_NODE){y=y.parentNode}return Element.extend(y)}function m(y,A){var x=v.element(y);if(!A){return x}var z=[x].concat(x.ancestors());return Selector.findElement(z,A,0)}function p(x){return{x:b(x),y:a(x)}}function b(z){var y=document.documentElement,x=document.body||{scrollLeft:0};return z.pageX||(z.clientX+(y.scrollLeft||x.scrollLeft)-(y.clientLeft||0))}function a(z){var y=document.documentElement,x=document.body||{scrollTop:0};return z.pageY||(z.clientY+(y.scrollTop||x.scrollTop)-(y.clientTop||0))}function n(x){v.extend(x);x.preventDefault();x.stopPropagation();x.stopped=true}v.Methods={isLeftClick:r,isMiddleClick:q,isRightClick:k,element:c,findElement:m,pointer:p,pointerX:b,pointerY:a,stop:n};var t=Object.keys(v.Methods).inject({},function(x,y){x[y]=v.Methods[y].methodize();return x});if(Prototype.Browser.IE){function g(y){var x;switch(y.type){case"mouseover":x=y.fromElement;break;case"mouseout":x=y.toElement;break;default:return null}return Element.extend(x)}Object.extend(t,{stopPropagation:function(){this.cancelBubble=true},preventDefault:function(){this.returnValue=false},inspect:function(){return"[object Event]"}});v.extend=function(y,x){if(!y){return false}if(y._extendedByPrototype){return y}y._extendedByPrototype=Prototype.emptyFunction;var z=v.pointer(y);Object.extend(y,{target:y.srcElement||x,relatedTarget:g(y),pageX:z.x,pageY:z.y});return Object.extend(y,t)}}else{v.prototype=window.Event.prototype||document.createEvent("HTMLEvents").__proto__;Object.extend(v.prototype,t);v.extend=Prototype.K}function l(B,A,C){var z=Element.retrieve(B,"prototype_event_registry");if(Object.isUndefined(z)){d.push(B);z=Element.retrieve(B,"prototype_event_registry",$H())}var x=z.get(A);if(Object.isUndefined(x)){x=[];z.set(A,x)}if(x.pluck("handler").include(C)){return false}var y;if(A.include(":")){y=function(D){if(Object.isUndefined(D.eventName)){return false}if(D.eventName!==A){return false}v.extend(D,B);C.call(B,D)}}else{if(!w&&(A==="mouseenter"||A==="mouseleave")){if(A==="mouseenter"||A==="mouseleave"){y=function(E){v.extend(E,B);var D=E.relatedTarget;while(D&&D!==B){try{D=D.parentNode}catch(F){D=B}}if(D===B){return}C.call(B,E)}}}else{y=function(D){v.extend(D,B);C.call(B,D)}}}y.handler=C;x.push(y);return y}function f(){for(var x=0,y=d.length;x<y;x++){v.stopObserving(d[x]);d[x]=null}}var d=[];if(Prototype.Browser.IE){window.attachEvent("onunload",f)}if(Prototype.Browser.WebKit){window.addEventListener("unload",Prototype.emptyFunction,false)}var j=Prototype.K;if(!w){j=function(y){var x={mouseenter:"mouseover",mouseleave:"mouseout"};return y in x?x[y]:y}}function s(A,z,B){A=$(A);var y=l(A,z,B);if(!y){return A}if(z.include(":")){if(A.addEventListener){A.addEventListener("dataavailable",y,false)}else{A.attachEvent("ondataavailable",y);A.attachEvent("onfilterchange",y)}}else{var x=j(z);if(A.addEventListener){A.addEventListener(x,y,false)}else{A.attachEvent("on"+x,y)}}return A}function i(C,A,D){C=$(C);var z=Element.retrieve(C,"prototype_event_registry");if(Object.isUndefined(z)){return C}if(A&&!D){var B=z.get(A);if(Object.isUndefined(B)){return C}B.each(function(E){Element.stopObserving(C,A,E.handler)});return C}else{if(!A){z.each(function(G){var E=G.key,F=G.value;F.each(function(H){Element.stopObserving(C,E,H.handler)})});return C}}var B=z.get(A);if(!B){return}var y=B.find(function(E){return E.handler===D});if(!y){return C}var x=j(A);if(A.include(":")){if(C.removeEventListener){C.removeEventListener("dataavailable",y,false)}else{C.detachEvent("ondataavailable",y);C.detachEvent("onfilterchange",y)}}else{if(C.removeEventListener){C.removeEventListener(x,y,false)}else{C.detachEvent("on"+x,y)}}z.set(A,B.without(y));return C}function u(A,z,y,x){A=$(A);if(Object.isUndefined(x)){x=true}if(A==document&&document.createEvent&&!A.dispatchEvent){A=document.documentElement}var B;if(document.createEvent){B=document.createEvent("HTMLEvents");B.initEvent("dataavailable",true,true)}else{B=document.createEventObject();B.eventType=x?"ondataavailable":"onfilterchange"}B.eventName=z;B.memo=y||{};if(document.createEvent){A.dispatchEvent(B)}else{A.fireEvent(B.eventType,B)}return v.extend(B)}Object.extend(v,v.Methods);Object.extend(v,{fire:u,observe:s,stopObserving:i});Element.addMethods({fire:u,observe:s,stopObserving:i});Object.extend(document,{fire:u.methodize(),observe:s.methodize(),stopObserving:i.methodize(),loaded:false});if(window.Event){Object.extend(window.Event,v)}else{window.Event=v}})();(function(){var d;function a(){if(document.loaded){return}if(d){window.clearTimeout(d)}document.loaded=true;document.fire("dom:loaded")}function c(){if(document.readyState==="complete"){document.stopObserving("readystatechange",c);a()}}function b(){try{document.documentElement.doScroll("left")}catch(f){d=b.defer();return}a()}if(document.addEventListener){document.addEventListener("DOMContentLoaded",a,false)}else{document.observe("readystatechange",c);if(window==top){d=b.defer()}}Event.observe(window,"load",a)})();Element.addMethods();Hash.toQueryString=Object.toQueryString;var Toggle={display:Element.toggle};Element.Methods.childOf=Element.Methods.descendantOf;var Insertion={Before:function(a,b){return Element.insert(a,{before:b})},Top:function(a,b){return Element.insert(a,{top:b})},Bottom:function(a,b){return Element.insert(a,{bottom:b})},After:function(a,b){return Element.insert(a,{after:b})}};var $continue=new Error('"throw $continue" is deprecated, use "return" instead');var Position={includeScrollOffsets:false,prepare:function(){this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},within:function(b,a,c){if(this.includeScrollOffsets){return this.withinIncludingScrolloffsets(b,a,c)}this.xcomp=a;this.ycomp=c;this.offset=Element.cumulativeOffset(b);return(c>=this.offset[1]&&c<this.offset[1]+b.offsetHeight&&a>=this.offset[0]&&a<this.offset[0]+b.offsetWidth)},withinIncludingScrolloffsets:function(b,a,d){var c=Element.cumulativeScrollOffset(b);this.xcomp=a+c[0]-this.deltaX;this.ycomp=d+c[1]-this.deltaY;this.offset=Element.cumulativeOffset(b);return(this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+b.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+b.offsetWidth)},overlap:function(b,a){if(!b){return 0}if(b=="vertical"){return((this.offset[1]+a.offsetHeight)-this.ycomp)/a.offsetHeight}if(b=="horizontal"){return((this.offset[0]+a.offsetWidth)-this.xcomp)/a.offsetWidth}},cumulativeOffset:Element.Methods.cumulativeOffset,positionedOffset:Element.Methods.positionedOffset,absolutize:function(a){Position.prepare();return Element.absolutize(a)},relativize:function(a){Position.prepare();return Element.relativize(a)},realOffset:Element.Methods.cumulativeScrollOffset,offsetParent:Element.Methods.getOffsetParent,page:Element.Methods.viewportOffset,clone:function(b,c,a){a=a||{};return Element.clonePosition(c,b,a)}};if(!document.getElementsByClassName){document.getElementsByClassName=function(b){function a(c){return c.blank()?null:"[contains(concat(' ', @class, ' '), ' "+c+" ')]"}b.getElementsByClassName=Prototype.BrowserFeatures.XPath?function(c,e){e=e.toString().strip();var d=/\s/.test(e)?$w(e).map(a).join(""):a(e);return d?document._getElementsByXPath(".//*"+d,c):[]}:function(e,f){f=f.toString().strip();var g=[],h=(/\s/.test(f)?$w(f):null);if(!h&&!f){return g}var c=$(e).getElementsByTagName("*");f=" "+f+" ";for(var d=0,k,j;k=c[d];d++){if(k.className&&(j=" "+k.className+" ")&&(j.include(f)||(h&&h.all(function(i){return !i.toString().blank()&&j.include(" "+i+" ")})))){g.push(Element.extend(k))}}return g};return function(d,c){return $(c||document.body).getElementsByClassName(d)}}(Element.Methods)}Element.ClassNames=Class.create();Element.ClassNames.prototype={initialize:function(a){this.element=$(a)},_each:function(a){this.element.className.split(/\s+/).select(function(b){return b.length>0})._each(a)},set:function(a){this.element.className=a},add:function(a){if(this.include(a)){return}this.set($A(this).concat(a).join(" "))},remove:function(a){if(!this.include(a)){return}this.set($A(this).without(a).join(" "))},toString:function(){return $A(this).join(" ")}};Object.extend(Element.ClassNames.prototype,Enumerable);
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  21                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kbprototype/1.6.0.3/kbPrototypes.js **/
/**                                                                                                      **/
/**********************************************************************************************************/

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////// ELEMENT FUNKTIONEN //////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var elemMethods = {
	highlightBox: function(element,index){
		var boxIndex = index;
		var childNodes = $(element).childElements();
		childNodes.each(function(value,index){
			if ($(value)){ 
				var style = $H($(value).style);
				if ($(value).id == 'container'+boxIndex){
					$(value).setStyle({borderColor:'#0000ff'});
				} else {
					$(value).setStyle({borderColor:'#000'});
				}
			}
		});
		return $(element);
	},
	
	clone: function(element,options){
		element = $(element);
		if (!(element && element.cloneNode)) return null;
		var result = $(element.cloneNode(true));
		options = (options)?options:{};
		if (element._eventID) Object.extend(result,{_eventID:''});
		if (element._prototypeEventID) Object.extend(result,{_prototypeEventID:''});
		result.writeAttribute(options);
		return $(result);
	},
	
	incAttribute: function(element){
		var element = $(element);	

		var options = Object.extend({
			offset: 0,
			attribute: 'id',
			index:null,
			expression: '(-?[\\d]+)([^\\d]*)$',
			condition:	'.*',
			flags:'',
			init:'0',
			delimiter:'_'
		}, KB.parseArgument(arguments[1] || {}));
		
		options.expression = new RegExp(options.expression)
		var attributeValue = (element.readAttribute(options.attribute) || '').replace(/\[\]/,'');
		
		var search = (element.readAttribute(options.attribute) || '').match(options.expression);
		var index = (attributeValue.match(options.expression))?attributeValue.match(options.expression):options.init;
		var brackets = ((element.readAttribute(options.attribute) || '').match(/\[\]/) || ['']).first();
		// Wenn attribut nicht verfï¿½gbar
		if (!element.readAttribute(options.attribute)) return $(element);
		
		if (search && typeof index == 'object'){				
			index = (Object.isNumber(options.index))? options.index : parseInt(search[1] || options.init) ;
			var postfix = (search[2] || "");
			//index = (Object.isNumber(options.index))?options.index:index.match(options.expression);
			var newAttrib = attributeValue.replace(options.expression,(Number(index)+Number(options.offset)) + postfix);
			element.setAttribute(options.attribute,newAttrib);
		} else {
			index = parseInt((Object.isNumber(options.index))?options.index:index) +Number(options.offset);
			element.setAttribute(options.attribute, attributeValue + options.delimiter + index + brackets);
		}		 
		return $(element);
	},
	
	reOrder : function(element){
		var element = $(element);
		if (!element) return null;
		var options = Object.extend({
			className: '',
			attributes:['id'],
			offset:0,
			expression: '(-?[\\d]+)([^\\d]*)$'
		}, KB.parseArgument(arguments[1] || {}));		
		
		element.descendants().concat([element]).findAll(function(e){
			return (e.hasClassName(options.className) && $(e));
		}).each(function(e,index){
			var index = index;
			($(e).descendants() || []).concat([$(e)]).each(function(elem){
				options.attributes.each(function(a){
					
					if (elem.readAttribute(a)) {
						
						elem.incAttribute({attribute:a,index:index,offset:options.offset,expression:options.expression});
					}
				});
				
			});
		});			
		return element;
	},
	
	collectValues: function(element){	
		var resultObject = $H({});
		var element = $(element) || $(document.getElementsByTagName("body").item(0));	

		var options = Object.extend({
			type: 'value',
			element: null
		}, KB.parseArgument(arguments[1]));
		
		var els = Element.select(element,options.element || 'input, textarea, select');
		els = (els)?els:[];
		els.concat([element]).each(function(e){
			var elementname = (e.readAttribute('name'))?e.readAttribute('name'):'';
			var value =	(e.value)?e.value : ((e.readAttribute('value'))?e.readAttribute('value'):'');
			var type = (e.readAttribute('type'))?e.readAttribute('type'):'';
			var nodeType = e.tagName.toLowerCase()
			var twoselect = (e.readAttribute('rel') == 'twoselect');
			if (elementname == 'action' || type.search(/^(submit|reset|image|button)$/i) != -1) return;
			if (!(resultObject.get(elementname) || resultObject.get(elementname+'[]'))) resultObject.set(elementname,[]);
				
			if (type == 'checkbox') {
				
				if (e.value!='on') {
					value = (e.checked) ? e.value : '';
				} else {
					value = (e.checked) ? 1 : 0;
				}
			}
			
			
			if (nodeType == 'select'){
				$A(e.options).each(function(option){
					if (option.selected || twoselect ) {
						if (options.type == 'text') resultObject.get(elementname).push(option.innerHTML);
						else resultObject.get(elementname).push(option.value);
					} 
				});				
			} else if ((type.search(/^(radio|checkbox)$/i) != -1 && e.checked) || type.search(/^(radio|checkbox)$/i) == -1) {		
				resultObject.get(elementname).push(value);
			} 
		});
		
		resultObject = resultObject.inject($H({}),function (obj, item){
			var key = (Object.isArray(item.value) && item.value.length > 1 && item.key.search(/\[\]$/i) == -1)? item.key+'[]' : item.key;
			var value = (Object.isArray(item.value) && item.value.length == 1 && item.key.search(/\[\]$/i) == -1)? item.value.first() : item.value;
			if (!key.empty()) obj.set(key,value);
			return obj;
		}).toObject();
		
		return resultObject;
	},
	
	setValues: function (element,values){
		var element = $(element);
		var values = (Object.isArray(values))?values:[values];		
		var options = Object.extend({
			type: 'replace', // replace | append || prepend
			element: null
		}, ((arguments[2] && Object.isString(arguments[2]) && unescape(arguments[2]).isJSON())? unescape(arguments[2]).evalJSON() : (arguments[2] || {} )));
		
		if (!element) return null;
		
		
		
			
		(element.select(element,options.element || 'input, textarea, select') || []).concat([element]).each(function(e,index){
			var value = (!Object.isUndefined(values[index]))?values[index]:values.first();
			var elementname = (e.readAttribute('name'))?e.readAttribute('name'):'';
			var type = (e.readAttribute('type'))?e.readAttribute('type'):'';
			var nodeType = e.tagName.toLowerCase();
			if (nodeType.search(/^(select)$/i) == -1 && type.search(/^(checkbox|radio)$/i) == -1) e.value = (options.type == 'append') ? e.value + value : ((options.type == 'prepend')? value + e.value : value);
			else if (nodeType.search(/^(input)$/i) != -1 && e.value == value) e.checked = 'checked';
			else if (nodeType.search(/^(select)$/i) != -1 ){
				$A(e.options).each(function(option){
					if (option.value == value) {
						option.selected = "selected";
					} else {
						option.selected = null;
					}
				});
			}
		});
		
		return $(element);
	},
	
	clearValues: function(element){
		element = $(element);
		var element = $(element) || $(document.getElementsByTagName("body").item(0));	
		
		(element.select('input, textarea, select') || []).concat([element]).each(function(e){
			var elementname = (e.getAttribute('name'))?e.getAttribute('name'):'';
			var value =	(e.getAttribute('value'))?e.getAttribute('value'):'';
			var type = (e.getAttribute('type'))?e.getAttribute('type'):'';
			var nodeType = e.tagName.toLowerCase()
			var twoselect = (e.readAttribute('rel') == 'twoselect');
			if (elementname == 'action' || type.search(/^(submit|reset|image|button)$/i) != -1) return;
			
			if (nodeType == 'select' && twoselect){
						
			} else if (type == 'checkbox' || type == 'radio') {
				e.checked = false; 
			} else {
				e.value = '';
			}
		});
		
		return element;
	},
	
	toggleContent: function(element){
		var element = $(element).cleanWhitespace();
		var options = Object.extend({
			src: '',
			dst: '' 
		}, KB.parseArgument(arguments[1]));
		
		var value = (element.readAttribute('value'))?element.readAttribute('value'):element.innerHTML;
		var newValue = (value.search(new RegExp(options.src,'i')) > -1)? options.dst : options.src;
		if (element.readAttribute('value')){			
			element.writeAttribute('value',newValue);
		} else {
			element.update(newValue);
		}
		document.fire('content:change');
		return element;
	},
	
	getBgColor: function(element){
		element = $(element);
		
		var options = Object.extend({
			hex: true
		}, ((arguments[1] && Object.isString(arguments[1]) && unescape(arguments[1]).isJSON())? unescape(arguments[1]).evalJSON() : (arguments[1] || {} )));
		
		var element = $(element) || $(document.getElementsByTagName("body").item(0));		
		var result = "transparent";
		if (element.getStyle('backgroundColor') != result){
			result = element.getStyle('backgroundColor'); 
		} else {
			var parent = element.ancestors().find(function(e){
				return e.getStyle('backgroundColor') != result;
			});
			if (parent) result = parent.getStyle('backgroundColor'); 
		}
		
		return result.getColorVersions();
		
	},
	
	/** liefert das erste gefundene eingabe Element zurï¿½ck 
	 * param Element (nï¿½tig fï¿½r Prototype)
	 */
	firstInput: function(element){
		element = $(element);
		return (['input', 'select', 'textarea'].include(element.tagName.toLowerCase())) ? element : element.descendants().find(function(element){
			return element.type != 'hidden' && !element.disabled &&['input','select','textarea'] .include(element.tagName.toLowerCase());
		});
		
	},
	
	clearFloats:function(element,where){
		element = $(element);		
		var where = (where)? where : 'bottom';
		eval('var options = {'+where+': \'<div class="clear"></div>\'};');
		Element.insert(element,options);
		return $(element);
	},
	
	setCursor: function(el,position) {
		el = $(el);
		if (!el) return null;
		if( el.setSelectionRange) {
			el.focus();
			el.setSelectionRange(position,position);
		} else {
			if(el.createTextRange) {
				range=el.createTextRange();
				range.collapse(true);
				range.moveEnd('character',position);
				range.moveStart('character',position);
				range.select();
			}
		}
		return el;
	} 
	
};

Element.addMethods(elemMethods);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////// STRING FUNKTIONEN //////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Object.extend(String.prototype,{ 

	/**
	 * formatiert "style.cssText"-attribut-strings nach einem einheitlichen schema;
	 */
	cssTextTrim: function(){
		return((this.replace(/\s*\:\s*/g,":").replace(/\s*\(\s*/g,"(").replace(/\s*\)\s*/g,")").replace(/\s*,\s*/g,",").replace(/\s*;\s*/g,";").replace(/\s+/g," ").replace(/^\s/,"").replace(/\s$/,"").replace(/;+/g,";").replace(/^;/,"").replace(/;$/,"")+";").toLowerCase());
	},
	
	/*
	 * erzeugt, wenn moeglich, 3 varianten von "cssText" sobald eine "#xxyyzz"- bzw. "rgb(aaa,bbb,ccc)"-anweisung in "cssText" gefunden wird;
	 * die varianten sind notwendig, um styles auch dann noch eindeutig identifizieren zu koennen, wenn diese z.b. durch den mozilla intern aus dem
	 * hexadezimalen ":#xxyyzz"- in das dezimale "rgb(aaa,bbb,ccc)"-format umgerechnet, oder falls styles mit mischungen aus diesen beiden formaten
	 * versehen wurden, oder aber wenn anwender die kurzschreibweise fuer das hexadezimale format beutzen - statt "#ffcc00" eben "#fc0";
	 *  varianten:
	 *    rgb(255,204,0)  - /rgb\s*\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/i - mit RegExp.$1,RegExp.$21,RegExp.$3;
	 *    #ffcc00         - /#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i                           - mit RegExp.$1,RegExp.$21,RegExp.$3;
	 *    #fc0            - /#([0-9a-f]{1})([0-9a-f]{1})([0-9a-f]{1})([;\s])/i                    - mit RegExp.$1,RegExp.$21,RegExp.$3,RegExp.$4;
	 *
	 * @return der rueckgabewert ist ein objekt mit den eigenschaften "rgb", "hex" und "half"; ("short" ist im javascript-sprachraum ein reserviertes wort)
	 */
	getColorVersions: function(){
		
	    var cssText = this.cssTextTrim(); // formatiert "style.cssText"-attribut-strings nach einem einheitlichen schema;
	    var versions = null;
	    if ((cssText.search(/rgb\s*\(\s*[0-9]{1,3}\s*,\s*[0-9]{1,3}\s*,\s*[0-9]{1,3}\s*\)/i) >= 0) || (cssText.search(/#[0-9a-f]{1}[0-9a-f]{1}[0-9a-f]{1}[;\s]/i) >= 0) || (cssText.search(/#[0-9a-f]{2}[0-9a-f]{2}[0-9a-f]{2}/i) >= 0)) {
	      var regX = null, regX_$1 = "", regX_$2 = "", regX_$3 = "", regX_$4 = "";
	      versions = {};        // alle moeglichen farbschemata:
	      versions.rgb = null;  // - dezimale schreibweise mit "rgb"-praefix;
	      versions.hex = null;  // - klassische hexadezimal-schreibweise;
	      versions.half = null; // - halbe hexadezimal-schreibweise;
	      versions.cleanHex = null; // - klassische hexadezimal-schreibweise ohne #;
	      
	    // - als ausgangsbasis fuer cssText dient die dezimale schreibweise mit "rgb"-praefix;
	    // - diese grundlage muss unter umstaenden erst einmal geschaffen werden;
	    // - die 3 moeglichen varianten werden dann vom ur-style abgeleitet;
	      regX = /#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i;
	      while (regX.test(cssText)) {
	        regX.exec(cssText);
	        regX_$1 = parseInt(RegExp.$1,16);
	        regX_$2 = parseInt(RegExp.$2,16);
	        regX_$3 = parseInt(RegExp.$3,16);
	        cssText = cssText.replace(regX,("rgb(" + regX_$1 + "," + regX_$2 + "," + regX_$3 + ")"));
	      }
	      regX = /#([0-9a-f]{1})([0-9a-f]{1})([0-9a-f]{1})([;\s])/i;
	      while (regX.test(cssText)) {
	        regX.exec(cssText);
	        regX_$1 = parseInt((RegExp.$1 + RegExp.$1),16);
	        regX_$2 = parseInt((RegExp.$2 + RegExp.$2),16);
	        regX_$3 = parseInt((RegExp.$3 + RegExp.$3),16);
	        regX_$4 = RegExp.$4;
	        cssText = cssText.replace(regX,("rgb(" + regX_$1 + "," + regX_$2 + "," + regX_$3 + ")" + regX_$4));
	      }
	    //alert("]" + cssText + "[");
	      versions.rgb = cssText; // "cssText"-basis !!
	
	      regX = /rgb\s*\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/i;
	      while (regX.test(cssText)) {
	        regX.exec(cssText);
	        regX_$1 = parseInt(RegExp.$1).toString(16);regX_$1 = ((regX_$1.length == 1) ? ("0" + regX_$1) : (regX_$1));
	        regX_$2 = parseInt(RegExp.$2).toString(16);regX_$2 = ((regX_$2.length == 1) ? ("0" + regX_$2) : (regX_$2));
	        regX_$3 = parseInt(RegExp.$3).toString(16);regX_$3 = ((regX_$3.length == 1) ? ("0" + regX_$3) : (regX_$3));
	        cssText = cssText.replace(regX,("#" + regX_$1 + regX_$2 + regX_$3));
	      }
	      versions.hex = cssText;
	
	      cssText = versions.rgb;
	      while (regX.test(cssText)) {
	        regX.exec(cssText);
	        regX_$1 = parseInt(RegExp.$1).toString(16);regX_$1 = ((regX_$1.length == 1) ? ("0" + regX_$1) : (regX_$1));
	        regX_$2 = parseInt(RegExp.$2).toString(16);regX_$2 = ((regX_$2.length == 1) ? ("0" + regX_$2) : (regX_$2));
	        regX_$3 = parseInt(RegExp.$3).toString(16);regX_$3 = ((regX_$3.length == 1) ? ("0" + regX_$3) : (regX_$3));
	        if ((regX_$1.charAt(0) == regX_$1.charAt(1)) && (regX_$2.charAt(0) == regX_$2.charAt(1)) && (regX_$3.charAt(0) == regX_$3.charAt(1))) {
	          cssText = cssText.replace(regX,("#" + regX_$1.charAt(0) + regX_$2.charAt(0) + regX_$3.charAt(0)));
	        } else {
	          cssText = cssText.replace(regX,("#" + regX_$1 + regX_$2 + regX_$3));
	        }
	      }
	      versions.half = cssText;
		  
		  versions.cleanHex = versions.hex.match(/[\dabcdef]{3,6}/).first();
	    }
	    return versions;
	},
	
	/**
	 * Sucht nach ï¿½bereinstimmenden Tags im String und gibt den Inhalt des Tags zurï¿½ck 
	 * @param {String} id
	 * @return String innerHTML
	 */
	getInnerHtml: function (n) {
		secure = 4000; /* SicherheitsZï¿½hler der zur Not die schleife abbricht... */
		
		// Wennn String eine ganze HTML Seite enthï¿½lt wird im Fehlerfall ein leerer String Zurï¿½ckgegeben,
		// sonst der String selbst
		var errorResult = (this.search(/<html[^>]*>/)  > -1 || this.search(/<head[^>]*>/)  > -1 || this.search(/<body[^>]*>/)  > -1)? '' : this;
		
		typeExpr = new RegExp("<([a-zA-Z]*)[^>]*id=."+n+"[^>]*>");
		if (!n || (n.length == 0) || (this.indexOf(n) == -1) || this.search(typeExpr)  == -1) return (errorResult);
		
		
		type = this.match(typeExpr)[1];	
				
		var front = ''
		var end = ''		
		if (type == null || type == undefined) return false;
		startExpression = new RegExp("<"+type+"[^>]*id=."+n+"[^>]*>");	
		startDivExp = new RegExp("<"+type+"[^>]*>");	
		endDivExp =  new RegExp("</"+type+">");
		
		startTag = new String(this.match(startExpression));
		startIndex = this.search(startTag) + startTag.length;
	
		var txt = new String(this.substr(startIndex)).replace(/<!--.*-->/,'');
		endMatch = txt.match(endDivExp);
		endIndex = 6 + txt.search(endDivExp);
		
		front = txt.substr(0,endIndex);
		end = txt.substr(endIndex);
		var lastIndex = endIndex;
		startMatch = front.split('<'+type);
		frontCount = 0;
		if (startMatch != null){
				startMatch = startMatch.uniq();
				frontCount += startMatch.length-1;
		}
		
		while (frontCount > 0 && --secure){
			endMatch = end.match(endDivExp);
			endIndex = 6 + end.search(endDivExp);
			lastIndex += endIndex;
			front = end.substr(0,endIndex);
			end = end.substr(endIndex);
		
			startMatch = front.split('<'+type);
			if (startMatch != null){
				startMatch = startMatch.uniq();
				frontCount += startMatch.length-1;
			}		
			frontCount--;
		}
		
		result = txt.substr(0,lastIndex-('</'+type+'>').length);
		
		return result;
	},
	
	/**
	 * Wie PHP-Addslashes
	 */
	addslashes: function() {
		var str = this;
		str = str.replace(/\'/g,'\\\'');
		str = str.replace(/\"/g,'\\"');
		str = str.replace(/\\/g,'\\\\');
		str = str.replace(/\0/g,'\\0');
		return str;
	},
	
	/**
	 * Wie PHP-Stripslashes
	 */
	stripslashes: function() {
		var str = this;
		str=str.replace(/\\'/g,'\'');
		str=str.replace(/\\"/g,'"');
		str=str.replace(/\\\\/g,'\\');
		str=str.replace(/\\0/g,'\0');
		return str;
	},
	
	/**
	 * Maskiert einen String fï¿½r new RegEXP
	 */
	maskRegExpString: function() { // nicht fuer netscape 4;
 		return this.replace(/([\^\$\.\*\+\?\=\!\:\|\\\/\(\)\[\]\{\}])/g,"\\$1");
   	},
	
	/**
	 * Wandelt Newlines in bBRs um
	 */
	nl2br: function() {
		return this.replace(/(\r\n)|(\r)|(\n)/gi, "<br />");
	},
	
	/**
	 * Wandelt bBRs in Newlines um
	 */
	br2nl: function(){
		return this.replace(/<br\s*\/?>/gi, "\n");
	},
	
	/**
	 * RC4 symmetric cipher encryption/decryption
	 */
	cipher: function(key) {
		var key = (key)? key : "123456789123456789123456789123456789123456789123456789"; 
		s = new Array();
		for (var i=0; i<256; i++) {
			s[i] = i;
		}
		var j = 0;
		var x;
		for (i=0; i<256; i++) {
			j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;
			x = s[i];
			s[i] = s[j];
			s[j] = x;
		}
		i = 0;
		j = 0;
		var ct = '';
		for (var y=0; y<this.length; y++) {
			i = (i + 1) % 256;
			j = (j + s[i]) % 256;
			x = s[i];
			s[i] = s[j];
			s[j] = x;
			ct += String.fromCharCode(this.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]);
		}
		return ct;
	},
	
	xorCrypt: function () {
		var key = "123456789123456789123456789123456789123456789123456789";
		var result = '';
		for (i = 0; i < this.length; i++){
			j = (i >= key.length)? 0 : i;
			result += String.fromCharCode(this.charCodeAt(i) ^ key.charCodeAt(j));		
		}
		return result;
	}

});


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////// HASH FUNKTIONEN //////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Object.extend(Hash.prototype,{ 
	without:function(){
		var values = $A(arguments);
		return this.each(function(obj){
			eval ('var object = {'+obj.key+':obj.value}');
			if (values.include(obj.value) || values.include(object)) this.unset(obj.key);
		}.bind(this));
	}
});

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////// WRAPPER FUNKTIONEN //////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Element.update() WRAPPER das event "content:changed" wird abgefeuert sobald der Inhalt geï¿½ndert wird...
 */
 
 
Element.Methods.update = Element.Methods.update.wrap(
	function(proceed, element, contents) {
		var scripts = contents.extractScripts().partition(function(script){return (script.search(/(KuborghEvents\.require)|(\_form\_element\.init)/) >= 0)});
		var contents = contents.stripScripts();
		scripts[0].map(function(script) { 
			return eval(script) 
		});
		element = proceed(element, contents);
		scripts[1].map(function(script) { 
			return eval(script) 
		});
		if ($(element)) $(element).fire("content:changed");
		if ($(element) && scripts[0].size() || scripts[1].size()) $(element).fire("content:loaded");    
		return $(element);
	}
);

Element.Methods.remove = Element.Methods.remove.wrap(
	function(proceed, element) {
		var options = Object.extend({
			
		}, KB.parseArgument(arguments[1] || {}));	
		
		if (!element || !element.parentNode) return null;
		if (element && $(element.id+'_overlay')) $(element.id+'_overlay').remove();
		return proceed(element);
	}
);
/*
Element.select = Element.select.wrap(
	function(proceed, element, contents) {
		if (KB.Browser.WebKit || KB.Browser.MobileSafari) {
			return (element.id)? $$('[id="' + element.id + '"] '+contents) : $$(element.tagName.toLowerCase() + '.' + $A(element.classNames()).first() + ' ' + contents);		
		} else {
			return proceed(element, contents);
		}
	}
);*/

Element.Methods.select = Element.Methods.select.wrap(
	function(proceed, element, contents) {
		return (element.select)? proceed(element, contents) : $$(contents);
	}
);

Form.Element.Methods.disable = Form.Element.Methods.disable.wrap(function(proceed,element){
	var e = element.up('dl');
	if (e && !e.hasClassName('fo_disabled')) e.addClassName('fo_disabled');
	return proceed(element);
});

Form.Element.Methods.enable = Form.Element.Methods.enable.wrap(function(proceed,element){
	var e = element.up('dl');
	if (e && e.hasClassName('fo_disabled')) e.removeClassName('fo_disabled');
	return proceed(element);
});



Element.addMethods();

Template.prototype.evaluate = Template.prototype.evaluate.wrap(
	function(proceed, object) {
		if (Object.isFunction(object.toTemplateReplacements))
			object = object.toTemplateReplacements();
		
		if (object.button_cancel && !object.button_cancel.match(/js_cancel/)) object.button_cancel = '<span class="js_cancel">' + object.button_cancel + '</span>';		
		if (object.button_ok && !object.button_ok.match(/js_ok/)) object.button_ok = '<span class="js_ok">' + object.button_ok + '</span>';	
		
		return proceed(object);
	}
);

Object.extend(Array.prototype, {
  intersect: function(array){
    return this.findAll( function(token){ return array.include(token) } );
  }
});




/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  40                                                                            **/
/** /var/www/dosdauter.de/www/javascript/validate/1.0.2/validate.js                                      **/
/**                                                                                                      **/
/**********************************************************************************************************/

/* Validate.js, version 1.0.2
*  (c) 2006 achraf bouyakhsass <mutation[at]mutationevent.com>
* 
*  This software is licensed under the CC-GNU GPL
*  http://creativecommons.org/licenses/GPL/2.0/
*
*  For more details
*  http://www.mutationevent.com/project/validate.js
*
*  Package to validate various data :
*  isEqual
*  hasValidChars
*  isSimpleIP
*  isAlphaLatin
*  isNotEmpty
*  isIntegerInRange
*  isNum
*  isEMailAddr
*  isZipCode
*  isDate
*  isMD5
*  isURL
*  isGuid
*  isISBN
*  isSSN
*  isDecimal
*  isplatform
*  addRules
*  Apply
/*--------------------------------------------------------------------------*/


var Validate = Class.create();

Object.extend(Validate.prototype,{
	/*--------------------------------------------------------------------------*/
	initialize:function(){
		this.error_array = []
		this.rules_array = [];
		this.e = true;
	},
	/*--------------------------------------------------------------------------*/
	isEqual:function(string1, string2){
		if(string1 == string2) return true;
		else return false;
	},
	/*--------------------------------------------------------------------------*/
	hasValidChars:function(s, characters, caseSensitive){
		function escapeSpecials(s){
			return s.replace(new RegExp("([\\\\-])", "g"), "\\$1");
		}
		return new RegExp("^[" + escapeSpecials(characters) + "]+$",(!caseSensitive ? "i" : "")).test(s);
	},
	/*--------------------------------------------------------------------------*/
	isSimpleIP:function(ip){
		ipRegExp = /^(([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+))$/
		return ipRegExp.test(ip);
	},
	/*--------------------------------------------------------------------------*/
	isAlphaLatin:function(string){
		alphaRegExp = /^[0-9a-z]+$/i
		return alphaRegExp.test(string);
	},
	/*--------------------------------------------------------------------------*/
	isNotEmpty:function (string){
		return /\S/.test(string);
	},
	/*--------------------------------------------------------------------------*/
	isEmpty:function(s){
		return !/\S/.test(s);
	},
	/*--------------------------------------------------------------------------*/
	isIntegerInRange:function(n,Nmin,Nmax){
		var num = Number(n);
		if(isNaN(num)){
			return false;
		}
		if(num != Math.round(num)){
			return false;
		}
		return (num >= Nmin && num <= Nmax);
	},
	/*--------------------------------------------------------------------------*/
	isNum:function(number){
		numRegExp = /^[0-9]+$/
		return numRegExp.test(number);
	},
	/*--------------------------------------------------------------------------*/
	isEMailAddr:function(string){
		emailRegExp = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.([a-z]){2,4})$/
		return emailRegExp.test(string);
	},
	/*--------------------------------------------------------------------------*/
	isZipCode:function(zipcode,country){
		if(!zipcode) return false;
		if(!country) format = 'US';
		switch(country){
			case'US': zpcRegExp = /^\d{5}$|^\d{5}-\d{4}$/; break;
			case'MA': zpcRegExp = /^\d{5}$/; break;
			case'CA': zpcRegExp = /^[A-Z]\d[A-Z] \d[A-Z]\d$/; break;
			case'DU': zpcRegExp = /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/; break;
			case'FR': zpcRegExp = /^\d{5}$/; break;
			case'Monaco':zpcRegExp = /^(MC-)\d{5}$/; break;
		}
		return zpcRegExp.test(zipcode);
	},
	/*--------------------------------------------------------------------------*/
	isDate:function(date,format){
		if(!date) return false;
		if(!format) format = 'FR';
		
		switch(format){
			case'FR': RegExpformat = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/([2][0]|[1][9])\d{2})$/; break;
			case'US': RegExpformat = /^([2][0]|[1][9])\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
			case'SHORTFR': RegExpformat = /^([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/\d{2}$/; break;
			case'SHORTUS': RegExpformat = /^\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
			case'dd MMM yyyy':RegExpformat = /^([0-2]\d|[3][0-1])\s(Jan(vier)?|FâˆšÂ©v(rier)?|Mars|Avr(il)?|Mai|Juin|Juil(let)?|Aout|Sep(tembre)?|Oct(obre)?|Nov(ember)?|Dec(embre)?)\s([2][0]|[1][19])\d{2}$/; break;
			case'MMM dd, yyyy':RegExpformat = /^(J(anuary|u(ne|ly))|February|Ma(rch|y)|A(pril|ugust)|(((Sept|Nov|Dec)em)|Octo)ber)\s([0-2]\d|[3][0-1])\,\s([2][0]|[1][9])\d{2}$/; break;
		}
		
		return RegExpformat.test(date);
	},
	/*--------------------------------------------------------------------------*/
	isMD5:function(string){
		if(!string) return false;
		md5RegExp = /^[a-f0-9]{32}$/;
		return md5RegExp.test(string);
	},
	/*--------------------------------------------------------------------------*/
	isURL:function(string){
		if(!string) return false;
		string = string.toLowerCase();
		//urlRegExp = /^((((ht|f)tp(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?\/?)?(\S*)?$/
		urlRegExp = /^(((ht|f)tp(s?))|\/)/
		return urlRegExp.test(string);
	},
	/*--------------------------------------------------------------------------*/
	isGuid:function(guid){//guid format : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx or xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
		if(!guid) return false;
		GuidRegExp = /^[{|\(]?[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}[\)|}]?$/
		return GuidRegExp.test(guid);
	},
	/*--------------------------------------------------------------------------*/
	isISBN:function(number){
		if(!number) return false;
		ISBNRegExp = /ISBN\x20(?=.{13}$)\d{1,5}([- ])\d{1,7}\1\d{1,6}\1(\d|X)$/
		return ISBNRegExp.test(number);
	},
	/*--------------------------------------------------------------------------*/
	isSSN:function(number){//Social Security Number format : NNN-NN-NNNN
		if(!number) return false;
		ssnRegExp = /^\d{3}-\d{2}-\d{4}$/
		return ssnRegExp.test(number);
	},
	/*--------------------------------------------------------------------------*/
	isDecimal:function(number){// positive or negative decimal
		if(!number) return false;
		decimalRegExp = /^-?(0|[1-9]{1}\d{0,})(\.(\d{1}\d{0,}))?$/
		return decimalRegExp.test(number);
	},
	/*--------------------------------------------------------------------------*/
	isplatform:function(platform){
		//win, mac, nix
		if(!platform) return false;
		var os;
		winRegExp = /\win/i
		if(winRegExp.test(window.navigator.platform)) os = 'win';
		
		macRegExp = /\mac/i
		if(macRegExp.test(window.navigator.platform)) os = 'mac';
		
		nixRegExp = /\unix|\linux|\sun/i
		if(nixRegExp.test(window.navigator.platform)) os = 'nix';
		
		if(platform == os) return true;
		else return false;
	},
	/*--------------------------------------------------------------------------*/
	getValue:function(id){
		document.getElementById(id).value;
	},
	/*--------------------------------------------------------------------------*/
	addRules:function(rules){
		this.rules_array.push(rules);
	},
	/*--------------------------------------------------------------------------*/
	check:function(){
		this.error_array = [];
		this.e = true;
		for(var i=0;i<this.rules_array.length;i++){
			switch(this.rules_array[i].option){
				/*--------------------------------------------------------------------------*/
				case'ValidChars':
					if(!this.hasValidChars(getValue(this.rules_array[i].id),this.rules_array[i].chars,false)){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'AlphaLatin':
					if (this.isAlphaLatin(getValue(this.rules_array[i].id))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'required':
					if (this.isEmpty(getValue(this.rules_array[i].id))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'integerRange':
					if (!this.isIntegerInRange(getValue(this.rules_array[i].id),this.rules_array[i].Min,this.rules_array[i].Max)){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'Number':
					if (!this.isNum(getValue(this.rules_array[i].id))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'email':
					if (!this.isEMailAddr(getValue(this.rules_array[i].id))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'zipCode':
					if (!this.isZipCode(getValue(this.rules_array[i].id),this.rules_array[i].country)){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'date':
					if(!this.isDate(getValue(this.rules_array[i].id),this.rules_array[i].format)){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'url':
					if(!this.isURL(getValue(this.rules_array[i].id))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'Decimal':
					if(!this.isDecimal(getValue(this.rules_array[i].id))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'isEqual':
					if(!this.isEqual(getValue(this.rules_array[i].id),getValue(this.rules_array[i].to))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
			}
		}
	},
	/*--------------------------------------------------------------------------*/
	Apply:function(el){
		this.check();
		if(this.e){
			return true;
		}else{
			var endMsg = this.error_array;
			if(!el){
				alert(this.error_array.toString().replace(/\,/gi,"\n"));
			}else{
				document.getElementById(el).innerHTML = this.error_array.toString().replace(/\,/gi,"<br/>");
			}
			return false;
		}
	}
	/*--------------------------------------------------------------------------*/
});

/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  45                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh/1.0/KB.js                **/
/**                                                                                                      **/
/**********************************************************************************************************/

/**
 * Kuborgh Namespace
 *
 * toogle
 * request
 * overlay
 * getLayout
 * setLayout
 *
 */
var KB = { };

Object.extend(KB, {
	Version: '1.0.0.0',
	Browser: Object.extend(Prototype.Browser,{
		IE6: ((parseInt(navigator.appVersion) == 4) && (navigator.userAgent.toLowerCase().indexOf("msie 6.") != -1)),
		IE7: ((parseInt(navigator.appVersion) == 4) && (navigator.userAgent.toLowerCase().indexOf("msie 7.") != -1))
	}),
	
	Layout: null,
	Timeranges : [],
	
	Lightbox: null,
	Validate: new Validate()
});

KB.Methods = (function(){

	var currentLayer = null
	
	
	function parseResponse(response){
		
		var result = {
			type: arguments[1] || 'Error',
			message: '',
			content: ''
		}
		if (response && Object.isString(response) && response.isJSON()){
			Object.extend(result, response.evalJSON() || {});
		} else if (response && Object.isString(response) && unescape(response).isJSON()){
			Object.extend(result, unescape(response).evalJSON() || {});
		} else if (response && Object.isString(response) && !unescape(response).isJSON()){
			var type = (unescape(response).search(/^([a-zA-Z]*);/) == 0)? unescape(response).match(/^([a-zA-Z]*);/)[1] : 'Success';
			var message = (unescape(response).search(/^[a-zA-Z]*;[a-zA-Z]*;/) == 0)? unescape(response).match(/^[a-zA-Z]*;([a-zA-Z]*);/)[1] : '';
			var content = (unescape(response).search(/^[a-zA-Z]*;[a-zA-Z]*;/) == 0)? unescape(response).replace(/^^[a-zA-Z]*;[a-zA-Z]*;/g,''): unescape(response);
			Object.extend(result, {
				type: type,
				message: message,
				content: content
			});
		} else {
			Object.extend(result, response || {});
		}
		result.type	= result.type.camelize();
		result.content = (result.content.search(/\*#\*#\*#\*#\*#\*#\*/) > -1)? result.content.replace(/\*#\*#\*#\*#\*#\*#\*/g, '\\') : result.content;
		
		result = $H(result).inject($H({}),function (obj, item){
			obj.set(item.key,(Object.isString(item.value))?unescape(item.value):((Object.isNumber(item.value))?new String(item.value).toString():item.value));
			return obj;
		}).toObject();
		
		
		return result;
	}	
	
	return {
		
		/**
		 * Liefert das Object fï¿½r das ï¿½bergebene Argument zurï¿½ck (Kann JSON, Object oder undefined sein)
		 * @param {Object} argument
		 */
		parseArgument: function (argument){
			var result = ((argument && Object.isString(argument) && unescape(argument).isJSON()) ? unescape(argument).evalJSON() : (argument || {}));
			result = $H(result).inject($H({}),function (obj, item){
				var value = '';
				if (Object.isString(item.value) && /^[\(\[\$\<\{]/m.test(unescape(item.value)) && /[\)\]\}\>]$/m.test(unescape(item.value)) ) {
					try {
						
						eval('value = ' + unescape(item.value) + ';');
					} 
					catch (exception) {
						value = unescape(item.value);
					}
				} else if (Object.isString(item.value)) {
					value = unescape(item.value);
				} else  {
					value = item.value;
				}
				obj.set(item.key,value);
				return obj;
			}).toObject();
			return result;
		},
		
		/**
		 * Elemente Ein- bzw. Ausblenden
		 * @param {Array || Element} elements Array von elementen oder einzelnes Element
		 * @param {Object} options new Effect.SlideLeftIn('demo-effect', {duration: 2, queue: 'end'});
		 */
		toggle: function(elements){
			if (!(Object.isArray(elements) || $(elements))) 
				return false;
			if (!Object.isArray(elements) && $(elements)) 
				elements = [$(elements)];
				
			
			
			// Extend Default Options
			var options = Object.extend({
				duration: 0.7, // duration of the effect in seconds, given as a float.
				delay: 0.0, // Sets the number of seconds to wait before the effect actually starts.
				effect: 'Fade', // Welcher Effect: (Fade, Blind, Slide)
				force:'', // einblenden bzw. ausblenden erzwingen... (hide | show | appear | fade)
				
				maxOpacity:0.9,				
				remove:false,
				queue:{scope:'global'}, // um auf die queue zuzugreifen...
				beforeStart: Prototype.emptyFunction,  	// Wid aufgerufen, bevor der Effekt gestartet wird.
				beforeUpdate: Prototype.emptyFunction,	// Wird bei jedem Durchlauf des Effekts vor Neuzeichnen des Elements aufgerufen.
				afterUpdate: Prototype.emptyFunction,	// Wird bei jedem Durchlauf des Effekts nach Neuzeichnen des Elements aufgerufen.
				afterFinish: Prototype.emptyFunction	// Wird am Ende des Effektes, nach dem letzten Mal Neuzeichnen aufgerufen. 
				
			}, KB.parseArgument(arguments[1]));
			
			if (Effect.Queue.effects.size() > 0 && Object.isString(options.force) && options.force.empty()) return;
			
			
			var effectMapping = $H({
				Fade: ['Fade', 'Appear'],
				Opacity: ['Opacity', 'Opacity'],
				Blind: ['BlindUp', 'BlindDown'],
				Slide: ['SlideUp', 'SlideDown'],
				SlideL: ['SlideLeftOut', 'SlideRightIn'],
				SlideR: ['SlideRightOut', 'SlideLeftIn']
			});
			
			
			
			var usedEffect = (effectMapping.get(options.effect)) ? effectMapping.get(options.effect) : effectMapping.get('Fade');
			
			var effects = [];
			elements.each(function(e){
				e = $(e);
				if (!e) return;
				
				var useOpacity = (e.getStyle('opacity') != null && options.effect == 'Fade' && !/((fade)|(appear))/i.test(options.force));
				
				var effect = (useOpacity)?'Opacity':options.effect;
				var maxOpacity = (useOpacity && e.getStyle('opacity') > 0.1)?e.getStyle('opacity'):options.maxOpacity;
				var effectObj = (useOpacity)?effectMapping.get('Opacity'):usedEffect;
				
				var id = e.readAttribute('id');		
				var overlay = (id && !id.include('overlay'))?$(id+'_overlay'):null;
				// Fï¿½r Effect.Opacity zusï¿½tzlich zu visible den test ob die opacity des Elements > 0.05 ist
				var visible = e.visible() && (e.getStyle('opacity') == null || e.getStyle('opacity') > 0.09)
				if ((visible && options.force == 'show') || (!visible && options.force == 'hide')) return;
				
				if (effect == 'Opacity' && e.getStyle('display') == 'none') {
					e.setStyle({ 
						opacity: 0.0,
						display:"block"
					});
				}
				
		
				if ((visible && !/((show)|(appear))/i.test(options.force) )|| /((fade)|(hide))/i.test(options.force)) {
					//	effects.push(new Effect.Fade(e, { sync: true, duration: 0.001 }));
					eval('effects.push(new Effect.' + effectObj[0] + '(e, { sync: true, options: options.duration ' + ((effect == 'Opacity')?',transition: Effect.Transitions.linear,from: ' + maxOpacity + ', to:  0.001 ':'') + ', queue: options.queue, object:e, afterFinish: function(){this.object.fire(\'toggle:hide\');}}));');
					if (overlay) eval('effects.push(new Effect.' + effectObj[0] + '(overlay, { sync: true, options: options.duration ' + ((effect == 'Opacity')?',transition: Effect.Transitions.linear,from: ' + maxOpacity + ', to:  0.001 ':'') + ', queue: options.queue, object:e, afterFinish: function(){this.object.fire(\'toggle:hide\');}}));');
					if (options.remove) {
						window.setTimeout(function(){
							this.remove();
							if (arguments[0]) arguments[0].remove();
						}.bind(e,overlay), (options.duration + 0.05 + options.delay)*1000);						
					}
				} else if ((!visible && !/((fade)|(hide))/i.test(options.force) ) || /((show)|(appear))/i.test(options.force)){
					//	effects.push(new Effect.Appear(e, { sync: true, duration: 0.001 }));
					eval('effects.push(new Effect.' + effectObj[1] + '(e, { sync: true, duration: options.duration ' + ((effect == 'Opacity')?',transition: Effect.Transitions.linear,from: 0.01, to: ' + maxOpacity : '') + ', queue: options.queue, object:e, afterFinish: function(){this.object.fire(\'toggle:show\');}}));');
					if (overlay) eval('effects.push(new Effect.' + effectObj[1] + '(overlay, { sync: true, duration: options.duration ' + ((effect == 'Opacity')?',transition: Effect.Transitions.linear,from: 0.01, to: ' + maxOpacity : '') + ', queue: options.queue, object:e, afterFinish: function(){this.object.fire(\'toggle:show\');} }));');
				}
			});			
			new Effect.Parallel(effects, options);
			
		},
		
		/**
		 * Request Wrapper...
		 * @param {Object} options
		 */
		request: function(){
			var options = Object.extend({
				url: '/index.php', // Url for the Request
				action: '', // Action for the Request
				id: '', // Id of the Element which will be replaced
				element: '', // Id of the Element which will be replaced
				params: {}, // Params Object
				collectAll: null, // Collect all Values 
				collectIds: [], // Collect Values in given Id's
				append: false, // Don't replace Ccontent... append it			
				update: true, // if set to false nothing will be updated
				clean: false, // clean up the form...				
				success_extra: '', 
				successFunc: Prototype.emptyFunction, 
				onSuccess: Prototype.emptyFunction, 
				failureFunc: Prototype.emptyFunction, 
				onFailure: Prototype.emptyFunction, 
				onLoad: Prototype.emptyFunction, 
				beforeStart: Prototype.emptyFunction, 
				functionParams: {}, 
				template: '#{content}', 
				infoElement: '',
				effectElement: '',
				errorElement: 'global_error_stack_output',
				infoElementContainer: '',
				errorElementContainer: 'global_error_stack_output_container',
				// Effect Zeug
				effect: false,
				effectOptions:{},
				overlay: true,
				overlayOptions: {},
				keepOverlay: false,
				indicator: null,
				duration: 0.7,
				// Deprecated
				doRedirect: false,
				// redirectOnSuccess (True, false)
				redirectOnSuccess: false,
				redirectURL: window.location.href,
				redirectOverlay: false
			}, KB.parseArgument(arguments[0]) || {});
			
			if (options.onSuccess != Prototype.emptyFunction) options.successFunc = options.onSuccess;
			if (options.onFailure != Prototype.emptyFunction) options.failureFunc = options.onFailure;
			if (options.onLoad != Prototype.emptyFunction) options.beforeStart = options.onLoad;
			options.template =  new Template(options.template);
			options.infoElement = ($(options.errorElement))? $(options.errorElement) : $(options.infoElement);
			options.infoElementContainer = ($(options.errorElementContainer))? $(options.errorElementContainer) : $(options.infoElementContainer);
			if (!options.infoElementContainer && options.infoElement) options.infoElementContainer = options.infoElement;
			//if (options.infoElementContainer) options.infoElementContainer.hide();
			
			var element = ($(options.id))?$(options.id):$(options.element);
			if (!element) options.update = false;
			effectElement = $(options.effectElement);
			if (!effectElement) effectElement = element;
			
			options.overlayOptions = Object.extend({
				bgColor : (effectElement) && effectElement.getBgColor() ? '#'+effectElement.getBgColor().cleanHex : '',
				indicator: options.indicator
			},options.overlayOptions);			
			var overlay = (options.overlay)?((effectElement && options.overlay)? KB.overlay(effectElement,options.overlayOptions) : null):null;
			// Post Parameter zusammensetzen...
			// Alle inputs innerhalb der Elemente die ï¿½ber collectIds angegeben sind
			if (!Object.isArray(options.collectIds)) options.collectIds = [options.collectIds];
			
			if (Object.isArray(options.collectIds)) {
				options.collectIds.each(function(el){
					collectElement = $(el);
					if (collectElement) {
						options.params = Object.extend(collectElement.collectValues(),options.params);
						if (options.clean) collectElement.clearValues();
					}
				});
			}
			
			// alles holen (jeder Input im Document)
			if (options.collectAll) {
				options.params = Object.extend($(document.getElementsByTagName("body").item(0)).collectValues(), options.params);
				if (options.clean) $(document.getElementsByTagName("body").item(0)).clearValues();
			}
		
			// action setzen
			if (!options.action.empty()) {
				Object.extend(options.params, {
					action: unescape(options.action).match(/^[^&]*/).first()
				});
				// fals an action weitere parameter angehï¿½ngt wurden...
				if (unescape(options.action).search(/&/) != -1){
					Object.extend(options.params, unescape(options.action).match(/&.*/).first().parseQuery());
				}
			}	
					
			options.params = $H(options.params);
			
			if (!element && options.params.get('destId') && $(options.params.get('destId'))) {
				element = $(options.params.get('destId'));
				options.id = $(options.params.get('destId'));
			}
			
			var opt = {
				// Use POST
				method: 'post',
				
				encoding:     'utf-8',
				// Send this lovely data
				postBody: options.params.toQueryString(),
				// Handle successful response
				onSuccess: function(t){
					var options = this;
					var element = ($(options.id))?$(options.id):$(options.element);
					var response = parseResponse(t.responseText);
					options.functionParams = Object.extend(options.functionParams,{
						response:response
					});
					
					// Redirect im Erfogsfall
					if (response.type == "Success" && options.redirectOnSuccess && !options.redirectURL.empty()){
						if (options.redirectOverlay){
							var windowOverlay = KB.overlay('document');
							KB.toggle(windowOverlay,{
								duration: options.duration,
								effect: 'Fade',
								force: 'show'
							});
						}
						setTimeout(function(){
							self.location=options.redirectURL;
						}, options.duration * 1100);
						return;
					}
					
					// Error Handling...
					if (options.infoElement && !response.message.empty()) {
						
						var queue = Effect.Queues.get('info');
						queue.each(function(effect) { 
							effect.cancel(); 
						});
						
						options.infoElement.classNames().each(function(e){
							if (e.include('errorStack')) options.infoElement.removeClassName(e);
						});
						
						Element.update(options.infoElement, response.message);
						options.infoElement.addClassName('errorStack'+response.type);
						KB.toggle(options.infoElementContainer,Object.extend({
							effect: options.effect,
							force: 'show',
							delay: 0.5,
							queue:{scope:'info'}
						},options.effectOptions));
							
						KB.toggle(options.infoElementContainer,Object.extend({
							effect: options.effect,
							force: 'hide',
							delay: 10.0,
							queue:{scope:'info'}
						},options.effectOptions));
								
					} 
					
					
					
					if (options.update) {
						if (response.type != 'Error'){					
							if (response.content && element) {
								
								response.content = (options.append) 
									? element.innerHTML + options.template.evaluate(response)
									: options.template.evaluate(response);
								response.content = 	response.content.getInnerHtml(element.readAttribute('id'));
								Element.update(element, response.content);															
							} 
						}						
					}
					if (effectElement) {
						if (options.effect && !KB.Browser.IE6) KB.toggle(effectElement,Object.extend({
							duration: options.duration,
							effect: options.effect,
							force: 'show'
						},options.effectOptions));
						if (options.overlay && !options.keepOverlay) {
							KB.toggle(overlay,Object.extend({
								duration: options.duration,
								effect: 'Fade',
								force: 'hide'
							},options.effectOptions));
							window.setTimeout(function(){
								if (overlay) overlay.remove();
							}, options.duration * 1100);	
						}
					}
					if (Object.isString(options.success_extra) && options.success_extra.length > 0 && response.type != 'Error') {
						eval(options.success_extra);
					}
										
					// Own functions for success/failure
					options.functionParams = Object.extend(options.functionParams,{
						response:Object.extend({
							template:options.template
						},response),
						overlay : overlay,
						request : options.params.toObject()
					});
					if (Object.isFunction(options.successFunc) && response.type == 'Success'){
						options.successFunc(element,options.functionParams);
		
					}
					if (Object.isFunction(options.failureFunc) && response.type != 'Success'){
						options.failureFunc(element,options.functionParams);
					}
					
				}.bind(options),
				// Handle 404
				on404: function(t){
					var options = this;
					var response = parseResponse(t.statusText,'Error');
					// Own functions for success/failure
					options.functionParams = Object.extend(options.functionParams,{
						response:Object.extend({
							template:options.template
						},response)
					});
					if (Object.isFunction(options.failureFunc) && response.type != 'Success'){
						options.failureFunc(element,functionParams);
					}
				}.bind(options),
				
				// Handle other errors
				onFailure: function(t){
					var options = this;
					var response = parseResponse(t.statusText,'Error');
					// Own functions for success/failure
					options.functionParams = Object.extend(options.functionParams,{
						response:Object.extend({
							template:options.template
						},response)
					});
					if (Object.isFunction(options.failureFunc) && response.type != 'Success'){
						options.failureFunc(element,functionParams);
					}
				}.bind(options)
			}
			
			if (effectElement) {
				if (options.effect && !KB.Browser.IE6) KB.toggle(effectElement,Object.extend({
					duration: options.duration,
					effect: options.effect,
					force: 'hide'
				},options.effectOptions));
				if (options.overlay) KB.toggle(overlay,Object.extend({
					duration: options.duration,
					effect: 'Fade',
					force: 'show'
				},options.effectOptions));
			} 
		
			options.beforeStart(element,options);
			
			setTimeout(function(){
				// Anfrage nicht per Ajax senden, sondern per self.location
				// 
				if (options.doRedirect) {
					self.location=options.url+'?'+opt['postBody'];
				} else {
					new Ajax.Request(options.url, opt);
				}
			}, options.duration * 1100);			
			
		},
		
		/**
		 * Erstellt ein Overlay fï¿½r das angegebene Element im DOM z.B. verwendet fï¿½r 
		 * @param {Object} element
		 * @param {Object} options 
		 */
		overlay:function(element){
			var bodyOverlay = (element == 'document' || element == 'body');
			var elem = (!bodyOverlay)? $(element) : $(document.getElementsByTagName("body").item(0));
			if (!elem) return null;
			var options = Object.extend({
				bgColor: null,	
				close: false,
				dimensions: null,
				indicatorDimensions: {width:16,height:16},
				indicator: null,
				className:'overlay',
				opacity:1,
				id:(bodyOverlay)?'window':elem.id,
				bodyOverlay: bodyOverlay
			}, KB.parseArgument(arguments[1]) || {});
			
			var overlayid = options.id + '_overlay';
			
			
			
			// IE Bugfix Overlay jedesmal neu erstellen und das alte lï¿½schen
			if (elem && $(overlayid) && (KB.Browser.IE || KB.Browser.IE6) && !bodyOverlay) {
				$(overlayid).remove();
			}
			
			if (elem && !$(overlayid)) {				
				var objOverlay = new Element("div",{id:overlayid,style:'position:absolute;display:none;z-index:999'});
		
				var indicator = (options.indicator && Object.isString(options.indicator) && !options.indicator.empty())		
					? new Element('img',{src:options.indicator,id: elem.id+'_overlay_loader'})
					: null;
				if (indicator) objOverlay.insert({top:indicator});	
				else objOverlay.insert({top: new Element("div")});			
				$(document.getElementsByTagName("body").item(0)).insert({bottom: objOverlay});
				
				objOverlay.clonePosition(elem);
				
				this.changeContent = function(event,indicator,options,element){
					var dim = KB.getPageSize();
					var height1 = $(document.getElementsByTagName("body").item(0)).getHeight();
					var height2 = $(document.getElementsByTagName("body").item(0)).firstDescendant().getHeight();	
					var height = (height1 > height2)?height1 :height2;
					height = (dim[1] > height)?dim[1] :height;
					// Overlayposition anpassen						
					if (options.bodyOverlay){						
						this.setStyle({
							width: '100%',
							height:height+'px'
						});
					} else {
						this.clonePosition(element);
					}					
					
					// indicatorposition in mitte setzen...
					if ($(indicator)){
						var cDimensions = this.getDimensions();
						var lDimensions = indicator.getDimensions();
						var indicatorTop = 0;
						if (options.bodyOverlay){
							var arrayPageScroll = document.viewport.getScrollOffsets();
							indicatorTop = dim.windowHeight/2 - lDimensions.height / 2 -  dim.windowHeight/10 + arrayPageScroll.top;
							if (parseInt (navigator.appVersion) >3 ) {
								if (navigator.appName.indexOf ('Microsoft')!= -1) {
									indicatorTop = arrayPageScroll.top + ((document.body.offsetHeight- lDimensions.height) / 2);
								}
							}
						} else {
							indicatorTop = (cDimensions.height - lDimensions.height)/2 ;
						}
						indicator.absolutize();
						indicator.setStyle({
							left: (cDimensions.width - lDimensions.width)/2+'px', 
							top: indicatorTop +'px',
							width: options.indicatorDimensions.width + 'px',
							height: options.indicatorDimensions.height + 'px',
							position: 'absolute'
						});
					
					}
				}
				
					
					

				if (indicator && !indicator.visible()) new Effect.Appear(indicator,{duration:0.5});					
				if (options.bgColor && /\#[a-fA-F0-9]{3,6}|(transparent)/.test(options.bgColor)) objOverlay.setStyle({backgroundColor: options.bgColor.match(/\#[a-fA-F0-9]{3,6}|(transparent)/).first()});			
				if (options.opacity) objOverlay.setStyle({opacity: options.opacity });			
				if (options.className) objOverlay.addClassName(options.className);
			
				this.currentLayer = objOverlay;
				
				// Start Observer to content:changed to resize the overlay if content changes
				document.observe('overlay:changed', this.changeContent.bindAsEventListener(objOverlay,indicator,options,elem));	
				
			} else if ($(overlayid)){
				this.currentLayer = $(overlayid);			
				var indicator = this.currentLayer.select('img').first();;
				if (indicator && !indicator.visible()) new Effect.Appear(indicator,{duration:0.5});
			}
			
			this.currentLayer.indicator = function(){
				return this.select('img').first();
			}.bind(this.currentLayer );			
			
			document.fire('overlay:changed');
			
			return this.currentLayer;
		},
		
		getLayout: function(){
			return (KB.Layout)?KB.Layout:KB.setLayout();
		},
		
		setLayout: function(){
			KB.Layout = {};
			
			var options = Object.extend({
				header: 'header',
				content: 'content',
				footer: 'footer'
			}, KB.parseArgument(arguments[0]) || {});		
			
			var ps = KB.getPageSize();
			
			Object.extend(KB.Layout,{
				header:  KB.Layout.header ? KB.Layout.header : (($(options.header))? $(options.header).getDimensions()  : {width:0,height:0}),
				footer:  KB.Layout.footer ? KB.Layout.footer : (($(options.footer))? $(options.footer).getDimensions()  : {width:0,height:0}),
				content: (($(options.content))? $(options.content).getDimensions() : {width:0,height:0}),
				viewport: {width: ps.windowWidth, height: ps.windowHeight}
			});
			
			$H(options).findAll(function(object){return ($(object.value) != null)}).each(function(object){
				var relevantStyles = $H($(object.value).getStyles()).findAll(function(style){return style.key.match(/((margin)|(border))/i);});	
				var w = relevantStyles.findAll(function(style){return style.key.match(/(left)|(right)/i)  && !style.key.match(/(color)/i);}).collect(function(s){return s.value.replace(/[^\d]*/g,'');}).inject(0, function(acc, n) { return Number(acc) + Number(n); });		
				var h = relevantStyles.findAll(function(style){return style.key.match(/(top)|(bottom)/i) && !style.key.match(/(color)/i) ;}).collect(function(s){return s.value.replace(/[^\d]*/g,'');}).inject(0, function(acc, n) { return Number(acc) + Number(n); });			
				eval('KB.Layout.'+object.key+'.width = KB.Layout.'+object.key+'.width + '+w+';');
				eval('KB.Layout.'+object.key+'.height = KB.Layout.'+object.key+'.height + '+h+';');
			});
			
			return KB.Layout;
		},
		
        getPageSize: function(){
        
            var xScroll, yScroll;
            
            if (window.innerHeight && window.scrollMaxY) {
                xScroll = window.innerWidth + window.scrollMaxX;
                yScroll = window.innerHeight + window.scrollMaxY;
            }
            else 
                if (document.body.scrollHeight > document.body.offsetHeight) { // all but Explorer Mac
                    xScroll = document.body.scrollWidth;
                    yScroll = document.body.scrollHeight;
                }
                else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
                    xScroll = document.body.offsetWidth;
                    yScroll = document.body.offsetHeight;
                }
            
            var windowWidth, windowHeight;
            
            if (self.innerHeight) { // all except Explorer
                if (document.documentElement.clientWidth) {
                    windowWidth = document.documentElement.clientWidth;
                }
                else {
                    windowWidth = self.innerWidth;
                }
                windowHeight = self.innerHeight;
            }
            else 
                if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
                    windowWidth = document.documentElement.clientWidth;
                    windowHeight = document.documentElement.clientHeight;
                }
                else 
                    if (document.body) { // other Explorers
                        windowWidth = document.body.clientWidth;
                        windowHeight = document.body.clientHeight;
                    }
            
            // for small pages with total height less then height of the viewport
            if (yScroll < windowHeight) {
                pageHeight = windowHeight;
            }
            else {
                pageHeight = yScroll;
            }
            
            // for small pages with total width less then width of the viewport
            if (xScroll < windowWidth) {
                pageWidth = xScroll;
            }
            else {
                pageWidth = windowWidth;
            }
            
            var res = $H({
                windowWidth: windowWidth,
                windowHeight: windowHeight,
                pageWidth: pageWidth,
                pageHeight: pageHeight
            });
            res.set('0', pageWidth);
            res.set('1', pageHeight);
            return res.toObject();
        }
		
		
	}
})();



/* Methoden in Namespace ziehen */
Object.extend(KB, KB.Methods)

/* Neue Events registrieren */
document.observe("dom:loaded", function(){
	
	if (!KB.Browser.IE) {
	
		Event.observe(window,'load',function(){
			document.fire('content:changed');
			document.fire('content:resize');

		});

		Event.observe(window,'resize',function(){
			document.fire('content:resize');
		});
		Event.observe(window, 'change', function(){
			document.fire('content:resize');
		});
		
	} else {
		// security check for undefinded functions
		if ((typeof window.onresize).toUpperCase() != "FUNCTION")window.onresize = Prototype.emptyFunction;
		if ((typeof window.onchange).toUpperCase() != "FUNCTION")window.onchange = Prototype.emptyFunction;
		if ((typeof window.onload).toUpperCase() != "FUNCTION")window.onload = Prototype.emptyFunction;
		
		// wraporiginal functions and dispatch events
		window.onresize = window.onresize.wrap(function(proceed){
			proceed();
			document.fire('content:resize');
		});
		
		window.onchange = window.onchange.wrap(function(proceed){
			proceed();
			document.fire('content:resize');
		});
		
		window.onload = window.onload.wrap(function(proceed){
			proceed();
			document.fire('content:changed');
			document.fire('content:resize');			
		});
		
		/* PNG FIX FÃœR IE6 */
		if (KB.Browser.IE6 ) {
			$$('input,img,button').findAll(function(e){
				return (e.readAttribute('src') || '').include('.png') && !e.hasClassName('png');
			}).invoke('addClassName', 'png');			
		}
	}
	
});

/* Element storage */
Element.Storage = Object.extend(Element.Storage || {UID: 1},{
  attributes:[
  	'submit',
	'title',
	'require',
	'onsuccess',
	'onfailure',
	'init'
  ]
});

    
Element.addMethods({
	getStorage: function(element){
		var uid;
	    if (element === window) {
	      uid = 0;
	    } else {
	      if (typeof element._prototypeUID === "undefined")
	        element._prototypeUID = [Element.Storage.UID++];
	      uid = element._prototypeUID[0];
	    }
	
	    if (!Element.Storage[uid]) {
			if (element === window || element === document) 
				Element.Storage[uid] = $H({});
			else {
				Element.Storage[uid] = $A(element.attributes).findAll(function(a){
					return a.nodeName.substring(0,5) == 'data-';
				}).inject($H(), function(stor, attr){
					var i = attr.nodeName.replace(/^data\-/, '');
					stor.set(i, attr.nodeValue);
					return stor;
				});
				
				if (element.readAttribute) {
					Element.Storage.attributes.each(function(uid, a){
						var i = 1;
						var value = this.readAttribute(a);
						if (value && !Element.Storage[uid].get(a)) 
							Element.Storage[uid].set(a, value);
					}.bind(element, uid));
				}
			}
		}	
		return Element.Storage[uid];
	}
});

  
  

document.observe("content:changed", function(){
	document.fire('content:resize');
	document.fire('overlay:changed');
});


/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  45                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh/1.0/kbEvents.js          **/
/**                                                                                                      **/
/**********************************************************************************************************/

/**
 * Kuborgh Eventverwaltung
  */

KB.Events = {
	
	
	submitInterrupts: 0,
	
	pushInterrupt: function(){
		this.submitInterrupts += 1;
	},
	
	popInterrupt: function(){
		this.submitInterrupts -= 1;
		return (this.submitInterrupts <= 0);
	}
};

KB.Events.elements = {};

KB.Events.elements.Base = {
	options:$H({}),
	elements:$H({})
};

KB.Events.elements.Base.Methods = (function(){	
	
	return {
		/**
		 * Lï¿½d die jeweiligen Eventobserver  
		 * @param {Element} element
	 	 * @param {Object} Object
		 */
		loadObservers:function(element){
			var elements = (Object.isArray(element))? element : [element];
			var options = Object.extend({

			}, KB.parseArgument(arguments[1] || {}));
				
			elements.findAll(function(e){
				return $(e);
			}).each(function(e,index){
				// stop observing element
				var el = arguments[1];
				if (!el) return;
				el.stopObserving();
				// Extend default options		
				if (el.id) this.options.set(el.id,arguments[0]);
				// load observers for element
				if (this.click) 	Event.observe(el, 'click', this.click.bindAsEventListener(this,arguments[0],el));
				if (this.change) 	Event.observe(el, 'change', this.change.bindAsEventListener(this,arguments[0],el));
				if (this.mouseover) Event.observe(el, 'mouseover', this.mouseover.bindAsEventListener(this,arguments[0],el));
				if (this.mouseout) 	Event.observe(el, 'mouseout', this.mouseout.bindAsEventListener(this,arguments[0],el));
				if (this.mousedown) Event.observe(el, 'mousedown', this.mousedown.bindAsEventListener(this,arguments[0],el));
				if (this.mouseup) 	Event.observe(el, 'mouseup', this.mouseup.bindAsEventListener(this,arguments[0],el));
				if (this.mousemove)	Event.observe(el, 'mousemove', this.mousemove.bindAsEventListener(this,arguments[0],el));
				if (this.dblclick) 	Event.observe(el, 'dblclick', this.dblclick.bindAsEventListener(this,arguments[0],el));
				if (this.blur)	 	Event.observe(el, 'blur', this.blur.bindAsEventListener(this,arguments[0],el));
				if (this.abort) 	Event.observe(el, 'abort', this.abort.bindAsEventListener(this,arguments[0],el));
				if (this.error) 	Event.observe(el, 'error', this.error.bindAsEventListener(this,arguments[0],el));
				if (this.select) 	Event.observe(el, 'select', this.select.bindAsEventListener(this,arguments[0],el));
				if (this.keyup) 	Event.observe(el, 'keyup', this.keyup.bindAsEventListener(this,arguments[0],el));
				if (this.keydown) 	Event.observe(el, 'keydown', this.keydown.bindAsEventListener(this,arguments[0],el));
				if (this.keypress) 	Event.observe(el, 'keypress', this.keypress.bindAsEventListener(this,arguments[0],el));
				if (this.focus) 	Event.observe(el, 'focus', this.focus.bindAsEventListener(this,arguments[0],el));
			}.bind(this,options));
			
			// dom:loaded und form:submit nur 1x pro Element registrieren
			[elements.find(function(e){
				return $(e);
			})].each(function(e){
				var el = arguments[1];
				var options = arguments[0];
				if (this.domloaded)   {
					this.domloadedCache =  this.domloaded.bindAsEventListener(this,options,el);
				//	document.stopObserving('content:loaded',this.domloadedCache);
				//	document.observe('content:loaded', this.domloadedCache);
					if (KB.Browser.IE) {
						Event.stopObserving(document,'dom:loaded',this.domloadedCache);
						Event.observe(document,'dom:loaded', this.domloadedCache);
					} else {
						document.stopObserving('dom:loaded',this.domloadedCache);
						document.observe('dom:loaded', this.domloadedCache);
					}
				}
				if (this.formsubmit && $(el) && el.up('form')) {
					this.formsubmitCache = this.formsubmit.bindAsEventListener(this,options);
					Event.stopObserving(el.up('form'),'submit',this.formsubmitCache);
					Event.observe(el.up('form'), 'submit', this.formsubmitCache);
				}
				
				this.dependencyCache =  this.initDependency.bindAsEventListener(this,options,el);
				document.stopObserving('dom:loaded',this.dependencyCache);
				document.observe('dom:loaded', this.dependencyCache);
				
			}.bind(this,options))
			
				
			
		},
		
		initDependency:function(event,options,element){
			var options = Object.extend({
				requires: {}
			}, KB.parseArgument(options || {}));		
			
			/* prÃ¼ft ob alle abhÃ¤ngigkeiten erfÃ¼llt sind
			 * vergleich mit form values und dependency array */ 
			var getVisibillity = function(element,dependencies){
				var elements = $H(element.up('form').collectValues());
				var result = dependencies.inject(true, function(result, dependency, index) { 
					var d = [dependency.value].flatten();
					var v = [this.get(dependency.key) || this.get(dependency.key+'[]')].flatten();
					return (result &= d.intersect(v).size() > 0); 
				},elements);
				return result;
			};
			
			
			if ($H(options.requires).size()) {
				
				var element = $(options.id);
				var visible = getVisibillity(element,$H(options.requires));
				
				/* element ein-/ausblenden */
				if (visible) element.show();
				else element.hide();
				
				/* Ã¼ber alle formelemente iterieren und ggf. onchange observer registrieren */
				element.up('form').getElements().findAll(function(dep,func,e){
					var n = e.readAttribute('name').replace(/\[\]/,'');
					if (dep.get(n)) {
						e.observe('change',function(event){
							var visible = getVisibillity(this,arguments[1]);
							/* element ein-/ausblenden */
							if (visible) {
								KB.toggle(this,{force:'appear'});
								//this.show();
							} else {
								KB.toggle(this, {force: 'fade'});
								//this.hide();
							}
						}.bindAsEventListener(this,dep));
					}					
					if (visible) element.show(); 
					else element.hide();
					
				}.bind(element,$H(options.requires),getVisibillity));
				
			}
		}
		
}})();

Object.extend(KB.Events.elements.Base, KB.Events.elements.Base.Methods);

	

/****************************************************************************************************/
/** COMBINE FILE NOT FOUND:  **/
/**                                                                            **/
/****************************************************************************************************/


/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/basic/latest/sendmail.js         **/
/**                                                                                                      **/
/**********************************************************************************************************/

function sendmail(mail) {
	mail = 'mailto:'+ unescape(mail).xorCrypt();
	location.href=mail;
}
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/AjaxClone.js   **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.AjaxClone = Object.extend({
	
	containers:$H({}),
	
	domloaded: function(e){
		var options = Object.extend({
			elements: [],
			clear_value: true
		}, KB.parseArgument(arguments[1] || {}));	
		var i = 1;
		
		options.elements.flatten().findAll(function(e){ return $(e);}).each(function(el){
			var c = new Element('div',  { className: 'js_clone_blockwrapper' });
			Element.wrap(el, c);
			$(el).addClassName('js_clone_block');
			Ajax_clone_form_element.containers.set(el,{
				container:c,
				elements: $(el).descendants().concat([el]).findAll(function(e){return (e._eventID || e._prototypeEventID) && e.id}).collect(function(e){			
					return {element:e,options:FormElementEvent.options.get(e.id)};
				})				
			});	
		});
	},
	
	click: function(e){
		var options = Object.extend({
			elements: [],
			clear_value: true
		}, KB.parseArgument(arguments[1] || {}));		
		var offset = e.element().readAttribute('rel');		
		var insertAfter = $(options.elements.last());
		options.elements.flatten().reverse(false).each(function(el){
			var object = Ajax_clone_form_element.containers.get(el);
			var container = object.container;
			var element = $(el)?$(el):container.childElements().last();	
			var offset = (container.descendants().find(function(x){ return x.readAttribute('name')}).readAttribute('name').match(/(\d+)[^\d]*$/) || [0]).last() ;
			if (!element || !container) return;
			var temp = element.descendants().find(function(e){return (e.id && FormElementEvent.options.get(e.id) && FormElementEvent.options.get(e.id).libraryName.search(/flash/i) >= 0);});			
			if (temp ) return;
			
			var cloneNode = element.clone();	
			var referenceNodes = element.descendants().concat([element]);
			cloneNode.descendants().concat([cloneNode]).each(function(e){
				var tmp = referenceNodes.find(function(t){return t.id == e.id});
				if ((tmp._eventID || tmp._prototypeEventID) && tmp.id){
					e = Object.extend(e,{
						_eventID:'event',
						options:FormElementEvent.options.get(tmp.id)
					});
				}
			});		

			
			
			Element.insert(container,{bottom:cloneNode});			
			container.reOrder({className:'js_clone_block',attributes:['name','id'],offset:offset});		
				
			var evalIds = [];		
			var cloneNodeId = cloneNode.id;			
			evalIds = cloneNode.descendants().concat([cloneNode]).findAll(function(e){return ((e._eventID || e._prototypeEventID) && e.id)}).collect(function(e){
				var options = {};
				Object.extend(options,e.options || {});					
				return {id:e.id,options:options};
			});
			
			element.descendants().concat([element]).concat(cloneNode.descendants().concat([cloneNode])).findAll(function(e){
				return e.readAttribute('kbEvent');
			}).each(function(e){
				e.writeAttribute({kbEvent:null});
			});
			
			if (options.clear_value) cloneNode.clearValues();			
			
			evalIds.each(function(obj){
				Object.extend(obj.options,{id:cloneNodeId});
				Object.extend($(obj.id),{options:obj.options});
				eval('if ('+obj.options.libraryName+'.init) '+obj.options.libraryName+'.init(obj.options);');
				eval(obj.options.libraryName+'.loadObservers(\''+obj.id+'\',obj.options);');
			});
			
			element.fire("content:changed");
			element.fire("dialog:changed");
		});
		
	},
	
	mouseover: function(e){
		e.element().style.cursor = 'pointer';
	},
	
	mouseout: function(e){
		e.element().style.cursor = 'default';
	}
	
	
},KB.Events.elements.Base);



/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Button.js      **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Button = Object.extend({

	
	click: function(e,options,element){
		// Extend default options
		var options = Object.extend({
			submit_type: '',
			ajax: null
		}, KB.parseArgument(options || {}));
		
		var dialog = element.up('.dialog');
		
		var form = (dialog)?dialog.select('form').first():element.up('form');
		
		// Find hidden "submit_type" input
		var hidden = (form)
			? form.submit_type
			: $$('input[name="submit_type"]').first();
		// wenn hidden nichtvorhanden -> erstelle hidden element fï¿½r 'submit_type'	
		if (!$(hidden) && (form)) {
			hidden = new Element('input',{type:'hidden', name:'submit_type'});
			form.insert({bottom: hidden});
		} else if (!$(hidden)) {
			hidden = new Element('input',{type:'hidden', name:'submit_type'});
			$(document.getElementsByTagName("body").item(0)).insert({bottom:hidden});
		}
		
		// Set "submit_type" if found
		if (hidden) hidden.value = options.submit_type;		
		
		// unregister other submit Observers if cancel button is pressed
		if (options.submit_type == 'cancel' && form ) {
			form.stopObserving('submit');
		}
		
		if (element.readAttribute('rel') && element.readAttribute('rel').include('dialog'))
			return;
		
		// Ajax Request
		if (options.ajax) {
			KB.request(options.ajax);
			if (options.ajax.clean) clearFormParams()
			e.stop();
		}
	},
	
	mouseover: function(e){
		var element = ($(e.element().parentNode).select('img, input') || ['']).first();
		
		var options = Object.extend({
		}, KB.parseArgument(arguments[1] || {}));
		if (!element || Object.isUndefined(options.image_source_highlight) || Object.isUndefined(options.image_source)) return;
		if (element.readAttribute('src') && !options.image_source_highlight.empty()){
			element.writeAttribute('src',options.image_source_highlight);
		}	
		
		element.style.cursor = 'pointer';
	},
	
	mouseout: function(e){	
		var element = ($(e.element().parentNode).select('img, input') || ['']).first();

		var options = Object.extend({
		}, KB.parseArgument(arguments[1] || {}));		
		if (!element || Object.isUndefined(options.image_source_highlight) || Object.isUndefined(options.image_source)) return;
		if (element.readAttribute('src') && !options.image_source.empty() && !options.image_source_highlight.empty()){
			element.writeAttribute('src',options.image_source);
		}
		
	}
},KB.Events.elements.Base);
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Checkbox.js    **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Checkbox = Object.extend({
	mouseover: function(event,options,element){
		element.setStyle({cursor:'pointer'});
	},
		
	change: function(event,options,element){
		var options = Object.extend({
			notify: false
		}, KB.parseArgument(options || {}));			
		if (options.notify) element.fire('form:changed');
	}
},KB.Events.elements.Base);
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/DhtmlList.js   **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.DhtmlList = Object.extend((function(){

	
	
	function addNode(){
		return $(element);
	}
	
	return {
		expression: '(-?[\\d]+)([\\[\\]]*)$',
		
		removeRow : function(e){		
			var element = e.findElement('.js_list_row');	
			if (!element) return null;			
			var parent = e.findElement('.js_list_container').select('.js_list_content').first();	
			if (!parent) return null;	
			var container = e.findElement('.js_list_container');
			
			var options = Object.extend({
				addon: ''
			}, KB.parseArgument(arguments[1] || {}));			
			
			// Element lï¿½schen
			element.remove();
			
			// Attribute der Zeilen neu Sortieren 
			parent.reOrder({className:'asset_list_row',attributes:['id','name'],expression: KB.Events.elements.DhtmlList.expression});			
			// Anzahl der Elemente zï¿½hlen
			var count = parent.select('.js_list_row').length;
			// Attribute der Input Felder anpassen
			if (container) 
				container.reOrder({className:'js_list_input',attributes:['name'],offset:count,expression: KB.Events.elements.DhtmlList.expression});	
		},
		
		
		cancelRow : function(e,s){
			var edit = (e.findElement)?e.findElement('.js_list_row'):$(e);	
			var show = s;
			if (!edit || !show) return null;			
			edit.remove();
			show.show();
		},

		submitRow : function(e,s){		
			var edit = (e.findElement)?e.findElement('.js_list_row'):$(e);	
			if (!edit) return null;
			var params = $H(edit.collectValues()).values().flatten().toArray();	
			var texts  = $H(edit.collectValues({type:'text'})).values().flatten().toArray();
			var container = e.findElement('.js_list_container').select('.js_list_content').first();
			var show = s;
			var newElement = false;
			if (!show) {
				// Neues Element Erzeugen
				newElement = true;
				show = e.findElement('.js_list_container').select('.js_clone_show').first().clone();
				if (!show) return null;
				// Neues Element einfï¿½gen
				container.insert({bottom: show});
				// Anzahl der Elemente zï¿½hlen
				var count = container.select('.js_list_row').length;
				// Attribute des erzeugten Elements anpassen
				show.reOrder({className:'asset_list_row',attributes:['id','name'],offset:count-1,expression: KB.Events.elements.DhtmlList.expression});
				// Attribute der Input Felder anpassen
				if (e.findElement('.js_list_container')) 
					e.findElement('.js_list_container').reOrder({className:'js_list_input',attributes:['name'],offset:count,expression: KB.Events.elements.DhtmlList.expression});
				
				
				// Bind Event Listener
				show.select('.js_list_delete').each(function(el) { 
				Event.observe(el,'click',KB.Events.elements.DhtmlList.removeRow.bindAsEventListener());
				});
				show.select('.js_list_edit').each(function(el) { 
					Event.observe(el,'click',KB.Events.elements.DhtmlList.editRow.bindAsEventListener());
				});
				show.select('.js_list_up').each(function(el) { 
					Event.observe(el,'click',KB.Events.elements.DhtmlList.moveUp.bindAsEventListener());
				});
				show.select('.js_list_down').each(function(el) { 
					Event.observe(el,'click',KB.Events.elements.DhtmlList.moveDown.bindAsEventListener());
				});
				
					
			}
			if (!show) return null;					
			
			show.setValues(params);			
			show.select('.js_list_show').each(function(e,index){
				var value = ((!Object.isUndefined(texts[index]))?texts[index]:texts.first()).strip();
				e.update((value.empty())?'&nbsp;':value);
			});			
			
			if (!newElement) edit.remove();
			else edit.clearValues();
			
			show.show();					
		},


		editRow : function(e){
			var element = (e.findElement)?e.findElement('.js_list_row'):$(e);	
			if (!element) return null;			
			var container = e.findElement('.js_list_container').cleanWhitespace();	
			if (!container) return null;
		
			var options = Object.extend({
			}, KB.parseArgument(arguments[1] || {}));	
			var params = $H(element.collectValues()).values().flatten().toArray()
			var edit = container.select('.js_clone_edit').first();
			var editListRow = edit.clone().setValues(params).show();	
			element.insert({before:editListRow});
			
			editListRow.select('.js_list_cancel').first().observe('click',KB.Events.elements.DhtmlList.cancelRow.bindAsEventListener(null,element));
			editListRow.select('.js_list_submit').first().observe('click',KB.Events.elements.DhtmlList.submitRow.bindAsEventListener(null,element));
			element.hide();
			
			return $(element);
		},
		
		moveDown: function(e){	
			var element = (e.findElement)?e.findElement('.js_list_row'):$(e);	
			if (!element) return null;			
			var next = element.next('.js_list_row');	
			if (!next) return element;
			next.insert({after:element});
			
			parent = e.findElement('.js_list_container').select('.js_list_content').first();
			parent = parent.reOrder({className:'asset_list_row',attributes:['id','name'],expression: KB.Events.elements.DhtmlList.expression});
		},
		
		moveUp: function(e){
			var element = (e.findElement)?e.findElement('.js_list_row'):$(e);	
			if (!element) return null;			
			var previous = element.previous('.js_list_row');	
			if (!previous) return element;
			previous.insert({before:element});		
			
			parent = e.findElement('.js_list_container').select('.js_list_content').first();
			parent = parent.reOrder({className:'asset_list_row',attributes:['id','name'],expression: KB.Events.elements.DhtmlList.expression});
		},
		
		change: function(e,options,element){
			var options = Object.extend({
				notify: false
			}, KB.parseArgument(arguments[1] || {}));
			
			if (options.notify) element.fire('form:changed');
		},
		
		domloaded: function(e){
			var options = Object.extend({}, KB.parseArgument(arguments[1] ||
			{}));
			if (!$(options.id)) return;
			// Anzahl der Elemente zÃ¤hlen
			var count = $(options.id).select('.js_list_content .js_list_row').length;
			// Attribute der Input Felder anpassen
			$(options.id).reOrder({
				className: 'js_list_input',
				attributes: ['name'],
				offset: count,
				expression: KB.Events.elements.DhtmlList.expression
			});
			
			// zusÃ¤tzliche Events registrieren
			$(options.id).select('.js_list_delete').each(function(el){
				Event.observe(el, 'click', KB.Events.elements.DhtmlList.removeRow.bindAsEventListener());
			});
			$(options.id).select('.js_list_edit').each(function(el){
				Event.observe(el, 'click', KB.Events.elements.DhtmlList.editRow.bindAsEventListener());
			});
			$(options.id).select('.js_list_up').each(function(el){
				Event.observe(el, 'click', KB.Events.elements.DhtmlList.moveUp.bindAsEventListener());
			});
			$(options.id).select('.js_list_down').each(function(el){
				Event.observe(el, 'click', KB.Events.elements.DhtmlList.moveDown.bindAsEventListener());
			});
			$(options.id).select('.js_list_add').each(function(el){
				Event.observe(el, 'click', KB.Events.elements.DhtmlList.submitRow.bindAsEventListener());
			});			
		}		
}})(),KB.Events.elements.Base);
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/FileUpload.js  **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.FileUpload = Object.extend({
	// Private 
	form: null,
	
	domloaded: function(event,options,element){
		var options = Object.extend({
			upload_type: 'input'
		}, KB.parseArgument(options || {}));
		
		// input element maskieren
		if (options.upload_type == 'input') {
			var mask_element = $(options.id).select('.js_upload_mask').first();
			if (!mask_element) return;
			
			element = element.select('input.js_fileupload').each(function(e){
				var mask = this.clone();
				e.insert({
					after: mask
				});
				
				mask.clonePosition(e,{
					setWidth:false,
					setHeight:false
				}).show().setStyle({display:'block'});
				
			
				
				if (KB.Browser.IE) {
					mask.select('.js_upload_mask_button').first().observe('click',function(event){
						e.click();
					}.bindAsEventListener(e));
					mask.select('.js_upload_mask_button').first().observe('mouseover',function(event){
						event.element().setStyle({cursor:'pointer'});
					});
				}
				
				/* upload element reset bei click auf mask element  */
				if (mask) mask.select('.js_upload_mask_input').first().observe('click',function(e){
					e.element().value = '';
					var c = mask.clone();
					mask.insert({after:c});
					KB.Events.elements.FileUpload.loadObservers(c,options);
					
					mask.remove();
				}.bindAsEventListener(e));
				
			
			}.bind(mask_element));
			
			
			
			
		}
	},
		
	formsubmit: function(event,options,element){
		var options = Object.extend({
			upload_type: 'flash'
		}, KB.parseArgument(options || {}));
		
		if (options.upload_type != 'flash') return;
		
		this.form = event.element();
		
		if ($(options.id)){	
			var name = 'flash_upload_'+options.id+'_content';
			if (navigator.appName.indexOf("Microsoft") != -1) {
				var movie = window[name];
			} else {
				var movie = document[name]
			}
			if (movie) {
				movie.uploadFiles();
				KB.Events.pushInterrupt();
			} 			
		}
	},
	
	submit:function(){
		var submit = KB.Events.popInterrupt();
		if (submit) this.form.submit();
	},
		
	change: function(event,options,element){
		var options = Object.extend({
			notify: false
		}, KB.parseArgument(options || {}));			
		if (options.notify) element.fire('form:changed');
		
		if (element.next('.js_upload_mask')) {
			element.next('.js_upload_mask').select('input').first().value = $F(element);
		}
	}

	
	
},KB.Events.elements.Base);


/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Headline.js    **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Headline = Object.extend({
	
	change: function(e,options,element){
		var options = Object.extend({
			notify_change: false
		}, KB.parseArgument(arguments[1] || {}));
		
		if (options.notify_change) element.fire('form:changed');
	}
},KB.Events.elements.Base);
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/ImageResize.js **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.ImageResize = Object.extend({
	// Private 
	images: $H({}),
	
	domloaded: function(event,options,element){	
		options = KB.parseArgument(options || {});
		
		
		options.sourceDimensions = $('image_resize_'+options.id).getDimensions();
		if (!options.sourceDimensions.width) options.sourceDimensions.width = $('image_resize_'+options.id).readAttribute('width');
		if (!options.sourceDimensions.height) options.sourceDimensions.height = $('image_resize_'+options.id).readAttribute('height');
		options.sourceDimensions.ratio = options.sourceDimensions.width / options.sourceDimensions.height;
		options.destDimensions = ($$('.aform_input_content').first())
			?{width: $$('.aform_input_content').first().getStyle('width').replace(/px/,''),height: $$('.aform_input_content').first().getStyle('height').replace(/px/,'')}
			:$('image_resize_content_'+options.id).getDimensions();
		
		if ( options.destDimensions.width > options.sourceDimensions.width ) {
			options.destDimensions.width = options.sourceDimensions.width;
			
		}
		options.destDimensions.height = options.destDimensions.width / options.sourceDimensions.ratio;
		options.zoom = options.destDimensions.width / options.sourceDimensions.width;
		 
		var minWidth = Math.ceil(options.crop_x * options.zoom);
		var minHeight = Math.ceil(options.crop_y * options.zoom);
		 
		var ratio = {
			x: options.destDimensions.width / minWidth,
			y: options.destDimensions.height / minHeight 
		}
		
		ratio = Math.min(ratio.x,ratio.y);
		options.ratio_multiplier = (ratio >= 1)? 1 : ratio;
		
		$('image_resize_'+options.id).writeAttribute({
			width: options.destDimensions.width,
			height: options.destDimensions.height		
		})
		
		var domTarget = (element.up('form'))?element.up('form'):$(document.getElementsByTagName("body").item(0));
		
		if (domTarget){
			domTarget.insert(new Element('input',{type:'hidden', id:'scale_'+options.id, name:'scale'+options.nameAddon}));
			domTarget.insert(new Element('input',{type:'hidden', id:'width_'+options.id, name:'width'+options.nameAddon}));
			domTarget.insert(new Element('input',{type:'hidden', id:'height_'+options.id, name:'height'+options.nameAddon}));
			domTarget.insert(new Element('input',{type:'hidden', id:'x_'+options.id, name:'x'+options.nameAddon}));
			domTarget.insert(new Element('input',{type:'hidden', id:'y_'+options.id, name:'y'+options.nameAddon}));
			domTarget.insert(new Element('input',{type:'hidden', id:'custom_width_'+options.id, name:'custom_width'+options.nameAddon}));
			domTarget.insert(new Element('input',{type:'hidden', id:'custom_height_'+options.id, name:'custom_height'+options.nameAddon}));
			domTarget.insert(new Element('input',{type:'hidden', id:'temp_file_'+options.id, name:'temp_file'+options.nameAddon, value:options.imageUrl}));
			domTarget.insert(new Element('input',{type:'hidden', id:'Bild des Nutzers', name:options.name+'_crop', value:options.nameAddon.replace(/_/,'')}));
		}
		
		this.images.set(options.id, new Cropper.KbImage(
			'image_resize_'+options.id,	{
				previewWrap: 'image_resize_'+options.id+'_preview',
				minWidth: minWidth * options.ratio_multiplier,
				minHeight: minHeight * options.ratio_multiplier, 
				ratioDim: { x: options.crop_x* options.ratio_multiplier , y: options.crop_y* options.ratio_multiplier  },
				kbOptions:options,
				displayOnInit: 1,
				onEndCrop: this.writeParams,
				onUpdateCrop: this.updateParams,
				eventRoot: $(options.id).select('.js_imageresize_container').first()
			}
		));
	},
	
	
	writeParams: function(coords, dimensions,options){
		var id = this.kbOptions.id;
		var srcDimensions = this.kbOptions.sourceDimensions;
		var zoomFaktor =  Math.round(((dimensions.width / srcDimensions.width) *10000))/100;
		$( 'scale_' + id ).setValues(zoomFaktor);
		$( 'custom_width_' + id ).setValues(dimensions.width);
		$( 'custom_height_' + id ).setValues(dimensions.height);
		$( 'x_' + id ).setValues(coords.x1);
		$( 'y_' + id ).setValues(coords.y1);
		$( 'width_' + id ).setValues(Math.floor((coords.x2 - coords.x1) * this.kbOptions.ratio_multiplier));
		$( 'height_' + id ).setValues(Math.floor((coords.y2 - coords.y1) * this.kbOptions.ratio_multiplier));
	},
	
	updateParams: function(coords, dimensions,options){
		var id = this.kbOptions.id;
		var srcDimensions = this.kbOptions.sourceDimensions;
		var zoomFaktor =  Math.round(((dimensions.width / srcDimensions.width) *10000))/100;
		if ($(id).select('.js_preview_width').first()) $(id).select('.js_preview_width').first().value = Math.floor((coords.x2 - coords.x1) * this.kbOptions.ratio_multiplier);
		if ($(id).select('.js_preview_height').first()) $(id).select('.js_preview_height').first().value = Math.floor((coords.y2 - coords.y1) * this.kbOptions.ratio_multiplier);
		if ($(id).select('.js_preview_start_x').first()) $(id).select('.js_preview_start_x').first().value = Math.floor(coords.x1);
		if ($(id).select('.js_preview_start_y').first()) $(id).select('.js_preview_start_y').first().value = Math.floor(coords.y1);
		if ($(id).select('.js_preview_end_x').first()) $(id).select('.js_preview_end_x').first().value = Math.floor(coords.x2);
		if ($(id).select('.js_preview_end_y').first()) $(id).select('.js_preview_end_y').first().value = Math.floor(coords.y2);			
	},
		

		
	change: function(event,options,element){
		var options = Object.extend({
			notify: false
		}, KB.parseArgument(arguments[1] || {}));
		
		if (options.notify) element.fire('form:changed');
	//	if (event.keyCode) code = event.keyCode;
	//	else if (event.which) code = event.which;
	//	var number = parseInt(String.fromCharCode(code));
		
		//
		if (element.tagName.toUpperCase() == 'INPUT' && $(options.id).select('.js_value_container').first()) {
			var zoom = this.images.get(options.id).options.kbOptions.zoom;
			var values = $H($(options.id).select('.js_value_container').first().collectValues()).inject($H({}),function (obj, item){
				if (!isNaN(parseInt(item.value))){
					var val = (parseInt(item.value) < 0)? 0 : parseInt(item.value);
					obj.set(item.key,Math.ceil(val * this));
				} 
				else obj.set(item.key,0);
				return obj;
			}.bind(zoom)).toObject();
			
			var size = {
				width: this.images.get(options.id).imgW,
				height: this.images.get(options.id).imgH
			}
			
			values = {
				width: (values.width + values.x1 > size.width)? size.width - values.x1: values.width,
				height: (values.height + values.y1 > size.height)? size.height - values.y1 : values.height,
				x1: (values.x1 > values.x2) ? values.x2 : values.x1, 
				x2: (values.x2 > size.width) ? size.width : values.x2, 
				y1: (values.y1 > values.y2) ? values.y2 : values.y1, 
				y2: (values.y2 > size.height) ? size.height : values.y2
			}
			
			if (element.hasClassName('js_preview_width')){
				values.x2 = values.x1 + values.width;
				if (values.x2 > size.width) {
					values.x1 -= values.x - size.width;
					values.x2 = size.width;					
				}
			} else if (element.hasClassName('js_preview_height')){
				values.y2 = values.y1 + values.height;
				if (values.y2 > size.height) {
					values.y1 -= values.y - size.height;
					values.y2 = size.height;					
				}
			} else if (element.hasClassName('js_preview_start_x')){
				
			} else if (element.hasClassName('js_preview_end_x')){
				values.width = values.x2 - values.x1;
			} else if (element.hasClassName('js_preview_start_y')){
				
			} else if (element.hasClassName('js_preview_end_y')){
				values.height = values.y2 - values.y1;
			}
			
			if (this.images.get(options.id).set) this.images.get(options.id).set(values);
			
		}
	}
	
},KB.Events.elements.Base);


/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Imagemap.js    **/
/**                                                                                                      **/
/**********************************************************************************************************/

/**
 * @author bzoerb
 */
KB.Events.elements.Imagemap = Object.extend({
		maps: $H({}),
	
		domloaded: function(event,options,element){
			var options = Object.extend({
			}, KB.parseArgument(options || {}));
		
			window.setTimeout(function(options){
				// Map initialisieren
				this.maps.set(options.id, new ImageMap({
					selected: options.selectedElement,					
					width: options.width,
					height: options.height,
					scale: options.scale,
					image: $(options.id).select('.js_imagemap_image').first(),
					links: $(options.id).select('.js_imagemap_linklist').first(),
					code: $(options.id).select('.js_imagemap_code').first(),
					hidden : $(options.id).select('.js_imagemap_hidden').first(),
					target : $(options.id).select('.js_imagemap_target').first(),
					trash : $(options.id).select('.js_imagemap_trash').first(),
					inputCloneLink : $(options.id).select('.js_imagemap_form_element_link').first(),
					inputCloneInfo : $(options.id).select('.js_imagemap_form_element_info').first(),
					inputCloneTitle : $(options.id).select('.js_imagemap_form_element_title').first(),
					inputLinkReplaceText : options.inputLinkReplaceText,
					inputInfoReplaceText : options.inputInfoReplaceText,
					inputTitleReplaceText : options.inputTitleReplaceText					
				}));
				// walter zorn zeug
				if (dd) {
					dd.elements.DHTMLcircle.setDropFunc(this.maps.get(options.id).drop);
					dd.elements.DHTMLcircle.setPickFunc(this.maps.get(options.id).pick);
					dd.elements.DHTMLcircle.map = this.maps.get(options.id);			
					dd.elements.DHTMLrect.setDropFunc(this.maps.get(options.id).drop);
					dd.elements.DHTMLrect.setPickFunc(this.maps.get(options.id).pick);
					dd.elements.DHTMLrect.map = this.maps.get(options.id);
				}
				$(options.id).observe( 'mouseup', function(event){
					this.create({x:Event.pointerX(event), y:Event.pointerY(event)})
				}.bindAsEventListener(this.maps.get(options.id)));
				
				this.maps.get(options.id).parseExistingMap();
				
				
				if ($(options.id).select('.js_imagemap_indicator').first()) {
					KB.toggle($(options.id).select('.js_imagemap_indicator').first(),{
						force: 'fade'
					});
				}
				
				$(options.id).select('.js_imagemap_reset').first().observe('click',function(){
					this.clearMap();
				}.bindAsEventListener(this.maps.get(options.id)));
				
			}.bind(this,options),2000);
		
		
			
			if ($(options.id).select('.js_imagemap_indicator').first()) {
				KB.toggle($(options.id).select('.js_imagemap_indicator').first(),{
					force: 'appear'
				});
			}
			
			
			
			
			
		},
	
		change: function(e,options,element){
			var options = Object.extend({
				notify: false
			}, KB.parseArgument(arguments[1] || {}));
			
			if (options.notify) element.fire('form:changed');
		}
},KB.Events.elements.Base);

/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Info.js        **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Info = Object.extend({

		change: function(e,options,element){
			var options = Object.extend({
				notify: false
			}, KB.parseArgument(arguments[1] || {}));
			
			if (options.notify) element.fire('form:changed');
		}
},KB.Events.elements.Base);
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Input.js       **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Input = Object.extend((function(){
	
	var noSpecialTypes = ['shortcut_text', 'text_no_specialchar'];
	
	/* Sonderzeichen im Text ersetzen */
	function clearText(str) {
		str = str.replace(new RegExp(unescape("%E4"),"g"),'ae');
		str = str.replace(new RegExp(unescape("%F6"),"g"),'oe');
		str = str.replace(new RegExp(unescape("%FC"),"g"),'ue');
		str = str.replace(new RegExp(unescape("%C4"),"g"),'Ae');
		str = str.replace(new RegExp(unescape("%D6"),"g"),'Oe');
		str = str.replace(new RegExp(unescape("%DC"),"g"),'Ue');
		str = str.replace(new RegExp(unescape("%DF"),"g"),'ss');
		restr = unescape("%5C%24%7C%2C%7C%B4%7C%B0%7C%40%7C%23%7C%C4%7C%A7%7C%5C%2F%7C%D6%7C%DC%7C%E4%7C%F6%7C%FC%7C%DF%7C %7C~%7C%60%7C%5C%25%7C%5C*%7C%5C%5E%7C%5C%26%7C%5C(%7C%5C)%7C%5C%2B%7C%5C%3D%7C%5C%5B%7C%5C%5D%7C%5C%7D%7C%5C%7B%7C%5C%3B%7C%5C%3A%7C%5C'%7C%5C%22%7C%5C%3C%7C%5C%3E%7C%5C%3F%7C%5C%7C%7C%5C%5C%7C%5C!%7C%5C%24%7C%5C.");
		// Entspricht "\$|,|Â´|Â°|@|#|Ã„|Â§|\/|Ã–|Ãœ|Ã¤|Ã¶|Ã¼|ÃŸ| |~|`|\%|\*|\^|\&|\(|\)|\+|\=|\[|\]|\}|\{|\;|\:|\'|\"|\<|\>|\?|\||\\|\!|\$|\."
		// Wichtig: nach urlencode das + gegen leerzeichern austauschen
		re = new RegExp(restr,"g");
		
		// re = /\$|,|`|@|#|Ã„|Â§|\/|Ã–|Ãœ|Ã¤|Ã¶|Ã¼|ÃŸ| |~|`|\%|\*|\^|\&|\(|\)|\+|\=|\[|\-|\_|\]|\[|\}|\{|\;|\:|\'|\"|\<|\>|\?|\||\\|\!|\$|\./g;
		// remove special characters like "$" and "," etc...
		str = str.replace(re, "-");
		// strip -- down to -
		str = str.replace(/\-\-+/g,'-');
		// ??? Auskommentiert wegen Bug #0004654 23.9.09 hg 
		//str = str.replace(/(^\-+)|(\-+$)/g,'');
		
		return str;
	}

	return {
		
		domloaded: function(event,options,element){
			var options = Object.extend({
				validate: '',
				validate_text: 'error'
			}, KB.parseArgument(arguments[1] || {}));
			if (element && element.readAttribute('type') == 'password') element.clear();
			
		},	 

		change: function(event,options,element){
			var options = Object.extend({
				notify: false,
				type: 'text'
			}, KB.parseArgument(options || {}));			
			if (options.notify) element.fire('form:changed');	
		},
		
		keyup: function(event, options, element){
			var form = (element) ? element.up('form') : null;
			var options = Object.extend({
				notify: false,
				type: 'text',
				target: false,
				fields: element.readAttribute('name'),
				seperator: '-'
			}, KB.parseArgument(options || {}));
			
			
			/* remove special characters */
			if (element && element.value && noSpecialTypes.indexOf(options.type) >= 0 ){
				element.value = clearText(element.value);
			}	
			
			/* copy value from FIELDS, seperated by SEPERATOR, to TARGET */
			if (form && options.target && options.fields) {
				/* identify target */
				var target = $($A(document.getElementsByName(options.target)).first());
				if (!target) return;
				/* prepare field value */
				if (!Object.isArray(options.fields)) options.fields = [options.fields];
				/* loop fields */
				var value = options.fields.inject('', function(result,element){
					/* loop elementsByName(field) */
					return result + this.seperator + $A(document.getElementsByName(element)).inject('', function(result,element){
						return result + this.seperator + (element.value || '');
					}, this );
									
				}, options );
				/* replace double seperators and start/finish seperator */
				if (options.seperator.length) {
					value = unescape(escape(value).replace(new RegExp('(^' + escape(options.seperator) + '+)|(' + escape(options.seperator) + '+$)', "g"), ''));
					value = unescape(escape(value).replace(new RegExp(escape(options.seperator) + escape(options.seperator) + '+', "g"), escape(options.seperator)));
				}
				
				target.value = clearText(value);
			}
		}
		
	}	
})(),KB.Events.elements.Base);


/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Marktext.js    **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Marktext = Object.extend((function(){
	
	return {

		
		change: function(event,options,element){
			var options = Object.extend({
				notify: false
			}, KB.parseArgument(options || {}));			
			if (options.notify) element.fire('form:changed');
		},
		
		focus: function(event, options, element){
			// Text markieren
			element.select();
			// Text in die Zwischenablage kopieren
			if (element.hasClassName('js_copytext')){
				/* Klapp nicht Browseruebergreifend */
				if (window.clipboardData && window.clipboardData.setData) {
					window.clipboardData.setData('Text', ta.value);
				} else if (window.netscape) {    
					// dit is belangrijk maar staat nergens duidelijk vermeld:
					try {
						netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');	
					} catch (e) {
						return;
					}
					// create interface to the clipboard
					var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
					if (!clip) return;
					 // create a transferable			
					var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
					if (!trans) return;	
					// specify the data we wish to handle. Plaintext in this case.				
					trans.addDataFlavor('text/unicode');
					// To get the data from the transferable we need two new objects					
					var str = new Object();
					var len = new Object();					
					var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);					
					var copytext=meintext;					
					str.data=copytext;					
					trans.setTransferData("text/unicode",str,copytext.length*2);					
					var clipid=Components.interfaces.nsIClipboard;					
					if (!clip) return false;					
					clip.setData(trans,null,clipid.kGlobalClipboard);					
				}
			}
		}
		
}})(),KB.Events.elements.Base);
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Pictext.js     **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Pictext = Object.extend((function(){
	
	function updateContent(content,droparea) {
		/* Bild */ 
		if (/^PIC\[.*\]PIC$/.test(content)) {
			/* Bild anzeigen */
			var image = content.replace(/^PIC\[(.*)\]PIC$/,'$1');
			var img = new Element('img',{
				src:'/files/'+image+'.png', 
				height:'150'
			});
			droparea.update(img);
		/* Link */
		} else if (/^INTERN\[.*\]LINK$/.test(content)) {
			var page = content.replace(/^INTERN\[.*\]NAME\[(.*)\]LINK$/,'$1');
			droparea.update('-> '+page);
		}
	}	
	return {
	
		domloaded: function(event, options, element){
			var options = Object.extend({				
			}, KB.parseArgument(arguments[1] || {}));
			
			/* Vorschau erstellen */
			var content = $(options.id + '_content').value;
			var droparea = $(options.id).select('.js_droppable').first();
			updateContent(content, droparea);
			
			/* Drop Handler */
			$$('.js_droppable').each(function(item){
				Droppables.add(item, {
					Accept: Array('js_draggable_cms', 'js_draggable_upload', 'js_draggable_photoalbum'),
					onDrop: function(draggable, droparea){
						var contentelement = draggable.select('.js_drag_content');
						if (contentelement) {
							/* Inhalt des gedragten Elements */
							var content = contentelement.first().innerHTML;
							/* Anzeige aktualisieren */
							updateContent(content, droparea);
							/* Hidden field aktualisieren */
							$(this.id + '_content').value = content;
						}
					//draggable.hide();
					//$$('.cms_tree_save').first().show();
					}.bind(this)
				});
			}.bind(options));
			
			/* Reset */
			$$('.js_pictext_reset').each(function(el){
				el.observe('click', function(ev){
					ev.element().up('.f_input').select('.js_droppable').first().update('Kein Bild angegeben');
					$(this.id + '_content').clear();
				}.bindAsEventListener(options));
			}.bind(options));
			
		},
		
		
		change: function(e,options,element){
			var options = Object.extend({
				notify: false
			}, KB.parseArgument(arguments[1] || {}));
			
			if (options.notify) 
				element.fire('form:changed');
		}
	}	
})(),KB.Events.elements.Base);
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Radio.js       **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Radio = Object.extend({
	
	mouseover: function(event,options,element){
		element.setStyle({cursor:'pointer'});
	},
	change: function(event,options,element){
		var options = Object.extend({
			notify: false
		}, KB.parseArgument(options || {}));			
		if (options.notify) element.fire('form:changed');
	}
		
},KB.Events.elements.Base);
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Select.js      **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Select = Object.extend({	
	
	change: function(event,options,element){
		var options = Object.extend({
			notify: false,
			type: 'select'
		}, KB.parseArgument(options || {}));			
		if (options.notify) element.fire('form:changed');
		
		if (options.type.include('change') && element.up('form')){
			element.up('form').submit();
		}
	}
	
},KB.Events.elements.Base);
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Spacer.js      **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Spacer = Object.extend({
	
	
},KB.Events.elements.Base);
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Text.js        **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Text = Object.extend({
	
		change: function(e,options,element){
			var options = Object.extend({
				notify_change: false
			}, KB.parseArgument(arguments[1] || {}));
			
			if (options.notify_change) element.fire('form:changed');
		}
},KB.Events.elements.Base);
/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Textarea.js    **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Textarea = Object.extend((function(){
	
	return {
			
		change: function(event,options,element){
			var options = Object.extend({
				notify: false
			}, KB.parseArgument(options || {}));			
			if (options.notify) element.fire('form:changed');
		}
		
		
}})(),KB.Events.elements.Base);


/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/TwoSelect.js   **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.TwoSelect = Object.extend((function(){
	
	var NONE = 1;
	var ALL = 2;
	
	/**
	 * Sortierfunktion fÃ¼r Two Selects
	 */
	function sortId(a,b) { 
		if ((a.value+"") < (b.value+"")) { return -1; }
		if ((a.value+"") > (b.value+"")) { return 1; }
		return 0;
	} 
	/**
	 * Sortierfunktion fÃ¼r Two Selects
	 */
	function sortName(a,b) { 
		if (String(a.text).toLowerCase() < String(b.text).toLowerCase()) { return -1; }
		if (String(a.text).toLowerCase() > String(b.text).toLowerCase()) { return 1; }
		return 0;
	}
	
	function move(name){
		var name = (Object.isString(name))? name : '';
		var insert = true;
		var locked = false;
		// Parse Options
		var options = Object.extend({
			clone: false,	 // Clones the element and moves the clone leaving the original in place.
			sort: false, 	 // Select Options werden sortiert
			max_length: 0, 		 // Maximale Anzahl der Elemente im Ziel Select
			extended: false, // Fï¿½r Proove Select (select beinhaltet die optionen ALLE bzw. KEINE
			multiple: false	 // mehrere options gleichen Types kopieren
		},KB.parseArgument(arguments[1] || {}));		
		options.max_length = (options.max_length)?options.max_length:-1;
		
		var elements = {}
		// Get Source && Dest Select
		if (name.search(/unselected/) >= 0){
			elements.selected = Element.select($(name.replace(/unselected/,'selected')),'select').first();
			elements.unselected = Element.select($(name),'select').first();	
			elements.dest = Element.select($(name.replace(/unselected/,'selected')),'select').first();
			elements.src  = Element.select($(name),'select').first();					
		} else {
			elements.selected = Element.select($(name),'select').first();	
			elements.unselected = Element.select($(name.replace(/selected/,'unselected')),'select').first();
			elements.src  = Element.select($(name),'select').first();
			elements.dest = Element.select($(name.replace(/selected/,'unselected')),'select').first();
			insert = false;	
		}	
		
		/* Alle rueber schieben bei proove_select */
		if (options.extended && (elements.dest == elements.selected)){
			var option = elements.unselected.select('option').findAll(function(o){ return o.selected && (o.value == ALL || o.value == NONE);}).collect(function(s){return s.value;}).inject(0,function(acc,n){return (Number(acc) >= Number(n))? Number(acc): Number(n);});
			locked = (!option && !Object.isUndefined(elements.selected.select('option').find(function(o){ return o.value == ALL || o.value == NONE; })));
			
			if (option != 0){
				elements.selected.select('option').each(function(o){
					var opt = o;
					if (Object.isUndefined(elements.unselected.select('option').find(function(s){ return s.value == opt.value }))) elements.unselected.insert(opt.clone());
					opt.remove();
				});
				elements.unselected.select('option').each(function(o){
					o.selected = (o.value == option);
				});
			}
		}
		
		// Wenn kein Elemente ungï¿½ltig
		if (!elements.src || !elements.dest) return;
		
		elements.src.select('option').each(function(o){
			var opt = o;
			oInsert = insert || Object.isUndefined(elements.unselected.select('option').find(function(s){ return s.value == opt.value }));
			/* Maximale anzahl ueberschritten ? */
			oLocked = locked || (elements.dest.select('option').length - options.max_length == 0);
			/* Element schon vorhanden oder mehrfach erlaubt */
			oLocked |= (!Object.isUndefined(elements.selected.select('option').find(function(s){ return s.value == opt.value })) && !options.multiple);
			oLocked &= (elements.dest == elements.selected);			
			if (!opt.selected) return;
			if ((!options.clone || (options.clone &&  oInsert)) && !oLocked) elements.dest.insert(opt.clone());
			if ((!options.clone || (options.clone && !insert)) && !oLocked) opt.remove();
		});
		
		/* Nicht sortieren, wenn manuell eingeschaltet */
		if (!options.sort) {
			//var temp = elements.selected.select('option').sort(selectSort);
			var temp = (options.extended)?elements.selected.select('option').sort(sortId):elements.selected.select('option').sort(sortName);
			elements.selected.select('option').each(function(o){ o.remove(sortName); });
			temp.each(function(o){ elements.selected.insert(o);});
		}	
		
		/* Sortierung */
		//var temp = elements.unselected.select('option').sort(selectSort);
		var temp = (options.extended)?elements.unselected.select('option').sort(sortId):elements.unselected.select('option').sort(sortName);
		elements.unselected.select('option').each(function(o){ o.remove(); });
		temp.each(function(o){ elements.unselected.insert(o);});				
	}
	
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	function moveUp(obj) {
		obj = $(obj);
		if (!obj || !obj.previous()) return;
		obj.previous().insert({before:obj});
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	function moveDown(obj) {
		obj = $(obj);
		if (!obj || !obj.next()) return;
		obj.next().insert({after:obj});
	}
	
		
	return {
	
		domloaded: function(event,options,element){	
			var options = Object.extend({
			}, KB.parseArgument(arguments[1] || {}));
			if ($(options.name_unselected)) {
				var unselected = $(options.name_unselected).select('select').first();
				if (unselected){
					var temp = (options.extended)?unselected.select('option').sort(sortId):unselected.select('option').sort(sortName);
					unselected.select('option').each(function(o){ o.remove(); });
					temp.each(function(o){ unselected.insert(o);});	
				}
			}
		},
		
		click: function(event,options,element){
			/* Sucht einen umschliessenden Link */
		//	var element = e.findElement('a');
			/* Soll eigentlich das div um den link finden. ist aber nicht zwangslï¿½ufig vorhanden (dd dl styling) */
		//	var elementUpDown = e.findElement('div');
			var name = (element)?element.readAttribute('rel'):null;
			var options = Object.extend({
			}, KB.parseArgument(options || {}));
			
			/* Klick in Liste macht nichts */
			if (event.element().tagName.toUpperCase()=='OPTION') return;
			
			/* Hinzufuegen/Entfernen Link geklickt */
			if (element.hasClassName('js_select') || element.hasClassName('js_deselect')) {
				move(name,options);
					
			/* Hoch Link geklickt  neu */
			} else if (element.hasClassName('js_moveup')) {
				var selected = $(options.id).select('.js_selected option').findAll(function(o){ return o.selected });
				selected.each(function(o){
					moveUp(o);
				});
			/* Runter Link geklickt  neu */
			} else if (element.hasClassName('js_movedown')) {
				var selected = $(options.id).select('.js_selected option').findAll(function(o){ return o.selected });
				selected.each(function(o){
					moveDown(o);
				});
			} 
		},
		
		dblclick: function(event,options,element){
			var options = Object.extend({
			}, KB.parseArgument(options || {}));	
			
			var option = event.element();
			// Name kann am besten ueber umschliessendes select ermittelt werden
			if (element.hasClassName('js_unselected')) {
				name = options.id+'_unselected';
			} else if (element.hasClassName('js_selected')) {
				name = options.id+'_selected';
			}
			
			/* Doppelklick auf einen Eintrag */
			if (event.element().tagName.toUpperCase()=='OPTION') {
				move(name,options);
			}
		},
		
		formsubmit: function(event,options,element){
			var options = Object.extend({				
			}, KB.parseArgument(options || {}));
			// wenn container nicht gesetzt ist rausspringen
			if (!$(options.id)) return;
			$(options.id).select('option').each(function(o){o.selected = true});
		},
		
		change: function(event,options,element){
			var options = Object.extend({
				notify: false
			}, KB.parseArgument(options || {}));
			
			if (options.notify) element.fire('form:change');
		}
		
}})(),KB.Events.elements.Base);


/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/VariantsSelect.js **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.VariantsSelect = Object.extend({

	
	change: function(e,options,element){
	
		var options = Object.extend({
			image:'',
			path:'',
			imgType:'jpg',
			notify_change: false,
			template:''
		}, KB.parseArgument(arguments[1]));
		var image = $(options.image);	
		var src = options.path + options.template + '__' + $F(e.target)+'.'+options.imgType;
		if (image && image.src) image.src = src;
		
		if (options.notify_change) element.fire('form:changed');
	}
	
},KB.Events.elements.Base);

/**********************************************************************************************************/
/** COMBINE INCLUDE LEVEL  99                                                                            **/
/** /var/www/dosdauter.de/www/application/RedSparkCore/0.9.5/javascript/kuborgh_forms/1.0/Wysiwyg.js     **/
/**                                                                                                      **/
/**********************************************************************************************************/

KB.Events.elements.Wysiwyg = Object.extend({
	
	editors: $H({}),

	domloaded: function(event,options,element){
		var options = Object.extend({
		}, KB.parseArgument(options || {}));
		
		var name = (Object.isString(options.name))? options.name : $(options.name).id;
		var id = (Object.isString(options.id))? options.id : $(options.id).id;
	
		this.editors.set(id,new InnovaEditor(id));

		this.editors.get(id).width = options.width,
		this.editors.get(id).height = options.height;
		this.editors.get(id).useTagSelector = options.useTagSelector;
		this.editors.get(id).TagSelectorPosition = options.TagSelectorPosition;
		this.editors.get(id).preserveSpace = options.preserveSpace;
		this.editors.get(id).mode = options.mode;
		this.editors.get(id).cmdAssetManager = 'modalDialogShow(\'/editor/assetmanager/assetmanager.php\',640,465)';
		this.editors.get(id).css = (options.css) ? options.css : false;
	
		this.editors.get(id).features = (options.features && options.features.size()) ? options.features : false;
		this.editors.get(id).tabs = (options.tabs && options.tabs.size()) ? options.tabs : false;
		this.editors.get(id).groups = (options.groups && options.groups.size()) ? options.groups : false;
		this.editors.get(id).arrStyle = (options.arrStyle && options.arrStyle.size()) ? options.arrStyle : false;
		this.editors.get(id).customColors = (options.customColors && options.customColors.size()) ? options.customColors : false;

		window[id] = this.editors.get(id);
		

		window[id].REPLACE(name, id + '_editor');
	},
	
	formsubmit: function(event,options,element){
		var options = Object.extend({
		}, KB.parseArgument(options || {}));
		
		$$('[name="'+options.id+'"]').each(function(e){
			e.value = window[this.id].getXHTMLBody().replace(/[\n\r]+/m,'');
		}.bind(options));	
			
		
	},
	change: function(event,options,element){
		var options = Object.extend({
			notify: false
		}, KB.parseArgument(options || {}));			
		if (options.notify) element.fire('form:changed');
	}
	
},KB.Events.elements.Base);
