/*
 * Copyright (C) 2006 Holger Hees
 *
 * Licensed under the terms of the GNU Lesser General Public License:
 *      http://www.opensource.org/licenses/lgpl-license.php
 *
 * File Author:
 *      Holger Hees (hhees@systemconcept.de)
 *
 */


// Command Object
var FCKDynamicCSS_command = function(name) {
    this.Name = name ; 
}
FCKDynamicCSS_command.prototype.Execute = function(itemText, itemLabel) {
    if(dynamicCSSSelection){
        dynamicCSSCombo.DeselectAll();
        dynamicCSSCombo.SelectItem(itemText);
        dynamicCSSCombo.SetLabel( itemLabel.innerHTML );
        dynamicCSSSelection.className=itemText;
    }
}
FCKDynamicCSS_command.prototype.GetState = function() {
    return;
}
FCKCommands.RegisterCommand( 'dynamicCSScommand' , new FCKDynamicCSS_command('dynamicCSS') ) ; 



// Combobox Object
var FCKToolbarDynamicCSS=function(tooltip,style){
    this.Command=FCKCommands.GetCommand('dynamicCSScommand');
    this.Label=this.GetLabel();
    this.Tooltip=tooltip?tooltip:this.Label;
    this.Style=style;
    this.FieldWidth=100;
    this.PanelWidth=150;
};
FCKToolbarDynamicCSS.prototype=new FCKToolbarSpecialCombo;
FCKToolbarDynamicCSS.prototype.GetLabel=function(){
    return "CSS";
};

var dynamicCSSStyleNames=new Array();
var dynamicCSSStyleCheck=new Array();

var dynamicCSSRules=false;
var dynamicCssRulesLength=0;
var dynamicCSSCombo=false;
var dynamicCSSSelection=false;
FCKToolbarDynamicCSS.prototype.CreateItems=function(A){
    dynamicCSSCombo=this._Combo;
}







// Common Functions
FCKToolbarDynamicCSS._StatusListener = function(editorInstance){
    if(FCK_STATUS_COMPLETE && dynamicCssRulesLength==0 && dynamicCSSCombo){
        FCKToolbarDynamicCSS.initCSS(editorInstance.Name,0,5);
        FCKToolbarDynamicCSS._SelectionListener(editorInstance);
    }
}

FCKToolbarDynamicCSS._SelectionListener = function(editorInstance){
    var element = FCKSelection.GetSelectedElement();
    if(!element) element = FCKSelection.GetParentElement();

    if(element && dynamicCSSCombo){
        dynamicCSSSelection=element;

        dynamicCSSCombo.Items=new Array();
        dynamicCSSCombo._ItemsHolderEl.innerHTML='';

        dynamicCSSCombo.SelectItem('');
        if(dynamicCSSStyleCheck[element.tagName] && dynamicCSSStyleCheck[element.tagName]['none']){
            dynamicCSSCombo.AddItem('', '&lt;Normal&gt;');
            dynamicCSSCombo.SetLabel( '&lt;Normal&gt;' );
        }
        else{
            dynamicCSSCombo.AddItem('', 'Normal');
            dynamicCSSCombo.SetLabel( 'Normal' );
        }

        // einzelnen Tagarten durchlaufen
        for(var tag in dynamicCSSStyleNames){
            if((tag=='all') || tag==element.tagName){
                for(var cssClass in dynamicCSSStyleNames[tag]){
                    if(typeof dynamicCSSStyleNames[tag][cssClass]=='string'){
                        if(dynamicCSSStyleNames[tag][cssClass]!='none'){
                            cssName=dynamicCSSStyleNames[tag][cssClass];
                            if(tag!='all') cssName='&lt;'+cssName+'&gt;';
                            dynamicCSSCombo.AddItem(dynamicCSSStyleNames[tag][cssClass], cssName);
                            if(element.className==dynamicCSSStyleNames[tag][cssClass]){
                                dynamicCSSCombo.SelectItem(dynamicCSSStyleNames[tag][cssClass]);
                                dynamicCSSCombo.SetLabel( cssName );
                            }
                        }
                    }
                }
            }
        }
    }
    else{
        dynamicCSSSelection=false;
    }
}
FCK.Events.AttachEvent('OnSelectionChange',FCKToolbarDynamicCSS._SelectionListener);
FCK.Events.AttachEvent('OnStatusChange',FCKToolbarDynamicCSS._StatusListener);

//Register the combo with the FCKEditor
FCKToolbarItems.RegisterItem( 'dynamicCSS'	, new FCKToolbarDynamicCSS( 'CSS', FCK_TOOLBARITEM_ICONTEXT ) ) ; //or FCK_TOOLBARITEM_ONLYTEXT








// init
FCKToolbarDynamicCSS.initCSS=function(editorInstanceName,parseCount,parseMaxCount){
    FCKToolbarDynamicCSS.parseStyleSheet(editorInstanceName);
    if(dynamicCssRulesLength<dynamicCSSRules.length){
        //alert(dynamicCssRulesLength+' '+dynamicCSSRules.length);
        dynamicCssRulesLength=dynamicCSSRules.length;
        FCKToolbarDynamicCSS.applyCSSElements();
        for(var tag in dynamicCSSStyleNames){
            if(dynamicCSSStyleNames[tag].sort){
                dynamicCSSStyleNames[tag].sort();
            }
        }
    }
    if(parseCount<parseMaxCount){
        parseCount+=1;
        window.setTimeout("FCKToolbarDynamicCSS.initCSS('"+editorInstanceName+"',"+parseCount+","+parseMaxCount+")",parseCount*1000);
    }
}

// parsing
FCKToolbarDynamicCSS.parseStyleSheet=function(editorInstanceName){

    iframe = FCKeditorAPI.GetInstance(editorInstanceName).EditorDocument;

    dynamicCSSRules=new Array();

    for(i=0;i<iframe.styleSheets.length;i++){
        if(FCKBrowserInfo.IsIE){
            try{
                if(iframe.styleSheets[i].rules){
                    FCKToolbarDynamicCSS.applyCSSRule(iframe.styleSheets[i].rules);
                }
                // @import StyleSheets (IE)
                if(iframe.styleSheets[i].imports){
                    for(j=0;j<iframe.styleSheets[i].imports.length;j++){
                        FCKToolbarDynamicCSS.applyCSSRule(iframe.styleSheets[i].imports[j].rules);
                    }
                }
            }
            catch(e){
                //alert(e);
            }
        }
        else {
            try{
                FCKToolbarDynamicCSS.applyCSSRule(iframe.styleSheets[i].cssRules);
            }
            catch(e){
                //alert(e);
            }
        }
    }
}

FCKToolbarDynamicCSS.applyCSSRule=function(cssRules){
    for(rule in cssRules){
        // StyleRule
        if(cssRules[rule].selectorText){
            dynamicCSSRules.push(cssRules[rule]);
        }
        // ImportRule (Mozilla)
        else if(cssRules[rule].styleSheet){
            FCKToolbarDynamicCSS.applyCSSRule(cssRules[rule].styleSheet.cssRules);
        }
    }
}

FCKToolbarDynamicCSS.applyCSSElements=function(){
    for(i=0;i<dynamicCSSRules.length;i++){
        // split equal Styles (Mozilla-specific) e.q. head, body {border:0px}
        // for ie not relevant. returns allways one element
        cssElements = dynamicCSSRules[i].selectorText.split(",");

        for(k=0;k<cssElements.length;k++){
            cssElement=cssElements[k];
            // keine Hover Pseudoformate auswerten
            if(cssElement.search(/:+/)==-1 && cssElement.search(/\[+/)==-1 && cssElement.search(/FCK__+/)==-1){
                spacePos=cssElement.indexOf(' ');
                if(spacePos==0){
                    cssElement=cssElement.trim();
                    spacePos=cssElement.indexOf(' ');
                }
                if(spacePos>-1){
                    // nur den Tagnamen mit eventueller Klasse holen
                    cssElement=cssElement.substr(0,cssElement.indexOf(' '));
                }
                cssElement = cssElement.split(".");

                tagName=cssElement[0].toUpperCase().trim();
                className=cssElement[1];

                if(!tagName) tagName='all';
                if(!className) className='none';

                if(!dynamicCSSStyleCheck[tagName]){
                    dynamicCSSStyleCheck[tagName]=new Array();
                    dynamicCSSStyleNames[tagName]=new Array();
                }
                if(!dynamicCSSStyleCheck[tagName][className]){
                    dynamicCSSStyleCheck[tagName][className]=true;
                    dynamicCSSStyleNames[tagName].push(className);
                }
            }
        }
    }
}

