blob: be1a0f1ce644d3540b3ced8f4522ee49124b5b1c [file] [log] [blame]
// Dynamic CSS (className) plugin for HTMLArea
// Sponsored by http://www.systemconcept.de
// Implementation by Holger Hees
//
// (c) systemconcept.de 2004
// Distributed under the same terms as HTMLArea itself.
// This notice MUST stay intact for use (see license.txt).
function DynamicCSS(editor, args) {
this.editor = editor;
var cfg = editor.config;
var self = this;
/*var cssArray=null;
var cssLength=0;*/
var lastTag=null;
var lastClass=null;
var css_class = {
id : "DynamicCSS-class",
tooltip : this._lc("Choose stylesheet"),
options : {"":""},
action : function(editor) { self.onSelect(editor, this); },
refresh : function(editor) { self.updateValue(editor, this); }
};
cfg.registerDropdown(css_class);
cfg.addToolbarElement(["T[CSS]", "DynamicCSS-class", "separator"] , "formatblock", -1);
}
DynamicCSS.parseStyleSheet=function(editor){
iframe = editor._iframe.contentWindow.document;
cssArray=DynamicCSS.cssArray;
if(!cssArray) cssArray=new Array();
for(i=0;i<iframe.styleSheets.length;i++)
{
if(iframe.styleSheets[i].title == "XinhaInternalCSS") continue;
// Mozilla
if(Xinha.is_gecko){
try{
cssArray=DynamicCSS.applyCSSRule(iframe.styleSheets[i].cssRules,cssArray);
}
catch(e){
//alert(e);
}
}
// IE
else {
try{
if(iframe.styleSheets[i].rules){
cssArray=DynamicCSS.applyCSSRule(iframe.styleSheets[i].rules,cssArray);
}
// @import StyleSheets (IE)
if(iframe.styleSheets[i].imports){
for(j=0;j<iframe.styleSheets[i].imports.length;j++){
cssArray=DynamicCSS.applyCSSRule(iframe.styleSheets[i].imports[j].rules,cssArray);
}
}
}
catch(e){
//alert(e);
}
}
}
DynamicCSS.cssArray=cssArray;
};
DynamicCSS.applyCSSRule=function(cssRules,cssArray){
for(rule in cssRules){
if(typeof cssRules[rule] == 'function') continue;
// StyleRule
if(cssRules[rule].selectorText){
if(cssRules[rule].selectorText.search(/:+/)==-1){
// split equal Styles (Mozilla-specific) e.q. head, body {border:0px}
// for ie not relevant. returns allways one element
cssElements = cssRules[rule].selectorText.split(",");
for(k=0;k<cssElements.length;k++){
cssElement = cssElements[k].split(".");
tagName=cssElement[0].toLowerCase().trim();
className=cssElement[1];
if(!tagName) tagName='all';
if(!cssArray[tagName]) cssArray[tagName]=new Array();
if(className){
if(tagName=='all') cssName=className;
else cssName='<'+className+'>';
}
else{
className='none';
if(tagName=='all') cssName=Xinha._lc("Default", 'DynamicCSS');
else cssName='<'+Xinha._lc("Default", 'DynamicCSS')+'>';
}
cssArray[tagName][className]=cssName;
DynamicCSS.cssLength++;
}
}
}
// ImportRule (Mozilla)
else if(cssRules[rule].styleSheet){
cssArray=DynamicCSS.applyCSSRule(cssRules[rule].styleSheet.cssRules,cssArray);
}
}
return cssArray;
};
DynamicCSS._pluginInfo = {
name : "DynamicCSS",
version : "1.5.2",
developer : "Holger Hees",
developer_url : "http://www.systemconcept.de/",
c_owner : "Holger Hees",
sponsor : "System Concept GmbH",
sponsor_url : "http://www.systemconcept.de/",
license : "htmlArea"
};
DynamicCSS.prototype._lc = function(string) {
return Xinha._lc(string, 'DynamicCSS');
};
DynamicCSS.prototype.onSelect = function(editor, obj) {
var tbobj = editor._toolbarObjects[obj.id];
var index = tbobj.element.selectedIndex;
var className = tbobj.element.value;
var parent = editor.getParentElement();
if(className!='none'){
parent.className=className;
DynamicCSS.lastClass=className;
}
else{
if(Xinha.is_gecko) parent.removeAttribute('class');
else parent.removeAttribute('className');
}
editor.updateToolbar();
};
/*DynamicCSS.prototype.onMode = function(mode) {
if(mode=='wysiwyg'){
// reparse possible changed css files
DynamicCSS.cssArray=null;
this.updateValue(this.editor,this.editor.config.customSelects["DynamicCSS-class"]);
}
}*/
DynamicCSS.prototype.reparseTimer = function(editor, obj, instance) {
// new attempt of rescan stylesheets in 1,2,4 and 8 second (e.g. for external css-files with longer initialisation)
if(DynamicCSS.parseCount<9){
setTimeout(function () {
DynamicCSS.cssLength=0;
DynamicCSS.parseStyleSheet(editor);
if(DynamicCSS.cssOldLength!=DynamicCSS.cssLength){
DynamicCSS.cssOldLength=DynamicCSS.cssLength;
DynamicCSS.lastClass=null;
instance.updateValue(editor, obj);
}
instance.reparseTimer(editor, obj, instance);
},DynamicCSS.parseCount*1000);
DynamicCSS.parseCount=DynamicCSS.parseCount*2;
}
};
DynamicCSS.prototype.updateValue = function(editor, obj) {
cssArray=DynamicCSS.cssArray;
// initial style init
if(!cssArray){
DynamicCSS.cssLength=0;
DynamicCSS.parseStyleSheet(editor);
cssArray=DynamicCSS.cssArray;
DynamicCSS.cssOldLength=DynamicCSS.cssLength;
DynamicCSS.parseCount=1;
this.reparseTimer(editor,obj,this);
}
var parent = editor.getParentElement();
var tagName = parent.tagName.toLowerCase();
var className = parent.className;
if(this.lastTag!=tagName || this.lastClass!=className){
this.lastTag=tagName;
this.lastClass=className;
var select = editor._toolbarObjects[obj.id].element;
while(select.length>0){
select.options[select.length-1] = null;
}
select.options[0]=new Option(this._lc("Default"),'none');
if(cssArray){
// style class only allowed if parent tag is not body or editor is in fullpage mode
if(tagName!='body' || editor.config.fullPage){
if(cssArray[tagName]){
for(cssClass in cssArray[tagName]){
if(typeof cssArray[tagName][cssClass] != 'string') continue;
if(cssClass=='none') select.options[0]=new Option(cssArray[tagName][cssClass],cssClass);
else select.options[select.length]=new Option(cssArray[tagName][cssClass],cssClass);
}
}
if(cssArray['all']){
for(cssClass in cssArray['all']){
if(typeof cssArray['all'][cssClass] != 'string') continue;
select.options[select.length]=new Option(cssArray['all'][cssClass],cssClass);
}
}
}
else if(cssArray[tagName] && cssArray[tagName]['none']) select.options[0]=new Option(cssArray[tagName]['none'],'none');
}
select.selectedIndex = 0;
if (typeof className != "undefined" && /\S/.test(className)) {
var options = select.options;
for (var i = options.length; --i >= 0;) {
var option = options[i];
if (className == option.value) {
select.selectedIndex = i;
break;
}
}
if(select.selectedIndex == 0){
select.options[select.length]=new Option(this._lc("Undefined"),className);
select.selectedIndex=select.length-1;
}
}
if(select.length>1) select.disabled=false;
else select.disabled=true;
}
};