/*
 *
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */
var ECLIPSE_FRAME_NAME = "ContentViewFrame";
var eclipseBuild = false;
var liveDocsBaseUrl = "http://livedocs.adobe.com/flex/3";
var liveDocsBookName = "langref";
function findObject(objId) {
    if (document.getElementById)
        return document.getElementById(objId);
    if (document.all)
        return document.all[objId];
}
function isEclipse() {
    return eclipseBuild;
//  return (window.name == ECLIPSE_FRAME_NAME) || (parent.name == ECLIPSE_FRAME_NAME) || (parent.parent.name == ECLIPSE_FRAME_NAME);
}
function configPage() {
    setRowColorsInitial(true, "Property");
    setRowColorsInitial(true, "Method");
    setRowColorsInitial(true, "ProtectedMethod");   
    setRowColorsInitial(true, "Event");
    setRowColorsInitial(true, "Style");
    
    setRowColorsInitial(true, "SkinPart");
    setRowColorsInitial(true, "SkinState");
    
    setRowColorsInitial(true, "Constant");
    if (isEclipse()) {
        if (window.name != "classFrame")
        {
            var localRef = window.location.href.indexOf('?') != -1 ? window.location.href.substring(0, window.location.href.indexOf('?')) : window.location.href;
            localRef = localRef.substring(localRef.indexOf("langref/") + 8);
            if (window.location.search != "")
                localRef += ("#" + window.location.search.substring(1));
            window.location.replace(baseRef + "index.html?" + localRef);
            return;
        }
        else
        {
            setStyle(".eclipseBody", "display", "block");
//          var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
//          if (isIE == false && window.location.hash != "")
            if (window.location.hash != "")
                window.location.hash=window.location.hash.substring(1);
        }
    }
    else if (window == top) { // no frames
        findObject("titleTable").style.display = "";
    }
    else { // frames
        findObject("titleTable").style.display = "none";
    }
    showTitle(asdocTitle);
}
function loadFrames(classFrameURL, classListFrameURL) {
    var classListFrame = findObject("classListFrame");
    if(classListFrame != null && classListFrameContent!='')
        classListFrame.document.location.href=classListFrameContent;
    if (isEclipse()) {
        var contentViewFrame = findObject(ECLIPSE_FRAME_NAME);
        if (contentViewFrame != null && classFrameURL != '')
            contentViewFrame.document.location.href=classFrameURL;
    }
    else {
        var classFrame = findObject("classFrame");
        if(classFrame != null && classFrameContent!='')
            classFrame.document.location.href=classFrameContent;
    }
}
function showTitle(title) {
    if (!isEclipse())
        top.document.title = title;
}
function loadClassListFrame(classListFrameURL) {
    if (parent.frames["classListFrame"] != null) {
        parent.frames["classListFrame"].location = classListFrameURL;
    }
    else if (parent.frames["packageFrame"] != null) {
        if (parent.frames["packageFrame"].frames["classListFrame"] != null) {
            parent.frames["packageFrame"].frames["classListFrame"].location = classListFrameURL;
        }
    }
}
function gotoLiveDocs(primaryURL, secondaryURL, locale) {
        if (locale == "en-us") {
             locale = "";
        } 
        else {
              locale = "_" + locale.substring(3);
        }
    var url = liveDocsBaseUrl + locale + "/" + liveDocsBookName + "/index.html?" + primaryURL;
    if (secondaryURL != null && secondaryURL != "")
        url += ("&" + secondaryURL);
    window.open(url, "mm_livedocs", "menubar=1,toolbar=1,status=1,scrollbars=1,resizable=yes");
}
function findTitleTableObject(id)
{
    if (isEclipse())
        return parent.titlebar.document.getElementById(id);
    else if (top.titlebar)
        return top.titlebar.document.getElementById(id);
    else
        return document.getElementById(id);
}
function titleBar_setSubTitle(title)
{
    if (isEclipse() || top.titlebar)
        findTitleTableObject("subTitle").childNodes.item(0).data = title;
}
function titleBar_setSubNav(showConstants,showProperties,showStyles,showSkinPart,showSkinState,showEffects,showEvents,showConstructor,showMethods,showExamples,
                showPackageConstants,showPackageProperties,showPackageFunctions,showInterfaces,showClasses,showPackageUse)
{
    if (isEclipse() || top.titlebar)
    {
        findTitleTableObject("propertiesLink").style.display = showProperties ? "inline" : "none";
        findTitleTableObject("propertiesBar").style.display = (showProperties && (showPackageProperties || showConstructor || showMethods || showPackageFunctions || showEvents || showStyles || showSkinPart || showSkinState || showEffects || showConstants || showPackageConstants || showInterfaces || showClasses || showPackageUse || showExamples)) ? "inline" : "none";
        findTitleTableObject("packagePropertiesLink").style.display = showPackageProperties ? "inline" : "none";
        findTitleTableObject("packagePropertiesBar").style.display = (showPackageProperties && (showConstructor || showMethods || showPackageFunctions || showEvents || showStyles || showSkinPart || showSkinState || showConstants || showEffects || showPackageConstants || showInterfaces || showClasses || showPackageUse || showExamples)) ? "inline" : "none";
        findTitleTableObject("constructorLink").style.display = showConstructor ? "inline" : "none";
        findTitleTableObject("constructorBar").style.display = (showConstructor && (showMethods || showPackageFunctions || showEvents || showStyles || showSkinPart || showSkinState || showEffects || showConstants || showPackageConstants || showInterfaces || showClasses || showPackageUse || showExamples)) ? "inline" : "none";
        findTitleTableObject("methodsLink").style.display = showMethods ? "inline" : "none";
        findTitleTableObject("methodsBar").style.display = (showMethods && (showPackageFunctions || showEvents || showStyles || showSkinPart || showSkinState || showEffects || showConstants || showPackageConstants || showInterfaces || showClasses || showPackageUse || showExamples)) ? "inline" : "none";
        findTitleTableObject("packageFunctionsLink").style.display = showPackageFunctions ? "inline" : "none";
        findTitleTableObject("packageFunctionsBar").style.display = (showPackageFunctions && (showEvents || showStyles || showSkinPart || showSkinState || showEffects || showConstants || showPackageConstants || showInterfaces || showClasses || showPackageUse || showExamples)) ? "inline" : "none";
        findTitleTableObject("eventsLink").style.display = showEvents ? "inline" : "none";
        findTitleTableObject("eventsBar").style.display = (showEvents && (showStyles || showSkinPart || showSkinState || showEffects || showConstants || showPackageConstants || showInterfaces || showClasses || showPackageUse || showExamples)) ? "inline" : "none";
        findTitleTableObject("stylesLink").style.display = showStyles ? "inline" : "none";
        findTitleTableObject("stylesBar").style.display = (showStyles && (showSkinPart || showSkinState || showEffects || showConstants || showPackageConstants || showInterfaces || showClasses || showPackageUse || showExamples)) ? "inline" : "none";
        
        findTitleTableObject("SkinPartLink").style.display = showSkinPart ? "inline" : "none";
        findTitleTableObject("SkinPartBar").style.display = (showSkinPart && (showSkinState || showEffects || showConstants || showPackageConstants || showInterfaces || showClasses || showPackageUse || showExamples)) ? "inline" : "none";
        
        findTitleTableObject("SkinStateLink").style.display = showSkinState ? "inline" : "none";
	findTitleTableObject("SkinStateBar").style.display = (showSkinState && (showEffects || showConstants || showPackageConstants || showInterfaces || showClasses || showPackageUse || showExamples)) ? "inline" : "none";
                
        findTitleTableObject("effectsLink").style.display = showEffects ? "inline" : "none";
        findTitleTableObject("effectsBar").style.display = (showEffects && (showConstants || showPackageConstants || showInterfaces || showClasses || showPackageUse || showExamples)) ? "inline" : "none";
        findTitleTableObject("constantsLink").style.display = showConstants ? "inline" : "none";
        findTitleTableObject("constantsBar").style.display = (showConstants && (showPackageConstants || showInterfaces || showClasses || showPackageUse || showExamples)) ? "inline" : "none";
        findTitleTableObject("packageConstantsLink").style.display = showPackageConstants ? "inline" : "none";
        findTitleTableObject("packageConstantsBar").style.display = (showPackageConstants && (showInterfaces || showClasses || showPackageUse || showExamples)) ? "inline" : "none";
        findTitleTableObject("interfacesLink").style.display = showInterfaces ? "inline" : "none";
        findTitleTableObject("interfacesBar").style.display = (showInterfaces && (showClasses || showPackageUse || showExamples)) ? "inline" : "none";
        findTitleTableObject("classesLink").style.display = showClasses ? "inline" : "none";
        findTitleTableObject("classesBar").style.display = (showClasses && (showPackageUse || showExamples)) ? "inline" : "none";
        findTitleTableObject("packageUseLink").style.display = showPackageUse ? "inline" : "none";
        findTitleTableObject("packageUseBar").style.display = (showPackageUse && showExamples) ? "inline" : "none";
        findTitleTableObject("examplesLink").style.display = showExamples ? "inline" : "none";
    }
}
function titleBar_gotoClassFrameAnchor(anchor)
{
    if (isEclipse())
        parent.classFrame.location = parent.classFrame.location.toString().split('#')[0] + "#" + anchor;
    else
        top.classFrame.location = top.classFrame.location.toString().split('#')[0] + "#" + anchor;
}
function setMXMLOnly() 
{
    if (getCookie("showMXML") == "false")
    {
        toggleMXMLOnly();
    }
}
function toggleMXMLOnly() 
{
    var mxmlDiv = findObject("mxmlSyntax");
    var mxmlShowLink = findObject("showMxmlLink");
    var mxmlHideLink = findObject("hideMxmlLink");
    if (mxmlDiv && mxmlShowLink && mxmlHideLink)
    {
        if (mxmlDiv.style.display == "none")
        {
            mxmlDiv.style.display = "block";
            mxmlShowLink.style.display = "none";
            mxmlHideLink.style.display = "inline";
            setCookie("showMXML","true", new Date(3000,1,1,1,1), "/", document.location.domain);
        }
        else
        {
            mxmlDiv.style.display = "none";
            mxmlShowLink.style.display = "inline";
            mxmlHideLink.style.display = "none";
            setCookie("showMXML","false", new Date(3000,1,1,1,1), "/", document.location.domain);
        }
    }
}
function showHideInherited()
{   
    setInheritedVisible(getCookie("showInheritedConstant") == "true", "Constant");
    setInheritedVisible(getCookie("showInheritedProtectedConstant") == "true", "ProtectedConstant");
    setInheritedVisible(getCookie("showInheritedProperty") == "true", "Property");
    setInheritedVisible(getCookie("showInheritedProtectedProperty") == "true", "ProtectedProperty");
    setInheritedVisible(getCookie("showInheritedMethod") == "true", "Method");
    setInheritedVisible(getCookie("showInheritedProtectedMethod") == "true", "ProtectedMethod");
    setInheritedVisible(getCookie("showInheritedEvent") == "true", "Event");
    setInheritedVisible(getCookie("showInheritedStyle") == "true", "Style");
    
    setInheritedVisible(getCookie("showInheritedSkinPart") == "true", "SkinPart");
    setInheritedVisible(getCookie("showInheritedSkinState") == "true", "SkinState");
    
    setInheritedVisible(getCookie("showInheritedEffect") == "true", "Effect");
}
function setInheritedVisible(show, selectorText)
{
    if (document.styleSheets[0].cssRules != undefined)
    {
        var rules = document.styleSheets[0].cssRules;
        for (var i = 0; i < rules.length; i++)
        {
            if (rules[i].selectorText == ".hideInherited" + selectorText)
                rules[i].style.display = show ? "" : "none";
                
            if (rules[i].selectorText == ".showInherited" + selectorText)
                rules[i].style.display = show ? "none" : "";
        }
    }
    else
    {
        document.styleSheets[0].addRule(".hideInherited" + selectorText, show ? "display:inline" : "display:none");
        document.styleSheets[0].addRule(".showInherited" + selectorText, show ? "display:none" : "display:inline");
    }
    setCookie("showInherited" + selectorText, show ? "true" : "false", new Date(3000,1,1,1,1), "/", document.location.domain);
    setRowColors(show, selectorText);
}
function setRowColors(show, selectorText)
{
    var rowColor = "#F2F2F2";
    var table = findObject("summaryTable" + selectorText);
    if (table != null)
    {
        var rowNum = 0;
        for (var i = 1; i < table.rows.length; i++)
        {
            if (table.rows[i].className.indexOf("hideInherited") == -1 || show)
            {
                rowNum++;
                table.rows[i].bgColor = (rowNum % 2 == 0) ? rowColor : "#FFFFFF";
            }           
        }
    }
}
function setRowColorsInitial(show, selectorText)
{
    var rowColor = "#F2F2F2";
    var table = findObject("summaryTable" + selectorText);
    if (table != null)
    {
        var rowNum = 0;
        for (var i = 1; i < table.rows.length; i++)
        {
            if (table.rows[i].className.indexOf("hideInherited") == -1 && show)
            {
                rowNum++;
                table.rows[i].bgColor = (rowNum % 2 == 0) ? rowColor : "#FFFFFF";
            }           
        }
    }
}
function setStyle(selectorText, styleName, newValue)
{
    if (document.styleSheets[0].cssRules != undefined)
    {
        var rules = document.styleSheets[0].cssRules;
        for (var i = 0; i < rules.length; i++)
        {
            if (rules[i].selectorText == selectorText)
            {
                rules[i].style[styleName] = newValue;
                break;
            }
        }
    }
    else
    {
        document.styleSheets[0].addRule(selectorText, styleName + ":" + newValue);
    }
}
